@astryxdesign/core 0.7.3 → 0.7.4-canary.28b1cd4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/dist/BottomSheet/BottomSheet.d.ts +18 -6
  2. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  3. package/dist/BottomSheet/BottomSheet.js +268 -58
  4. package/dist/BottomSheet/BottomSheetSwitcher.d.ts +41 -12
  5. package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
  6. package/dist/BottomSheet/BottomSheetSwitcher.js +294 -165
  7. package/dist/BottomSheet/BottomSheetSwitcherContext.d.ts +51 -1
  8. package/dist/BottomSheet/BottomSheetSwitcherContext.d.ts.map +1 -1
  9. package/dist/BottomSheet/BottomSheetSwitcherContext.js +13 -1
  10. package/dist/Carousel/Carousel.d.ts.map +1 -1
  11. package/dist/Carousel/Carousel.js +7 -11
  12. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  13. package/dist/Chat/useTriggerMenu.js +46 -7
  14. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  15. package/dist/ComplexSelector/ComplexSelector.js +6 -1
  16. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  17. package/dist/ContextMenu/ContextMenu.js +12 -0
  18. package/dist/DateInput/DateInput.d.ts.map +1 -1
  19. package/dist/DateInput/DateInput.js +6 -1
  20. package/dist/DateInput/NativeDateField.d.ts.map +1 -1
  21. package/dist/DateInput/NativeDateField.js +6 -1
  22. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  23. package/dist/DateInput/TouchDateField.js +9 -1
  24. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  25. package/dist/DateRangeInput/DateRangeInput.js +6 -1
  26. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  27. package/dist/DateTimeInput/DateTimeInput.js +6 -1
  28. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  29. package/dist/DateTimeInput/TouchDateTimeField.js +9 -1
  30. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  31. package/dist/MultiSelector/MultiSelector.js +6 -1
  32. package/dist/Selector/Selector.d.ts.map +1 -1
  33. package/dist/Selector/Selector.js +6 -1
  34. package/dist/TextArea/TextArea.d.ts.map +1 -1
  35. package/dist/TextArea/TextArea.js +6 -1
  36. package/dist/TextInput/TextInput.d.ts.map +1 -1
  37. package/dist/TextInput/TextInput.js +6 -1
  38. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  39. package/dist/TimeInput/TimeInput.js +6 -1
  40. package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
  41. package/dist/TimeInput/TouchTimeField.js +9 -1
  42. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  43. package/dist/Tokenizer/Tokenizer.js +9 -1
  44. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  45. package/dist/Typeahead/BaseTypeahead.js +7 -1
  46. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  47. package/dist/Typeahead/Typeahead.js +9 -1
  48. package/dist/astryx.css +2 -0
  49. package/dist/hooks/useBusyAnnouncement.d.ts +22 -0
  50. package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -0
  51. package/dist/hooks/useBusyAnnouncement.js +87 -0
  52. package/dist/hooks/useMenuPress.d.ts +2 -2
  53. package/dist/hooks/useMenuPress.d.ts.map +1 -1
  54. package/dist/hooks/useMenuPress.js +5 -1
  55. package/dist/hooks/useTypeahead.d.ts.map +1 -1
  56. package/dist/hooks/useTypeahead.js +7 -2
  57. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  58. package/dist/i18n/generated-locales/en.generated.js +1 -0
  59. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  60. package/dist/i18n/generated-locales/pseudo.generated.js +1 -0
  61. package/locales/en.json +6 -2
  62. package/locales/pseudo.json +3 -0
  63. package/package.json +4 -4
  64. package/src/BottomSheet/BottomSheet.doc.mjs +2 -2
  65. package/src/BottomSheet/BottomSheet.spec.md +2 -5
  66. package/src/BottomSheet/BottomSheet.tsx +260 -47
  67. package/src/BottomSheet/BottomSheetEdgeTint.test.tsx +4 -2
  68. package/src/BottomSheet/BottomSheetSwitcher.doc.mjs +11 -10
  69. package/src/BottomSheet/BottomSheetSwitcher.spec.md +28 -35
  70. package/src/BottomSheet/BottomSheetSwitcher.test.tsx +830 -48
  71. package/src/BottomSheet/BottomSheetSwitcher.tsx +396 -215
  72. package/src/BottomSheet/BottomSheetSwitcherContext.ts +57 -2
  73. package/src/Carousel/Carousel.test.tsx +8 -12
  74. package/src/Carousel/Carousel.tsx +6 -13
  75. package/src/Chat/ChatComposerInput.test.tsx +167 -1
  76. package/src/Chat/useTriggerMenu.tsx +55 -6
  77. package/src/ComplexSelector/ComplexSelector.tsx +5 -1
  78. package/src/ContextMenu/ContextMenu.test.tsx +34 -0
  79. package/src/ContextMenu/ContextMenu.tsx +13 -1
  80. package/src/DateInput/DateInput.tsx +5 -1
  81. package/src/DateInput/DateInputTouch.test.tsx +45 -0
  82. package/src/DateInput/NativeDateField.test.tsx +10 -2
  83. package/src/DateInput/NativeDateField.tsx +5 -1
  84. package/src/DateInput/TouchDateField.tsx +14 -2
  85. package/src/DateRangeInput/DateRangeInput.tsx +5 -1
  86. package/src/DateTimeInput/DateTimeInput.tsx +5 -1
  87. package/src/DateTimeInput/TouchDateTimeField.tsx +14 -2
  88. package/src/MultiSelector/MultiSelector.test.tsx +18 -4
  89. package/src/MultiSelector/MultiSelector.tsx +5 -1
  90. package/src/ProgressBar/ProgressBar.test.tsx +4 -21
  91. package/src/ProgressBar/__tests__/ProgressBar.a11y.chromium.spec.ts +114 -0
  92. package/src/ProgressBar/__tests__/ProgressBar.a11y.known-failures.ts +12 -0
  93. package/src/ProgressBar/__tests__/ProgressBar.a11y.renders.tsx +38 -0
  94. package/src/ProgressBar/__tests__/ProgressBar.a11y.states.ts +123 -0
  95. package/src/ProgressBar/__tests__/ProgressBar.a11y.test.tsx +107 -0
  96. package/src/Selector/Selector.test.tsx +22 -5
  97. package/src/Selector/Selector.tsx +5 -1
  98. package/src/TextArea/TextArea.test.tsx +9 -1
  99. package/src/TextArea/TextArea.tsx +5 -1
  100. package/src/TextInput/TextInput.tsx +5 -1
  101. package/src/TimeInput/TimeInput.tsx +5 -1
  102. package/src/TimeInput/TouchTimeField.tsx +12 -2
  103. package/src/Tokenizer/Tokenizer.test.tsx +17 -12
  104. package/src/Tokenizer/Tokenizer.tsx +10 -1
  105. package/src/Typeahead/BaseTypeahead.tsx +14 -1
  106. package/src/Typeahead/Typeahead.test.tsx +32 -41
  107. package/src/Typeahead/Typeahead.tsx +10 -1
  108. package/src/__tests__/BusyOwnerAnnouncement.test.tsx +470 -0
  109. package/src/hooks/__tests__/MenuPressShadowRoot.a11y.chromium.spec.ts +50 -0
  110. package/src/hooks/useBusyAnnouncement.ts +100 -0
  111. package/src/hooks/useMenuPress.test.tsx +27 -1
  112. package/src/hooks/useMenuPress.ts +12 -3
  113. package/src/hooks/useTypeahead.test.tsx +42 -1
  114. package/src/hooks/useTypeahead.ts +7 -2
  115. package/src/i18n/generated-locales/en.generated.ts +1 -0
  116. package/src/i18n/generated-locales/pseudo.generated.ts +1 -0
