themelia-react-ui 2.0.3 → 2.0.5

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 (648) hide show
  1. package/CHANGELOG.md +185 -0
  2. package/README.md +168 -36
  3. package/dist/{accordion-Cjb6sx0G.js → accordion-B9MHG0cT.js} +11 -11
  4. package/dist/accordion-B9MHG0cT.js.map +1 -0
  5. package/dist/action-menu-Dr8K-ghE.js +284 -0
  6. package/dist/action-menu-Dr8K-ghE.js.map +1 -0
  7. package/dist/{affordance-geometry.generated-tF36bREk.js → affordance-geometry.generated-P-aVJisu.js} +42 -36
  8. package/dist/affordance-geometry.generated-P-aVJisu.js.map +1 -0
  9. package/dist/{ai-artifact-DvTwDVyL.js → ai-artifact-C58tQcBy.js} +387 -350
  10. package/dist/ai-artifact-C58tQcBy.js.map +1 -0
  11. package/dist/app-shell-B_IuNWOo.js +321 -0
  12. package/dist/app-shell-B_IuNWOo.js.map +1 -0
  13. package/dist/{attachment-BxDfL2mw.js → attachment-Dg_69lPS.js} +9 -9
  14. package/dist/{attachment-BxDfL2mw.js.map → attachment-Dg_69lPS.js.map} +1 -1
  15. package/dist/{auth-BGua8ouh.js → auth-DTkkshS8.js} +44 -47
  16. package/dist/auth-DTkkshS8.js.map +1 -0
  17. package/dist/{avatar-DAPlDvhJ.js → avatar-CeZaFmNH.js} +8 -8
  18. package/dist/avatar-CeZaFmNH.js.map +1 -0
  19. package/dist/{badge-HpFqoqSY.js → badge-xIiV_E7f.js} +5 -5
  20. package/dist/{badge-HpFqoqSY.js.map → badge-xIiV_E7f.js.map} +1 -1
  21. package/dist/base/accordion.js +1 -1
  22. package/dist/base/action-menu.js +1 -1
  23. package/dist/base/attachment.js +1 -1
  24. package/dist/base/avatar.js +1 -1
  25. package/dist/base/badge.js +1 -1
  26. package/dist/base/batch-action-bar.js +1 -1
  27. package/dist/base/buttons.js +1 -1
  28. package/dist/base/cards.js +2 -2
  29. package/dist/base/carousel.js +3 -3
  30. package/dist/base/cascader.js +2 -372
  31. package/dist/base/chart.js +1 -1
  32. package/dist/base/choice-inputs.js +2 -2
  33. package/dist/base/code-block.js +1 -1
  34. package/dist/base/combobox.js +2 -2
  35. package/dist/base/command.js +1 -1
  36. package/dist/base/copyable.js +1 -1
  37. package/dist/base/date-pickers.js +2 -2
  38. package/dist/base/display.js +6 -6
  39. package/dist/base/feedback.js +3 -3
  40. package/dist/base/forms-numeric.js +1 -1
  41. package/dist/base/forms.js +3 -3
  42. package/dist/base/inline-edit.js +10 -10
  43. package/dist/base/item.js +1 -1
  44. package/dist/base/media-gallery.js +1 -1
  45. package/dist/base/metadata-list.js +1 -1
  46. package/dist/base/navigation.js +7 -7
  47. package/dist/base/popover-menu.js +1 -1
  48. package/dist/base/popover.js +1 -1
  49. package/dist/base/qr-code.js +1 -1
  50. package/dist/base/repeaters.js +12 -12
  51. package/dist/base/repeaters.js.map +1 -1
  52. package/dist/base/sheet.js +1 -1
  53. package/dist/base/sidebar.js +2 -2
  54. package/dist/base/signature-pad.js +7 -7
  55. package/dist/base/signature-pad.js.map +1 -1
  56. package/dist/base/skeleton.js +1 -1
  57. package/dist/base/spinner.js +4 -4
  58. package/dist/base/structure.js +1 -1
  59. package/dist/base/table.js +1 -1
  60. package/dist/base/text-inputs.js +2 -2
  61. package/dist/base/toaster.js +36 -36
  62. package/dist/base/toaster.js.map +1 -1
  63. package/dist/base/tree.js +1 -1
  64. package/dist/base/upload-queue.js +1 -1
  65. package/dist/base/upload.js +3 -3
  66. package/dist/base/value-inputs.js +1 -1
  67. package/dist/{batch-action-bar-DnUJ21NQ.js → batch-action-bar-Cb8cuvyy.js} +6 -6
  68. package/dist/batch-action-bar-Cb8cuvyy.js.map +1 -0
  69. package/dist/blocks/admin.js +23 -23
  70. package/dist/blocks/admin.js.map +1 -1
  71. package/dist/blocks/ai.js +230 -216
  72. package/dist/blocks/ai.js.map +1 -1
  73. package/dist/blocks/analytics/usage-card.js +1 -1
  74. package/dist/blocks/analytics.js +326 -307
  75. package/dist/blocks/analytics.js.map +1 -1
  76. package/dist/blocks/collaboration.js +1 -1
  77. package/dist/blocks/commerce/receipt.js +1 -1
  78. package/dist/blocks/commerce.js +1247 -1169
  79. package/dist/blocks/commerce.js.map +1 -1
  80. package/dist/blocks/data-display.js +2 -2
  81. package/dist/blocks/onboarding.js +6 -6
  82. package/dist/blocks/onboarding.js.map +1 -1
  83. package/dist/blocks/planning.js +11 -11
  84. package/dist/blocks/timelines.js +1 -1
  85. package/dist/{breadcrumbs-C-oqs1sQ.js → breadcrumbs-J-K2kl4c.js} +6 -6
  86. package/dist/{breadcrumbs-C-oqs1sQ.js.map → breadcrumbs-J-K2kl4c.js.map} +1 -1
  87. package/dist/{button-DVzspB_G.js → button-S2Cubiiz.js} +3 -3
  88. package/dist/button-S2Cubiiz.js.map +1 -0
  89. package/dist/{buttons-DPZekJFu.js → buttons-BedGfygC.js} +16 -16
  90. package/dist/buttons-BedGfygC.js.map +1 -0
  91. package/dist/cards-rNX1M4Xn.js +69 -0
  92. package/dist/cards-rNX1M4Xn.js.map +1 -0
  93. package/dist/cascader-B1MiqkBq.js +439 -0
  94. package/dist/cascader-B1MiqkBq.js.map +1 -0
  95. package/dist/chart-Darg_0Kv.js +162 -0
  96. package/dist/chart-Darg_0Kv.js.map +1 -0
  97. package/dist/{checkbox-AWIhNhmo.js → checkbox-fflqmODR.js} +9 -5
  98. package/dist/checkbox-fflqmODR.js.map +1 -0
  99. package/dist/choice-inputs-zUgBZfE4.js +777 -0
  100. package/dist/choice-inputs-zUgBZfE4.js.map +1 -0
  101. package/dist/{code-block-DeneBJR_.js → code-block-BzmM9Eig.js} +9 -9
  102. package/dist/code-block-BzmM9Eig.js.map +1 -0
  103. package/dist/{collapsible-C-_l4hpy.js → collapsible-BkAI_XD4.js} +5 -5
  104. package/dist/{collapsible-C-_l4hpy.js.map → collapsible-BkAI_XD4.js.map} +1 -1
  105. package/dist/{collection-content-By56pLog.js → collection-content-gDh1v6O4.js} +3 -3
  106. package/dist/{collection-content-By56pLog.js.map → collection-content-gDh1v6O4.js.map} +1 -1
  107. package/dist/combobox-BEx0vJgF.js +362 -0
  108. package/dist/combobox-BEx0vJgF.js.map +1 -0
  109. package/dist/{combobox-Dxo2fAYQ.js → combobox-BwzoXFSG.js} +254 -247
  110. package/dist/combobox-BwzoXFSG.js.map +1 -0
  111. package/dist/{command-C25VMRII.js → command-CrlPIL6m.js} +12 -12
  112. package/dist/command-CrlPIL6m.js.map +1 -0
  113. package/dist/{comments-DD0DUPwJ.js → comments-Dmpp0YIc.js} +380 -379
  114. package/dist/comments-Dmpp0YIc.js.map +1 -0
  115. package/dist/components/base/action-menu/action-menu.d.ts +9 -1
  116. package/dist/components/base/buttons/button-group.recipes.d.ts +2 -2
  117. package/dist/components/base/cards/card.recipes.d.ts +16 -7
  118. package/dist/components/base/cards/partials/card-primitives.d.ts +9 -2
  119. package/dist/components/base/cards/partials/smart-card-header-row.d.ts +3 -1
  120. package/dist/components/base/cards/smart-card.types.d.ts +11 -7
  121. package/dist/components/base/cascader/cascader-panel.d.ts +76 -0
  122. package/dist/components/base/chart/chart.d.ts +6 -1
  123. package/dist/components/base/choice-inputs/checkbox.d.ts +7 -2
  124. package/dist/components/base/choice-inputs/choice-types.d.ts +1 -1
  125. package/dist/components/base/choice-inputs/switch-card.d.ts +7 -0
  126. package/dist/components/base/choice-inputs/toggle-field.d.ts +7 -0
  127. package/dist/components/base/combobox/index.d.ts +4 -2
  128. package/dist/components/base/date-pickers/datepicker.types.d.ts +7 -0
  129. package/dist/components/base/feedback/alert.d.ts +1 -1
  130. package/dist/components/base/forms/controlled-form-field.d.ts +6 -6
  131. package/dist/components/base/forms/form-field.d.ts +5 -3
  132. package/dist/components/base/forms/form-sizing.d.ts +7 -7
  133. package/dist/components/base/forms/index.d.ts +1 -0
  134. package/dist/components/base/forms/server-errors.d.ts +16 -0
  135. package/dist/components/base/forms/workflow.d.ts +11 -2
  136. package/dist/components/base/forms-numeric/coordinates-input.d.ts +4 -0
  137. package/dist/components/base/metadata-list/metadata-list.d.ts +3 -1
  138. package/dist/components/base/navigation/dropdown-menu.d.ts +1 -1
  139. package/dist/components/base/navigation/page-header/page-header-commands.d.ts +14 -7
  140. package/dist/components/base/navigation/page-header/page-header.d.ts +13 -4
  141. package/dist/components/base/popover/popover.d.ts +3 -3
  142. package/dist/components/base/popover/popover.recipes.d.ts +10 -6
  143. package/dist/components/base/sheet/sheet.d.ts +2 -0
  144. package/dist/components/base/sidebar/index.d.ts +1 -1
  145. package/dist/components/base/sidebar/sidebar.d.ts +27 -5
  146. package/dist/components/base/structure/composition.recipes.d.ts +17 -0
  147. package/dist/components/base/text-inputs/hooks/use-form-field-state.d.ts +7 -2
  148. package/dist/components/base/text-inputs/input.d.ts +4 -2
  149. package/dist/components/base/text-inputs/textarea.d.ts +4 -2
  150. package/dist/components/base/toaster/index.d.ts +1 -0
  151. package/dist/components/base/value-inputs/date-time-input.d.ts +2 -1
  152. package/dist/components/base/value-inputs/slider.d.ts +5 -1
  153. package/dist/components/base/value-inputs/tags-input.d.ts +5 -1
  154. package/dist/components/blocks/ai/ai-file-tree/types.d.ts +1 -1
  155. package/dist/components/blocks/ai/ai-tool-call/types.d.ts +3 -1
  156. package/dist/components/blocks/ai/ai.strings.d.ts +2 -0
  157. package/dist/components/blocks/analytics/metric-comparison/metric-comparison.d.ts +2 -0
  158. package/dist/components/blocks/analytics/usage-card/usage-card.strings.d.ts +2 -0
  159. package/dist/components/blocks/commerce/cart-summary/cart-summary.d.ts +1 -1
  160. package/dist/components/blocks/commerce/cart-summary/types.d.ts +3 -1
  161. package/dist/components/blocks/commerce/discount-stack/discount-stack.d.ts +1 -1
  162. package/dist/components/blocks/commerce/discount-stack/types.d.ts +3 -1
  163. package/dist/components/blocks/commerce/fulfillment-group/fulfillment-group.d.ts +1 -1
  164. package/dist/components/blocks/commerce/fulfillment-group/types.d.ts +11 -2
  165. package/dist/components/blocks/commerce/index.d.ts +7 -6
  166. package/dist/components/blocks/commerce/inventory-section/inventory-section.d.ts +1 -1
  167. package/dist/components/blocks/commerce/inventory-section/types.d.ts +7 -2
  168. package/dist/components/blocks/commerce/invoice-header/index.d.ts +2 -1
  169. package/dist/components/blocks/commerce/invoice-header/invoice-header.d.ts +1 -1
  170. package/dist/components/blocks/commerce/invoice-header/types.d.ts +20 -6
  171. package/dist/components/blocks/commerce/invoice-line-items/invoice-line-items.d.ts +1 -1
  172. package/dist/components/blocks/commerce/invoice-line-items/types.d.ts +24 -7
  173. package/dist/components/blocks/commerce/invoice-mini/index.d.ts +2 -1
  174. package/dist/components/blocks/commerce/invoice-mini/types.d.ts +7 -1
  175. package/dist/components/blocks/commerce/order-customer/order-customer.d.ts +1 -1
  176. package/dist/components/blocks/commerce/order-customer/types.d.ts +9 -1
  177. package/dist/components/blocks/commerce/refund-status/refund-status.d.ts +1 -1
  178. package/dist/components/blocks/commerce/refund-status/types.d.ts +3 -1
  179. package/dist/components/blocks/commerce/shipment-tracking/shipment-tracking.d.ts +1 -1
  180. package/dist/components/blocks/commerce/shipment-tracking/types.d.ts +3 -1
  181. package/dist/components/blocks/commerce/tax-breakdown/tax-breakdown.d.ts +1 -1
  182. package/dist/components/blocks/commerce/tax-breakdown/types.d.ts +3 -1
  183. package/dist/components/features/activities/activities.types.d.ts +8 -2
  184. package/dist/components/features/activities/partials/activity-marker.d.ts +7 -3
  185. package/dist/components/features/activities/partials/activity-row.d.ts +24 -0
  186. package/dist/components/features/event-calendar/colors.d.ts +2 -2
  187. package/dist/components/features/event-calendar/event-calendar.types.d.ts +4 -0
  188. package/dist/components/features/filters/facets/select-facet.d.ts +2 -1
  189. package/dist/components/features/filters/filters.strings.d.ts +4 -0
  190. package/dist/components/features/filters/filters.types.d.ts +3 -0
  191. package/dist/components/features/filters/partials/filter-editor-header.d.ts +16 -0
  192. package/dist/components/features/filters/partials/filter-popover-content.d.ts +1 -1
  193. package/dist/components/features/filters/partials/nested-filter-options.d.ts +21 -0
  194. package/dist/components/features/filters/partials/regular-filter-content.d.ts +2 -1
  195. package/dist/components/features/filters/utils/filter-utils.d.ts +21 -3
  196. package/dist/components/features/global-search/global-search.types.d.ts +2 -0
  197. package/dist/components/features/global-search/partials/global-search-input.d.ts +10 -0
  198. package/dist/components/features/global-search/partials/global-search-result-row.d.ts +7 -1
  199. package/dist/components/features/media-library/media-library.strings.d.ts +2 -0
  200. package/dist/components/features/media-library/media-library.types.d.ts +14 -4
  201. package/dist/components/features/media-library/partials/media-library-partials.d.ts +1 -1
  202. package/dist/components/features/products/components/product-options-matrix.d.ts +1 -1
  203. package/dist/components/features/products/components/product-variant-editor.d.ts +1 -1
  204. package/dist/components/features/products/components/product-variants-manager.d.ts +1 -1
  205. package/dist/components/features/products/products.strings.d.ts +9 -1
  206. package/dist/components/features/products/products.types.d.ts +43 -6
  207. package/dist/components/features/resource/resource.d.ts +5 -1
  208. package/dist/components/features/resource/resource.types.d.ts +12 -1
  209. package/dist/components/features/rich-text-editor/partials/image-uploads.d.ts +1 -1
  210. package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +12 -2
  211. package/dist/components/features/table/partials/resource-cell.d.ts +22 -5
  212. package/dist/components/features/table/table.types.d.ts +1 -1
  213. package/dist/components/layout/app-shell/app-shell.types.d.ts +35 -6
  214. package/dist/components/layout/app-shell/index.d.ts +1 -1
  215. package/dist/components/layout/app-shell/shell-regions.d.ts +27 -0
  216. package/dist/components/layout/app-shell/sidebar-inset-layout.d.ts +1 -1
  217. package/dist/components/layout/app-shell/stacked-layout.d.ts +1 -1
  218. package/dist/components/layout/app-shell/topbar-sidebar-layout.d.ts +1 -1
  219. package/dist/components/layout/containers/two-column-layout.d.ts +2 -0
  220. package/dist/components/layout/header/header.recipes.d.ts +6 -0
  221. package/dist/components/layout/header/header.types.d.ts +6 -6
  222. package/dist/components/layout/navigation/section-nav/section-nav.d.ts +5 -0
  223. package/dist/components/layout/page/index.d.ts +2 -1
  224. package/dist/components/layout/page/page.d.ts +1 -0
  225. package/dist/components/layout/page/page.strings.d.ts +11 -0
  226. package/dist/components/layout/page/page.types.d.ts +69 -17
  227. package/dist/components/layout/page/partials/page-header.d.ts +1 -1
  228. package/dist/components/layout/settings/settings.d.ts +9 -2
  229. package/dist/components/layout/sidebar/app-sidebar.d.ts +1 -1
  230. package/dist/components/layout/sidebar/components/sidebar-grouped-navigation.d.ts +1 -1
  231. package/dist/components/layout/sidebar/components/sidebar-navigation.d.ts +1 -1
  232. package/dist/components/layout/sidebar/index.d.ts +2 -1
  233. package/dist/components/layout/sidebar/sidebar-navigation-rail.d.ts +36 -0
  234. package/dist/components/layout/sidebar/sidebar.context.d.ts +5 -7
  235. package/dist/components/layout/sidebar/sidebar.types.d.ts +48 -10
  236. package/dist/components/layout/sidebar/sidebar.utils.d.ts +9 -1
  237. package/dist/components/layout/workspace/workspace.types.d.ts +8 -1
  238. package/dist/components/typography/text.styles.d.ts +26 -1
  239. package/dist/components/ui/alert-dialog.d.ts +2 -2
  240. package/dist/components/ui/combobox.d.ts +1 -1
  241. package/dist/components/ui/dialog.d.ts +2 -2
  242. package/dist/components/ui/overlay-layer.d.ts +18 -0
  243. package/dist/components/ui/sheet.d.ts +5 -1
  244. package/dist/components/ui/sidebar-state.d.ts +82 -0
  245. package/dist/components/ui/sidebar.d.ts +5 -17
  246. package/dist/composition.recipes-COdiFhxB.js +19 -0
  247. package/dist/composition.recipes-COdiFhxB.js.map +1 -0
  248. package/dist/containers-CIxwbZt5.js +112 -0
  249. package/dist/containers-CIxwbZt5.js.map +1 -0
  250. package/dist/{control-group-recipes-DBXmfh2E.js → control-group-recipes-fMuFo0H7.js} +6 -6
  251. package/dist/control-group-recipes-fMuFo0H7.js.map +1 -0
  252. package/dist/{copyable-ClBuk_UK.js → copyable-DIznBqiT.js} +7 -7
  253. package/dist/{copyable-ClBuk_UK.js.map → copyable-DIznBqiT.js.map} +1 -1
  254. package/dist/{data-display-DT_khPl_.js → data-display-BdgCAw8T.js} +277 -285
  255. package/dist/data-display-BdgCAw8T.js.map +1 -0
  256. package/dist/{date-DCrsDTZc.js → date-Cq8ioE4o.js} +5 -5
  257. package/dist/{date-DCrsDTZc.js.map → date-Cq8ioE4o.js.map} +1 -1
  258. package/dist/{date-picker-B2K3ucWn.js → date-picker-RlIzKom_.js} +501 -480
  259. package/dist/date-picker-RlIzKom_.js.map +1 -0
  260. package/dist/date-pickers-DY-CpXS1.js +179 -0
  261. package/dist/date-pickers-DY-CpXS1.js.map +1 -0
  262. package/dist/{display-hAc1HjpI.js → display-KsZLw9Ov.js} +9 -9
  263. package/dist/{display-hAc1HjpI.js.map → display-KsZLw9Ov.js.map} +1 -1
  264. package/dist/dropdown-menu-CLs8Lihj.js +194 -0
  265. package/dist/dropdown-menu-CLs8Lihj.js.map +1 -0
  266. package/dist/features/activities.js +302 -253
  267. package/dist/features/activities.js.map +1 -1
  268. package/dist/features/ai-chat.js +15 -14
  269. package/dist/features/ai-chat.js.map +1 -1
  270. package/dist/features/appointment-calendar.js +222 -220
  271. package/dist/features/appointment-calendar.js.map +1 -1
  272. package/dist/features/async-preview.js +11 -10
  273. package/dist/features/async-preview.js.map +1 -1
  274. package/dist/features/combobox.js +1 -1
  275. package/dist/features/comments.js +1 -1
  276. package/dist/features/data-view.js +13 -13
  277. package/dist/features/data-view.js.map +1 -1
  278. package/dist/features/email-composer.js +249 -249
  279. package/dist/features/email-composer.js.map +1 -1
  280. package/dist/features/event-calendar.js +264 -269
  281. package/dist/features/event-calendar.js.map +1 -1
  282. package/dist/features/filters.js +1 -1
  283. package/dist/features/global-search.js +167 -138
  284. package/dist/features/global-search.js.map +1 -1
  285. package/dist/features/kanban.js +6 -7
  286. package/dist/features/kanban.js.map +1 -1
  287. package/dist/features/map.js +269 -260
  288. package/dist/features/map.js.map +1 -1
  289. package/dist/features/media-library.js +827 -777
  290. package/dist/features/media-library.js.map +1 -1
  291. package/dist/features/mentions.js +1 -1
  292. package/dist/features/overlays.js +1 -1
  293. package/dist/features/products.js +1246 -1169
  294. package/dist/features/products.js.map +1 -1
  295. package/dist/features/questionnaire.js +13 -13
  296. package/dist/features/questionnaire.js.map +1 -1
  297. package/dist/features/resource-assignment.js +8 -8
  298. package/dist/features/resource.js +127 -123
  299. package/dist/features/resource.js.map +1 -1
  300. package/dist/features/rich-text-editor.js +2 -2
  301. package/dist/features/schema-form.js +254 -253
  302. package/dist/features/schema-form.js.map +1 -1
  303. package/dist/features/suggestions.js +3 -3
  304. package/dist/features/sync.js +3 -3
  305. package/dist/features/table.js +1 -1
  306. package/dist/features/theme-tweaker.js +95 -96
  307. package/dist/features/theme-tweaker.js.map +1 -1
  308. package/dist/{feedback-BYIhtitP.js → feedback-Dm4izqFn.js} +81 -80
  309. package/dist/feedback-Dm4izqFn.js.map +1 -0
  310. package/dist/{field-affordance-recipes-DZhnIL_Y.js → field-affordance-recipes-DWcNcOjh.js} +4 -4
  311. package/dist/field-affordance-recipes-DWcNcOjh.js.map +1 -0
  312. package/dist/{filters-DJVAveHA.js → filters-DzgSJpMK.js} +693 -645
  313. package/dist/filters-DzgSJpMK.js.map +1 -0
  314. package/dist/{form-field-CwH9y77i.js → form-field-BriWAXyg.js} +14 -8
  315. package/dist/form-field-BriWAXyg.js.map +1 -0
  316. package/dist/{form-sizing-BdP_Mf5p.js → form-sizing-Bs2qFUeE.js} +4 -4
  317. package/dist/form-sizing-Bs2qFUeE.js.map +1 -0
  318. package/dist/forms-C0RGnJTe.js +216 -0
  319. package/dist/forms-C0RGnJTe.js.map +1 -0
  320. package/dist/{forms-numeric-B_jraJaQ.js → forms-numeric-DIhghX1Q.js} +295 -291
  321. package/dist/forms-numeric-DIhghX1Q.js.map +1 -0
  322. package/dist/{header-BSfIEWbI.js → header-DMMxG__r.js} +67 -63
  323. package/dist/header-DMMxG__r.js.map +1 -0
  324. package/dist/header.recipes-BigdJjw1.js +6 -0
  325. package/dist/header.recipes-BigdJjw1.js.map +1 -0
  326. package/dist/hooks/useFormErrors.d.ts +1 -1
  327. package/dist/{hooks-ClH9thn4.js → hooks-DB6CJ4MR.js} +26 -14
  328. package/dist/hooks-DB6CJ4MR.js.map +1 -0
  329. package/dist/{icon-badge-DYKIwvOV.js → icon-badge-DZF-YjQp.js} +4 -4
  330. package/dist/{icon-badge-DYKIwvOV.js.map → icon-badge-DZF-YjQp.js.map} +1 -1
  331. package/dist/index.js +4 -5
  332. package/dist/input-CvyDQlY7.js +289 -0
  333. package/dist/input-CvyDQlY7.js.map +1 -0
  334. package/dist/input-DMBwAZmr.js +21 -0
  335. package/dist/input-DMBwAZmr.js.map +1 -0
  336. package/dist/item-DjCcM18E.js +277 -0
  337. package/dist/item-DjCcM18E.js.map +1 -0
  338. package/dist/layout/app-shell.js +1 -1
  339. package/dist/layout/auth.js +1 -1
  340. package/dist/layout/containers.js +1 -1
  341. package/dist/layout/header.js +1 -1
  342. package/dist/layout/hooks.js +1 -1
  343. package/dist/layout/navigation.js +1 -1
  344. package/dist/layout/page.js +2 -2
  345. package/dist/layout/settings.js +1 -1
  346. package/dist/layout/sidebar.js +3 -3
  347. package/dist/layout/workspace.js +1 -1
  348. package/dist/layout.js +11 -11
  349. package/dist/lib/affordance-geometry.generated.d.ts +41 -35
  350. package/dist/lib/control-group-recipes.d.ts +5 -5
  351. package/dist/lib/field-affordance-recipes.d.ts +2 -2
  352. package/dist/lib/motion-recipes.d.ts +3 -0
  353. package/dist/lib/navigation-row-recipes.d.ts +7 -7
  354. package/dist/lib/overlay-anatomy-recipes.d.ts +3 -3
  355. package/dist/lib/portal-recipes.d.ts +3 -0
  356. package/dist/lib/token-merge.generated.d.ts +13 -10
  357. package/dist/lib/ui-provider/types.d.ts +1 -1
  358. package/dist/lib/utils.js +1 -1
  359. package/dist/map-demo-tile.svg +1 -1
  360. package/dist/{media-gallery-3zIVLMWH.js → media-gallery-C-vChPmE.js} +6 -6
  361. package/dist/{media-gallery-3zIVLMWH.js.map → media-gallery-C-vChPmE.js.map} +1 -1
  362. package/dist/{mentions-CGlEJ15c.js → mentions-0_4nWuI-.js} +10 -10
  363. package/dist/{mentions-CGlEJ15c.js.map → mentions-0_4nWuI-.js.map} +1 -1
  364. package/dist/{message-DZ_ruyUV.js → message-g8p7eVtN.js} +7 -7
  365. package/dist/message-g8p7eVtN.js.map +1 -0
  366. package/dist/metadata-list-C3MkU-Om.js +443 -0
  367. package/dist/metadata-list-C3MkU-Om.js.map +1 -0
  368. package/dist/{motion-recipes-ChBg4HBq.js → motion-recipes-DitYv6P2.js} +10 -2
  369. package/dist/motion-recipes-DitYv6P2.js.map +1 -0
  370. package/dist/navigation-C90-oQFq.js +255 -0
  371. package/dist/navigation-C90-oQFq.js.map +1 -0
  372. package/dist/{navigation-BzhHI3lo.js → navigation-DaRjthVk.js} +101 -82
  373. package/dist/navigation-DaRjthVk.js.map +1 -0
  374. package/dist/{navigation-row-recipes-BFLCk_Aq.js → navigation-row-recipes-BGVLvU_O.js} +9 -9
  375. package/dist/navigation-row-recipes-BGVLvU_O.js.map +1 -0
  376. package/dist/{number-DbV1Dija.js → number-CRU3kGuk.js} +5 -5
  377. package/dist/{number-DbV1Dija.js.map → number-CRU3kGuk.js.map} +1 -1
  378. package/dist/overflow-tab-bar-IVFVQFV6.js +172 -0
  379. package/dist/overflow-tab-bar-IVFVQFV6.js.map +1 -0
  380. package/dist/overlays-BSgCtM2v.js +1013 -0
  381. package/dist/overlays-BSgCtM2v.js.map +1 -0
  382. package/dist/page-DUUKDAjo.js +331 -0
  383. package/dist/page-DUUKDAjo.js.map +1 -0
  384. package/dist/page-header-commands-7P3sfE9u.js +193 -0
  385. package/dist/page-header-commands-7P3sfE9u.js.map +1 -0
  386. package/dist/{pagination-BL25hu2s.js → pagination-CgCjElfu.js} +7 -7
  387. package/dist/{pagination-BL25hu2s.js.map → pagination-CgCjElfu.js.map} +1 -1
  388. package/dist/popover-B85RenIl.js +201 -0
  389. package/dist/popover-B85RenIl.js.map +1 -0
  390. package/dist/{popover-menu-Cn9rUkdc.js → popover-menu-DlnQ2zlR.js} +7 -7
  391. package/dist/{popover-menu-Cn9rUkdc.js.map → popover-menu-DlnQ2zlR.js.map} +1 -1
  392. package/dist/{popover.recipes-D3j8R8Yp.js → popover.recipes-DdiEp0rd.js} +18 -11
  393. package/dist/popover.recipes-DdiEp0rd.js.map +1 -0
  394. package/dist/portal-recipes-BpsV_iRw.js +9 -0
  395. package/dist/portal-recipes-BpsV_iRw.js.map +1 -0
  396. package/dist/{primitives-BFK08r9M.js → primitives-ByWgGUgt.js} +6 -6
  397. package/dist/{primitives-BFK08r9M.js.map → primitives-ByWgGUgt.js.map} +1 -1
  398. package/dist/primitives.js +4 -4
  399. package/dist/{progress-B1VnCT0K.js → progress-BJhQP9WX.js} +9 -9
  400. package/dist/{progress-B1VnCT0K.js.map → progress-BJhQP9WX.js.map} +1 -1
  401. package/dist/{receipt-BVSOH3Xo.js → receipt-tOc7B3hw.js} +7 -7
  402. package/dist/receipt-tOc7B3hw.js.map +1 -0
  403. package/dist/{rich-text-GOUyKQ-s.js → rich-text-Dth5E882.js} +4 -4
  404. package/dist/{rich-text-GOUyKQ-s.js.map → rich-text-Dth5E882.js.map} +1 -1
  405. package/dist/{rich-text-editor-cRLC-eBK.js → rich-text-editor-C1fOjBTd.js} +429 -430
  406. package/dist/rich-text-editor-C1fOjBTd.js.map +1 -0
  407. package/dist/{rich-text-editor-toolbar-DfXg0-VC.js → rich-text-editor-toolbar-laT3tpBT.js} +33 -29
  408. package/dist/rich-text-editor-toolbar-laT3tpBT.js.map +1 -0
  409. package/dist/{scroll-area-DcI-M1UT.js → scroll-area-B0dB2cBi.js} +2 -2
  410. package/dist/{scroll-area-DcI-M1UT.js.map → scroll-area-B0dB2cBi.js.map} +1 -1
  411. package/dist/{separator-Bom7NsGO.js → separator-Bb17I4pu.js} +2 -2
  412. package/dist/{separator-Bom7NsGO.js.map → separator-Bb17I4pu.js.map} +1 -1
  413. package/dist/{separator-BDV-Y648.js → separator-Ct_WSWTJ.js} +3 -3
  414. package/dist/{separator-BDV-Y648.js.map → separator-Ct_WSWTJ.js.map} +1 -1
  415. package/dist/services/actions.js +1 -1
  416. package/dist/settings-Bar5wiSo.js +167 -0
  417. package/dist/settings-Bar5wiSo.js.map +1 -0
  418. package/dist/sheet-BGPERY55.js +250 -0
  419. package/dist/sheet-BGPERY55.js.map +1 -0
  420. package/dist/sidebar-D-JYMMbY.js +686 -0
  421. package/dist/sidebar-D-JYMMbY.js.map +1 -0
  422. package/dist/sidebar-f9gRWXIR.js +1001 -0
  423. package/dist/sidebar-f9gRWXIR.js.map +1 -0
  424. package/dist/skeleton-BapcJd9C.js +265 -0
  425. package/dist/skeleton-BapcJd9C.js.map +1 -0
  426. package/dist/smart-card-CW0hjetE.js +617 -0
  427. package/dist/smart-card-CW0hjetE.js.map +1 -0
  428. package/dist/{structure-BmisBK-3.js → structure-DuxKl954.js} +3 -3
  429. package/dist/{structure-BmisBK-3.js.map → structure-DuxKl954.js.map} +1 -1
  430. package/dist/{structure.recipes-EPz60cU8.js → structure.recipes-BB4-n58V.js} +2 -2
  431. package/dist/{structure.recipes-EPz60cU8.js.map → structure.recipes-BB4-n58V.js.map} +1 -1
  432. package/dist/style.css +1 -1
  433. package/dist/{table-DsfzoUia.js → table-B4TE7iOV.js} +3 -3
  434. package/dist/{table-DsfzoUia.js.map → table-B4TE7iOV.js.map} +1 -1
  435. package/dist/{table-BweFy_P9.js → table-CFOWY9pQ.js} +394 -388
  436. package/dist/table-CFOWY9pQ.js.map +1 -0
  437. package/dist/{tabs-CDocW5D1.js → tabs-e7ko9S2o.js} +11 -11
  438. package/dist/tabs-e7ko9S2o.js.map +1 -0
  439. package/dist/{text-inputs-f9Ia-aCi.js → text-inputs-B1culiSK.js} +107 -104
  440. package/dist/text-inputs-B1culiSK.js.map +1 -0
  441. package/dist/{text.styles-g4He6UIW.js → text.styles-B64My8RZ.js} +25 -10
  442. package/dist/text.styles-B64My8RZ.js.map +1 -0
  443. package/dist/theme.css +192 -149
  444. package/dist/{timelines-CwM_9IhD.js → timelines-D3Sl9ueq.js} +13 -12
  445. package/dist/timelines-D3Sl9ueq.js.map +1 -0
  446. package/dist/tooltip-8wz5S_Zr.js +113 -0
  447. package/dist/tooltip-8wz5S_Zr.js.map +1 -0
  448. package/dist/{tree-WnKQzwbq.js → tree-CzUJHnFs.js} +9 -9
  449. package/dist/{tree-WnKQzwbq.js.map → tree-CzUJHnFs.js.map} +1 -1
  450. package/dist/typography/rich-text.js +1 -1
  451. package/dist/typography-BQnine1k.js +117 -0
  452. package/dist/typography-BQnine1k.js.map +1 -0
  453. package/dist/typography.js +1 -1
  454. package/dist/ui-provider-C-74NVLc.js +178 -0
  455. package/dist/ui-provider-C-74NVLc.js.map +1 -0
  456. package/dist/ui-provider.js +2 -3
  457. package/dist/{upload-CXyxmQBP.js → upload-BOW6U2tI.js} +25 -24
  458. package/dist/upload-BOW6U2tI.js.map +1 -0
  459. package/dist/{upload-queue-Boscubn9.js → upload-queue-qUXn1ykN.js} +16 -14
  460. package/dist/upload-queue-qUXn1ykN.js.map +1 -0
  461. package/dist/{usage-card-BhO5eqkX.js → usage-card-BeSLY0i0.js} +145 -137
  462. package/dist/usage-card-BeSLY0i0.js.map +1 -0
  463. package/dist/{utils-BRhFDwuU.js → utils-B6kKb8jB.js} +303 -144
  464. package/dist/utils-B6kKb8jB.js.map +1 -0
  465. package/dist/value-inputs-skdVB2zh.js +980 -0
  466. package/dist/value-inputs-skdVB2zh.js.map +1 -0
  467. package/dist/{value-typography-BP8OG6h5.js → value-typography-uAmWUAL1.js} +2 -2
  468. package/dist/{value-typography-BP8OG6h5.js.map → value-typography-uAmWUAL1.js.map} +1 -1
  469. package/dist/workspace-DHeHv0qw.js +411 -0
  470. package/dist/workspace-DHeHv0qw.js.map +1 -0
  471. package/docs/consumer-skill/SKILL.md +15 -129
  472. package/docs/consumer-skill/agents/themelia-ui-designer.md +96 -0
  473. package/docs/consumer-skill/examples/app-layout.tsx +74 -13
  474. package/docs/consumer-skill/examples/authentication.tsx +77 -0
  475. package/docs/consumer-skill/examples/commerce-lines.tsx +271 -0
  476. package/docs/consumer-skill/examples/custom-composition.tsx +21 -0
  477. package/docs/consumer-skill/examples/detail.tsx +5 -4
  478. package/docs/consumer-skill/examples/edit.tsx +30 -38
  479. package/docs/consumer-skill/examples/editable-sections.tsx +38 -0
  480. package/docs/consumer-skill/examples/index-table.tsx +4 -4
  481. package/docs/consumer-skill/examples/manifest.json +88 -1
  482. package/docs/consumer-skill/examples/product-media.tsx +41 -0
  483. package/docs/consumer-skill/examples/product-parts.tsx +81 -0
  484. package/docs/consumer-skill/examples/rhf-bindings.tsx +86 -0
  485. package/docs/consumer-skill/examples/rhf-edit-page.tsx +141 -0
  486. package/docs/consumer-skill/examples/rhf-overlay-form.tsx +105 -0
  487. package/docs/consumer-skill/examples/rhf-transport.tsx +28 -0
  488. package/docs/consumer-skill/examples/token-domain-structure.tsx +68 -0
  489. package/docs/consumer-skill/references/agents-md.md +23 -11
  490. package/docs/consumer-skill/references/analytics.md +18 -1
  491. package/docs/consumer-skill/references/authentication.md +42 -0
  492. package/docs/consumer-skill/references/commerce-composition.md +97 -0
  493. package/docs/consumer-skill/references/component-contracts.json +325201 -0
  494. package/docs/consumer-skill/references/composition-mapping.md +106 -0
  495. package/docs/consumer-skill/references/composition.md +198 -46
  496. package/docs/consumer-skill/references/critique-rubric.md +98 -0
  497. package/docs/consumer-skill/references/custom-composition.md +261 -0
  498. package/docs/consumer-skill/references/data-reading.md +79 -0
  499. package/docs/consumer-skill/references/design-contract.md +43 -9
  500. package/docs/consumer-skill/references/discovery.md +109 -8
  501. package/docs/consumer-skill/references/domain-structures.md +124 -0
  502. package/docs/consumer-skill/references/installation.md +51 -36
  503. package/docs/consumer-skill/references/integration.md +41 -2
  504. package/docs/consumer-skill/references/product-composition.md +94 -0
  505. package/docs/consumer-skill/references/public-api.json +4390 -475
  506. package/docs/consumer-skill/references/review.md +47 -5
  507. package/docs/consumer-skill/references/rhf-workflows.md +93 -0
  508. package/docs/consumer-skill/references/screen-archetypes.md +34 -0
  509. package/docs/consumer-skill/references/screen-decisions.md +126 -0
  510. package/docs/consumer-skill/references/theming.md +25 -27
  511. package/docs/consumer-skill/references/tokens.json +20 -11
  512. package/docs/consumer-skill/references/view-craft.md +153 -0
  513. package/docs/consumer-skill/references/view-spec.md +73 -0
  514. package/docs/consumer-skill/references/workflows.md +9 -2
  515. package/docs/consumer-skill/scripts/composition-policy.mjs +39 -3
  516. package/docs/consumer-skill/scripts/composition-schema.d.mts +2 -0
  517. package/docs/consumer-skill/scripts/composition-schema.mjs +32 -0
  518. package/docs/consumer-skill/scripts/composition.mjs +254 -0
  519. package/docs/consumer-skill/scripts/discovery.mjs +96 -10
  520. package/docs/consumer-skill/scripts/inspect-component.mjs +11 -0
  521. package/docs/consumer-skill/scripts/inspect-tokens.mjs +11 -0
  522. package/docs/consumer-skill/scripts/inspection.mjs +193 -0
  523. package/docs/consumer-skill/scripts/map-composition.mjs +12 -0
  524. package/docs/consumer-skill/scripts/setup-skills.mjs +111 -0
  525. package/docs/consumer-skill/scripts/surface-policy.mjs +5 -5
  526. package/docs/consumer-skills/themelia-components/SKILL.md +31 -0
  527. package/docs/consumer-skills/themelia-composition/SKILL.md +34 -0
  528. package/docs/consumer-skills/themelia-design/SKILL.md +55 -0
  529. package/docs/consumer-skills/themelia-forms/SKILL.md +12 -0
  530. package/docs/consumer-skills/themelia-foundation/SKILL.md +15 -0
  531. package/docs/consumer-skills/themelia-tokenization/SKILL.md +42 -0
  532. package/package.json +4 -2
  533. package/templates/README.md +39 -0
  534. package/templates/admin-shell-template.tsx +382 -0
  535. package/templates/analytics-operations-template.tsx +376 -0
  536. package/templates/customers-template.tsx +509 -0
  537. package/templates/index.ts +29 -0
  538. package/templates/orders-template.tsx +1102 -0
  539. package/templates/products-template.tsx +834 -0
  540. package/templates/user-permissions-template.tsx +450 -0
  541. package/dist/accordion-Cjb6sx0G.js.map +0 -1
  542. package/dist/action-menu-CllU52Mm.js +0 -280
  543. package/dist/action-menu-CllU52Mm.js.map +0 -1
  544. package/dist/affordance-geometry.generated-tF36bREk.js.map +0 -1
  545. package/dist/ai-artifact-DvTwDVyL.js.map +0 -1
  546. package/dist/app-shell-C4FhvCqF.js +0 -236
  547. package/dist/app-shell-C4FhvCqF.js.map +0 -1
  548. package/dist/auth-BGua8ouh.js.map +0 -1
  549. package/dist/avatar-DAPlDvhJ.js.map +0 -1
  550. package/dist/base/cascader.js.map +0 -1
  551. package/dist/batch-action-bar-DnUJ21NQ.js.map +0 -1
  552. package/dist/button-DVzspB_G.js.map +0 -1
  553. package/dist/buttons-DPZekJFu.js.map +0 -1
  554. package/dist/cards-BaBZR-AU.js +0 -68
  555. package/dist/cards-BaBZR-AU.js.map +0 -1
  556. package/dist/chart-ZOYyK2xG.js +0 -155
  557. package/dist/chart-ZOYyK2xG.js.map +0 -1
  558. package/dist/checkbox-AWIhNhmo.js.map +0 -1
  559. package/dist/choice-inputs-CNHvARCJ.js +0 -770
  560. package/dist/choice-inputs-CNHvARCJ.js.map +0 -1
  561. package/dist/code-block-DeneBJR_.js.map +0 -1
  562. package/dist/combobox-DaHESuiL.js +0 -355
  563. package/dist/combobox-DaHESuiL.js.map +0 -1
  564. package/dist/combobox-Dxo2fAYQ.js.map +0 -1
  565. package/dist/command-C25VMRII.js.map +0 -1
  566. package/dist/comments-DD0DUPwJ.js.map +0 -1
  567. package/dist/containers-Mu1LMGV1.js +0 -103
  568. package/dist/containers-Mu1LMGV1.js.map +0 -1
  569. package/dist/control-group-recipes-DBXmfh2E.js.map +0 -1
  570. package/dist/data-display-DT_khPl_.js.map +0 -1
  571. package/dist/date-picker-B2K3ucWn.js.map +0 -1
  572. package/dist/date-pickers-Ds8gLaoP.js +0 -175
  573. package/dist/date-pickers-Ds8gLaoP.js.map +0 -1
  574. package/dist/dropdown-menu-Cl4X7L5S.js +0 -193
  575. package/dist/dropdown-menu-Cl4X7L5S.js.map +0 -1
  576. package/dist/feedback-BYIhtitP.js.map +0 -1
  577. package/dist/field-affordance-recipes-DZhnIL_Y.js.map +0 -1
  578. package/dist/filters-DJVAveHA.js.map +0 -1
  579. package/dist/form-field-CwH9y77i.js.map +0 -1
  580. package/dist/form-sizing-BdP_Mf5p.js.map +0 -1
  581. package/dist/forms-B9G_xwzi.js +0 -194
  582. package/dist/forms-B9G_xwzi.js.map +0 -1
  583. package/dist/forms-numeric-B_jraJaQ.js.map +0 -1
  584. package/dist/header-BSfIEWbI.js.map +0 -1
  585. package/dist/hooks-ClH9thn4.js.map +0 -1
  586. package/dist/input-CZw8iU99.js +0 -21
  587. package/dist/input-CZw8iU99.js.map +0 -1
  588. package/dist/input-DQdEd0YD.js +0 -263
  589. package/dist/input-DQdEd0YD.js.map +0 -1
  590. package/dist/item-K5_ghvze.js +0 -275
  591. package/dist/item-K5_ghvze.js.map +0 -1
  592. package/dist/message-DZ_ruyUV.js.map +0 -1
  593. package/dist/metadata-list-8N16ZMW_.js +0 -405
  594. package/dist/metadata-list-8N16ZMW_.js.map +0 -1
  595. package/dist/motion-recipes-ChBg4HBq.js.map +0 -1
  596. package/dist/navigation-Bnotn4AQ.js +0 -145
  597. package/dist/navigation-Bnotn4AQ.js.map +0 -1
  598. package/dist/navigation-BzhHI3lo.js.map +0 -1
  599. package/dist/navigation-row-recipes-BFLCk_Aq.js.map +0 -1
  600. package/dist/overflow-tab-bar-CWY7Nogn.js +0 -282
  601. package/dist/overflow-tab-bar-CWY7Nogn.js.map +0 -1
  602. package/dist/overlays-tMkF-VAN.js +0 -1003
  603. package/dist/overlays-tMkF-VAN.js.map +0 -1
  604. package/dist/page-CL9YeH_V.js +0 -224
  605. package/dist/page-CL9YeH_V.js.map +0 -1
  606. package/dist/page-header-commands-DOb6WsfD.js +0 -126
  607. package/dist/page-header-commands-DOb6WsfD.js.map +0 -1
  608. package/dist/popover-gnTOhbFM.js +0 -198
  609. package/dist/popover-gnTOhbFM.js.map +0 -1
  610. package/dist/popover.recipes-D3j8R8Yp.js.map +0 -1
  611. package/dist/receipt-BVSOH3Xo.js.map +0 -1
  612. package/dist/rich-text-editor-cRLC-eBK.js.map +0 -1
  613. package/dist/rich-text-editor-toolbar-DfXg0-VC.js.map +0 -1
  614. package/dist/settings-ybnjVwbd.js +0 -171
  615. package/dist/settings-ybnjVwbd.js.map +0 -1
  616. package/dist/sheet-ijlsjq-n.js +0 -213
  617. package/dist/sheet-ijlsjq-n.js.map +0 -1
  618. package/dist/sidebar-Db6gkh3U.js +0 -619
  619. package/dist/sidebar-Db6gkh3U.js.map +0 -1
  620. package/dist/sidebar-DkTO4VTO.js +0 -512
  621. package/dist/sidebar-DkTO4VTO.js.map +0 -1
  622. package/dist/skeleton-Byjnt7qr.js +0 -264
  623. package/dist/skeleton-Byjnt7qr.js.map +0 -1
  624. package/dist/smart-card-DiC5aac3.js +0 -604
  625. package/dist/smart-card-DiC5aac3.js.map +0 -1
  626. package/dist/table-BweFy_P9.js.map +0 -1
  627. package/dist/tabs-CDocW5D1.js.map +0 -1
  628. package/dist/text-inputs-f9Ia-aCi.js.map +0 -1
  629. package/dist/text.styles-g4He6UIW.js.map +0 -1
  630. package/dist/theme-scope-BJ6eE2xt.js +0 -50
  631. package/dist/theme-scope-BJ6eE2xt.js.map +0 -1
  632. package/dist/timelines-CwM_9IhD.js.map +0 -1
  633. package/dist/tooltip-yiRJUFjp.js +0 -111
  634. package/dist/tooltip-yiRJUFjp.js.map +0 -1
  635. package/dist/typography-UTnveOEy.js +0 -117
  636. package/dist/typography-UTnveOEy.js.map +0 -1
  637. package/dist/ui-provider-C_U0Xma4.js +0 -136
  638. package/dist/ui-provider-C_U0Xma4.js.map +0 -1
  639. package/dist/upload-CXyxmQBP.js.map +0 -1
  640. package/dist/upload-queue-Boscubn9.js.map +0 -1
  641. package/dist/usage-card-BhO5eqkX.js.map +0 -1
  642. package/dist/use-mobile-vaLKwgyf.js +0 -15
  643. package/dist/use-mobile-vaLKwgyf.js.map +0 -1
  644. package/dist/utils-BRhFDwuU.js.map +0 -1
  645. package/dist/value-inputs-TaX4OjNk.js +0 -963
  646. package/dist/value-inputs-TaX4OjNk.js.map +0 -1
  647. package/dist/workspace-B-OEm3Kf.js +0 -408
  648. package/dist/workspace-B-OEm3Kf.js.map +0 -1
