@exponential-at/ui 0.0.0-stage → 0.1.0

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 (251) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +54 -0
  3. package/README.md +360 -2
  4. package/catalog/a11y.json +668 -0
  5. package/catalog/basic-map.json +104 -0
  6. package/catalog/code.json +58 -0
  7. package/catalog/core.catalog.json +4752 -0
  8. package/catalog/core.schema.json +22667 -0
  9. package/catalog/host.json +64 -0
  10. package/catalog/layout.json +20 -0
  11. package/catalog/limits.json +9 -0
  12. package/catalog/locale.json +48 -0
  13. package/catalog/macros.json +3417 -0
  14. package/catalog/recipes.json +61 -0
  15. package/catalog/strings.json +72 -0
  16. package/catalog/style.json +128 -0
  17. package/catalog/theme.schema.json +42543 -0
  18. package/catalog/tokens.json +47 -0
  19. package/conformance/README.md +217 -0
  20. package/conformance/baseline.ts +101 -0
  21. package/conformance/browser-page.ts +146 -0
  22. package/conformance/browser-suites.ts +683 -0
  23. package/conformance/compare.ts +201 -0
  24. package/conformance/dom.ts +96 -0
  25. package/conformance/dump.ts +163 -0
  26. package/conformance/fonts.json +154 -0
  27. package/conformance/manifest.json +224 -0
  28. package/conformance/parity-compare.ts +191 -0
  29. package/conformance/parity-report.schema.json +73 -0
  30. package/conformance/parity.ts +412 -0
  31. package/conformance/pixel.ts +177 -0
  32. package/conformance/primitives-page.ts +49 -0
  33. package/conformance/report.schema.json +66 -0
  34. package/conformance/run.ts +118 -0
  35. package/dist/chunks/index-98npjvsd.js +3940 -0
  36. package/dist/chunks/index-98npjvsd.js.map +27 -0
  37. package/dist/chunks/index-gwkt14w3.js +7314 -0
  38. package/dist/chunks/index-gwkt14w3.js.map +10 -0
  39. package/dist/chunks/index-njt7yzzm.js +134 -0
  40. package/dist/chunks/index-njt7yzzm.js.map +9 -0
  41. package/dist/chunks/index-we7va6v6.js +7984 -0
  42. package/dist/chunks/index-we7va6v6.js.map +15 -0
  43. package/dist/chunks/index-xrm6f7wc.js +2563 -0
  44. package/dist/chunks/index-xrm6f7wc.js.map +10 -0
  45. package/dist/conformance.js +182749 -0
  46. package/dist/conformance.js.map +10 -0
  47. package/dist/entries/prompt.js +251 -0
  48. package/dist/entries/prompt.js.map +11 -0
  49. package/dist/entries/schema.js +1725 -0
  50. package/dist/entries/schema.js.map +11 -0
  51. package/dist/host/index.js +122 -0
  52. package/dist/host/index.js.map +9 -0
  53. package/dist/index.js +3213 -0
  54. package/dist/index.js.map +27 -0
  55. package/dist/types/src/a11y.d.ts +21 -0
  56. package/dist/types/src/animation.d.ts +76 -0
  57. package/dist/types/src/basic-map.d.ts +38 -0
  58. package/dist/types/src/builder.d.ts +50 -0
  59. package/dist/types/src/catalog.d.ts +54 -0
  60. package/dist/types/src/catalog.described.d.ts +33 -0
  61. package/dist/types/src/catalog.generated.d.ts +829 -0
  62. package/dist/types/src/chart.d.ts +46 -0
  63. package/dist/types/src/code.d.ts +44 -0
  64. package/dist/types/src/color.d.ts +20 -0
  65. package/dist/types/src/conformance.d.ts +39 -0
  66. package/dist/types/src/connector/app.d.ts +14 -0
  67. package/dist/types/src/connector/connector.d.ts +77 -0
  68. package/dist/types/src/connector/index.d.ts +4 -0
  69. package/dist/types/src/css.d.ts +29 -0
  70. package/dist/types/src/define.d.ts +66 -0
  71. package/dist/types/src/direction.d.ts +16 -0
  72. package/dist/types/src/dynamic.d.ts +159 -0
  73. package/dist/types/src/entries/prompt.d.ts +11 -0
  74. package/dist/types/src/entries/schema.d.ts +8 -0
  75. package/dist/types/src/expr.d.ts +71 -0
  76. package/dist/types/src/extension.d.ts +4 -0
  77. package/dist/types/src/format.d.ts +112 -0
  78. package/dist/types/src/geometry.d.ts +40 -0
  79. package/dist/types/src/host/contract.d.ts +188 -0
  80. package/dist/types/src/host/decoders.d.ts +61 -0
  81. package/dist/types/src/host/index.d.ts +11 -0
  82. package/dist/types/src/host/package.d.ts +58 -0
  83. package/dist/types/src/host/policy.d.ts +105 -0
  84. package/dist/types/src/host/router.d.ts +34 -0
  85. package/dist/types/src/host/runtime.d.ts +205 -0
  86. package/dist/types/src/host/sources.d.ts +15 -0
  87. package/dist/types/src/host/transports.d.ts +109 -0
  88. package/dist/types/src/index.d.ts +63 -0
  89. package/dist/types/src/layout.d.ts +20 -0
  90. package/dist/types/src/limits.d.ts +21 -0
  91. package/dist/types/src/list.d.ts +133 -0
  92. package/dist/types/src/locale.d.ts +22 -0
  93. package/dist/types/src/macros.d.ts +29 -0
  94. package/dist/types/src/overlay.d.ts +27 -0
  95. package/dist/types/src/prompt.d.ts +44 -0
  96. package/dist/types/src/recipes.d.ts +17 -0
  97. package/dist/types/src/reducer.d.ts +41 -0
  98. package/dist/types/src/resizable.d.ts +38 -0
  99. package/dist/types/src/schema.d.ts +7 -0
  100. package/dist/types/src/strings.d.ts +13 -0
  101. package/dist/types/src/style.d.ts +201 -0
  102. package/dist/types/src/test-preload.d.ts +1 -0
  103. package/dist/types/src/text-shimmer.d.ts +24 -0
  104. package/dist/types/src/theme-types.d.ts +162 -0
  105. package/dist/types/src/theme.d.ts +73 -0
  106. package/dist/types/src/themes.d.ts +22 -0
  107. package/dist/types/src/tree-guides.d.ts +17 -0
  108. package/dist/types/src/types.d.ts +314 -0
  109. package/dist/types/src/validate.d.ts +31 -0
  110. package/dist/types/src/web/base-css.d.ts +1 -0
  111. package/dist/types/src/web/box-css.d.ts +55 -0
  112. package/dist/types/src/web/coerce.d.ts +32 -0
  113. package/dist/types/src/web/data.d.ts +105 -0
  114. package/dist/types/src/web/dates.d.ts +12 -0
  115. package/dist/types/src/web/form.d.ts +44 -0
  116. package/dist/types/src/web/host-types.d.ts +119 -0
  117. package/dist/types/src/web/index.d.ts +28 -0
  118. package/dist/types/src/web/inputs.d.ts +55 -0
  119. package/dist/types/src/web/list.d.ts +13 -0
  120. package/dist/types/src/web/listbox.d.ts +14 -0
  121. package/dist/types/src/web/markdown.d.ts +96 -0
  122. package/dist/types/src/web/media.d.ts +62 -0
  123. package/dist/types/src/web/parts.d.ts +4 -0
  124. package/dist/types/src/web/primitives/alert-dialog.d.ts +10 -0
  125. package/dist/types/src/web/primitives/alert.d.ts +9 -0
  126. package/dist/types/src/web/primitives/avatar-color.d.ts +2 -0
  127. package/dist/types/src/web/primitives/avatar.d.ts +13 -0
  128. package/dist/types/src/web/primitives/badge.d.ts +10 -0
  129. package/dist/types/src/web/primitives/breadcrumb.d.ts +10 -0
  130. package/dist/types/src/web/primitives/button.d.ts +6 -0
  131. package/dist/types/src/web/primitives/calendar.d.ts +43 -0
  132. package/dist/types/src/web/primitives/card.d.ts +9 -0
  133. package/dist/types/src/web/primitives/checkbox.d.ts +5 -0
  134. package/dist/types/src/web/primitives/choice-tiles.d.ts +32 -0
  135. package/dist/types/src/web/primitives/cn.d.ts +3 -0
  136. package/dist/types/src/web/primitives/code-block.d.ts +24 -0
  137. package/dist/types/src/web/primitives/command.d.ts +134 -0
  138. package/dist/types/src/web/primitives/context-ring.d.ts +24 -0
  139. package/dist/types/src/web/primitives/dialog-arms.d.ts +6 -0
  140. package/dist/types/src/web/primitives/dialog.d.ts +24 -0
  141. package/dist/types/src/web/primitives/disclosure-header.d.ts +5 -0
  142. package/dist/types/src/web/primitives/dock.d.ts +42 -0
  143. package/dist/types/src/web/primitives/dropdown-menu.d.ts +14 -0
  144. package/dist/types/src/web/primitives/empty-state.d.ts +15 -0
  145. package/dist/types/src/web/primitives/glass-card.d.ts +4 -0
  146. package/dist/types/src/web/primitives/hover-card.d.ts +7 -0
  147. package/dist/types/src/web/primitives/icon-disc.d.ts +12 -0
  148. package/dist/types/src/web/primitives/index.d.ts +48 -0
  149. package/dist/types/src/web/primitives/input.d.ts +5 -0
  150. package/dist/types/src/web/primitives/kbd.d.ts +4 -0
  151. package/dist/types/src/web/primitives/label.d.ts +3 -0
  152. package/dist/types/src/web/primitives/menu-surface.d.ts +17 -0
  153. package/dist/types/src/web/primitives/meter.d.ts +21 -0
  154. package/dist/types/src/web/primitives/popover.d.ts +3 -0
  155. package/dist/types/src/web/primitives/progress-ring.d.ts +5 -0
  156. package/dist/types/src/web/primitives/progress.d.ts +8 -0
  157. package/dist/types/src/web/primitives/scroll-area.d.ts +49 -0
  158. package/dist/types/src/web/primitives/segmented-control.d.ts +5 -0
  159. package/dist/types/src/web/primitives/select.d.ts +47 -0
  160. package/dist/types/src/web/primitives/separator.d.ts +3 -0
  161. package/dist/types/src/web/primitives/sheet-chrome.d.ts +4 -0
  162. package/dist/types/src/web/primitives/sheet.d.ts +20 -0
  163. package/dist/types/src/web/primitives/skeleton.d.ts +3 -0
  164. package/dist/types/src/web/primitives/spinner.d.ts +3 -0
  165. package/dist/types/src/web/primitives/switch.d.ts +4 -0
  166. package/dist/types/src/web/primitives/table.d.ts +11 -0
  167. package/dist/types/src/web/primitives/tabs.d.ts +13 -0
  168. package/dist/types/src/web/primitives/textarea.d.ts +3 -0
  169. package/dist/types/src/web/primitives/toast.d.ts +163 -0
  170. package/dist/types/src/web/primitives/tooltip.d.ts +3 -0
  171. package/dist/types/src/web/primitives/truncate.d.ts +7 -0
  172. package/dist/types/src/web/primitives/typeahead-portal.d.ts +12 -0
  173. package/dist/types/src/web/share.d.ts +6 -0
  174. package/dist/types/src/web/table.d.ts +20 -0
  175. package/dist/types/src/web/theme-css.d.ts +69 -0
  176. package/dist/types/src/web/urls.d.ts +21 -0
  177. package/dist/web/index.js +2303 -0
  178. package/dist/web/index.js.map +26 -0
  179. package/dist/web/primitives/index.js +1450 -0
  180. package/dist/web/primitives/index.js.map +57 -0
  181. package/docs/components.generated.json +6238 -0
  182. package/docs/round-1-contract.md +679 -0
  183. package/docs/round-2-contract.md +476 -0
  184. package/docs/round-3-contract.md +174 -0
  185. package/docs/themes.generated.json +3503 -0
  186. package/fixtures/animations.json +2890 -0
  187. package/fixtures/bench-list.json +58 -0
  188. package/fixtures/bind-time.json +30664 -0
  189. package/fixtures/catalog-basic-map.json +1692 -0
  190. package/fixtures/catalog-components.json +9323 -0
  191. package/fixtures/catalog-extension.json +620 -0
  192. package/fixtures/catalog-macros.json +36370 -0
  193. package/fixtures/code-tokens.json +1993 -0
  194. package/fixtures/conformance-baseline.json +55544 -0
  195. package/fixtures/conformance-cases.json +49 -0
  196. package/fixtures/conformance-known.json +2123 -0
  197. package/fixtures/control-geometry.json +4200 -0
  198. package/fixtures/dashboard.data.json +74 -0
  199. package/fixtures/dashboard.json +752 -0
  200. package/fixtures/demo-surface.json +47 -0
  201. package/fixtures/format.json +870 -0
  202. package/fixtures/host-policy.json +1067 -0
  203. package/fixtures/host-router.json +1152 -0
  204. package/fixtures/host-transport.json +590 -0
  205. package/fixtures/interactions-round1.json +773 -0
  206. package/fixtures/kitchen-sink.expanded.json +10844 -0
  207. package/fixtures/kitchen-sink.json +3049 -0
  208. package/fixtures/layout-geometry-round1.json +7278 -0
  209. package/fixtures/layout-geometry.json +2072 -0
  210. package/fixtures/overlay-geometry.json +272 -0
  211. package/fixtures/primitive-specimens.json +58 -0
  212. package/fixtures/prompt-budget.json +33 -0
  213. package/fixtures/resizable.json +714 -0
  214. package/fixtures/round4-contract.json +2985 -0
  215. package/fixtures/specimens.json +9832 -0
  216. package/fixtures/style-conditions.json +336 -0
  217. package/fixtures/template-items.json +2215 -0
  218. package/fixtures/text-direction.json +309 -0
  219. package/fixtures/text-shimmer.json +96 -0
  220. package/fixtures/theme-extends.json +573 -0
  221. package/fixtures/theme-invalid.json +1296 -0
  222. package/fixtures/theme-recipes.json +58600 -0
  223. package/fixtures/theme-resolved.json +23949 -0
  224. package/fixtures/toast-stack.json +215 -0
  225. package/fixtures/tree-guides.json +224 -0
  226. package/fixtures/virtual-list.json +733 -0
  227. package/generated/ExponentialUICatalog.generated.kt +67 -0
  228. package/generated/ExponentialUICatalog.generated.swift +67 -0
  229. package/generated/ExponentialUIThemes.generated.kt +23 -0
  230. package/generated/ExponentialUIThemes.generated.swift +23 -0
  231. package/generated/catalog.descriptions.generated.rs +6 -0
  232. package/generated/catalog.generated.rs +80 -0
  233. package/generated/catalog.themes.generated.rs +34 -0
  234. package/generated/core.descriptions.json +2505 -0
  235. package/generated/core.runtime.json +3609 -0
  236. package/package.json +87 -4
  237. package/themes/exponential.recipes.json +49 -0
  238. package/themes/exponential.theme.json +755 -0
  239. package/themes/neutral.theme.json +5676 -0
  240. package/themes/orange.theme.json +43 -0
  241. package/themes/playful.theme.json +219 -0
  242. package/vendor/a2ui/LICENSE.txt +203 -0
  243. package/vendor/a2ui/README.md +27 -0
  244. package/vendor/a2ui/v0_9/basic_catalog.json +1387 -0
  245. package/vendor/a2ui/v0_9/basic_catalog_rules.txt +5 -0
  246. package/vendor/a2ui/v0_9/client_capabilities.json +97 -0
  247. package/vendor/a2ui/v0_9/client_to_server.json +104 -0
  248. package/vendor/a2ui/v0_9/common_types.json +315 -0
  249. package/vendor/a2ui/v0_9/server_to_client.json +132 -0
  250. package/vendor/json-render/LICENSE.txt +201 -0
  251. package/vendor/json-render/README.md +13 -0