@@ -57,8 +57,6 @@ Consumer migration instructions belong in consumer docs and release notes.
57
57
 
58
58
  - The presentation lifecycle of every directly nested BottomSheet child's native
59
59
  dialog: which is presented, retained during a handoff, or closed.
60
- Implementation gap: the switcher renders one dialog of its own and hosts
61
- every child as a panel inside it; no child owns a dialog yet.
62
60
  - Which child sheet is active, retained during a handoff, or hidden.
63
61
  - Which sheet dialog hosts the flow (its ref, `id`, and dismissal
64
62
  registration) and which paints the flow's one scrim, plus
@@ -79,27 +77,27 @@ Consumer migration instructions belong in consumer docs and release notes.
79
77
 
80
78
  ## Public concepts
81
79
 
82
- | Concept | Closed values or states | Meaning | Availability by variant/orientation/state | Default | Owner | Stability | Invalid-value behavior |
83
- | ------------------- | ---------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | -------------------------------------- | ------------------------------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------ |
84
- | Active sheet | `null` or one nested BottomSheet `sheetId` | Selects the only interactive child, or closes the flow | All presentations | `null` is closed; the prop is required | `component:BottomSheetSwitcher` | released | A non-matching or duplicate id is not given a safe public fallback by the current contract |
85
- | Shared presentation | `true` / `false` through `hasScrim` | Selects the current modal scrim-backed host or non-modal no-scrim host | Entire flow | `true` | `component:BottomSheetSwitcher` | released | Boolean only |
86
- | Child identity | Non-empty `sheetId` on each direct BottomSheet child | Associates controlled selection, labeling, purpose, and transition state with a child | Direct nested BottomSheet children | none | `component:BottomSheet` | released | Empty ids warn and stay hidden; duplicate-id behavior is not specified |
87
- | Dismissal request | `onActiveSheetChange(null)` | Reports an allowed implicit close without taking control from the caller | Escape/platform close, scrim click, or swipe according to active child purpose | none | `component:BottomSheetSwitcher`; `family:overlay-dismissal` owns ordering | released | The caller may retain its controlled value |
88
- | Dialog surface | inherited dialog props plus `ref` and `onCancel` | Dialog props and handlers, `onCancel` included, reach every sheet dialog; `ref`, `id`, and `data-testid` resolve to the host dialog, which is never null for an object ref while a sheet is mounted (DEC-2). Implementation gap: every dialog prop, `ref`, `id`, and `data-testid` reaches the switcher's one shared dialog | Entire flow | none | `component:BottomSheetSwitcher` | released | Component-owned semantics and handlers retain precedence |
80
+ | Concept | Closed values or states | Meaning | Availability by variant/orientation/state | Default | Owner | Stability | Invalid-value behavior |
81
+ | ------------------- | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | -------------------------------------- | ------------------------------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------ |
82
+ | Active sheet | `null` or one nested BottomSheet `sheetId` | Selects the only interactive child, or closes the flow | All presentations | `null` is closed; the prop is required | `component:BottomSheetSwitcher` | released | A non-matching or duplicate id is not given a safe public fallback by the current contract |
83
+ | Shared presentation | `true` / `false` through `hasScrim` | Selects the current modal scrim-backed host or non-modal no-scrim host | Entire flow | `true` | `component:BottomSheetSwitcher` | released | Boolean only |
84
+ | Child identity | Non-empty `sheetId` on each direct BottomSheet child | Associates controlled selection, labeling, purpose, and transition state with a child | Direct nested BottomSheet children | none | `component:BottomSheet` | released | Empty ids warn and stay hidden; duplicate-id behavior is not specified |
85
+ | Dismissal request | `onActiveSheetChange(null)` | Reports an allowed implicit close without taking control from the caller | Escape/platform close, scrim click, or swipe according to active child purpose | none | `component:BottomSheetSwitcher`; `family:overlay-dismissal` owns ordering | released | The caller may retain its controlled value |
86
+ | Dialog surface | inherited dialog props plus `ref` and `onCancel` | Dialog props and handlers, `onCancel` included, reach every sheet dialog; `ref`, `id`, and `data-testid` resolve to the host dialog, which is never null for an object ref while a sheet is mounted (DEC-2). | Entire flow | none | `component:BottomSheetSwitcher` | released | Component-owned semantics and handlers retain precedence |
89
87
 
