Repository navigation
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
AI review status for this pull request.
|
There was a problem hiding this comment.
This needs an engineering owner's spec decision before it can be approved: no current spec on main says the touch minute wheel should loop short stepped lists like UIDatePicker (spec:AST-043 only selects the sheet's time wheels, and spec:AST-094 is still in #8378), and the stack also rewrites the draft DateInput PR2 requirement for the month pager. An engineering owner records that decision by commenting /approve-spec <full head SHA> here, or by landing a current spec that covers the loop, and the author may do so as an engineering owner. Independently of that decision, please:
- rebase once the predecessor pull requests land (or retarget onto #8366's branch), so this pull request's diff is its own 77-line commit rather than 52,142 authored lines;
- drop the
VelocityTrackerre-export frompackages/core/src/gestures/index.ts, which Lab's tsconfig maps, becausearchitecture:interaction-modalityINV10 says Lab cannot import the tracker; - describe the change in
.changeset/short-minute-lists-loop.mdagainstmain, where the sheet never had a stepped minute column.
[Automated review]
| export {VelocityTracker} from './VelocityTracker'; | ||
| export type {VelocityTrackerOptions} from './VelocityTracker'; |
There was a problem hiding this comment.
architecture:interaction-modality INV10 says the tracker "is not exported" and "Lab cannot import the tracker", and this is the barrel Lab's tsconfig maps as @astryxdesign/core/gestures. The four recognizers import ./VelocityTracker directly, so these two re-exports can go.
| '@astryxdesign/core': patch | ||
| --- | ||
|
|
||
| [fix] Under a finger, the minute wheel in the TimeInput and DateTimeInput bottom sheets loops at every step, as iOS's date picker does. Stepped by 6, 10, 12, 15, 20 or 30 minutes it stopped at its first and last step; now copies of its steps fill the whole wheel, it wraps both ways, a tap lands on the copy tapped, and the hour does not carry (11:45 PM turns to 11:00 PM). |
There was a problem hiding this comment.
On main the sheet's minute column lists all 60 minutes and ignores increment; the stepped column arrives in this same stack with the time-wheels change. If both ship in one release, this reads as a fix for a bug no release had. Consider folding it into time-wheels-follow-uidatepicker.md, which this commit already edits.
| - **PR2 — Scroll and gesture work.** On the native month scroller, scroll-driven | ||
| measurement and selection updates remain animation-frame throttled or settle-driven. | ||
| On the month pager under a finger, a drag moves the month grid without a render, and the | ||
| visible month is reported once per half-month crossed, during the drag and the settle | ||
| that ends it. | ||
| Listeners, frames, timers, and observers are cleaned up on deactivation or unmount. |
There was a problem hiding this comment.
This turns PR2 into a new month-pager requirement that no current record states. The record is draft (approved_by: null), so an engineering owner needs to approve or reject this wording before it governs anything.
PR Analysis Report📚 Storybook Preview🧪 Sandbox PreviewModified ComponentsDateInput (@astryxdesign/core) · View in Storybook
DateTimeInput (@astryxdesign/core) · View in Storybook
TimeInput (@astryxdesign/core) · View in Storybook
Component Size
Sizes are gzip. Import counts the JavaScript the import loads eagerly; CSS counts the package stylesheet rules referenced by the modules it can load from its own package, lazily loaded ones included.
|
| Component | JavaScript | CSS |
|---|---|---|
| core/DateInput | +46.9KB |
+355B |
| core/DateTimeInput | +49.2KB |
+444B |
| core/PowerSearch | +48.5KB |
+384B |
| core/TimeInput | +29.7KB |
+19B |
Bundle Size Summary
Gzip figures measure each package's entry file, not the code an import pulls in.
| Package | Entry (ESM) | Entry gzip before | Entry gzip after | Delta |
|---|---|---|---|---|
| @astryxdesign/core | 4.9KB | 1.2KB | 1.2KB | 0B |
| Package stylesheet | Gzip before | Gzip after | Delta |
|---|---|---|---|
| @astryxdesign/core | 34.6KB | 34.9KB | +337B |
Accessibility Audit
Status: No accessibility violations detected.
Visual Regression
55 of 502 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 | 753,933 |
| Selector | Indicator Space Bottom Sheet Wide Start | neutral | light | 740,072 |
| RichTextEditor | Markdown parity: side by side | probe | dark | 558,840 |
| RichTextEditor | Markdown parity: side by side | probe | light | 540,756 |
| Chat | Full AI Chat | probe | light | 230,823 |
| Chat | Full AI Chat | probe | dark | 229,805 |
| AppShell | With Mobile Nav | probe | light | 217,010 |
| AppShell | With Mobile Nav | probe | dark | 216,960 |
| Collapsible | Dividers | probe | dark | 66,445 |
| Collapsible | Dividers | probe | light | 66,445 |
| AppShell | Playground | neutral | dark | 65,198 |
| AppShell | Playground | neutral | light | 63,788 |
| Chat | Default | neutral | dark | 36,304 |
| Chat | Default | neutral | light | 35,767 |
| 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 |
and 35 more.
Generated by PR Enrichment workflow | Storybook | Sandbox | View full report
There was a problem hiding this comment.
This needs an engineering owner's spec decision before it can be approved: no current spec on main says the touch minute wheel should loop a short stepped list with copies around the cylinder and no hour carry, and the stack also adds a new month-pager requirement to the draft DateInput PR2. An engineering owner records that decision by commenting /approve-spec <full head SHA> on this pull request, or by landing a current spec that states it, and the author may do so as an engineering owner. Independently of that decision, please:
- rebase once the predecessor pull requests land (or retarget onto #8366's branch), so this pull request's diff is its own 77-line change instead of 54,672 authored lines;
- remove the
VelocityTrackerre-export frompackages/core/src/gestures/index.tsand keep the tracker off Lab's internal import paths inscripts/core-internal-modules.cjs, asarchitecture:interaction-modalityINV10 requires; - treat the stepped sheet minute column as a breaking change for a planned minor under
spec:AST-017FR31 (or keep the sheet listing every minute), because DateTimeInput documentstimeIncrementas ignored by the touch sheet; - describe
.changeset/short-minute-lists-loop.mdagainstmain, where the sheet's minute column never stopped at its steps.
[Automated review]
| export {VelocityTracker} from './VelocityTracker'; | ||
| export type {VelocityTrackerOptions} from './VelocityTracker'; |
There was a problem hiding this comment.
architecture:interaction-modality INV10 says the tracker "is not exported" and "Lab cannot import the tracker", and its verification lists "an export of the tracker" as a failure. This barrel is what Lab's tsconfig maps as @astryxdesign/core/gestures; the recognizers import ./VelocityTracker directly, so these two lines can go.
|
|
||
| /** The internal module paths Lab imports: motion, gestures, the touch resolver. */ | ||
| const CORE_INTERNAL_SPECIFIER = | ||
| /^@astryxdesign\/core\/((?:motion|gestures)(?:\/[\w.-]+)*|utils\/touchPresentation)$/; |
There was a problem hiding this comment.
This admits every gestures/* subpath, so @astryxdesign/core/gestures/VelocityTracker resolves for Lab too. INV10 says Lab cannot import the tracker: exclude it here, or refuse it in lab-core-imports.test.mjs.
|
|
||
| - The AM/PM column follows the hour. Turning the hour from 11 to 12 now gives 12 PM, not 12 AM, and the AM/PM column turns onto PM. | ||
| - The hour, minute and second columns loop. Minutes no longer carry into the hour. | ||
| - The minute column steps by TimeInput's `increment` or DateTimeInput's `timeIncrement` when it divides 60. A time between two steps shows rounded to the nearest step inside the day and the bounds until a wheel moves, and the seconds stay as they are. |
There was a problem hiding this comment.
On main, DateTimeInput documents timeIncrement as "Ignored by the Astryx touch sheet". Making it set the sheet's minute column takes the minutes between steps away from consumers who set it for arrow keys. spec:AST-017 FR25 and FR31 treat that as a [breaking] change for a declared minor, not a patch [fix].
| '@astryxdesign/core': patch | ||
| --- | ||
|
|
||
| [fix] Under a finger, the minute wheel in the TimeInput and DateTimeInput bottom sheets loops at every step, as iOS's date picker does. Stepped by 6, 10, 12, 15, 20 or 30 minutes it stopped at its first and last step; now copies of its steps fill the whole wheel, it wraps both ways, a tap lands on the copy tapped, and the hour does not carry (11:45 PM turns to 11:00 PM). |
There was a problem hiding this comment.
On main the sheet's minute column lists all 60 minutes and ignores increment, so no release had a stepped column that stopped at its ends. Consider folding this into time-wheels-follow-uidatepicker.md and describing it against main.
| - **PR2 — Scroll and gesture work.** On the native month scroller, scroll-driven | ||
| measurement and selection updates remain animation-frame throttled or settle-driven. | ||
| On the month pager under a finger, a drag moves the month grid without a render, and the | ||
| visible month is reported once per half-month crossed, during the drag and the settle | ||
| that ends it. |
There was a problem hiding this comment.
This turns PR2 into a month-pager requirement that no current record states. The record is draft (approved_by: null), so an engineering owner needs to approve or reject this wording before it governs anything.
|
Posted by Cindy's agent on her behalf. For the picker wheels in this stack: Cindy decided in #8131 that a wheel coming to rest on a disabled row continues to the nearest allowed row (a tie goes toward the current value) and selects it, as on iOS, and that opening a bounded sheet never changes an untouched value. Please keep this PR consistent with that rule: #8131 (comment) |
|
Consistent at 2085770: this PR adds no rest logic of its own. Its minute column is #8366's wheel, which leaves a disabled copy for the nearest enabled one (a tie toward the committed one), and what a rest commits is #8179's TimeWheels, which now goes on past a bound to the nearest step inside it (b67d6f5). Opening the sheet never changes an untouched value: tests in |
There was a problem hiding this comment.
This needs an engineering owner's spec decision before it can be approved: no current spec on main says the touch sheet's minute wheel should step by increment/timeIncrement and loop a short stepped list (copies around the cylinder, no hour carry), and the stack also adds a new month-pager requirement to the draft component:DateInput PR2. spec:AST-094 is now current, but it leaves each component's presentation to that component's own record. An engineering owner records the decision by commenting /approve-spec <full head SHA> on this pull request, or by landing a current spec that states it; the author may do so as an engineering owner. Independently of that decision, please:
- rebase once #8209 and #8366 land (or retarget onto #8366's branch), so the diff is this pull request's own 77-line change instead of 55,039 authored lines;
- ship the stepped sheet minute column as
[breaking]for a declared minor underspec:AST-017FR25 and FR31 (or keep the sheet listing every minute), because DateTimeInput documentstimeIncrementas ignored by the touch sheet; - replace
.changeset/short-minute-lists-loop.mdand.changeset/wheel-short-loop.mdwith one entry described againstmain, where the sheet's minute column never stopped at its steps; - skip the earlier request to drop the
VelocityTrackerre-export:architecture:interaction-modalityINV10 onmainno longer bars Lab from importing the tracker, and Core's internal gestures barrel is not a package export.
[Automated review]
|
|
||
| - The AM/PM column follows the hour. Turning the hour from 11 to 12 now gives 12 PM, not 12 AM, and the AM/PM column turns onto PM. | ||
| - The hour, minute and second columns loop. Minutes no longer carry into the hour. | ||
| - The minute column steps by TimeInput's `increment` or DateTimeInput's `timeIncrement` when it divides 60. A time between two steps shows rounded to the nearest step until a wheel moves (inside the day, and inside the bounds when the time is), and the seconds stay as they are. |
There was a problem hiding this comment.
On main, DateTimeInput documents timeIncrement as "Ignored by the Astryx touch sheet". Stepping the sheet's minute column by it takes the off-step minutes away from touch users of callers who set it for arrow keys. spec:AST-017 FR25 and FR31 make that a [breaking] change for a declared minor, not a patch [fix], and main declares 0.7.5.
There was a problem hiding this comment.
This needs an engineering owner's spec decision before it can be approved: no current spec on main says the touch sheet's minute wheel should step by increment/timeIncrement and loop a short stepped list (copies around the cylinder, a tap landing on the tapped copy, no hour carry), and the stack also adds two new requirements to the draft component:DateInput record, PR2's half-month title report for the month pager and AR8's Shift+PageUp/Shift+PageDown year step. An engineering owner records that decision by commenting /approve-spec <full head SHA> on this pull request, or by landing a current spec that states them, and the author may do so as an engineering owner. Independently of that decision, please:
- rebase once #8209 and #8366 land (or retarget onto #8366's branch), so the diff is this pull request's own 77-line change instead of 54,624 authored lines, 29 of whose added files
mainnow already holds; - keep DateTimeInput's sheet listing every minute until a declared minor, or ship the step there as
[breaking]underspec:AST-017FR25 and FR31, becausemaindocumentstimeIncrementas ignored by the touch sheet; - replace
.changeset/short-minute-lists-loop.mdand.changeset/wheel-short-loop.mdwith one entry described againstmain, where the sheet's minute column never stopped at its steps.
[Automated review]
|
|
||
| - The AM/PM column follows the hour. Turning the hour from 11 to 12 now gives 12 PM, not 12 AM, and the AM/PM column turns onto PM. | ||
| - The hour, minute and second columns loop. Minutes no longer carry into the hour. | ||
| - The minute column steps by TimeInput's `increment` or DateTimeInput's `timeIncrement` when it divides 60. A time between two steps shows rounded to the nearest step until a wheel moves (inside the day, and inside the bounds when the time is), and the seconds stay as they are. |
There was a problem hiding this comment.
On main, DateTimeInput documents timeIncrement as “Ignored by the Astryx touch sheet, which uses wheels”. Stepping the sheet's minute wheel by it removes off-step minutes for touch users of callers who set it for arrow keys, with no prop that keeps them; spec:AST-017 FR1, FR25 and FR31 make that a [breaking] change for a declared minor, not a patch [fix], and main declares 0.7.5.
| '@astryxdesign/core': patch | ||
| --- | ||
|
|
||
| [fix] Under a finger, the minute wheel in the TimeInput and DateTimeInput bottom sheets loops at every step, as iOS's date picker does. Stepped by 6, 10, 12, 15, 20 or 30 minutes it stopped at its first and last step; now copies of its steps fill the whole wheel, it wraps both ways, a tap lands on the copy tapped, and the hour does not carry (11:45 PM turns to 11:00 PM). |
There was a problem hiding this comment.
On main the sheet's minute column lists all 60 minutes and never stopped at its steps, and in this same diff time-wheels-follow-uidatepicker.md says every column loops while wheel-short-loop.md says no column loops yet. Consider folding the short-list loop into time-wheels-follow-uidatepicker.md and describing it against main.
| On the month pager under a finger, a drag moves the month grid without a render, and the | ||
| visible month is reported once per half-month crossed, during the drag and the settle | ||
| that ends it. |
There was a problem hiding this comment.
The render-free drag is already spec:AST-094 FR9; reporting the visible month once per half-month crossed is a new requirement no current record states. The record is draft, so an engineering owner approves or rejects this wording.
| picks the focused day. Named exception: Shift+PageUp and Shift+PageDown move | ||
| by a year, as in the APG date picker dialog. |
There was a problem hiding this comment.
Shift+PageUp and Shift+PageDown moving the focus by a year is new at this head and stated by no current record (the Calendar record, also draft, lists only PageUp and PageDown). An engineering owner approves or rejects it with the rest of the open spec question.
There was a problem hiding this comment.
This needs an engineering owner's spec decision before it can be approved: no current spec on main says the touch sheet's minute wheel should step by increment/timeIncrement and loop a short stepped list (copies around the cylinder, a tap landing on the tapped copy, no hour carry), and the stack also adds two new requirements to the draft component:DateInput record, PR2's half-month title report for the month pager and AR8's Shift+PageUp/Shift+PageDown year step. An engineering owner records that decision by commenting /approve-spec <full head SHA> on this pull request, or by landing a current spec that states them, and the author may do so as an engineering owner. Independently of that decision, please:
- rebase once #8209 and #8366 land (or retarget onto #8366's branch), so the diff is this pull request's own 77-line change instead of 49,729 authored lines that currently conflict with
main; - keep DateTimeInput's sheet listing every minute until a declared minor, or ship the step there as
[breaking]underspec:AST-017FR25 and FR31, becausemaindocumentstimeIncrementas ignored by the touch sheet; - fold
.changeset/short-minute-lists-loop.mdand.changeset/wheel-short-loop.mdinto one entry described againstmain, where the sheet's minute column never stopped at its steps.
[Automated review]
There was a problem hiding this comment.
This needs an engineering owner's spec decision before it can be approved: no current spec on main says the touch sheet's minute wheel should step by increment/timeIncrement and loop a short stepped list (copies around the wheel, a tap landing on the tapped copy, no hour carry), and the stack also adds two new requirements to the draft component:DateInput record, PR2's half-month title report for the month pager and AR8's Shift+PageUp/Shift+PageDown year step. An engineering owner records that decision by commenting /approve-spec <full head SHA> on this pull request, or by landing a current spec that states them, and the author may do so as an engineering owner. Independently of that decision, please:
- rebase once #8209 and #8366 land (or retarget onto #8366's branch), so the diff is this pull request's own 77-line change instead of 49,768 authored lines that now conflict with
mainin 13 files; - keep DateTimeInput's sheet listing every minute until a declared minor, or ship the step there as
[breaking]underspec:AST-017FR25 and FR31, becausemaindocumentstimeIncrementas ignored by the touch sheet; - fold
.changeset/short-minute-lists-loop.mdand.changeset/wheel-short-loop.mdinto one entry described againstmain, where the sheet's minute column never stopped at its steps.
[Automated review]
|
|
||
| - The AM/PM column follows the hour. Turning the hour from 11 to 12 now gives 12 PM, not 12 AM, and the AM/PM column turns onto PM. | ||
| - The hour, minute and second columns loop. Minutes no longer carry into the hour. | ||
| - The minute column steps by TimeInput's `increment` or DateTimeInput's `timeIncrement` when it divides 60. A time between two steps shows rounded to the nearest step until a wheel moves (inside the day, and inside the bounds when the time is), and the seconds stay as they are. |
There was a problem hiding this comment.
On main, DateTimeInput documents timeIncrement as "Ignored by the Astryx touch sheet, which uses wheels". Stepping the sheet's minute wheel by it removes off-step minutes for touch users of callers who set it for arrow keys, with no prop that keeps them; spec:AST-017 FR1, FR25 and FR31 make that a [breaking] change for a declared minor, not a patch [fix], and main declares 0.7.5.
| '@astryxdesign/core': patch | ||
| --- | ||
|
|
||
| [fix] Under a finger, the minute wheel in the TimeInput and DateTimeInput bottom sheets loops at every step, as iOS's date picker does. Stepped by 6, 10, 12, 15, 20 or 30 minutes it stopped at its first and last step; now copies of its steps fill the whole wheel, it wraps both ways, a tap lands on the copy tapped, and the hour does not carry (11:45 PM turns to 11:00 PM). |
There was a problem hiding this comment.
On main the sheet's minute column lists all 60 minutes and never stopped at its steps, and wheel-short-loop.md in this same diff says no column loops yet (and lists only 10, 15, 20 and 30). Consider folding the short-list loop into time-wheels-follow-uidatepicker.md and describing it against main.
| On the month pager under a finger, a drag moves the month grid without a render, and the | ||
| visible month is reported once per half-month crossed, during the drag and the settle | ||
| that ends it. |
There was a problem hiding this comment.
The render-free drag is already spec:AST-094 FR9; reporting the visible month once per half-month crossed is a new requirement no current record states. The record is draft, so an engineering owner approves or rejects this wording.
| picks the focused day. Named exception: Shift+PageUp and Shift+PageDown move | ||
| by a year, as in the APG date picker dialog. |
There was a problem hiding this comment.
Shift+PageUp and Shift+PageDown moving the focus by a year is new wording stated by no current record (the draft Calendar record lists only PageUp and PageDown). An engineering owner approves or rejects it with the rest of the open spec question.
…nto uikit/c21-wheel-rest-and-spin
…o their own changesets In the same release meta#8179's time columns loop, so "no shipped column loops yet" would contradict it; the columns that loop say so themselves.
…heirs) into uikit/c21-wheel-rest-and-spin
… while the toggle fades The header's arrows and Reset, and DateInput's footer actions, sit outside the shield that covers the panels during the month/year cross-fade, and their `inert` followed the panels' (deferred to the fade's end). During the opening fade a tap on Done fell through the still-inert Done to Save beneath it and closed the DateInput sheet, and DateTimeInput's fading arrows and Reset still paged the month or cleared the pick. These few controls now leave with the toggle and arrive with the fade's end; only the panels' own `inert` waits for the fade, since flipping it restyles a panel's whole subtree.
… the glyph is Under Reduce Motion on a touch screen, a second title tap within the 200 ms dip restarted it from opacity 1, flashing the chevron back to opaque. The new dip now starts from the running dip's presented opacity, read before it is cancelled (a style read only in that case).
…llows the toggle during render `useFadeInert` mirrored the toggle into state from a layout effect when the swap is not deferred, costing a second commit per toggle (architecture:react-component-runtime INV1, INV3). `settled` now follows `isWheelOpen` during render in that case; the effect keeps only the branch where the committed panel shows no exit can run (no Web Animations), with a reason naming that read.
…fect synchronizes with The effect waits on the browser's clock and idle time (a timer for the sheet's present motion, then an idle callback), and its cleanup cools the wheels for the next opening (architecture:react-component-runtime INV3).
…ged, and where it was measured The panels' `inert` swaps when the fade ends (not a frame later), the commit's restyle is described without claiming it changes no inherited style, the old chevron and the 0.01 s fade are DateInput's, and the iPhone and Android claims are narrowed to the iOS simulator measurement.
…s own spin meta#8527's `spinTo` no longer takes a duration or a curve, so a column the time wheels move by themselves turns on the wheel's own spin: an animated `setContentOffset`, 0.3 s on Core Animation's ease-in-ease-out (`picker.tapSpin`, the role `timing.curves.move`), resolved under the column when the turn starts (spec:AST-094 FR4). TimeWheels no longer plays the literal `datePicker.wheels.columnTurn`, and the browser proof samples the AM/PM column's turn against that spin.
…he wheel's own spin meta#8527's `spinTo` no longer takes a duration or a curve: the month wheel turns onto the nearest reachable month on the wheel's own spin (`picker.tapSpin` on the role `timing.curves.move`, UIKit's animated `setContentOffset`), resolved when the turn starts (spec:AST-094 FR4), not on the literal `datePicker.wheels.columnTurn`.
…he nearest enabled month around the seam With min 2025-11-01, max 2026-02-28 and January 25, 2026 chosen, one ArrowUp from January crosses the seam onto December 2026, past max; around the loop the nearest enabled month is January itself, so nothing moves or commits. It went to February 25 before meta#8527's seam-aware rest and key step (f4386c5).
There was a problem hiding this comment.
Approval waits on an engineering owner's spec decision: no current record states that, under a finger, increment and timeIncrement step the TimeInput and DateTimeInput sheet minute wheel and that a short list loops with drawn copies, while component:TimeInput defines Increment as the typed field's arrow-key step. An engineering owner can settle it by landing records that state this behaviour (the component:TimeInput update, an INV7 exception for the copies, and the draft component:DateInput PR2, AR8 and FR13 and component:DateTimeInput FR8 wording), or by commenting /approve-spec <full head SHA> on this pull request once it carries that wording; the author may do so as an engineering owner. Whatever is decided, these still need changes:
.changeset/time-wheels-minute-step.mdships a released, documented change totimeIncrementas a patch[feat], whichspec:AST-017FR25 and FR31 admit only as a[breaking]changeset in a declared minor.- Against
mainthe diff is the whole open stack (about 50,000 authored lines around a 68-line change), so landing #8209 and #8366 first would leave this pull request's own change. - The flagged touch-only size growth needs figures against
mainand a justification (INV6), and the wheels' new mouse behaviour (commit on release, travel on from a disabled row) needs fine-pointer before-and-after evidence (spec:AST-017FR59).
[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. Implementation gap: when the field becomes disabled or busy while its clear control holds focus, the control unmounts and focus falls to the document body; `spec:AST-085/FR4` requires focus to stay or move to a destination this record names. | Current source and focused clear tests; `spec:AST-085/FR4` | Verified shipped behavior | | ||
| | FR12 | No surface renders native `disabled`. A disabled field MUST stay focusable with `aria-disabled`, block typing, picking, clearing, and opening, describe its disabled reason when one is given, and take disabled paint. While busy (`isLoading` or a pending Action) the pointer and bottom-sheet surfaces expose `aria-disabled` and `aria-busy`, stay focusable, and block new commits; the native surface does the same for `isLoading`, and during a pending Action stays editable so the OS picker remains attached but rejects additional commits until the Action settles. A busy field that is not disabled keeps its ordinary paint and Spinner, shows no hover ring while commits are blocked, and keeps its keyboard focus ring. | `spec:AST-085/FR1–FR6`; `family:input-fields/FR4–FR6`; `family:buttons/FR4`; current source and focused tests | Settled shared rule and verified adoption | | ||
| | FR13 | A bottom-sheet picker wheel that comes to rest on a disabled row (outside `min`/`max`) MUST continue to the nearest enabled row, a tie going toward the committed row, and select it there. A wheel resting on its committed row MUST NOT select or commit, even when that row is outside the bounds, so opening a bounded sheet never changes an untouched value: a committed value outside the bounds stays, and an empty field stays empty. A shown wheel whose value changes from outside, as when a bound clamps the time after another wheel turned, MUST turn onto the new row rather than jump to it. | DEC-1; UIDatePicker on the iOS 26.2 simulator; wheel unit and real-browser tests | Settled by DEC-1 | |
There was a problem hiding this comment.
This row's last sentence (a shown wheel whose value changes from outside MUST turn onto the new row) and its second sentence applied after a drag (a rest back on a committed value outside the bounds commits nothing) go beyond cixzhang's #8131 decision that DEC-1 records, so "Settled by DEC-1" overstates them; they wait on an engineering owner's approval.
| | FR5 | The two pointer segments share one row while each retains its intrinsic basis; when the container is narrower, flex wrapping moves them into separate full-width rows. | Public docs, current source, focused layout tests | Verify rendered geometry; class-level behavior covered | | ||
| | FR6 | Date-time bounds and date constraints MUST prevent invalid commits. Native controls MAY receive platform hints, but JavaScript validation remains the final commit boundary; calendar-only options MAY be unavailable on native surfaces. | Public docs, current source, focused presentation tests | Verified observation; owner approval pending | | ||
| | FR7 | A preset-time listbox MUST remain optional, preserve typed entry, expose one selected option independently from keyboard highlight, and limit offered values to the selected date's effective minimum and maximum. | Public docs, current source, focused interaction tests | Verified observation; owner approval pending | | ||
| | FR8 | Its bottom-sheet date and time wheels rest as `component:DateInput/FR13` requires: a wheel stopping on a disabled row continues to the nearest enabled row and selects it, opening a bounded sheet never changes an untouched value, and a shown wheel turns onto a value a bound clamps. | `component:DateInput/DEC-1`; wheel unit tests | Settled by `component:DateInput/DEC-1` | |
There was a problem hiding this comment.
The added clause "a shown wheel turns onto a value a bound clamps" is not part of the #8131 decision, so "Settled by component:DateInput/DEC-1" overstates it; it waits on the same owner decision as DateInput FR13's last sentence.
| '@astryxdesign/core': patch | ||
| --- | ||
|
|
||
| [feat] Under a finger, the minute wheel in the TimeInput and DateTimeInput bottom sheets steps by TimeInput's `increment` or DateTimeInput's `timeIncrement` when it divides 60, and loops at every step, as iOS's date picker does. A time between two steps shows rounded to the nearest step until a wheel moves (inside the day, and inside the bounds when the time is), and the seconds stay as they are. With a mouse, the wheels still list every minute. |
There was a problem hiding this comment.
Released 0.7.4 documents timeIncrement as "Ignored by the Astryx touch sheet, which uses wheels", and a caller who set it for the desktop arrow keys must drop it to give touch users every minute back, so spec:AST-017 FR1, FR25 and FR31 make this a [breaking] change for a declared minor (main declares 0.7.5), not a patch [feat].
…names what it synchronizes The un-keyed layout effect that lands a far jump synchronizes the pager's position with the DOM: it can move only once the render that mounts the target's pane has committed it, and moves before paint (architecture:react-component-runtime INV3).
There was a problem hiding this comment.
Approval waits on an engineering owner's spec decision: under a finger this change makes increment and timeIncrement step and loop the TimeInput and DateTimeInput sheet minute wheel with drawn copies, while the current component:TimeInput spec defines Increment as the typed field's arrow-key step, and it adds new wording to the draft component:DateInput and component:DateTimeInput records (PR2, AR8, FR13's rest-back and turn clauses, FR8). An engineering owner records that decision by landing spec updates that state it (the TimeInput Increment row, FR7 and ORD3, plus a recorded INV7 exception for the copies) or by commenting /approve-spec <full head SHA> on this pull request, and the author may do so as an engineering owner. Independent of that decision, these still need changes:
.changeset/time-wheels-minute-step.mdchanges released, documentedtimeIncrementbehaviour in a patch[feat], so it needs a[breaking]changeset in a declared minor, or the sheet should keep every minute until then.- The diff against
maincarries the whole open stack (about 50,000 authored lines), and landing #8209 and #8366 first would leave only this change to review. - The touch-only size growth needs figures against
mainwith a justification, and the mouse-drag and mouse-rest wheel changes need fine-pointer before-and-after evidence.
[Automated review]
Depends on #8209. Review only this PR's change: vjeux/astryx@46e8eae...1e4fcad
Maintainer impact
Under a finger, the TimeInput and DateTimeInput sheets' stepped minute wheel loops (#8179, through #8366's short loop), but no test of these sheets pins it at 15 or 30 minutes, where the list is shorter than the column and the wheel draws copies of its steps.
Intended invariant
The stepped minute wheel wraps both ways without carrying into the hour, draws copies to fill its column, and lists each step once for assistive technology, as UIDatePicker's minute wheel loops (
spec:AST-043;spec:AST-094FR1, FR2).Change
Tests only, in
TimeWheelsTouch.test.tsx. The loop and the minute step are described by #8179's changesets, so this PR carries none.Evidence
loopCopiesreturning 1), the two TimeInput cases fail.Scope
Testing
TimeWheelsTouch.test.tsx: the three cases above.analyze-pr.js), import gzip, main → this head, the whole stack: DateInput 101.4 → 150.8 KB, DateTimeInput 111.6 → 163.2 KB, TimeInput 88.6 → 119.7 KB, PowerSearch 168.0 → 217.2 KB; component CSS +19 to +456 B.pnpm buildthen the rootpnpm typecheck;CI=true pnpm lint; the full core suite at 16 workers, 15,518 of 15,520 (the two Selector and MultiSelector bottom-sheet cases are test(Selector, MultiSelector): wait for the on-demand sheet module before the first open #8642's load red); the node project (its known reds, andtouch-support-bundle, which test(core): a touch component's import carries its gesture code, and nothing else does #8671 replaces: this head passes test(core): a touch component's import carries its gesture code, and nothing else does #8671's version, 8 of 8); interaction specs (MonthYearToggle, TimeWheels, MonthYearWheels, MonthScroller, MonthPager, WheelActivation) twice over: Chromium 93 of 94 (feat(Wheel): an owner's rest rule and turns from script for the picker wheel #8527's WheelActivation load red), WebKit 84 plus 10 skips.Stack (merge in this order): … → #8209 → this PR.