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,834 @@
1
+ import { useMemo, useState } from 'react';
2
+
3
+ import { Badge } from 'themelia-react-ui/base/badge';
4
+ import { Card } from 'themelia-react-ui/base/cards';
5
+ import { Select, ToggleField } from 'themelia-react-ui/base/choice-inputs';
6
+ import { FormField, FormSection } from 'themelia-react-ui/base/forms';
7
+ import { Grid, Stack } from 'themelia-react-ui/base/structure';
8
+ import { Input, SlugField, Textarea } from 'themelia-react-ui/base/text-inputs';
9
+ import { TagsInput } from 'themelia-react-ui/base/value-inputs';
10
+ import { SeoListingCard } from 'themelia-react-ui/blocks/commerce';
11
+ import { MetadataList } from 'themelia-react-ui/base/metadata-list';
12
+ import { ActionDialog, ActionDrawer, useOverlayVisibility } from 'themelia-react-ui/features/overlays';
13
+ import {
14
+ ProductVariantDetails,
15
+ ProductVariantEditor,
16
+ ProductVariantsManager,
17
+ type ProductChoice,
18
+ type ProductOptionEditDraft,
19
+ type ProductOptionGroup,
20
+ type ProductVariantEditableField,
21
+ type ProductVariantEditorValues,
22
+ type ProductVariantOptionField,
23
+ type ProductVariantRow,
24
+ type ProductVariantSummary,
25
+ } from 'themelia-react-ui/features/products';
26
+ import { TwoColumnLayout } from 'themelia-react-ui/layout/containers';
27
+ import { Page } from 'themelia-react-ui/layout/page';
28
+ import { useMoneyFormatter } from 'themelia-react-ui/primitives';
29
+ import { DisplayLabel, Text } from 'themelia-react-ui/typography';
30
+
31
+ const INITIAL_OPTION_GROUPS: ProductOptionGroup[] = [
32
+ {
33
+ id: 'color',
34
+ name: 'Color',
35
+ description: 'Yarn-dyed core colorways.',
36
+ usedForVariants: true,
37
+ values: [
38
+ { id: 'heather-gray', label: 'Heather Gray' },
39
+ { id: 'midnight-navy', label: 'Midnight Navy' },
40
+ ],
41
+ },
42
+ {
43
+ id: 'size',
44
+ name: 'Size',
45
+ description: 'Standard unisex knitwear sizing.',
46
+ usedForVariants: true,
47
+ values: [
48
+ { id: 'small', label: 'Small' },
49
+ { id: 'medium', label: 'Medium' },
50
+ { id: 'large', label: 'Large' },
51
+ ],
52
+ },
53
+ ];
54
+
55
+ const INITIAL_VARIANTS: ProductVariantRow[] = [
56
+ {
57
+ id: 'mwc-gry-s',
58
+ name: 'Heather Gray / Small',
59
+ sku: 'MWC-GRY-S',
60
+ price: '145.00',
61
+ inventory: '28',
62
+ status: 'Active',
63
+ statusTone: 'success',
64
+ optionValueIds: { color: 'heather-gray', size: 'small' },
65
+ },
66
+ {
67
+ id: 'mwc-gry-m',
68
+ name: 'Heather Gray / Medium',
69
+ sku: 'MWC-GRY-M',
70
+ price: '145.00',
71
+ inventory: '42',
72
+ status: 'Active',
73
+ statusTone: 'success',
74
+ optionValueIds: { color: 'heather-gray', size: 'medium' },
75
+ },
76
+ {
77
+ id: 'mwc-gry-l',
78
+ name: 'Heather Gray / Large',
79
+ sku: 'MWC-GRY-L',
80
+ price: '145.00',
81
+ inventory: '31',
82
+ status: 'Active',
83
+ statusTone: 'success',
84
+ optionValueIds: { color: 'heather-gray', size: 'large' },
85
+ },
86
+ {
87
+ id: 'mwc-nvy-s',
88
+ name: 'Midnight Navy / Small',
89
+ sku: 'MWC-NVY-S',
90
+ price: '145.00',
91
+ inventory: '24',
92
+ status: 'Active',
93
+ statusTone: 'success',
94
+ optionValueIds: { color: 'midnight-navy', size: 'small' },
95
+ },
96
+ {
97
+ id: 'mwc-nvy-m',
98
+ name: 'Midnight Navy / Medium',
99
+ sku: 'MWC-NVY-M',
100
+ price: '145.00',
101
+ inventory: '37',
102
+ status: 'Active',
103
+ statusTone: 'success',
104
+ optionValueIds: { color: 'midnight-navy', size: 'medium' },
105
+ },
106
+ {
107
+ id: 'mwc-nvy-l',
108
+ name: 'Midnight Navy / Large',
109
+ sku: 'MWC-NVY-L',
110
+ price: '145.00',
111
+ inventory: '6',
112
+ status: 'Low stock',
113
+ statusTone: 'warning',
114
+ optionValueIds: { color: 'midnight-navy', size: 'large' },
115
+ },
116
+ ];
117
+
118
+ const PRODUCT_STATUS_OPTIONS = [
119
+ { value: 'Active', label: 'Active' },
120
+ { value: 'Draft', label: 'Draft' },
121
+ { value: 'Archived', label: 'Archived' },
122
+ ];
123
+
124
+ const PRODUCT_CATEGORY_OPTIONS = [
125
+ { value: 'sweaters', label: 'Apparel & Accessories > Clothing > Sweaters' },
126
+ { value: 'shirts', label: 'Apparel & Accessories > Clothing > Shirts & Tops' },
127
+ { value: 'outerwear', label: 'Apparel & Accessories > Clothing > Outerwear' },
128
+ ];
129
+
130
+ const COUNTRY_OPTIONS = [
131
+ { value: 'PT', label: 'Portugal' },
132
+ { value: 'IT', label: 'Italy' },
133
+ { value: 'US', label: 'United States' },
134
+ ];
135
+
136
+ const VARIANT_STATUS_CHOICES: ProductChoice[] = [
137
+ { value: 'Active', label: 'Active' },
138
+ { value: 'Low stock', label: 'Low stock' },
139
+ { value: 'Draft', label: 'Draft' },
140
+ ];
141
+
142
+ function updateVariantField(
143
+ rows: ProductVariantRow[],
144
+ variantId: string,
145
+ field: ProductVariantEditableField,
146
+ value: string,
147
+ ) {
148
+ return rows.map((row) => (row.id === variantId ? { ...row, [field]: value } : row));
149
+ }
150
+
151
+ export function ProductsAdminTemplate() {
152
+ // Sample records are priced in USD; bind that once for every text amount.
153
+ const formatMoney = useMoneyFormatter({ currency: 'USD' });
154
+ const [productTitle, setProductTitle] = useState('Merino Wool Crewneck Sweater');
155
+ const [productDescription, setProductDescription] = useState(
156
+ 'Knitted in Braga, Portugal from 100% extra-fine Italian merino wool. Designed with a classic regular fit, saddle shoulders, and 1x1 ribbed collar, cuffs, and hem. Naturally breathable and temperature-regulating for three-season layering.',
157
+ );
158
+ const [productStatus, setProductStatus] = useState<'Active' | 'Draft' | 'Archived'>('Active');
159
+ const [savedRevision, setSavedRevision] = useState<number | null>(null);
160
+
161
+ // Shipping & customs state
162
+ const [isPhysicalProduct, setIsPhysicalProduct] = useState(true);
163
+ const [weightKg, setWeightKg] = useState('0.42');
164
+ const [countryOfOrigin, setCountryOfOrigin] = useState('PT');
165
+ const [hsCode, setHsCode] = useState('6110.11.00');
166
+
167
+ // Publishing, organization, collections & tags state
168
+ const [onlineStoreChannel, setOnlineStoreChannel] = useState(true);
169
+ const [posChannel, setPosChannel] = useState(true);
170
+ const [category, setCategory] = useState('sweaters');
171
+ const [productType, setProductType] = useState('Knitwear');
172
+ const [vendor, setVendor] = useState('Oak & Loom');
173
+ const [inAutumnCollection, setInAutumnCollection] = useState(true);
174
+ const [inMensKnitwear, setInMensKnitwear] = useState(true);
175
+ const [inMerinoEssentials, setInMerinoEssentials] = useState(false);
176
+ const [tags, setTags] = useState<string[]>([
177
+ 'merino-wool',
178
+ 'crewneck',
179
+ 'italian-yarn',
180
+ 'portugal',
181
+ ]);
182
+
183
+ // Variants state (owns per-SKU price, compare-at price, cost, barcode, and stock)
184
+ const [optionState, setOptionState] = useState<ProductOptionGroup[]>(INITIAL_OPTION_GROUPS);
185
+ const [variantState, setVariantState] = useState<ProductVariantRow[]>(INITIAL_VARIANTS);
186
+ const [collapsedOptionIds, setCollapsedOptionIds] = useState<string[]>([]);
187
+ const [editingOptionId, setEditingOptionId] = useState<string | null>(null);
188
+ const [selectedVariantIds, setSelectedVariantIds] = useState<string[]>(['mwc-gry-m']);
189
+
190
+ const [editingVariantId, setEditingVariantId] = useState<string>('mwc-gry-m');
191
+ const [variantCompareAtPrice, setVariantCompareAtPrice] = useState('165.00');
192
+ const [variantCostPerItem, setVariantCostPerItem] = useState('52.00');
193
+ const [variantBarcode, setVariantBarcode] = useState('084291004218');
194
+ const [variantDraft, setVariantDraft] = useState<ProductVariantEditorValues>({
195
+ name: 'Heather Gray / Medium',
196
+ description: '100% Extra-Fine Merino Wool',
197
+ sku: 'MWC-GRY-M',
198
+ price: '145.00',
199
+ inventory: '42',
200
+ channels: 'Online Store, SoHo POS',
201
+ status: 'Active',
202
+ options: {
203
+ color: 'Heather Gray',
204
+ size: 'Medium',
205
+ },
206
+ });
207
+
208
+ // SEO state
209
+ const [seoTitle, setSeoTitle] = useState(
210
+ 'Merino Wool Crewneck Sweater — Heather Gray & Navy | Oak & Loom',
211
+ );
212
+ const [seoSlug] = useState('merino-wool-crewneck-sweater');
213
+ const [seoDescription, setSeoDescription] = useState(
214
+ 'Knitted in Portugal from 100% extra-fine Italian merino wool. Soft, breathable 7-gauge crewneck sweater built for everyday layering. Free US shipping & 30-day returns.',
215
+ );
216
+
217
+ const [seoDraft, setSeoDraft] = useState({ title: seoTitle, description: seoDescription });
218
+ const [savedVariantDetails, setSavedVariantDetails] = useState<Record<string, { compareAtPrice: string; costPerItem: string; barcode: string }>>({});
219
+ const variantDrawer = useOverlayVisibility();
220
+ const seoDialog = useOverlayVisibility();
221
+ const previewDialog = useOverlayVisibility();
222
+
223
+ const productSnapshot = JSON.stringify({
224
+ productTitle, productDescription, productStatus, isPhysicalProduct, weightKg,
225
+ countryOfOrigin, hsCode, onlineStoreChannel, posChannel, category, productType,
226
+ vendor, inAutumnCollection, inMensKnitwear, inMerinoEssentials, tags,
227
+ optionState, variantState, savedVariantDetails, seoTitle, seoDescription, seoSlug,
228
+ });
229
+ const [savedProductSnapshot, setSavedProductSnapshot] = useState(productSnapshot);
230
+ const productDirty = productSnapshot !== savedProductSnapshot;
231
+
232
+ const totalInventory = useMemo(
233
+ () =>
234
+ variantState.reduce(
235
+ (sum, row) => sum + (Number.parseInt(String(row.inventory ?? '0'), 10) || 0),
236
+ 0,
237
+ ),
238
+ [variantState],
239
+ );
240
+
241
+ const priceRangeLabel = useMemo(() => {
242
+ const prices = variantState
243
+ .map((row) => Number.parseFloat(String(row.price ?? '0')))
244
+ .filter((n) => Number.isFinite(n) && n > 0);
245
+ if (prices.length === 0) return formatMoney(0);
246
+ const min = Math.min(...prices);
247
+ const max = Math.max(...prices);
248
+ return min === max ? formatMoney(min) : `${formatMoney(min)} – ${formatMoney(max)}`;
249
+ }, [variantState, formatMoney]);
250
+
251
+ const variantSummaries: ProductVariantSummary[] = useMemo(
252
+ () =>
253
+ variantState.map((row) => ({
254
+ id: row.id,
255
+ name: row.name,
256
+ description: '100% Extra-Fine Merino Wool',
257
+ options: Object.values(row.optionValueIds ?? {}),
258
+ sku: row.sku,
259
+ price: formatMoney(String(row.price ?? '145.00')),
260
+ inventory: String(row.inventory ?? '0'),
261
+ channels: 'Online Store, POS',
262
+ updatedAt: 'Today',
263
+ status: row.status,
264
+ statusTone: row.statusTone,
265
+ })),
266
+ [variantState, formatMoney],
267
+ );
268
+
269
+ const variantOptionFields: ProductVariantOptionField[] = useMemo(
270
+ () =>
271
+ optionState.map((group) => ({
272
+ id: group.id,
273
+ label: String(group.name),
274
+ value: String(variantDraft.options?.[group.id] ?? group.values?.[0]?.label ?? ''),
275
+ choices: (group.values ?? []).map((v) => ({
276
+ value: String(v.label),
277
+ label: String(v.label),
278
+ })),
279
+ })),
280
+ [optionState, variantDraft.options],
281
+ );
282
+
283
+ const openVariantEditor = (row: ProductVariantRow) => {
284
+ setEditingVariantId(row.id);
285
+ const detail = savedVariantDetails[row.id];
286
+ setVariantCompareAtPrice(detail?.compareAtPrice ?? '165.00');
287
+ setVariantCostPerItem(detail?.costPerItem ?? '52.00');
288
+ setVariantBarcode(detail?.barcode ?? '084291004218');
289
+ const colorId = row.optionValueIds?.color ?? 'heather-gray';
290
+ const sizeId = row.optionValueIds?.size ?? 'medium';
291
+ const colorLabel = String(
292
+ optionState
293
+ .find((g) => g.id === 'color')
294
+ ?.values?.find((v) => v.id === colorId)?.label ?? 'Heather Gray',
295
+ );
296
+ const sizeLabel = String(
297
+ optionState
298
+ .find((g) => g.id === 'size')
299
+ ?.values?.find((v) => v.id === sizeId)?.label ?? 'Medium',
300
+ );
301
+
302
+ setVariantDraft({
303
+ name: String(row.name ?? ''),
304
+ description: '100% Extra-Fine Merino Wool',
305
+ sku: String(row.sku ?? ''),
306
+ price: String(row.price ?? '145.00'),
307
+ inventory: String(row.inventory ?? '0'),
308
+ channels: 'Online Store, SoHo POS',
309
+ status: String(row.status ?? 'Active'),
310
+ options: {
311
+ color: colorLabel,
312
+ size: sizeLabel,
313
+ },
314
+ });
315
+ variantDrawer.show();
316
+ };
317
+
318
+ const duplicateVariant = (variant: ProductVariantRow) => {
319
+ const copy = { ...variant, id: crypto.randomUUID(), sku: `${String(variant.sku ?? 'MWC')}-COPY` };
320
+ setVariantState((current) => [...current, copy]);
321
+ return copy;
322
+ };
323
+
324
+ const handleSaveVariantDraft = () => {
325
+ setSavedVariantDetails((current) => ({ ...current, [editingVariantId]: { compareAtPrice: variantCompareAtPrice, costPerItem: variantCostPerItem, barcode: variantBarcode } }));
326
+ const optionValueIds = Object.fromEntries(optionState.map((group) => [group.id, group.values?.find((value) => String(value.label) === variantDraft.options?.[group.id])?.id]).filter((entry): entry is [string, string] => typeof entry[1] === 'string'));
327
+ setVariantState((current) =>
328
+ current.map((row) =>
329
+ row.id === editingVariantId
330
+ ? {
331
+ ...row,
332
+ optionValueIds,
333
+ name: variantDraft.name || row.name,
334
+ sku: variantDraft.sku || row.sku,
335
+ price: variantDraft.price || row.price,
336
+ inventory: variantDraft.inventory || row.inventory,
337
+ status: variantDraft.status || row.status,
338
+ statusTone:
339
+ variantDraft.status === 'Active'
340
+ ? 'success'
341
+ : variantDraft.status === 'Low stock'
342
+ ? 'warning'
343
+ : 'secondary',
344
+ }
345
+ : row,
346
+ ),
347
+ );
348
+ variantDrawer.hide();
349
+ };
350
+
351
+ const activeVariantSummary = useMemo<ProductVariantSummary | undefined>(
352
+ () => variantSummaries.find((item) => item.id === editingVariantId) ?? variantSummaries[0],
353
+ [variantSummaries, editingVariantId],
354
+ );
355
+
356
+ const statusBadgeTone =
357
+ productStatus === 'Active'
358
+ ? 'success'
359
+ : productStatus === 'Draft'
360
+ ? 'info'
361
+ : 'secondary';
362
+
363
+ return (
364
+ <Page
365
+ header={{
366
+ title: productTitle,
367
+ description:
368
+ productDirty ? 'Unsaved product changes' : savedRevision !== null
369
+ ? `Saved revision #${savedRevision} · Updated just now`
370
+ : `Men’s Knitwear · ${variantState.length} variants (${totalInventory} in stock)`,
371
+ titleBadges: [{ label: productStatus, tone: statusBadgeTone }],
372
+ primaryAction: {
373
+ label: 'Save product',
374
+ disabled: !productDirty,
375
+ onClick: () => { setSavedProductSnapshot(productSnapshot); setSavedRevision((rev) => (rev ?? 0) + 1); },
376
+ },
377
+ secondaryActions: [{ label: 'Preview', onClick: previewDialog.show }],
378
+ }}
379
+ >
380
+ <TwoColumnLayout
381
+ stickyAside
382
+ main={
383
+ <Stack gap="2xl">
384
+ {/* 1. Product details */}
385
+ <Card title="Product details">
386
+ <Stack gap="lg">
387
+ <FormField label="Title" required>
388
+ <Input
389
+ aria-label="Title"
390
+ value={productTitle}
391
+ onChange={(event) => setProductTitle(event.target.value)}
392
+ />
393
+ </FormField>
394
+
395
+ <FormField
396
+ label="Description"
397
+ hint="Displayed on the storefront under fabric, yarn origin, and fit details."
398
+ >
399
+ <Textarea
400
+ aria-label="Description"
401
+ rows={5}
402
+ value={productDescription}
403
+ onChange={(event) => setProductDescription(event.target.value)}
404
+ />
405
+ </FormField>
406
+
407
+ <FormField label="URL handle">
408
+ <SlugField
409
+ aria-label="URL handle"
410
+ startAddon="/products/"
411
+ value={seoSlug}
412
+ />
413
+ </FormField>
414
+ </Stack>
415
+ </Card>
416
+
417
+ {/* 2. Options & Variants (owns SKU pricing and stock per variant) */}
418
+ <ProductVariantsManager
419
+ surface="card"
420
+ optionGroups={optionState}
421
+ variants={variantState}
422
+ optionCombinationDisplay="tags"
423
+ cellDisplay={{ price: 'field', inventory: 'field' }}
424
+ visibleColumns={['variant', 'price', 'inventory']}
425
+ collapsedOptionIds={collapsedOptionIds}
426
+ onCollapsedOptionIdsChange={setCollapsedOptionIds}
427
+ editingOptionId={editingOptionId}
428
+ onEditingOptionIdChange={setEditingOptionId}
429
+ selectedVariantIds={selectedVariantIds}
430
+ onSelectedVariantIdsChange={setSelectedVariantIds}
431
+ onEditOption={(option) => setEditingOptionId(option.id)}
432
+ onCancelEditingOption={() => setEditingOptionId(null)}
433
+ onSaveEditingOption={(option, draft: ProductOptionEditDraft) => {
434
+ setOptionState((current) =>
435
+ current.map((item) =>
436
+ item.id === option.id
437
+ ? {
438
+ ...item,
439
+ name: draft.name.trim() || item.name,
440
+ values: draft.values.map((val, idx) => ({
441
+ ...val,
442
+ id: val.id || `${item.id}-v-${idx + 1}`,
443
+ label: String(val.label).trim() || `Option ${idx + 1}`,
444
+ })),
445
+ }
446
+ : item,
447
+ ),
448
+ );
449
+ setEditingOptionId(null);
450
+ }}
451
+ onCreateVariant={() => {
452
+ const nextIndex = variantState.length + 1;
453
+ setVariantState((current) => [
454
+ ...current,
455
+ {
456
+ id: crypto.randomUUID(),
457
+ name: 'Heather Gray / Large',
458
+ sku: `MWC-GRY-L-${nextIndex}`,
459
+ price: '145.00',
460
+ inventory: '20',
461
+ status: 'Active',
462
+ statusTone: 'success',
463
+ optionValueIds: { color: 'heather-gray', size: 'large' },
464
+ },
465
+ ]);
466
+ }}
467
+ onVariantFieldChange={(variant, field, value) => {
468
+ setVariantState((current) =>
469
+ updateVariantField(current, variant.id, field, value),
470
+ );
471
+ }}
472
+ onVariantFieldBlur={(variant, field, value) => {
473
+ setVariantState((current) =>
474
+ updateVariantField(current, variant.id, field, value.trim()),
475
+ );
476
+ }}
477
+ onSelectVariant={openVariantEditor}
478
+ onEditVariant={openVariantEditor}
479
+ onDuplicateVariant={duplicateVariant}
480
+ onDeleteVariant={(variant) => {
481
+ setVariantState((current) =>
482
+ current.filter((item) => item.id !== variant.id),
483
+ );
484
+ }}
485
+ strings={{
486
+ title: 'Variants',
487
+ description:
488
+ 'Each variant manages its own SKU, retail price, compare-at price, barcode, and warehouse inventory.',
489
+ }}
490
+ />
491
+
492
+ {/* 3. Shipping & customs */}
493
+ <Card
494
+ title="Shipping & customs"
495
+ description="Default package weight and customs tariff classification inherited by physical variants."
496
+ >
497
+ <Stack gap="lg">
498
+ <ToggleField
499
+ kind="checkbox"
500
+ value={isPhysicalProduct}
501
+ onValueChange={(checked) => setIsPhysicalProduct(Boolean(checked))}
502
+ label="This is a physical product requiring shipping"
503
+ />
504
+
505
+ {isPhysicalProduct && (
506
+ <Grid columns={{ base: 1, sm: 3 }} gap="lg">
507
+ <FormField label="Package weight">
508
+ <Input
509
+ aria-label="Weight"
510
+ endAddon="kg"
511
+ value={weightKg}
512
+ onChange={(event) => setWeightKg(event.target.value)}
513
+ />
514
+ </FormField>
515
+ <FormField label="Country/Region of origin">
516
+ <Select
517
+ aria-label="Country/Region of origin"
518
+ options={COUNTRY_OPTIONS}
519
+ value={countryOfOrigin}
520
+ onValueChange={(value) => setCountryOfOrigin(String(value))}
521
+ />
522
+ </FormField>
523
+ <FormField label="HS tariff code">
524
+ <Input
525
+ aria-label="HS code"
526
+ value={hsCode}
527
+ onChange={(event) => setHsCode(event.target.value)}
528
+ />
529
+ </FormField>
530
+ </Grid>
531
+ )}
532
+ </Stack>
533
+ </Card>
534
+
535
+ {/* 4. Search Engine Listing */}
536
+ <SeoListingCard
537
+ surface="card"
538
+ siteName="Oak & Loom"
539
+ baseUrl="https://oakandloom.com"
540
+ pathSegments={['collections', 'knitwear', 'products']}
541
+ permalink={seoSlug}
542
+ title={seoTitle}
543
+ description={seoDescription}
544
+ price={priceRangeLabel}
545
+ keyword="merino wool crewneck sweater"
546
+ onEdit={() => { setSeoDraft({ title: seoTitle, description: seoDescription }); seoDialog.show(); }}
547
+ />
548
+ </Stack>
549
+ }
550
+ aside={
551
+ <Stack gap="2xl">
552
+ {/* 1. Status Card */}
553
+ <Card title="Status">
554
+ <Stack gap="lg">
555
+ <Select
556
+ aria-label="Product status"
557
+ options={PRODUCT_STATUS_OPTIONS}
558
+ value={productStatus}
559
+ onValueChange={(value) =>
560
+ setProductStatus(value as 'Active' | 'Draft' | 'Archived')
561
+ }
562
+ />
563
+ <MetadataList
564
+ columns={1}
565
+ items={[
566
+ {
567
+ id: 'variant-count',
568
+ label: 'Variants',
569
+ value: `${variantState.length} SKUs`,
570
+ },
571
+ {
572
+ id: 'total-stock',
573
+ label: 'Total inventory',
574
+ value: `${totalInventory} units across 2 locations`,
575
+ },
576
+ {
577
+ id: 'price-range',
578
+ label: 'Variant price',
579
+ value: priceRangeLabel,
580
+ },
581
+ ]}
582
+ />
583
+ </Stack>
584
+ </Card>
585
+
586
+ {/* 2. Publishing Card */}
587
+ <Card title="Publishing">
588
+ <Stack gap="2xl">
589
+ <Stack gap="xs">
590
+ <DisplayLabel>Sales channels</DisplayLabel>
591
+ <ToggleField
592
+ kind="checkbox"
593
+ value={onlineStoreChannel}
594
+ onValueChange={(checked) => setOnlineStoreChannel(Boolean(checked))}
595
+ label="Online Store"
596
+ />
597
+ <ToggleField
598
+ kind="checkbox"
599
+ value={posChannel}
600
+ onValueChange={(checked) => setPosChannel(Boolean(checked))}
601
+ label="Point of Sale (SoHo Flagship)"
602
+ />
603
+ </Stack>
604
+
605
+ <MetadataList
606
+ columns={1}
607
+ items={[
608
+ {
609
+ id: 'markets',
610
+ label: 'Markets',
611
+ value: 'United States (USD) & EU (EUR)',
612
+ },
613
+ ]}
614
+ />
615
+ </Stack>
616
+ </Card>
617
+
618
+ {/* 3. Product organization Card (Category, Type, Vendor) */}
619
+ <Card title="Organization">
620
+ <Stack gap="lg">
621
+ <FormField label="Category">
622
+ <Select
623
+ aria-label="Category"
624
+ options={PRODUCT_CATEGORY_OPTIONS}
625
+ value={category}
626
+ onValueChange={(value) => setCategory(String(value))}
627
+ />
628
+ </FormField>
629
+
630
+ <FormField label="Product type">
631
+ <Input
632
+ aria-label="Product type"
633
+ value={productType}
634
+ onChange={(event) => setProductType(event.target.value)}
635
+ />
636
+ </FormField>
637
+
638
+ <FormField label="Vendor">
639
+ <Input
640
+ aria-label="Vendor"
641
+ value={vendor}
642
+ onChange={(event) => setVendor(event.target.value)}
643
+ />
644
+ </FormField>
645
+ </Stack>
646
+ </Card>
647
+
648
+ {/* 4. Collections Card */}
649
+ <Card
650
+ title="Collections"
651
+ description="Assign this product to manual and automated storefront collections."
652
+ >
653
+ <Stack gap="sm">
654
+ <ToggleField
655
+ kind="checkbox"
656
+ value={inAutumnCollection}
657
+ onValueChange={(checked) => setInAutumnCollection(Boolean(checked))}
658
+ label="Autumn / Winter Knitwear"
659
+ />
660
+ <ToggleField
661
+ kind="checkbox"
662
+ value={inMensKnitwear}
663
+ onValueChange={(checked) => setInMensKnitwear(Boolean(checked))}
664
+ label="Men’s Core Essentials"
665
+ />
666
+ <ToggleField
667
+ kind="checkbox"
668
+ value={inMerinoEssentials}
669
+ onValueChange={(checked) => setInMerinoEssentials(Boolean(checked))}
670
+ label="Italian Merino Capsule"
671
+ />
672
+ </Stack>
673
+ </Card>
674
+
675
+ {/* 5. Tags Card */}
676
+ <Card
677
+ title="Tags"
678
+ description="Used for storefront filtering and automated collection rules."
679
+ >
680
+ <FormField label="Product tags">
681
+ <TagsInput
682
+ aria-label="Tags"
683
+ value={tags}
684
+ onValueChange={setTags}
685
+ placeholder="Add tag…"
686
+ />
687
+ </FormField>
688
+ </Card>
689
+ </Stack>
690
+ }
691
+ />
692
+
693
+ <ActionDrawer
694
+ {...variantDrawer.overlayProps}
695
+ title={`Edit variant · ${variantDraft.name}`}
696
+ description="Manage variant-level pricing, cost margin, SKU barcode, and warehouse inventory."
697
+ width="lg"
698
+ showFooter={false}
699
+ >
700
+ <Stack gap="xl">
701
+ <ProductVariantDetails
702
+ variant={activeVariantSummary}
703
+ metadata={[
704
+ {
705
+ id: 'sku',
706
+ label: 'SKU',
707
+ value: { kind: 'mono', value: variantDraft.sku || 'MWC-GRY-M' },
708
+ },
709
+ {
710
+ id: 'barcode',
711
+ label: 'Barcode (GTIN)',
712
+ value: { kind: 'mono', value: variantBarcode },
713
+ },
714
+ {
715
+ id: 'compare-at',
716
+ label: 'Compare-at price',
717
+ value: formatMoney(variantCompareAtPrice),
718
+ },
719
+ {
720
+ id: 'unit-cost',
721
+ label: 'Unit cost',
722
+ value: formatMoney(variantCostPerItem),
723
+ },
724
+ {
725
+ id: 'brooklyn-stock',
726
+ label: 'Brooklyn Warehouse',
727
+ value: `${variantDraft.inventory ?? '42'} available`,
728
+ },
729
+ ]}
730
+ onDuplicateVariant={() => { const source = variantState.find((row) => row.id === editingVariantId); if (source) openVariantEditor(duplicateVariant(source)); }}
731
+ />
732
+ <FormSection title="Variant pricing & identifiers">
733
+ <Grid columns={{ base: 1, sm: 3 }} gap="lg">
734
+ <FormField label="Compare-at price">
735
+ <Input
736
+ aria-label="Compare-at price"
737
+ startAddon="$"
738
+ value={variantCompareAtPrice}
739
+ onChange={(event) => setVariantCompareAtPrice(event.target.value)}
740
+ />
741
+ </FormField>
742
+ <FormField label="Cost per item">
743
+ <Input
744
+ aria-label="Cost per item"
745
+ startAddon="$"
746
+ value={variantCostPerItem}
747
+ onChange={(event) => setVariantCostPerItem(event.target.value)}
748
+ />
749
+ </FormField>
750
+ <FormField label="Barcode (UPC / GTIN)">
751
+ <Input
752
+ aria-label="Barcode"
753
+ value={variantBarcode}
754
+ onChange={(event) => setVariantBarcode(event.target.value)}
755
+ />
756
+ </FormField>
757
+ </Grid>
758
+ </FormSection>
759
+ <ProductVariantEditor
760
+ value={variantDraft}
761
+ statusOptions={VARIANT_STATUS_CHOICES}
762
+ optionFields={variantOptionFields}
763
+ onValueChange={setVariantDraft}
764
+ onCancel={variantDrawer.hide}
765
+ onSubmit={handleSaveVariantDraft}
766
+ />
767
+ </Stack>
768
+ </ActionDrawer>
769
+
770
+ <ActionDialog
771
+ {...seoDialog.overlayProps}
772
+ title="Edit search engine listing"
773
+ description="Customize the page title and meta description shown in search results."
774
+ strings={{ confirm: 'Save SEO settings', cancel: 'Cancel' }}
775
+ onConfirm={() => { setSeoTitle(seoDraft.title); setSeoDescription(seoDraft.description); seoDialog.hide(); }}
776
+ >
777
+ <FormSection title="Search engine metadata">
778
+ <FormField label="Page title" required>
779
+ <Input
780
+ aria-label="Page title"
781
+ value={seoDraft.title}
782
+ onChange={(event) => setSeoDraft((draft) => ({ ...draft, title: event.target.value }))}
783
+ />
784
+ </FormField>
785
+ <FormField label="Meta description">
786
+ <Textarea
787
+ aria-label="Meta description"
788
+ rows={4}
789
+ value={seoDraft.description}
790
+ onChange={(event) => setSeoDraft((draft) => ({ ...draft, description: event.target.value }))}
791
+ />
792
+ </FormField>
793
+ </FormSection>
794
+ </ActionDialog>
795
+
796
+ <ActionDialog
797
+ {...previewDialog.overlayProps}
798
+ title="Storefront product preview"
799
+ description="Preview how this product appears on the Online Store."
800
+ strings={{ confirm: 'Done', cancel: 'Close' }}
801
+ onConfirm={previewDialog.hide}
802
+ >
803
+ <Stack gap="md">
804
+ <Stack direction="horizontal" justify="between" align="center" wrap>
805
+ <Text size="lg" weight="semibold">
806
+ {productTitle}
807
+ </Text>
808
+ <Badge tone="success">{priceRangeLabel}</Badge>
809
+ </Stack>
810
+ <Text size="sm" type="secondary">
811
+ {productDescription}
812
+ </Text>
813
+ <MetadataList
814
+ layout="rows"
815
+ density="compact"
816
+ items={[
817
+ {
818
+ id: 'vendor',
819
+ label: 'Vendor',
820
+ value: vendor,
821
+ },
822
+ {
823
+ id: 'variants',
824
+ label: 'Available variants',
825
+ value: `${variantState.length} options (${totalInventory} in stock)`,
826
+ },
827
+ ]}
828
+ />
829
+ </Stack>
830
+ </ActionDialog>
831
+ </Page>
832
+ );
833
+ }
834
+ export default ProductsAdminTemplate;