90
88
  ## Behavioral and layout contract
91
89
 
92
- | ID | Invariant | Basis |
93
- | --- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- |
94
- | FR1 | Zero or one child sheet is interactive for each controlled `activeSheet` value; all other children are hidden or retained inert and `aria-hidden` during a transition. | Current source, docs, and tests |
95
- | FR2 | Each child sheet owns one native dialog. Opening a sheet presents its dialog once; a handoff presents the entering sheet's dialog above the retained one and closes the retained dialog only after its panel has faded. Returning to a sheet whose dialog is still open beneath a newer one re-presents it so the interactive sheet is the topmost layer. Implementation gap: the switcher presents one shared dialog once per flow and hosts every child as a panel inside it; a handoff swaps panels in that dialog, and no dialog is re-presented. | DEC-1 |
96
- | FR3 | During a handoff, the entering sheet is above the retained sheet. A taller retained sheet aligns down to a shorter entering sheet, and the retained sheet fades only after required transform motion completes. | Current source and transition tests |
97
- | FR4 | Closing retains the outgoing sheet through its exit, then closes the dialog. A modal flow restores focus to the element captured when that modal flow opened. | Current source and focus tests |
98
- | FR5 | `hasScrim=true` uses `showModal()`, a native backdrop, and native focus containment, and locks page scroll: the page does not scroll while a modal flow is presented; the lock is held continuously across a handoff, never released and re-acquired between steps; it still holds beneath a `Dialog` opened from a step; it is released after the flow's exit (DEC-1). `hasScrim=false` uses `show()` without a backdrop or scroll lock and leaves the page interactive. In a non-modal flow the sheet dialogs order themselves with local values inside the switcher's isolated flow wrapper (DEC-1); the page-level value that wrapper carries remains a `spec:AST-027` conformance gap. Implementation gap: a script focus trap runs on top of the modal dialog's native containment; a non-modal flow is one shared dialog carrying the page-level value itself, with no flow wrapper. | DEC-1; `spec:AST-027` FR2, FR4, FR8 |
99
- | FR6 | The active child purpose governs implicit dismissal: `info` allows Escape, scrim click, and swipe; `form` allows Escape; `required` blocks all three and exposes `alertdialog`. | Current BottomSheet docs and switcher tests |
100
- | FR7 | While visible, the switcher participates in `family:overlay-dismissal`; one Escape or platform close request reaches only the topmost present layer, and descendants receive a deeper logical layer scope. | `family:overlay-dismissal` and the audit regression test |
101
- | FR8 | One backdrop paints the flow's scrim at a time: the retained sheet's dialog keeps it through a handoff and the entering dialog takes it over without a fade when the retained dialog closes. A stale gesture from an outgoing sheet cannot change the flow's scrim, and unmounting a retained sheet cannot keep its dialog open or the flow's modal layer held. Implementation gap: the one backdrop is the shared dialog's, so no takeover between dialogs happens. | DEC-1; current tests |
102
- | FR9 | The switcher forwards neutral dialog attributes, styling inputs, and composed handlers, `onCancel` included, to every sheet dialog, so a handler fires for whichever sheet dialog raises the event; renders `id` and `data-testid` on the host dialog only, so each appears once in the document; attaches its ref to the host dialog; and preserves its owned ARIA and dismissal behavior. An object ref's `current` is never `null` while a sheet is mounted. A callback ref follows React's semantics on a handoff: a cleanup it returned runs when it detaches from the old host; a callback ref without a cleanup is called with `null` on detach, then with the new host. Implementation gap: every forwarded input, `ref`, `id`, and `data-testid` reaches the one shared dialog, which never changes on a handoff. | DEC-1, DEC-2; `architecture:public-component-api` INV8 |
90
+ | ID | Invariant | Basis |
91
+ | --- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- |
92
+ | FR1 | Zero or one child sheet is interactive for each controlled `activeSheet` value; all other children are hidden or retained inert and `aria-hidden` during a transition. | Current source, docs, and tests |
93
+ | FR2 | Each child sheet owns one native dialog. Opening a sheet presents its dialog once; a handoff presents the entering sheet's dialog above the retained one and closes the retained dialog only after its panel has faded. Returning to a sheet whose dialog is still open beneath a newer one re-presents it so the interactive sheet is the topmost layer. | DEC-1 |
94
+ | FR3 | During a handoff, the entering sheet is above the retained sheet. A taller retained sheet aligns down to a shorter entering sheet, and the retained sheet fades only after required transform motion completes. | Current source and transition tests |
95
+ | FR4 | Closing retains the outgoing sheet through its exit, then closes the dialog. A modal flow restores focus to the element captured when that modal flow opened. | Current source and focus tests |
96
+ | FR5 | `hasScrim=true` uses `showModal()`, a native backdrop, and native focus containment, and locks page scroll: the page does not scroll while a modal flow is presented; the lock is held continuously across a handoff, never released and re-acquired between steps; it still holds beneath a `Dialog` opened from a step; it is released after the flow's exit (DEC-1). `hasScrim=false` uses `show()` without a backdrop or scroll lock and leaves the page interactive. In a non-modal flow the sheet dialogs order themselves with local values inside the switcher's isolated flow wrapper (DEC-1); the page-level value that wrapper carries remains a `spec:AST-027` conformance gap. | DEC-1; `spec:AST-027` FR2, FR4, FR8 |
97
+ | FR6 | The active child purpose governs implicit dismissal: `info` allows Escape, scrim click, and swipe; `form` allows Escape; `required` blocks all three and exposes `alertdialog`. | Current BottomSheet docs and switcher tests |
98
+ | FR7 | While visible, the switcher participates in `family:overlay-dismissal`; one Escape or platform close request reaches only the topmost present layer, and descendants receive a deeper logical layer scope. | `family:overlay-dismissal` and the audit regression test |
99
+ | FR8 | One backdrop paints the flow's scrim at a time: the retained sheet's dialog keeps it through a handoff and the entering dialog takes it over without a fade when the retained dialog closes. A stale gesture from an outgoing sheet cannot change the flow's scrim, and unmounting a retained sheet cannot keep its dialog open or the flow's modal layer held. | DEC-1; current tests |
100
+ | FR9 | The switcher forwards neutral dialog attributes, styling inputs, and composed handlers, `onCancel` included, to every sheet dialog, so a handler fires for whichever sheet dialog raises the event; renders `id` and `data-testid` on the host dialog only, so each appears once in the document; attaches its ref to the host dialog; and preserves its owned ARIA and dismissal behavior. An object ref's `current` is never `null` while a sheet is mounted. A callback ref follows React's semantics on a handoff: a cleanup it returned runs when it detaches from the old host; a callback ref without a cleanup is called with `null` on detach, then with the new host. | DEC-1, DEC-2; `architecture:public-component-api` INV8 |
103
101
 