@@ -0,0 +1,174 @@
1
+ # Exponential UI — round 3 contract (VAPP-102)
2
+
3
+ Round 3 folds the catalog onto the vocabulary the Exponential app settled on
4
+ in its UI cleanup (EXP-1248, EXP-1249, EXP-1251): ONE row, ONE section band,
5
+ ONE chip, ONE segmented control, ONE menu. The catalog had split each of
6
+ these several ways; the app has one of each. This file is the CONTRACT half:
7
+ what changed in `@exponential-at/ui` and what each renderer implements to
8
+ match. Everything here is locked by a fixture or a test.
9
+
10
+ Read §0, the sections you own, then §6 (your checklist).
11
+
12
+ ## 0. What moved
13
+
14
+ | area | change | source of truth | locked by |
15
+ |---|---|---|---|
16
+ | `Row` | NEW macro: leading/trailing slots, identifier, title/subtitle/meta/value(+placeholder), chevron, selected, density, surface flat\|card, pressable, depth | `core.catalog.json`, `macros.json` | `catalog-macros.json` |
17
+ | `Section` | NEW macro: a band header (title, caption, count OFF by default, glyph, leading/trailing slots, collapsible/open, tint) over hairline-divided rows (a `List` native, the windowed backend); `tree` = the rows nest by depth | same | `catalog-macros.json`, `kitchen-sink.expanded.json` |
18
+ | tree guides | computed by the CORE from consecutive rows' `depth` (elbow, tee, pass-through); `TreeGuides` = a hidden Row part, never authored; column 14 px (the line's left edge at i·14 + 7), rounded 3 px elbow, 1 px bridge | `src/tree-guides.ts`, `layout.json` | `fixtures/tree-guides.json`, the `Row/tree:*` macro cases |
19
+ | `Chip` | NEW macro: shape pill\|rect (the old Pill + EntityChip), selected, tone, dot, icon, image, detail, removable, pressable, a `leading` slot | `macros.json` | `catalog-macros.json` |
20
+ | `Segmented` | native (ToggleGroup renamed): variant segmented (default) \| toggles \| outline \| bar; TabBar + ButtonGroup fold in | `core.catalog.json`, `recipes.json` | `catalog-components.json`, `control-geometry.json` |
21
+ | `Menu` | native (DropdownMenu + ContextMenu): `openOn press\|contextmenu`, the ONE child = the trigger or the target region, `menuItem.items` bindable (a source-fed submenu) | `core.catalog.json` | `catalog-components.json`, the React + Rust bound-submenu tests |
22
+ | `Badge` | counts and short status labels only | `core.catalog.json` | — |
23
+ | sheets | `Drawer side: bottom` (what the app calls a sheet; the Sheet name is gone) | `core.catalog.json` | `catalog-components.json` |
24
+ | removed names | round 4 (VAPP-103) REMOVED the 16 folded names (§4): no aliases, an old name is an `unknown component` | `core.catalog.json` `$comment` | `catalog.test.ts` |
25
+ | lite | Pagination, Accordion, Radio, Slider, Spinner, Table, Toggle leave the lite subset (with Carousel, the overlays, media, Chart) | `core.catalog.json` | `prompt-budget.json` |
26
+ | a11y | roles gain `tree`, `treeitem` | `a11y.json` | `round1-fixes.test.ts` |
27
+ | extension | the app extension splits RunRow into RunStatusRow + SessionRow, adds PrRow/StackRail/DiffCounts/DiffFileRow/GuideSection; IssueRow, IssueGroupBand and IssueChip are macros over Row/Section/Chip | `packages/ui/exponential-ui/extension.json` | `packages/ui/src/exponential-ui-extension.test.ts` |
28
+
29
+ Counts (after round 4): 72 components in the catalog, 70 offered (44
30
+ natives, 26 macros; 50 lite), TreeGuides and Unknown hidden.
31
+
32
+ ## 1. Row and Section
33
+
34
+ ```json
35
+ { "id": "runs", "component": "Section", "props": { "title": "Running", "tree": true, "collapsible": true },
36
+ "children": ["r1", "r2", "r3"] }
37
+ { "id": "r1", "component": "Row", "props": { "identifier": "EXP-12", "title": "Release 0.18", "meta": "4 runs", "pressable": true } }
38
+ { "id": "r2", "component": "Row", "props": { "title": "Notarize", "depth": 1, "icon": "status-in-progress" } }
39
+ { "id": "r3", "component": "Row", "props": { "title": "Upload", "depth": 1, "value": "queued", "chevron": "right", "pressable": true } }
40
+ ```
41
+
42
+ **Row** parts, in order: `root` (a pressable Box: flex row, gap sm, min
43
+ height `$control.row` / `$control.rowCompact` by `density`, padding
44
+ horizontal md and NO vertical padding (the `body` carries xs (flat) / md
45
+ (card) so the `guides` part spans the row's full height and the lines of
46
+ consecutive rows meet across the divider), radius md (flat) / lg (card))
47
+ → `guides` (a `TreeGuides` native, only when `depth > 0`, FILLED BY THE
48
+ CORE) → the `leading` slot → `icon` (sm, when no slot is given) →
49
+ `identifier` (Text `code`) → `body` (`title` Text body, `subtitle` Text
50
+ muted) → `meta` (Text muted) → `value` (Text body, or muted while it shows
51
+ `placeholder`, aligned end) → the `trailing` slot → `chevron` (`right` =
52
+ `ui-chevron-right`, `selector` = `ui-selector`). Recipe props: `selected`,
53
+ `density`, `surface`, `depth`. A11y: role `button` + `selected` when
54
+ `pressable`, otherwise `none`. `on.press` implies `pressable`.
55
+
56
+ **Section** parts: `root` (column, gap xs) → `header` (only with a `title`;
57
+ flex row, height `$control.row`, padding horizontal md, radius md; a heading
58
+ (level 3), or a `button` with `expanded` when `collapsible`, whose press
59
+ routes to `change {open}` and writes a bound `open` back) → `chevron`
60
+ (collapsible only, `ui-chevron-right`, rotates when open) → the `leading`
61
+ slot → `icon` → `title` (Text label) → `caption` (Text muted) → `count`
62
+ (Text muted, only when given) → `spacer` → the `trailing` slot; then `body`
63
+ = a `List` native (`divided: true`, `gap: none`, role `list`, or `tree`
64
+ when `tree`) holding the author's children (a data template rides through),
65
+ shown while `open` (default true). Recipe props: `tint`, `tree`, `open`,
66
+ `collapsible`. The old `Band` = a Section without rows; the old `RowList` =
67
+ a Section without a title.
68
+
69
+ ## 2. The tree guides the core computes
70
+
71
+ `treeGuides(depths)` (`src/tree-guides.ts`; Rust `tree_guides.rs`) is the
72
+ app's ×4 rule verbatim: a row at depth `d ≥ 1` gets its elbow in gutter
73
+ level `d − 1`; the elbow TEES on when another row at depth `d` follows
74
+ before the walk leaves the subtree (a row at depth `≤ d − 1`); every
75
+ ancestor level `L < d − 1` whose subtree continues after the row passes
76
+ straight through. `fixtures/tree-guides.json` locks the vectors.
77
+
78
+ `applyTreeGuides(root)` runs ONCE at the end of `expandMacros`
79
+ (`expand_macros`), when every node is native: over every node's children in
80
+ order, a Row root (`recipe.macro` Row, part root) contributes its numeric
81
+ `recipe.props.depth` (floored; anything else, including a non-Row sibling,
82
+ counts as 0 and ends every subtree); the Row's `guides` part gets
83
+ `{depth, elbowAt?, tee, passThrough}` in that key order (`elbowAt` omitted
84
+ for a root). A lone root or slot value is a one-element list. Any OTHER
85
+ sibling with a numeric `depth` prop (an extension row such as SessionRow or
86
+ PrRow) takes part too and gets the result as its `guide` prop
87
+ (`{elbowAt?, tee, passThrough}`) for its painter to draw. A `depth` is
88
+ static (never bindable). The pass runs over the EXPANDED tree only: rows a
89
+ data template instantiates (a List over `{path}`) are not siblings at
90
+ expansion time, and a painter draws NO elbow without `elbowAt`; author
91
+ static rows for a connected tree. A macro that offers `pressable` (Row,
92
+ Chip) takes it from an `on.press` when unset.
93
+
94
+ **Geometry** (`layout.json`): `treeGuideColumn` = 14 (the `guides` part is
95
+ `depth × 14` wide, stretched to the row; column `i`'s line is at
96
+ `x = i·14 + 7`, the elbow's stub runs to `i·14 + 14` so it ends at the
97
+ child's own lead glyph), `treeGuideRadius` = 3 (the elbow's corner),
98
+ `treeGuideBridge` = 1 (every guide vertical starts that many px ABOVE the
99
+ part's top edge, paint only, so a Section's hairline divider never breaks the
100
+ line). Stroke width and colour = the `TreeGuides/line` recipe.
101
+
102
+ ## 3. Chip, Segmented, Menu
103
+
104
+ **Chip** `shape: pill` = radius full, height `$control.pill` (the old
105
+ Pill); `rect` = radius md, height `$control.chip` (the old EntityChip).
106
+ Parts: root → the `leading` slot → dot → image (16 px, round) → icon (when
107
+ no image) → label (caption) → detail (muted) → remove (a ghost icon Button,
108
+ `$on press → remove`). Recipe props `shape`, `selected`, `tone`.
109
+
110
+ **Segmented** keeps ToggleGroup's contract (`items`, `type`, bound `value`
111
+ comma-joined when multiple, `size`, `fill`) with `variant`: `segmented` (the
112
+ DEFAULT: the pill track), `toggles` (bare toggle buttons, ToggleGroup's old
113
+ default), `outline` (joined outline buttons, the old ButtonGroup), `bar` (the
114
+ old TabBar: full width, each item a column of icon over a caption label,
115
+ role `navigation` with `aria-current=page` on the selected item). Recipe
116
+ parts `root`, `item`, `icon`, `label`; `when` props `type`, `variant`, `size`,
117
+ `fill`. Content-sized (align-self start) unless `fill` or `bar`.
118
+
119
+ **Menu** keeps the `menuItem` contract (item | checkbox | separator | label |
120
+ submenu, one level) with `openOn`: `press` (the ONE child is the trigger; no
121
+ child = a default outline Button from `label`/`icon`, no chevron) or
122
+ `contextmenu` (the child is the target region: right-click, long-press,
123
+ Shift+F10 or the Menu key open it at the pointer). `menuItem.items` is
124
+ bindable: a `{path}` whose rows a host feeds (`bindDataModel` from an
125
+ `exp:` source) becomes the submenu. Parts `trigger`, `content`, `item`,
126
+ `separator`, `label`, `shortcut`, `check`, `submenuIndicator`; built-in
127
+ glyphs `Menu.check`, `Menu.submenuIndicator`. The DropdownMenu and
128
+ ContextMenu glyph rows are gone (round 4 removed those names).
129
+
130
+ ## 4. Removed names (round 4)
131
+
132
+ Round 3 shipped these as one-release aliases; round 4 (VAPP-103) REMOVED
133
+ them before any release: there is no `deprecated` key, no alias macro, no
134
+ example case and no generated `componentDeprecated` constant. An old name
135
+ reduces to the `Unknown` placeholder with an `unknown component <name>`
136
+ issue, and a theme naming one fails to load (`unknown component`).
137
+
138
+ | removed | write instead |
139
+ |---|---|
140
+ | ListRow, CardRow, PropertyRow, PickerRow, NavRow | `Row` (card = `surface: card`; property = a `value`; picker = `value` + `placeholder` + `chevron: selector`; nav = `icon` + `selected` + a `Badge` in the trailing slot) |
141
+ | Band, RowList | `Section` (no rows / no title; `tree` for nested rows) |
142
+ | Pill, EntityChip | `Chip` (`shape: pill` / `rect`) |
143
+ | ToggleGroup, TabBar, ButtonGroup | `Segmented` (`toggles`\|`outline`\|`segmented` / `bar` + fill / `outline`) |
144
+ | DropdownMenu, ContextMenu | `Menu` (`openOn: press` with the trigger as the child / `contextmenu`) |
145
+ | Sheet | `Drawer side: bottom` |
146
+ | HoverCard | `Popover openOn: hover` |
147
+
148
+ ## 5. Breaking changes
149
+
150
+ - Themes: recipes for the folded components fail to load (`unknown
151
+ component`); move them to `Row`, `Section`, `Chip`, `Segmented`, `Menu`.
152
+ - `layout.json` `treeGuideColumn` 16 → 14; `TreeGuides` is hidden.
153
+ - `builtinIcons`: `DropdownMenu.*` / `ContextMenu.*` → `Menu.*`.
154
+ - Enums `bandVariant`, `toggleVariant` are gone; `rowChevron`, `rowSurface`,
155
+ `chipShape`, `segmentedVariant`, `menuOpenOn` are new.
156
+ - The lite subset lost seven components; `prompt-budget.json` moved.
157
+
158
+ ## 6. Per-renderer checklist
159
+
160
+ Every renderer: replay the regenerated fixtures (`catalog-components.json`, `catalog-macros.json` with the `Row/tree:*` cases,
161
+ `tree-guides.json`, `kitchen-sink*.json`, `control-geometry.json`,
162
+ `theme-*.json`, `bind-time.json`); paint `Segmented` (+ `bar`) and `Menu`
163
+ (+ `contextmenu`) under the new names; draw `TreeGuides` at 14 / 3 / 1.
164
+
165
+ - **Rust core**: `tree_guides.rs` + the post-expansion pass; `Menu` and
166
+ `Segmented` in the layout tree, events and state.
167
+ - **gpui**: the menu and segmented painters renamed, the `bar` column item,
168
+ the rounded + bridged guides; the conformance ratchet re-recorded against
169
+ the new web baseline.
170
+ - **React**: `MenuNative`, `SegmentedNative`, the guides geometry, the
171
+ snapshot and the web baseline re-recorded.
172
+ - **SwiftUI / Compose**: the leaf switches renamed (`Menu`, `Segmented`),
173
+ the `bar` item, the guides geometry, the built-in glyph mirror, snapshots
174
+ re-recorded (Compose on ubuntu).