Skip to content

[Component Audit] DateInput: list every part-styling prop in its API docs - #7372

Open
cixzhang wants to merge 4 commits into
mainfrom
night-watch-component-audit/DateInput/2026-10-12
Open

cixzhang wants to merge 4 commits into
mainfrom
night-watch-component-audit/DateInput/2026-10-12

Conversation

@cixzhang

@cixzhang cixzhang commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

User impact

Builders reading DateInput's API reference could not find containerClassName, containerStyle, controlClassName, or controlStyle, even though DateInput accepts them and they are the only class-name and inline-style hooks it has after root styling was removed. The English, Chinese, and dense references now list all six part-styling props, like the other field components. The draft contract now matches DateInput's current behavior. Runtime behavior does not change.

Audit scope

  • Package/component: core/DateInput
  • Base: 1e883f86e7aa5c2be376671f746d79e5cfae769b
  • Frozen head: 4faee79d299c5f4661bfecbb01a7aade966440ee
  • Mode: Night Watch whole-component audit · Rubric: 1.16.6
  • Runtime/API changes: none (API reference, draft contract, and a [docs] Changeset)
  • Landing: held until the 0.7.0 release is tagged.

Score

  • Before: 85.6 / C — 2 open BLOCKs; §5b not measured.
  • After: 87.3 / C, confirmed by the exact-head checks — the same 2 BLOCKs, both owned by open contributor pull requests (see Needs Review).
  • Sensitivity: resolve the 2 open BLOCKs and change nothing else → 99.0 / A.
  • Sections §1, §2, §3, §4, §5a, §5b, §6, §7, §8, §9, §10 — before 3, 5, 5, 3, 5, nm, 5, 5, 4, 5, 4; after 3, 5, 5, 3, 5, nm, 5, 5, 5, 5, 4.

Findings

ID Section Finding Authority Result
D1 §1 A5 — BLOCK In the bottom-sheet calendar, the month arrows become natively disabled at the first or last reachable month, so a keyboard user who steps onto that month loses focus to the document. architecture:interaction-modality; WCAG 2.2 SC 2.4.3 Open. #6304 already fixes it; not duplicated here.
D2 §4 B15 — BLOCK After a clear, the pointer surface passes undefined to Calendar, which treats it as uncontrolled, so reopening the calendar shows the cleared date as selected. A focused test at the exact head reproduces it: one day stays selected after clear and reopen. DateInput clear contract (FR1, FR11); Calendar's documented controlled-empty null; WCAG 2.2 SC 4.1.2 Open. #6935 already fixes it; not duplicated here.
D3 §8 X5b — FIX The API reference omitted containerClassName, containerStyle, controlClassName, and controlStyle, which DateInput accepts under family:input-fields/FR10; the other field members list them. family:input-fields/FR10; rubric X5b Fixed in the English, Chinese, and dense references.
D4 §8 — FIX The draft contract described the removed date-input-clear-icon alias and did not cite the FR10 base-prop and part-styling rule DateInput now follows. Current source; family:input-fields/FR10 Fixed. The contract cites FR10 and the current clear-glyph target; the FR10 suite joins verified_by. No new component requirement is added.

Not scored: the bottom-sheet surface inherits BottomSheet's recorded shared-dismissal adoption gap (owned by BottomSheet under family:overlay-dismissal). The bottom-sheet calendar's day cells fade their colors without a reduced-motion collapse, but the motion record is still a draft, so no current authority applies.

What changed

  • DateInput.doc.mjs — four props entries in docs and docsZh, four docsDense descriptions, matching the sibling field components.
  • DateInput.spec.md (draft) — cites family:input-fields/FR10 in the governing rules and the family relationship, adds DateInput.fr10.test.tsx to verified_by, and names the current clear-glyph target.
  • .changeset/date-input-part-style-props-docs.md — [docs] patch, because the API reference ships in the package.

