Repository navigation
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
AI review status for this pull request.
|
7785b28 to
5e4e7a3
Compare
There was a problem hiding this comment.
Approval waits on an engineering owner's decision: this pull request adds the draft record spec:AST-094, and measured against main it ships the whole touch-presentation stack it depends on (the touch picker wheel, two experimental subpaths, a stable motion/reducedMotion.stylex export and theme motion roles), which no current record admits yet. An engineering owner records that decision by commenting /approve-spec <full head SHA> on this pull request, or by amending the records; the author may record it as an engineering owner. Independently, please cut this pull request down to its own commit once #8289 and its predecessors land (against main it is about 41,000 authored lines), and address these points:
spec:AST-094FR4/DEC-1 forbid themable touch motion while the stack adds theme motion roles, FR8's 0.5 s cross-fade exceeds the 200 ms limit of the current reduced-motion design record, and FR7 cites aspec:AST-090that does not exist.- The mouse column's new rest row and Reduce Motion landing need the before/after fine-pointer evidence that
spec:AST-017FR59 asks for. packages/cli/assets/theme.template.tsdocuments aplatformadaptation condition thatdefineThemerejects, and thetouch-experimental-subpathschangeset still lists the removedVelocityStrategy.
[Automated review]
| measures (0.55 for a scroll view and a sheet), and a release MUST pick its | ||
| rest point by projecting its velocity the way its UIKit counterpart does: | ||
| with a deceleration rate, or with a measured projection time. | ||
| - **FR4 — Physics are not themable in touch presentations.** A touch |
There was a problem hiding this comment.
FR4 says touch physics are not themable (and DEC-1 rejects "tuning touch motion per theme"), but this stack adds theme motion roles in defineTheme({motion: {springs, durations, curves}}) and PickerWheel reads picker.tapSpin.durationMs, timing.curves.easeInOut and scroll.bounce through resolveMotion (PickerWheel.tsx:292-293, :662). One of the two has to change before the record can be approved.
There was a problem hiding this comment.
Outdated: this pull request now carries main's version of this file unchanged, so it no longer shows in the diff.
| follows. | ||
| - **FR7 — Exits animate as UIKit's do.** A touch presentation MUST play the | ||
| exit its UIKit counterpart plays. **Proposed; pending owner review:** this | ||
| departs from the draft `spec:AST-090` FR1 (exits off by default) and FR10 |
There was a problem hiding this comment.
spec:AST-090 exists neither on main nor at this head, so the departure from its FR1 and FR10 cannot be checked. Please cite the record that holds those requirements, or drop the reference.
There was a problem hiding this comment.
Outdated: this pull request now carries main's version of this file unchanged, so it no longer shows in the diff.
| UIKit counterpart does with Reduce Motion and Prefer Cross-Fade Transitions | ||
| on: a transition that travels becomes a cross-fade carrying the same change | ||
| of state. An entrance lands in place and fades in, an exit fades out in | ||
| place, and any other move fades through. A navigation push or pop |
There was a problem hiding this comment.
A 0.5 s cross-fade (and a sheet fading on its own presentation spring) exceeds the current reduced-motion design record's DR2, which requires a touch transition under Reduce Motion to change opacity only and finish in 200 ms or less. The stack's animator already uses reducedMotionCrossFadeMs: 200 (motion/uikit/timing.ts:151), and the Current-state impact section does not list the reduced-motion record as amended.
There was a problem hiding this comment.
Outdated: this pull request now carries main's version of this file unchanged, so it no longer shows in the diff.
| const restIndex = | ||
| index === selectedIndex | ||
| ? index | ||
| : nearestEnabledIndex(options, index, selectedIndex); |
There was a problem hiding this comment.
This changes where today's mouse column comes to rest (and the Reduce Motion landing at lines 357-372 changes how it moves). spec:AST-017 FR59 lets touch work change fine-pointer behavior only to fix a defect those users hit, or for a named cross-device consistency, and asks the pull request to show fine-pointer evidence before and after. Please name the reason and add that evidence, such as a mouse-drag test that fails on the base.
There was a problem hiding this comment.
Named and evidenced at the rule's origin, #8131: component:DateInput DEC-1 (cixzhang, 2026-10-25) makes the rest the same for every pointer, and #8131's description shows a trackpad on desktop Chromium before (back to 10) and after (settles on 9). The reduced-motion landing for a fine pointer is DR3's "at once".
| * `from` includes its point; `below` excludes it. The other supported axes | ||
| * are primary-pointer precision, contrast preference, and motion preference. | ||
| * are primary-pointer precision, contrast preference, motion preference, and | ||
| * platform (`ios` for the browsers of iPhone and iPad, `other` for the rest). |
There was a problem hiding this comment.
Adaptation rules have no platform axis: CONDITION_AXES is width, pointer, contrast and motion (themeAdaptations.ts:248-253), and normalizeCondition throws "… is not supported" for any other key. A theme author following this template would write when: {platform: 'ios'} and get an error. The base sentence without the platform clause is still accurate.
There was a problem hiding this comment.
This file comes from #8076, which this pull request carries because it is stacked on it; the change belongs there and reaches this pull request when its base does.
| '@astryxdesign/core': patch | ||
| --- | ||
|
|
||
| [experimental] Two experimental subpaths for building touch presentations, outside the stable compatibility promise (they may change or be removed in a patch release). `@astryxdesign/core/motion/experimental` exports the compositor animator (`createAnimator`, `useAnimator`), UIKit's spring, rubber-band and cubic-bézier math, `resolveMotion` (a motion role's value under the element's theme), and the UIKit constants table as the read-only `uikit` namespace. `@astryxdesign/core/gestures/experimental` exports UIKit-style gesture recognizers (tap, long press, pan, screen-edge pan, swipe, pinch, rotation, hover), `useGestureRecognizer`, `usePressTracker`, `useTouchPresentation`, `readTouchPresentation`, `playHaptic` and `attachTapHaptic`, with the `GestureArena` and `VelocityStrategy` types their options reach. Nothing is added to the package root or to any other subpath. |
There was a problem hiding this comment.
VelocityStrategy was removed later in this stack (see gesture-recognizer-fixes.md), and packages/core/package.json also adds the stable ./motion/reducedMotion.stylex subpath, so "Nothing is added to the package root or to any other subpath" is no longer true. The release notes would currently describe VelocityStrategy as both exported and removed.
There was a problem hiding this comment.
Outdated: this pull request now carries main's version of this file unchanged, so it no longer shows in the diff.
| @@ -177,6 +190,13 @@ const STATIC_EXPORTS = { | |||
| types: './dist/utils/interactionOverlay.stylex.d.ts', | |||
| default: './dist/utils/interactionOverlay.stylex.js', | |||
| }, | |||
| // Proposed; pending owner review (spec:AST-094 OQ4): the Reduce Motion | |||
There was a problem hiding this comment.
spec:AST-094 has only OQ1 and OQ2; there is no OQ4 recording this export. This stable subpath also has no @experimental marker and no changeset that announces it as an import path.
There was a problem hiding this comment.
This file comes from #8076, which this pull request carries because it is stacked on it; the change belongs there and reaches this pull request when its base does.
5e4e7a3 to
ee2bc48
Compare
There was a problem hiding this comment.
Approval waits on an engineering owner's decision: measured against main, this pull request ships its whole chain of open predecessors, and no current spec governs the UIPickerView-style touch wheel, the defineTheme({motion: {springs, durations, curves}}) theme option, the press-feedback text-selection lock or the new astryxStylex undefinedVariables option. An engineering owner (the author may, as one) needs to identify the governing record for each, or approve one such as the draft spec:AST-094 in #8316, and record that decision on this pull request by commenting /approve-spec with the full head SHA. These changes are needed whatever that decision is:
- Rebase once the predecessors land, so the diff is this pull request's own commit instead of 40,558 authored lines.
- Load
PickerWheelonly when a coarse pointer needs it, or report and justify the roughly 28 KB gzip it adds to the DateInput, TimeInput and DateTimeInput imports (architecture:component-style-authoringINV6). - State an INV7 exception with element counts, or stop repeating the wheel's labels through
::beforecontent. - Name the reason and show mouse before-and-after evidence for the new rest row (
spec:AST-017FR59), remove Lab's path to the velocity tracker (architecture:interaction-modalityINV10), and fix thespec:AST-094citations and the changeset that says no component reads the motion roles.
[Automated review]
| import {focusOutlineStyles} from '../utils'; | ||
| import {reducedMotionFade} from '../motion/reducedMotion'; | ||
| import {useTouchPresentation} from '../utils/touchPresentation'; | ||
| import {PickerWheel} from './PickerWheel'; |
There was a problem hiding this comment.
This static import puts the touch-only wheel, and through it the gesture recognizers, host and arena and the wheel's motion player and UIKit tables, into every DateInput, TimeInput and DateTimeInput import, desktop included (an esbuild estimate: about +28 KB gzip each). architecture:component-style-authoring INV6 asks a coarse-pointer-only feature over 2 KB gzip to load lazily, only when a coarse pointer needs it, or to justify the cost with base-against-head figures. PickerWheel.tsx:11-12 also says Wheel "loads it lazily", which it does not.
There was a problem hiding this comment.
Not lazy: the touch column stays a static import behind isTouch, because an extra load on mobile is extremely costly. #8159's description gives the cost: DateInput grows by 24.2 KB gzip, about 16.7 KB of it gesture code every touch layer shares and a page pays once.
| rowLabel: { | ||
| '::before': { | ||
| content: 'attr(data-label)', | ||
| }, | ||
| }, |
There was a problem hiding this comment.
architecture:component-style-authoring INV7: "A pseudo-element carries decoration that has no semantic role and never repeats content." The cylinder rows here and the band copy's stripLabel (:251-256) repeat each visible option's label through content: attr(data-label) (22 repeats in the 24-row hour snapshot) beside the transparent options. Inside an open sheet that needs an exception stated with measured element counts for an owner decision, or a drawing that does not repeat the text.
There was a problem hiding this comment.
In this push the band copy and the drum's label copies left with the UIKit look (#8480). Under today's look each row is its option, its label rendered once.
| const restIndex = | ||
| index === selectedIndex | ||
| ? index | ||
| : nearestEnabledIndex(options, index, selectedIndex); | ||
| if (restIndex !== index) { | ||
| scrollToIndex(restIndex, 'smooth'); |
There was a problem hiding this comment.
With a mouse, a stop on a disabled row now travels on to the nearest enabled row instead of bouncing back. spec:AST-017 FR59 allows touch work to change fine-pointer behavior only to fix a defect those people hit or for a named cross-device consistency, with fine-pointer evidence before and after in the pull request. Please name the reason and show base and head mouse evidence, or keep this touch-only.
| "@astryxdesign/core/gestures": ["../core/dist/gestures/index"], | ||
| "@astryxdesign/core/gestures/*": ["../core/dist/gestures/*"], |
There was a problem hiding this comment.
These paths give Lab core's gesture barrel, which re-exports VelocityTracker (packages/core/src/gestures/index.ts:94) and says "Lab imports it". architecture:interaction-modality INV10: "Lab cannot import the tracker; a Lab gesture keeps one local tracker with the same blend and stillness interval." No Lab file imports it yet; dropping the gestures mappings (here and in tsconfig.build.json) keeps it that way.
There was a problem hiding this comment.
This file comes from #8076, which this pull request carries because it is stacked on it; the change belongs there and reaches this pull request when its base does.
| '@astryxdesign/cli': patch | ||
| --- | ||
|
|
||
| [feat] Themes can retune touch motion roles. `defineTheme({motion})` takes `springs`, `durations` and `curves` keyed by motion role, the table path of a measured touch motion value (`springs.sheetPresent`, `navigation.transitionMs`), at the root or in an adaptation rule, and writes one `--motion-*` variable per role it sets. A role the theme leaves out keeps its measured default, an unknown role id is refused, and the duration scale (`fast`, `medium`, `ratio`) is optional when a theme sets only roles. No shipped component reads the roles yet. `astryx docs motion` lists every motion role with its CSS variable and default, and the theme authoring guide and template describe the new fields. |
There was a problem hiding this comment.
"No shipped component reads the roles yet" is untrue in the release this ships in: .changeset/wheel-uikit-picker.md says a theme retunes the wheel's picker.tapSpin.durationMs, timing.curves.easeInOut and scroll.bounce, which PickerWheel.tsx:287-288 and :661 read. Please drop the sentence.
There was a problem hiding this comment.
This file comes from #8076, which this pull request carries because it is stacked on it; the change belongs there and reaches this pull request when its base does.
| ### Multiple fingers | ||
|
|
||
| A drag a recognizer has claimed keeps its finger: a second finger never | ||
| cancels or redirects it (`spec:AST-094` FR10), as in UIKit, where a pan |
There was a problem hiding this comment.
spec:AST-094 is not on main and not in this pull request (it is proposed in the open #8316), so citing its FR10 here, at :474, in GestureHost.ts:1573 and in two GestureHost.test.ts test names points readers at a rule they cannot find. Cite a current record, or state the behavior without a record id until one governs it.
There was a problem hiding this comment.
This file comes from #8320, which this pull request carries because it is stacked on it; the change belongs there and reaches this pull request when its base does.
PR Analysis Report📚 Storybook Preview🧪 Sandbox PreviewModified ComponentsDateInput (@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 | +28.4KB |
+14B |
| core/DateTimeInput | +27.8KB |
+15B |
| core/PowerSearch | +28.1KB |
+14B |
| core/TimeInput | +27.2KB |
+30B |
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.6KB | +21B |
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
ee2bc48 to
58307a4
Compare
There was a problem hiding this comment.
Approval waits on an engineering owner's decision: measured against main, this pull request ships its whole chain of open predecessors, and no current spec governs the UIPickerView-style touch wheel, the defineTheme({motion: {springs, durations, curves}}) theme option, the press-feedback text-selection lock or the new astryxStylex undefinedVariables option. An engineering owner needs to identify the governing record for each, or approve one such as the draft spec:AST-094 in #8316, and record that decision on this pull request by commenting /approve-spec with the full head SHA; the author may do so as an engineering owner. These changes are needed whatever that decision is:
- Rebase once the predecessors land, so the diff is this pull request's own commit instead of about 43,000 authored lines.
- Load
PickerWheelonly when a coarse pointer needs it, or justify the roughly 28 KB gzip it adds to the DateInput, TimeInput, DateTimeInput and PowerSearch imports (architecture:component-style-authoringINV6). - Record an INV7 exception with element counts, or stop repeating the wheel's labels through
::beforecontent. - Show base-and-head mouse evidence for the new rest row (
spec:AST-017FR59), keep the velocity tracker out of Lab's import route (architecture:interaction-modalityINV10), and make the motion-role docs and examples use roles a shipped component reads.
[Automated review]
| * // A softer sheet, and a longer navigation transition (it paces | ||
| * // completion callbacks): | ||
| * motion: { | ||
| * springs: { 'springs.sheetPresent': { duration: 0.6, bounce: 0.1 } }, | ||
| * durations: { 'navigation.transitionMs': 300 }, | ||
| * } |
There was a problem hiding this comment.
No shipped component reads springs.sheetPresent or navigation.transitionMs: only the picker wheel resolves motion roles (picker.tapSpin.durationMs, timing.curves.easeInOut, scroll.bounce), so a theme author who copies this example to soften a sheet sees nothing change. Please use a role a component reads, or say which component reads each role; the same example is in packages/cli/assets/theme.template.ts:191-192.
There was a problem hiding this comment.
This file comes from #8258, which this pull request carries because it is stacked on it; the change belongs there and reaches this pull request when its base does.
58307a4 to
f45f58e
Compare
… listbox hook) into uikit/c21-wheel-short-loop The touch column's files take meta#8361's side: the short loop below was drawn as one row per position on the cylinder, which today's look has no place for. The next commit repeats a short looping list on today's strip.
There was a problem hiding this comment.
Approval waits on an engineering owner: measured against main, this pull request ships its open predecessors, and two parts of that stack have no current spec, the rest rule in the draft component:DateInput FR13/DEC-1 and component:DateTimeInput FR8 (which also changes where a wheel driven by a mouse or trackpad comes to rest) and 29 theme motion roles that spec:AST-094 FR4 does not list. An engineering owner records the decision on the rest rule by commenting /approve-spec with the full head SHA (the author may do so as an engineering owner) and names the record that admits those roles. Whatever that decision, please:
- Remove the
packages/build/README.mdparagraph about an undeclared-variable warning the build no longer emits. - Use motion roles a shipped component reads in the
defineThemeand theme-template examples, and drop "no component uses it yet" from the gesture changesets the wheel now uses. - Rebase once #8162 and its predecessors land, so the diff is this pull request's own 299 lines rather than about 41,000.
[Automated review]
|
|
||
| Unsupported declarations fail the build by default with StyleX's replacement guidance. Set `propertyValidationMode` explicitly in `stylexOverrides` (modern API) or `stylexOptions` (legacy API) only when a migration needs the upstream `warn` or `silent` behavior. | ||
|
|
||
| A production build also checks the StyleX stylesheet for generated custom properties (`--<prefix><hash>`) that it reads but no stylesheet in the build declares, which browsers drop: a `.stylex.ts` export read in a style that is not a `defineVars`/`defineConsts` value, or one whose module never reached the build. It warns, naming the variable and the rule that reads it. Only stylesheets count as declarations, so a property the app sets at runtime (an inline style) is reported too: give it a name outside the StyleX class-name prefixes. |
There was a problem hiding this comment.
This paragraph describes the undeclared-variable warning that the revert "astryxStylex keeps no undeclared-variable warning" removed; vite.ts no longer checks for it, so readers are promised a warning they never get. Please delete it.
| * // A softer sheet, and a longer navigation transition (it paces | ||
| * // completion callbacks): | ||
| * motion: { | ||
| * springs: { 'springs.sheetPresent': { duration: 0.6, bounce: 0.1 } }, | ||
| * durations: { 'navigation.transitionMs': 450 }, | ||
| * } |
There was a problem hiding this comment.
No shipped component reads springs.sheetPresent or navigation.transitionMs yet; only the touch wheel resolves roles (picker.tapSpin.durationMs, timing.curves.move, scroll.bounce). A theme author who copies this sees nothing change. Please use a role a component reads, or say which component reads each; the same example is in packages/cli/assets/theme.template.ts:189-192.
| '@astryxdesign/core': patch | ||
| --- | ||
|
|
||
| [chore] Internal: the pan gesture recognizer, with UIKit's measured hysteresis and velocity filter. Not exported from the package entry point; no component uses it yet. |
There was a problem hiding this comment.
The touch wheel in this stack is built on the pan recognizer (PickerWheel.tsx:81), so "no component uses it yet" would be wrong in the release notes. The same clause is in gesture-tap-long-press.md, gesture-host.md, gesture-host-fixes.md, gesture-hook-fixes.md and touch-selection-lock-gestures.md.
There was a problem hiding this comment.
| | 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, so opening a bounded sheet never changes an untouched value: a committed value outside the bounds stays, and an empty field stays empty. | 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.
FR13 and DEC-1 are new requirements in a draft record, and they also change where a wheel driven by a mouse or trackpad comes to rest. They govern once an engineering owner approves this head with /approve-spec <full head SHA>, or amends them.
There was a problem hiding this comment.
Named and evidenced at the rule's origin, #8131: component:DateInput FR13 and DEC-1 (cixzhang, 2026-10-25) make the rest the same for every pointer, and #8131's description shows a trackpad on desktop Chromium before (back to 10) and after (settles on 9), the fine-pointer evidence spec:AST-017 FR59 asks for. This pull request carries #8131 because it is stacked on it.
…core/internal/touch Core ships the internal entry @astryxdesign/core/internal/touch, which re-exports the gesture primitives for Astryx's own packages, and the Lab-import guard fails a Lab import of core outside core's exports (architecture:react-component-runtime INV13). The README and the barrel's header named internal workspace imports and said nothing here is exported; they now name that entry.
…ill needs the element, and the listeners that cancel The release note, the stream's header, the host's comment and the README said the stream is one passive listener per event type and that a document-capture stopPropagation no longer starves the recognizers. Such a stop never hid a listener on the same node, and some subscriptions cancel. They now say what changed: an app's window-capture stopPropagation, or a document-capture stopImmediatePropagation registered before core, no longer hides a touch; a recognizer that must claim still needs the touch to reach its element; the gesture host's touchend, click and contextmenu cancel while a claimer is attached and the page hold's touchmove while it holds; and the stream stays ahead of an app's window-capture listener only until a type's listener is re-added. The README's list of blocking touchmove listeners gains the claimed touch's target and the document while a claiming element moves.
…default it moves
The {stylexOptions} form of astryxStylex now passes StyleX
treeshakeCompensation: true unless the caller sets it. spec:AST-017 FR3
asks the release note to name the old and new default and the option
that restores the old one; it now does.
…er and for the two stops the input stream fixes - A still finger with sub-pixel jitter over a scroll view keeps its tap and scrolls nothing (spec:AST-094 FR18–FR22). - A tap is still recognized under an app's window-capture stopPropagation, and under a document-capture stopImmediatePropagation registered before core's: the recognizers hear touches on the window's capture phase. Chromium and WebKit pass.
…s once Where nothing that claims is attached, the host's touchend listener is passive and cannot cancel the engine's own click after a retargeted tap clicks what is drawn. The shared click guard swallows that late click whatever is attached; this case pins it, as asked on meta#8293.
…esture host's subscriptions The gesture host subscribes no click: the one cancelling click subscriber is the click guard's, added at a window's first arm and kept. The release note, the stream's header and the gestures README listed click with the host's touchend and contextmenu; they now name the guard's own.
…-nearest-valid
…-nearest-valid
…el-nearest-valid
…e turn - The wheel reads the pointer type on the way down. usePointerDragScroll stops a primary mouse press from bubbling, so after a touch a mouse drag's travel still cross-faded on a fine pointer under reduced motion. - With meta#8483 merged in, the travel waits for a mouse drag's release instead of running whenever the hand pauses; a test covers it here. - DateInput's Owns line claims the shared wheel's mechanics; the TimeInput and DateTimeInput records own their sheets' time wheels. - FR13 and DateTimeInput FR8 say a shown wheel turns onto a value changed from outside, which the code and its tests now cite.
…he turn) into uikit/c21-wheel
…ps its mark after a nudge - A value changed from outside while the wheel is shown (a bound clamping the time after another wheel turned) turns the wheel onto its row, as UIDatePicker does and FR13 now says. The first park when the wheel is shown stays at once. - A motion that ends on the row it began on (a nudge that eases back, a drag off a row and back) gives the band's mark back to that row: the player forgets its last report when a motion starts, so the row it ends on is reported again. - The ctrl-wheel note cites FR43 (a ctrl-wheel is a pinch) and FR10 (with no pinch of its own, the wheel leaves it to the page's zoom).
…sheet on the desktop viewport This file's mouse cases run on a desktop viewport, where the field shows its popover unless it asks for the sheet; the case meta#8483 added now asks for it, as its neighbours do.
…e new foundation) into uikit/c21-wheel-proofs
… FR5 names The coast's proof now blocks the main thread for 1 s, the length spec:AST-094 FR5's verification names, ending while the coast is still over a row from rest so every frame moves a pixel or more. It follows the row that crosses the band halfway through, which stays in sight the whole second. The WebKit skip says what covers Mobile Safari instead: an iOS simulator capture through a 530 ms block.
…nto uikit/c21-wheel-listbox
The four Effects without a note now say what they synchronize: the latest props for callbacks attached once, the band's mark with the row the motion reports, the motion's end with the wheel's, and the latest touch-down handler.
The touch column's options lie under its drawn rows, so the proof taps the PM row's place on the screen, where the column's tap recognizer takes it, rather than asking for a tap on the option element.
…nto uikit/c21-wheel-proofs
…nto uikit/c21-wheel-listbox
…kit/c21-wheel-short-loop
…nto uikit/c21-wheel-short-loop
There was a problem hiding this comment.
Approval waits on an engineering owner's decision: through its open predecessors this pull request ships the draft component:DateInput FR13/DEC-1 and component:DateTimeInput FR8, under which a bounded sheet wheel that stops on a disabled value moves on to the nearest allowed one, for a mouse or trackpad in a forced bottom sheet as well as a finger. An engineering owner records that decision by commenting /approve-spec <full head SHA> on this pull request, and the author may do so as an engineering owner; otherwise an owner asks for the records to be amended. The useWheelListbox refactor itself keeps both columns' markup, and these changes are needed whatever the decision:
- Rebase once #8162 and the pull requests below it land, so the diff shrinks to the hook's 306 lines; against
mainit is 35,318 authored lines. spec:AST-094FR4 asks every duration a touch presentation plays to be a motion role, but the tap spin's 300 ms still comes from an unregistered table value (PickerWheel.tsx:226).- Drop “no shipped component reads the roles yet” from
motion/README.mdandmotion/roles.ts, and name what the unmount Effect atWheel.tsx:317releases.
[Automated review]
| // The running dip, so a step during its fade-in starts the next one where | ||
| // the column is. | ||
| const dipRef = useRef<Animation | null>(null); | ||
| useEffect( |
There was a problem hiding this comment.
architecture:react-component-runtime INV3: “A new or changed Effect MUST name the external system it synchronizes.” One line saying this releases the pending reduced-motion dip's timer when the wheel unmounts would do; every Effect in PickerWheel.tsx now has one.
|
Mapped to 811a02f:
Open: the tap spin's duration as a role (FR4 names no picker role, and |
Depends on #8162. Review only this PR's change: vjeux/astryx@276a6e9...eeeea52
Maintainer impact
The wheel has two presentations: today's scrolling column under a mouse and the touch column under a finger. Each wired the same listbox by hand (an id, the ARIA attributes, the Arrow, Page, Home and End keys, and row clicks), so a fix to one had to be repeated in the other, and the copies could drift.
Intended invariant
What led to it: Astryx's UIKit-parity work added the touch column (#8159) beside today's, and with it the second copy. Both keep their behavior and markup exactly:
aria-activedescendanton the active row, every row reachable by a click.Change
Options: keep two copies (no churn, but they drift); render both presentations from one component (their markup and motion differ too much); or share only the listbox wiring (chosen). A new internal hook,
useWheelListbox, owns the id, the listbox and option attributes and the key map. Each presentation passes its own three moves (step, go to an end, activate a row), because those are where the two differ. Wheel.tsx loses 18 lines and PickerWheel.tsx 33.Evidence
Two markup snapshots, recorded on #8162 before the move, cover both presentations' attributes, classes and order; they pass unchanged. The existing key, click and drag tests pass unchanged.
Scope
Testing
pnpm exec vitest run packages/core/src/DateInputpasses with both snapshots unchanged; the browser specs for both presentations pass in Chromium and WebKit.