@astryxdesign/core 0.5.2-canary.c9c8564 → 0.5.2-canary.e03511b

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 (216) hide show
  1. package/dist/BottomSheet/BottomSheet.d.ts +3 -1
  2. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  3. package/dist/BottomSheet/BottomSheet.js +4 -3
  4. package/dist/BottomSheet/BottomSheetEdgeTint.d.ts +2 -2
  5. package/dist/BottomSheet/BottomSheetEdgeTint.d.ts.map +1 -1
  6. package/dist/BottomSheet/BottomSheetEdgeTint.js +7 -10
  7. package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
  8. package/dist/BottomSheet/BottomSheetSwitcher.js +1 -1
  9. package/dist/Button/Button.d.ts +2 -1
  10. package/dist/Button/Button.d.ts.map +1 -1
  11. package/dist/Button/Button.js +11 -4
  12. package/dist/Carousel/Carousel.d.ts.map +1 -1
  13. package/dist/Carousel/Carousel.js +2 -2
  14. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  15. package/dist/Chat/ChatToolCalls.js +34 -17
  16. package/dist/ContextMenu/ContextMenu.d.ts +14 -3
  17. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  18. package/dist/ContextMenu/ContextMenu.js +149 -26
  19. package/dist/ContextMenu/index.d.ts +1 -0
  20. package/dist/ContextMenu/index.d.ts.map +1 -1
  21. package/dist/DropdownMenu/DropdownMenu.d.ts +24 -5
  22. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  23. package/dist/DropdownMenu/DropdownMenu.js +340 -26
  24. package/dist/DropdownMenu/DropdownMenuContext.d.ts +1 -1
  25. package/dist/DropdownMenu/DropdownMenuContext.d.ts.map +1 -1
  26. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  27. package/dist/DropdownMenu/DropdownMenuItem.js +1 -1
  28. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts +6 -2
  29. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  30. package/dist/DropdownMenu/DropdownMenuSubMenu.js +43 -14
  31. package/dist/DropdownMenu/MenuBottomSheet.d.ts +20 -0
  32. package/dist/DropdownMenu/MenuBottomSheet.d.ts.map +1 -0
  33. package/dist/DropdownMenu/MenuBottomSheet.js +36 -0
  34. package/dist/DropdownMenu/MenuBottomSheetActionList.d.ts +10 -0
  35. package/dist/DropdownMenu/MenuBottomSheetActionList.d.ts.map +1 -0
  36. package/dist/DropdownMenu/MenuBottomSheetActionList.js +111 -0
  37. package/dist/DropdownMenu/index.d.ts +2 -1
  38. package/dist/DropdownMenu/index.d.ts.map +1 -1
  39. package/dist/DropdownMenu/menuWidth.d.ts +14 -0
  40. package/dist/DropdownMenu/menuWidth.d.ts.map +1 -0
  41. package/dist/DropdownMenu/menuWidth.js +35 -0
  42. package/dist/DropdownMenu/useMenuOverflow.d.ts +10 -0
  43. package/dist/DropdownMenu/useMenuOverflow.d.ts.map +1 -0
  44. package/dist/DropdownMenu/useMenuOverflow.js +60 -0
  45. package/dist/MoreMenu/MoreMenu.d.ts +8 -2
  46. package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
  47. package/dist/MoreMenu/MoreMenu.js +2 -0
  48. package/dist/MultiSelector/MultiSelector.d.ts +11 -1
  49. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  50. package/dist/MultiSelector/MultiSelector.js +97 -68
  51. package/dist/MultiSelector/index.d.ts +1 -1
  52. package/dist/MultiSelector/index.d.ts.map +1 -1
  53. package/dist/Popover/Popover.d.ts +10 -6
  54. package/dist/Popover/Popover.d.ts.map +1 -1
  55. package/dist/Popover/Popover.js +141 -16
  56. package/dist/Popover/usePopover.d.ts +4 -0
  57. package/dist/Popover/usePopover.d.ts.map +1 -1
  58. package/dist/Popover/usePopover.js +52 -5
  59. package/dist/Selector/Selector.d.ts +10 -0
  60. package/dist/Selector/Selector.d.ts.map +1 -1
  61. package/dist/Selector/Selector.js +106 -80
  62. package/dist/Selector/SelectorBottomSheet.d.ts +21 -0
  63. package/dist/Selector/SelectorBottomSheet.d.ts.map +1 -0
  64. package/dist/Selector/SelectorBottomSheet.js +83 -0
  65. package/dist/Selector/index.d.ts +1 -1
  66. package/dist/Selector/index.d.ts.map +1 -1
  67. package/dist/Selector/selectorPresentation.stylex.d.ts +16 -0
  68. package/dist/Selector/selectorPresentation.stylex.d.ts.map +1 -0
  69. package/dist/Selector/selectorPresentation.stylex.js +21 -0
  70. package/dist/Selector/useSelectorPresentation.d.ts +32 -0
  71. package/dist/Selector/useSelectorPresentation.d.ts.map +1 -0
  72. package/dist/Selector/useSelectorPresentation.js +90 -0
  73. package/dist/Toast/useToastGesture.d.ts.map +1 -1
  74. package/dist/Toast/useToastGesture.js +46 -9
  75. package/dist/astryx.css +19 -1
  76. package/dist/hooks/useAdaptivePresentation.d.ts +5 -0
  77. package/dist/hooks/useAdaptivePresentation.d.ts.map +1 -0
  78. package/dist/hooks/useAdaptivePresentation.js +19 -0
  79. package/dist/hooks/useFocusReturnVisibility.d.ts +7 -0
  80. package/dist/hooks/useFocusReturnVisibility.d.ts.map +1 -0
  81. package/dist/hooks/useFocusReturnVisibility.js +35 -0
  82. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  83. package/dist/hooks/useFocusTrap.js +12 -0
  84. package/locales/en.json +20 -0
  85. package/locales/pseudo.json +15 -0
  86. package/package.json +2 -2
  87. package/src/BottomSheet/BottomSheet.doc.mjs +37 -0
  88. package/src/BottomSheet/BottomSheet.spec.md +177 -0
  89. package/src/BottomSheet/BottomSheet.test.tsx +29 -0
  90. package/src/BottomSheet/BottomSheet.tsx +7 -4
  91. package/src/BottomSheet/BottomSheetEdgeTint.test.tsx +4 -6
  92. package/src/BottomSheet/BottomSheetEdgeTint.tsx +7 -10
  93. package/src/BottomSheet/BottomSheetSwitcher.tsx +1 -2
  94. package/src/Button/Button.doc.mjs +56 -0
  95. package/src/Button/Button.test.tsx +10 -0
  96. package/src/Button/Button.tsx +13 -5
  97. package/src/ButtonGroup/ButtonGroup.doc.mjs +47 -0
  98. package/src/Carousel/Carousel.test.tsx +83 -0
  99. package/src/Carousel/Carousel.tsx +8 -2
  100. package/src/Chat/ChatToolCalls.test.tsx +44 -0
  101. package/src/Chat/ChatToolCalls.tsx +36 -15
  102. package/src/CheckboxList/CheckboxList.doc.mjs +172 -31
  103. package/src/CheckboxList/CheckboxList.spec.md +214 -0
  104. package/src/CommandPalette/CommandPalette.doc.mjs +72 -0
  105. package/src/CommandPalette/CommandPalette.spec.md +223 -0
  106. package/src/ComplexSelector/ComplexSelector.doc.mjs +42 -0
  107. package/src/ComplexSelector/ComplexSelector.spec.md +189 -0
  108. package/src/ContextMenu/ContextMenu.doc.mjs +61 -1
  109. package/src/ContextMenu/ContextMenu.spec.md +206 -0
  110. package/src/ContextMenu/ContextMenu.test.tsx +131 -1
  111. package/src/ContextMenu/ContextMenu.tsx +199 -32
  112. package/src/ContextMenu/index.ts +1 -0
  113. package/src/Divider/Divider.doc.mjs +24 -0
  114. package/src/Divider/Divider.spec.md +150 -0
  115. package/src/DropdownMenu/DropdownMenu.doc.mjs +305 -40
  116. package/src/DropdownMenu/DropdownMenu.spec.md +245 -0
  117. package/src/DropdownMenu/DropdownMenu.test.tsx +518 -7
  118. package/src/DropdownMenu/DropdownMenu.tsx +459 -28
  119. package/src/DropdownMenu/DropdownMenuContext.tsx +1 -1
  120. package/src/DropdownMenu/DropdownMenuItem.tsx +2 -0
  121. package/src/DropdownMenu/DropdownMenuSubMenu.doc.mjs +4 -2
  122. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +124 -0
  123. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +72 -17
  124. package/src/DropdownMenu/MenuBottomSheet.tsx +46 -0
  125. package/src/DropdownMenu/MenuBottomSheetActionList.tsx +141 -0
  126. package/src/DropdownMenu/index.ts +2 -0
  127. package/src/DropdownMenu/menuWidth.ts +51 -0
  128. package/src/DropdownMenu/useMenuOverflow.ts +77 -0
  129. package/src/FieldStatus/FieldStatus.doc.mjs +21 -0
  130. package/src/FieldStatus/FieldStatus.spec.md +212 -0
  131. package/src/Grid/Grid.doc.mjs +19 -0
  132. package/src/Grid/Grid.spec.md +161 -0
  133. package/src/Icon/Icon.doc.mjs +196 -48
  134. package/src/Icon/Icon.spec.md +191 -0
  135. package/src/IconButton/IconButton.doc.mjs +38 -0
  136. package/src/Kbd/Kbd.doc.mjs +18 -0
  137. package/src/Kbd/Kbd.spec.md +141 -0
  138. package/src/Layout/Layout.doc.mjs +32 -0
  139. package/src/Layout/Layout.spec.md +199 -0
  140. package/src/Lightbox/Lightbox.doc.mjs +149 -33
  141. package/src/Lightbox/Lightbox.spec.md +197 -0
  142. package/src/Markdown/Markdown.doc.mjs +60 -0
  143. package/src/Markdown/Markdown.spec.md +200 -0
  144. package/src/MobileNav/MobileNav.doc.mjs +140 -32
  145. package/src/MobileNav/MobileNav.spec.md +208 -0
  146. package/src/MoreMenu/MoreMenu.doc.mjs +59 -0
  147. package/src/MoreMenu/MoreMenu.spec.md +221 -0
  148. package/src/MoreMenu/MoreMenu.test.tsx +47 -0
  149. package/src/MoreMenu/MoreMenu.tsx +13 -1
  150. package/src/MultiSelector/MultiSelector.doc.mjs +128 -0
  151. package/src/MultiSelector/MultiSelector.spec.md +266 -0
  152. package/src/MultiSelector/MultiSelector.test.tsx +127 -0
  153. package/src/MultiSelector/MultiSelector.tsx +121 -73
  154. package/src/MultiSelector/index.ts +1 -0
  155. package/src/NavIcon/NavIcon.doc.mjs +17 -0
  156. package/src/NavIcon/NavIcon.spec.md +133 -0
  157. package/src/NavMenu/NavHeadingMenu.spec.md +205 -0
  158. package/src/NavMenu/NavMenu.doc.mjs +37 -0
  159. package/src/Outline/Outline.doc.mjs +35 -0
  160. package/src/Outline/Outline.spec.md +161 -0
  161. package/src/OverflowList/OverflowList.doc.mjs +24 -0
  162. package/src/OverflowList/OverflowList.spec.md +156 -0
  163. package/src/Pagination/Pagination.doc.mjs +74 -0
  164. package/src/Pagination/Pagination.spec.md +225 -0
  165. package/src/Popover/Popover.doc.mjs +11 -11
  166. package/src/Popover/Popover.test.tsx +397 -2
  167. package/src/Popover/Popover.tsx +228 -21
  168. package/src/Popover/usePopover.tsx +92 -15
  169. package/src/ProgressBar/ProgressBar.doc.mjs +198 -38
  170. package/src/ProgressBar/ProgressBar.spec.md +260 -0
  171. package/src/Resizable/Resizable.doc.mjs +59 -16
  172. package/src/Resizable/Resizable.spec.md +194 -0
  173. package/src/Section/Section.doc.mjs +17 -0
  174. package/src/Section/Section.spec.md +138 -0
  175. package/src/SegmentedControl/SegmentedControl.doc.mjs +83 -0
  176. package/src/SegmentedControl/SegmentedControl.spec.md +151 -0
  177. package/src/Selector/Selector.doc.mjs +12 -0
  178. package/src/Selector/Selector.spec.md +202 -0
  179. package/src/Selector/Selector.test.tsx +135 -0
  180. package/src/Selector/Selector.tsx +141 -82
  181. package/src/Selector/SelectorBottomSheet.tsx +97 -0
  182. package/src/Selector/index.ts +1 -0
  183. package/src/Selector/selectorPresentation.stylex.ts +20 -0
  184. package/src/Selector/useSelectorPresentation.ts +147 -0
  185. package/src/Skeleton/Skeleton.doc.mjs +12 -0
  186. package/src/Skeleton/Skeleton.spec.md +126 -0
  187. package/src/Slider/Slider.doc.mjs +184 -30
  188. package/src/Slider/Slider.spec.md +223 -0
  189. package/src/Stack/Stack.doc.mjs +22 -0
  190. package/src/Stack/Stack.spec.md +154 -0
  191. package/src/StatusDot/StatusDot.doc.mjs +17 -0
  192. package/src/StatusDot/StatusDot.spec.md +137 -0
  193. package/src/Switch/Switch.doc.mjs +40 -0
  194. package/src/Switch/Switch.spec.md +174 -0
  195. package/src/Table/Table.doc.mjs +102 -24
  196. package/src/Table/Table.spec.md +283 -0
  197. package/src/Text/Text.doc.mjs +190 -43
  198. package/src/Text/Text.spec.md +205 -0
  199. package/src/TextArea/TextArea.doc.mjs +255 -45
  200. package/src/TextArea/TextArea.spec.md +204 -0
  201. package/src/Toast/ToastViewport.test.tsx +118 -4
  202. package/src/Toast/useToastGesture.ts +61 -8
  203. package/src/ToggleButton/ToggleButton.doc.mjs +56 -0
  204. package/src/Toolbar/Toolbar.doc.mjs +19 -0
  205. package/src/Toolbar/Toolbar.spec.md +173 -0
  206. package/src/Tooltip/Tooltip.doc.mjs +17 -0
  207. package/src/Tooltip/Tooltip.spec.md +141 -0
  208. package/src/TreeList/TreeList.doc.mjs +58 -0
  209. package/src/TreeList/TreeList.spec.md +220 -0
  210. package/src/Typeahead/Typeahead.doc.mjs +83 -1
  211. package/src/Typeahead/Typeahead.spec.md +250 -0
  212. package/src/hooks/useAdaptivePresentation.ts +35 -0
  213. package/src/hooks/useFocusReturnVisibility.ts +45 -0
  214. package/src/hooks/useFocusTrap.test.tsx +40 -0
  215. package/src/hooks/useFocusTrap.ts +13 -0
  216. package/src/theme/themingTargets.test.ts +91 -25