Evidence

  • This PR changes no behavior, so no new functional test was added; typed docs validation and the doc-prop suites cover the docs change.
  • Exact-head checks on 4faee79: CI run 38256902974 succeeded, including build, lint, unit tests, docsite tests, and the Storybook build.
  • pr-a11y audited all 26 DateInput stories: 0 violations and no new baseline entries.
  • pr-rtl (core): core/DateInput passes the automatic check and its curated calendar/clear control-order check.
  • Stable visual regression: see Visual acceptance.
  • Owner-exempt review-required is success on 4faee79, set by GitHub Actions through the repository's Review signal workflow. spec-owner-approval is success (draft record only), and the CLA check passes.
  • A private review of the exact head, title, and description is clean.
  • Local runs on the first head: DateInput, doc-prop, and theming suites — 757/757; typecheck:docs; pnpm build; docsite generate and tests — 620 passed, 6 skipped; check:knowledge; check:changesets. Later commits changed only draft-contract text, with check:knowledge re-run after each, plus one empty commit that retriggered a failed preview deployment.
  • No local browser result is credited; browser evidence comes from the exact-head checks above.

Closed evidence inventory

Surface Evidence Result
Controlled ISO value, typing, constraints, formats source; focused suites pass
Five presentation values and deprecated mapping Presentation.test.tsx; native and touch suites pass
Pointer calendar open, select, close source; tests; OpenCalendarAudit story pass
Clear and calendar selection source; focused test at the exact head open — D2
Bottom-sheet calendar, wheels, save DateInputTouch.test.tsx pass
Bottom-sheet month arrows at a bound source open — D1
Native picker, Action, clear, focus continuity NativeDateField.test.tsx pass
Field states, status, disabled reason, InputGroup focused suites; AllVariations pass
FR10 base props and part styling DateInput.fr10.test.tsx; StylingParts story pass
API reference completeness DateInput.doc.mjs fixed — D3
Theming targets themingTargets.test.ts; themed stories pass
Accessibility and RTL exact-head pr-a11y (26 stories) and pr-rtl (core) pass
Narrow viewport and coarse pointer pixels none not measured

Visual acceptance

Product visual delta: N/A. The change is limited to the API reference, the draft contract, and a Changeset; no component source, style, story, or rendered output changes.

The exact-head stable visual gate passed with verdict changed: 448 shots, 356 unchanged, 42 changed, 50 added, 22 removed, 0 failed, against a baseline captured on 2026-09-26. #7370's exact-head report, from a PR that changed no DateInput file, lists the same 42 changed, 50 added, and 22 removed shots. 41 changed shots match it pixel for pixel; the 42nd, a SideNav resize shot, also varies between runs of this PR. No DateInput shot changed: its 8 added and 2 removed shots appear identically in #7370's report. The verdict reflects baseline drift, not this PR.

Knowledge overlap search

Review feedback

  • Automated review asked that the contract not restate part of family:input-fields/FR10 and then that it not add a draft requirement that no current spec states. The contract now only cites FR10; the earlier FR13 row and its verification row are removed. The automated review approved the final head.

Needs Review

Writing rubric results

  • R1 narration: none; the contract states current behavior.
  • R2 research: none.
  • R3 evidence: facts and standards, not changes.
  • R4 rejected alternatives: none.
  • R5 change references: none.
  • R6 open questions: none.

FR10 exact-head report

