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,1102 @@
1
+ import { useMemo, useState } from 'react';
2
+ import {
3
+ CheckCircle2,
4
+ Mail,
5
+ Package,
6
+ RotateCcw,
7
+ Truck,
8
+ XCircle,
9
+ } from 'lucide-react';
10
+
11
+ import { ActionMenu } from 'themelia-react-ui/base/action-menu';
12
+ import { Badge } from 'themelia-react-ui/base/badge';
13
+ import { Button } from 'themelia-react-ui/base/buttons';
14
+ import { Card } from 'themelia-react-ui/base/cards';
15
+ import { Select, ToggleField } from 'themelia-react-ui/base/choice-inputs';
16
+ import { FormField, FormSection } from 'themelia-react-ui/base/forms';
17
+ import { DecimalInput } from 'themelia-react-ui/base/forms-numeric';
18
+ import {
19
+ Item,
20
+ ItemActions,
21
+ ItemContent,
22
+ ItemDescription,
23
+ ItemGroup,
24
+ ItemTitle,
25
+ } from 'themelia-react-ui/base/item';
26
+ import { Stack } from 'themelia-react-ui/base/structure';
27
+ import { Input, Textarea } from 'themelia-react-ui/base/text-inputs';
28
+ import { AddressCard, PaymentMethod } from 'themelia-react-ui/blocks/commerce';
29
+ import { MetadataList } from 'themelia-react-ui/base/metadata-list';
30
+ import { ActivityLog, type ActivityLogEntry } from 'themelia-react-ui/features/activities';
31
+ import { ActionDialog, useOverlayVisibility } from 'themelia-react-ui/features/overlays';
32
+ import { TwoColumnLayout } from 'themelia-react-ui/layout/containers';
33
+ import { Page } from 'themelia-react-ui/layout/page';
34
+ import { Money, useMoneyFormatter } from 'themelia-react-ui/primitives';
35
+ import { Text } from 'themelia-react-ui/typography';
36
+
37
+ type OrderItemFulfillmentState = 'fulfilled' | 'unfulfilled' | 'digital';
38
+
39
+ interface OrderLineItemRecord {
40
+ id: string;
41
+ name: string;
42
+ variant: string;
43
+ sku: string;
44
+ weightLabel?: string;
45
+ fulfillmentState: OrderItemFulfillmentState;
46
+ unitPrice: number;
47
+ orderedQty: number;
48
+ refundedQty: number;
49
+ canceledQty: number;
50
+ refundReason?: string;
51
+ restockedLocation?: string;
52
+ }
53
+
54
+ const INITIAL_LINE_ITEMS: OrderLineItemRecord[] = [
55
+ {
56
+ id: 'item-sweater',
57
+ name: 'Merino Wool Crewneck Sweater',
58
+ variant: 'Heather Gray / Medium',
59
+ sku: 'MWC-GRY-M',
60
+ weightLabel: '0.42 kg',
61
+ fulfillmentState: 'fulfilled',
62
+ unitPrice: 145,
63
+ orderedQty: 1,
64
+ refundedQty: 0,
65
+ canceledQty: 0,
66
+ },
67
+ {
68
+ id: 'item-shirt',
69
+ name: 'Washed Linen Oxford Shirt',
70
+ variant: 'White / Medium',
71
+ sku: 'WLO-WHT-M',
72
+ weightLabel: '0.32 kg',
73
+ fulfillmentState: 'fulfilled',
74
+ unitPrice: 95,
75
+ orderedQty: 2,
76
+ refundedQty: 0,
77
+ canceledQty: 0,
78
+ },
79
+ {
80
+ id: 'item-scarf',
81
+ name: 'Cashmere Ribbed Scarf',
82
+ variant: 'Oatmeal / One Size',
83
+ sku: 'CRS-OAT-OS',
84
+ weightLabel: '0.24 kg',
85
+ fulfillmentState: 'unfulfilled',
86
+ unitPrice: 110,
87
+ orderedQty: 1,
88
+ refundedQty: 0,
89
+ canceledQty: 0,
90
+ },
91
+ {
92
+ id: 'item-giftcard',
93
+ name: 'Oak & Loom Digital Gift Card',
94
+ variant: '50.00 USD denomination · Recipient: ava.bennett@example.com',
95
+ sku: 'DGC-50-USD',
96
+ fulfillmentState: 'digital',
97
+ unitPrice: 50,
98
+ orderedQty: 1,
99
+ refundedQty: 0,
100
+ canceledQty: 0,
101
+ },
102
+ {
103
+ id: 'item-tote',
104
+ name: 'Everyday Canvas Tote',
105
+ variant: 'Natural / One Size',
106
+ sku: 'ECT-NAT-OS',
107
+ weightLabel: '0.28 kg',
108
+ fulfillmentState: 'fulfilled',
109
+ unitPrice: 45,
110
+ orderedQty: 1,
111
+ refundedQty: 1,
112
+ canceledQty: 0,
113
+ refundReason: 'Customer exchanged size/color',
114
+ restockedLocation: 'Brooklyn Warehouse',
115
+ },
116
+ {
117
+ id: 'item-beanie',
118
+ name: 'Ribbed Merino Beanie',
119
+ variant: 'Charcoal / One Size',
120
+ sku: 'RMB-CHR-OS',
121
+ weightLabel: '0.15 kg',
122
+ fulfillmentState: 'unfulfilled',
123
+ unitPrice: 38,
124
+ orderedQty: 1,
125
+ refundedQty: 0,
126
+ canceledQty: 1,
127
+ refundReason: 'Canceled before fulfillment',
128
+ restockedLocation: 'Brooklyn Warehouse',
129
+ },
130
+ ];
131
+
132
+ const REFUND_REASONS = [
133
+ { value: 'size_exchange', label: 'Size or fit exchange' },
134
+ { value: 'customer_changed_mind', label: 'Customer changed mind' },
135
+ { value: 'damaged_in_transit', label: 'Arrived damaged' },
136
+ { value: 'wrong_item_sent', label: 'Incorrect item shipped' },
137
+ ];
138
+
139
+ const CARRIER_OPTIONS = [
140
+ { value: 'UPS Ground', label: 'UPS Ground' },
141
+ { value: 'UPS 2nd Day Air', label: 'UPS 2nd Day Air' },
142
+ { value: 'FedEx Home Delivery', label: 'FedEx Home Delivery' },
143
+ { value: 'DHL Express', label: 'DHL Express' },
144
+ ];
145
+
146
+ const INITIAL_TIMELINE: ActivityLogEntry[] = [
147
+ {
148
+ id: 'evt-refund-tote',
149
+ kind: 'event',
150
+ label: 'Refund',
151
+ actor: { name: 'Maya Lin', initials: 'ML' },
152
+ action: 'refunded',
153
+ target: '45.00 USD',
154
+ description: '1 × Everyday Canvas Tote returned to Visa •••• 4242 · Restocked at Brooklyn Warehouse',
155
+ timestamp: new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString(),
156
+ icon: RotateCcw,
157
+ tone: 'warning',
158
+ },
159
+ {
160
+ id: 'evt-shipped',
161
+ kind: 'event',
162
+ label: 'Fulfillment #1042-F1',
163
+ actor: { name: 'Brooklyn Warehouse', initials: 'BW' },
164
+ action: 'shipped 3 physical items via',
165
+ target: 'UPS Ground #1Z999AA10123456784',
166
+ timestamp: new Date(Date.now() - 18 * 60 * 60 * 1000).toISOString(),
167
+ icon: Truck,
168
+ tone: 'info',
169
+ },
170
+ {
171
+ id: 'evt-digital',
172
+ kind: 'event',
173
+ label: 'Digital #1042-D1',
174
+ actor: { name: 'Online Store', initials: 'OS' },
175
+ action: 'emailed a 50.00 USD digital gift card to',
176
+ target: 'ava.bennett@example.com',
177
+ timestamp: new Date(Date.now() - 23 * 60 * 60 * 1000).toISOString(),
178
+ icon: Mail,
179
+ tone: 'success',
180
+ },
181
+ {
182
+ id: 'evt-paid',
183
+ kind: 'event',
184
+ label: 'Payment',
185
+ actor: { name: 'Ava Bennett', initials: 'AB' },
186
+ action: 'authorized and captured',
187
+ target: '519.21 USD on Visa ending in 4242',
188
+ timestamp: new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString(),
189
+ icon: CheckCircle2,
190
+ tone: 'success',
191
+ },
192
+ ];
193
+
194
+ export function OrdersAdminTemplate() {
195
+ // Sample records are priced in USD; bind that once for every text amount.
196
+ const formatMoney = useMoneyFormatter({ currency: 'USD' });
197
+ const [lineItems, setLineItems] = useState<OrderLineItemRecord[]>(INITIAL_LINE_ITEMS);
198
+ const [timeline, setTimeline] = useState<ActivityLogEntry[]>(INITIAL_TIMELINE);
199
+ const [orderNote, setOrderNote] = useState(
200
+ 'Please leave package with the building doorman if I am not home.',
201
+ );
202
+
203
+ const [noteDraft, setNoteDraft] = useState(orderNote);
204
+ // Shipment tracking state
205
+ const [carrier, setCarrier] = useState('UPS Ground');
206
+ const [trackingNumber, setTrackingNumber] = useState('1Z999AA10123456784');
207
+ const [notifyTrackingCustomer, setNotifyTrackingCustomer] = useState(true);
208
+ const [trackingDraft, setTrackingDraft] = useState({ carrier, trackingNumber, notifyCustomer: notifyTrackingCustomer });
209
+
210
+ // Refund dialog state
211
+ const refundDialog = useOverlayVisibility();
212
+ const trackingDialog = useOverlayVisibility();
213
+ const noteDialog = useOverlayVisibility();
214
+
215
+ const [refundSelection, setRefundSelection] = useState<Record<string, number>>({
216
+ 'item-sweater': 0,
217
+ 'item-shirt': 1,
218
+ 'item-scarf': 0,
219
+ 'item-giftcard': 0,
220
+ });
221
+ const [refundReason, setRefundReason] = useState('size_exchange');
222
+ const [restockInventory, setRestockInventory] = useState(true);
223
+ const [notifyCustomer, setNotifyCustomer] = useState(true);
224
+ const [refundNote, setRefundNote] = useState('');
225
+
226
+ const fulfilledPhysicalItems = useMemo(
227
+ () =>
228
+ lineItems.filter(
229
+ (item) =>
230
+ item.fulfillmentState === 'fulfilled' &&
231
+ item.orderedQty - item.refundedQty - item.canceledQty > 0,
232
+ ),
233
+ [lineItems],
234
+ );
235
+
236
+ const unfulfilledPhysicalItems = useMemo(
237
+ () =>
238
+ lineItems.filter(
239
+ (item) =>
240
+ item.fulfillmentState === 'unfulfilled' &&
241
+ item.orderedQty - item.refundedQty - item.canceledQty > 0,
242
+ ),
243
+ [lineItems],
244
+ );
245
+
246
+ const fulfilledDigitalItems = useMemo(
247
+ () =>
248
+ lineItems.filter(
249
+ (item) =>
250
+ item.fulfillmentState === 'digital' &&
251
+ item.orderedQty - item.refundedQty - item.canceledQty > 0,
252
+ ),
253
+ [lineItems],
254
+ );
255
+
256
+ const removedItems = useMemo(
257
+ () => lineItems.filter((item) => item.refundedQty > 0 || item.canceledQty > 0),
258
+ [lineItems],
259
+ );
260
+
261
+ const activeSubtotal = useMemo(
262
+ () =>
263
+ lineItems.reduce((sum, item) => {
264
+ const activeUnits = item.orderedQty - item.canceledQty;
265
+ return sum + activeUnits * item.unitPrice;
266
+ }, 0),
267
+ [lineItems],
268
+ );
269
+
270
+ const totalRefundedAmount = useMemo(
271
+ () =>
272
+ lineItems.reduce((sum, item) => sum + item.refundedQty * item.unitPrice, 0),
273
+ [lineItems],
274
+ );
275
+
276
+ const discountAmount = 50.25;
277
+ const shippingAmount = 0;
278
+ const taxAmount = 29.46;
279
+ const originalCapturedTotal = INITIAL_LINE_ITEMS.reduce((sum, item) => sum + (item.orderedQty - item.canceledQty) * item.unitPrice, 0) - discountAmount + shippingAmount + taxAmount;
280
+ const netPayment = Math.max(0, originalCapturedTotal - totalRefundedAmount);
281
+
282
+ const draftRefundTotal = useMemo(
283
+ () =>
284
+ lineItems.reduce((sum, item) => {
285
+ const requested = refundSelection[item.id] ?? 0;
286
+ const selectedQty = Number.isFinite(requested) ? Math.min(Math.max(0, Math.floor(requested)), item.orderedQty - item.refundedQty - item.canceledQty) : 0;
287
+ return sum + selectedQty * item.unitPrice;
288
+ }, 0),
289
+ [lineItems, refundSelection],
290
+ );
291
+
292
+ const openRefundForSingleItem = (itemId: string) => {
293
+ setRefundSelection({
294
+ 'item-sweater': 0,
295
+ 'item-shirt': 0,
296
+ 'item-scarf': 0,
297
+ 'item-giftcard': 0,
298
+ [itemId]: 1,
299
+ });
300
+ refundDialog.show();
301
+ };
302
+
303
+ const handleFulfillItem = (itemId: string) => {
304
+ const targetItem = lineItems.find((item) => item.id === itemId);
305
+ if (!targetItem) return;
306
+
307
+ setLineItems((current) =>
308
+ current.map((item) =>
309
+ item.id === itemId ? { ...item, fulfillmentState: 'fulfilled' } : item,
310
+ ),
311
+ );
312
+
313
+ setTimeline((current) => [
314
+ {
315
+ id: `evt-fulfill-${Date.now()}`,
316
+ kind: 'event',
317
+ label: 'Fulfillment #1042-F1',
318
+ actor: { name: 'Maya Lin', initials: 'ML' },
319
+ action: 'fulfilled',
320
+ target: `${targetItem.orderedQty - targetItem.refundedQty - targetItem.canceledQty} × ${targetItem.name}`,
321
+ description: `Added to shipment ${carrier} #${trackingNumber}`,
322
+ timestamp: new Date().toISOString(),
323
+ icon: Package,
324
+ tone: 'success',
325
+ },
326
+ ...current,
327
+ ]);
328
+ };
329
+
330
+ const handleCancelUnfulfilledItem = (itemId: string) => {
331
+ const targetItem = lineItems.find((item) => item.id === itemId);
332
+ if (!targetItem) return;
333
+ const remainingQty =
334
+ targetItem.orderedQty - targetItem.refundedQty - targetItem.canceledQty;
335
+ if (remainingQty <= 0) return;
336
+
337
+ setLineItems((current) =>
338
+ current.map((item) =>
339
+ item.id === itemId
340
+ ? {
341
+ ...item,
342
+ canceledQty: item.canceledQty + remainingQty,
343
+ refundReason: 'Canceled before fulfillment',
344
+ restockedLocation: 'Brooklyn Warehouse',
345
+ }
346
+ : item,
347
+ ),
348
+ );
349
+
350
+ setTimeline((current) => [
351
+ {
352
+ id: `evt-cancel-${Date.now()}`,
353
+ kind: 'event',
354
+ label: 'Cancellation',
355
+ actor: { name: 'Maya Lin', initials: 'ML' },
356
+ action: 'canceled unfulfilled item',
357
+ target: `${remainingQty} × ${targetItem.name}`,
358
+ description: 'Inventory released at Brooklyn Warehouse',
359
+ timestamp: new Date().toISOString(),
360
+ icon: XCircle,
361
+ tone: 'destructive',
362
+ },
363
+ ...current,
364
+ ]);
365
+ };
366
+
367
+ const handleResendGiftCard = () => {
368
+ setTimeline((current) => [
369
+ {
370
+ id: `evt-resend-dgc-${Date.now()}`,
371
+ kind: 'event',
372
+ label: 'Digital #1042-D1',
373
+ actor: { name: 'Maya Lin', initials: 'ML' },
374
+ action: 'resent digital gift card email to',
375
+ target: 'ava.bennett@example.com',
376
+ timestamp: new Date().toISOString(),
377
+ icon: Mail,
378
+ tone: 'info',
379
+ },
380
+ ...current,
381
+ ]);
382
+ };
383
+
384
+ const handleConfirmRefund = () => {
385
+ if (draftRefundTotal <= 0) {
386
+ refundDialog.hide();
387
+ return;
388
+ }
389
+
390
+ const reasonLabel =
391
+ REFUND_REASONS.find((r) => r.value === refundReason)?.label ?? 'Customer return';
392
+ const refundedNames: string[] = [];
393
+
394
+ const nextLineItems = lineItems.map((item) => {
395
+ const requested = refundSelection[item.id] ?? 0;
396
+ const selectedQty = Number.isFinite(requested) ? Math.min(Math.max(0, Math.floor(requested)), item.orderedQty - item.refundedQty - item.canceledQty) : 0;
397
+ if (selectedQty <= 0) return item;
398
+ const maxRefundable = item.orderedQty - item.refundedQty - item.canceledQty;
399
+ const applied = Math.min(selectedQty, maxRefundable);
400
+ if (applied > 0) {
401
+ refundedNames.push(`${applied} × ${item.name}`);
402
+ }
403
+ return {
404
+ ...item,
405
+ refundedQty: item.refundedQty + applied,
406
+ refundReason: reasonLabel,
407
+ restockedLocation: restockInventory ? 'Brooklyn Warehouse' : undefined,
408
+ };
409
+ });
410
+ setLineItems(nextLineItems);
411
+
412
+ setTimeline((current) => [
413
+ {
414
+ id: `evt-refund-${Date.now()}`,
415
+ kind: 'event',
416
+ label: 'Refund',
417
+ actor: { name: 'Maya Lin', initials: 'ML' },
418
+ action: 'refunded',
419
+ target: formatMoney(draftRefundTotal),
420
+ description: `for ${refundedNames.join(', ')} (${reasonLabel}${restockInventory ? ' · Restocked at Brooklyn Warehouse' : ''})${refundNote.trim() ? ` · ${refundNote.trim()}` : ''}${notifyCustomer ? ' · Customer notification requested' : ''}`,
421
+ timestamp: new Date().toISOString(),
422
+ icon: RotateCcw,
423
+ tone: 'warning',
424
+ },
425
+ ...current,
426
+ ]);
427
+
428
+ setRefundSelection({});
429
+ setRefundNote('');
430
+ refundDialog.hide();
431
+ };
432
+
433
+ const unfulfilledUnitCount = unfulfilledPhysicalItems.reduce(
434
+ (sum, item) => sum + (item.orderedQty - item.refundedQty - item.canceledQty),
435
+ 0,
436
+ );
437
+
438
+ const handleFulfillRemaining = () =>
439
+ unfulfilledPhysicalItems.forEach((item) => handleFulfillItem(item.id));
440
+
441
+ return (
442
+ <Page
443
+ header={{
444
+ title: 'Order #1042',
445
+ description: 'October 14, 2026 at 2:14 pm · Online Store',
446
+ titleBadges: [
447
+ {
448
+ label: totalRefundedAmount > 0 ? 'Partially refunded' : 'Paid',
449
+ tone: totalRefundedAmount > 0 ? 'warning' : 'success',
450
+ },
451
+ {
452
+ label: unfulfilledUnitCount > 0 ? 'Partially fulfilled' : 'Fulfilled',
453
+ tone: unfulfilledUnitCount > 0 ? 'info' : 'success',
454
+ },
455
+ ],
456
+ // Fulfillment is the order's next step, so it is the route's one primary command
457
+ // while physical items remain unfulfilled.
458
+ primaryAction: {
459
+ label: `Fulfill ${unfulfilledUnitCount === 1 ? 'item' : 'items'}`,
460
+ visible: unfulfilledUnitCount > 0,
461
+ onClick: handleFulfillRemaining,
462
+ },
463
+ secondaryActions: [{ label: 'Refund items', onClick: refundDialog.show }],
464
+ }}
465
+ >
466
+ <TwoColumnLayout
467
+ stickyAside
468
+ main={
469
+ <Stack gap="2xl">
470
+ {/* Group 1: Fulfilled Physical Shipment */}
471
+ <Card
472
+ title="Fulfilled shipment · #1042-F1"
473
+ headerAction={
474
+ <Button
475
+ size="sm"
476
+ onClick={() => { setTrackingDraft({ carrier, trackingNumber, notifyCustomer: notifyTrackingCustomer }); trackingDialog.show(); }}
477
+ >
478
+ Edit tracking
479
+ </Button>
480
+ }
481
+ >
482
+ <Stack gap="2xl">
483
+ <MetadataList
484
+ columns={3}
485
+ items={[
486
+ {
487
+ id: 'carrier',
488
+ label: 'Carrier',
489
+ value: carrier,
490
+ },
491
+ {
492
+ id: 'tracking',
493
+ label: 'Tracking',
494
+ value: { kind: 'mono', value: trackingNumber },
495
+ },
496
+ {
497
+ id: 'origin',
498
+ label: 'Origin',
499
+ value: 'Brooklyn Warehouse',
500
+ },
501
+ ]}
502
+ />
503
+
504
+ <ItemGroup>
505
+ {fulfilledPhysicalItems.map((item) => {
506
+ const activeQty =
507
+ item.orderedQty - item.refundedQty - item.canceledQty;
508
+ return (
509
+ <Item key={item.id} size="md">
510
+ <ItemContent className="basis-48">
511
+ <ItemTitle>{item.name}</ItemTitle>
512
+ <ItemDescription>
513
+ {item.variant} · SKU {item.sku}
514
+ {item.weightLabel ? ` · ${item.weightLabel}` : ''}
515
+ </ItemDescription>
516
+ </ItemContent>
517
+ <ItemActions>
518
+ <Stack direction="horizontal" gap="md" align="center">
519
+ <Text size="sm" type="secondary">
520
+ {formatMoney(item.unitPrice)} × {activeQty}
521
+ </Text>
522
+ <Money
523
+ amount={item.unitPrice * activeQty}
524
+ currency="USD"
525
+ weight="semibold"
526
+ />
527
+ <ActionMenu
528
+ actions={[
529
+ {
530
+ id: `refund-${item.id}`,
531
+ label: 'Refund item',
532
+ icon: RotateCcw,
533
+ onClick: () => openRefundForSingleItem(item.id),
534
+ },
535
+ ]}
536
+ />
537
+ </Stack>
538
+ </ItemActions>
539
+ </Item>
540
+ );
541
+ })}
542
+ </ItemGroup>
543
+ </Stack>
544
+ </Card>
545
+
546
+ {/* Group 2: Unfulfilled Physical Items (if any remain unfulfilled) */}
547
+ {unfulfilledPhysicalItems.length > 0 && (
548
+ <Card title="Unfulfilled · #1042-U1">
549
+ <Stack gap="2xl">
550
+ <MetadataList
551
+ columns={3}
552
+ items={[
553
+ {
554
+ id: 'location',
555
+ label: 'Location',
556
+ value: 'Brooklyn Warehouse',
557
+ },
558
+ {
559
+ id: 'shipping-method',
560
+ label: 'Delivery method',
561
+ value: 'UPS Ground',
562
+ },
563
+ {
564
+ id: 'stock-status',
565
+ label: 'Stock',
566
+ value: {
567
+ kind: 'badge',
568
+ value: 'Ready to pack',
569
+ badgeTone: 'success',
570
+ },
571
+ },
572
+ ]}
573
+ />
574
+
575
+ <ItemGroup>
576
+ {unfulfilledPhysicalItems.map((item) => {
577
+ const activeQty =
578
+ item.orderedQty - item.refundedQty - item.canceledQty;
579
+ return (
580
+ <Item key={item.id} size="md">
581
+ <ItemContent className="basis-48">
582
+ <ItemTitle>{item.name}</ItemTitle>
583
+ <ItemDescription>
584
+ {item.variant} · SKU {item.sku}
585
+ {item.weightLabel ? ` · ${item.weightLabel}` : ''}
586
+ </ItemDescription>
587
+ </ItemContent>
588
+ <ItemActions>
589
+ <Stack direction="horizontal" gap="md" align="center">
590
+ <Text size="sm" type="secondary">
591
+ {formatMoney(item.unitPrice)} × {activeQty}
592
+ </Text>
593
+ <Money
594
+ amount={item.unitPrice * activeQty}
595
+ currency="USD"
596
+ weight="semibold"
597
+ />
598
+ <ActionMenu
599
+ actions={[
600
+ {
601
+ id: `fulfill-${item.id}`,
602
+ label: 'Mark as fulfilled',
603
+ icon: Package,
604
+ onClick: () => handleFulfillItem(item.id),
605
+ },
606
+ {
607
+ id: `cancel-${item.id}`,
608
+ label: 'Cancel item',
609
+ icon: XCircle,
610
+ tone: 'destructive',
611
+ onClick: () =>
612
+ handleCancelUnfulfilledItem(item.id),
613
+ },
614
+ ]}
615
+ />
616
+ </Stack>
617
+ </ItemActions>
618
+ </Item>
619
+ );
620
+ })}
621
+ </ItemGroup>
622
+ </Stack>
623
+ </Card>
624
+ )}
625
+
626
+ {/* Group 3: Digital Delivery */}
627
+ <Card
628
+ title="Digital delivery · #1042-D1"
629
+ headerAction={
630
+ <Button size="sm" onClick={handleResendGiftCard}>
631
+ Resend gift card
632
+ </Button>
633
+ }
634
+ >
635
+ <Stack gap="2xl">
636
+ <MetadataList
637
+ columns={3}
638
+ items={[
639
+ {
640
+ id: 'recipient',
641
+ label: 'Recipient',
642
+ value: { kind: 'email', value: 'ava.bennett@example.com' },
643
+ },
644
+ {
645
+ id: 'code',
646
+ label: 'Gift card code',
647
+ value: { kind: 'mono', value: '•••• •••• •••• 8F2A' },
648
+ },
649
+ {
650
+ id: 'status',
651
+ label: 'Status',
652
+ value: {
653
+ kind: 'badge',
654
+ value: 'Sent Oct 14',
655
+ badgeTone: 'success',
656
+ },
657
+ },
658
+ ]}
659
+ />
660
+
661
+ <ItemGroup>
662
+ {fulfilledDigitalItems.map((item) => {
663
+ const activeQty =
664
+ item.orderedQty - item.refundedQty - item.canceledQty;
665
+ return (
666
+ <Item key={item.id} size="md">
667
+ <ItemContent className="basis-48">
668
+ <ItemTitle>{item.name}</ItemTitle>
669
+ <ItemDescription>
670
+ {item.variant} · SKU {item.sku}
671
+ </ItemDescription>
672
+ </ItemContent>
673
+ <ItemActions>
674
+ <Stack direction="horizontal" gap="md" align="center">
675
+ <Text size="sm" type="secondary">
676
+ {formatMoney(item.unitPrice)} × {activeQty}
677
+ </Text>
678
+ <Money
679
+ amount={item.unitPrice * activeQty}
680
+ currency="USD"
681
+ weight="semibold"
682
+ />
683
+ <ActionMenu
684
+ actions={[
685
+ {
686
+ id: `resend-${item.id}`,
687
+ label: 'Resend email',
688
+ icon: Mail,
689
+ onClick: handleResendGiftCard,
690
+ },
691
+ {
692
+ id: `refund-${item.id}`,
693
+ label: 'Refund gift card',
694
+ icon: RotateCcw,
695
+ onClick: () => openRefundForSingleItem(item.id),
696
+ },
697
+ ]}
698
+ />
699
+ </Stack>
700
+ </ItemActions>
701
+ </Item>
702
+ );
703
+ })}
704
+ </ItemGroup>
705
+ </Stack>
706
+ </Card>
707
+
708
+ {/* Group 4: Refunded & Canceled Items */}
709
+ {removedItems.length > 0 && (
710
+ <Card
711
+ title="Refunded & canceled"
712
+ headerAction={
713
+ <Button size="sm" onClick={refundDialog.show}>
714
+ Refund more items
715
+ </Button>
716
+ }
717
+ >
718
+ <ItemGroup>
719
+ {removedItems.map((item) => {
720
+ const isCanceled = item.canceledQty > 0 && item.refundedQty === 0;
721
+ const qty = isCanceled ? item.canceledQty : item.refundedQty;
722
+ return (
723
+ <Item key={`removed-${item.id}`} size="md">
724
+ <ItemContent className="basis-48">
725
+ <ItemTitle>
726
+ <Stack direction="horizontal" gap="sm" align="center" wrap>
727
+ <Text tag="span" size="inherit" weight="semibold" lineHeight="tight">{item.name}</Text>
728
+ <Badge tone={isCanceled ? 'destructive' : 'warning'}>
729
+ {isCanceled ? 'Canceled' : 'Refunded'}
730
+ </Badge>
731
+ </Stack>
732
+ </ItemTitle>
733
+ <ItemDescription>
734
+ {item.variant} · SKU {item.sku}
735
+ {item.refundReason ? ` · ${item.refundReason}` : ''}
736
+ {item.restockedLocation
737
+ ? ` · Restocked at ${item.restockedLocation}`
738
+ : ''}
739
+ </ItemDescription>
740
+ </ItemContent>
741
+ <ItemActions>
742
+ <Stack direction="horizontal" gap="lg" align="center">
743
+ <Text size="sm" type="secondary">
744
+ {formatMoney(item.unitPrice)} × {qty}
745
+ </Text>
746
+ <Money
747
+ amount={isCanceled ? 0 : -(item.unitPrice * qty)}
748
+ currency="USD"
749
+ weight="semibold"
750
+ />
751
+ </Stack>
752
+ </ItemActions>
753
+ </Item>
754
+ );
755
+ })}
756
+ </ItemGroup>
757
+ </Card>
758
+ )}
759
+
760
+ {/* Payment Summary Card: the page header's badge states the payment status once. */}
761
+ <Card title="Payment">
762
+ <Stack gap="2xl">
763
+ <MetadataList
764
+ layout="rows"
765
+ density="compact"
766
+ valueAlign="end"
767
+ items={[
768
+ {
769
+ id: 'subtotal',
770
+ label: 'Subtotal (5 active items)',
771
+ value: { kind: 'money', value: activeSubtotal, currency: 'USD' },
772
+ },
773
+ {
774
+ id: 'discount',
775
+ label: 'Discount · AUTUMN15 (15% off apparel)',
776
+ value: { kind: 'money', value: -discountAmount, currency: 'USD' },
777
+ },
778
+ {
779
+ id: 'shipping',
780
+ label: `Shipping · ${carrier} (1.4 kg)`,
781
+ value: { kind: 'money', value: shippingAmount, currency: 'USD' },
782
+ },
783
+ {
784
+ id: 'taxes',
785
+ label: 'Taxes · NY State & NYC Local 8.875%',
786
+ value: { kind: 'money', value: taxAmount, currency: 'USD' },
787
+ },
788
+ {
789
+ id: 'total',
790
+ label: <Text weight="semibold">Total</Text>,
791
+ value: (
792
+ <Money
793
+ amount={originalCapturedTotal}
794
+ currency="USD"
795
+ weight="bold"
796
+ />
797
+ ),
798
+ },
799
+ ]}
800
+ />
801
+
802
+ <MetadataList
803
+ layout="rows"
804
+ density="compact"
805
+ valueAlign="end"
806
+ items={[
807
+ {
808
+ id: 'paid',
809
+ label: 'Paid by customer (Visa •••• 4242)',
810
+ value: {
811
+ kind: 'money' as const,
812
+ value: originalCapturedTotal,
813
+ currency: 'USD',
814
+ },
815
+ },
816
+ ...(totalRefundedAmount > 0
817
+ ? [
818
+ {
819
+ id: 'refunded',
820
+ label: 'Refunded to Visa •••• 4242',
821
+ value: {
822
+ kind: 'money' as const,
823
+ value: -totalRefundedAmount,
824
+ currency: 'USD',
825
+ },
826
+ },
827
+ ]
828
+ : []),
829
+ {
830
+ id: 'net',
831
+ label: <Text weight="semibold">Net payment</Text>,
832
+ value: <Money amount={netPayment} currency="USD" weight="bold" />,
833
+ },
834
+ ]}
835
+ />
836
+ </Stack>
837
+ </Card>
838
+
839
+ {/* Order Timeline */}
840
+ <Card title="Timeline">
841
+ <ActivityLog bare entries={timeline} itemSpacing="compact" />
842
+ </Card>
843
+ </Stack>
844
+ }
845
+ aside={
846
+ <Stack gap="2xl">
847
+ {/* Customer Metadata Card */}
848
+ <Card title="Customer">
849
+ <MetadataList
850
+ columns={1}
851
+ items={[
852
+ {
853
+ id: 'customer-name',
854
+ label: 'Name',
855
+ value: {
856
+ kind: 'text',
857
+ value: 'Ava Bennett',
858
+ },
859
+ },
860
+ {
861
+ id: 'customer-orders',
862
+ label: 'Orders',
863
+ value: `12 orders (${formatMoney(1840)} spent)`,
864
+ },
865
+ {
866
+ id: 'customer-email',
867
+ label: 'Email',
868
+ value: {
869
+ kind: 'email',
870
+ value: 'ava.bennett@example.com',
871
+ },
872
+ },
873
+ {
874
+ id: 'customer-phone',
875
+ label: 'Phone',
876
+ value: {
877
+ kind: 'phone',
878
+ value: '+12125550148',
879
+ display: '+1 (212) 555-0148',
880
+ },
881
+ },
882
+ ]}
883
+ />
884
+ </Card>
885
+
886
+ {/* Shipping Address Card */}
887
+ <AddressCard
888
+ surface="card"
889
+ kind="shipping"
890
+ default
891
+ name="Ava Bennett"
892
+ line1="214 Mercer Street"
893
+ line2="Apt 4B"
894
+ city="New York, NY"
895
+ postalCode="10012"
896
+ country="United States"
897
+ phone="+1 (212) 555-0148"
898
+ />
899
+
900
+ {/* Billing Address Card */}
901
+ <AddressCard
902
+ surface="card"
903
+ kind="billing"
904
+ name="Ava Bennett"
905
+ line1="214 Mercer Street"
906
+ line2="Apt 4B"
907
+ city="New York, NY"
908
+ postalCode="10012"
909
+ country="United States"
910
+ />
911
+
912
+ {/* Payment Method Card */}
913
+ <PaymentMethod
914
+ surface="card"
915
+ brand="visa"
916
+ last4="4242"
917
+ expiry="08/28"
918
+ holderName="Ava Bennett"
919
+ default
920
+ />
921
+
922
+ {/* Customer Delivery Note */}
923
+ <Card
924
+ title="Notes"
925
+ headerAction={
926
+ <Button
927
+ tone="secondary"
928
+ buttonStyle="ghost"
929
+ size="sm"
930
+ onClick={() => { setNoteDraft(orderNote); noteDialog.show(); }}
931
+ >
932
+ Edit
933
+ </Button>
934
+ }
935
+ >
936
+ <Text size="sm" type="secondary">
937
+ {orderNote}
938
+ </Text>
939
+ </Card>
940
+ </Stack>
941
+ }
942
+ />
943
+
944
+ {/* Edit Tracking Dialog */}
945
+ <ActionDialog
946
+ {...trackingDialog.overlayProps}
947
+ title="Edit tracking · Shipment #1042-F1"
948
+ description="Update carrier and tracking details for this fulfilled shipment."
949
+ strings={{
950
+ confirm: 'Save tracking',
951
+ cancel: 'Cancel',
952
+ }}
953
+ onConfirm={() => { setCarrier(trackingDraft.carrier); setTrackingNumber(trackingDraft.trackingNumber); setNotifyTrackingCustomer(trackingDraft.notifyCustomer); trackingDialog.hide(); }}
954
+ >
955
+ <FormSection title="Shipment tracking">
956
+ <FormField label="Shipping carrier" required>
957
+ <Select
958
+ aria-label="Shipping carrier"
959
+ options={CARRIER_OPTIONS}
960
+ value={trackingDraft.carrier}
961
+ onValueChange={(value) => setTrackingDraft((draft) => ({ ...draft, carrier: String(value) }))}
962
+ />
963
+ </FormField>
964
+ <FormField label="Tracking number" required>
965
+ <Input
966
+ aria-label="Tracking number"
967
+ value={trackingDraft.trackingNumber}
968
+ onChange={(event) => setTrackingDraft((draft) => ({ ...draft, trackingNumber: event.target.value }))}
969
+ />
970
+ </FormField>
971
+ <ToggleField
972
+ kind="checkbox"
973
+ value={trackingDraft.notifyCustomer}
974
+ onValueChange={(checked) => setTrackingDraft((draft) => ({ ...draft, notifyCustomer: Boolean(checked) }))}
975
+ label="Send tracking update email to customer"
976
+ />
977
+ </FormSection>
978
+ </ActionDialog>
979
+
980
+ {/* Edit Order Note Dialog */}
981
+ <ActionDialog
982
+ {...noteDialog.overlayProps}
983
+ title="Edit order note"
984
+ description="Update delivery instructions or internal notes for Order #1042."
985
+ strings={{
986
+ confirm: 'Save note',
987
+ cancel: 'Cancel',
988
+ }}
989
+ onConfirm={() => { setOrderNote(noteDraft); noteDialog.hide(); }}
990
+ >
991
+ <FormSection title="Order note">
992
+ <FormField label="Note">
993
+ <Textarea
994
+ aria-label="Order note"
995
+ rows={3}
996
+ value={noteDraft}
997
+ onChange={(event) => setNoteDraft(event.target.value)}
998
+ />
999
+ </FormField>
1000
+ </FormSection>
1001
+ </ActionDialog>
1002
+
1003
+ {/* Refund Items Dialog */}
1004
+ <ActionDialog
1005
+ {...refundDialog.overlayProps}
1006
+ title="Refund items · Order #1042"
1007
+ description="Select quantities to refund and return to inventory."
1008
+ strings={{
1009
+ confirm:
1010
+ draftRefundTotal > 0
1011
+ ? `Refund ${formatMoney(draftRefundTotal)}`
1012
+ : 'Select items to refund',
1013
+ cancel: 'Cancel',
1014
+ }}
1015
+ onConfirm={handleConfirmRefund}
1016
+ >
1017
+ <Stack gap="2xl">
1018
+ <FormSection title="Refundable line items">
1019
+ <Stack gap="md">
1020
+ {lineItems
1021
+ .filter((item) => item.orderedQty - item.refundedQty - item.canceledQty > 0)
1022
+ .map((item) => {
1023
+ const maxQty = item.orderedQty - item.refundedQty - item.canceledQty;
1024
+ const currentQty = refundSelection[item.id] ?? 0;
1025
+ return (
1026
+ <Stack
1027
+ key={item.id}
1028
+ direction="horizontal"
1029
+ justify="between"
1030
+ align="center"
1031
+ gap="md"
1032
+ >
1033
+ <Stack gap="xs">
1034
+ <Text weight="medium">{item.name}</Text>
1035
+ <Text size="xs" type="secondary">
1036
+ {item.variant} · {formatMoney(item.unitPrice)} × {maxQty} available
1037
+ </Text>
1038
+ </Stack>
1039
+ <DecimalInput
1040
+ aria-label={`Refund quantity for ${item.name}`}
1041
+ decimalPlaces={0}
1042
+ step={1}
1043
+ min={0}
1044
+ max={maxQty}
1045
+ value={String(currentQty)}
1046
+ onChange={(event) =>
1047
+ setRefundSelection((prev) => ({
1048
+ ...prev,
1049
+ [item.id]: Math.max(
1050
+ 0,
1051
+ Math.min(maxQty, Number(event.target.value || 0)),
1052
+ ),
1053
+ }))
1054
+ }
1055
+ />
1056
+ </Stack>
1057
+ );
1058
+ })}
1059
+ </Stack>
1060
+ </FormSection>
1061
+ <FormSection title="Refund details">
1062
+ <Stack gap="md">
1063
+ <FormField label="Reason for refund" required>
1064
+ <Select
1065
+ aria-label="Reason for refund"
1066
+ options={REFUND_REASONS}
1067
+ value={refundReason}
1068
+ onValueChange={(value) => setRefundReason(String(value))}
1069
+ />
1070
+ </FormField>
1071
+
1072
+ <FormField label="Staff note (optional)">
1073
+ <Textarea
1074
+ aria-label="Staff note"
1075
+ value={refundNote}
1076
+ onChange={(event) => setRefundNote(event.target.value)}
1077
+ placeholder="Reason for refund or inspection note..."
1078
+ rows={2}
1079
+ />
1080
+ </FormField>
1081
+
1082
+ <ToggleField
1083
+ kind="checkbox"
1084
+ value={restockInventory}
1085
+ onValueChange={(checked) => setRestockInventory(Boolean(checked))}
1086
+ label="Restock returned items at Brooklyn Warehouse"
1087
+ />
1088
+ <ToggleField
1089
+ kind="checkbox"
1090
+ value={notifyCustomer}
1091
+ onValueChange={(checked) => setNotifyCustomer(Boolean(checked))}
1092
+ label="Send refund notification email to customer"
1093
+ />
1094
+ </Stack>
1095
+ </FormSection>
1096
+ </Stack>
1097
+ </ActionDialog>
1098
+ </Page>
1099
+ );
1100
+ }
1101
+
1102
+ export default OrdersAdminTemplate;