themelia-react-ui 2.0.4 → 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 (588) hide show
  1. package/CHANGELOG.md +135 -0
  2. package/README.md +113 -18
  3. package/dist/{accordion-96o0pN62.js → accordion-B9MHG0cT.js} +11 -11
  4. package/dist/accordion-B9MHG0cT.js.map +1 -0
  5. package/dist/{action-menu-CHgs8vmj.js → action-menu-Dr8K-ghE.js} +48 -45
  6. package/dist/action-menu-Dr8K-ghE.js.map +1 -0
  7. package/dist/{affordance-geometry.generated-B8yGOr8-.js → affordance-geometry.generated-P-aVJisu.js} +36 -36
  8. package/dist/affordance-geometry.generated-P-aVJisu.js.map +1 -0
  9. package/dist/{ai-artifact-BZUGwBq6.js → ai-artifact-C58tQcBy.js} +210 -174
  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-DkoqHPPl.js → attachment-Dg_69lPS.js} +9 -9
  14. package/dist/{attachment-DkoqHPPl.js.map → attachment-Dg_69lPS.js.map} +1 -1
  15. package/dist/{auth-D2FVZ1MH.js → auth-DTkkshS8.js} +43 -46
  16. package/dist/auth-DTkkshS8.js.map +1 -0
  17. package/dist/{avatar-DWO_HHhB.js → avatar-CeZaFmNH.js} +8 -8
  18. package/dist/avatar-CeZaFmNH.js.map +1 -0
  19. package/dist/{badge-DErMA7ul.js → badge-xIiV_E7f.js} +5 -5
  20. package/dist/{badge-DErMA7ul.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 +2 -2
  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-CdfIkCsV.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 +21 -21
  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 +325 -306
  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 +1259 -1184
  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-B-WFKecD.js → breadcrumbs-J-K2kl4c.js} +6 -6
  86. package/dist/{breadcrumbs-B-WFKecD.js.map → breadcrumbs-J-K2kl4c.js.map} +1 -1
  87. package/dist/{button-DkmK-z8E.js → button-S2Cubiiz.js} +3 -3
  88. package/dist/button-S2Cubiiz.js.map +1 -0
  89. package/dist/{buttons-BbfzgczK.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-CzYUTPeJ.js → checkbox-fflqmODR.js} +2 -2
  98. package/dist/{checkbox-CzYUTPeJ.js.map → checkbox-fflqmODR.js.map} +1 -1
  99. package/dist/{choice-inputs-JLtij2y4.js → choice-inputs-zUgBZfE4.js} +258 -257
  100. package/dist/choice-inputs-zUgBZfE4.js.map +1 -0
  101. package/dist/{code-block-CGNaUtAE.js → code-block-BzmM9Eig.js} +8 -8
  102. package/dist/code-block-BzmM9Eig.js.map +1 -0
  103. package/dist/{collapsible-Do4G0zcC.js → collapsible-BkAI_XD4.js} +5 -5
  104. package/dist/{collapsible-Do4G0zcC.js.map → collapsible-BkAI_XD4.js.map} +1 -1
  105. package/dist/{collection-content-C0e8SsTm.js → collection-content-gDh1v6O4.js} +3 -3
  106. package/dist/{collection-content-C0e8SsTm.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-CBJDs6w_.js → combobox-BwzoXFSG.js} +254 -247
  110. package/dist/combobox-BwzoXFSG.js.map +1 -0
  111. package/dist/{command-D8NrBj-b.js → command-CrlPIL6m.js} +11 -11
  112. package/dist/command-CrlPIL6m.js.map +1 -0
  113. package/dist/{comments-Di4w0H_S.js → comments-Dmpp0YIc.js} +29 -29
  114. package/dist/{comments-Di4w0H_S.js.map → comments-Dmpp0YIc.js.map} +1 -1
  115. package/dist/components/base/action-menu/action-menu.d.ts +7 -1
  116. package/dist/components/base/buttons/button-group.recipes.d.ts +2 -2
  117. package/dist/components/base/cards/card.recipes.d.ts +6 -4
  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 +3 -4
  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/choice-types.d.ts +1 -1
  124. package/dist/components/base/combobox/index.d.ts +4 -2
  125. package/dist/components/base/feedback/alert.d.ts +1 -1
  126. package/dist/components/base/forms/form-sizing.d.ts +7 -7
  127. package/dist/components/base/forms/workflow.d.ts +7 -1
  128. package/dist/components/base/forms-numeric/coordinates-input.d.ts +4 -0
  129. package/dist/components/base/metadata-list/metadata-list.d.ts +1 -1
  130. package/dist/components/base/navigation/dropdown-menu.d.ts +1 -1
  131. package/dist/components/base/navigation/page-header/page-header-commands.d.ts +14 -7
  132. package/dist/components/base/navigation/page-header/page-header.d.ts +10 -3
  133. package/dist/components/base/popover/popover.d.ts +3 -3
  134. package/dist/components/base/popover/popover.recipes.d.ts +10 -6
  135. package/dist/components/base/sheet/sheet.d.ts +2 -0
  136. package/dist/components/base/sidebar/index.d.ts +1 -1
  137. package/dist/components/base/sidebar/sidebar.d.ts +27 -5
  138. package/dist/components/base/toaster/index.d.ts +1 -0
  139. package/dist/components/blocks/ai/ai-file-tree/types.d.ts +1 -1
  140. package/dist/components/blocks/ai/ai-tool-call/types.d.ts +3 -1
  141. package/dist/components/blocks/ai/ai.strings.d.ts +2 -0
  142. package/dist/components/blocks/analytics/metric-comparison/metric-comparison.d.ts +2 -0
  143. package/dist/components/blocks/analytics/usage-card/usage-card.strings.d.ts +2 -0
  144. package/dist/components/blocks/commerce/cart-summary/cart-summary.d.ts +1 -1
  145. package/dist/components/blocks/commerce/cart-summary/types.d.ts +3 -1
  146. package/dist/components/blocks/commerce/discount-stack/discount-stack.d.ts +1 -1
  147. package/dist/components/blocks/commerce/discount-stack/types.d.ts +3 -1
  148. package/dist/components/blocks/commerce/fulfillment-group/fulfillment-group.d.ts +1 -1
  149. package/dist/components/blocks/commerce/fulfillment-group/types.d.ts +11 -2
  150. package/dist/components/blocks/commerce/index.d.ts +7 -6
  151. package/dist/components/blocks/commerce/inventory-section/inventory-section.d.ts +1 -1
  152. package/dist/components/blocks/commerce/inventory-section/types.d.ts +7 -2
  153. package/dist/components/blocks/commerce/invoice-header/index.d.ts +2 -1
  154. package/dist/components/blocks/commerce/invoice-header/invoice-header.d.ts +1 -1
  155. package/dist/components/blocks/commerce/invoice-header/types.d.ts +20 -6
  156. package/dist/components/blocks/commerce/invoice-line-items/invoice-line-items.d.ts +1 -1
  157. package/dist/components/blocks/commerce/invoice-line-items/types.d.ts +24 -7
  158. package/dist/components/blocks/commerce/invoice-mini/index.d.ts +2 -1
  159. package/dist/components/blocks/commerce/invoice-mini/types.d.ts +7 -1
  160. package/dist/components/blocks/commerce/order-customer/order-customer.d.ts +1 -1
  161. package/dist/components/blocks/commerce/order-customer/types.d.ts +9 -1
  162. package/dist/components/blocks/commerce/refund-status/refund-status.d.ts +1 -1
  163. package/dist/components/blocks/commerce/refund-status/types.d.ts +3 -1
  164. package/dist/components/blocks/commerce/shipment-tracking/shipment-tracking.d.ts +1 -1
  165. package/dist/components/blocks/commerce/shipment-tracking/types.d.ts +3 -1
  166. package/dist/components/blocks/commerce/tax-breakdown/tax-breakdown.d.ts +1 -1
  167. package/dist/components/blocks/commerce/tax-breakdown/types.d.ts +3 -1
  168. package/dist/components/features/activities/activities.types.d.ts +8 -2
  169. package/dist/components/features/activities/partials/activity-marker.d.ts +7 -3
  170. package/dist/components/features/activities/partials/activity-row.d.ts +24 -0
  171. package/dist/components/features/event-calendar/colors.d.ts +2 -2
  172. package/dist/components/features/event-calendar/event-calendar.types.d.ts +4 -0
  173. package/dist/components/features/filters/facets/select-facet.d.ts +2 -1
  174. package/dist/components/features/filters/filters.strings.d.ts +4 -0
  175. package/dist/components/features/filters/filters.types.d.ts +3 -0
  176. package/dist/components/features/filters/partials/filter-editor-header.d.ts +16 -0
  177. package/dist/components/features/filters/partials/filter-popover-content.d.ts +1 -1
  178. package/dist/components/features/filters/partials/nested-filter-options.d.ts +21 -0
  179. package/dist/components/features/filters/partials/regular-filter-content.d.ts +2 -1
  180. package/dist/components/features/filters/utils/filter-utils.d.ts +21 -3
  181. package/dist/components/features/global-search/global-search.types.d.ts +2 -0
  182. package/dist/components/features/global-search/partials/global-search-input.d.ts +10 -0
  183. package/dist/components/features/global-search/partials/global-search-result-row.d.ts +7 -1
  184. package/dist/components/features/media-library/media-library.strings.d.ts +2 -0
  185. package/dist/components/features/media-library/media-library.types.d.ts +14 -4
  186. package/dist/components/features/media-library/partials/media-library-partials.d.ts +1 -1
  187. package/dist/components/features/products/components/product-options-matrix.d.ts +1 -1
  188. package/dist/components/features/products/components/product-variant-editor.d.ts +1 -1
  189. package/dist/components/features/products/components/product-variants-manager.d.ts +1 -1
  190. package/dist/components/features/products/products.strings.d.ts +9 -1
  191. package/dist/components/features/products/products.types.d.ts +43 -6
  192. package/dist/components/features/resource/resource.d.ts +5 -1
  193. package/dist/components/features/resource/resource.types.d.ts +12 -1
  194. package/dist/components/features/rich-text-editor/partials/image-uploads.d.ts +1 -1
  195. package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +12 -2
  196. package/dist/components/features/table/partials/resource-cell.d.ts +22 -5
  197. package/dist/components/features/table/table.types.d.ts +1 -1
  198. package/dist/components/layout/app-shell/app-shell.types.d.ts +35 -6
  199. package/dist/components/layout/app-shell/index.d.ts +1 -1
  200. package/dist/components/layout/app-shell/shell-regions.d.ts +27 -0
  201. package/dist/components/layout/app-shell/sidebar-inset-layout.d.ts +1 -1
  202. package/dist/components/layout/app-shell/stacked-layout.d.ts +1 -1
  203. package/dist/components/layout/app-shell/topbar-sidebar-layout.d.ts +1 -1
  204. package/dist/components/layout/containers/two-column-layout.d.ts +2 -0
  205. package/dist/components/layout/header/header.recipes.d.ts +6 -0
  206. package/dist/components/layout/header/header.types.d.ts +6 -6
  207. package/dist/components/layout/navigation/section-nav/section-nav.d.ts +5 -0
  208. package/dist/components/layout/page/index.d.ts +2 -1
  209. package/dist/components/layout/page/page.d.ts +1 -0
  210. package/dist/components/layout/page/page.strings.d.ts +11 -0
  211. package/dist/components/layout/page/page.types.d.ts +69 -17
  212. package/dist/components/layout/page/partials/page-header.d.ts +1 -1
  213. package/dist/components/layout/settings/settings.d.ts +9 -2
  214. package/dist/components/layout/sidebar/app-sidebar.d.ts +1 -1
  215. package/dist/components/layout/sidebar/components/sidebar-grouped-navigation.d.ts +1 -1
  216. package/dist/components/layout/sidebar/components/sidebar-navigation.d.ts +1 -1
  217. package/dist/components/layout/sidebar/index.d.ts +2 -1
  218. package/dist/components/layout/sidebar/sidebar-navigation-rail.d.ts +36 -0
  219. package/dist/components/layout/sidebar/sidebar.context.d.ts +5 -7
  220. package/dist/components/layout/sidebar/sidebar.types.d.ts +48 -10
  221. package/dist/components/layout/sidebar/sidebar.utils.d.ts +9 -1
  222. package/dist/components/layout/workspace/workspace.types.d.ts +8 -1
  223. package/dist/components/ui/alert-dialog.d.ts +2 -2
  224. package/dist/components/ui/combobox.d.ts +1 -1
  225. package/dist/components/ui/dialog.d.ts +2 -2
  226. package/dist/components/ui/overlay-layer.d.ts +18 -0
  227. package/dist/components/ui/sheet.d.ts +5 -1
  228. package/dist/components/ui/sidebar-state.d.ts +82 -0
  229. package/dist/components/ui/sidebar.d.ts +5 -17
  230. package/dist/{containers-CRmHf7GP.js → containers-CIxwbZt5.js} +26 -18
  231. package/dist/containers-CIxwbZt5.js.map +1 -0
  232. package/dist/{control-group-recipes-DBXmfh2E.js → control-group-recipes-fMuFo0H7.js} +6 -6
  233. package/dist/control-group-recipes-fMuFo0H7.js.map +1 -0
  234. package/dist/{copyable-CnGCZdX4.js → copyable-DIznBqiT.js} +7 -7
  235. package/dist/{copyable-CnGCZdX4.js.map → copyable-DIznBqiT.js.map} +1 -1
  236. package/dist/{data-display-D4oujtx0.js → data-display-BdgCAw8T.js} +268 -277
  237. package/dist/data-display-BdgCAw8T.js.map +1 -0
  238. package/dist/{date-Q7jnXxpk.js → date-Cq8ioE4o.js} +5 -5
  239. package/dist/{date-Q7jnXxpk.js.map → date-Cq8ioE4o.js.map} +1 -1
  240. package/dist/{date-picker-zOt1oNss.js → date-picker-RlIzKom_.js} +446 -437
  241. package/dist/date-picker-RlIzKom_.js.map +1 -0
  242. package/dist/{date-pickers-cj8IXbDC.js → date-pickers-DY-CpXS1.js} +12 -12
  243. package/dist/{date-pickers-cj8IXbDC.js.map → date-pickers-DY-CpXS1.js.map} +1 -1
  244. package/dist/{display-BB4BL_-K.js → display-KsZLw9Ov.js} +9 -9
  245. package/dist/{display-BB4BL_-K.js.map → display-KsZLw9Ov.js.map} +1 -1
  246. package/dist/dropdown-menu-CLs8Lihj.js +194 -0
  247. package/dist/dropdown-menu-CLs8Lihj.js.map +1 -0
  248. package/dist/features/activities.js +302 -253
  249. package/dist/features/activities.js.map +1 -1
  250. package/dist/features/ai-chat.js +15 -14
  251. package/dist/features/ai-chat.js.map +1 -1
  252. package/dist/features/appointment-calendar.js +22 -22
  253. package/dist/features/appointment-calendar.js.map +1 -1
  254. package/dist/features/async-preview.js +11 -10
  255. package/dist/features/async-preview.js.map +1 -1
  256. package/dist/features/combobox.js +1 -1
  257. package/dist/features/comments.js +1 -1
  258. package/dist/features/data-view.js +13 -13
  259. package/dist/features/data-view.js.map +1 -1
  260. package/dist/features/email-composer.js +237 -238
  261. package/dist/features/email-composer.js.map +1 -1
  262. package/dist/features/event-calendar.js +140 -146
  263. package/dist/features/event-calendar.js.map +1 -1
  264. package/dist/features/filters.js +1 -1
  265. package/dist/features/global-search.js +167 -138
  266. package/dist/features/global-search.js.map +1 -1
  267. package/dist/features/kanban.js +6 -7
  268. package/dist/features/kanban.js.map +1 -1
  269. package/dist/features/map.js +269 -260
  270. package/dist/features/map.js.map +1 -1
  271. package/dist/features/media-library.js +375 -326
  272. package/dist/features/media-library.js.map +1 -1
  273. package/dist/features/mentions.js +1 -1
  274. package/dist/features/overlays.js +1 -1
  275. package/dist/features/products.js +1266 -1193
  276. package/dist/features/products.js.map +1 -1
  277. package/dist/features/questionnaire.js +13 -13
  278. package/dist/features/questionnaire.js.map +1 -1
  279. package/dist/features/resource-assignment.js +8 -8
  280. package/dist/features/resource.js +69 -66
  281. package/dist/features/resource.js.map +1 -1
  282. package/dist/features/rich-text-editor.js +2 -2
  283. package/dist/features/schema-form.js +13 -13
  284. package/dist/features/suggestions.js +3 -3
  285. package/dist/features/sync.js +3 -3
  286. package/dist/features/table.js +1 -1
  287. package/dist/features/theme-tweaker.js +94 -95
  288. package/dist/features/theme-tweaker.js.map +1 -1
  289. package/dist/{feedback-DZNL5Lg1.js → feedback-Dm4izqFn.js} +80 -79
  290. package/dist/feedback-Dm4izqFn.js.map +1 -0
  291. package/dist/{field-affordance-recipes-DjwGx8eM.js → field-affordance-recipes-DWcNcOjh.js} +4 -4
  292. package/dist/field-affordance-recipes-DWcNcOjh.js.map +1 -0
  293. package/dist/{filters-BcT-uoFy.js → filters-DzgSJpMK.js} +693 -645
  294. package/dist/filters-DzgSJpMK.js.map +1 -0
  295. package/dist/{form-field-CsgRmdit.js → form-field-BriWAXyg.js} +6 -6
  296. package/dist/{form-field-CsgRmdit.js.map → form-field-BriWAXyg.js.map} +1 -1
  297. package/dist/{form-sizing-NXgjkmBG.js → form-sizing-Bs2qFUeE.js} +4 -4
  298. package/dist/form-sizing-Bs2qFUeE.js.map +1 -0
  299. package/dist/{forms-BV5m5aQF.js → forms-C0RGnJTe.js} +17 -13
  300. package/dist/forms-C0RGnJTe.js.map +1 -0
  301. package/dist/{forms-numeric-Cd33AKbD.js → forms-numeric-DIhghX1Q.js} +86 -82
  302. package/dist/forms-numeric-DIhghX1Q.js.map +1 -0
  303. package/dist/{header-BA697l4a.js → header-DMMxG__r.js} +67 -63
  304. package/dist/header-DMMxG__r.js.map +1 -0
  305. package/dist/header.recipes-BigdJjw1.js +6 -0
  306. package/dist/header.recipes-BigdJjw1.js.map +1 -0
  307. package/dist/{hooks-BQ-L7Uu2.js → hooks-DB6CJ4MR.js} +26 -14
  308. package/dist/hooks-DB6CJ4MR.js.map +1 -0
  309. package/dist/{icon-badge-COWbCCWu.js → icon-badge-DZF-YjQp.js} +4 -4
  310. package/dist/{icon-badge-COWbCCWu.js.map → icon-badge-DZF-YjQp.js.map} +1 -1
  311. package/dist/index.js +4 -5
  312. package/dist/{input-Cdw4k0fb.js → input-CvyDQlY7.js} +8 -8
  313. package/dist/{input-Cdw4k0fb.js.map → input-CvyDQlY7.js.map} +1 -1
  314. package/dist/input-DMBwAZmr.js +21 -0
  315. package/dist/input-DMBwAZmr.js.map +1 -0
  316. package/dist/{item-BvZ2DR_x.js → item-DjCcM18E.js} +16 -16
  317. package/dist/item-DjCcM18E.js.map +1 -0
  318. package/dist/layout/app-shell.js +1 -1
  319. package/dist/layout/auth.js +1 -1
  320. package/dist/layout/containers.js +1 -1
  321. package/dist/layout/header.js +1 -1
  322. package/dist/layout/hooks.js +1 -1
  323. package/dist/layout/navigation.js +1 -1
  324. package/dist/layout/page.js +2 -2
  325. package/dist/layout/settings.js +1 -1
  326. package/dist/layout/sidebar.js +3 -3
  327. package/dist/layout/workspace.js +1 -1
  328. package/dist/layout.js +11 -11
  329. package/dist/lib/affordance-geometry.generated.d.ts +35 -35
  330. package/dist/lib/control-group-recipes.d.ts +5 -5
  331. package/dist/lib/field-affordance-recipes.d.ts +2 -2
  332. package/dist/lib/motion-recipes.d.ts +3 -0
  333. package/dist/lib/navigation-row-recipes.d.ts +7 -7
  334. package/dist/lib/overlay-anatomy-recipes.d.ts +3 -3
  335. package/dist/lib/portal-recipes.d.ts +3 -0
  336. package/dist/lib/token-merge.generated.d.ts +13 -10
  337. package/dist/lib/utils.js +1 -1
  338. package/dist/map-demo-tile.svg +1 -1
  339. package/dist/{media-gallery-CSl5W1Fy.js → media-gallery-C-vChPmE.js} +6 -6
  340. package/dist/{media-gallery-CSl5W1Fy.js.map → media-gallery-C-vChPmE.js.map} +1 -1
  341. package/dist/{mentions-RKOQaaIB.js → mentions-0_4nWuI-.js} +10 -10
  342. package/dist/{mentions-RKOQaaIB.js.map → mentions-0_4nWuI-.js.map} +1 -1
  343. package/dist/{message-INU2xsxu.js → message-g8p7eVtN.js} +7 -7
  344. package/dist/message-g8p7eVtN.js.map +1 -0
  345. package/dist/{metadata-list-qVV7AVxa.js → metadata-list-C3MkU-Om.js} +64 -64
  346. package/dist/metadata-list-C3MkU-Om.js.map +1 -0
  347. package/dist/{motion-recipes-ChBg4HBq.js → motion-recipes-DitYv6P2.js} +10 -2
  348. package/dist/motion-recipes-DitYv6P2.js.map +1 -0
  349. package/dist/navigation-C90-oQFq.js +255 -0
  350. package/dist/navigation-C90-oQFq.js.map +1 -0
  351. package/dist/{navigation-BQNcg1jT.js → navigation-DaRjthVk.js} +101 -82
  352. package/dist/navigation-DaRjthVk.js.map +1 -0
  353. package/dist/{navigation-row-recipes-WZEs-hYo.js → navigation-row-recipes-BGVLvU_O.js} +9 -9
  354. package/dist/navigation-row-recipes-BGVLvU_O.js.map +1 -0
  355. package/dist/{number-E_OiIfJz.js → number-CRU3kGuk.js} +5 -5
  356. package/dist/{number-E_OiIfJz.js.map → number-CRU3kGuk.js.map} +1 -1
  357. package/dist/overflow-tab-bar-IVFVQFV6.js +172 -0
  358. package/dist/overflow-tab-bar-IVFVQFV6.js.map +1 -0
  359. package/dist/overlays-BSgCtM2v.js +1013 -0
  360. package/dist/overlays-BSgCtM2v.js.map +1 -0
  361. package/dist/page-DUUKDAjo.js +331 -0
  362. package/dist/page-DUUKDAjo.js.map +1 -0
  363. package/dist/page-header-commands-7P3sfE9u.js +193 -0
  364. package/dist/page-header-commands-7P3sfE9u.js.map +1 -0
  365. package/dist/{pagination-Ch8X_47u.js → pagination-CgCjElfu.js} +7 -7
  366. package/dist/{pagination-Ch8X_47u.js.map → pagination-CgCjElfu.js.map} +1 -1
  367. package/dist/popover-B85RenIl.js +201 -0
  368. package/dist/popover-B85RenIl.js.map +1 -0
  369. package/dist/{popover-menu-BYaCdFhf.js → popover-menu-DlnQ2zlR.js} +7 -7
  370. package/dist/{popover-menu-BYaCdFhf.js.map → popover-menu-DlnQ2zlR.js.map} +1 -1
  371. package/dist/{popover.recipes-D3j8R8Yp.js → popover.recipes-DdiEp0rd.js} +18 -11
  372. package/dist/popover.recipes-DdiEp0rd.js.map +1 -0
  373. package/dist/portal-recipes-BpsV_iRw.js +9 -0
  374. package/dist/portal-recipes-BpsV_iRw.js.map +1 -0
  375. package/dist/{primitives-Du64iDbb.js → primitives-ByWgGUgt.js} +5 -5
  376. package/dist/{primitives-Du64iDbb.js.map → primitives-ByWgGUgt.js.map} +1 -1
  377. package/dist/primitives.js +4 -4
  378. package/dist/{progress-BvF2oCdV.js → progress-BJhQP9WX.js} +9 -9
  379. package/dist/{progress-BvF2oCdV.js.map → progress-BJhQP9WX.js.map} +1 -1
  380. package/dist/{receipt-D789Jwyy.js → receipt-tOc7B3hw.js} +7 -7
  381. package/dist/receipt-tOc7B3hw.js.map +1 -0
  382. package/dist/{rich-text-CLJEf76s.js → rich-text-Dth5E882.js} +3 -3
  383. package/dist/{rich-text-CLJEf76s.js.map → rich-text-Dth5E882.js.map} +1 -1
  384. package/dist/{rich-text-editor-Cm1dpUpQ.js → rich-text-editor-C1fOjBTd.js} +429 -430
  385. package/dist/rich-text-editor-C1fOjBTd.js.map +1 -0
  386. package/dist/{rich-text-editor-toolbar-L__e4x47.js → rich-text-editor-toolbar-laT3tpBT.js} +32 -28
  387. package/dist/rich-text-editor-toolbar-laT3tpBT.js.map +1 -0
  388. package/dist/{scroll-area-La5RXsEk.js → scroll-area-B0dB2cBi.js} +2 -2
  389. package/dist/{scroll-area-La5RXsEk.js.map → scroll-area-B0dB2cBi.js.map} +1 -1
  390. package/dist/{separator-DAEV0w65.js → separator-Bb17I4pu.js} +2 -2
  391. package/dist/{separator-DAEV0w65.js.map → separator-Bb17I4pu.js.map} +1 -1
  392. package/dist/{separator-GNfPG-90.js → separator-Ct_WSWTJ.js} +3 -3
  393. package/dist/{separator-GNfPG-90.js.map → separator-Ct_WSWTJ.js.map} +1 -1
  394. package/dist/services/actions.js +1 -1
  395. package/dist/{settings-BA2iboic.js → settings-Bar5wiSo.js} +31 -38
  396. package/dist/settings-Bar5wiSo.js.map +1 -0
  397. package/dist/sheet-BGPERY55.js +250 -0
  398. package/dist/sheet-BGPERY55.js.map +1 -0
  399. package/dist/sidebar-D-JYMMbY.js +686 -0
  400. package/dist/sidebar-D-JYMMbY.js.map +1 -0
  401. package/dist/sidebar-f9gRWXIR.js +1001 -0
  402. package/dist/sidebar-f9gRWXIR.js.map +1 -0
  403. package/dist/skeleton-BapcJd9C.js +265 -0
  404. package/dist/skeleton-BapcJd9C.js.map +1 -0
  405. package/dist/smart-card-CW0hjetE.js +617 -0
  406. package/dist/smart-card-CW0hjetE.js.map +1 -0
  407. package/dist/{structure-C0V0_Fyf.js → structure-DuxKl954.js} +2 -2
  408. package/dist/{structure-C0V0_Fyf.js.map → structure-DuxKl954.js.map} +1 -1
  409. package/dist/style.css +1 -1
  410. package/dist/{table-CpvnzJn9.js → table-B4TE7iOV.js} +3 -3
  411. package/dist/{table-CpvnzJn9.js.map → table-B4TE7iOV.js.map} +1 -1
  412. package/dist/{table-DH7rozUv.js → table-CFOWY9pQ.js} +394 -388
  413. package/dist/table-CFOWY9pQ.js.map +1 -0
  414. package/dist/{tabs-eqVsJZWO.js → tabs-e7ko9S2o.js} +11 -11
  415. package/dist/tabs-e7ko9S2o.js.map +1 -0
  416. package/dist/{text-inputs-DXItiR0O.js → text-inputs-B1culiSK.js} +17 -17
  417. package/dist/text-inputs-B1culiSK.js.map +1 -0
  418. package/dist/theme.css +40 -37
  419. package/dist/{timelines-DmtztAY_.js → timelines-D3Sl9ueq.js} +13 -12
  420. package/dist/timelines-D3Sl9ueq.js.map +1 -0
  421. package/dist/tooltip-8wz5S_Zr.js +113 -0
  422. package/dist/tooltip-8wz5S_Zr.js.map +1 -0
  423. package/dist/{tree-CV11PURP.js → tree-CzUJHnFs.js} +8 -8
  424. package/dist/{tree-CV11PURP.js.map → tree-CzUJHnFs.js.map} +1 -1
  425. package/dist/typography/rich-text.js +1 -1
  426. package/dist/{typography-CSyJrh28.js → typography-BQnine1k.js} +12 -12
  427. package/dist/{typography-CSyJrh28.js.map → typography-BQnine1k.js.map} +1 -1
  428. package/dist/typography.js +1 -1
  429. package/dist/ui-provider-C-74NVLc.js +178 -0
  430. package/dist/ui-provider-C-74NVLc.js.map +1 -0
  431. package/dist/ui-provider.js +2 -3
  432. package/dist/{upload-C9SA0X-8.js → upload-BOW6U2tI.js} +25 -24
  433. package/dist/upload-BOW6U2tI.js.map +1 -0
  434. package/dist/{upload-queue-DhQJiSRc.js → upload-queue-qUXn1ykN.js} +16 -14
  435. package/dist/upload-queue-qUXn1ykN.js.map +1 -0
  436. package/dist/{usage-card-DVTRDmGz.js → usage-card-BeSLY0i0.js} +24 -17
  437. package/dist/usage-card-BeSLY0i0.js.map +1 -0
  438. package/dist/{utils-CF3c95Io.js → utils-B6kKb8jB.js} +237 -141
  439. package/dist/utils-B6kKb8jB.js.map +1 -0
  440. package/dist/value-inputs-skdVB2zh.js +980 -0
  441. package/dist/value-inputs-skdVB2zh.js.map +1 -0
  442. package/dist/{value-typography-ClupF0Gz.js → value-typography-uAmWUAL1.js} +2 -2
  443. package/dist/{value-typography-ClupF0Gz.js.map → value-typography-uAmWUAL1.js.map} +1 -1
  444. package/dist/{workspace-9EFVXUyk.js → workspace-DHeHv0qw.js} +50 -49
  445. package/dist/workspace-DHeHv0qw.js.map +1 -0
  446. package/docs/consumer-skill/SKILL.md +4 -3
  447. package/docs/consumer-skill/agents/themelia-ui-designer.md +96 -0
  448. package/docs/consumer-skill/examples/app-layout.tsx +52 -1
  449. package/docs/consumer-skill/examples/commerce-lines.tsx +271 -0
  450. package/docs/consumer-skill/examples/custom-composition.tsx +21 -0
  451. package/docs/consumer-skill/examples/detail.tsx +5 -4
  452. package/docs/consumer-skill/examples/editable-sections.tsx +38 -0
  453. package/docs/consumer-skill/examples/index-table.tsx +4 -4
  454. package/docs/consumer-skill/examples/manifest.json +38 -1
  455. package/docs/consumer-skill/examples/product-media.tsx +41 -0
  456. package/docs/consumer-skill/examples/product-parts.tsx +81 -0
  457. package/docs/consumer-skill/examples/rhf-edit-page.tsx +1 -1
  458. package/docs/consumer-skill/examples/rhf-overlay-form.tsx +24 -11
  459. package/docs/consumer-skill/examples/token-domain-structure.tsx +68 -0
  460. package/docs/consumer-skill/references/agents-md.md +19 -17
  461. package/docs/consumer-skill/references/analytics.md +18 -1
  462. package/docs/consumer-skill/references/commerce-composition.md +97 -0
  463. package/docs/consumer-skill/references/component-contracts.json +7131 -1754
  464. package/docs/consumer-skill/references/composition-mapping.md +17 -3
  465. package/docs/consumer-skill/references/composition.md +159 -31
  466. package/docs/consumer-skill/references/critique-rubric.md +98 -0
  467. package/docs/consumer-skill/references/custom-composition.md +261 -0
  468. package/docs/consumer-skill/references/data-reading.md +79 -0
  469. package/docs/consumer-skill/references/design-contract.md +11 -9
  470. package/docs/consumer-skill/references/discovery.md +27 -3
  471. package/docs/consumer-skill/references/domain-structures.md +124 -0
  472. package/docs/consumer-skill/references/installation.md +15 -4
  473. package/docs/consumer-skill/references/integration.md +35 -0
  474. package/docs/consumer-skill/references/product-composition.md +94 -0
  475. package/docs/consumer-skill/references/public-api.json +2881 -420
  476. package/docs/consumer-skill/references/review.md +39 -2
  477. package/docs/consumer-skill/references/rhf-workflows.md +7 -0
  478. package/docs/consumer-skill/references/screen-archetypes.md +19 -7
  479. package/docs/consumer-skill/references/screen-decisions.md +126 -0
  480. package/docs/consumer-skill/references/theming.md +17 -18
  481. package/docs/consumer-skill/references/tokens.json +9 -9
  482. package/docs/consumer-skill/references/view-craft.md +153 -0
  483. package/docs/consumer-skill/references/view-spec.md +73 -0
  484. package/docs/consumer-skill/references/workflows.md +7 -1
  485. package/docs/consumer-skill/scripts/composition-policy.mjs +39 -3
  486. package/docs/consumer-skill/scripts/composition-schema.mjs +1 -1
  487. package/docs/consumer-skill/scripts/composition.mjs +61 -5
  488. package/docs/consumer-skill/scripts/discovery.mjs +54 -0
  489. package/docs/consumer-skill/scripts/inspect-component.mjs +1 -1
  490. package/docs/consumer-skill/scripts/inspection.mjs +73 -18
  491. package/docs/consumer-skill/scripts/setup-skills.mjs +41 -6
  492. package/docs/consumer-skill/scripts/surface-policy.mjs +5 -5
  493. package/docs/consumer-skills/themelia-components/SKILL.md +14 -13
  494. package/docs/consumer-skills/themelia-composition/SKILL.md +16 -17
  495. package/docs/consumer-skills/themelia-design/SKILL.md +55 -0
  496. package/docs/consumer-skills/themelia-foundation/SKILL.md +2 -1
  497. package/docs/consumer-skills/themelia-tokenization/SKILL.md +24 -17
  498. package/package.json +1 -1
  499. package/dist/accordion-96o0pN62.js.map +0 -1
  500. package/dist/action-menu-CHgs8vmj.js.map +0 -1
  501. package/dist/affordance-geometry.generated-B8yGOr8-.js.map +0 -1
  502. package/dist/ai-artifact-BZUGwBq6.js.map +0 -1
  503. package/dist/app-shell-D63ATkIK.js +0 -237
  504. package/dist/app-shell-D63ATkIK.js.map +0 -1
  505. package/dist/auth-D2FVZ1MH.js.map +0 -1
  506. package/dist/avatar-DWO_HHhB.js.map +0 -1
  507. package/dist/base/cascader.js.map +0 -1
  508. package/dist/batch-action-bar-CdfIkCsV.js.map +0 -1
  509. package/dist/button-DkmK-z8E.js.map +0 -1
  510. package/dist/buttons-BbfzgczK.js.map +0 -1
  511. package/dist/cards-4JTWqvVe.js +0 -68
  512. package/dist/cards-4JTWqvVe.js.map +0 -1
  513. package/dist/chart-C19flDQb.js +0 -155
  514. package/dist/chart-C19flDQb.js.map +0 -1
  515. package/dist/choice-inputs-JLtij2y4.js.map +0 -1
  516. package/dist/code-block-CGNaUtAE.js.map +0 -1
  517. package/dist/combobox-CBJDs6w_.js.map +0 -1
  518. package/dist/combobox-hbhSS18O.js +0 -355
  519. package/dist/combobox-hbhSS18O.js.map +0 -1
  520. package/dist/command-D8NrBj-b.js.map +0 -1
  521. package/dist/containers-CRmHf7GP.js.map +0 -1
  522. package/dist/control-group-recipes-DBXmfh2E.js.map +0 -1
  523. package/dist/data-display-D4oujtx0.js.map +0 -1
  524. package/dist/date-picker-zOt1oNss.js.map +0 -1
  525. package/dist/dropdown-menu-CjY8Vt7W.js +0 -193
  526. package/dist/dropdown-menu-CjY8Vt7W.js.map +0 -1
  527. package/dist/feedback-DZNL5Lg1.js.map +0 -1
  528. package/dist/field-affordance-recipes-DjwGx8eM.js.map +0 -1
  529. package/dist/filters-BcT-uoFy.js.map +0 -1
  530. package/dist/form-sizing-NXgjkmBG.js.map +0 -1
  531. package/dist/forms-BV5m5aQF.js.map +0 -1
  532. package/dist/forms-numeric-Cd33AKbD.js.map +0 -1
  533. package/dist/header-BA697l4a.js.map +0 -1
  534. package/dist/hooks-BQ-L7Uu2.js.map +0 -1
  535. package/dist/input-DOPL5_QE.js +0 -21
  536. package/dist/input-DOPL5_QE.js.map +0 -1
  537. package/dist/item-BvZ2DR_x.js.map +0 -1
  538. package/dist/message-INU2xsxu.js.map +0 -1
  539. package/dist/metadata-list-qVV7AVxa.js.map +0 -1
  540. package/dist/motion-recipes-ChBg4HBq.js.map +0 -1
  541. package/dist/navigation-BQNcg1jT.js.map +0 -1
  542. package/dist/navigation-DLF3E1IC.js +0 -145
  543. package/dist/navigation-DLF3E1IC.js.map +0 -1
  544. package/dist/navigation-row-recipes-WZEs-hYo.js.map +0 -1
  545. package/dist/overflow-tab-bar-CrbqMteP.js +0 -284
  546. package/dist/overflow-tab-bar-CrbqMteP.js.map +0 -1
  547. package/dist/overlays-BlKynmde.js +0 -1004
  548. package/dist/overlays-BlKynmde.js.map +0 -1
  549. package/dist/page-CIwNUtGr.js +0 -227
  550. package/dist/page-CIwNUtGr.js.map +0 -1
  551. package/dist/page-header-commands-DFMlNYzN.js +0 -128
  552. package/dist/page-header-commands-DFMlNYzN.js.map +0 -1
  553. package/dist/popover-uwzX2vo7.js +0 -198
  554. package/dist/popover-uwzX2vo7.js.map +0 -1
  555. package/dist/popover.recipes-D3j8R8Yp.js.map +0 -1
  556. package/dist/receipt-D789Jwyy.js.map +0 -1
  557. package/dist/rich-text-editor-Cm1dpUpQ.js.map +0 -1
  558. package/dist/rich-text-editor-toolbar-L__e4x47.js.map +0 -1
  559. package/dist/settings-BA2iboic.js.map +0 -1
  560. package/dist/sheet-DoAxTb2J.js +0 -213
  561. package/dist/sheet-DoAxTb2J.js.map +0 -1
  562. package/dist/sidebar-ByqKR_W5.js +0 -512
  563. package/dist/sidebar-ByqKR_W5.js.map +0 -1
  564. package/dist/sidebar-D2iSnGJ7.js +0 -619
  565. package/dist/sidebar-D2iSnGJ7.js.map +0 -1
  566. package/dist/skeleton-CUj8O5Bd.js +0 -264
  567. package/dist/skeleton-CUj8O5Bd.js.map +0 -1
  568. package/dist/smart-card-CqkzQsK-.js +0 -614
  569. package/dist/smart-card-CqkzQsK-.js.map +0 -1
  570. package/dist/table-DH7rozUv.js.map +0 -1
  571. package/dist/tabs-eqVsJZWO.js.map +0 -1
  572. package/dist/text-inputs-DXItiR0O.js.map +0 -1
  573. package/dist/theme-scope-BJ6eE2xt.js +0 -50
  574. package/dist/theme-scope-BJ6eE2xt.js.map +0 -1
  575. package/dist/timelines-DmtztAY_.js.map +0 -1
  576. package/dist/tooltip-B4hjKtoV.js +0 -111
  577. package/dist/tooltip-B4hjKtoV.js.map +0 -1
  578. package/dist/ui-provider-CQCuCBcy.js +0 -136
  579. package/dist/ui-provider-CQCuCBcy.js.map +0 -1
  580. package/dist/upload-C9SA0X-8.js.map +0 -1
  581. package/dist/upload-queue-DhQJiSRc.js.map +0 -1
  582. package/dist/usage-card-DVTRDmGz.js.map +0 -1
  583. package/dist/use-mobile-vaLKwgyf.js +0 -15
  584. package/dist/use-mobile-vaLKwgyf.js.map +0 -1
  585. package/dist/utils-CF3c95Io.js.map +0 -1
  586. package/dist/value-inputs-C0o70p-U.js +0 -980
  587. package/dist/value-inputs-C0o70p-U.js.map +0 -1
  588. package/dist/workspace-9EFVXUyk.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { Button } from 'themelia-react-ui/base/buttons';