@@ -0,0 +1,106 @@
1
+ # Executable composition mapping
2
+
3
+ Use this when a screen needs several cooperating owners or when a component's
4
+ surface and placement are unclear. The mapper resolves explicit responsibilities
5
+ into exact public components and supported regions. The application still decides
6
+ the user's priorities, data, commands and meaningful grouping.
7
+
8
+ First resolve the installed package and verify copied guidance using
9
+ [installed setup](installation.md). These commands assume its conventional
10
+ `node_modules` location:
11
+
12
+ ```sh
13
+ node node_modules/themelia-react-ui/docs/consumer-skill/scripts/map-composition.mjs --roles
14
+ node node_modules/themelia-react-ui/docs/consumer-skill/scripts/map-composition.mjs --role facts
15
+ node node_modules/themelia-react-ui/docs/consumer-skill/scripts/map-composition.mjs --pattern record-detail --main invoice-lines --aside facts
16
+ ```
17
+
18
+ For a complete copied bundle, use the shared skill's
19
+ `scripts/map-composition.mjs` instead. It resolves `public-api.json` and
20
+ `component-contracts.json` beside that script's shared references, independently
21
+ of the current directory. Node is sufficient; the mapper does not load React,
22
+ TypeScript, optional component peers or the consumer's application code.
23
+
24
+ ## Describe responsibilities, then inspect the plan
25
+
26
+ 1. Turn the business brief into independent subjects: for example invoice lines
27
+ in the main region and record facts in the supporting region. A responsibility
28
+ is a role tag reported by `--roles`; a complete business brief is not a role.
29
+ 2. Use `--role` to inspect a role's mapped owners. Role names accept spaces or
30
+ kebab-case. A phrase that matches no role stays `unresolved` and may list
31
+ `suggestedRoles` that share its words; retry with one of them only when it
32
+ names the same job. A qualified `themelia-react-ui/<family>#<Symbol>` selector chooses
33
+ an exact mapped contract when a role has several candidates.
34
+ 3. Select a pattern and repeat `--main` or `--aside` for each subject. Supported
35
+ patterns are `record-detail`, `collection`, `edit`, `analytics` and `embedded`.
36
+ They identify structural context; they do not install form state, fetch data
37
+ or choose application-specific variants. Edit plans explicitly retain the
38
+ application's native form and submission requirements.
39
+ Use `--limit 1..10` to bound candidate details; it does not discard requested
40
+ subjects or hide unresolved coverage.
41
+ 4. Read `tree`, `coverage`, `unresolved`, `warnings`, `requiredPeers`,
42
+ `applicationOwns` and the focused `nextReads` before implementing. Inspect each
43
+ chosen unfamiliar component with the [API inspector](discovery.md#inspect-a-selected-component).
44
+
45
+ `requiredPeers` lists the selected families' additional optional package peers;
46
+ `baselinePeers` lists the package's nonoptional peers. Both still require the
47
+ installed setup and matching versions. An empty additional list does not remove
48
+ React or Base UI requirements.
49
+
50
+ The record-detail example resolves a route owner and, because support is
51
+ requested, Page's mapped aside slot. Without support, edit/detail plans recommend narrow when its contract supports that prop. Its `tree.slots` uses actual insertion props
52
+ such as `children` and Page's direct `aside`. Older bundles without Page aside anatomy retain their explicit main/support layout. Parent-surface content can receive a
53
+ subject Card at that boundary. Already framed owners keep their own surface;
54
+ variant-dependent owners require inspection before choosing framing.
55
+
56
+ Collection plans can place an explicit toolbar need in the table seam:
57
+
58
+ ```sh
59
+ node node_modules/themelia-react-ui/docs/consumer-skill/scripts/map-composition.mjs --pattern collection --main comparison-table --main query-toolbar
60
+ ```
61
+
62
+ The mapped FilterLayout goes into DataTable's topbarContent with compact/clear
63
+ props, and the mapped FilterProvider wraps that table. Supply its definitions,
64
+ activeFilters and onFilterChange using the app's query transport. Toolbar order
65
+ in the request does not matter. Missing/ambiguous table seams or context mappings
66
+ remain unresolved; no detached filter strip or guessed provider is emitted.
67
+
68
+ For an existing Card boundary:
69
+
70
+ ```sh
71
+ node node_modules/themelia-react-ui/docs/consumer-skill/scripts/map-composition.mjs --pattern embedded --parent Card --main facts
72
+ ```
73
+
74
+ That plan uses the selected host's `children` region without adding another Page
75
+ or Card. Qualify an ambiguous parent with `--import <exact public import>`.
76
+ An embedded request without a parent leaves the host decision explicit; inspect
77
+ its unresolved ownership before creating a new boundary.
78
+ Only an explicitly declared route-child slot permits a Page inside a shell;
79
+ AuthShell and bounded workspaces are ordinary content hosts. Variant-dependent
80
+ hosts retain inspection warnings before another framed subject is added.
81
+
82
+ ## Read the result's scope
83
+
84
+ The output is advisory JSON. `mapped` means the requested roles resolved under
85
+ the mapper's supported contracts. It does not mean an application is implemented,
86
+ accessible, visually accepted or ready for delivery. `partial` and `unresolved`
87
+ retain requests the mapper could not place or uniquely identify; choose a more
88
+ specific role or qualified mapped owner. Metadata coverage is deliberately
89
+ explicit: an unmapped component can still be a valid public component.
90
+
91
+ Mappings belong to exact import/symbol pairs in the existing authored catalogue,
92
+ then flow into its generated public index. They describe role tags, owner kind,
93
+ region/cell/overlay placement, surface ownership, insertion props and any authored
94
+ literal recommendations. Generation checks them against the actual public API.
95
+ They do not introduce another theme, token system or component registry.
96
+
97
+ Table-cell identities stay in column renderers, and overlays stay at their
98
+ composing app/feature boundary. Similar collection owners remain alternatives;
99
+ a request that cannot distinguish them stays unresolved. App data, callbacks,
100
+ permissions, forms and asynchronous lifecycle still follow the selected owner's
101
+ contract and matching recipe.
102
+
103
+ Use [composition ownership](composition.md), [screen archetypes](screen-archetypes.md)
104
+ and [form workflows](rhf-workflows.md) for the selected task. After implementing,
105
+ run the existing source checker and app checks, inspect narrow/wide light/dark
106
+ appearance, and execute the relevant interactions from [review](review.md).
@@ -1,6 +1,6 @@
1
1
  # Composition
2
2
 
3
- The [design contract](design-contract.md) separates application layout freedom
3
+ The [design contract](design-contract.md#semantic-roles) defines shared spacing and typography roles and separates application layout freedom
4
4
  from library-owned anatomy. Use supported props and slots inside shared surfaces;
5
5
  keep placement, width, wrapping and overflow with the surrounding composition.
6
6
 
@@ -16,6 +16,12 @@ keep placement, width, wrapping and overflow with the surrounding composition.
16
16
  | Reusable subject presentation | Blocks |
17
17
  | Editing/selection/async lifecycle | Features with app callbacks |
18
18
 
19
+ Base controls, layouts and blocks also own their local interaction and
20
+ accessibility; features coordinate a complete business workflow. For choosing
21
+ compound APIs and building token-backed app content, read
22
+ [app-owned composites](custom-composition.md). It includes disclosure sections,
23
+ layer boundaries and a custom comparison seam.
24
+
19
25
  ## Compose from the task
20
26
 
21
27
  Identify the user's next decision before selecting components. Establish fixed
@@ -29,11 +35,11 @@ a detail workspace or a form; they need different information hierarchies.
29
35
  | DataView | Its coordinated query, view and collection lifecycle fits | DataTable with app-owned query transport and native toolbar slots when coordination differs; base Table for presentation without TanStack behavior |
30
36
  | ResourceCell | Identity inside a table cell | Item for independent list entries; MetadataList for label/value facts about one subject |
31
37
  | Page / application shell | Route identity, navigation, content bounds and page commands | Card for an independent subject within that route; do not repeat the same heading merely to frame a table |
32
- | Card | One subject needs a frame and headed regions | `surface="flat" padding="none"` inside an existing boundary; nested DataTable uses its own `surface="flat"` |
38
+ | Card | One subject needs a frame and headed regions | `surface="flat" padding="none"` inside an existing boundary; prefer DataTable directly in the layout, or Card padding="none" with a flat table |
33
39
  | Metric / MetricGrid / MetricBar | A KPI needs formatted value, comparison/trend or peer layout | UsageCard for used/limit quotas; InlineStat for one plain fact, MetadataList for several record facts |
34
40
  | FormField / InlineEdit | A field needs label/hint/error, or isolated save/cancel | Complete feature/overlay for a workflow; app form owns whole-record submission |
35
41
 
36
- For a DataTable composition, put queries in `topbarContent`, exports or collection
42
+ For a DataTable composition, wrap it in FilterProvider and put `FilterLayout variant="compact" showClearFilters` in `topbarContent`, exports or collection
37
43
  tools in `topbarEnd`, selection commands in `bulkActions`, and record commands
38
44
  in `rowActions`. `bulkActions` render in the shared `BatchActionBar`, docked to
39
45
  the viewport while rows are selected (`selectionToolbarPlacement="inline"` keeps
@@ -57,18 +63,22 @@ or supported comparison controls. Avoid automatically appending every hidden
57
63
  column to identity metadata. There is no universal row-line limit: long names,
58
64
  accessibility needs and the task can justify richer rows. Explain the priority.
59
65
  Custom ResourceCell metadata is caller content; use shared supporting typography
60
- and CellStack where its smaller secondary-value contract fits.
66
+ and CellStack where its smaller secondary-value contract fits. ResourceCell draws
67
+ its media circle only when you pass `imageUrl`, `icon` or `fallback`: order and
68
+ invoice identifiers stay plain text, and a person opts in with
69
+ `fallback={<Initials value={name} />}`.
61
70
 
62
71
  Commands need explicit importance as well as scope. Describe page commands by
63
72
  role in Page's header: `primaryAction` is the route's one main command, and
64
73
  `secondaryActions` lists supporting commands in priority order. The header owns
65
74
  their treatment and order: outline secondary buttons, the solid primary button,
66
75
  then a More actions menu for overflow, destructive commands and narrow screens,
67
- which always ends the row. WorkspaceRecordHeader, ResourceHeader, the resource
76
+ which always ends the desktop row. Below 40rem of actual header width, every
77
+ command, including primary, moves into one More actions menu. WorkspaceRecordHeader, ResourceHeader, the resource
68
78
  shells and SettingsShell take the same props and render the same row. Choosing which
69
79
  command is primary, which are `destructive`, and which are `visible` remains an
70
80
  application decision; confirm destructive commands in their handler. Use
71
- `actions` only for non-command controls such as a period select. A back link,
81
+ the compatible direct `actions` prop for non-command controls such as a period select. A back link,
72
82
  export and destructive command should not all inherit the same visual emphasis.
73
83
 
74
84
  ```tsx
@@ -82,7 +92,8 @@ export and destructive command should not all inherit the same visual emphasis.
82
92
  }}>{/* route content */}</Page>
83
93
  ```
84
94
 
85
- A record split into sections adds `header.tabs`. The tabs sit under the header's
95
+ When a record has separately selected or routed sections, use `header.tabs`.
96
+ A continuous detail document can keep its sections in the body. The tabs sit under the header's
86
97
  copy and commands, a `badge` shows a count, tabs that do not fit move into a More
87
98
  menu, and `onValueChange` switches the section or routes. Labels name the
88
99
  command; an icon on every command repeats it, so keep `+` on an add command and
@@ -91,7 +102,7 @@ leave the others plain.
91
102
  ```tsx
92
103
  <Page header={{
93
104
  title: member.name,
94
- titleBadges: [{ label: 'Needs attention', tone: 'warning' }],
105
+ slots: { titleSuffix: <Badge tone="warning">Needs attention</Badge> },
95
106
  primaryAction: { label: 'Generate report', onClick: onReport },
96
107
  secondaryActions: [
97
108
  { label: 'Update profile', onClick: onEdit },
@@ -209,7 +220,7 @@ See the [website example](../examples/website.tsx) for both hero and section emp
209
220
 
210
221
  ## Card anatomy
211
222
 
212
- Card surface="card" is the ordinary bordered surface; surface="framed" retains its ring recipe; surface="flat" padding="none" composes within an existing boundary. headerPlacement="frame" places title/icon/actions above an inset body, retaining default corners and using rounded-inner on that body.
223
+ Card surface="card" is the ordinary bordered surface; surface="framed" retains its ring recipe; surface="flat" padding="none" composes within an existing boundary. headerPlacement="frame" places title/icon/actions above an inset body, retaining the surface corner and using rounded-radius on that body.
213
224
 
214
225
  Choose one ordinary Card surface through UIProvider's `card.defaultSurface` and
215
226
  let sibling subjects inherit it. Explicit per-card surfaces win: mixing `card`
@@ -222,21 +233,39 @@ for richer content. Facts and rows follow the same rule: one glyph repeated on
222
233
  every MetadataList item or Item row is decoration, so leave `icon`/media empty.
223
234
 
224
235
  Card `gap` owns spacing between regions; `contentGap` owns direct body-child
225
- spacing; `textGap` owns title/supporting-copy rhythm. Region spacing defaults to
226
- `xl` (`md` for `padding="none"`). Use a semantic region gap for compact cards
227
- instead of resetting padding or adding local margins.
228
-
229
- Ordinary independent cards omit `padding` and retain `md` (the full surface
230
- inset, 20px at default roots). `sm` is half that inset (10px), for a deliberately
231
- compact subject; it is not the default for forms, settings, metrics or resource
232
- pages. Component size and
233
- density do not choose Card padding. `lg` uses 1.8 times the inset (36px), while
234
- `none` removes it. All sizes follow the surface roots and space-scale.
235
- Card dividers are on by default: a framed card rules its header and footer apart,
236
- while flat, card-free structure and a `headerPlacement="frame"` header draw no
237
- rule unless asked. UIProvider's `card.defaultHeaderDivider` and
238
- `card.defaultFooterDivider` (both `true`) turn the framed rules off app-wide;
239
- explicit per-card booleans win. Header/footer-only cards render one shared divider.
236
+ spacing; `textGap` owns title/supporting-copy rhythm. Body children default to
237
+ the shared related `xl` gap (16px at default roots).
238
+ Use `contentGap="2xl"` for
239
+ independent sections. Omit it around an existing Grid/Stack or a single feature
240
+ that already owns its layout:
241
+
242
+ ```tsx
243
+ <Card title="Billing" contentGap="xl">
244
+ <MetadataList columns={1} items={[
245
+ { label: 'Plan', value: 'Studio' },
246
+ { label: 'Billing cycle', value: 'Monthly' },
247
+ ]} />
248
+ <Text type="secondary" size="xs">Invoices go to billing@northstar.example.</Text>
249
+ </Card>
250
+ ```
251
+
252
+ This lets Card own body rhythm without an extra caller wrapper. For independent sections,
253
+ change the Card to `contentGap="2xl"` and let each section own its heading/copy
254
+ group. The default regional gap
255
+ follows the surface inset tier: 12px with `padding="sm"`, 24px with omitted/`md`
256
+ or `none`, and 32px with `lg`, before spacing scale. An explicit semantic `gap`
257
+ overrides it without changing the insets. See [semantic roles](design-contract.md#semantic-roles).
258
+
259
+ Ordinary independent cards omit `padding` and retain `md` (24px at default
260
+ roots). Card supports `sm` (12px), `md` (24px), `lg` (32px) and `none` (no inset).
261
+ The general surface scale also has a 16px tier; Card does not expose it as a padding prop.
262
+ Component size and density do not choose Card padding. All tiers follow the
263
+ surface roots and space-scale.
264
+ Card defaults to `surface="card"`, with no header rule and a footer rule.
265
+ Flat, card-free structure and a `headerPlacement="frame"` header draw no rule
266
+ unless asked. UIProvider's `card.defaultHeaderDivider` (false) and
267
+ `card.defaultFooterDivider` (true) configure these rules app-wide; explicit
268
+ per-card booleans win. Header/footer-only cards render one shared divider.
240
269
  Inside the body, separate a card's sections with `contentGap` or a Stack gap
241
270
  clearly larger than the row gap (`2xl` between sections), not rules.
242
271
  Overlays rule their regions the same way: `ActionDialog`, `ActionDrawer` and `ConfirmDialog`
@@ -306,26 +335,27 @@ primitives rather than replacing labels and values with undifferentiated Text.
306
335
 
307
336
  ## Menus and controls
308
337
 
309
- PopoverContent type="display" owns substantive-content padding; type="menu" compact collection padding around already-padded rows. Popover and Command share inset="default" and inset="compact" paradigms. Mixed searchable shells use inset="flush"; public header/search/list/footer anatomy owns its insets automatically. CommandInput composes the public Input for control geometry and focus styling; its search region adds only outer spacing. Do not pass padding through className, contentClassName or inline styles. Compact header controls and footer actions align with row highlight edges; header text and footer captions align with row labels. Use PopoverHeader start for a leading control and PopoverFooter caption for supporting content alongside trailing action children. Dividers use the same semantic recipe. density selects vertical row rhythm without changing inline padding. ActionMenu owns action definitions, PopoverMenu searchable selection, DropdownMenu bespoke menu anatomy. Shared appearance preserves their accessible menu/listbox/dialog behavior.
338
+ PopoverContent type="display" owns substantive-content padding; type="menu" compact collection padding around already-padded rows. Popover and Command share inset="default" and inset="compact" paradigms. Mixed searchable shells use inset="flush"; public header/search/list/footer anatomy owns its insets automatically. CommandInput composes the public Input for control geometry and focus styling; its search region adds only outer spacing. Do not pass padding through className, contentClassName or inline styles. Compact header controls and footer actions align with row highlight edges and the search field; header text and footer captions sit one small step inside that edge. Use PopoverHeader start for a leading control and PopoverFooter caption for supporting content alongside trailing action children. Dividers use the same semantic recipe. density selects vertical row rhythm without changing inline padding. ActionMenu owns action definitions, PopoverMenu searchable selection, DropdownMenu bespoke menu anatomy. Shared appearance preserves their accessible menu/listbox/dialog behavior.
310
339
 
311
340
  | Choice | Responsibility |
312
341
  | --- | --- |
313
342
  | PopoverContent type="display" / type="menu" | Display versus collection anatomy and typography |
314
- | inset="default" / "compact" | Full versus half surface-root inset |
343
+ | inset="default" / "compact" | Rich surface inset versus small collection shell |
315
344
  | inset="flush" | Delegate insets to owned regions; not a density |
316
345
  | density="compact" / "default" / "comfortable" | Collection row block rhythm, independent from inline spacing |
317
346
  | size="sm" / "md" / "lg" | Supported control's scale; consult its declaration and provider precedence |
318
347
 
319
- Input, Button, Select and filter-facet triggers share bounded inner corners
320
- and corresponding heights; Card and popup shells use the global outer radius. Omitted sizes inherit the provider; explicit sizes win.
348
+ Input, Button, Select, filter-facet triggers and badges share the default
349
+ `rounded-radius` corner and corresponding heights; Card and popup shells use the
350
+ larger `rounded-surface`. Omitted sizes inherit the provider; explicit sizes win.
321
351
  Keep action/control roots equal when those controls adjoin. Compact menu rows,
322
- surface insets and control sizes remain independent; density can tighten the
323
- inner-radius height bound without changing outer corners.
352
+ surface insets and control sizes remain independent; density does not change
353
+ the corner.
324
354
  Inset segmented children use the supported compound owner's same-height frame.
325
355
 
326
356
  PopoverContent defaults to display/default; Command defaults to compact. An explicit PopoverContent type controls anatomy; explicit inset controls padding and takes precedence over the type's inferred inset. Without type, compact implies menu, other insets imply display. Put type="menu" inset="flush" on PopoverContent for a headed searchable picker. Popover is the interaction root and receives no surface props. PopoverMenu already assembles that picker anatomy; use its declared selection/search props. ComboboxPopup is flush because ComboboxList owns its inset. Do not add another wrapper inset around a normal collection list.
327
357
 
328
- At shipped roots, compact shell padding is 8px; row inline padding is 12px; default row block padding is 8px and minimum height 36px. Compact/comfortable rows use 6/10px block padding and 32/40px minimum heights. Content can grow when it wraps. These are token-derived measurements, not app constants. Flush compact header/footer shell padding matches the list (8px inline). Header text bodies without a leading control and footer captions add the row inset once, aligning text at 20px. Actions keep the 8px shell edge. Nested public slots do not repeat these insets.
358
+ At shipped roots, rich display padding is 24px and compact collection shell padding is 8px; row inline padding is 12px; default row block padding is 8px and minimum height 32px. Compact/comfortable rows use 6/10px block padding and 32/40px minimum heights. Content can grow when it wraps. These are token-derived measurements, not app constants. Flush compact header/footer shell padding matches the list (4px inline). Header text and footer captions add a small xs step (4px) to the md band inset (8px), rather than the full row inset. Actions keep the 4px shell edge. Nested public slots do not repeat these insets.
329
359
 
330
360
  Input frames and outline buttons share the input semantic token; collection dividers use border/60; focus uses ring separately and draws one indicator everywhere (a full-strength edge inside a soft halo). Equal responsibilities share recipes, while different semantic roles retain their own treatment. CommandInput keeps its existing onValueChange search contract and native refs; use the actual public Input through its default composition rather than restyling an unframed native field.
331
361
 
@@ -427,6 +457,40 @@ to the existing shell and retains its typed slots; topbar props and toolbar
427
457
  props are specific to their variants. The low-level TopbarSidebarLayout,
428
458
  SidebarInsetLayout and StackedLayout remain available for deliberate composition.
429
459
 
460
+ Choose the structure before its options: a global Header above navigation, a
461
+ full-height AppSidebar beside the content Header, or the shadcn-style inset page
462
+ beside navigation. The catalogue leads with these three structures and reuses
463
+ the exact AppSidebar example from the Sidebar page. Single/dual navigation,
464
+ attached/floating frames and icon/offcanvas collapse configure a structure.
465
+ Example child destinations are text-only; an explicit child icon is reserved
466
+ for a case where it carries information.
467
+
468
+ Header-first light/dark variants accept `contentSurface="inset"` for a quiet
469
+ secondary canvas around the card-colored main surface; omission keeps plain.
470
+ SidebarInsetLayout retains `surface="inset" | "flush"`, and the sidebar/inset
471
+ presets retain their defaults. AppSidebar/LayoutSidebar `surface="transparent"`
472
+ shares the docked canvas; drawer surfaces remain opaque. This uses the existing
473
+ theme roles and structural roots.
474
+
475
+ The shared global header-height root defaults to 4rem. Use the playground's
476
+ full-viewport `?page=shells&layout=header|sidebar|inset` views to inspect
477
+ the composition, optionally with `&theme=dark`.
478
+
479
+ Sidebar shells accept `slots.sidebar` (primary) and `slots.secondarySidebar`
480
+ (contextual navigation). Each missing region removes its track. `sidebarWidth`
481
+ and `secondarySidebarWidth` size their own expanded region, with the
482
+ shared shell width as fallback. `sidebarPresentation="rail"` selects dedicated
483
+ primary navigation geometry independently of full-sidebar icon collapse. Use SidebarNavigationRail from
484
+ layout/sidebar for area navigation with items, value/onValueChange and
485
+ renderLink; it preserves accessible labels/tooltips and defaults to
486
+ collapsible="none". Its default background surface and divider distinguish it
487
+ from the contextual canvas. The 48px default derives from a 32px action plus
488
+ two 8px insets; full-sidebar icon collapse remains 60px. These are private
489
+ recipes, not extra consumer knobs. SidebarRail remains the collapse affordance.
490
+ The rail also accepts header, beforeNavigation, afterNavigation and footer
491
+ nodes or render callbacks with named state. Header/footer are pinned;
492
+ before/after content scrolls with its navigation.
493
+
430
494
  The shell owns one PageViewport and framing. Give the root a constrained height
431
495
  (`h-svh min-h-0` for full-screen apps). Page owns width, page gutters and
432
496
  header/body rhythm, Card owns its insets, and Stack/Grid owns peer gaps. With
@@ -434,12 +498,49 @@ stacked/contained content, use Page gutter="none" to avoid repeating the shell's
434
498
  Container gutter. Metric card size changes copy/media scale, keeping the default
435
499
  surface inset in ready, loading and error states.
436
500
 
437
- Compose LayoutSidebarProvider around AppSidebar and SidebarTrigger. Use
438
- `adaptTo="container"` on the provider for embedded workspaces: it measures its
439
- own width and switches navigation to the same mobile drawer below 768px, even
440
- on a wide viewport. The default remains viewport-driven. Account/search/page
441
- actions remain application callbacks. Do not add another scroll viewport
442
- inside the page. Header menus retain the header theme through their portal host.
501
+ Keep the dual area rail docked on the left beside the full navigation panel,
502
+ and choose that panel's AppSidebar/LayoutSidebar `collapsible` independently
503
+ of its skin or AppLayout variant. `icon` minimizes it to a second compact
504
+ column, `offcanvas` hides it and leaves only the original rail, and `none`
505
+ keeps it expanded. Current examples default to `icon` and expose a preview
506
+ selector for the same modes; standalone navigation supports the same choice.
507
+ The primary area rail keeps its own `collapsible="none"` policy. One explicit
508
+ trigger controls the contextual panel; selecting an area opens it. At narrow widths the inline cluster pans a
509
+ minimum page canvas while its area rail stays pinned. It preserves the chosen
510
+ expansion state rather than silently minimizing. Do not repeat a contextual
511
+ group heading already supplied by its pinned
512
+ header. KPI peers use MetricGrid. Shared header/page/navigation recipes own the
513
+ spacing; Page remains the one page-padding owner.
514
+
515
+ Compose one LayoutSidebarProvider around the shell and its triggers. Shell slots
516
+ establish named scopes, so AppSidebar, LayoutSidebar and useLayoutSidebar() infer
517
+ their panel ID; ordinary compositions need no repeated IDs or nested provider.
518
+ Manual compositions can pass a panel ID explicitly. `SidebarTrigger panelId`
519
+ targets primary/secondary/aside; omission uses provider `navigationPanel`
520
+ (primary by default). That also selects the Ctrl/Command+B shortcut target;
521
+ keyboardShortcut changes the key or accepts false.
522
+
523
+ Desktop expansion uses openPanels/defaultOpenPanels/onOpenPanelsChange. Closed
524
+ icon panels leave a rail, offcanvas removes their track, and none remains visible.
525
+ Controlled openPanels wins over legacy primary open; otherwise open controls
526
+ primary and the provider owns other regions. defaultOpenPanels defines the
527
+ initial uncontrolled set; without it, defaultOpen keeps its primary meaning.
528
+ Primary changes notify onOpenChange and set changes notify onOpenPanelsChange.
529
+ The app accepts controlled proposals by updating the matching props; additional
530
+ persistence remains application-owned.
531
+
532
+ mobilePanel/onMobilePanelChange select one active undocked drawer, preserving
533
+ desktop preferences. Context presentation is docked/drawer; isMobile is its
534
+ drawer alias, including when a contextual panel undocks on a desktop viewport.
535
+ Other panel/drawer compositions retain default thresholds of 768/1024/1440px
536
+ for primary/secondary/aside against available shell width. The featured dual
537
+ cluster uses `mobileSidebarMode="inline"` to keep the rail and its adjacent
538
+ collapsible panel docked. Use adaptTo="container" on embedded providers to contain
539
+ their drawer and backdrop inside that provider. Essential
540
+ undocked regions need reachable targeted triggers. Account/search/page actions
541
+ remain application callbacks. Do not add another scroll viewport inside Page.
542
+ Use Header partials in shell slots to retain one header/inset owner. Header menus
543
+ retain the header theme through their portal host.
443
544
 
444
545
  Header forwards native attributes, handlers and refs. PageHeader supports
445
546
  textGap="normal" or "dense" without changing control or page insets. Header
@@ -448,11 +549,27 @@ TwoColumnLayout defaults to its existing viewport breakpoint; choose
448
549
  adaptTo="container" inside Container/PageViewport to adapt at 48rem of usable
449
550
  parent width while preserving main-before-aside DOM/focus order.
450
551
 
451
- See the installed [workspace recipe](../examples/app-layout.tsx).
552
+ The installed [app-shell recipe](../examples/app-layout.tsx) exports a copyable
553
+ `WorkspaceLayout` that hosts route children directly. Put `AccountDetailPage` or
554
+ another route Page inside it. `WorkspaceExamplePage` separately demonstrates a
555
+ Workspace title, Create callback and narrow measure; replace that example when
556
+ composing a real route. `WorkspaceRegionsLayout` accepts primaryNavigation and
557
+ sidebarPresentation="rail" for a static SidebarNavigationRail beside contextual
558
+ navigation; omitted primaryNavigation builds the alternative grouped sidebar.
559
+ It coordinates controlled named state under one provider. The app's area rail
560
+ can use useLayoutSidebar('secondary') to open context when an area is selected.
561
+ A defined
562
+ secondarySidebar replacement wins over contextualNavigationGroups; null removes
563
+ that region. Without a replacement, groups build the standard AppSidebar with
564
+ `contextualCollapsible?: AppSidebarProps['collapsible']`, defaulting to `icon`.
565
+ Pass `offcanvas` to hide it or `none` to retain expanded navigation; a supplied
566
+ secondarySidebar owns its own policy. These recipe names are
567
+ local to the copied file; the public
568
+ `WorkspaceLayout` from `layout/workspace` is the record shell described below.
452
569
 
453
570
  PageViewport owns scrolling and adds no padding. Page defaults to `gutter="lg"`
454
- and `padding="lg"` (36px at shipped roots), so it owns inline/block space once.
455
- `narrow` selects centered `md` width; explicit `maxWidth` wins. Header copy
571
+ and `padding="lg"` (32px at shipped roots), so it owns inline/block space once.
572
+ `narrow` selects centered `md` width (48rem); otherwise an aside selects `xl` (80rem), and a single column uses `lg` (64rem). Explicit `maxWidth` wins over both. Header copy
456
573
  defaults to dense; `textGap="normal"` is an explicit alternative. Do not assume
457
574
  an app shell supplies gutters because it supplies a viewport. Set `gutter="none"`
458
575
  only when an actual parent Container/surface supplies the inline inset, such as
@@ -460,14 +577,33 @@ StackedLayout's contained mode. Block padding remains independent.
460
577
  That contained measure uses the same large gutter as Page; ordinary Container
461
578
  defaults remain unchanged.
462
579
 
580
+
581
+ Page is the canonical route owner for new index/detail/edit screens. Its header
582
+ keeps title, description, back navigation, commands and tabs. Add content through
583
+ `header.slots.beforeTitle`, `titleSuffix`, `afterDescription` and `actions`.
584
+ Each accepts a React node or a callback receiving `{ renderLink, defaultContent }`.
585
+ Compose Badge for a title status and MetadataList for facts below the description;
586
+ there is no automatic metadata item shape or avatar column. Title, description and afterDescription stay in one tight left copy column;
587
+ actions occupy a separate right column aligned to the top. beforeTitle spans
588
+ above the columns, and tabs sit below. An actions renderer
589
+ can wrap or return `defaultContent` to retain the responsive command row; replacing
590
+ it owns its own command semantics. Legacy `slots.back`, `titleBadges`, `titleIcon`
591
+ and direct `actions` remain compatible. Direct toolbar, aside and lifecycle props compose at that
592
+ same boundary; explicit slots override matching direct regions. beforeHeader
593
+ precedes the header; afterHeader is the compatible toolbar fallback. Loading
594
+ precedes error, then empty, replacing only the main body while the header,
595
+ toolbar and aside remain mounted. Customize state strings or loading/error/empty
596
+ slots and wire onRetry. ResourceHeader/ResourceIndexShell/ResourceShowShell/
597
+ TabbedResourceShell retain legacy embedding behavior for migration.
598
+
463
599
  Select width from the task: a single focused resource/form can use `narrow`;
464
- a record with a supporting aside can retain the default `lg` measure and use
465
- TwoColumnLayout. A wide comparison/directory can deliberately use `maxWidth="full"`.
600
+ a record with supporting context uses Page `aside` and infers `xl` (80rem).
601
+ An explicit TwoColumnLayout inside Page should set `maxWidth="xl"`; it retains its own split contract. A wide comparison/directory can deliberately use `maxWidth="full"`.
466
602
  Setting full on every route defeats the resource measure. Do not remove Page's
467
603
  gutters to make its title touch the sidebar; align the header and body through
468
604
  the same Page. Density, container measure and page inset are separate choices.
469
605
  The [detail recipe](../examples/detail.tsx) includes `AccountDetailPage`: the
470
- default record measure, a status badge, route-level commands and section tabs in
606
+ narrow record measure, a status badge, route-level commands and section tabs in
471
607
  the header, and MetadataList facts in one framed Card, with no duplicated subject
472
608
  header or gutter.
473
609
 
@@ -475,9 +611,23 @@ Compose HeaderUserMenu in topbar `slots.headerEnd` or a local toolbar, and
475
611
  SidebarNavigationUser in AppSidebar `slots.footer` when account access belongs
476
612
  in navigation. Use SidebarWorkspaceDropdown for workspace links, or add a
477
613
  custom control through `slots.headerEnd` alongside the logo. `headerStart` and
478
- `headerEnd` stay inside the padded, fixed header; `slots.header` replaces it all.
479
- `beforeNavigation` scrolls with the links. SidebarFooter owns its rule and inset.
480
- LayoutSidebarProvider defaults to compact row gaps; explicit density still wins.
614
+ `headerEnd` stay inside the padded, fixed header. The four header,
615
+ beforeNavigation, afterNavigation and footer slots accept nodes or callbacks
616
+ receiving `{ panelId, collapsed, presentation, isMobile, renderLink, defaultContent }`.
617
+ A legacy header node replaces the entire header; a callback supplies content
618
+ inside its library-owned inset. Both footer forms retain SidebarFooter's rule and
619
+ inset. Before/after navigation content scrolls with the links, so tall supporting
620
+ content belongs there. Ordered `{ id, label?, items }` navigation groups supplement
621
+ the Record form; use stable item IDs for branch state and live badges.
622
+ renderItemContent changes noninteractive row content while preserving the owning
623
+ link/disclosure/focus treatment; renderItem remains the full row escape hatch.
624
+ Current matching selects the most-specific href; render contexts expose ancestor
625
+ state separately from current active state. In icon mode, searchable
626
+ AppSidebar preserves its search band as an icon button that expands and focuses
627
+ the field without clearing the query. LayoutSidebarProvider defaults to
628
+ comfortable rows with a shared xs gap. Default keeps that gap with smaller
629
+ rows; compact uses a tighter 2xs gap. Caption and group spacing keep their own
630
+ larger roles. Explicit density still wins.
481
631
  WorkspaceLayout owns its own bounded content inset; do not add a padded Page
482
632
  inside it. WorkspaceRecordHeader and WorkspaceLocaleStrip align to the same
483
633
  large inline surface role. Record copy supports textGap with a dense default.
@@ -502,3 +652,5 @@ formatted-value and structure owners. Drawn rings and mini charts retain private
502
652
  geometry and semantic chart/status colors. Read the
503
653
  [workflow contracts](workflows.md#task-summaries-usage-and-inline-editing) and
504
654
  [typed workspace recipe](../examples/planning-usage-edit.tsx) for integration.
655
+
656
+ Explicit `type="display" inset="compact"` retains the small rich-surface tier (12px); collection compact insets use 8px. Display/default remains 24px. Chart tooltips and explicit small async previews retain their rich-content surface sizing.
@@ -0,0 +1,98 @@
1
+ # Critique rubric
2
+
3
+ Use to judge a rendered view: after building one, before handing it back, or when
4
+ reviewing someone else's screen. Judge screenshots and measurements, not source.
5
+ Valid API usage, passing checks and a correct data model do not make a view
6
+ clear.
7
+
8
+ Render the view at 390×844 and 1440×900, in light and dark, with the states the
9
+ task touches (opened menu or editor, error, accepted). Run the census below at
10
+ each width, then score every criterion.
11
+
12
+ ## Criteria
13
+
14
+ Score each criterion 0 (fails), 1 (partly) or 2 (passes). Criteria marked
15
+ **blocking** must score 2 before the work is handed back.
16
+
17
+ | # | Criterion | Question | How to measure |
18
+ | --- | --- | --- | --- |
19
+ | 1 | Five-second test (**blocking**) | From the first viewport alone, can you say what this is, what state it is in and what to do next? | Write the three answers from the screenshot before reading source. Compare them with the data brief's decision and facts |
20
+ | 2 | Focal point | Is there one dominant element per view and per region, and is it the one the brief chose? | Look at a reduced screenshot; census `focalCandidates` lists the largest text and its position. The focal element is in the first viewport at both widths |
21
+ | 3 | Hierarchy (**blocking**) | Does each region use at most three text levels, ordered title, value, supporting? | Census `regions[].textLevels`; above 4 needs a reason (a badge or a value primitive's secondary part). Compare `textStyles` outliers with their owners |
22
+ | 4 | Emphasis budget | One solid primary command per page or surface; tones only where status changes the action? | Census `primaryCommands`: 0 means the next action has no emphasis, 2 or more on one surface means competition. Read each toned badge and name the status it states |
23
+ | 5 | Data integrity (**blocking**) | Do figures, units, signs and totals match the records; zero and missing differ; nothing invented? | Check three figures against the data and recompute one total or delta |
24
+ | 6 | Encoding fit | Does each chart answer a question you can write in one sentence, and does each table compare rows on shared columns? | Write the question beside each chart. Name the compared column for each table |
25
+ | 7 | Grouping and rhythm | Do gaps grow from within a group to between groups to between sections, without filler or box-in-box? | Census `regions[].insideFrame` lists frames inside frames. Measure sibling gaps in the DOM; equal gaps at every level fail |
26
+ | 8 | Alignment | Do peer regions share content start edges, and do numbers right-align on one axis? | Census `regions[].left` and `inset`: peers differ by at most 1px. A leading badge adds its own padding to `inset`; check it in the image |
27
+ | 9 | Narrow reading order | At 390 wide, does the decision content come before evidence, with no sideways page scroll? | `overflowX` is 0. Scroll position of the focal element and the primary command. Tables may scroll inside their own region |
28
+ | 10 | Theme and states | Does dark keep the same hierarchy and contrast, and are loading, empty, error and accepted states designed? | Dark screenshots of the same viewports; trigger each state the view supports |
29
+
30
+ Hand back at 16 of 20 or more with every blocking criterion at 2. Otherwise fix
31
+ the lowest-scoring criterion at its owner and score again. After three rounds,
32
+ stop and report what remains and why.
33
+
34
+ ## Census
35
+
36
+ Run in the page through the browser tool's JavaScript evaluation. It reads
37
+ computed styles only and changes nothing.
38
+
39
+ ```js
40
+ (() => {
41
+ const shown = el => { const r = el.getBoundingClientRect(); const s = getComputedStyle(el); return r.width > 0 && r.height > 0 && s.visibility !== 'hidden' && s.opacity !== '0'; };
42
+ const hasText = el => [...el.childNodes].some(node => node.nodeType === 3 && node.textContent.trim());
43
+ const words = el => (el.getAttribute('aria-label') || el.textContent || '').trim().replace(/\s+/g, ' ').slice(0, 40);
44
+ const probe = document.body.appendChild(Object.assign(document.createElement('span'), { style: 'background: var(--primary)' }));
45
+ const primary = getComputedStyle(probe).backgroundColor; probe.remove();
46
+ const all = [...document.querySelectorAll('body *')].filter(shown);
47
+ const texts = all.filter(hasText);
48
+ const style = el => { const s = getComputedStyle(el); return `${s.fontSize} ${s.fontWeight}`; };
49
+ const isFrame = el => { const s = getComputedStyle(el); const r = el.getBoundingClientRect();
50
+ return ['Top', 'Right', 'Bottom', 'Left'].every(side => parseFloat(s[`border${side}Width`]) > 0) && r.height >= 64 && r.width >= 160
51
+ && !el.matches('input, textarea, select, button, [role="combobox"], [role="group"]') && !el.querySelector('h1'); };
52
+ const frames = all.filter(isFrame);
53
+ const owner = el => frames.filter(frame => frame !== el && frame.contains(el)).at(-1);
54
+ const regions = frames.map(frame => {
55
+ const own = texts.filter(el => frame.contains(el) && owner(el) === frame);
56
+ const first = own[0];
57
+ return { region: first ? words(first) : '(no text)', top: Math.round(frame.getBoundingClientRect().top + scrollY), left: Math.round(frame.getBoundingClientRect().left),
58
+ inset: first ? Math.round(first.getBoundingClientRect().left - frame.getBoundingClientRect().left) : null,
59
+ textLevels: new Set(own.map(style)).size, insideFrame: owner(frame) ? words(texts.find(el => owner(frame).contains(el)) || owner(frame)) : null };
60
+ }).sort((a, b) => a.top - b.top || a.left - b.left);
61
+ const counts = new Map(texts.map(style).map(key => [key, 0]));
62
+ for (const el of texts) counts.set(style(el), counts.get(style(el)) + 1);
63
+ return {
64
+ viewport: `${innerWidth}x${innerHeight}`,
65
+ overflowX: document.documentElement.scrollWidth - document.documentElement.clientWidth,
66
+ primaryCommands: all.filter(el => el.matches('button, a') && getComputedStyle(el).backgroundColor === primary).map(words),
67
+ focalCandidates: texts.map(el => ({ el, size: parseFloat(getComputedStyle(el).fontSize) })).sort((a, b) => b.size - a.size).slice(0, 3).map(({ el, size }) => `${size}px ${words(el)} @${Math.round(el.getBoundingClientRect().top + scrollY)}`),
68
+ textStyles: [...counts].sort((a, b) => b[1] - a[1]).map(([key, count]) => `${key} ×${count}`),
69
+ regions,
70
+ };
71
+ })()
72
+ ```
73
+
74
+ The census lists signals, not verdicts. The application shell's frame (any frame
75
+ containing the page `h1`) is excluded. Frames are bordered regions at least
76
+ 160×64px, so tables, cards and drawers appear. A surface without a border is not
77
+ listed: judge it in the image.
78
+
79
+ ## Write findings
80
+
81
+ One finding per problem, most severe first:
82
+
83
+ ```text
84
+ [criterion #] <where: route, region, width/theme>
85
+ Seen: <what the screenshot or census shows>
86
+ Why it matters: <the user's decision or reading it harms>
87
+ Fix: <owner and prop, or the content to remove or move>
88
+ ```
89
+
90
+ A finding names the owner that should change. "Looks cluttered" is not a
91
+ finding; "Purchased goods uses 9 text levels at 1440, so quantity, SKU and
92
+ location compete with the product name" is.
93
+
94
+ ## Report the score
95
+
96
+ State the score per criterion, with the measurement behind each 1 or 0, for
97
+ every width and theme inspected. Say which states were not rendered: an
98
+ unrendered state is unverified, not passed.