104
102
  ### Allowed variation
105
103
 
@@ -111,17 +109,13 @@ Consumer migration instructions belong in consumer docs and release notes.
111
109
 
112
110
  ### Representative states
113
111
 
114
- Where a state names a sheet's own dialog, the retained dialog, or the flow
115
- wrapper, the shipped switcher meets it with its one shared dialog instead; FR2
116
- and FR5 record that implementation gap.
117
-
118
112
  | State | Required invariant | Allowed variation |
119
113
  | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
120
114
  | Closed | Every sheet dialog is closed and no child is interactive. | Child panels may remain mounted but hidden. |
121
115
  | First open | Matching child is visible and interactive in its own dialog. | Child-owned height and content. |
122
116
  | Handoff | Entering child is interactive in its own dialog; retained child's dialog stays open, inert, and hidden from accessibility APIs until it fades, and keeps painting the one scrim. | Alignment offset depends on measured panel geometry. |
123
117
  | Closing | Outgoing child is retained inert while exit motion completes; modal focus and scroll ownership remain until close. | Theme-controlled duration. |
124
- | Modal | Native modal host, backdrop, native focus containment, and the page scroll lock are active. Implementation gap: a script focus trap runs on top of the native containment. | Active child's `purpose` controls implicit dismissal. |
118
+ | Modal | Native modal host, backdrop, native focus containment, and the page scroll lock are active. | Active child's `purpose` controls implicit dismissal. |
125
119
  | Non-modal | Native non-modal host has no backdrop or scroll lock and background content remains interactive. | The current clipping/stacking limitation is a conformance gap, not an allowed exception. |