2
- import { Card } from 'themelia-react-ui/base/cards';
2
+ import { Page } from 'themelia-react-ui/layout/page';
3
3
  import { Stack } from 'themelia-react-ui/base/structure';
4
4
  import { DataTable, type DataTableProps } from 'themelia-react-ui/features/table';
5
5
  import { Email, Name } from 'themelia-react-ui/primitives';
@@ -23,14 +23,14 @@ export function AccountIndex({ state, onRetry, hrefFor, onNavigate }: AccountInd
23
23
  { accessorKey: 'name', header: 'Name', cell: ({ row }) => <Name value={row.original.name} /> },
24
24
  { accessorKey: 'email', header: 'Email', cell: ({ row }) => <Email value={row.original.email} /> },
25
25
  ];
26
- return <Card title="Accounts" surface="card">
26
+ return <Page header={{ title: 'Accounts' }}>
27
27
  {state.status === 'loading' ? <Text role="status">Loading accounts…</Text> :
28
28
  state.status === 'error' ? <Stack gap="md">
29
29
  <Text role="alert" type="error">{state.message}</Text>
30
30
  <Button onClick={onRetry}>Retry loading</Button>
31
- </Stack> : <DataTable columns={columns} data={state.records} surface="flat"
31
+ </Stack> : <DataTable columns={columns} data={state.records}
32
32
  getRowId={account => account.id} enablePagination={false} showFullscreenToggle={false}
33
33
  emptyStateMessage="No accounts yet." emptyStateAction={<Button onClick={onRetry}>Refresh accounts</Button>}
34
34
  rowActions={[{ id: 'open', label: 'Open account', onClick: account => onNavigate(hrefFor(account)) }]} />}