{
  "schemaVersion": 1,
  "component": "DateInput",
  "package": "core",
  "mode": "night-watch",
  "rubricVersion": "1.16.6",
  "repositoryBase": "1e883f86e7aa5c2be376671f746d79e5cfae769b",
  "repositoryHead": "4faee79d299c5f4661bfecbb01a7aade966440ee",
  "componentContractHead": "4faee79d299c5f4661bfecbb01a7aade966440ee",
  "inventory": {"closed": true, "rows": 13},
  "score": {"before": 85.6, "after": 87.3, "beforeBlocks": 2, "afterBlocks": 2},
  "unresolvedObjectiveGaps": [{"id": "D1", "rule": "A5", "owner": "#6304"}, {"id": "D2", "rule": "B15", "owner": "#6935"}],
  "unresolvedManualGaps": [],
  "remediations": [
    {"id": "D3", "state": "verified-source", "evidence": "six part-styling props listed in all three references"},
    {"id": "D4", "state": "verified-source", "evidence": "draft contract cites FR10 and names the shared clear glyph target"}
  ],
  "approvals": {"privateExactHeadSelfReview": "clean", "reviewSignal": "success (GitHub Actions)", "specOwner": "draft record only"},
  "checks": {"local": "green; no local browser", "exactHeadCI": "success (run 38256902974)", "a11y": "0 violations across 26 owned stories", "rtl": "automatic and curated checks pass", "visual": "N/A product delta; gate drift matches an unrelated PR"},
  "eligibility": {"eligible": false, "reasons": ["FR11 auto-merge inactive", "two open BLOCKs owned by contributor pull requests", "held until the 0.7.0 release is tagged"]}
}

…ontract

List containerClassName, containerStyle, controlClassName, and controlStyle in
the English, Chinese, and dense API references, and update the draft contract
for the family FR10 base-prop and part-styling adoption and the shared clear
glyph target.
@vercel

vercel Bot commented Oct 12, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
astryx Ready Ready Preview Oct 12, 2026 1:43pm UTC

Request Review

@meta-cla meta-cla Bot added the CLA Signed This label is managed by the Meta Open Source bot. label Oct 12, 2026
@astracat-bot

astracat-bot Bot commented Oct 12, 2026 •

Copy link
Copy Markdown

AI review status for this pull request.

Review status Updated
🟢 Reviewed (for maintainers only) Oct 12, 2026, 1:58 PM UTC

@github-actions

github-actions Bot commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

PR Analysis Report

📚 Storybook Preview

View Storybook for this PR

🧪 Sandbox Preview

View Sandbox for this PR

Modified Components

DateInput (@astryxdesign/core) · View in Storybook
Metric Before After Delta
Bundle Size (ESM) N/A N/A N/A
Lines of Code N/A 3455 -
Complexity N/A Very High (373) -

Bundle Size Summary

Package Size (ESM) Size (CJS) Gzipped
@astryxdesign/core N/A 4.9KB 1.2KB

Accessibility Audit

Status: No accessibility violations detected.

Visual Regression

42 of 448 shot(s) changed.

A change here is a question, not a failure: check whether the after is the
picture you intended. Record that review on the PR. Baseline maintenance is an
explicit dispatch of CI; this report never rewrites the baseline or adds a release gate.

component story theme mode pixels
Selector Indicator Space Bottom Sheet Narrow End RTL neutral light 754,077
Selector Indicator Space Bottom Sheet Wide Start neutral light 740,188
Chat Full AI Chat probe light 238,081
Chat Full AI Chat probe dark 237,048
Markdown Default probe light 159,625
Markdown Default probe dark 158,986
Collapsible Dividers probe dark 66,445
Collapsible Dividers probe light 66,445
Chat Default neutral dark 33,205
Chat Default neutral light 32,876
Chat Empty State probe light 23,531
Chat Empty State probe dark 22,622
ChatAutoScroll Scroll Behavior Comparison neutral dark 15,378
ChatAutoScroll Scroll Behavior Comparison neutral light 14,107
Chat With Attachments probe light 13,406
Chat With Attachments probe dark 11,232
ProgressBar With Target Mark probe dark 7,895
ProgressBar With Target Mark probe light 7,895
TableRowExpansion Detail Panel neutral dark 5,129
TableRowExpansion Detail Panel neutral light 4,050

and 22 more.