@@ -0,0 +1,245 @@
1
+ ---
2
+ schema_version: 1
3
+ template_version: 3
4
+ kind: component
5
+ id: component:DropdownMenu
6
+ authority: draft
7
+ archive_reason: null
8
+ superseded_by: null
9
+ approved_by: null
10
+ approved_at: null
11
+ owners: [cixzhang]
12
+ review_triggers: [theming]
13
+ verified_by:
14
+ [
15
+ packages/core/src/DropdownMenu/DropdownMenu.test.tsx,
16
+ packages/core/src/DropdownMenu/DropdownMenuSelectable.test.tsx,
17
+ packages/core/src/DropdownMenu/DropdownMenuSubMenu.test.tsx,
18
+ packages/core/src/BottomSheet/BottomSheet.test.tsx,
19
+ packages/core/src/List/List.test.tsx,
20
+ packages/core/src/Indicator/Indicator.test.tsx,
21
+ packages/core/src/Icon/Icon.test.tsx,
22
+ scripts/check-knowledge.mjs,
23
+ ]
24
+ families: [family:overlay-dismissal]
25
+ design_specs: []
26
+ architecture:
27
+ [
28
+ architecture:component-theming-surface,
29
+ architecture:interaction-modality,
30
+ architecture:layer-runtime,
31
+ ]
32
+ contributing: []
33
+ system_specs: []
34
+ ---
35
+
36
+ # DropdownMenu component contract
37
+
38
+ ## Intent
39
+
40
+ DropdownMenu presents actions from a visible Button trigger in either an
41
+ anchored pointer menu or a BottomSheet-hosted touch action list. This draft
42
+ records current consumer anatomy, presentation-specific ownership, and theming
43
+ reachability without changing runtime behavior, styling, targets, or public API.
44
+
45
+ ## Compatibility and migration
46
+
47
+ - Released default preserved: `yes`
48
+ - Compatibility class: additive documentation only; runtime, DOM, styling,
49
+ targets, and public API remain unchanged
50
+ - Controlled/uncontrolled behavior: unchanged
51
+ - Migration decision: none
52
+
53
+ Consumer migration instructions belong in consumer docs and release notes.
54
+
55
+ ## Ownership boundary
56
+
57
+ **Owns**
58
+
59
+ - The Pointer menu surface and Touch menu surface and their shared current
60
+ `dropdown-menu` target.
61
+ - Pointer action rows, pointer-only section headings and dividers, radio marker
62
+ specialization, and submenu indicator presentation through the other five
63
+ current DropdownMenu targets.
64
+ - Selecting between the current pointer and touch render paths after presentation
65
+ policy resolves.
66
+
67
+ **Does not own / non-goals**
68
+
69
+ - Trigger-button presentation — delegated to `component:Button`.
70
+ - The Touch sheet frame — delegated to `component:BottomSheet`.
71
+ - Touch action-list and row presentation — delegated to `component:List`.
72
+ - Shared checkbox-indicator and ordinary icon presentation — delegated to
73
+ `component:Indicator` and `component:Icon`.
74
+ - Shared layer lifecycle or dismissal policy.
75
+
76
+ ## Public concepts
77
+
78
+ No new public concept is introduced. Consumer props, item shapes,
79
+ subcomponents, and presentation policy remain documented in
80
+ `DropdownMenu.doc.mjs` and the subcomponent docs.
81
+
82
+ ## Behavioral and layout contract
83
+
84
+ | ID | Candidate invariant | Basis | Draft review state |
85
+ | --- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------- | -------------------------------------------------- |
86
+ | FR1 | Every current render contains a Trigger button. Pointer presentation renders a Pointer menu surface with pointer-owned rows and optional pointer headings, dividers, indicators, and nested flyouts. Touch presentation renders a Touch sheet frame containing a Touch menu surface, Touch heading, Touch action list, and Touch action rows. | Current source, docs, and tests | Verified current behavior; no new behavior decided |
87
+ | FR2 | The six current local targets are `dropdown-menu`, `dropdown-menu-item`, `dropdown-menu-radio`, `dropdown-menu-section-heading`, `dropdown-menu-divider`, and `dropdown-menu-indicator-icon`; every target remains on its current painted element. | Current source, docs, and tests | Verified current inventory; no target change |
88
+ | FR3 | Button owns the Trigger button, BottomSheet owns the Touch sheet frame, List owns the Touch action list and Touch action rows, Indicator owns checkbox chrome, and Icon owns ordinary rendered icons. | Current source and owner docs | Verified current delegation; no ownership change |
89
+ | FR4 | The same `dropdown-menu` target reaches the alternative Pointer menu surface and Touch menu surface. Pointer action rows retain `dropdown-menu-item`; touch action rows instead use List's `list-item` target. | Current source and tests | Verified modality split; no target change |
90
+
91
+ ### Allowed variation
92
+
93
+ - **AV1 — Presentation.** `popover`, `bottom-sheet`, and resolved `adaptive`
94
+ presentation may select the current pointer or touch anatomy without changing
95
+ the ownership of either branch.
96
+ - **AV2 — Content mode.** Data-driven and compound pointer menus may vary their
97
+ rows while preserving the current target owners. Touch presentation remains
98
+ data-driven.
99
+ - **AV3 — Optional content.** Icons, selectable indicators, headings, dividers,
100
+ and nested actions render only when the supplied menu content requires them.
101
+
102
+ ### Representative states
103
+
104
+ | State | Required invariant | Allowed variation |
105
+ | --------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- |
106
+ | Anchored root menu | Trigger button and Pointer menu surface render with pointer-owned rows. | Width, placement, alignment, and optional item content vary. |
107
+ | Anchored nested flyout | Pointer action row opens another Pointer menu surface and may show the submenu indicator icon. | Loading may replace the indicator with the current Spinner. |
108
+ | Bottom-sheet root actions | Trigger button opens Touch sheet frame, Touch menu surface, heading, action list, and action rows. | Icons, sections, dividers, and action descriptions may vary. |
109
+ | Bottom-sheet nested actions | The same frame and list owners remain while heading and rows change to the selected action level. | Back control and drill-in indicator follow current navigation. |
110
+ | Selectable pointer action | Pointer action row may contain shared checkbox or radio chrome. | Checked and disabled state follow the current item contracts. |
111
+
112
+ ### Transformation and precedence order
113
+
114
+ - No new presentation-resolution, open-state, item-rendering, positioning, or
115
+ styling precedence rule is introduced.
116
+
117
+ ### Performance and resources
118
+
119
+ - No new loading, listener, measurement, or render constraint is introduced.
120
+
121
+ ## Accessibility contract
122
+
123
+ This draft does not change or extend DropdownMenu's existing trigger naming,
124
+ menu and dialog roles, focus movement, keyboard navigation, item semantics, or
125
+ dismissal behavior.
126
+
127
+ ## Design relationships
128
+
129
+ | Anatomy or state | Design requirement | Representation authority | Hierarchy role | Component contract |
130
+ | ---------------------------------- | ----------------------------------------------------------------------------- | ------------------------------ | ----------------- | ------------------ |
131
+ | Trigger button | Provides the visible control that opens and closes the selected presentation. | `component:Button` | Supporting | FR1, FR3 |
132
+ | Trigger indicator icon | Communicates disclosure on labeled triggers when enabled. | `component:Icon` | Supporting | FR1, FR3 |
133
+ | Pointer menu surface | Paints the anchored root or nested pointer menu panel. | Current source and public docs | Prominent | FR1, FR2, FR4 |
134
+ | Pointer action row | Presents one action, selectable option, or nested-menu entry. | Current source and public docs | Prominent | FR1, FR2, FR4 |
135
+ | Icon-rendered item icon | Adds an optional semantic or component icon to an action row through Icon. | `component:Icon` | Supporting | FR1, FR3 |
136
+ | Caller-rendered item start content | Presents arbitrary React content directly in an action-row start slot. | Caller-supplied content | Context-dependent | FR1, FR3 |
137
+ | Checkbox indicator | Draws the decorative checkbox state for a checkbox action row. | `component:Indicator` | Supporting | FR1, FR3 |
138
+ | Radio indicator | Draws shared radio chrome with the current menu-specific radio target. | Current source and Indicator | Supporting | FR1, FR2, FR3 |
139
+ | Pointer section heading | Labels a grouped set of pointer action rows. | Current source and public docs | Supporting | FR1, FR2 |
140
+ | Pointer divider | Separates groups of pointer action rows. | Current source and public docs | Supporting | FR1, FR2 |
141
+ | Pointer submenu indicator icon | Identifies a pointer action row that opens a nested flyout. | Current source and public docs | Supporting | FR1, FR2 |
142
+ | Touch sheet frame | Supplies the touch panel, scrolling area, handle, and optional scrim. | `component:BottomSheet` | Prominent | FR1, FR3 |
143
+ | Touch menu surface | Arranges menu-owned heading and action content inside the sheet. | Current source and public docs | Prominent | FR1, FR2, FR4 |
144
+ | Touch heading | Names the current root or drill-in action view. | Current source and tests | Supporting | FR1 |
145
+ | Touch action list | Groups touch actions using the spacious List presentation. | `component:List` | Prominent | FR1, FR3 |
146
+ | Touch action row | Presents one touch action or drill-in entry using ListItem. | `component:List` | Prominent | FR1, FR3, FR4 |
147
+ | Touch divider | Separates groups in the touch action list. | `component:Divider` | Supporting | FR1, FR3 |
148
+
149
+ The `dropdown-menu` target intentionally appears on both alternative menu
150
+ surfaces. The radio element also carries Indicator's shared radio target, and
151
+ the pointer divider also carries Divider's target; their local targets remain
152
+ valid distinct contracts. Touch headings retain the shared `heading` target documented by Text rather
153
+ than adding a DropdownMenu-owned heading target.
154
+
155
+ ### Theming anatomy
156
+
157
+ <!-- anatomy-theming:v1 -->
158
+
159
+ ```json
160
+ {
161
+ "Trigger button": {
162
+ "delegatesTo": {"owner": "component:Button", "target": "button"}
163
+ },
164
+ "Trigger indicator icon": {
165
+ "delegatesTo": {"owner": "component:Icon", "target": "icon"}
166
+ },
167
+ "Pointer menu surface": {"target": "dropdown-menu"},
168
+ "Pointer action row": {"target": "dropdown-menu-item"},
169
+ "Icon-rendered item icon": {
170
+ "delegatesTo": {"owner": "component:Icon", "target": "icon"}
171
+ },
172
+ "Caller-rendered item start content": {
173
+ "none": {
174
+ "reason": "intentional: Arbitrary ReactNode item content is caller-owned and receives no DropdownMenu target."
175
+ }
176
+ },
177
+ "Checkbox indicator": {
178
+ "delegatesTo": {
179
+ "owner": "component:Indicator",
180
+ "target": "checkbox-indicator"
181
+ }
182
+ },
183
+ "Radio indicator": {"target": "dropdown-menu-radio"},
184
+ "Pointer section heading": {"target": "dropdown-menu-section-heading"},
185
+ "Pointer divider": {"target": "dropdown-menu-divider"},
186
+ "Pointer submenu indicator icon": {
187
+ "target": "dropdown-menu-indicator-icon"
188
+ },
189
+ "Touch sheet frame": {
190
+ "delegatesTo": {"owner": "component:BottomSheet", "target": "bottom-sheet"}
191
+ },
192
+ "Touch menu surface": {"target": "dropdown-menu"},
193
+ "Touch heading": {
194
+ "delegatesTo": {"owner": "component:Text", "target": "heading"}
195
+ },
196
+ "Touch action list": {
197
+ "delegatesTo": {"owner": "component:List", "target": "list"}
198
+ },
199
+ "Touch action row": {
200
+ "delegatesTo": {"owner": "component:List", "target": "list-item"}
201
+ },
202
+ "Touch divider": {
203
+ "delegatesTo": {"owner": "component:Divider", "target": "divider"}
204
+ }
205
+ }
206
+ ```
207
+
208
+ ## Family and system relationships
209
+
210
+ - `architecture:component-theming-surface` owns anatomy qualification, local
211
+ target mapping, presentation-specific rows, and delegation rules.
212
+ - `architecture:interaction-modality` owns the shared pointer, touch, keyboard,
213
+ and adaptive-presentation boundaries; this draft changes none of them.
214
+ - `architecture:layer-runtime` owns the current `usePopover` host, native
215
+ light-dismiss reconciliation, anchor positioning, and nested `useLayer`
216
+ flyouts. Touch presentation delegates hosting to BottomSheet.
217
+ - `family:overlay-dismissal` owns shared Escape and platform-close ordering.
218
+ DropdownMenu root participates through its Popover focus trap; the composed
219
+ BottomSheet and DropdownMenuSubMenu retain their recorded local-only adoption
220
+ gaps.
221
+
222
+ ## Verification map
223
+
224
+ | Contract | Verification | Representative states | Mutation or failure expectation | Audit section |
225
+ | ------------------- | --------------------------------------------------------------------------------------------------------- | -------------------------------------------------- | ------------------------------------------------------------------------------------------------ | ----------------------------- |
226
+ | FR1, FR4 | `DropdownMenu.test.tsx` pointer, bottom-sheet, adaptive, section, divider, and drill-in suites | Root pointer, nested pointer, root touch, drill-in | Collapsing presentation-specific parts or owners fails structure, target, or role assertions. | `audit:DropdownMenu/anatomy` |
227
+ | FR2 | DropdownMenu target suites, source inspection, and theming target inventories | All six local targets | Removing, renaming, or assigning a current target to the wrong part fails evidence or inventory. | `audit:DropdownMenu/theming` |
228
+ | FR3 | `DropdownMenuSelectable.test.tsx` plus BottomSheet, List, Indicator, Icon, and Divider owner tests | Trigger, touch actions, icons, checkbox, radio | A composed part loses its owner target or is documented as a new local target. | `audit:DropdownMenu/theming` |
229
+ | Layer relationships | `DropdownMenu.test.tsx`, `DropdownMenuSubMenu.test.tsx`, and current layer/dismissal architecture records | Light dismiss, nested flyout, sheet dismissal | Documentation claims a shared owner where current source retains local behavior, or the reverse. | `audit:DropdownMenu/behavior` |
230
+ | Theming anatomy map | `scripts/check-knowledge.mjs` | Canonical anatomy and current target inventory | Missing, extra, prefixed, stale, or unclassified mappings fail repository validation. | `audit:DropdownMenu/theming` |
231
+
232
+ ## Decision log
233
+
234
+ None. This draft records current facts and introduces no component-local design,
235
+ API, theming, modality, or layer-system decision.
236
+
237
+ ## Open questions
238
+
239
+ None.
240
+
241
+ ## Content boundary
242
+
243
+ This file does not duplicate consumer prop tables, item examples, focus and
244
+ positioning algorithms, implementation steps, or shared modality, layer,
245
+ dismissal, and theming rules. It links to their owners.