35
- </Card>;
35
+ </Page>;
36
36
  }
@@ -1,6 +1,42 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "examples": [
4
+ {
5
+ "file": "product-parts.tsx",
6
+ "exports": ["ProductOptionDefinitions", "ProductVariantManagement", "VariantComparison", "VariantInspectionAndEditor"],
7
+ "phase": "optional",
8
+ "optionalPeers": ["@tanstack/react-table", "react-hook-form"]
9
+ },
10
+ {
11
+ "file": "product-media.tsx",
12
+ "exports": ["LocalProductImages", "AttachedProductImages", "MediaOnlyProductOverview"],
13
+ "phase": "optional",
14
+ "optionalPeers": ["@dnd-kit/core", "@dnd-kit/sortable", "@dnd-kit/utilities", "@tanstack/react-table", "react-hook-form"]
15
+ },
16
+ {
17
+ "file": "token-domain-structure.tsx",
18
+ "exports": ["AllocationByLocation", "AllocationSubjectExample"],
19
+ "phase": "basic",
20
+ "optionalPeers": []
21
+ },
22
+ {
23
+ "file": "commerce-lines.tsx",
24
+ "exports": ["SoldProductWithSummary", "CustomServiceInvoice", "OrderFulfillmentDetail", "ReceivableInvoiceDetail"],
25
+ "phase": "optional",
26
+ "optionalPeers": ["react-day-picker", "react-hook-form", "sonner"]
27
+ },
28
+ {
29
+ "file": "editable-sections.tsx",
30
+ "exports": ["EditableSections"],
31
+ "phase": "basic",
32
+ "optionalPeers": []
33
+ },
34
+ {
35
+ "file": "custom-composition.tsx",
36
+ "exports": ["AssessmentComparison"],
37
+ "phase": "basic",
38
+ "optionalPeers": []
39
+ },
4
40
  {
5
41
  "file": "website.tsx",
6
42
  "exports": [
@@ -162,7 +198,8 @@
162
198
  {
163
199
  "file": "rhf-overlay-form.tsx",
164
200
  "exports": [
165
- "RHFOverlayForm"
201
+ "RHFOverlayForm",
202
+ "RHFDialogForm"
166
203
  ],
167
204
  "phase": "optional",
168
205
  "optionalPeers": [
@@ -0,0 +1,41 @@
1
+ import { FormField } from 'themelia-react-ui/base/forms';
2
+ import { MediaGallery } from 'themelia-react-ui/base/media-gallery';
3
+ import { MediaResourceGallery, type MediaLibraryAccessors } from 'themelia-react-ui/features/media-library';
4
+ import { ProductOverview } from 'themelia-react-ui/features/products';
5
+
6
+ /** New local files remain File[]; the caller owns transfer and persistence. */
7
+ export function LocalProductImages({ files, onFilesChange }: { files: File[]; onFilesChange: (files: File[]) => void }) {
8
+ return <FormField label="New product images" hint="The first image is the cover. Drag or use the keyboard to change order.">
9
+ <MediaGallery value={files} onValueChange={onFilesChange} accept="image/*" maxFiles={6} />
10
+ </FormField>;
11
+ }
12
+
13
+ export interface ProductAsset { key: string; filename: string; url: string; altText: string; }
14
+ const accessors: MediaLibraryAccessors<ProductAsset> = {
15
+ getId: item => item.key, getName: item => item.filename, getType: () => 'image',
16
+ getSrc: item => item.url, getAlt: item => item.altText,
17
+ };
18
+
19
+ /** Existing records stay records; callbacks propose resource attachment changes. */
20
+ export function AttachedProductImages({ assets, primaryId, onAssetsChange, onPrimaryChange, onAdd }: {
21
+ assets: ProductAsset[];
22
+ primaryId?: string;
23
+ onAssetsChange: (assets: ProductAsset[]) => void;
24
+ onPrimaryChange: (id: string | undefined) => void;
25
+ onAdd?: () => void;
26
+ }) {
27
+ return <MediaResourceGallery items={assets} accessors={accessors} title="Product media" layout="grid"
28
+ primaryId={primaryId} onPrimaryChange={id => onPrimaryChange(id)} onAdd={onAdd}
29
+ onReorder={(_ids, next) => onAssetsChange(next)} onRemove={id => {
30
+ const next = assets.filter(asset => asset.key !== id);
31
+ onAssetsChange(next);
32
+ if (id === (primaryId ?? assets[0]?.key)) onPrimaryChange(next[0]?.key);
33
+ }} />;
34
+ }
35
+
36
+ /** ProductOverview owns the subject; media enters through details.media, not a top-level media prop. */
37
+ export function MediaOnlyProductOverview({ assets }: { assets: ProductAsset[] }) {
38
+ return <ProductOverview details={{ title: 'Product media', description: false,
39
+ media: <MediaResourceGallery items={assets} accessors={accessors} readOnly layout="field" />,
40
+ }} />;
41
+ }
@@ -0,0 +1,81 @@
1
+ import { useState, type ReactNode } from 'react';
2
+ import { Alert, AlertDescription } from 'themelia-react-ui/base/feedback';
3
+ import { Stack } from 'themelia-react-ui/base/structure';
4
+ import {
5
+ ProductOptionsMatrix, ProductVariantDetails, ProductVariantEditor,
6
+ ProductVariantsBulkTable, ProductVariantsManager,
7
+ type ProductOptionEditDraft, type ProductOptionGroup,
8
+ type ProductVariantEditorValues, type ProductVariantRow,
9
+ } from 'themelia-react-ui/features/products';
10
+ import { Money } from 'themelia-react-ui/primitives';
11
+
12
+ const colors: ProductOptionGroup[] = [{
13
+ id: 'color', name: 'Color', values: [{ id: 'olive', label: 'Olive' }, { id: 'natural', label: 'Natural' }],
14
+ }];
15
+ const rows: ProductVariantRow[] = [
16
+ { id: 'weekender-olive', name: 'Olive', sku: 'WEEK-OLIVE', price: '€68.00', inventory: '7 available', status: 'Active', optionValueIds: { color: 'olive' } },
17
+ { id: 'weekender-natural', name: 'Natural', sku: 'WEEK-NATURAL', price: '€68.00', inventory: '12 available', status: 'Active', optionValueIds: { color: 'natural' } },
18
+ ];
19
+
20
+ /** Local definition-editing example. Variant reconciliation is a separate app rule. */
21
+ export function ProductOptionDefinitions() {
22
+ const [groups, setGroups] = useState(colors);
23
+ const [editingId, setEditingId] = useState<string | null>(null);
24
+ return <ProductOptionsMatrix optionGroups={groups} editingOptionId={editingId}
25
+ onEditingOptionIdChange={setEditingId} showVariantToggle={false}
26
+ onSaveEditingOption={(option, draft) => {
27
+ setGroups(current => current.map(group => group.id === option.id ? { ...group, name: draft.name, values: draft.values } : group));
28
+ }} />;
29
+ }
30
+
31
+ /** Callbacks apply app-owned accepted definitions/rows; the manager does not generate business data. */
32
+ export function ProductVariantManagement({ optionGroups, variants, onSaveOption, onInspectVariant }: {
33
+ optionGroups: ProductOptionGroup[];
34
+ variants: ProductVariantRow[];
35
+ onSaveOption: (option: ProductOptionGroup, draft: ProductOptionEditDraft) => void | Promise<void>;
36
+ onInspectVariant: (variant: ProductVariantRow) => void;
37
+ }) {
38
+ const [editingId, setEditingId] = useState<string | null>(null);
39
+ return <ProductVariantsManager optionGroups={optionGroups} variants={variants}
40
+ editingOptionId={editingId} onEditingOptionIdChange={setEditingId}
41
+ onSaveEditingOption={onSaveOption}
42
+ onSelectVariant={onInspectVariant} groupByOptionId={null}
43
+ visibleColumns={['variant', 'sku', 'price', 'inventory', 'status']} selectionMode="none" cellDisplay="text" />;
44
+ }
45
+
46
+ /** A comparison can use the table independently from option-definition editing. */
47
+ export function VariantComparison({ onInspectVariant }: { onInspectVariant: (variant: ProductVariantRow) => void }) {
48
+ return <ProductVariantsBulkTable variants={rows} optionGroups={colors} groupByOptionId={null}
49
+ visibleColumns={['variant', 'sku', 'price', 'inventory', 'status']} selectionMode="none"
50
+ cellDisplay="text" onSelectVariant={onInspectVariant} />;
51
+ }
52
+
53
+ /** The caller validates/persists and returns accepted fields; a failed save keeps the editor draft. */
54
+ export function VariantInspectionAndEditor({ id, initialValue, media, detailFooter, onSave }: {
55
+ id: string;
56
+ initialValue: ProductVariantEditorValues;
57
+ media?: ReactNode;
58
+ detailFooter?: ReactNode;
59
+ onSave: (draft: ProductVariantEditorValues) => Promise<ProductVariantEditorValues>;
60
+ }) {
61
+ const [accepted, setAccepted] = useState(initialValue);
62
+ const [draft, setDraft] = useState(initialValue);
63
+ const [editing, setEditing] = useState(false);
64
+ const [error, setError] = useState('');
65
+ return <Stack gap="2xl">
66
+ <ProductVariantDetails variant={{ id, name: accepted.name || 'Variant', sku: accepted.sku,
67
+ price: accepted.price ? <Money amount={Number(accepted.price)} currency="EUR" /> : undefined,
68
+ inventory: accepted.inventory, status: accepted.status,
69
+ options: Object.values(accepted.options ?? {}).filter((value): value is string => value !== undefined),
70
+ }} media={media} footerSlot={detailFooter} onEditVariant={() => {
71
+ setDraft(accepted); setError(''); setEditing(true);
72
+ }} />
73
+ {editing && <Stack gap="xl">
74
+ {error && <Alert tone="destructive"><AlertDescription>{error}</AlertDescription></Alert>}
75
+ <ProductVariantEditor value={draft} onValueChange={setDraft}
76
+ onSubmit={async value => { const saved = await onSave(value); setAccepted(saved); setEditing(false); }}
77
+ onError={() => setError('Variant could not be saved. Your draft is kept; retry Save variant.')}
78
+ onCancel={() => setEditing(false)} />
79
+ </Stack>}
80
+ </Stack>;
81
+ }
@@ -82,7 +82,7 @@ export function RHFEditPage({ initial, onSave, onCancel }: RHFEditPageProps) {
82
82
  form.setError('root.server', { type: 'transport', message: 'Saving failed. Your draft is kept; retry Save order.' });
83
83
  } finally { lock.current = false; }
84
84
  });
85
- return <Page
85
+ return <Page maxWidth="xl"
86
86
  render={<form id={`${id}-form`} onSubmit={submit} noValidate aria-busy={isSubmitting} />}
87
87
  header={{ title: 'Edit order', description: 'Update customer, fulfillment and line items.' }}>
88
88
  {isDirty && <DirtyStateBanner title="Unsaved changes" description="Save to commit this draft, or discard to restore the last saved version." />}
@@ -5,7 +5,7 @@ import { ControlledFormField, ErrorSummary } from 'themelia-react-ui/base/forms'
5
5
  import { Input } from 'themelia-react-ui/base/text-inputs';
6
6
  import { Select, ToggleField } from 'themelia-react-ui/base/choice-inputs';
7
7
  import { Stack } from 'themelia-react-ui/base/structure';
8
- import { ActionDrawer, useOverlayVisibility } from 'themelia-react-ui/features/overlays';
8
+ import { ActionDialog, ActionDrawer, useOverlayVisibility } from 'themelia-react-ui/features/overlays';
9
9
 
10
10
  export interface CustomerDraft { name: string; email: string; segment: string; notify: boolean; }
11
11
  export interface CustomerDraftRecord extends CustomerDraft { id: string; }
@@ -21,7 +21,18 @@ export interface RHFOverlayFormProps {
21
21
  const empty: CustomerDraft = { name: '', email: '', segment: 'standard', notify: true };
22
22
 
23
23
  /** Mount with a record key if the selected customer changes while editing. */
24
- export function RHFOverlayForm({ record, onSave, onSaved }: RHFOverlayFormProps) {
24
+ export function RHFOverlayForm(props: RHFOverlayFormProps) {
25
+ const { trigger, ...surfaceProps } = useCustomerOverlayForm(props);
26
+ return <>{trigger}<ActionDrawer {...surfaceProps} /></>;
27
+ }
28
+
29
+ /** The same form/transport contract in a dialog, with its generated actions. */
30
+ export function RHFDialogForm(props: RHFOverlayFormProps) {
31
+ const { trigger, ...surfaceProps } = useCustomerOverlayForm(props);
32
+ return <>{trigger}<ActionDialog {...surfaceProps} /></>;
33
+ }
34
+
35
+ function useCustomerOverlayForm({ record, onSave, onSaved }: RHFOverlayFormProps) {
25
36
  const id = useId();
26
37
  const overlay = useOverlayVisibility();
27
38
  const lock = useRef(false);
@@ -65,12 +76,15 @@ export function RHFOverlayForm({ record, onSave, onSaved }: RHFOverlayFormProps)
65
76
  form.setError('root.server', { type: 'transport', message: 'Customer could not be saved. Your draft is kept; retry Save customer.' });
66
77
  } finally { lock.current = false; }
67
78
  });
68
- return <>
69
- <Button onClick={open}>{record ? 'Edit customer' : 'Create customer'}</Button>
70
- <ActionDrawer {...overlay.overlayProps} title={record ? 'Edit customer' : 'Create customer'}
71
- description="Update contact details and communication preferences."
72
- formId={`${id}-form`} loading={isSubmitting} strings={{ confirm: 'Save customer', loading: 'Saving customer…' }}>
73
- <form id={`${id}-form`} onSubmit={submit} noValidate aria-busy={isSubmitting}>
79
+ return {
80
+ ...overlay.overlayProps,
81
+ trigger: <Button onClick={open}>{record ? 'Edit customer' : 'Create customer'}</Button>,
82
+ title: record ? 'Edit customer' : 'Create customer',
83
+ description: 'Update contact details and communication preferences.',
84
+ formId: `${id}-form`,
85
+ loading: isSubmitting,
86
+ strings: { confirm: 'Save customer', loading: 'Saving customer…' },
87
+ children: <form id={`${id}-form`} onSubmit={submit} noValidate aria-busy={isSubmitting}>
74
88
  <Stack gap="xl">
75
89
  {summary.length > 0 && <ErrorSummary title="Customer could not be saved" errors={summary} />}
76
90
  <ControlledFormField control={form.control} name="name" label="Customer name" required rules={{ required: 'Enter a customer name.', minLength: { value: 2, message: 'Enter at least two characters.' } }}>
@@ -86,7 +100,6 @@ export function RHFOverlayForm({ record, onSave, onSaved }: RHFOverlayFormProps)
86
100
  {(field, _error, invalid) => <ToggleField label="Send account updates" name={field.name} value={field.value} controlRef={field.ref} onBlur={field.onBlur} onValueChange={value => field.onChange(value)} invalid={invalid} disabled={isSubmitting} />}
87
101
  </ControlledFormField>
88
102
  </Stack>
89
- </form>
90
- </ActionDrawer>
91
- </>;
103
+ </form>,
104
+ };
92
105
  }
@@ -0,0 +1,68 @@
1
+ import type { ReactNode } from 'react';
2
+ import { Card } from 'themelia-react-ui/base/cards';
3
+ import { Stack } from 'themelia-react-ui/base/structure';
4
+ import { Number as NumberValue } from 'themelia-react-ui/primitives';
5
+ import { Heading, Text } from 'themelia-react-ui/typography';
6
+
7
+ export interface AllocationLocation {
8
+ id: string;
9
+ name: string;
10
+ lines: { id: string; title: string; selection?: string; reserved: number }[];
11
+ }
12
+
13
+ /**
14
+ * Card-free domain content comparing reserved quantities across locations, a
15
+ * relationship no block represents. Goods that share one fulfillment status and
16
+ * location, with fulfillment commands, belong to FulfillmentGroup instead.
17
+ * Accepted quantities and allowed actions are app-owned.
18
+ */
19
+ export function AllocationByLocation({ locations, unallocated, actions }: {
20
+ locations: AllocationLocation[];
21
+ unallocated: { id: string; title: string; quantity: number }[];
22
+ actions?: ReactNode;
23
+ }) {
24
+ return <Stack gap="2xl" className="@container/allocation min-w-0">
25
+ <div className="grid min-w-0 grid-cols-1 gap-space-2xl @lg/allocation:grid-cols-2">
26
+ {locations.map(location => <Stack key={location.id} gap="md">
27
+ <Heading tag="h3" size="sm">{location.name}</Heading>
28
+ <dl className="grid min-w-0 grid-cols-[minmax(0,1fr)_auto] gap-x-space-xl gap-y-space-md">
29
+ {location.lines.map(line => <div key={line.id} className="contents">
30
+ <dt className="min-w-0"><Stack gap="dense">
31
+ <Text type="inherit" className="wrap-anywhere">{line.title}</Text>
32
+ {line.selection && <Text size="xs" type="secondary">{line.selection}</Text>}
33
+ </Stack></dt>
34
+ <dd><Text tag="span" type="secondary"><NumberValue value={line.reserved} /> reserved</Text></dd>
35
+ </div>)}
36
+ </dl>
37
+ </Stack>)}
38
+ </div>
39
+ {unallocated.length > 0 && <Stack gap="md">
40
+ <Heading tag="h3" size="sm">Awaiting allocation</Heading>
41
+ {unallocated.map(line => <Text key={line.id} type="secondary">
42
+ <NumberValue value={line.quantity} /> × {line.title}
43
+ </Text>)}
44
+ </Stack>}
45
+ {actions && <Stack direction="horizontal" gap="md" justify="end">{actions}</Stack>}
46
+ </Stack>;
47
+ }
48
+
49
+ /** The composition boundary supplies the surface; the subject adds no inset. */
50
+ export function AllocationSubjectExample() {
51
+ return <Card title="Dispatch allocation" description="Reserved goods grouped by dispatch location.">
52
+ <AllocationByLocation
53
+ locations={[
54
+ { id: 'sofia', name: 'Sofia studio', lines: [
55
+ { id: 'shirt-sofia', title: 'Linen overshirt', selection: 'Navy / M', reserved: 1 },
56
+ { id: 'mug-sofia', title: 'Stoneware mug', selection: 'Salt', reserved: 1 },
57
+ ] },
58
+ { id: 'plovdiv', name: 'Plovdiv dispatch', lines: [
59
+ { id: 'mug-plovdiv', title: 'Stoneware mug', selection: 'Salt', reserved: 1 },
60
+ ] },
61
+ ]}
62
+ unallocated={[
63
+ { id: 'mug', title: 'Stoneware mug · Salt', quantity: 1 },
64
+ { id: 'bag', title: 'Canvas bag · Olive', quantity: 1 },
65
+ ]}
66
+ />
67
+ </Card>;
68
+ }
@@ -6,30 +6,32 @@ Claude Code read; in a project that has only `CLAUDE.md`, paste it there. It
6
6
  points agents at this installed skill and states when UI work is done.
7
7
 
8
8
  ```md
9
- <!-- themelia-react-ui:start 2.0.4 -->
9
+ <!-- themelia-react-ui:start 2.0.5 -->
10
10
  ## UI built with themelia-react-ui
11
11
  Read the matching node_modules/themelia-react-ui/docs/consumer-skills/<name>/SKILL.md:
12
- themelia-components: setup, discovery, typed components/forms/workflows;
13
- themelia-tokenization: semantic themes, typography, spacing/density and portals;
14
- themelia-composition: business hierarchy, responsive screens and visual repair.
15
- They share docs/consumer-skill assets. Read installed declarations over memory.
16
- Find owners, map cooperating subjects, then inspect exact APIs:
12
+ themelia-components: setup, discovery and typed APIs/forms;
13
+ themelia-tokenization: semantic themes, visual roles and portals;
14
+ themelia-composition: data-led subjects, hierarchy, responsive regions and repair;
15
+ themelia-design: data briefs, view specs, scored critique.
16
+ Read installed declarations. Shared assets/agent: docs/consumer-skill.
17
+ Decide task, hierarchy, action priority and surface/inset owners before JSX:
18
+ node_modules/themelia-react-ui/docs/consumer-skill/references/screen-decisions.md.
19
+ Find domain owners/public parts; compare APIs before custom markup:
17
20
  node node_modules/themelia-react-ui/docs/consumer-skill/scripts/find-components.mjs <task nouns>
18
21
  node node_modules/themelia-react-ui/docs/consumer-skill/scripts/map-composition.mjs --roles
19
22
  node node_modules/themelia-react-ui/docs/consumer-skill/scripts/inspect-component.mjs <symbol> --import <exact import>
20
23
  node node_modules/themelia-react-ui/docs/consumer-skill/scripts/inspect-tokens.mjs <role or root>
21
- When using Page, it owns the route h1/gutters. Its commands use header.primaryAction
22
- (one) and ordered header.secondaryActions; destructive ones confirm with ConfirmDialog.
23
- Use header.tabs for selected/routed sections; continuous detail sections can stay in
24
- the body. Space siblings with Stack/Grid gap; write copy
25
- with Heading/Text and values with Money/Date/Number; use semantic colors; badges stay
26
- neutral unless they state status; dialogs come only from themelia-react-ui/features/overlays.
24
+ Page owns h1/gutters; commands use one header.primaryAction and ordered
25
+ header.secondaryActions. Confirm destructive commands with ConfirmDialog.
26
+ Back links/tabs are optional. Base/layout + token-backed JSX can shape domains.
27
+ Stack/Grid own gaps; Heading/Text own copy; Money/Date/Number format values.
28
+ Semantic colors; neutral badges unless status is meaningful.
29
+ Dialogs come only from themelia-react-ui/features/overlays.
27
30
  Done means: node node_modules/themelia-react-ui/docs/consumer-skill/scripts/check-composition.mjs <changed files>
28
- reports no errors (fix and re-run, at most three rounds), then the app's typecheck, lint
29
- and tests pass. Completion also requires inspected narrow/wide light/dark appearance
30
- and executed relevant interactions, including open/focus/error states. Report source,
31
- rendered and interaction evidence separately; missing proof is unverified. Give kept
32
- warnings with file:line and reason.
31
+ reports no errors (fix/re-run up to three rounds); app typecheck/lint/tests pass.
32
+ Inspect narrow/wide light/dark hierarchy/insets; execute open/focus/error interactions.
33
+ Report source, appearance and behavior separately; missing proof is unverified.
34
+ Give kept warnings with file:line and reason.
33
35
  <!-- themelia-react-ui:end -->
34
36
  ```
35
37
 
@@ -16,7 +16,7 @@ application data and never fetch or define a business metric.
16
16
  | Used/limit quotas with shares, daily values and period selection | `UsageCard` from `themelia-react-ui/blocks/analytics/usage-card` | Owns a Card and ready/loading/error/empty presentation with retry/period callbacks. No optional chart peer. |
17
17
  | One plain label/value fact | `InlineStat` from `themelia-react-ui/blocks/data-display` | Card-free; app chooses whether this subject needs a Card. |
18
18
  | Several facts about one record | `MetadataList` from `themelia-react-ui/base/metadata-list` | Card-free; value primitives own formatting. |
19
- | Caller-owned chart series | `ChartCard` from `themelia-react-ui/blocks/analytics` | Card-free chart composition; caller supplies chart content and an optional Card boundary. |
19
+ | Caller-owned chart series | `ChartCard` from `themelia-react-ui/blocks/analytics` with Recharts children | Card-free chart composition; `surface="card"` frames it. It wraps the children in `ChartContainer` with your `config`. |
20
20
 
21
21
  Start with these subject owners before constructing a Card with a number and
22
22
  supporting text. Reuse their formatting, hierarchy and relevant states when
@@ -55,6 +55,23 @@ peer even when a selected presentation hides its sparkline. Read the finder
55
55
  result's peers and installed declarations. UsageCard has a focused leaf import;
56
56
  its quota model differs from general MetricData.
57
57
 
58
+ ## Charts
59
+
60
+ There are no packaged `AreaChart` or `LineChart` components. Charts are Recharts
61
+ primitives (`AreaChart`, `BarChart`, `LineChart`, `PieChart` and their series,
62
+ from the optional `recharts` peer) inside `ChartCard`, or inside `ChartContainer`
63
+ from `themelia-react-ui/base/chart` when another owner supplies the title. Give
64
+ each series a `ChartConfig` entry whose color is a chart token such as
65
+ `var(--chart-1)` and reference it as `var(--color-<key>)` in the series, so the
66
+ chart follows the active theme. Use `ChartTooltip` with `ChartTooltipContent`
67
+ rather than a custom tooltip; its `valueFormatter` formats only the value (for
68
+ example as currency) and keeps the indicator and series label.
69
+
70
+ `MetricComparison` colours its delta by direction unless `current.trend` says
71
+ whether the movement is good: pass `trend: 'positive'` when a fall in overdue
72
+ balances or churn is the good outcome. Size the chart through the container, not fixed
73
+ pixel widths, and verify it at narrow widths.
74
+
58
75
  ## Usage, facts and verification
59
76
 
60
77
  For `UsageCard` period/loading/error/retry and quota meaning, read
@@ -0,0 +1,97 @@
1
+ # Order and invoice composition capability map
2
+
3
+ Compare an order, fulfillment, invoice or receivable screen with these public
4
+ owners before writing JSX. They present application data: totals, taxes,
5
+ balances, allocation rules and permitted commands stay app-owned. A relationship
6
+ none of them represents, such as reserved stock compared across warehouses, is
7
+ still a normal [domain structure](domain-structures.md). Inspect the exact
8
+ props with `inspect-component.mjs` before relying on a slot or surface value.
9
+
10
+ ## Canonical imports
11
+
12
+ Every owner below imports from `themelia-react-ui/blocks/commerce`. Other
13
+ families keep their published spelling: `base/cards`, `base/buttons`,
14
+ `base/feedback`, `base/chart` (Recharts scaffolding), `features/table`,
15
+ `features/filters`, `features/overlays` and `layout/page`. When a path misses,
16
+ `find-components.mjs` reports `importResolution` with the canonical import and,
17
+ for paths such as `blocks/commerce/order-header`, the component it names.
18
+
19
+ ## Order and fulfillment detail
20
+
21
+ | Subject | Owner | Frame |
22
+ | --- | --- | --- |
23
+ | Order number, status and commands | `Page` header (`title`, status `Badge`s in `slots.titleSuffix`, `primaryAction`, `secondaryActions`); `OrderHeader` only when Page renders no header | Page owns the h1, gutters and command row |
24
+ | Payment hold, fraud review or another standing notice | `Alert` with `AlertTitle` and `AlertDescription` from `base/feedback` | Inline notice, not a Card |
25
+ | Purchased goods and totals | A `Card` holding `OrderLineItem` rows and `SummaryPanel` with `AmountRow`, or `OrderSummary` | The Card frames both; the ledger adds no inset box |
26
+ | Goods grouped by fulfillment status and ship-from location, with their commands | `FulfillmentGroup`; a partial dispatch passes its own rows as `children` and the unit total as `count` | Framed by default; `surface="flat"` inside an existing Card |
27
+ | One parcel and its checkpoints | `ShipmentTracking` | Unframed by default; `surface="card"` on its own |
28
+ | Payment attempts, captures and refunds | `OrderTransactions` | Unframed by default; `surface="card"` on its own |
29
+ | One refund in progress | `RefundStatusCard` | Unframed by default; `surface="card"` on its own |
30
+ | Buyer, contact and addresses | `OrderCustomer` (`shippingMethod` under the shipping address); one address alone is `AddressCard` | Unframed by default; `surface="card"` in an aside |
31
+ | Order or payment history | `OrderTimeline` (it takes its own `title`) or `PaymentTimeline` (title the Card) inside a `Card` | The rails draw no frame of their own |
32
+
33
+ The [order detail recipe](../examples/commerce-lines.tsx) (`OrderFulfillmentDetail`)
34
+ composes these owners on one Page with real command callbacks: the header owns
35
+ the commands, two fulfillment groups frame themselves, and the buyer, payment
36
+ summary and transactions are aside cards.
37
+
38
+ ## Invoice and receivable detail
39
+
40
+ | Subject | Owner | Frame |
41
+ | --- | --- | --- |
42
+ | Invoice number, balance status and collection commands | `Page` header; set `maxVisibleSecondaryActions: 1` in it when long secondary labels crowd the primary command | Page owns the h1 and command row |
43
+ | The invoice document | One framed `Card` holding `InvoiceHeader` (party `details` for tax and registration IDs; omit `status` when the page header states it), `InvoiceLineItems surface="flat"` and `TaxBreakdownCard` or a `SummaryPanel` | The document Card is the only frame; its parts stay unframed |
44
+ | Settlement, payments and history | A `Card` with `SummaryPanel` and `AmountRow` (or `OrderSummary surface="card"`), `OrderTransactions surface="card"`, `PaymentTimeline` in a titled Card | One frame per subject |
45
+ | Customer and billing address | `AddressCard kind="billing"`, or `OrderCustomer showShippingAddress={false}`, with `surface="card"` | Aside subjects |
46
+
47
+ `InvoiceLineItems` paints its own framed table by default; inside the document
48
+ Card pass `surface="flat"` so its rows sit flush with the card edge. Below its
49
+ `@lg` container width each row shows the description with one `qty × price`
50
+ line and the line total; custom `columns` keep their tracks and scroll
51
+ horizontally. Mark secondary custom columns (VAT, discount, work period)
52
+ `wideOnly`: below that width their tracks drop and the description cell repeats
53
+ the values in copy marked `@lg/invoice-line-items:hidden`, so a narrow invoice
54
+ neither scrolls nor crushes the service text. Its default `taxRate` is 0.2, so pass the invoice's real rate or
55
+ custom `footerRows` with the authoritative amounts.
56
+
57
+ The [invoice detail recipe](../examples/commerce-lines.tsx) (`ReceivableInvoiceDetail`)
58
+ shows the document Card, the settlement ledger and a header that keeps one
59
+ secondary command beside `Record payment`.
60
+
61
+ Do not set `surface="flat"` on the top-level Cards of a detail page to remove
62
+ box-in-box framing: flatten the inner part instead, so every subject keeps one
63
+ clear frame.
64
+
65
+ ## Frame each subject once
66
+
67
+ Owners that default unframed and accept `surface="card"`: `AddressCard`,
68
+ `OrderCustomer`, `OrderSummary`, `OrderTransactions`, `PaymentMethod`,
69
+ `ShipmentTracking`, `TaxBreakdownCard`, `DiscountStackPreview`,
70
+ `RefundStatusCard`, `CartSummaryCard`, `InvoiceHeader` and
71
+ `InventorySectionCard`. Owners that frame themselves and accept
72
+ `surface="flat"`: `FulfillmentGroup` and `InvoiceLineItems`. An owner that
73
+ already paints a frame (`surface="card"`, or one of the self-framing pair) is
74
+ never wrapped in a second Card; unframed parts compose inside one, as in the
75
+ invoice document. Page body and aside own the gaps between subjects.
76
+
77
+ In index tables, `ResourceCell` renders order and invoice identifiers as plain
78
+ text; it draws media only for `imageUrl`, `icon` or `fallback`, and
79
+ `mediaShape="square"` keeps product photos uncropped. Status badges in app-owned
80
+ cells reuse `fulfillmentStatusTone`, `paymentStatusTone`, `transactionStatusTone`
81
+ and `invoiceStatusTone`, so a table colours states exactly as the blocks do.
82
+ `InvoiceStatus` covers `draft`, `pending`, `overdue`, `disputed` and `paid`.
83
+ Notify accepted commands with `toast` from `themelia-react-ui/base/toaster`,
84
+ the same instance its `Toaster` renders.
85
+
86
+ Line rows, totals, stock meters and progress already have owners
87
+ (`OrderLineItem`, `AmountRow`, `InventoryLevel`, `Progress`). Reach for
88
+ app-owned Tailwind only for a structure those owners do not represent, and
89
+ then on your own elements, never to restyle owner anatomy.
90
+
91
+ ## Verify
92
+
93
+ Check the order or invoice at narrow and wide widths in light and dark themes:
94
+ the line totals stay on one line, the narrow invoice rows show one quantity line
95
+ each, every subject has exactly one frame, and the header commands that do not
96
+ fit move into the More actions menu. Execute the commands (capture, refund,
97
+ reminder, payment) through their real callbacks, including failure and retry.