From d4bbaf074508f78cf910bbe4cf3024be565599ad Mon Sep 17 00:00:00 2001 From: Cindy Zhang Date: Mon, 26 Oct 2026 18:24:02 -0700 Subject: [PATCH 1/4] spec(AST-094): the default look changes no size for touch; 44 px through hit areas only (FR42, DEC-20) --- .../specs/AST-094-touch-presentations/spec.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/specs/AST-094-touch-presentations/spec.md b/docs/specs/AST-094-touch-presentations/spec.md index 94fda268d7a00..7afb308810d38 100644 --- a/docs/specs/AST-094-touch-presentations/spec.md +++ b/docs/specs/AST-094-touch-presentations/spec.md @@ -464,6 +464,12 @@ FR33 apply to menus only. A mouse keeps today's behavior. This replaces `component:Selector` DEC-1's width-and-pointer query with the FR13 rule for `adaptive`. +- **FR42 — The default look changes no size for touch.** The default Astryx + look makes no size change for phones or touch; under a coarse pointer, touch + targets meet 44 px through an invisible hit area only. Mobile size changes + belong to theme adaptations. An alert's phone width is the one decided + exception (`component:AlertDialog`) (DEC-20). + ### Platform support - Supported engines: Astryx's supported browsers (`spec:AST-013`) with touch @@ -551,6 +557,7 @@ FR33 apply to menus only. A mouse keeps today's behavior. | FR34, FR35 | Browser tests and storyboards under a finger | a sub-menu drilling in and its Back row returning; a tap and a drag during a popover's and a menu's growth; a pinch during growth; a mouse | a drill-in that leaves the parent's rows in place, a change between levels that does not play on its roles, a tap during growth that closes, scrolls or moves focus, a pinch blocked other than by the author's `touch-action`, or a changed mouse path fails | | FR36–FR40 | Release tests on synthetic touch streams with explicit timestamps, per use | below and past each commit point; a flick that projects past it; a slow drag past it; a release moving back; Reduce Motion; keyboard and mouse paths | a decision that changes mid-settle, a release moving back that commits, a settle that does not start at the release velocity, or an action with no keyboard or mouse path fails | | FR41 | Browser tests with real touch input (`spec:AST-013` FR10) | a tap; a long press on a ContextMenu trigger, a DropdownMenu trigger the caller renders, a row with a context menu, and a slider thumb; a long press on a checkbox row's label and on plain text; a cancelled press; mouse and keyboard selection | a tap that selects, a hold with an action that starts a selection or callout, a label or plain text whose long press does not select natively, a suppression that outlives the press, or a change to native selection elsewhere or to mouse, keyboard, or assistive-technology selection fails | +| FR42 | Default-theme geometry tests under a coarse and a fine pointer, and hit-testing | every component at phone width with a finger and with a mouse | a default-theme size that differs under touch or at phone width, other than an alert's width, or a touch target under 44 px, fails | | all | iOS simulator: the UIKit reference capture and the same gesture in Safari; real iOS Safari and Android Chrome devices | per component | an unmatched curve or timing is a parity defect | ## Decision log @@ -702,6 +709,18 @@ iOS 26.2 simulator measures it. Rejected: the 150 ms delay on every menu row. +### DEC-20 — Touch changes no size in the default look + +**Reference:** `spec:AST-094/DEC-20` +**Decider:** `cixzhang`, `2026-10-26` + +Sizes stay the same on phones and under touch in the default look, so a +product looks the same everywhere unless its theme chooses otherwise; touch +reach comes from invisible hit areas. Themes own mobile size changes through +their adaptations. + +Rejected: touch-only row heights and control sizes in the default look. + ## Open questions - **OQ1 — Scroll view bounce-back curve.** What curve brings a scroll view From dd5f2393f6d4369f47ca15404ccc578deaae3d3e Mon Sep 17 00:00:00 2001 From: Cindy Zhang Date: Mon, 26 Oct 2026 18:24:44 -0700 Subject: [PATCH 2/4] =?UTF-8?q?spec(AST-094):=20FR42=20=E2=80=94=20no=20si?= =?UTF-8?q?ze=20increase=20for=20touch,=20shrinking=20is=20fine;=20hit=20a?= =?UTF-8?q?reas=20never=20overlap=20a=20neighbor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../specs/AST-094-touch-presentations/spec.md | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/docs/specs/AST-094-touch-presentations/spec.md b/docs/specs/AST-094-touch-presentations/spec.md index 7afb308810d38..2bbbcea8fdb31 100644 --- a/docs/specs/AST-094-touch-presentations/spec.md +++ b/docs/specs/AST-094-touch-presentations/spec.md @@ -464,11 +464,14 @@ FR33 apply to menus only. A mouse keeps today's behavior. This replaces `component:Selector` DEC-1's width-and-pointer query with the FR13 rule for `adaptive`. -- **FR42 — The default look changes no size for touch.** The default Astryx - look makes no size change for phones or touch; under a coarse pointer, touch - targets meet 44 px through an invisible hit area only. Mobile size changes - belong to theme adaptations. An alert's phone width is the one decided - exception (`component:AlertDialog`) (DEC-20). +- **FR42 — The default look grows nothing for touch.** The default Astryx + look makes no size increase for phones or touch; a size may shrink to fit a + compact screen, such as an alert's phone width (`component:AlertDialog`). + Under a coarse pointer, touch targets meet 44 px through an invisible hit + area. A hit-area expansion never overlaps a neighboring interactive + element's own target: where neighbors are closer than 44 px, the expansion + is clamped to half the gap, or skipped, so each element stays reachable. + Mobile size increases belong to theme adaptations (DEC-20). ### Platform support @@ -557,7 +560,7 @@ FR33 apply to menus only. A mouse keeps today's behavior. | FR34, FR35 | Browser tests and storyboards under a finger | a sub-menu drilling in and its Back row returning; a tap and a drag during a popover's and a menu's growth; a pinch during growth; a mouse | a drill-in that leaves the parent's rows in place, a change between levels that does not play on its roles, a tap during growth that closes, scrolls or moves focus, a pinch blocked other than by the author's `touch-action`, or a changed mouse path fails | | FR36–FR40 | Release tests on synthetic touch streams with explicit timestamps, per use | below and past each commit point; a flick that projects past it; a slow drag past it; a release moving back; Reduce Motion; keyboard and mouse paths | a decision that changes mid-settle, a release moving back that commits, a settle that does not start at the release velocity, or an action with no keyboard or mouse path fails | | FR41 | Browser tests with real touch input (`spec:AST-013` FR10) | a tap; a long press on a ContextMenu trigger, a DropdownMenu trigger the caller renders, a row with a context menu, and a slider thumb; a long press on a checkbox row's label and on plain text; a cancelled press; mouse and keyboard selection | a tap that selects, a hold with an action that starts a selection or callout, a label or plain text whose long press does not select natively, a suppression that outlives the press, or a change to native selection elsewhere or to mouse, keyboard, or assistive-technology selection fails | -| FR42 | Default-theme geometry tests under a coarse and a fine pointer, and hit-testing | every component at phone width with a finger and with a mouse | a default-theme size that differs under touch or at phone width, other than an alert's width, or a touch target under 44 px, fails | +| FR42 | Default-theme geometry tests under a coarse and a fine pointer, and hit-testing between adjacent targets | every component at phone width with a finger and with a mouse; a dense toolbar; a chip and its remove button; a Switch beside a label link | a default-theme size that grows under touch or at phone width, a touch target under 44 px where neighbors allow it, or a hit area that overlaps a neighbor's target, fails | | all | iOS simulator: the UIKit reference capture and the same gesture in Safari; real iOS Safari and Android Chrome devices | per component | an unmatched curve or timing is a parity defect | ## Decision log @@ -709,15 +712,16 @@ iOS 26.2 simulator measures it. Rejected: the 150 ms delay on every menu row. -### DEC-20 — Touch changes no size in the default look +### DEC-20 — The default look grows nothing for touch **Reference:** `spec:AST-094/DEC-20` **Decider:** `cixzhang`, `2026-10-26` -Sizes stay the same on phones and under touch in the default look, so a -product looks the same everywhere unless its theme chooses otherwise; touch -reach comes from invisible hit areas. Themes own mobile size changes through -their adaptations. +Sizes do not grow on phones or under touch in the default look, so a product +looks the same everywhere unless its theme chooses otherwise; shrinking to fit +a compact screen is fine. Touch reach comes from invisible hit areas, clamped +so two close neighbors both stay reachable. Themes own mobile size increases +through their adaptations. Rejected: touch-only row heights and control sizes in the default look. From 6c32385a97a9c9dbf2730a47bad30ee8a9195888 Mon Sep 17 00:00:00 2001 From: Cindy Zhang Date: Mon, 26 Oct 2026 21:37:49 -0700 Subject: [PATCH 3/4] spec(AST-094): FR42 governs boxes; type sizing and deliberate hit areas unaffected; current-state impact --- .../specs/AST-094-touch-presentations/spec.md | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/docs/specs/AST-094-touch-presentations/spec.md b/docs/specs/AST-094-touch-presentations/spec.md index 2bbbcea8fdb31..4b5d1bca5caf7 100644 --- a/docs/specs/AST-094-touch-presentations/spec.md +++ b/docs/specs/AST-094-touch-presentations/spec.md @@ -45,7 +45,7 @@ a measured, sourced difference exists. - Pointer (desktop) presentations. Their timing and easing stay with the theme's duration and easing tokens (`architecture:theme-tokens`). - Platform-matched look and feel: glass versus material surfaces, glyphs and - chrome. This record governs behavior only. + chrome. This record governs behavior, and touch sizing only as FR42 states. - WebKit embedded in a native app and the native Swift package. This record governs the web components themselves. - Scroll physics. Scrolling stays native on every platform: on iOS an overflow @@ -464,14 +464,18 @@ FR33 apply to menus only. A mouse keeps today's behavior. This replaces `component:Selector` DEC-1's width-and-pointer query with the FR13 rule for `adaptive`. -- **FR42 — The default look grows nothing for touch.** The default Astryx - look makes no size increase for phones or touch; a size may shrink to fit a - compact screen, such as an alert's phone width (`component:AlertDialog`). - Under a coarse pointer, touch targets meet 44 px through an invisible hit - area. A hit-area expansion never overlaps a neighboring interactive - element's own target: where neighbors are closer than 44 px, the expansion - is clamped to half the gap, or skipped, so each element stays reachable. - Mobile size increases belong to theme adaptations (DEC-20). +- **FR42 — The default look grows no box for touch.** The default Astryx + look makes no box size increase for phones or touch: row heights, control + sizes and target sizes stay as they are; a box may shrink to fit a compact + screen, such as an alert's phone width. Type sizing is outside this rule: + the 16 px mobile reading base (`design:mobile-typography` DR1, DR3) and the + 16 px text-entry floor (`family:input-fields` FR9) are unaffected. Under a + coarse pointer, touch targets meet 44 px through an invisible hit area. A + hit-area expansion never overlaps a neighboring interactive element's own + target: where neighbors are closer than 44 px, the expansion is clamped to + half the gap, or skipped, so each element stays reachable; an expansion a + component record sets on purpose, such as `component:Thumbnail` AR4's, is + unaffected. Mobile size increases belong to theme adaptations (DEC-20). ### Platform support @@ -522,6 +526,9 @@ FR33 apply to menus only. A mouse keeps today's behavior. and FR9 under a finger) are stated here (FR26–FR30); FR6's last sentence gives way to the cell press profile (FR11); its mouse rules (FR8 and the mouse halves of FR1–FR3) and its non-gesture rules stay in the module. +- Every component under a coarse pointer: no box grows for touch, and a + touch target reaches 44 px only through an invisible hit area clamped by + its neighbors (FR42). - `component:DropdownMenu`, `component:ContextMenu` and `component:Popover`: under a finger they follow FR26–FR35 as each applies. - BottomSheet, Toast, Lightbox, NavigationStack and keyboard dismissal: a @@ -560,7 +567,7 @@ FR33 apply to menus only. A mouse keeps today's behavior. | FR34, FR35 | Browser tests and storyboards under a finger | a sub-menu drilling in and its Back row returning; a tap and a drag during a popover's and a menu's growth; a pinch during growth; a mouse | a drill-in that leaves the parent's rows in place, a change between levels that does not play on its roles, a tap during growth that closes, scrolls or moves focus, a pinch blocked other than by the author's `touch-action`, or a changed mouse path fails | | FR36–FR40 | Release tests on synthetic touch streams with explicit timestamps, per use | below and past each commit point; a flick that projects past it; a slow drag past it; a release moving back; Reduce Motion; keyboard and mouse paths | a decision that changes mid-settle, a release moving back that commits, a settle that does not start at the release velocity, or an action with no keyboard or mouse path fails | | FR41 | Browser tests with real touch input (`spec:AST-013` FR10) | a tap; a long press on a ContextMenu trigger, a DropdownMenu trigger the caller renders, a row with a context menu, and a slider thumb; a long press on a checkbox row's label and on plain text; a cancelled press; mouse and keyboard selection | a tap that selects, a hold with an action that starts a selection or callout, a label or plain text whose long press does not select natively, a suppression that outlives the press, or a change to native selection elsewhere or to mouse, keyboard, or assistive-technology selection fails | -| FR42 | Default-theme geometry tests under a coarse and a fine pointer, and hit-testing between adjacent targets | every component at phone width with a finger and with a mouse; a dense toolbar; a chip and its remove button; a Switch beside a label link | a default-theme size that grows under touch or at phone width, a touch target under 44 px where neighbors allow it, or a hit area that overlaps a neighbor's target, fails | +| FR42 | Default-theme geometry tests under a coarse and a fine pointer, and hit-testing between adjacent targets | every component at phone width with a finger and with a mouse; a dense toolbar; a chip and its remove button; a Switch beside a label link | a default-theme box that grows under touch or at phone width, a touch target under 44 px where neighbors allow it, or a hit area that overlaps a neighbor's target, fails | | all | iOS simulator: the UIKit reference capture and the same gesture in Safari; real iOS Safari and Android Chrome devices | per component | an unmatched curve or timing is a parity defect | ## Decision log From 26f6b61c8078bcfd82fbc0b53ca8f54e92f8bc10 Mon Sep 17 00:00:00 2001 From: Cindy Zhang Date: Mon, 26 Oct 2026 23:19:36 -0700 Subject: [PATCH 4/4] spec(AST-094): FR42's carve-outs reach its row and impact line; a box growing with its text is type sizing --- docs/specs/AST-094-touch-presentations/spec.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/specs/AST-094-touch-presentations/spec.md b/docs/specs/AST-094-touch-presentations/spec.md index 83f9d9929fbfb..bb07340f4fa83 100644 --- a/docs/specs/AST-094-touch-presentations/spec.md +++ b/docs/specs/AST-094-touch-presentations/spec.md @@ -472,7 +472,9 @@ FR33 apply to menus only. A mouse keeps today's behavior. - **FR42 — The default look grows no box for touch.** The default Astryx look makes no box size increase for phones or touch: row heights, control sizes and target sizes stay as they are; a box may shrink to fit a compact - screen, such as an alert's phone width. Type sizing is outside this rule: + screen, such as an alert's phone width. Type sizing is outside this rule, including a box + that grows only with its text, such as a Button whose label follows the + 16 px reading base: the 16 px mobile reading base (`design:mobile-typography` DR1, DR3) and the 16 px text-entry floor (`family:input-fields` FR9) are unaffected. Under a coarse pointer, touch targets meet 44 px through an invisible hit area. A @@ -533,7 +535,7 @@ FR33 apply to menus only. A mouse keeps today's behavior. mouse halves of FR1–FR3) and its non-gesture rules stay in the module. - Every component under a coarse pointer: no box grows for touch, and a touch target reaches 44 px only through an invisible hit area clamped by - its neighbors (FR42). + its neighbors, unless a component record sets its own (FR42). - `component:DropdownMenu`, `component:ContextMenu` and `component:Popover`: under a finger they follow FR26–FR35 as each applies. - BottomSheet, Toast, Lightbox, NavigationStack and keyboard dismissal: a @@ -572,7 +574,7 @@ FR33 apply to menus only. A mouse keeps today's behavior. | FR34, FR35 | Browser tests and storyboards under a finger | a sub-menu drilling in and its Back row returning; a tap and a drag during a popover's and a menu's growth; a pinch during growth; a mouse | a drill-in that leaves the parent's rows in place, a change between levels that does not play on its roles, a tap during growth that closes, scrolls or moves focus, a pinch blocked other than by the author's `touch-action`, or a changed mouse path fails | | FR36–FR40 | Release tests on synthetic touch streams with explicit timestamps, per use | below and past each commit point; a flick that projects past it; a slow drag past it; a release moving back; Reduce Motion; keyboard and mouse paths | a decision that changes mid-settle, a release moving back that commits, a settle that does not start at the release velocity, or an action with no keyboard or mouse path fails | | FR41 | Browser tests with real touch input (`spec:AST-013` FR10) | a tap; a long press on a ContextMenu trigger, a DropdownMenu trigger the caller renders, a row with a context menu, and a slider thumb; a long press on a checkbox row's label and on plain text; a cancelled press; mouse and keyboard selection | a tap that selects, a hold with an action that starts a selection or callout, a label or plain text whose long press does not select natively, a suppression that outlives the press, or a change to native selection elsewhere or to mouse, keyboard, or assistive-technology selection fails | -| FR42 | Default-theme geometry tests under a coarse and a fine pointer, and hit-testing between adjacent targets | every component at phone width with a finger and with a mouse; a dense toolbar; a chip and its remove button; a Switch beside a label link | a default-theme box that grows under touch or at phone width, a touch target under 44 px where neighbors allow it, or a hit area that overlaps a neighbor's target, fails | +| FR42 | Default-theme geometry tests under a coarse and a fine pointer, and hit-testing between adjacent targets | every component at phone width with a finger and with a mouse; a dense toolbar; a chip and its remove button; a Switch beside a label link | a default-theme box that grows under touch or at phone width other than with its text, a touch target under 44 px where neighbors allow it, or a hit area that overlaps a neighbor's target where no component record sets it, fails | | all | iOS simulator: the UIKit reference capture and the same gesture in Safari; real iOS Safari and Android Chrome devices | per component | an unmatched curve or timing is a parity defect | ## Decision log