Generated by PR Enrichment workflow | Storybook | Sandbox | View full report

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new DateInput API reference entries and the [docs] Changeset match the props DateInput already accepts and the input-field family's part-styling rule. Approval now waits on a maintainer decision about the new draft requirement FR13 and its verification-map row in DateInput.spec.md, which a maintainer needs to approve, reword, or reject. Separately, FR13's base-prop list leaves out the family rule's hidden, inert, and dir and both of its development warnings, so please reference the full input-field FR10 rule, or list all of it, instead of a subset.

[Automated review]

| FR10 | Standalone mode MUST compose Field; admitted InputGroup mode MUST remove competing Field chrome while preserving name, description, value, keyboard, focus, and editing semantics. | `family:input-fields/FR3`; current source and InputGroup tests | Settled shared rule and verified adoption |
| FR11 | Clear MUST emit `undefined` through the ordinary change pipeline. The pointer and bottom-sheet surfaces restore field focus using their shipped timing; the native surface MUST NOT reclaim focus because doing so reopens the OS picker. | Current source and focused clear tests | Verified shipped behavior |
| FR12 | Disabled-with-reason MUST remain focusable enough to expose its explanation while blocking mutation. Ordinary disabled and explicit-loading states remain inactive. During a pending Action, pointer and bottom-sheet surfaces remain inactive; the native surface stays focusable so the OS picker remains attached but rejects additional commits until the Action settles. | `family:input-fields/FR4–FR6`; current source and focused tests | Settled shared rule and verified adoption |
| FR13 | Base props (`ref`, `id`, `data-*`, `aria-*`, and DOM event handlers) MUST reach the date input on every surface; root `xstyle`, `className`, and `style` are not accepted; `container*` MUST style the Field box where one renders and `control*` the visual control box, never the native input. A caller DOM handler runs after DateInput's own handler and cannot cancel built-in behavior. | `family:input-fields/FR10`; current source and FR10 tests | Settled shared rule and verified adoption |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This row restates the input-field family's FR10 but narrows it: FR10 also requires hidden, inert, and dir to reach the primary semantic control, and it requires development warnings for untyped root styling and for container* where no Field box renders (DateInput already does all of this). Referencing the family rule — for example, "DateInput adopts family:input-fields/FR10 on every surface; its primary semantic control is the date input" — or listing the full FR10 set would keep the draft from reading as a narrower rule.

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new DateInput API reference rows and the [docs] Changeset match the props DateInput already accepts and the input-field family's part-styling rule, and FR13 now links the family's FR10 rule instead of restating part of it. Approval waits on a maintainer decision to approve or reject the new draft requirement FR13 and its verification-map row in DateInput.spec.md, because no current spec states them as written. If a maintainer rejects them, removing FR13 and its row while keeping the FR10 citation in the governing-rules row would settle it.

[Automated review]

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new DateInput API reference rows and the [docs] Changeset match the props DateInput already accepts and the input-field family's FR10 part-styling rule, and the other draft-record edits match current specs. Approval waits on a maintainer decision to approve or reject the new draft requirement FR13 and its verification-map row in DateInput.spec.md, because no current spec states them as written: the family record names DateInput's primary semantic control only as "date input", and the cited DateInput.fr10.test.tsx does not exercise hidden, inert, or dir. If a maintainer rejects them, removing FR13 and its row while keeping the FR10 citation in the governing-rules row settles it; nothing else needs to change.

[Automated review]

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nothing here needs to change: the four new DateInput API reference rows match the props DateInput already accepts and the input-field family's FR10 part-styling rule, and the [docs] Changeset passes its check. The draft contract cites FR10 without adding a component requirement of its own, and its clear-glyph theming text matches the alias removal in 0.7.0. As an optional cleanup, the description's writing-rubric line still mentions FR13, which this revision removed.

[Automated review]

This branch was successfully deployed

1 active deployment
Preview — 4faee79d Deployed Oct 12, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed This label is managed by the Meta Open Source bot.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant