themelia-react-ui 2.0.4 → 2.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +135 -0
- package/README.md +113 -18
- package/dist/{accordion-96o0pN62.js → accordion-B9MHG0cT.js} +11 -11
- package/dist/accordion-B9MHG0cT.js.map +1 -0
- package/dist/{action-menu-CHgs8vmj.js → action-menu-Dr8K-ghE.js} +48 -45
- package/dist/action-menu-Dr8K-ghE.js.map +1 -0
- package/dist/{affordance-geometry.generated-B8yGOr8-.js → affordance-geometry.generated-P-aVJisu.js} +36 -36
- package/dist/affordance-geometry.generated-P-aVJisu.js.map +1 -0
- package/dist/{ai-artifact-BZUGwBq6.js → ai-artifact-C58tQcBy.js} +210 -174
- package/dist/ai-artifact-C58tQcBy.js.map +1 -0
- package/dist/app-shell-B_IuNWOo.js +321 -0
- package/dist/app-shell-B_IuNWOo.js.map +1 -0
- package/dist/{attachment-DkoqHPPl.js → attachment-Dg_69lPS.js} +9 -9
- package/dist/{attachment-DkoqHPPl.js.map → attachment-Dg_69lPS.js.map} +1 -1
- package/dist/{auth-D2FVZ1MH.js → auth-DTkkshS8.js} +43 -46
- package/dist/auth-DTkkshS8.js.map +1 -0
- package/dist/{avatar-DWO_HHhB.js → avatar-CeZaFmNH.js} +8 -8
- package/dist/avatar-CeZaFmNH.js.map +1 -0
- package/dist/{badge-DErMA7ul.js → badge-xIiV_E7f.js} +5 -5
- package/dist/{badge-DErMA7ul.js.map → badge-xIiV_E7f.js.map} +1 -1
- package/dist/base/accordion.js +1 -1
- package/dist/base/action-menu.js +1 -1
- package/dist/base/attachment.js +1 -1
- package/dist/base/avatar.js +1 -1
- package/dist/base/badge.js +1 -1
- package/dist/base/batch-action-bar.js +1 -1
- package/dist/base/buttons.js +1 -1
- package/dist/base/cards.js +2 -2
- package/dist/base/carousel.js +3 -3
- package/dist/base/cascader.js +2 -372
- package/dist/base/chart.js +1 -1
- package/dist/base/choice-inputs.js +2 -2
- package/dist/base/code-block.js +1 -1
- package/dist/base/combobox.js +2 -2
- package/dist/base/command.js +1 -1
- package/dist/base/copyable.js +1 -1
- package/dist/base/date-pickers.js +2 -2
- package/dist/base/display.js +6 -6
- package/dist/base/feedback.js +3 -3
- package/dist/base/forms-numeric.js +1 -1
- package/dist/base/forms.js +2 -2
- package/dist/base/inline-edit.js +10 -10
- package/dist/base/item.js +1 -1
- package/dist/base/media-gallery.js +1 -1
- package/dist/base/metadata-list.js +1 -1
- package/dist/base/navigation.js +7 -7
- package/dist/base/popover-menu.js +1 -1
- package/dist/base/popover.js +1 -1
- package/dist/base/qr-code.js +1 -1
- package/dist/base/repeaters.js +12 -12
- package/dist/base/repeaters.js.map +1 -1
- package/dist/base/sheet.js +1 -1
- package/dist/base/sidebar.js +2 -2
- package/dist/base/signature-pad.js +7 -7
- package/dist/base/signature-pad.js.map +1 -1
- package/dist/base/skeleton.js +1 -1
- package/dist/base/spinner.js +4 -4
- package/dist/base/structure.js +1 -1
- package/dist/base/table.js +1 -1
- package/dist/base/text-inputs.js +2 -2
- package/dist/base/toaster.js +36 -36
- package/dist/base/toaster.js.map +1 -1
- package/dist/base/tree.js +1 -1
- package/dist/base/upload-queue.js +1 -1
- package/dist/base/upload.js +3 -3
- package/dist/base/value-inputs.js +1 -1
- package/dist/{batch-action-bar-CdfIkCsV.js → batch-action-bar-Cb8cuvyy.js} +6 -6
- package/dist/batch-action-bar-Cb8cuvyy.js.map +1 -0
- package/dist/blocks/admin.js +21 -21
- package/dist/blocks/admin.js.map +1 -1
- package/dist/blocks/ai.js +230 -216
- package/dist/blocks/ai.js.map +1 -1
- package/dist/blocks/analytics/usage-card.js +1 -1
- package/dist/blocks/analytics.js +325 -306
- package/dist/blocks/analytics.js.map +1 -1
- package/dist/blocks/collaboration.js +1 -1
- package/dist/blocks/commerce/receipt.js +1 -1
- package/dist/blocks/commerce.js +1259 -1184
- package/dist/blocks/commerce.js.map +1 -1
- package/dist/blocks/data-display.js +2 -2
- package/dist/blocks/onboarding.js +6 -6
- package/dist/blocks/onboarding.js.map +1 -1
- package/dist/blocks/planning.js +11 -11
- package/dist/blocks/timelines.js +1 -1
- package/dist/{breadcrumbs-B-WFKecD.js → breadcrumbs-J-K2kl4c.js} +6 -6
- package/dist/{breadcrumbs-B-WFKecD.js.map → breadcrumbs-J-K2kl4c.js.map} +1 -1
- package/dist/{button-DkmK-z8E.js → button-S2Cubiiz.js} +3 -3
- package/dist/button-S2Cubiiz.js.map +1 -0
- package/dist/{buttons-BbfzgczK.js → buttons-BedGfygC.js} +16 -16
- package/dist/buttons-BedGfygC.js.map +1 -0
- package/dist/cards-rNX1M4Xn.js +69 -0
- package/dist/cards-rNX1M4Xn.js.map +1 -0
- package/dist/cascader-B1MiqkBq.js +439 -0
- package/dist/cascader-B1MiqkBq.js.map +1 -0
- package/dist/chart-Darg_0Kv.js +162 -0
- package/dist/chart-Darg_0Kv.js.map +1 -0
- package/dist/{checkbox-CzYUTPeJ.js → checkbox-fflqmODR.js} +2 -2
- package/dist/{checkbox-CzYUTPeJ.js.map → checkbox-fflqmODR.js.map} +1 -1
- package/dist/{choice-inputs-JLtij2y4.js → choice-inputs-zUgBZfE4.js} +258 -257
- package/dist/choice-inputs-zUgBZfE4.js.map +1 -0
- package/dist/{code-block-CGNaUtAE.js → code-block-BzmM9Eig.js} +8 -8
- package/dist/code-block-BzmM9Eig.js.map +1 -0
- package/dist/{collapsible-Do4G0zcC.js → collapsible-BkAI_XD4.js} +5 -5
- package/dist/{collapsible-Do4G0zcC.js.map → collapsible-BkAI_XD4.js.map} +1 -1
- package/dist/{collection-content-C0e8SsTm.js → collection-content-gDh1v6O4.js} +3 -3
- package/dist/{collection-content-C0e8SsTm.js.map → collection-content-gDh1v6O4.js.map} +1 -1
- package/dist/combobox-BEx0vJgF.js +362 -0
- package/dist/combobox-BEx0vJgF.js.map +1 -0
- package/dist/{combobox-CBJDs6w_.js → combobox-BwzoXFSG.js} +254 -247
- package/dist/combobox-BwzoXFSG.js.map +1 -0
- package/dist/{command-D8NrBj-b.js → command-CrlPIL6m.js} +11 -11
- package/dist/command-CrlPIL6m.js.map +1 -0
- package/dist/{comments-Di4w0H_S.js → comments-Dmpp0YIc.js} +29 -29
- package/dist/{comments-Di4w0H_S.js.map → comments-Dmpp0YIc.js.map} +1 -1
- package/dist/components/base/action-menu/action-menu.d.ts +7 -1
- package/dist/components/base/buttons/button-group.recipes.d.ts +2 -2
- package/dist/components/base/cards/card.recipes.d.ts +6 -4
- package/dist/components/base/cards/partials/card-primitives.d.ts +9 -2
- package/dist/components/base/cards/partials/smart-card-header-row.d.ts +3 -1
- package/dist/components/base/cards/smart-card.types.d.ts +3 -4
- package/dist/components/base/cascader/cascader-panel.d.ts +76 -0
- package/dist/components/base/chart/chart.d.ts +6 -1
- package/dist/components/base/choice-inputs/choice-types.d.ts +1 -1
- package/dist/components/base/combobox/index.d.ts +4 -2
- package/dist/components/base/feedback/alert.d.ts +1 -1
- package/dist/components/base/forms/form-sizing.d.ts +7 -7
- package/dist/components/base/forms/workflow.d.ts +7 -1
- package/dist/components/base/forms-numeric/coordinates-input.d.ts +4 -0
- package/dist/components/base/metadata-list/metadata-list.d.ts +1 -1
- package/dist/components/base/navigation/dropdown-menu.d.ts +1 -1
- package/dist/components/base/navigation/page-header/page-header-commands.d.ts +14 -7
- package/dist/components/base/navigation/page-header/page-header.d.ts +10 -3
- package/dist/components/base/popover/popover.d.ts +3 -3
- package/dist/components/base/popover/popover.recipes.d.ts +10 -6
- package/dist/components/base/sheet/sheet.d.ts +2 -0
- package/dist/components/base/sidebar/index.d.ts +1 -1
- package/dist/components/base/sidebar/sidebar.d.ts +27 -5
- package/dist/components/base/toaster/index.d.ts +1 -0
- package/dist/components/blocks/ai/ai-file-tree/types.d.ts +1 -1
- package/dist/components/blocks/ai/ai-tool-call/types.d.ts +3 -1
- package/dist/components/blocks/ai/ai.strings.d.ts +2 -0
- package/dist/components/blocks/analytics/metric-comparison/metric-comparison.d.ts +2 -0
- package/dist/components/blocks/analytics/usage-card/usage-card.strings.d.ts +2 -0
- package/dist/components/blocks/commerce/cart-summary/cart-summary.d.ts +1 -1
- package/dist/components/blocks/commerce/cart-summary/types.d.ts +3 -1
- package/dist/components/blocks/commerce/discount-stack/discount-stack.d.ts +1 -1
- package/dist/components/blocks/commerce/discount-stack/types.d.ts +3 -1
- package/dist/components/blocks/commerce/fulfillment-group/fulfillment-group.d.ts +1 -1
- package/dist/components/blocks/commerce/fulfillment-group/types.d.ts +11 -2
- package/dist/components/blocks/commerce/index.d.ts +7 -6
- package/dist/components/blocks/commerce/inventory-section/inventory-section.d.ts +1 -1
- package/dist/components/blocks/commerce/inventory-section/types.d.ts +7 -2
- package/dist/components/blocks/commerce/invoice-header/index.d.ts +2 -1
- package/dist/components/blocks/commerce/invoice-header/invoice-header.d.ts +1 -1
- package/dist/components/blocks/commerce/invoice-header/types.d.ts +20 -6
- package/dist/components/blocks/commerce/invoice-line-items/invoice-line-items.d.ts +1 -1
- package/dist/components/blocks/commerce/invoice-line-items/types.d.ts +24 -7
- package/dist/components/blocks/commerce/invoice-mini/index.d.ts +2 -1
- package/dist/components/blocks/commerce/invoice-mini/types.d.ts +7 -1
- package/dist/components/blocks/commerce/order-customer/order-customer.d.ts +1 -1
- package/dist/components/blocks/commerce/order-customer/types.d.ts +9 -1
- package/dist/components/blocks/commerce/refund-status/refund-status.d.ts +1 -1
- package/dist/components/blocks/commerce/refund-status/types.d.ts +3 -1
- package/dist/components/blocks/commerce/shipment-tracking/shipment-tracking.d.ts +1 -1
- package/dist/components/blocks/commerce/shipment-tracking/types.d.ts +3 -1
- package/dist/components/blocks/commerce/tax-breakdown/tax-breakdown.d.ts +1 -1
- package/dist/components/blocks/commerce/tax-breakdown/types.d.ts +3 -1
- package/dist/components/features/activities/activities.types.d.ts +8 -2
- package/dist/components/features/activities/partials/activity-marker.d.ts +7 -3
- package/dist/components/features/activities/partials/activity-row.d.ts +24 -0
- package/dist/components/features/event-calendar/colors.d.ts +2 -2
- package/dist/components/features/event-calendar/event-calendar.types.d.ts +4 -0
- package/dist/components/features/filters/facets/select-facet.d.ts +2 -1
- package/dist/components/features/filters/filters.strings.d.ts +4 -0
- package/dist/components/features/filters/filters.types.d.ts +3 -0
- package/dist/components/features/filters/partials/filter-editor-header.d.ts +16 -0
- package/dist/components/features/filters/partials/filter-popover-content.d.ts +1 -1
- package/dist/components/features/filters/partials/nested-filter-options.d.ts +21 -0
- package/dist/components/features/filters/partials/regular-filter-content.d.ts +2 -1
- package/dist/components/features/filters/utils/filter-utils.d.ts +21 -3
- package/dist/components/features/global-search/global-search.types.d.ts +2 -0
- package/dist/components/features/global-search/partials/global-search-input.d.ts +10 -0
- package/dist/components/features/global-search/partials/global-search-result-row.d.ts +7 -1
- package/dist/components/features/media-library/media-library.strings.d.ts +2 -0
- package/dist/components/features/media-library/media-library.types.d.ts +14 -4
- package/dist/components/features/media-library/partials/media-library-partials.d.ts +1 -1
- package/dist/components/features/products/components/product-options-matrix.d.ts +1 -1
- package/dist/components/features/products/components/product-variant-editor.d.ts +1 -1
- package/dist/components/features/products/components/product-variants-manager.d.ts +1 -1
- package/dist/components/features/products/products.strings.d.ts +9 -1
- package/dist/components/features/products/products.types.d.ts +43 -6
- package/dist/components/features/resource/resource.d.ts +5 -1
- package/dist/components/features/resource/resource.types.d.ts +12 -1
- package/dist/components/features/rich-text-editor/partials/image-uploads.d.ts +1 -1
- package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +12 -2
- package/dist/components/features/table/partials/resource-cell.d.ts +22 -5
- package/dist/components/features/table/table.types.d.ts +1 -1
- package/dist/components/layout/app-shell/app-shell.types.d.ts +35 -6
- package/dist/components/layout/app-shell/index.d.ts +1 -1
- package/dist/components/layout/app-shell/shell-regions.d.ts +27 -0
- package/dist/components/layout/app-shell/sidebar-inset-layout.d.ts +1 -1
- package/dist/components/layout/app-shell/stacked-layout.d.ts +1 -1
- package/dist/components/layout/app-shell/topbar-sidebar-layout.d.ts +1 -1
- package/dist/components/layout/containers/two-column-layout.d.ts +2 -0
- package/dist/components/layout/header/header.recipes.d.ts +6 -0
- package/dist/components/layout/header/header.types.d.ts +6 -6
- package/dist/components/layout/navigation/section-nav/section-nav.d.ts +5 -0
- package/dist/components/layout/page/index.d.ts +2 -1
- package/dist/components/layout/page/page.d.ts +1 -0
- package/dist/components/layout/page/page.strings.d.ts +11 -0
- package/dist/components/layout/page/page.types.d.ts +69 -17
- package/dist/components/layout/page/partials/page-header.d.ts +1 -1
- package/dist/components/layout/settings/settings.d.ts +9 -2
- package/dist/components/layout/sidebar/app-sidebar.d.ts +1 -1
- package/dist/components/layout/sidebar/components/sidebar-grouped-navigation.d.ts +1 -1
- package/dist/components/layout/sidebar/components/sidebar-navigation.d.ts +1 -1
- package/dist/components/layout/sidebar/index.d.ts +2 -1
- package/dist/components/layout/sidebar/sidebar-navigation-rail.d.ts +36 -0
- package/dist/components/layout/sidebar/sidebar.context.d.ts +5 -7
- package/dist/components/layout/sidebar/sidebar.types.d.ts +48 -10
- package/dist/components/layout/sidebar/sidebar.utils.d.ts +9 -1
- package/dist/components/layout/workspace/workspace.types.d.ts +8 -1
- package/dist/components/ui/alert-dialog.d.ts +2 -2
- package/dist/components/ui/combobox.d.ts +1 -1
- package/dist/components/ui/dialog.d.ts +2 -2
- package/dist/components/ui/overlay-layer.d.ts +18 -0
- package/dist/components/ui/sheet.d.ts +5 -1
- package/dist/components/ui/sidebar-state.d.ts +82 -0
- package/dist/components/ui/sidebar.d.ts +5 -17
- package/dist/{containers-CRmHf7GP.js → containers-CIxwbZt5.js} +26 -18
- package/dist/containers-CIxwbZt5.js.map +1 -0
- package/dist/{control-group-recipes-DBXmfh2E.js → control-group-recipes-fMuFo0H7.js} +6 -6
- package/dist/control-group-recipes-fMuFo0H7.js.map +1 -0
- package/dist/{copyable-CnGCZdX4.js → copyable-DIznBqiT.js} +7 -7
- package/dist/{copyable-CnGCZdX4.js.map → copyable-DIznBqiT.js.map} +1 -1
- package/dist/{data-display-D4oujtx0.js → data-display-BdgCAw8T.js} +268 -277
- package/dist/data-display-BdgCAw8T.js.map +1 -0
- package/dist/{date-Q7jnXxpk.js → date-Cq8ioE4o.js} +5 -5
- package/dist/{date-Q7jnXxpk.js.map → date-Cq8ioE4o.js.map} +1 -1
- package/dist/{date-picker-zOt1oNss.js → date-picker-RlIzKom_.js} +446 -437
- package/dist/date-picker-RlIzKom_.js.map +1 -0
- package/dist/{date-pickers-cj8IXbDC.js → date-pickers-DY-CpXS1.js} +12 -12
- package/dist/{date-pickers-cj8IXbDC.js.map → date-pickers-DY-CpXS1.js.map} +1 -1
- package/dist/{display-BB4BL_-K.js → display-KsZLw9Ov.js} +9 -9
- package/dist/{display-BB4BL_-K.js.map → display-KsZLw9Ov.js.map} +1 -1
- package/dist/dropdown-menu-CLs8Lihj.js +194 -0
- package/dist/dropdown-menu-CLs8Lihj.js.map +1 -0
- package/dist/features/activities.js +302 -253
- package/dist/features/activities.js.map +1 -1
- package/dist/features/ai-chat.js +15 -14
- package/dist/features/ai-chat.js.map +1 -1
- package/dist/features/appointment-calendar.js +22 -22
- package/dist/features/appointment-calendar.js.map +1 -1
- package/dist/features/async-preview.js +11 -10
- package/dist/features/async-preview.js.map +1 -1
- package/dist/features/combobox.js +1 -1
- package/dist/features/comments.js +1 -1
- package/dist/features/data-view.js +13 -13
- package/dist/features/data-view.js.map +1 -1
- package/dist/features/email-composer.js +237 -238
- package/dist/features/email-composer.js.map +1 -1
- package/dist/features/event-calendar.js +140 -146
- package/dist/features/event-calendar.js.map +1 -1
- package/dist/features/filters.js +1 -1
- package/dist/features/global-search.js +167 -138
- package/dist/features/global-search.js.map +1 -1
- package/dist/features/kanban.js +6 -7
- package/dist/features/kanban.js.map +1 -1
- package/dist/features/map.js +269 -260
- package/dist/features/map.js.map +1 -1
- package/dist/features/media-library.js +375 -326
- package/dist/features/media-library.js.map +1 -1
- package/dist/features/mentions.js +1 -1
- package/dist/features/overlays.js +1 -1
- package/dist/features/products.js +1266 -1193
- package/dist/features/products.js.map +1 -1
- package/dist/features/questionnaire.js +13 -13
- package/dist/features/questionnaire.js.map +1 -1
- package/dist/features/resource-assignment.js +8 -8
- package/dist/features/resource.js +69 -66
- package/dist/features/resource.js.map +1 -1
- package/dist/features/rich-text-editor.js +2 -2
- package/dist/features/schema-form.js +13 -13
- package/dist/features/suggestions.js +3 -3
- package/dist/features/sync.js +3 -3
- package/dist/features/table.js +1 -1
- package/dist/features/theme-tweaker.js +94 -95
- package/dist/features/theme-tweaker.js.map +1 -1
- package/dist/{feedback-DZNL5Lg1.js → feedback-Dm4izqFn.js} +80 -79
- package/dist/feedback-Dm4izqFn.js.map +1 -0
- package/dist/{field-affordance-recipes-DjwGx8eM.js → field-affordance-recipes-DWcNcOjh.js} +4 -4
- package/dist/field-affordance-recipes-DWcNcOjh.js.map +1 -0
- package/dist/{filters-BcT-uoFy.js → filters-DzgSJpMK.js} +693 -645
- package/dist/filters-DzgSJpMK.js.map +1 -0
- package/dist/{form-field-CsgRmdit.js → form-field-BriWAXyg.js} +6 -6
- package/dist/{form-field-CsgRmdit.js.map → form-field-BriWAXyg.js.map} +1 -1
- package/dist/{form-sizing-NXgjkmBG.js → form-sizing-Bs2qFUeE.js} +4 -4
- package/dist/form-sizing-Bs2qFUeE.js.map +1 -0
- package/dist/{forms-BV5m5aQF.js → forms-C0RGnJTe.js} +17 -13
- package/dist/forms-C0RGnJTe.js.map +1 -0
- package/dist/{forms-numeric-Cd33AKbD.js → forms-numeric-DIhghX1Q.js} +86 -82
- package/dist/forms-numeric-DIhghX1Q.js.map +1 -0
- package/dist/{header-BA697l4a.js → header-DMMxG__r.js} +67 -63
- package/dist/header-DMMxG__r.js.map +1 -0
- package/dist/header.recipes-BigdJjw1.js +6 -0
- package/dist/header.recipes-BigdJjw1.js.map +1 -0
- package/dist/{hooks-BQ-L7Uu2.js → hooks-DB6CJ4MR.js} +26 -14
- package/dist/hooks-DB6CJ4MR.js.map +1 -0
- package/dist/{icon-badge-COWbCCWu.js → icon-badge-DZF-YjQp.js} +4 -4
- package/dist/{icon-badge-COWbCCWu.js.map → icon-badge-DZF-YjQp.js.map} +1 -1
- package/dist/index.js +4 -5
- package/dist/{input-Cdw4k0fb.js → input-CvyDQlY7.js} +8 -8
- package/dist/{input-Cdw4k0fb.js.map → input-CvyDQlY7.js.map} +1 -1
- package/dist/input-DMBwAZmr.js +21 -0
- package/dist/input-DMBwAZmr.js.map +1 -0
- package/dist/{item-BvZ2DR_x.js → item-DjCcM18E.js} +16 -16
- package/dist/item-DjCcM18E.js.map +1 -0
- package/dist/layout/app-shell.js +1 -1
- package/dist/layout/auth.js +1 -1
- package/dist/layout/containers.js +1 -1
- package/dist/layout/header.js +1 -1
- package/dist/layout/hooks.js +1 -1
- package/dist/layout/navigation.js +1 -1
- package/dist/layout/page.js +2 -2
- package/dist/layout/settings.js +1 -1
- package/dist/layout/sidebar.js +3 -3
- package/dist/layout/workspace.js +1 -1
- package/dist/layout.js +11 -11
- package/dist/lib/affordance-geometry.generated.d.ts +35 -35
- package/dist/lib/control-group-recipes.d.ts +5 -5
- package/dist/lib/field-affordance-recipes.d.ts +2 -2
- package/dist/lib/motion-recipes.d.ts +3 -0
- package/dist/lib/navigation-row-recipes.d.ts +7 -7
- package/dist/lib/overlay-anatomy-recipes.d.ts +3 -3
- package/dist/lib/portal-recipes.d.ts +3 -0
- package/dist/lib/token-merge.generated.d.ts +13 -10
- package/dist/lib/utils.js +1 -1
- package/dist/map-demo-tile.svg +1 -1
- package/dist/{media-gallery-CSl5W1Fy.js → media-gallery-C-vChPmE.js} +6 -6
- package/dist/{media-gallery-CSl5W1Fy.js.map → media-gallery-C-vChPmE.js.map} +1 -1
- package/dist/{mentions-RKOQaaIB.js → mentions-0_4nWuI-.js} +10 -10
- package/dist/{mentions-RKOQaaIB.js.map → mentions-0_4nWuI-.js.map} +1 -1
- package/dist/{message-INU2xsxu.js → message-g8p7eVtN.js} +7 -7
- package/dist/message-g8p7eVtN.js.map +1 -0
- package/dist/{metadata-list-qVV7AVxa.js → metadata-list-C3MkU-Om.js} +64 -64
- package/dist/metadata-list-C3MkU-Om.js.map +1 -0
- package/dist/{motion-recipes-ChBg4HBq.js → motion-recipes-DitYv6P2.js} +10 -2
- package/dist/motion-recipes-DitYv6P2.js.map +1 -0
- package/dist/navigation-C90-oQFq.js +255 -0
- package/dist/navigation-C90-oQFq.js.map +1 -0
- package/dist/{navigation-BQNcg1jT.js → navigation-DaRjthVk.js} +101 -82
- package/dist/navigation-DaRjthVk.js.map +1 -0
- package/dist/{navigation-row-recipes-WZEs-hYo.js → navigation-row-recipes-BGVLvU_O.js} +9 -9
- package/dist/navigation-row-recipes-BGVLvU_O.js.map +1 -0
- package/dist/{number-E_OiIfJz.js → number-CRU3kGuk.js} +5 -5
- package/dist/{number-E_OiIfJz.js.map → number-CRU3kGuk.js.map} +1 -1
- package/dist/overflow-tab-bar-IVFVQFV6.js +172 -0
- package/dist/overflow-tab-bar-IVFVQFV6.js.map +1 -0
- package/dist/overlays-BSgCtM2v.js +1013 -0
- package/dist/overlays-BSgCtM2v.js.map +1 -0
- package/dist/page-DUUKDAjo.js +331 -0
- package/dist/page-DUUKDAjo.js.map +1 -0
- package/dist/page-header-commands-7P3sfE9u.js +193 -0
- package/dist/page-header-commands-7P3sfE9u.js.map +1 -0
- package/dist/{pagination-Ch8X_47u.js → pagination-CgCjElfu.js} +7 -7
- package/dist/{pagination-Ch8X_47u.js.map → pagination-CgCjElfu.js.map} +1 -1
- package/dist/popover-B85RenIl.js +201 -0
- package/dist/popover-B85RenIl.js.map +1 -0
- package/dist/{popover-menu-BYaCdFhf.js → popover-menu-DlnQ2zlR.js} +7 -7
- package/dist/{popover-menu-BYaCdFhf.js.map → popover-menu-DlnQ2zlR.js.map} +1 -1
- package/dist/{popover.recipes-D3j8R8Yp.js → popover.recipes-DdiEp0rd.js} +18 -11
- package/dist/popover.recipes-DdiEp0rd.js.map +1 -0
- package/dist/portal-recipes-BpsV_iRw.js +9 -0
- package/dist/portal-recipes-BpsV_iRw.js.map +1 -0
- package/dist/{primitives-Du64iDbb.js → primitives-ByWgGUgt.js} +5 -5
- package/dist/{primitives-Du64iDbb.js.map → primitives-ByWgGUgt.js.map} +1 -1
- package/dist/primitives.js +4 -4
- package/dist/{progress-BvF2oCdV.js → progress-BJhQP9WX.js} +9 -9
- package/dist/{progress-BvF2oCdV.js.map → progress-BJhQP9WX.js.map} +1 -1
- package/dist/{receipt-D789Jwyy.js → receipt-tOc7B3hw.js} +7 -7
- package/dist/receipt-tOc7B3hw.js.map +1 -0
- package/dist/{rich-text-CLJEf76s.js → rich-text-Dth5E882.js} +3 -3
- package/dist/{rich-text-CLJEf76s.js.map → rich-text-Dth5E882.js.map} +1 -1
- package/dist/{rich-text-editor-Cm1dpUpQ.js → rich-text-editor-C1fOjBTd.js} +429 -430
- package/dist/rich-text-editor-C1fOjBTd.js.map +1 -0
- package/dist/{rich-text-editor-toolbar-L__e4x47.js → rich-text-editor-toolbar-laT3tpBT.js} +32 -28
- package/dist/rich-text-editor-toolbar-laT3tpBT.js.map +1 -0
- package/dist/{scroll-area-La5RXsEk.js → scroll-area-B0dB2cBi.js} +2 -2
- package/dist/{scroll-area-La5RXsEk.js.map → scroll-area-B0dB2cBi.js.map} +1 -1
- package/dist/{separator-DAEV0w65.js → separator-Bb17I4pu.js} +2 -2
- package/dist/{separator-DAEV0w65.js.map → separator-Bb17I4pu.js.map} +1 -1
- package/dist/{separator-GNfPG-90.js → separator-Ct_WSWTJ.js} +3 -3
- package/dist/{separator-GNfPG-90.js.map → separator-Ct_WSWTJ.js.map} +1 -1
- package/dist/services/actions.js +1 -1
- package/dist/{settings-BA2iboic.js → settings-Bar5wiSo.js} +31 -38
- package/dist/settings-Bar5wiSo.js.map +1 -0
- package/dist/sheet-BGPERY55.js +250 -0
- package/dist/sheet-BGPERY55.js.map +1 -0
- package/dist/sidebar-D-JYMMbY.js +686 -0
- package/dist/sidebar-D-JYMMbY.js.map +1 -0
- package/dist/sidebar-f9gRWXIR.js +1001 -0
- package/dist/sidebar-f9gRWXIR.js.map +1 -0
- package/dist/skeleton-BapcJd9C.js +265 -0
- package/dist/skeleton-BapcJd9C.js.map +1 -0
- package/dist/smart-card-CW0hjetE.js +617 -0
- package/dist/smart-card-CW0hjetE.js.map +1 -0
- package/dist/{structure-C0V0_Fyf.js → structure-DuxKl954.js} +2 -2
- package/dist/{structure-C0V0_Fyf.js.map → structure-DuxKl954.js.map} +1 -1
- package/dist/style.css +1 -1
- package/dist/{table-CpvnzJn9.js → table-B4TE7iOV.js} +3 -3
- package/dist/{table-CpvnzJn9.js.map → table-B4TE7iOV.js.map} +1 -1
- package/dist/{table-DH7rozUv.js → table-CFOWY9pQ.js} +394 -388
- package/dist/table-CFOWY9pQ.js.map +1 -0
- package/dist/{tabs-eqVsJZWO.js → tabs-e7ko9S2o.js} +11 -11
- package/dist/tabs-e7ko9S2o.js.map +1 -0
- package/dist/{text-inputs-DXItiR0O.js → text-inputs-B1culiSK.js} +17 -17
- package/dist/text-inputs-B1culiSK.js.map +1 -0
- package/dist/theme.css +40 -37
- package/dist/{timelines-DmtztAY_.js → timelines-D3Sl9ueq.js} +13 -12
- package/dist/timelines-D3Sl9ueq.js.map +1 -0
- package/dist/tooltip-8wz5S_Zr.js +113 -0
- package/dist/tooltip-8wz5S_Zr.js.map +1 -0
- package/dist/{tree-CV11PURP.js → tree-CzUJHnFs.js} +8 -8
- package/dist/{tree-CV11PURP.js.map → tree-CzUJHnFs.js.map} +1 -1
- package/dist/typography/rich-text.js +1 -1
- package/dist/{typography-CSyJrh28.js → typography-BQnine1k.js} +12 -12
- package/dist/{typography-CSyJrh28.js.map → typography-BQnine1k.js.map} +1 -1
- package/dist/typography.js +1 -1
- package/dist/ui-provider-C-74NVLc.js +178 -0
- package/dist/ui-provider-C-74NVLc.js.map +1 -0
- package/dist/ui-provider.js +2 -3
- package/dist/{upload-C9SA0X-8.js → upload-BOW6U2tI.js} +25 -24
- package/dist/upload-BOW6U2tI.js.map +1 -0
- package/dist/{upload-queue-DhQJiSRc.js → upload-queue-qUXn1ykN.js} +16 -14
- package/dist/upload-queue-qUXn1ykN.js.map +1 -0
- package/dist/{usage-card-DVTRDmGz.js → usage-card-BeSLY0i0.js} +24 -17
- package/dist/usage-card-BeSLY0i0.js.map +1 -0
- package/dist/{utils-CF3c95Io.js → utils-B6kKb8jB.js} +237 -141
- package/dist/utils-B6kKb8jB.js.map +1 -0
- package/dist/value-inputs-skdVB2zh.js +980 -0
- package/dist/value-inputs-skdVB2zh.js.map +1 -0
- package/dist/{value-typography-ClupF0Gz.js → value-typography-uAmWUAL1.js} +2 -2
- package/dist/{value-typography-ClupF0Gz.js.map → value-typography-uAmWUAL1.js.map} +1 -1
- package/dist/{workspace-9EFVXUyk.js → workspace-DHeHv0qw.js} +50 -49
- package/dist/workspace-DHeHv0qw.js.map +1 -0
- package/docs/consumer-skill/SKILL.md +4 -3
- package/docs/consumer-skill/agents/themelia-ui-designer.md +96 -0
- package/docs/consumer-skill/examples/app-layout.tsx +52 -1
- package/docs/consumer-skill/examples/commerce-lines.tsx +271 -0
- package/docs/consumer-skill/examples/custom-composition.tsx +21 -0
- package/docs/consumer-skill/examples/detail.tsx +5 -4
- package/docs/consumer-skill/examples/editable-sections.tsx +38 -0
- package/docs/consumer-skill/examples/index-table.tsx +4 -4
- package/docs/consumer-skill/examples/manifest.json +38 -1
- package/docs/consumer-skill/examples/product-media.tsx +41 -0
- package/docs/consumer-skill/examples/product-parts.tsx +81 -0
- package/docs/consumer-skill/examples/rhf-edit-page.tsx +1 -1
- package/docs/consumer-skill/examples/rhf-overlay-form.tsx +24 -11
- package/docs/consumer-skill/examples/token-domain-structure.tsx +68 -0
- package/docs/consumer-skill/references/agents-md.md +19 -17
- package/docs/consumer-skill/references/analytics.md +18 -1
- package/docs/consumer-skill/references/commerce-composition.md +97 -0
- package/docs/consumer-skill/references/component-contracts.json +7131 -1754
- package/docs/consumer-skill/references/composition-mapping.md +17 -3
- package/docs/consumer-skill/references/composition.md +159 -31
- package/docs/consumer-skill/references/critique-rubric.md +98 -0
- package/docs/consumer-skill/references/custom-composition.md +261 -0
- package/docs/consumer-skill/references/data-reading.md +79 -0
- package/docs/consumer-skill/references/design-contract.md +11 -9
- package/docs/consumer-skill/references/discovery.md +27 -3
- package/docs/consumer-skill/references/domain-structures.md +124 -0
- package/docs/consumer-skill/references/installation.md +15 -4
- package/docs/consumer-skill/references/integration.md +35 -0
- package/docs/consumer-skill/references/product-composition.md +94 -0
- package/docs/consumer-skill/references/public-api.json +2881 -420
- package/docs/consumer-skill/references/review.md +39 -2
- package/docs/consumer-skill/references/rhf-workflows.md +7 -0
- package/docs/consumer-skill/references/screen-archetypes.md +19 -7
- package/docs/consumer-skill/references/screen-decisions.md +126 -0
- package/docs/consumer-skill/references/theming.md +17 -18
- package/docs/consumer-skill/references/tokens.json +9 -9
- package/docs/consumer-skill/references/view-craft.md +153 -0
- package/docs/consumer-skill/references/view-spec.md +73 -0
- package/docs/consumer-skill/references/workflows.md +7 -1
- package/docs/consumer-skill/scripts/composition-policy.mjs +39 -3
- package/docs/consumer-skill/scripts/composition-schema.mjs +1 -1
- package/docs/consumer-skill/scripts/composition.mjs +61 -5
- package/docs/consumer-skill/scripts/discovery.mjs +54 -0
- package/docs/consumer-skill/scripts/inspect-component.mjs +1 -1
- package/docs/consumer-skill/scripts/inspection.mjs +73 -18
- package/docs/consumer-skill/scripts/setup-skills.mjs +41 -6
- package/docs/consumer-skill/scripts/surface-policy.mjs +5 -5
- package/docs/consumer-skills/themelia-components/SKILL.md +14 -13
- package/docs/consumer-skills/themelia-composition/SKILL.md +16 -17
- package/docs/consumer-skills/themelia-design/SKILL.md +55 -0
- package/docs/consumer-skills/themelia-foundation/SKILL.md +2 -1
- package/docs/consumer-skills/themelia-tokenization/SKILL.md +24 -17
- package/package.json +1 -1
- package/dist/accordion-96o0pN62.js.map +0 -1
- package/dist/action-menu-CHgs8vmj.js.map +0 -1
- package/dist/affordance-geometry.generated-B8yGOr8-.js.map +0 -1
- package/dist/ai-artifact-BZUGwBq6.js.map +0 -1
- package/dist/app-shell-D63ATkIK.js +0 -237
- package/dist/app-shell-D63ATkIK.js.map +0 -1
- package/dist/auth-D2FVZ1MH.js.map +0 -1
- package/dist/avatar-DWO_HHhB.js.map +0 -1
- package/dist/base/cascader.js.map +0 -1
- package/dist/batch-action-bar-CdfIkCsV.js.map +0 -1
- package/dist/button-DkmK-z8E.js.map +0 -1
- package/dist/buttons-BbfzgczK.js.map +0 -1
- package/dist/cards-4JTWqvVe.js +0 -68
- package/dist/cards-4JTWqvVe.js.map +0 -1
- package/dist/chart-C19flDQb.js +0 -155
- package/dist/chart-C19flDQb.js.map +0 -1
- package/dist/choice-inputs-JLtij2y4.js.map +0 -1
- package/dist/code-block-CGNaUtAE.js.map +0 -1
- package/dist/combobox-CBJDs6w_.js.map +0 -1
- package/dist/combobox-hbhSS18O.js +0 -355
- package/dist/combobox-hbhSS18O.js.map +0 -1
- package/dist/command-D8NrBj-b.js.map +0 -1
- package/dist/containers-CRmHf7GP.js.map +0 -1
- package/dist/control-group-recipes-DBXmfh2E.js.map +0 -1
- package/dist/data-display-D4oujtx0.js.map +0 -1
- package/dist/date-picker-zOt1oNss.js.map +0 -1
- package/dist/dropdown-menu-CjY8Vt7W.js +0 -193
- package/dist/dropdown-menu-CjY8Vt7W.js.map +0 -1
- package/dist/feedback-DZNL5Lg1.js.map +0 -1
- package/dist/field-affordance-recipes-DjwGx8eM.js.map +0 -1
- package/dist/filters-BcT-uoFy.js.map +0 -1
- package/dist/form-sizing-NXgjkmBG.js.map +0 -1
- package/dist/forms-BV5m5aQF.js.map +0 -1
- package/dist/forms-numeric-Cd33AKbD.js.map +0 -1
- package/dist/header-BA697l4a.js.map +0 -1
- package/dist/hooks-BQ-L7Uu2.js.map +0 -1
- package/dist/input-DOPL5_QE.js +0 -21
- package/dist/input-DOPL5_QE.js.map +0 -1
- package/dist/item-BvZ2DR_x.js.map +0 -1
- package/dist/message-INU2xsxu.js.map +0 -1
- package/dist/metadata-list-qVV7AVxa.js.map +0 -1
- package/dist/motion-recipes-ChBg4HBq.js.map +0 -1
- package/dist/navigation-BQNcg1jT.js.map +0 -1
- package/dist/navigation-DLF3E1IC.js +0 -145
- package/dist/navigation-DLF3E1IC.js.map +0 -1
- package/dist/navigation-row-recipes-WZEs-hYo.js.map +0 -1
- package/dist/overflow-tab-bar-CrbqMteP.js +0 -284
- package/dist/overflow-tab-bar-CrbqMteP.js.map +0 -1
- package/dist/overlays-BlKynmde.js +0 -1004
- package/dist/overlays-BlKynmde.js.map +0 -1
- package/dist/page-CIwNUtGr.js +0 -227
- package/dist/page-CIwNUtGr.js.map +0 -1
- package/dist/page-header-commands-DFMlNYzN.js +0 -128
- package/dist/page-header-commands-DFMlNYzN.js.map +0 -1
- package/dist/popover-uwzX2vo7.js +0 -198
- package/dist/popover-uwzX2vo7.js.map +0 -1
- package/dist/popover.recipes-D3j8R8Yp.js.map +0 -1
- package/dist/receipt-D789Jwyy.js.map +0 -1
- package/dist/rich-text-editor-Cm1dpUpQ.js.map +0 -1
- package/dist/rich-text-editor-toolbar-L__e4x47.js.map +0 -1
- package/dist/settings-BA2iboic.js.map +0 -1
- package/dist/sheet-DoAxTb2J.js +0 -213
- package/dist/sheet-DoAxTb2J.js.map +0 -1
- package/dist/sidebar-ByqKR_W5.js +0 -512
- package/dist/sidebar-ByqKR_W5.js.map +0 -1
- package/dist/sidebar-D2iSnGJ7.js +0 -619
- package/dist/sidebar-D2iSnGJ7.js.map +0 -1
- package/dist/skeleton-CUj8O5Bd.js +0 -264
- package/dist/skeleton-CUj8O5Bd.js.map +0 -1
- package/dist/smart-card-CqkzQsK-.js +0 -614
- package/dist/smart-card-CqkzQsK-.js.map +0 -1
- package/dist/table-DH7rozUv.js.map +0 -1
- package/dist/tabs-eqVsJZWO.js.map +0 -1
- package/dist/text-inputs-DXItiR0O.js.map +0 -1
- package/dist/theme-scope-BJ6eE2xt.js +0 -50
- package/dist/theme-scope-BJ6eE2xt.js.map +0 -1
- package/dist/timelines-DmtztAY_.js.map +0 -1
- package/dist/tooltip-B4hjKtoV.js +0 -111
- package/dist/tooltip-B4hjKtoV.js.map +0 -1
- package/dist/ui-provider-CQCuCBcy.js +0 -136
- package/dist/ui-provider-CQCuCBcy.js.map +0 -1
- package/dist/upload-C9SA0X-8.js.map +0 -1
- package/dist/upload-queue-DhQJiSRc.js.map +0 -1
- package/dist/usage-card-DVTRDmGz.js.map +0 -1
- package/dist/use-mobile-vaLKwgyf.js +0 -15
- package/dist/use-mobile-vaLKwgyf.js.map +0 -1
- package/dist/utils-CF3c95Io.js.map +0 -1
- package/dist/value-inputs-C0o70p-U.js +0 -980
- package/dist/value-inputs-C0o70p-U.js.map +0 -1
- package/dist/workspace-9EFVXUyk.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Button } from 'themelia-react-ui/base/buttons';
|
|
2
|
-
import {
|
|
2
|
+
import { Page } from 'themelia-react-ui/layout/page';
|
|
3
3
|
import { Stack } from 'themelia-react-ui/base/structure';
|
|
4
4
|
import { DataTable, type DataTableProps } from 'themelia-react-ui/features/table';
|
|
5
5
|
import { Email, Name } from 'themelia-react-ui/primitives';
|
|
@@ -23,14 +23,14 @@ export function AccountIndex({ state, onRetry, hrefFor, onNavigate }: AccountInd
|
|
|
23
23
|
{ accessorKey: 'name', header: 'Name', cell: ({ row }) => <Name value={row.original.name} /> },
|
|
24
24
|
{ accessorKey: 'email', header: 'Email', cell: ({ row }) => <Email value={row.original.email} /> },
|
|
25
25
|
];
|
|
26
|
-
return <
|
|
26
|
+
return <Page header={{ title: 'Accounts' }}>
|
|
27
27
|
{state.status === 'loading' ? <Text role="status">Loading accounts…</Text> :
|
|
28
28
|
state.status === 'error' ? <Stack gap="md">
|
|
29
29
|
<Text role="alert" type="error">{state.message}</Text>
|
|
30
30
|
<Button onClick={onRetry}>Retry loading</Button>
|
|
31
|
-
</Stack> : <DataTable columns={columns} data={state.records}
|
|
31
|
+
</Stack> : <DataTable columns={columns} data={state.records}
|
|
32
32
|
getRowId={account => account.id} enablePagination={false} showFullscreenToggle={false}
|
|
33
33
|
emptyStateMessage="No accounts yet." emptyStateAction={<Button onClick={onRetry}>Refresh accounts</Button>}
|
|
34
34
|
rowActions={[{ id: 'open', label: 'Open account', onClick: account => onNavigate(hrefFor(account)) }]} />}
|
|
35
|
-
</
|
|
35
|
+
</Page>;
|
|
36
36
|
}
|
|
@@ -1,6 +1,42 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"examples": [
|
|
4
|
+
{
|
|
5
|
+
"file": "product-parts.tsx",
|
|
6
|
+
"exports": ["ProductOptionDefinitions", "ProductVariantManagement", "VariantComparison", "VariantInspectionAndEditor"],
|
|
7
|
+
"phase": "optional",
|
|
8
|
+
"optionalPeers": ["@tanstack/react-table", "react-hook-form"]
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"file": "product-media.tsx",
|
|
12
|
+
"exports": ["LocalProductImages", "AttachedProductImages", "MediaOnlyProductOverview"],
|
|
13
|
+
"phase": "optional",
|
|
14
|
+
"optionalPeers": ["@dnd-kit/core", "@dnd-kit/sortable", "@dnd-kit/utilities", "@tanstack/react-table", "react-hook-form"]
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"file": "token-domain-structure.tsx",
|
|
18
|
+
"exports": ["AllocationByLocation", "AllocationSubjectExample"],
|
|
19
|
+
"phase": "basic",
|
|
20
|
+
"optionalPeers": []
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"file": "commerce-lines.tsx",
|
|
24
|
+
"exports": ["SoldProductWithSummary", "CustomServiceInvoice", "OrderFulfillmentDetail", "ReceivableInvoiceDetail"],
|
|
25
|
+
"phase": "optional",
|
|
26
|
+
"optionalPeers": ["react-day-picker", "react-hook-form", "sonner"]
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"file": "editable-sections.tsx",
|
|
30
|
+
"exports": ["EditableSections"],
|
|
31
|
+
"phase": "basic",
|
|
32
|
+
"optionalPeers": []
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"file": "custom-composition.tsx",
|
|
36
|
+
"exports": ["AssessmentComparison"],
|
|
37
|
+
"phase": "basic",
|
|
38
|
+
"optionalPeers": []
|
|
39
|
+
},
|
|
4
40
|
{
|
|
5
41
|
"file": "website.tsx",
|
|
6
42
|
"exports": [
|
|
@@ -162,7 +198,8 @@
|
|
|
162
198
|
{
|
|
163
199
|
"file": "rhf-overlay-form.tsx",
|
|
164
200
|
"exports": [
|
|
165
|
-
"RHFOverlayForm"
|
|
201
|
+
"RHFOverlayForm",
|
|
202
|
+
"RHFDialogForm"
|
|
166
203
|
],
|
|
167
204
|
"phase": "optional",
|
|
168
205
|
"optionalPeers": [
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { FormField } from 'themelia-react-ui/base/forms';
|
|
2
|
+
import { MediaGallery } from 'themelia-react-ui/base/media-gallery';
|
|
3
|
+
import { MediaResourceGallery, type MediaLibraryAccessors } from 'themelia-react-ui/features/media-library';
|
|
4
|
+
import { ProductOverview } from 'themelia-react-ui/features/products';
|
|
5
|
+
|
|
6
|
+
/** New local files remain File[]; the caller owns transfer and persistence. */
|
|
7
|
+
export function LocalProductImages({ files, onFilesChange }: { files: File[]; onFilesChange: (files: File[]) => void }) {
|
|
8
|
+
return <FormField label="New product images" hint="The first image is the cover. Drag or use the keyboard to change order.">
|
|
9
|
+
<MediaGallery value={files} onValueChange={onFilesChange} accept="image/*" maxFiles={6} />
|
|
10
|
+
</FormField>;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface ProductAsset { key: string; filename: string; url: string; altText: string; }
|
|
14
|
+
const accessors: MediaLibraryAccessors<ProductAsset> = {
|
|
15
|
+
getId: item => item.key, getName: item => item.filename, getType: () => 'image',
|
|
16
|
+
getSrc: item => item.url, getAlt: item => item.altText,
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/** Existing records stay records; callbacks propose resource attachment changes. */
|
|
20
|
+
export function AttachedProductImages({ assets, primaryId, onAssetsChange, onPrimaryChange, onAdd }: {
|
|
21
|
+
assets: ProductAsset[];
|
|
22
|
+
primaryId?: string;
|
|
23
|
+
onAssetsChange: (assets: ProductAsset[]) => void;
|
|
24
|
+
onPrimaryChange: (id: string | undefined) => void;
|
|
25
|
+
onAdd?: () => void;
|
|
26
|
+
}) {
|
|
27
|
+
return <MediaResourceGallery items={assets} accessors={accessors} title="Product media" layout="grid"
|
|
28
|
+
primaryId={primaryId} onPrimaryChange={id => onPrimaryChange(id)} onAdd={onAdd}
|
|
29
|
+
onReorder={(_ids, next) => onAssetsChange(next)} onRemove={id => {
|
|
30
|
+
const next = assets.filter(asset => asset.key !== id);
|
|
31
|
+
onAssetsChange(next);
|
|
32
|
+
if (id === (primaryId ?? assets[0]?.key)) onPrimaryChange(next[0]?.key);
|
|
33
|
+
}} />;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** ProductOverview owns the subject; media enters through details.media, not a top-level media prop. */
|
|
37
|
+
export function MediaOnlyProductOverview({ assets }: { assets: ProductAsset[] }) {
|
|
38
|
+
return <ProductOverview details={{ title: 'Product media', description: false,
|
|
39
|
+
media: <MediaResourceGallery items={assets} accessors={accessors} readOnly layout="field" />,
|
|
40
|
+
}} />;
|
|
41
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { useState, type ReactNode } from 'react';
|
|
2
|
+
import { Alert, AlertDescription } from 'themelia-react-ui/base/feedback';
|
|
3
|
+
import { Stack } from 'themelia-react-ui/base/structure';
|
|
4
|
+
import {
|
|
5
|
+
ProductOptionsMatrix, ProductVariantDetails, ProductVariantEditor,
|
|
6
|
+
ProductVariantsBulkTable, ProductVariantsManager,
|
|
7
|
+
type ProductOptionEditDraft, type ProductOptionGroup,
|
|
8
|
+
type ProductVariantEditorValues, type ProductVariantRow,
|
|
9
|
+
} from 'themelia-react-ui/features/products';
|
|
10
|
+
import { Money } from 'themelia-react-ui/primitives';
|
|
11
|
+
|
|
12
|
+
const colors: ProductOptionGroup[] = [{
|
|
13
|
+
id: 'color', name: 'Color', values: [{ id: 'olive', label: 'Olive' }, { id: 'natural', label: 'Natural' }],
|
|
14
|
+
}];
|
|
15
|
+
const rows: ProductVariantRow[] = [
|
|
16
|
+
{ id: 'weekender-olive', name: 'Olive', sku: 'WEEK-OLIVE', price: '€68.00', inventory: '7 available', status: 'Active', optionValueIds: { color: 'olive' } },
|
|
17
|
+
{ id: 'weekender-natural', name: 'Natural', sku: 'WEEK-NATURAL', price: '€68.00', inventory: '12 available', status: 'Active', optionValueIds: { color: 'natural' } },
|
|
18
|
+
];
|
|
19
|
+
|
|
20
|
+
/** Local definition-editing example. Variant reconciliation is a separate app rule. */
|
|
21
|
+
export function ProductOptionDefinitions() {
|
|
22
|
+
const [groups, setGroups] = useState(colors);
|
|
23
|
+
const [editingId, setEditingId] = useState<string | null>(null);
|
|
24
|
+
return <ProductOptionsMatrix optionGroups={groups} editingOptionId={editingId}
|
|
25
|
+
onEditingOptionIdChange={setEditingId} showVariantToggle={false}
|
|
26
|
+
onSaveEditingOption={(option, draft) => {
|
|
27
|
+
setGroups(current => current.map(group => group.id === option.id ? { ...group, name: draft.name, values: draft.values } : group));
|
|
28
|
+
}} />;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Callbacks apply app-owned accepted definitions/rows; the manager does not generate business data. */
|
|
32
|
+
export function ProductVariantManagement({ optionGroups, variants, onSaveOption, onInspectVariant }: {
|
|
33
|
+
optionGroups: ProductOptionGroup[];
|
|
34
|
+
variants: ProductVariantRow[];
|
|
35
|
+
onSaveOption: (option: ProductOptionGroup, draft: ProductOptionEditDraft) => void | Promise<void>;
|
|
36
|
+
onInspectVariant: (variant: ProductVariantRow) => void;
|
|
37
|
+
}) {
|
|
38
|
+
const [editingId, setEditingId] = useState<string | null>(null);
|
|
39
|
+
return <ProductVariantsManager optionGroups={optionGroups} variants={variants}
|
|
40
|
+
editingOptionId={editingId} onEditingOptionIdChange={setEditingId}
|
|
41
|
+
onSaveEditingOption={onSaveOption}
|
|
42
|
+
onSelectVariant={onInspectVariant} groupByOptionId={null}
|
|
43
|
+
visibleColumns={['variant', 'sku', 'price', 'inventory', 'status']} selectionMode="none" cellDisplay="text" />;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** A comparison can use the table independently from option-definition editing. */
|
|
47
|
+
export function VariantComparison({ onInspectVariant }: { onInspectVariant: (variant: ProductVariantRow) => void }) {
|
|
48
|
+
return <ProductVariantsBulkTable variants={rows} optionGroups={colors} groupByOptionId={null}
|
|
49
|
+
visibleColumns={['variant', 'sku', 'price', 'inventory', 'status']} selectionMode="none"
|
|
50
|
+
cellDisplay="text" onSelectVariant={onInspectVariant} />;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** The caller validates/persists and returns accepted fields; a failed save keeps the editor draft. */
|
|
54
|
+
export function VariantInspectionAndEditor({ id, initialValue, media, detailFooter, onSave }: {
|
|
55
|
+
id: string;
|
|
56
|
+
initialValue: ProductVariantEditorValues;
|
|
57
|
+
media?: ReactNode;
|
|
58
|
+
detailFooter?: ReactNode;
|
|
59
|
+
onSave: (draft: ProductVariantEditorValues) => Promise<ProductVariantEditorValues>;
|
|
60
|
+
}) {
|
|
61
|
+
const [accepted, setAccepted] = useState(initialValue);
|
|
62
|
+
const [draft, setDraft] = useState(initialValue);
|
|
63
|
+
const [editing, setEditing] = useState(false);
|
|
64
|
+
const [error, setError] = useState('');
|
|
65
|
+
return <Stack gap="2xl">
|
|
66
|
+
<ProductVariantDetails variant={{ id, name: accepted.name || 'Variant', sku: accepted.sku,
|
|
67
|
+
price: accepted.price ? <Money amount={Number(accepted.price)} currency="EUR" /> : undefined,
|
|
68
|
+
inventory: accepted.inventory, status: accepted.status,
|
|
69
|
+
options: Object.values(accepted.options ?? {}).filter((value): value is string => value !== undefined),
|
|
70
|
+
}} media={media} footerSlot={detailFooter} onEditVariant={() => {
|
|
71
|
+
setDraft(accepted); setError(''); setEditing(true);
|
|
72
|
+
}} />
|
|
73
|
+
{editing && <Stack gap="xl">
|
|
74
|
+
{error && <Alert tone="destructive"><AlertDescription>{error}</AlertDescription></Alert>}
|
|
75
|
+
<ProductVariantEditor value={draft} onValueChange={setDraft}
|
|
76
|
+
onSubmit={async value => { const saved = await onSave(value); setAccepted(saved); setEditing(false); }}
|
|
77
|
+
onError={() => setError('Variant could not be saved. Your draft is kept; retry Save variant.')}
|
|
78
|
+
onCancel={() => setEditing(false)} />
|
|
79
|
+
</Stack>}
|
|
80
|
+
</Stack>;
|
|
81
|
+
}
|
|
@@ -82,7 +82,7 @@ export function RHFEditPage({ initial, onSave, onCancel }: RHFEditPageProps) {
|
|
|
82
82
|
form.setError('root.server', { type: 'transport', message: 'Saving failed. Your draft is kept; retry Save order.' });
|
|
83
83
|
} finally { lock.current = false; }
|
|
84
84
|
});
|
|
85
|
-
return <Page
|
|
85
|
+
return <Page maxWidth="xl"
|
|
86
86
|
render={<form id={`${id}-form`} onSubmit={submit} noValidate aria-busy={isSubmitting} />}
|
|
87
87
|
header={{ title: 'Edit order', description: 'Update customer, fulfillment and line items.' }}>
|
|
88
88
|
{isDirty && <DirtyStateBanner title="Unsaved changes" description="Save to commit this draft, or discard to restore the last saved version." />}
|
|
@@ -5,7 +5,7 @@ import { ControlledFormField, ErrorSummary } from 'themelia-react-ui/base/forms'
|
|
|
5
5
|
import { Input } from 'themelia-react-ui/base/text-inputs';
|
|
6
6
|
import { Select, ToggleField } from 'themelia-react-ui/base/choice-inputs';
|
|
7
7
|
import { Stack } from 'themelia-react-ui/base/structure';
|
|
8
|
-
import { ActionDrawer, useOverlayVisibility } from 'themelia-react-ui/features/overlays';
|
|
8
|
+
import { ActionDialog, ActionDrawer, useOverlayVisibility } from 'themelia-react-ui/features/overlays';
|
|
9
9
|
|
|
10
10
|
export interface CustomerDraft { name: string; email: string; segment: string; notify: boolean; }
|
|
11
11
|
export interface CustomerDraftRecord extends CustomerDraft { id: string; }
|
|
@@ -21,7 +21,18 @@ export interface RHFOverlayFormProps {
|
|
|
21
21
|
const empty: CustomerDraft = { name: '', email: '', segment: 'standard', notify: true };
|
|
22
22
|
|
|
23
23
|
/** Mount with a record key if the selected customer changes while editing. */
|
|
24
|
-
export function RHFOverlayForm(
|
|
24
|
+
export function RHFOverlayForm(props: RHFOverlayFormProps) {
|
|
25
|
+
const { trigger, ...surfaceProps } = useCustomerOverlayForm(props);
|
|
26
|
+
return <>{trigger}<ActionDrawer {...surfaceProps} /></>;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** The same form/transport contract in a dialog, with its generated actions. */
|
|
30
|
+
export function RHFDialogForm(props: RHFOverlayFormProps) {
|
|
31
|
+
const { trigger, ...surfaceProps } = useCustomerOverlayForm(props);
|
|
32
|
+
return <>{trigger}<ActionDialog {...surfaceProps} /></>;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function useCustomerOverlayForm({ record, onSave, onSaved }: RHFOverlayFormProps) {
|
|
25
36
|
const id = useId();
|
|
26
37
|
const overlay = useOverlayVisibility();
|
|
27
38
|
const lock = useRef(false);
|
|
@@ -65,12 +76,15 @@ export function RHFOverlayForm({ record, onSave, onSaved }: RHFOverlayFormProps)
|
|
|
65
76
|
form.setError('root.server', { type: 'transport', message: 'Customer could not be saved. Your draft is kept; retry Save customer.' });
|
|
66
77
|
} finally { lock.current = false; }
|
|
67
78
|
});
|
|
68
|
-
return
|
|
69
|
-
|
|
70
|
-
<
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
79
|
+
return {
|
|
80
|
+
...overlay.overlayProps,
|
|
81
|
+
trigger: <Button onClick={open}>{record ? 'Edit customer' : 'Create customer'}</Button>,
|
|
82
|
+
title: record ? 'Edit customer' : 'Create customer',
|
|
83
|
+
description: 'Update contact details and communication preferences.',
|
|
84
|
+
formId: `${id}-form`,
|
|
85
|
+
loading: isSubmitting,
|
|
86
|
+
strings: { confirm: 'Save customer', loading: 'Saving customer…' },
|
|
87
|
+
children: <form id={`${id}-form`} onSubmit={submit} noValidate aria-busy={isSubmitting}>
|
|
74
88
|
<Stack gap="xl">
|
|
75
89
|
{summary.length > 0 && <ErrorSummary title="Customer could not be saved" errors={summary} />}
|
|
76
90
|
<ControlledFormField control={form.control} name="name" label="Customer name" required rules={{ required: 'Enter a customer name.', minLength: { value: 2, message: 'Enter at least two characters.' } }}>
|
|
@@ -86,7 +100,6 @@ export function RHFOverlayForm({ record, onSave, onSaved }: RHFOverlayFormProps)
|
|
|
86
100
|
{(field, _error, invalid) => <ToggleField label="Send account updates" name={field.name} value={field.value} controlRef={field.ref} onBlur={field.onBlur} onValueChange={value => field.onChange(value)} invalid={invalid} disabled={isSubmitting} />}
|
|
87
101
|
</ControlledFormField>
|
|
88
102
|
</Stack>
|
|
89
|
-
</form
|
|
90
|
-
|
|
91
|
-
</>;
|
|
103
|
+
</form>,
|
|
104
|
+
};
|
|
92
105
|
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import { Card } from 'themelia-react-ui/base/cards';
|
|
3
|
+
import { Stack } from 'themelia-react-ui/base/structure';
|
|
4
|
+
import { Number as NumberValue } from 'themelia-react-ui/primitives';
|
|
5
|
+
import { Heading, Text } from 'themelia-react-ui/typography';
|
|
6
|
+
|
|
7
|
+
export interface AllocationLocation {
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
lines: { id: string; title: string; selection?: string; reserved: number }[];
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Card-free domain content comparing reserved quantities across locations, a
|
|
15
|
+
* relationship no block represents. Goods that share one fulfillment status and
|
|
16
|
+
* location, with fulfillment commands, belong to FulfillmentGroup instead.
|
|
17
|
+
* Accepted quantities and allowed actions are app-owned.
|
|
18
|
+
*/
|
|
19
|
+
export function AllocationByLocation({ locations, unallocated, actions }: {
|
|
20
|
+
locations: AllocationLocation[];
|
|
21
|
+
unallocated: { id: string; title: string; quantity: number }[];
|
|
22
|
+
actions?: ReactNode;
|
|
23
|
+
}) {
|
|
24
|
+
return <Stack gap="2xl" className="@container/allocation min-w-0">
|
|
25
|
+
<div className="grid min-w-0 grid-cols-1 gap-space-2xl @lg/allocation:grid-cols-2">
|
|
26
|
+
{locations.map(location => <Stack key={location.id} gap="md">
|
|
27
|
+
<Heading tag="h3" size="sm">{location.name}</Heading>
|
|
28
|
+
<dl className="grid min-w-0 grid-cols-[minmax(0,1fr)_auto] gap-x-space-xl gap-y-space-md">
|
|
29
|
+
{location.lines.map(line => <div key={line.id} className="contents">
|
|
30
|
+
<dt className="min-w-0"><Stack gap="dense">
|
|
31
|
+
<Text type="inherit" className="wrap-anywhere">{line.title}</Text>
|
|
32
|
+
{line.selection && <Text size="xs" type="secondary">{line.selection}</Text>}
|
|
33
|
+
</Stack></dt>
|
|
34
|
+
<dd><Text tag="span" type="secondary"><NumberValue value={line.reserved} /> reserved</Text></dd>
|
|
35
|
+
</div>)}
|
|
36
|
+
</dl>
|
|
37
|
+
</Stack>)}
|
|
38
|
+
</div>
|
|
39
|
+
{unallocated.length > 0 && <Stack gap="md">
|
|
40
|
+
<Heading tag="h3" size="sm">Awaiting allocation</Heading>
|
|
41
|
+
{unallocated.map(line => <Text key={line.id} type="secondary">
|
|
42
|
+
<NumberValue value={line.quantity} /> × {line.title}
|
|
43
|
+
</Text>)}
|
|
44
|
+
</Stack>}
|
|
45
|
+
{actions && <Stack direction="horizontal" gap="md" justify="end">{actions}</Stack>}
|
|
46
|
+
</Stack>;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** The composition boundary supplies the surface; the subject adds no inset. */
|
|
50
|
+
export function AllocationSubjectExample() {
|
|
51
|
+
return <Card title="Dispatch allocation" description="Reserved goods grouped by dispatch location.">
|
|
52
|
+
<AllocationByLocation
|
|
53
|
+
locations={[
|
|
54
|
+
{ id: 'sofia', name: 'Sofia studio', lines: [
|
|
55
|
+
{ id: 'shirt-sofia', title: 'Linen overshirt', selection: 'Navy / M', reserved: 1 },
|
|
56
|
+
{ id: 'mug-sofia', title: 'Stoneware mug', selection: 'Salt', reserved: 1 },
|
|
57
|
+
] },
|
|
58
|
+
{ id: 'plovdiv', name: 'Plovdiv dispatch', lines: [
|
|
59
|
+
{ id: 'mug-plovdiv', title: 'Stoneware mug', selection: 'Salt', reserved: 1 },
|
|
60
|
+
] },
|
|
61
|
+
]}
|
|
62
|
+
unallocated={[
|
|
63
|
+
{ id: 'mug', title: 'Stoneware mug · Salt', quantity: 1 },
|
|
64
|
+
{ id: 'bag', title: 'Canvas bag · Olive', quantity: 1 },
|
|
65
|
+
]}
|
|
66
|
+
/>
|
|
67
|
+
</Card>;
|
|
68
|
+
}
|
|
@@ -6,30 +6,32 @@ Claude Code read; in a project that has only `CLAUDE.md`, paste it there. It
|
|
|
6
6
|
points agents at this installed skill and states when UI work is done.
|
|
7
7
|
|
|
8
8
|
```md
|
|
9
|
-
<!-- themelia-react-ui:start 2.0.
|
|
9
|
+
<!-- themelia-react-ui:start 2.0.5 -->
|
|
10
10
|
## UI built with themelia-react-ui
|
|
11
11
|
Read the matching node_modules/themelia-react-ui/docs/consumer-skills/<name>/SKILL.md:
|
|
12
|
-
themelia-components: setup, discovery
|
|
13
|
-
themelia-tokenization: semantic themes,
|
|
14
|
-
themelia-composition:
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
themelia-components: setup, discovery and typed APIs/forms;
|
|
13
|
+
themelia-tokenization: semantic themes, visual roles and portals;
|
|
14
|
+
themelia-composition: data-led subjects, hierarchy, responsive regions and repair;
|
|
15
|
+
themelia-design: data briefs, view specs, scored critique.
|
|
16
|
+
Read installed declarations. Shared assets/agent: docs/consumer-skill.
|
|
17
|
+
Decide task, hierarchy, action priority and surface/inset owners before JSX:
|
|
18
|
+
node_modules/themelia-react-ui/docs/consumer-skill/references/screen-decisions.md.
|
|
19
|
+
Find domain owners/public parts; compare APIs before custom markup:
|
|
17
20
|
node node_modules/themelia-react-ui/docs/consumer-skill/scripts/find-components.mjs <task nouns>
|
|
18
21
|
node node_modules/themelia-react-ui/docs/consumer-skill/scripts/map-composition.mjs --roles
|
|
19
22
|
node node_modules/themelia-react-ui/docs/consumer-skill/scripts/inspect-component.mjs <symbol> --import <exact import>
|
|
20
23
|
node node_modules/themelia-react-ui/docs/consumer-skill/scripts/inspect-tokens.mjs <role or root>
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
Page owns h1/gutters; commands use one header.primaryAction and ordered
|
|
25
|
+
header.secondaryActions. Confirm destructive commands with ConfirmDialog.
|
|
26
|
+
Back links/tabs are optional. Base/layout + token-backed JSX can shape domains.
|
|
27
|
+
Stack/Grid own gaps; Heading/Text own copy; Money/Date/Number format values.
|
|
28
|
+
Semantic colors; neutral badges unless status is meaningful.
|
|
29
|
+
Dialogs come only from themelia-react-ui/features/overlays.
|
|
27
30
|
Done means: node node_modules/themelia-react-ui/docs/consumer-skill/scripts/check-composition.mjs <changed files>
|
|
28
|
-
reports no errors (fix
|
|
29
|
-
|
|
30
|
-
and
|
|
31
|
-
|
|
32
|
-
warnings with file:line and reason.
|
|
31
|
+
reports no errors (fix/re-run up to three rounds); app typecheck/lint/tests pass.
|
|
32
|
+
Inspect narrow/wide light/dark hierarchy/insets; execute open/focus/error interactions.
|
|
33
|
+
Report source, appearance and behavior separately; missing proof is unverified.
|
|
34
|
+
Give kept warnings with file:line and reason.
|
|
33
35
|
<!-- themelia-react-ui:end -->
|
|
34
36
|
```
|
|
35
37
|
|
|
@@ -16,7 +16,7 @@ application data and never fetch or define a business metric.
|
|
|
16
16
|
| Used/limit quotas with shares, daily values and period selection | `UsageCard` from `themelia-react-ui/blocks/analytics/usage-card` | Owns a Card and ready/loading/error/empty presentation with retry/period callbacks. No optional chart peer. |
|
|
17
17
|
| One plain label/value fact | `InlineStat` from `themelia-react-ui/blocks/data-display` | Card-free; app chooses whether this subject needs a Card. |
|
|
18
18
|
| Several facts about one record | `MetadataList` from `themelia-react-ui/base/metadata-list` | Card-free; value primitives own formatting. |
|
|
19
|
-
| Caller-owned chart series | `ChartCard` from `themelia-react-ui/blocks/analytics` | Card-free chart composition;
|
|
19
|
+
| Caller-owned chart series | `ChartCard` from `themelia-react-ui/blocks/analytics` with Recharts children | Card-free chart composition; `surface="card"` frames it. It wraps the children in `ChartContainer` with your `config`. |
|
|
20
20
|
|
|
21
21
|
Start with these subject owners before constructing a Card with a number and
|
|
22
22
|
supporting text. Reuse their formatting, hierarchy and relevant states when
|
|
@@ -55,6 +55,23 @@ peer even when a selected presentation hides its sparkline. Read the finder
|
|
|
55
55
|
result's peers and installed declarations. UsageCard has a focused leaf import;
|
|
56
56
|
its quota model differs from general MetricData.
|
|
57
57
|
|
|
58
|
+
## Charts
|
|
59
|
+
|
|
60
|
+
There are no packaged `AreaChart` or `LineChart` components. Charts are Recharts
|
|
61
|
+
primitives (`AreaChart`, `BarChart`, `LineChart`, `PieChart` and their series,
|
|
62
|
+
from the optional `recharts` peer) inside `ChartCard`, or inside `ChartContainer`
|
|
63
|
+
from `themelia-react-ui/base/chart` when another owner supplies the title. Give
|
|
64
|
+
each series a `ChartConfig` entry whose color is a chart token such as
|
|
65
|
+
`var(--chart-1)` and reference it as `var(--color-<key>)` in the series, so the
|
|
66
|
+
chart follows the active theme. Use `ChartTooltip` with `ChartTooltipContent`
|
|
67
|
+
rather than a custom tooltip; its `valueFormatter` formats only the value (for
|
|
68
|
+
example as currency) and keeps the indicator and series label.
|
|
69
|
+
|
|
70
|
+
`MetricComparison` colours its delta by direction unless `current.trend` says
|
|
71
|
+
whether the movement is good: pass `trend: 'positive'` when a fall in overdue
|
|
72
|
+
balances or churn is the good outcome. Size the chart through the container, not fixed
|
|
73
|
+
pixel widths, and verify it at narrow widths.
|
|
74
|
+
|
|
58
75
|
## Usage, facts and verification
|
|
59
76
|
|
|
60
77
|
For `UsageCard` period/loading/error/retry and quota meaning, read
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Order and invoice composition capability map
|
|
2
|
+
|
|
3
|
+
Compare an order, fulfillment, invoice or receivable screen with these public
|
|
4
|
+
owners before writing JSX. They present application data: totals, taxes,
|
|
5
|
+
balances, allocation rules and permitted commands stay app-owned. A relationship
|
|
6
|
+
none of them represents, such as reserved stock compared across warehouses, is
|
|
7
|
+
still a normal [domain structure](domain-structures.md). Inspect the exact
|
|
8
|
+
props with `inspect-component.mjs` before relying on a slot or surface value.
|
|
9
|
+
|
|
10
|
+
## Canonical imports
|
|
11
|
+
|
|
12
|
+
Every owner below imports from `themelia-react-ui/blocks/commerce`. Other
|
|
13
|
+
families keep their published spelling: `base/cards`, `base/buttons`,
|
|
14
|
+
`base/feedback`, `base/chart` (Recharts scaffolding), `features/table`,
|
|
15
|
+
`features/filters`, `features/overlays` and `layout/page`. When a path misses,
|
|
16
|
+
`find-components.mjs` reports `importResolution` with the canonical import and,
|
|
17
|
+
for paths such as `blocks/commerce/order-header`, the component it names.
|
|
18
|
+
|
|
19
|
+
## Order and fulfillment detail
|
|
20
|
+
|
|
21
|
+
| Subject | Owner | Frame |
|
|
22
|
+
| --- | --- | --- |
|
|
23
|
+
| Order number, status and commands | `Page` header (`title`, status `Badge`s in `slots.titleSuffix`, `primaryAction`, `secondaryActions`); `OrderHeader` only when Page renders no header | Page owns the h1, gutters and command row |
|
|
24
|
+
| Payment hold, fraud review or another standing notice | `Alert` with `AlertTitle` and `AlertDescription` from `base/feedback` | Inline notice, not a Card |
|
|
25
|
+
| Purchased goods and totals | A `Card` holding `OrderLineItem` rows and `SummaryPanel` with `AmountRow`, or `OrderSummary` | The Card frames both; the ledger adds no inset box |
|
|
26
|
+
| Goods grouped by fulfillment status and ship-from location, with their commands | `FulfillmentGroup`; a partial dispatch passes its own rows as `children` and the unit total as `count` | Framed by default; `surface="flat"` inside an existing Card |
|
|
27
|
+
| One parcel and its checkpoints | `ShipmentTracking` | Unframed by default; `surface="card"` on its own |
|
|
28
|
+
| Payment attempts, captures and refunds | `OrderTransactions` | Unframed by default; `surface="card"` on its own |
|
|
29
|
+
| One refund in progress | `RefundStatusCard` | Unframed by default; `surface="card"` on its own |
|
|
30
|
+
| Buyer, contact and addresses | `OrderCustomer` (`shippingMethod` under the shipping address); one address alone is `AddressCard` | Unframed by default; `surface="card"` in an aside |
|
|
31
|
+
| Order or payment history | `OrderTimeline` (it takes its own `title`) or `PaymentTimeline` (title the Card) inside a `Card` | The rails draw no frame of their own |
|
|
32
|
+
|
|
33
|
+
The [order detail recipe](../examples/commerce-lines.tsx) (`OrderFulfillmentDetail`)
|
|
34
|
+
composes these owners on one Page with real command callbacks: the header owns
|
|
35
|
+
the commands, two fulfillment groups frame themselves, and the buyer, payment
|
|
36
|
+
summary and transactions are aside cards.
|
|
37
|
+
|
|
38
|
+
## Invoice and receivable detail
|
|
39
|
+
|
|
40
|
+
| Subject | Owner | Frame |
|
|
41
|
+
| --- | --- | --- |
|
|
42
|
+
| Invoice number, balance status and collection commands | `Page` header; set `maxVisibleSecondaryActions: 1` in it when long secondary labels crowd the primary command | Page owns the h1 and command row |
|
|
43
|
+
| The invoice document | One framed `Card` holding `InvoiceHeader` (party `details` for tax and registration IDs; omit `status` when the page header states it), `InvoiceLineItems surface="flat"` and `TaxBreakdownCard` or a `SummaryPanel` | The document Card is the only frame; its parts stay unframed |
|
|
44
|
+
| Settlement, payments and history | A `Card` with `SummaryPanel` and `AmountRow` (or `OrderSummary surface="card"`), `OrderTransactions surface="card"`, `PaymentTimeline` in a titled Card | One frame per subject |
|
|
45
|
+
| Customer and billing address | `AddressCard kind="billing"`, or `OrderCustomer showShippingAddress={false}`, with `surface="card"` | Aside subjects |
|
|
46
|
+
|
|
47
|
+
`InvoiceLineItems` paints its own framed table by default; inside the document
|
|
48
|
+
Card pass `surface="flat"` so its rows sit flush with the card edge. Below its
|
|
49
|
+
`@lg` container width each row shows the description with one `qty × price`
|
|
50
|
+
line and the line total; custom `columns` keep their tracks and scroll
|
|
51
|
+
horizontally. Mark secondary custom columns (VAT, discount, work period)
|
|
52
|
+
`wideOnly`: below that width their tracks drop and the description cell repeats
|
|
53
|
+
the values in copy marked `@lg/invoice-line-items:hidden`, so a narrow invoice
|
|
54
|
+
neither scrolls nor crushes the service text. Its default `taxRate` is 0.2, so pass the invoice's real rate or
|
|
55
|
+
custom `footerRows` with the authoritative amounts.
|
|
56
|
+
|
|
57
|
+
The [invoice detail recipe](../examples/commerce-lines.tsx) (`ReceivableInvoiceDetail`)
|
|
58
|
+
shows the document Card, the settlement ledger and a header that keeps one
|
|
59
|
+
secondary command beside `Record payment`.
|
|
60
|
+
|
|
61
|
+
Do not set `surface="flat"` on the top-level Cards of a detail page to remove
|
|
62
|
+
box-in-box framing: flatten the inner part instead, so every subject keeps one
|
|
63
|
+
clear frame.
|
|
64
|
+
|
|
65
|
+
## Frame each subject once
|
|
66
|
+
|
|
67
|
+
Owners that default unframed and accept `surface="card"`: `AddressCard`,
|
|
68
|
+
`OrderCustomer`, `OrderSummary`, `OrderTransactions`, `PaymentMethod`,
|
|
69
|
+
`ShipmentTracking`, `TaxBreakdownCard`, `DiscountStackPreview`,
|
|
70
|
+
`RefundStatusCard`, `CartSummaryCard`, `InvoiceHeader` and
|
|
71
|
+
`InventorySectionCard`. Owners that frame themselves and accept
|
|
72
|
+
`surface="flat"`: `FulfillmentGroup` and `InvoiceLineItems`. An owner that
|
|
73
|
+
already paints a frame (`surface="card"`, or one of the self-framing pair) is
|
|
74
|
+
never wrapped in a second Card; unframed parts compose inside one, as in the
|
|
75
|
+
invoice document. Page body and aside own the gaps between subjects.
|
|
76
|
+
|
|
77
|
+
In index tables, `ResourceCell` renders order and invoice identifiers as plain
|
|
78
|
+
text; it draws media only for `imageUrl`, `icon` or `fallback`, and
|
|
79
|
+
`mediaShape="square"` keeps product photos uncropped. Status badges in app-owned
|
|
80
|
+
cells reuse `fulfillmentStatusTone`, `paymentStatusTone`, `transactionStatusTone`
|
|
81
|
+
and `invoiceStatusTone`, so a table colours states exactly as the blocks do.
|
|
82
|
+
`InvoiceStatus` covers `draft`, `pending`, `overdue`, `disputed` and `paid`.
|
|
83
|
+
Notify accepted commands with `toast` from `themelia-react-ui/base/toaster`,
|
|
84
|
+
the same instance its `Toaster` renders.
|
|
85
|
+
|
|
86
|
+
Line rows, totals, stock meters and progress already have owners
|
|
87
|
+
(`OrderLineItem`, `AmountRow`, `InventoryLevel`, `Progress`). Reach for
|
|
88
|
+
app-owned Tailwind only for a structure those owners do not represent, and
|
|
89
|
+
then on your own elements, never to restyle owner anatomy.
|
|
90
|
+
|
|
91
|
+
## Verify
|
|
92
|
+
|
|
93
|
+
Check the order or invoice at narrow and wide widths in light and dark themes:
|
|
94
|
+
the line totals stay on one line, the narrow invoice rows show one quantity line
|
|
95
|
+
each, every subject has exactly one frame, and the header commands that do not
|
|
96
|
+
fit move into the More actions menu. Execute the commands (capture, refund,
|
|
97
|
+
reminder, payment) through their real callbacks, including failure and retry.
|