126
120
 
127
121
  ### Transformation and precedence order
@@ -140,8 +134,7 @@ and FR5 record that implementation gap.
140
134
  Native modality holds across a modal flow's child handoffs because a sheet
141
135
  dialog is modal throughout, and the one page scroll lock is held for the
142
136
  whole flow rather than per step. A non-modal flow paints no backdrop and
143
- holds no lock. Implementation gap: one shared dialog is presented
144
- throughout, so a handoff has one dialog open, not two.
137
+ holds no lock.
145
138
  - **PR2 — Stable child registration.** Parent rerenders and changing consumer ref
146
139
  identities do not unregister a mounted child or cancel an active handoff.
147
140
 
@@ -157,11 +150,11 @@ and FR5 record that implementation gap.
157
150
 
158
151
  ## Design relationships
159
152
 
160
- | Anatomy or state | Design requirement | Representation authority | Hierarchy role | Component contract |
161
- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------- | -------------- | ------------------ |
162
- | Shared dialog | Transparent host for the flow's interaction and accessibility boundary, one per child sheet (DEC-1). Implementation gap: one such host serves the whole flow | Current source and public docs; DEC-1 for the per-sheet clause | Structural | FR2, FR5, AR1 |
163
- | Sheet panels | Delegate visible panel, content, handle, and gesture presentation to BottomSheet | `component:BottomSheet` as observational context | Prominent | FR1, FR3 |
164
- | Scrim | Optional native backdrop that dims and blocks the page in modal presentation; one sheet dialog paints it at a time (DEC-1) | Current source and public docs; DEC-1 for the one-painter clause | Supporting | FR5, FR8 |
153
+ | Anatomy or state | Design requirement | Representation authority | Hierarchy role | Component contract |
154
+ | ---------------- | -------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- | -------------- | ------------------ |
155
+ | Sheet dialogs | Transparent per-sheet hosts; the active sheet's is the flow's interaction and accessibility boundary (DEC-1) | Current source and public docs; DEC-1 for the per-sheet clause | Structural | FR2, FR5, AR1 |
156
+ | Sheet panels | Delegate visible panel, content, handle, and gesture presentation to BottomSheet | `component:BottomSheet` as observational context | Prominent | FR1, FR3 |
157
+ | Scrim | Optional native backdrop that dims and blocks the page in modal presentation; one sheet dialog paints it at a time (DEC-1) | Current source and public docs; DEC-1 for the one-painter clause | Supporting | FR5, FR8 |
165
158
 
166
159
  ### Theming anatomy
167
160
 
@@ -169,9 +162,9 @@ and FR5 record that implementation gap.
169
162
 
170
163
  ```json
171
164
  {
172
- "Shared dialog": {
165
+ "Sheet dialogs": {
173
166
  "none": {
174
- "reason": "intentional: The transparent dialog is hosting, positioning, event, and focus machinery rather than a stable painted part."
167
+ "reason": "intentional: The transparent dialogs are hosting, positioning, event, and focus machinery rather than a stable painted part."
175
168
  }
176
169
  },
177
170
  "Sheet panels": {
@@ -179,7 +172,7 @@ and FR5 record that implementation gap.
179
172
  },
180
173
  "Scrim": {
181
174
  "none": {
182
- "reason": "reachability-gap: The switcher-coordinated native backdrop paints the scrim but has no current public theming target."
175
+ "reason": "reachability-gap: The native backdrop of the sheet dialog that owns the scrim paints it but has no current public theming target."
183
176
  }
184
177
  }
185
178
  }