diff --git a/.jules/palette.md b/.jules/palette.md index a34ea59b2..1f318ab97 100644 --- a/.jules/palette.md +++ b/.jules/palette.md @@ -13,3 +13,6 @@ ## 2026-07-13 - Async Table Actions UX **Learning:** Adding explicit loading and disabled states to table action buttons that invoke asynchronous processes helps prevent redundant API calls and visually assures the user that their request is being handled. **Action:** Consistently apply `disabled` state and `Loading...` text changes to inline table action buttons linked to async workflows, and carefully preserve underlying DOM structures with `Array.from(btn.childNodes)` during the loading cycle to avoid rendering regressions. +## 2026-09-30 - Add explicit text (required) to field label +**Learning:** Required form fields need explicit text `(required)` inside the label for accessibility, rather than using styled asterisks. When doing so inside a CSS grid container like `.field-label`, the text needs to be wrapped in a `` to prevent `display: grid` from forcing elements onto separate tracks. +**Action:** Use explicit `(required)` text wrapped in `` for required fields in CSS grids. diff --git a/src/main/java/com/clearfolio/viewer/controller/ViewerUiController.java b/src/main/java/com/clearfolio/viewer/controller/ViewerUiController.java index 3e5ee0710..d55dfd56f 100644 --- a/src/main/java/com/clearfolio/viewer/controller/ViewerUiController.java +++ b/src/main/java/com/clearfolio/viewer/controller/ViewerUiController.java @@ -185,7 +185,7 @@ private static String demoShellHtml() {
- +
diff --git a/src/test/java/com/clearfolio/viewer/controller/ViewerUiRequiredFieldAccessibilityTest.java b/src/test/java/com/clearfolio/viewer/controller/ViewerUiRequiredFieldAccessibilityTest.java new file mode 100644 index 000000000..c5e183221 --- /dev/null +++ b/src/test/java/com/clearfolio/viewer/controller/ViewerUiRequiredFieldAccessibilityTest.java @@ -0,0 +1,33 @@ +package com.clearfolio.viewer.controller; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; +import org.springframework.test.web.reactive.server.WebTestClient; + +class ViewerUiRequiredFieldAccessibilityTest { + + private WebTestClient webTestClient; + + @BeforeEach + void setUp() { + ViewerUiController controller = new ViewerUiController(); + webTestClient = WebTestClient.bindToController(controller).build(); + } + + @Test + void viewerRendersAccessibleRequiredField() { + webTestClient.get() + .uri("/") + .exchange() + .expectStatus().isOk() + .expectHeader().contentTypeCompatibleWith(MediaType.TEXT_HTML) + .expectBody(String.class) + .value(body -> { + assertTrue(body.contains("for=\"file-input\"")); + assertTrue(body.contains("Document (required)")); + }); + } +}