themelia-react-ui 2.0.4 → 2.0.6
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 +211 -0
- package/MIGRATION.md +119 -0
- package/README.md +122 -20
- package/dist/{accordion-96o0pN62.js → accordion-0tQUZ20r.js} +13 -13
- package/dist/accordion-0tQUZ20r.js.map +1 -0
- package/dist/{action-menu-CHgs8vmj.js → action-menu-C0gjzLyE.js} +48 -45
- package/dist/action-menu-C0gjzLyE.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-CGGpQryR.js} +281 -230
- package/dist/ai-artifact-CGGpQryR.js.map +1 -0
- package/dist/app-shell-EHuuRDGy.js +321 -0
- package/dist/app-shell-EHuuRDGy.js.map +1 -0
- package/dist/{attachment-DkoqHPPl.js → attachment-BCpA4e7i.js} +10 -10
- package/dist/{attachment-DkoqHPPl.js.map → attachment-BCpA4e7i.js.map} +1 -1
- package/dist/{auth-D2FVZ1MH.js → auth-B0girIk_.js} +49 -52
- package/dist/auth-B0girIk_.js.map +1 -0
- package/dist/{avatar-DWO_HHhB.js → avatar-B9Jnp-T-.js} +8 -8
- package/dist/avatar-B9Jnp-T-.js.map +1 -0
- package/dist/{badge-DErMA7ul.js → badge-wWauMgAt.js} +5 -5
- package/dist/{badge-DErMA7ul.js.map → badge-wWauMgAt.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 +4 -4
- 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 +200 -193
- 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 +8 -8
- package/dist/base/signature-pad.js.map +1 -1
- package/dist/base/skeleton.js +1 -1
- package/dist/base/spinner.js +6 -6
- package/dist/base/spinner.js.map +1 -1
- 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-BoqWIIpV.js} +7 -7
- package/dist/batch-action-bar-BoqWIIpV.js.map +1 -0
- package/dist/blocks/admin.js +21 -21
- package/dist/blocks/admin.js.map +1 -1
- package/dist/blocks/ai.js +267 -247
- package/dist/blocks/ai.js.map +1 -1
- package/dist/blocks/analytics/usage-card.js +1 -1
- package/dist/blocks/analytics.js +537 -543
- 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 +1330 -1250
- 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-Bp9Ke7kd.js} +7 -7
- package/dist/breadcrumbs-Bp9Ke7kd.js.map +1 -0
- package/dist/{button-DkmK-z8E.js → button-ChBovTx0.js} +3 -3
- package/dist/button-ChBovTx0.js.map +1 -0
- package/dist/{buttons-BbfzgczK.js → buttons-DeW0bQeK.js} +16 -16
- package/dist/buttons-DeW0bQeK.js.map +1 -0
- package/dist/cards-CNXnmvV5.js +69 -0
- package/dist/cards-CNXnmvV5.js.map +1 -0
- package/dist/cascader-CrAl9zD5.js +439 -0
- package/dist/cascader-CrAl9zD5.js.map +1 -0
- package/dist/chart-I7ROnsl8.js +162 -0
- package/dist/chart-I7ROnsl8.js.map +1 -0
- package/dist/{checkbox-CzYUTPeJ.js → checkbox-MoyHIAPs.js} +3 -3
- package/dist/{checkbox-CzYUTPeJ.js.map → checkbox-MoyHIAPs.js.map} +1 -1
- package/dist/choice-inputs-DHGtx0QV.js +789 -0
- package/dist/choice-inputs-DHGtx0QV.js.map +1 -0
- package/dist/{code-block-CGNaUtAE.js → code-block-BSJyq9e-.js} +9 -9
- package/dist/code-block-BSJyq9e-.js.map +1 -0
- package/dist/{collapsible-Do4G0zcC.js → collapsible-BzJ91LUG.js} +5 -5
- package/dist/{collapsible-Do4G0zcC.js.map → collapsible-BzJ91LUG.js.map} +1 -1
- package/dist/{collection-content-C0e8SsTm.js → collection-content-CSnwtOTH.js} +3 -3
- package/dist/{collection-content-C0e8SsTm.js.map → collection-content-CSnwtOTH.js.map} +1 -1
- package/dist/combobox-Bcvu5J8O.js +363 -0
- package/dist/combobox-Bcvu5J8O.js.map +1 -0
- package/dist/combobox-C2JiSQPc.js +915 -0
- package/dist/combobox-C2JiSQPc.js.map +1 -0
- package/dist/{command-D8NrBj-b.js → command-9e52NPgK.js} +11 -11
- package/dist/command-9e52NPgK.js.map +1 -0
- package/dist/{comments-Di4w0H_S.js → comments-BsgErEqd.js} +44 -39
- package/dist/comments-BsgErEqd.js.map +1 -0
- 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 +5 -1
- package/dist/components/base/choice-inputs/pill-radio-group.d.ts +7 -6
- package/dist/components/base/combobox/combobox-field.d.ts +2 -2
- package/dist/components/base/combobox/index.d.ts +4 -2
- package/dist/components/base/date-pickers/date-picker-internals.d.ts +3 -1
- package/dist/components/base/date-pickers/datepicker.types.d.ts +10 -4
- package/dist/components/base/date-pickers/time-picker.d.ts +17 -3
- package/dist/components/base/feedback/alert.d.ts +1 -1
- package/dist/components/base/feedback/state-display.d.ts +5 -1
- package/dist/components/base/feedback/state-display.strings.d.ts +9 -0
- package/dist/components/base/forms/form-field.d.ts +7 -2
- 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 +8 -1
- package/dist/components/base/forms-numeric/decimal-input.d.ts +2 -2
- package/dist/components/base/forms-numeric/dimensions-input.d.ts +4 -1
- package/dist/components/base/forms-numeric/numeric-composite-field.d.ts +12 -0
- package/dist/components/base/forms-numeric/weight-input.d.ts +6 -1
- 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/language-switcher.d.ts +12 -4
- 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/repeaters/key-value-editor.d.ts +2 -1
- 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 +29 -5
- package/dist/components/base/toaster/index.d.ts +1 -0
- package/dist/components/base/upload/avatar-upload.d.ts +2 -1
- package/dist/components/base/upload/image-upload.d.ts +2 -1
- package/dist/components/blocks/ai/ai-citation/types.d.ts +2 -0
- package/dist/components/blocks/ai/ai-file-tree/types.d.ts +1 -1
- package/dist/components/blocks/ai/ai-reasoning/types.d.ts +2 -0
- package/dist/components/blocks/ai/ai-sources/types.d.ts +2 -0
- package/dist/components/blocks/ai/ai-tool-call/types.d.ts +5 -1
- package/dist/components/blocks/ai/ai.strings.d.ts +2 -0
- package/dist/components/blocks/analytics/metric/metric.d.ts +4 -0
- package/dist/components/blocks/analytics/metric-comparison/metric-comparison.d.ts +4 -0
- package/dist/components/blocks/analytics/metric-grid/metric-grid.d.ts +4 -5
- package/dist/components/blocks/analytics/types.d.ts +2 -2
- 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/order-status/types.d.ts +4 -0
- 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/blocks/data-display/empty-state/empty-state.types.d.ts +4 -3
- package/dist/components/features/activities/activities.types.d.ts +26 -13
- package/dist/components/features/activities/hooks/use-activity-resources.d.ts +2 -1
- 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/ai-chat/hooks/use-ai-chat-scroll.d.ts +1 -1
- package/dist/components/features/appointment-calendar/appointment-calendar.d.ts +1 -1
- package/dist/components/features/appointment-calendar/appointment-calendar.types.d.ts +4 -2
- package/dist/components/features/combobox/async-resource-combobox.d.ts +2 -2
- package/dist/components/features/combobox/combobox.d.ts +2 -2
- package/dist/components/features/combobox/hooks/use-combobox-core.d.ts +2 -1
- package/dist/components/features/combobox/hooks/use-combobox-state.d.ts +1 -0
- package/dist/components/features/combobox/hooks/use-load-more.d.ts +1 -0
- package/dist/components/features/combobox/types.d.ts +37 -8
- package/dist/components/features/email-composer/types.d.ts +3 -1
- 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/date-facet.d.ts +4 -2
- package/dist/components/features/filters/facets/range-facet.d.ts +12 -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 +6 -3
- package/dist/components/features/filters/partials/date-filter-content.d.ts +3 -2
- package/dist/components/features/filters/partials/filter-editor-header.d.ts +16 -0
- package/dist/components/features/filters/partials/filter-popover-content.d.ts +5 -3
- package/dist/components/features/filters/partials/nested-filter-options.d.ts +21 -0
- package/dist/components/features/filters/partials/range-filter-content.d.ts +12 -0
- package/dist/components/features/filters/partials/regular-filter-content.d.ts +2 -1
- package/dist/components/features/filters/utils/filter-utils.d.ts +25 -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/hooks/use-media-library.d.ts +1 -1
- package/dist/components/features/media-library/media-library.d.ts +1 -1
- package/dist/components/features/media-library/media-library.strings.d.ts +8 -0
- package/dist/components/features/media-library/media-library.types.d.ts +50 -12
- package/dist/components/features/media-library/partials/media-library-partials.d.ts +4 -4
- package/dist/components/features/mentions/hooks/use-mentions.d.ts +16 -1
- package/dist/components/features/mentions/partials/mention-inline-suggestions.d.ts +5 -1
- package/dist/components/features/mentions/utils/split-html-by-mentions.d.ts +1 -7
- package/dist/components/features/overlays/hooks/use-overlay-visibility.d.ts +2 -2
- 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 +45 -8
- package/dist/components/features/questionnaire/questionnaire.types.d.ts +3 -0
- package/dist/components/features/resource/resource.d.ts +6 -2
- package/dist/components/features/resource/resource.types.d.ts +14 -1
- package/dist/components/features/rich-text-editor/form-rich-text-editor.d.ts +1 -1
- package/dist/components/features/rich-text-editor/partials/caret-helpers.d.ts +1 -1
- package/dist/components/features/rich-text-editor/partials/editor-field-aria.d.ts +14 -0
- package/dist/components/features/rich-text-editor/partials/image-uploads.d.ts +1 -1
- package/dist/components/features/rich-text-editor/partials/rich-text-editor-toolbar.d.ts +3 -1
- package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +12 -2
- package/dist/components/features/rich-text-editor/rich-text-editor.types.d.ts +17 -3
- package/dist/components/features/schema-form/hooks/use-schema-form.d.ts +5 -1
- package/dist/components/features/schema-form/partials/schema-form-field.d.ts +3 -1
- package/dist/components/features/schema-form/schema-form.utils.d.ts +1 -1
- package/dist/components/features/suggestions/suggestions.types.d.ts +1 -1
- package/dist/components/features/table/data-table.d.ts +1 -1
- package/dist/components/features/table/index.d.ts +1 -0
- package/dist/components/features/table/partials/resource-cell.d.ts +22 -5
- package/dist/components/features/table/table-body.d.ts +1 -1
- package/dist/components/features/table/table-helpers.d.ts +6 -3
- package/dist/components/features/table/table.strings.d.ts +3 -0
- package/dist/components/features/table/table.types.d.ts +18 -2
- 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 +9 -8
- package/dist/components/layout/layout.types.d.ts +5 -3
- package/dist/components/layout/navigation/section-nav/section-nav.d.ts +5 -0
- package/dist/components/layout/navigation/side-nav.d.ts +3 -2
- package/dist/components/layout/normalize-layout-path.d.ts +1 -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 +10 -3
- 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 +38 -0
- package/dist/components/layout/sidebar/sidebar.context.d.ts +6 -7
- package/dist/components/layout/sidebar/sidebar.types.d.ts +50 -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/primitives/link.d.ts +3 -2
- package/dist/components/primitives/money.d.ts +1 -1
- package/dist/components/primitives/number.d.ts +1 -1
- package/dist/components/typography/rich-text/rich-text-tree.d.ts +7 -5
- 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-CSdc32h9.js} +26 -18
- package/dist/containers-CSdc32h9.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-3fdHfMR3.js} +7 -7
- package/dist/{copyable-CnGCZdX4.js.map → copyable-3fdHfMR3.js.map} +1 -1
- package/dist/{data-display-D4oujtx0.js → data-display-Cmj-xZYl.js} +271 -279
- package/dist/data-display-Cmj-xZYl.js.map +1 -0
- package/dist/{date-Q7jnXxpk.js → date-Br0FicVv.js} +5 -5
- package/dist/{date-Q7jnXxpk.js.map → date-Br0FicVv.js.map} +1 -1
- package/dist/date-picker-CyQlFYsP.js +1617 -0
- package/dist/date-picker-CyQlFYsP.js.map +1 -0
- package/dist/date-pickers-tj2MXmXd.js +185 -0
- package/dist/date-pickers-tj2MXmXd.js.map +1 -0
- package/dist/{display-BB4BL_-K.js → display-CT_N2a3w.js} +9 -9
- package/dist/{display-BB4BL_-K.js.map → display-CT_N2a3w.js.map} +1 -1
- package/dist/dropdown-menu-C08iIugv.js +194 -0
- package/dist/dropdown-menu-C08iIugv.js.map +1 -0
- package/dist/features/activities.js +388 -326
- package/dist/features/activities.js.map +1 -1
- package/dist/features/ai-chat.js +46 -32
- package/dist/features/ai-chat.js.map +1 -1
- package/dist/features/appointment-calendar.js +130 -130
- 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 +243 -239
- package/dist/features/email-composer.js.map +1 -1
- package/dist/features/event-calendar.js +197 -199
- package/dist/features/event-calendar.js.map +1 -1
- package/dist/features/filters.js +2 -2
- package/dist/features/global-search.js +168 -143
- package/dist/features/global-search.js.map +1 -1
- package/dist/features/kanban.js +19 -30
- package/dist/features/kanban.js.map +1 -1
- package/dist/features/map/style.css +15 -0
- package/dist/features/map.js +369 -343
- package/dist/features/map.js.map +1 -1
- package/dist/features/media-library.js +1202 -975
- package/dist/features/media-library.js.map +1 -1
- package/dist/features/mentions.js +2 -2
- package/dist/features/overlays.js +1 -1
- package/dist/features/products.js +1270 -1183
- package/dist/features/products.js.map +1 -1
- package/dist/features/questionnaire.js +160 -153
- package/dist/features/questionnaire.js.map +1 -1
- package/dist/features/resource-assignment.js +8 -8
- package/dist/features/resource.js +119 -113
- package/dist/features/resource.js.map +1 -1
- package/dist/features/rich-text-editor.js +28 -19
- package/dist/features/rich-text-editor.js.map +1 -1
- package/dist/features/schema-form.js +297 -256
- package/dist/features/schema-form.js.map +1 -1
- package/dist/features/suggestions.js +57 -50
- package/dist/features/suggestions.js.map +1 -1
- package/dist/features/sync.js +3 -3
- package/dist/features/table.js +1 -1
- package/dist/features/theme-tweaker.js +470 -470
- package/dist/features/theme-tweaker.js.map +1 -1
- package/dist/feedback-Dzo1xtAU.js +246 -0
- package/dist/feedback-Dzo1xtAU.js.map +1 -0
- package/dist/{field-affordance-recipes-DjwGx8eM.js → field-affordance-recipes-D6H7tVJi.js} +5 -5
- package/dist/field-affordance-recipes-D6H7tVJi.js.map +1 -0
- package/dist/field-control-attributes-B6i335wr.js +18 -0
- package/dist/field-control-attributes-B6i335wr.js.map +1 -0
- package/dist/{field-state-recipes-BVA2CWHo.js → field-state-recipes-7sza8QbC.js} +4 -2
- package/dist/{field-state-recipes-BVA2CWHo.js.map → field-state-recipes-7sza8QbC.js.map} +1 -1
- package/dist/filters-Dl80yYtN.js +2415 -0
- package/dist/filters-Dl80yYtN.js.map +1 -0
- package/dist/form-field-CAPdwdnZ.js +74 -0
- package/dist/form-field-CAPdwdnZ.js.map +1 -0
- package/dist/{form-sizing-NXgjkmBG.js → form-sizing-CgcrUbLU.js} +5 -5
- package/dist/form-sizing-CgcrUbLU.js.map +1 -0
- package/dist/{forms-BV5m5aQF.js → forms-B3W8CH7-.js} +17 -13
- package/dist/forms-B3W8CH7-.js.map +1 -0
- package/dist/forms-numeric-CwjQJe-O.js +991 -0
- package/dist/forms-numeric-CwjQJe-O.js.map +1 -0
- package/dist/{header-BA697l4a.js → header-ZIIsRKxP.js} +145 -141
- package/dist/header-ZIIsRKxP.js.map +1 -0
- package/dist/header.recipes-BigdJjw1.js +6 -0
- package/dist/header.recipes-BigdJjw1.js.map +1 -0
- package/dist/hooks/use-files.d.ts +2 -0
- package/dist/{hooks-BQ-L7Uu2.js → hooks-BitHSh-Y.js} +27 -15
- package/dist/hooks-BitHSh-Y.js.map +1 -0
- package/dist/{icon-badge-COWbCCWu.js → icon-badge-npxF1SLX.js} +4 -4
- package/dist/{icon-badge-COWbCCWu.js.map → icon-badge-npxF1SLX.js.map} +1 -1
- package/dist/index.js +4 -5
- package/dist/{input-Cdw4k0fb.js → input-7KAc7XQL.js} +9 -9
- package/dist/{input-Cdw4k0fb.js.map → input-7KAc7XQL.js.map} +1 -1
- package/dist/input-DIREVYHs.js +21 -0
- package/dist/input-DIREVYHs.js.map +1 -0
- package/dist/{interaction-recipes-XR9ZpVYL.js → interaction-recipes-4wZ2tvfb.js} +2 -2
- package/dist/{interaction-recipes-XR9ZpVYL.js.map → interaction-recipes-4wZ2tvfb.js.map} +1 -1
- package/dist/item-FfWnaYST.js +278 -0
- package/dist/item-FfWnaYST.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 +12 -12
- package/dist/layout.types-E_GAApzO.js +30 -0
- package/dist/layout.types-E_GAApzO.js.map +1 -0
- 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/field-control-attributes.d.ts +11 -0
- package/dist/lib/field-state-recipes.d.ts +2 -0
- package/dist/lib/format.d.ts +1 -0
- 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/surface-recipes.d.ts +1 -1
- package/dist/lib/token-merge.generated.d.ts +18 -15
- package/dist/lib/utils.js +1 -1
- package/dist/map-demo-tile.svg +1 -1
- package/dist/{media-gallery-CSl5W1Fy.js → media-gallery-C81DAnKI.js} +6 -6
- package/dist/{media-gallery-CSl5W1Fy.js.map → media-gallery-C81DAnKI.js.map} +1 -1
- package/dist/{mentions-RKOQaaIB.js → mentions-qOnedSt4.js} +237 -168
- package/dist/mentions-qOnedSt4.js.map +1 -0
- package/dist/message-BJHnn43M.js +135 -0
- package/dist/message-BJHnn43M.js.map +1 -0
- package/dist/{metadata-list-qVV7AVxa.js → metadata-list-XkqZ_UXH.js} +64 -64
- package/dist/metadata-list-XkqZ_UXH.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-BgtPJAhi.js +288 -0
- package/dist/navigation-BgtPJAhi.js.map +1 -0
- package/dist/navigation-Bt-v7rWP.js +261 -0
- package/dist/navigation-Bt-v7rWP.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/normalize-layout-path-BmEgg6fu.js +14 -0
- package/dist/normalize-layout-path-BmEgg6fu.js.map +1 -0
- package/dist/{number-E_OiIfJz.js → number-CYqBcrSj.js} +79 -87
- package/dist/number-CYqBcrSj.js.map +1 -0
- package/dist/overflow-tab-bar-BQCA2Zn2.js +172 -0
- package/dist/overflow-tab-bar-BQCA2Zn2.js.map +1 -0
- package/dist/overlays-CC8zI3Du.js +1017 -0
- package/dist/overlays-CC8zI3Du.js.map +1 -0
- package/dist/page-BoQ1VaFJ.js +331 -0
- package/dist/page-BoQ1VaFJ.js.map +1 -0
- package/dist/page-header-commands-DIKspJfx.js +193 -0
- package/dist/page-header-commands-DIKspJfx.js.map +1 -0
- package/dist/{pagination-Ch8X_47u.js → pagination-Br8TdV9A.js} +7 -7
- package/dist/{pagination-Ch8X_47u.js.map → pagination-Br8TdV9A.js.map} +1 -1
- package/dist/popover-k8TdUcAt.js +201 -0
- package/dist/popover-k8TdUcAt.js.map +1 -0
- package/dist/{popover-menu-BYaCdFhf.js → popover-menu-yn-o0kyA.js} +7 -7
- package/dist/{popover-menu-BYaCdFhf.js.map → popover-menu-yn-o0kyA.js.map} +1 -1
- package/dist/{popover.recipes-D3j8R8Yp.js → popover.recipes-DJ0AkUan.js} +19 -12
- package/dist/popover.recipes-DJ0AkUan.js.map +1 -0
- package/dist/portal-recipes-DyUXqUtD.js +9 -0
- package/dist/portal-recipes-DyUXqUtD.js.map +1 -0
- package/dist/{primitives-Du64iDbb.js → primitives-BkkQjYl7.js} +23 -18
- package/dist/primitives-BkkQjYl7.js.map +1 -0
- package/dist/primitives.js +4 -4
- package/dist/{progress-BvF2oCdV.js → progress-DZFXXzPs.js} +9 -9
- package/dist/{progress-BvF2oCdV.js.map → progress-DZFXXzPs.js.map} +1 -1
- package/dist/{receipt-D789Jwyy.js → receipt-C7LhOg7Q.js} +7 -7
- package/dist/receipt-C7LhOg7Q.js.map +1 -0
- package/dist/rich-text-BnTzZjIo.js +45 -0
- package/dist/rich-text-BnTzZjIo.js.map +1 -0
- package/dist/{rich-text-editor-Cm1dpUpQ.js → rich-text-editor-CAurDwT5.js} +501 -424
- package/dist/rich-text-editor-CAurDwT5.js.map +1 -0
- package/dist/rich-text-editor-toolbar-DbXig7Jk.js +99 -0
- package/dist/rich-text-editor-toolbar-DbXig7Jk.js.map +1 -0
- package/dist/rich-text-tree-BqyQ_7-R.js +66 -0
- package/dist/rich-text-tree-BqyQ_7-R.js.map +1 -0
- package/dist/{sanitize-html-DsQmI48u.js → sanitize-html-BWkH4dLM.js} +29 -16
- package/dist/sanitize-html-BWkH4dLM.js.map +1 -0
- package/dist/{scroll-area-La5RXsEk.js → scroll-area-Bj6CRUif.js} +2 -2
- package/dist/{scroll-area-La5RXsEk.js.map → scroll-area-Bj6CRUif.js.map} +1 -1
- package/dist/{separator-DAEV0w65.js → separator-B9ewiCGO.js} +2 -2
- package/dist/{separator-DAEV0w65.js.map → separator-B9ewiCGO.js.map} +1 -1
- package/dist/{separator-GNfPG-90.js → separator-DM6gs2vu.js} +3 -3
- package/dist/{separator-GNfPG-90.js.map → separator-DM6gs2vu.js.map} +1 -1
- package/dist/services/actions.js +1 -1
- package/dist/settings-DZPHgpx4.js +155 -0
- package/dist/settings-DZPHgpx4.js.map +1 -0
- package/dist/sheet-C4DHsgLk.js +250 -0
- package/dist/sheet-C4DHsgLk.js.map +1 -0
- package/dist/sidebar-C8BnDwTH.js +709 -0
- package/dist/sidebar-C8BnDwTH.js.map +1 -0
- package/dist/sidebar-CmD6a-HK.js +1004 -0
- package/dist/sidebar-CmD6a-HK.js.map +1 -0
- package/dist/skeleton-DDgdhmu9.js +265 -0
- package/dist/skeleton-DDgdhmu9.js.map +1 -0
- package/dist/smart-card-B6vLxqa_.js +617 -0
- package/dist/smart-card-B6vLxqa_.js.map +1 -0
- package/dist/{structure-C0V0_Fyf.js → structure-DZJ2wbAU.js} +2 -2
- package/dist/{structure-C0V0_Fyf.js.map → structure-DZJ2wbAU.js.map} +1 -1
- package/dist/style.css +1 -1
- package/dist/{surface-recipes-BKRVW8Os.js → surface-recipes-C8mNycaY.js} +2 -2
- package/dist/{surface-recipes-BKRVW8Os.js.map → surface-recipes-C8mNycaY.js.map} +1 -1
- package/dist/{table-DH7rozUv.js → table-CBonSdTp.js} +573 -519
- package/dist/table-CBonSdTp.js.map +1 -0
- package/dist/{table-CpvnzJn9.js → table-CXSPHH25.js} +75 -71
- package/dist/table-CXSPHH25.js.map +1 -0
- package/dist/tabs-C4Kr_hCr.js +192 -0
- package/dist/tabs-C4Kr_hCr.js.map +1 -0
- package/dist/{text-inputs-DXItiR0O.js → text-inputs-jdkS3ReG.js} +18 -18
- package/dist/text-inputs-jdkS3ReG.js.map +1 -0
- package/dist/theme.css +40 -37
- package/dist/{timelines-DmtztAY_.js → timelines-CoPwdJP0.js} +13 -12
- package/dist/timelines-CoPwdJP0.js.map +1 -0
- package/dist/tooltip-31NwIpTo.js +113 -0
- package/dist/tooltip-31NwIpTo.js.map +1 -0
- package/dist/{tree-CV11PURP.js → tree-CeYVzdFE.js} +9 -9
- package/dist/{tree-CV11PURP.js.map → tree-CeYVzdFE.js.map} +1 -1
- package/dist/typography/rich-text.js +1 -1
- package/dist/{typography-CSyJrh28.js → typography-C7-YMW1S.js} +12 -12
- package/dist/{typography-CSyJrh28.js.map → typography-C7-YMW1S.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-Hdm5gObf.js} +309 -296
- package/dist/upload-Hdm5gObf.js.map +1 -0
- package/dist/{upload-queue-DhQJiSRc.js → upload-queue-D0sYPuqo.js} +16 -14
- package/dist/upload-queue-D0sYPuqo.js.map +1 -0
- package/dist/{usage-card-DVTRDmGz.js → usage-card-9s8hLDfn.js} +24 -17
- package/dist/usage-card-9s8hLDfn.js.map +1 -0
- package/dist/{utils-CF3c95Io.js → utils-DhuoqFy4.js} +255 -165
- package/dist/utils-DhuoqFy4.js.map +1 -0
- package/dist/value-inputs-D3aPgq9H.js +980 -0
- package/dist/value-inputs-D3aPgq9H.js.map +1 -0
- package/dist/{value-typography-ClupF0Gz.js → value-typography-uSzzG9Gf.js} +32 -26
- package/dist/value-typography-uSzzG9Gf.js.map +1 -0
- package/dist/{workspace-9EFVXUyk.js → workspace-CC8Vchiu.js} +51 -50
- package/dist/workspace-CC8Vchiu.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/edit.tsx +3 -3
- 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 +21 -19
- package/docs/consumer-skill/references/analytics.md +33 -1
- package/docs/consumer-skill/references/commerce-composition.md +97 -0
- package/docs/consumer-skill/references/component-contracts.json +21249 -14205
- package/docs/consumer-skill/references/composition-mapping.md +17 -3
- package/docs/consumer-skill/references/composition.md +177 -32
- 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 +12 -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 +62 -8
- package/docs/consumer-skill/references/integration.md +59 -1
- package/docs/consumer-skill/references/product-composition.md +94 -0
- package/docs/consumer-skill/references/public-api.json +3044 -445
- package/docs/consumer-skill/references/review.md +87 -10
- package/docs/consumer-skill/references/rhf-workflows.md +79 -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 +24 -20
- 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 +176 -26
- 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 +79 -7
- 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 +4 -2
- package/templates/admin-shell-template.tsx +1 -2
- package/templates/customers-template.tsx +18 -16
- 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/breadcrumbs-B-WFKecD.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 +0 -776
- package/dist/choice-inputs-JLtij2y4.js.map +0 -1
- package/dist/code-block-CGNaUtAE.js.map +0 -1
- package/dist/combobox-CBJDs6w_.js +0 -877
- 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/comments-Di4w0H_S.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 +0 -1542
- package/dist/date-picker-zOt1oNss.js.map +0 -1
- package/dist/date-pickers-cj8IXbDC.js +0 -179
- package/dist/date-pickers-cj8IXbDC.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 +0 -239
- package/dist/feedback-DZNL5Lg1.js.map +0 -1
- package/dist/field-affordance-recipes-DjwGx8eM.js.map +0 -1
- package/dist/filters-BcT-uoFy.js +0 -2209
- package/dist/filters-BcT-uoFy.js.map +0 -1
- package/dist/form-field-CsgRmdit.js +0 -63
- package/dist/form-field-CsgRmdit.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 +0 -906
- 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 +0 -277
- package/dist/item-BvZ2DR_x.js.map +0 -1
- package/dist/layout.types-Cn7aUzJp.js +0 -20
- package/dist/layout.types-Cn7aUzJp.js.map +0 -1
- package/dist/mentions-RKOQaaIB.js.map +0 -1
- package/dist/message-INU2xsxu.js +0 -128
- 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 +0 -269
- 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/number-E_OiIfJz.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/primitives-Du64iDbb.js.map +0 -1
- package/dist/receipt-D789Jwyy.js.map +0 -1
- package/dist/rich-text-CLJEf76s.js +0 -78
- package/dist/rich-text-CLJEf76s.js.map +0 -1
- package/dist/rich-text-editor-Cm1dpUpQ.js.map +0 -1
- package/dist/rich-text-editor-toolbar-L__e4x47.js +0 -94
- package/dist/rich-text-editor-toolbar-L__e4x47.js.map +0 -1
- package/dist/safe-image-src-C6kQSMBZ.js +0 -17
- package/dist/safe-image-src-C6kQSMBZ.js.map +0 -1
- package/dist/sanitize-html-DsQmI48u.js.map +0 -1
- package/dist/settings-BA2iboic.js +0 -174
- 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-CpvnzJn9.js.map +0 -1
- package/dist/table-DH7rozUv.js.map +0 -1
- package/dist/tabs-eqVsJZWO.js +0 -191
- 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/value-typography-ClupF0Gz.js.map +0 -1
- package/dist/workspace-9EFVXUyk.js.map +0 -1
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { CreditCard, FileText, Send } from 'lucide-react';
|
|
2
|
+
import { Badge } from 'themelia-react-ui/base/badge';
|
|
3
|
+
import { Card } from 'themelia-react-ui/base/cards';
|
|
4
|
+
import { Alert, AlertDescription, AlertTitle } from 'themelia-react-ui/base/feedback';
|
|
5
|
+
import { Stack } from 'themelia-react-ui/base/structure';
|
|
6
|
+
import {
|
|
7
|
+
AddressCard,
|
|
8
|
+
AmountRow,
|
|
9
|
+
FulfillmentGroup,
|
|
10
|
+
InvoiceHeader,
|
|
11
|
+
InvoiceLineItems,
|
|
12
|
+
OrderCustomer,
|
|
13
|
+
OrderLineItem,
|
|
14
|
+
OrderSummary,
|
|
15
|
+
OrderTimeline,
|
|
16
|
+
OrderTransactions,
|
|
17
|
+
PaymentTimeline,
|
|
18
|
+
ShipmentTracking,
|
|
19
|
+
SummaryPanel,
|
|
20
|
+
type InvoiceColumn,
|
|
21
|
+
type InvoiceLineItem,
|
|
22
|
+
} from 'themelia-react-ui/blocks/commerce';
|
|
23
|
+
import { Page } from 'themelia-react-ui/layout/page';
|
|
24
|
+
import { Money, Number as NumberValue } from 'themelia-react-ui/primitives';
|
|
25
|
+
import { Text } from 'themelia-react-ui/typography';
|
|
26
|
+
|
|
27
|
+
/** Mock accepted order values; the app owns tax, shipping and price calculations. */
|
|
28
|
+
export function SoldProductWithSummary() {
|
|
29
|
+
return (
|
|
30
|
+
<Card title="Items and totals">
|
|
31
|
+
<Stack gap="xl">
|
|
32
|
+
<OrderLineItem
|
|
33
|
+
id="mug-sand-350"
|
|
34
|
+
title="Ceramic mug"
|
|
35
|
+
variantTitle="350 ml / Sand"
|
|
36
|
+
sku="MUG-350-SAND"
|
|
37
|
+
unitPrice="€18.00"
|
|
38
|
+
quantity={2}
|
|
39
|
+
total="€36.00"
|
|
40
|
+
/>
|
|
41
|
+
<SummaryPanel>
|
|
42
|
+
<AmountRow label="Subtotal" amount="€36.00" />
|
|
43
|
+
<AmountRow label="Shipping" amount="€6.50" />
|
|
44
|
+
<AmountRow label="Tax" note="20%" amount="€8.50" />
|
|
45
|
+
<AmountRow label="Grand total" amount="€51.00" total rollup />
|
|
46
|
+
</SummaryPanel>
|
|
47
|
+
</Stack>
|
|
48
|
+
</Card>
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Custom JSX values keep their roles: quiet regular breakdown, bold financial total. */
|
|
53
|
+
export function CustomServiceInvoice() {
|
|
54
|
+
// Custom columns replace the default four-column/mobile recipe with this two-column grid.
|
|
55
|
+
const serviceColumns: InvoiceColumn<InvoiceLineItem>[] = [
|
|
56
|
+
{
|
|
57
|
+
id: 'service',
|
|
58
|
+
header: 'Service',
|
|
59
|
+
width: 'minmax(0, 1fr)',
|
|
60
|
+
cell: (item) => (
|
|
61
|
+
<Stack gap="xs">
|
|
62
|
+
<Text type="inherit" className="wrap-anywhere">{item.description}</Text>
|
|
63
|
+
<Text tag="span" size="xs" type="secondary">
|
|
64
|
+
<NumberValue value={item.qty} /> × <Money amount={item.price} currency="EUR" />
|
|
65
|
+
</Text>
|
|
66
|
+
</Stack>
|
|
67
|
+
),
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
id: 'line-total',
|
|
71
|
+
header: 'Line total',
|
|
72
|
+
width: 'max-content',
|
|
73
|
+
align: 'right',
|
|
74
|
+
cell: (item) => <Money type="inherit" amount={item.total} currency="EUR" weight="regular" />,
|
|
75
|
+
},
|
|
76
|
+
];
|
|
77
|
+
|
|
78
|
+
return (
|
|
79
|
+
<InvoiceLineItems
|
|
80
|
+
items={[
|
|
81
|
+
{ description: 'Design services', qty: 1, price: 335, total: 335 },
|
|
82
|
+
{ description: 'Research workshop', qty: 2, price: 380, total: 760 },
|
|
83
|
+
{ description: 'Implementation support', qty: 3, price: 425, total: 1275 },
|
|
84
|
+
]}
|
|
85
|
+
columns={serviceColumns}
|
|
86
|
+
footerRows={[
|
|
87
|
+
{ label: 'Subtotal', value: <Money type="inherit" amount={2370} currency="EUR" weight="regular" /> },
|
|
88
|
+
{ label: 'VAT (20%)', value: <Money type="inherit" amount={474} currency="EUR" weight="regular" /> },
|
|
89
|
+
// emphasis controls the label/spacing; this React-node value owns its weight.
|
|
90
|
+
{ label: 'Invoice total', value: <Money type="inherit" amount={2844} currency="EUR" weight="bold" />, emphasis: 'total' },
|
|
91
|
+
]}
|
|
92
|
+
/>
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export interface OrderFulfillmentDetailProps {
|
|
97
|
+
/** Requests fulfillment of the open group; the app accepts and reloads the order. */
|
|
98
|
+
onFulfill: () => void;
|
|
99
|
+
onPrintPackingSlip: () => void;
|
|
100
|
+
/** Opens the app's refund workflow, for example in an ActionDrawer. */
|
|
101
|
+
onRefund: () => void;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* One order route: Page owns the heading and commands, each subject is framed
|
|
106
|
+
* once, and the buyer and payment ledger sit in the aside. Mock accepted values.
|
|
107
|
+
*/
|
|
108
|
+
export function OrderFulfillmentDetail({ onFulfill, onPrintPackingSlip, onRefund }: OrderFulfillmentDetailProps) {
|
|
109
|
+
return (
|
|
110
|
+
<Page
|
|
111
|
+
header={{
|
|
112
|
+
title: 'Order #1042',
|
|
113
|
+
slots: { titleSuffix: <><Badge tone="warning">Partially fulfilled</Badge><Badge tone="success">Paid</Badge></> },
|
|
114
|
+
primaryAction: { label: 'Fulfill items', onClick: onFulfill },
|
|
115
|
+
secondaryActions: [{ label: 'Print packing slip', onClick: onPrintPackingSlip }, { label: 'Refund', onClick: onRefund }],
|
|
116
|
+
}}
|
|
117
|
+
aside={(
|
|
118
|
+
<>
|
|
119
|
+
<OrderCustomer
|
|
120
|
+
surface="card"
|
|
121
|
+
name="Ava Chen"
|
|
122
|
+
email="ava.chen@example.com"
|
|
123
|
+
orderCount={4}
|
|
124
|
+
shippingAddress={{ name: 'Ava Chen', line1: '18 Ermou Street', city: 'Athens', postalCode: '105 63', country: 'Greece' }}
|
|
125
|
+
billingSameAsShipping
|
|
126
|
+
/>
|
|
127
|
+
<OrderSummary
|
|
128
|
+
surface="card"
|
|
129
|
+
goods={[{ label: 'Subtotal', amount: '€104.00' }, { label: 'Shipping', amount: '€6.50' }]}
|
|
130
|
+
total={{ label: 'Total', amount: '€110.50' }}
|
|
131
|
+
payments={[{ label: 'Paid by card', amount: '€110.50' }]}
|
|
132
|
+
paymentStatus="paid"
|
|
133
|
+
/>
|
|
134
|
+
<OrderTransactions
|
|
135
|
+
surface="card"
|
|
136
|
+
transactions={[
|
|
137
|
+
{ id: 'auth', kind: 'authorization', status: 'success', amount: '€110.50', processedAt: '12 Oct, 09:14', method: 'Visa •••• 4242' },
|
|
138
|
+
{ id: 'capture', kind: 'capture', status: 'success', amount: '€110.50', processedAt: '12 Oct, 09:15', reference: 'ch_3PqL2x' },
|
|
139
|
+
]}
|
|
140
|
+
/>
|
|
141
|
+
</>
|
|
142
|
+
)}
|
|
143
|
+
>
|
|
144
|
+
<Alert tone="warning">
|
|
145
|
+
<AlertTitle>Confirm the delivery address</AlertTitle>
|
|
146
|
+
<AlertDescription>The courier flagged the postal code; confirm it with the customer before the Athens parcel ships.</AlertDescription>
|
|
147
|
+
</Alert>
|
|
148
|
+
<FulfillmentGroup
|
|
149
|
+
status="unfulfilled"
|
|
150
|
+
location="Athens warehouse"
|
|
151
|
+
items={[{ id: 'shirt', title: 'Linen overshirt', variantTitle: 'Navy / M', sku: 'LIN-OVR-NVY-M', unitPrice: '€68.00', quantity: 1, total: '€68.00' }]}
|
|
152
|
+
actions={[{ id: 'fulfill', label: 'Fulfill items', onClick: onFulfill }, { id: 'slip', label: 'Print packing slip', onClick: onPrintPackingSlip }]}
|
|
153
|
+
/>
|
|
154
|
+
<FulfillmentGroup
|
|
155
|
+
status="fulfilled"
|
|
156
|
+
location="Thessaloniki store"
|
|
157
|
+
items={[{ id: 'mug', title: 'Stoneware mug', variantTitle: 'Salt', sku: 'MUG-STW-SALT', unitPrice: '€18.00', quantity: 2, total: '€36.00' }]}
|
|
158
|
+
/>
|
|
159
|
+
<ShipmentTracking
|
|
160
|
+
surface="card"
|
|
161
|
+
carrier="ACS Courier"
|
|
162
|
+
trackingNumber="7781 2290 114"
|
|
163
|
+
status="in_transit"
|
|
164
|
+
steps={[
|
|
165
|
+
{ label: 'Label created', done: true, timestamp: '12 Oct, 11:02' },
|
|
166
|
+
{ label: 'Picked up', done: true, timestamp: '12 Oct, 16:40' },
|
|
167
|
+
{ label: 'Out for delivery', done: false },
|
|
168
|
+
{ label: 'Delivered', done: false },
|
|
169
|
+
]}
|
|
170
|
+
/>
|
|
171
|
+
{/* OrderTimeline owns its title; the Card only frames it. */}
|
|
172
|
+
<Card>
|
|
173
|
+
<OrderTimeline
|
|
174
|
+
title="History"
|
|
175
|
+
events={[
|
|
176
|
+
{ id: 'placed', title: 'Order placed', timestamp: '12 Oct, 09:14', status: 'completed' },
|
|
177
|
+
{ id: 'shipped', title: 'Mugs shipped from Thessaloniki', timestamp: '12 Oct, 16:40', status: 'completed' },
|
|
178
|
+
{ id: 'athens', title: 'Overshirt awaiting fulfillment', timestamp: 'Now', status: 'current' },
|
|
179
|
+
]}
|
|
180
|
+
/>
|
|
181
|
+
</Card>
|
|
182
|
+
</Page>
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export interface ReceivableInvoiceDetailProps {
|
|
187
|
+
onRecordPayment: () => void;
|
|
188
|
+
onSendReminder: () => void;
|
|
189
|
+
onApplyCredit: () => void;
|
|
190
|
+
onExportPdf: () => void;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* One invoice route: the document Card is the only frame around its header,
|
|
195
|
+
* flat line items and ledger; settlement and history are separate subjects.
|
|
196
|
+
* Long secondary labels stay in the More actions menu beside the primary command.
|
|
197
|
+
*/
|
|
198
|
+
export function ReceivableInvoiceDetail({ onRecordPayment, onSendReminder, onApplyCredit, onExportPdf }: ReceivableInvoiceDetailProps) {
|
|
199
|
+
return (
|
|
200
|
+
<Page
|
|
201
|
+
header={{
|
|
202
|
+
title: 'INV-2026-118',
|
|
203
|
+
slots: { titleSuffix: <Badge tone="destructive">Overdue</Badge> },
|
|
204
|
+
primaryAction: { label: 'Record payment', onClick: onRecordPayment },
|
|
205
|
+
secondaryActions: [
|
|
206
|
+
{ label: 'Send reminder', onClick: onSendReminder },
|
|
207
|
+
{ label: 'Apply approved credit', onClick: onApplyCredit },
|
|
208
|
+
{ label: 'Export PDF', onClick: onExportPdf },
|
|
209
|
+
],
|
|
210
|
+
maxVisibleSecondaryActions: 1,
|
|
211
|
+
}}
|
|
212
|
+
aside={(
|
|
213
|
+
<>
|
|
214
|
+
<Card title="Settlement">
|
|
215
|
+
<SummaryPanel>
|
|
216
|
+
<AmountRow label="Invoice total" amount="€2,199.76" />
|
|
217
|
+
<AmountRow label="Bank transfer, 14 Oct" amount="€1,000.00" deduction />
|
|
218
|
+
<AmountRow label="Balance due" amount="€1,199.76" total rollup />
|
|
219
|
+
</SummaryPanel>
|
|
220
|
+
</Card>
|
|
221
|
+
<AddressCard
|
|
222
|
+
surface="card"
|
|
223
|
+
kind="billing"
|
|
224
|
+
name="Kalliope Studio IKE"
|
|
225
|
+
line1="42 Tsimiski Street"
|
|
226
|
+
city="Thessaloniki"
|
|
227
|
+
postalCode="546 23"
|
|
228
|
+
country="Greece"
|
|
229
|
+
/>
|
|
230
|
+
</>
|
|
231
|
+
)}
|
|
232
|
+
>
|
|
233
|
+
<Card>
|
|
234
|
+
<Stack gap="2xl">
|
|
235
|
+
<InvoiceHeader
|
|
236
|
+
invoiceNumber="INV-2026-118"
|
|
237
|
+
status="overdue"
|
|
238
|
+
from={{ name: 'Ledgerline Accounting', location: 'Athens' }}
|
|
239
|
+
to={{ name: 'Kalliope Studio IKE', location: 'Thessaloniki' }}
|
|
240
|
+
issuedDate="12 Oct 2026"
|
|
241
|
+
dueDate="26 Oct 2026"
|
|
242
|
+
amount="€1,199.76"
|
|
243
|
+
/>
|
|
244
|
+
<InvoiceLineItems
|
|
245
|
+
surface="flat"
|
|
246
|
+
currency="EUR"
|
|
247
|
+
items={[
|
|
248
|
+
{ description: 'Quarterly bookkeeping retainer, July to September 2026', qty: 1, price: 1275, total: 1275 },
|
|
249
|
+
{ description: 'Payroll processing (per employee)', qty: 14, price: 18.5, total: 259 },
|
|
250
|
+
{ description: 'VAT return preparation', qty: 1, price: 240, total: 240 },
|
|
251
|
+
]}
|
|
252
|
+
footerRows={[
|
|
253
|
+
{ label: 'Subtotal', value: <Money type="inherit" amount={1774} currency="EUR" weight="regular" /> },
|
|
254
|
+
{ label: 'VAT (24%)', value: <Money type="inherit" amount={425.76} currency="EUR" weight="regular" /> },
|
|
255
|
+
{ label: 'Invoice total', value: <Money type="inherit" amount={2199.76} currency="EUR" weight="bold" />, emphasis: 'total' },
|
|
256
|
+
]}
|
|
257
|
+
/>
|
|
258
|
+
</Stack>
|
|
259
|
+
</Card>
|
|
260
|
+
<Card title="Payment history">
|
|
261
|
+
<PaymentTimeline
|
|
262
|
+
events={[
|
|
263
|
+
{ label: 'Invoice issued', date: '12 Oct', icon: FileText, done: true },
|
|
264
|
+
{ label: 'Partial payment received', date: '14 Oct', amount: '€1,000.00', icon: CreditCard, done: true },
|
|
265
|
+
{ label: 'Reminder due', date: '28 Oct', icon: Send, done: false },
|
|
266
|
+
]}
|
|
267
|
+
/>
|
|
268
|
+
</Card>
|
|
269
|
+
</Page>
|
|
270
|
+
);
|
|
271
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import { Stack } from 'themelia-react-ui/base/structure';
|
|
3
|
+
import { InlineStat } from 'themelia-react-ui/blocks/data-display';
|
|
4
|
+
import { Money } from 'themelia-react-ui/primitives';
|
|
5
|
+
|
|
6
|
+
/** Card-free app content: its parent owns the subject title and any surface. */
|
|
7
|
+
export function AssessmentComparison({declared, assessed, currency, labels, actions}: {
|
|
8
|
+
declared: number;
|
|
9
|
+
assessed: number;
|
|
10
|
+
currency: string;
|
|
11
|
+
labels: {declared: string; assessed: string};
|
|
12
|
+
actions?: ReactNode;
|
|
13
|
+
}) {
|
|
14
|
+
return <Stack gap="xl" className="@container min-w-0">
|
|
15
|
+
<div className="grid min-w-0 grid-cols-1 gap-space-xl @lg:grid-cols-2">
|
|
16
|
+
<InlineStat layout="stacked" label={labels.declared} value={<Money amount={declared} currency={currency} />} />
|
|
17
|
+
<InlineStat layout="stacked" label={labels.assessed} value={<Money amount={assessed} currency={currency} />} />
|
|
18
|
+
</div>
|
|
19
|
+
{actions && <Stack direction="horizontal" justify="end" gap="md">{actions}</Stack>}
|
|
20
|
+
</Stack>;
|
|
21
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { useState, type ReactNode } from 'react';
|
|
2
|
+
import { Badge } from 'themelia-react-ui/base/badge';
|
|
2
3
|
import { Button } from 'themelia-react-ui/base/buttons';
|
|
3
4
|
import { Card } from 'themelia-react-ui/base/cards';
|
|
4
5
|
import { MetadataList } from 'themelia-react-ui/base/metadata-list';
|
|
@@ -21,7 +22,7 @@ export interface AccountDetailProps {
|
|
|
21
22
|
|
|
22
23
|
/** One framed subject for a drawer or dashboard: one quick control, no page chrome. */
|
|
23
24
|
export function AccountDetail({ account, onEdit }: AccountDetailProps) {
|
|
24
|
-
return <Card title={account.name}
|
|
25
|
+
return <Card title={account.name}
|
|
25
26
|
headerAction={<Button onClick={() => onEdit(account.id)}>Edit</Button>}>
|
|
26
27
|
<AccountFacts account={account}/>
|
|
27
28
|
</Card>;
|
|
@@ -52,9 +53,9 @@ export function AccountDetailPage({ account, onEdit, onBack, section, onSectionC
|
|
|
52
53
|
{ label: 'Send statement', onClick: () => onSendStatement(account.id) },
|
|
53
54
|
{ label: 'Delete account', destructive: true, onClick: () => { setError(undefined); deletion.show(); } },
|
|
54
55
|
];
|
|
55
|
-
return <Page header={{
|
|
56
|
+
return <Page narrow header={{
|
|
56
57
|
title: account.name, onBack, backLabel: 'Back to accounts',
|
|
57
|
-
|
|
58
|
+
slots: { titleSuffix: account.overdue ? <Badge tone="warning">Overdue</Badge> : null },
|
|
58
59
|
primaryAction: { label: 'Edit account', onClick: () => onEdit(account.id) },
|
|
59
60
|
secondaryActions: commands,
|
|
60
61
|
tabs: {
|
|
@@ -68,7 +69,7 @@ export function AccountDetailPage({ account, onEdit, onBack, section, onSectionC
|
|
|
68
69
|
},
|
|
69
70
|
}}>
|
|
70
71
|
{section === 'overview'
|
|
71
|
-
? <Card title="Contact and billing"
|
|
72
|
+
? <Card title="Contact and billing"><AccountFacts account={account}/></Card>
|
|
72
73
|
: children}
|
|
73
74
|
<ConfirmDialog {...deletion.overlayProps} destructive
|
|
74
75
|
title={`Delete ${account.name}?`} description="This permanently removes the account."
|
|
@@ -2,7 +2,7 @@ import { useRef, useState } from 'react';
|
|
|
2
2
|
import { useForm } from 'react-hook-form';
|
|
3
3
|
import { Button } from 'themelia-react-ui/base/buttons';
|
|
4
4
|
import { Card } from 'themelia-react-ui/base/cards';
|
|
5
|
-
import { ControlledFormField, DirtyStateBanner, ErrorSummary,
|
|
5
|
+
import { ControlledFormField, DirtyStateBanner, ErrorSummary, SubmitStateButton } from 'themelia-react-ui/base/forms';
|
|
6
6
|
import { Stack } from 'themelia-react-ui/base/structure';
|
|
7
7
|
import { Input } from 'themelia-react-ui/base/text-inputs';
|
|
8
8
|
import { Text } from 'themelia-react-ui/typography';
|
|
@@ -43,10 +43,10 @@ export function AccountEdit({ initial, onSave, onCancel }: AccountEditProps) {
|
|
|
43
43
|
onValueChange={value => field.onChange(value)} onBlur={field.onBlur} invalid={invalid} disabled={isSubmitting} />}
|
|
44
44
|
</ControlledFormField>
|
|
45
45
|
{saved && !isDirty && <Text role="status">Account saved.</Text>}
|
|
46
|
-
<
|
|
46
|
+
<Stack direction="horizontal" wrap justify="end" gap="md">
|
|
47
47
|
<Button type="button" disabled={isSubmitting} onClick={onCancel}>Cancel edit</Button>
|
|
48
48
|
<SubmitStateButton dirty={isDirty} disableWhenPristine submitting={isSubmitting}>Save account</SubmitStateButton>
|
|
49
|
-
</
|
|
49
|
+
</Stack>
|
|
50
50
|
</Stack>
|
|
51
51
|
</form>
|
|
52
52
|
</Card>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from 'themelia-react-ui/base/accordion';
|
|
3
|
+
import { Badge } from 'themelia-react-ui/base/badge';
|
|
4
|
+
import { Stack } from 'themelia-react-ui/base/structure';
|
|
5
|
+
import { Heading, Text } from 'themelia-react-ui/typography';
|
|
6
|
+
|
|
7
|
+
export interface EditableSection {
|
|
8
|
+
id: string;
|
|
9
|
+
title: string;
|
|
10
|
+
content: ReactNode;
|
|
11
|
+
/** App-localized validation status, e.g. "2 errors"; omit when valid. */
|
|
12
|
+
validationMessage?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** Place inside the app's one form. Closing a panel retains the same field DOM. */
|
|
16
|
+
export function EditableSections({title, sections, openSections, onOpenSectionsChange}: {
|
|
17
|
+
title: string;
|
|
18
|
+
sections: EditableSection[];
|
|
19
|
+
openSections: string[];
|
|
20
|
+
onOpenSectionsChange: (values: string[]) => void;
|
|
21
|
+
}) {
|
|
22
|
+
return <Stack gap="xl">
|
|
23
|
+
<Heading tag="h2" size="base">{title}</Heading>
|
|
24
|
+
<Accordion multiple value={openSections} onValueChange={onOpenSectionsChange} aria-label={title}>
|
|
25
|
+
{sections.map(section => <AccordionItem key={section.id} value={section.id}>
|
|
26
|
+
<AccordionTrigger>
|
|
27
|
+
<Stack render={<span />} direction="horizontal" gap="md" className="min-w-0">
|
|
28
|
+
<Text tag="span" size="inherit" type="inherit" weight="medium">{section.title}</Text>
|
|
29
|
+
{section.validationMessage && <>{' '}<Badge tone="destructive">{section.validationMessage}</Badge></>}
|
|
30
|
+
</Stack>
|
|
31
|
+
</AccordionTrigger>
|
|
32
|
+
<AccordionContent keepMounted>
|
|
33
|
+
<Stack gap="xl">{section.content}</Stack>
|
|
34
|
+
</AccordionContent>
|
|
35
|
+
</AccordionItem>)}
|
|
36
|
+
</Accordion>
|
|
37
|
+
</Stack>;
|
|
38
|
+
}
|
|
@@ -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." />}
|