themelia-react-ui 2.0.3 → 2.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +185 -0
- package/README.md +168 -36
- package/dist/{accordion-Cjb6sx0G.js → accordion-B9MHG0cT.js} +11 -11
- package/dist/accordion-B9MHG0cT.js.map +1 -0
- package/dist/action-menu-Dr8K-ghE.js +284 -0
- package/dist/action-menu-Dr8K-ghE.js.map +1 -0
- package/dist/{affordance-geometry.generated-tF36bREk.js → affordance-geometry.generated-P-aVJisu.js} +42 -36
- package/dist/affordance-geometry.generated-P-aVJisu.js.map +1 -0
- package/dist/{ai-artifact-DvTwDVyL.js → ai-artifact-C58tQcBy.js} +387 -350
- 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-BxDfL2mw.js → attachment-Dg_69lPS.js} +9 -9
- package/dist/{attachment-BxDfL2mw.js.map → attachment-Dg_69lPS.js.map} +1 -1
- package/dist/{auth-BGua8ouh.js → auth-DTkkshS8.js} +44 -47
- package/dist/auth-DTkkshS8.js.map +1 -0
- package/dist/{avatar-DAPlDvhJ.js → avatar-CeZaFmNH.js} +8 -8
- package/dist/avatar-CeZaFmNH.js.map +1 -0
- package/dist/{badge-HpFqoqSY.js → badge-xIiV_E7f.js} +5 -5
- package/dist/{badge-HpFqoqSY.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 +3 -3
- 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-DnUJ21NQ.js → batch-action-bar-Cb8cuvyy.js} +6 -6
- package/dist/batch-action-bar-Cb8cuvyy.js.map +1 -0
- package/dist/blocks/admin.js +23 -23
- 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 +326 -307
- 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 +1247 -1169
- 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-C-oqs1sQ.js → breadcrumbs-J-K2kl4c.js} +6 -6
- package/dist/{breadcrumbs-C-oqs1sQ.js.map → breadcrumbs-J-K2kl4c.js.map} +1 -1
- package/dist/{button-DVzspB_G.js → button-S2Cubiiz.js} +3 -3
- package/dist/button-S2Cubiiz.js.map +1 -0
- package/dist/{buttons-DPZekJFu.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-AWIhNhmo.js → checkbox-fflqmODR.js} +9 -5
- package/dist/checkbox-fflqmODR.js.map +1 -0
- package/dist/choice-inputs-zUgBZfE4.js +777 -0
- package/dist/choice-inputs-zUgBZfE4.js.map +1 -0
- package/dist/{code-block-DeneBJR_.js → code-block-BzmM9Eig.js} +9 -9
- package/dist/code-block-BzmM9Eig.js.map +1 -0
- package/dist/{collapsible-C-_l4hpy.js → collapsible-BkAI_XD4.js} +5 -5
- package/dist/{collapsible-C-_l4hpy.js.map → collapsible-BkAI_XD4.js.map} +1 -1
- package/dist/{collection-content-By56pLog.js → collection-content-gDh1v6O4.js} +3 -3
- package/dist/{collection-content-By56pLog.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-Dxo2fAYQ.js → combobox-BwzoXFSG.js} +254 -247
- package/dist/combobox-BwzoXFSG.js.map +1 -0
- package/dist/{command-C25VMRII.js → command-CrlPIL6m.js} +12 -12
- package/dist/command-CrlPIL6m.js.map +1 -0
- package/dist/{comments-DD0DUPwJ.js → comments-Dmpp0YIc.js} +380 -379
- package/dist/comments-Dmpp0YIc.js.map +1 -0
- package/dist/components/base/action-menu/action-menu.d.ts +9 -1
- package/dist/components/base/buttons/button-group.recipes.d.ts +2 -2
- package/dist/components/base/cards/card.recipes.d.ts +16 -7
- 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 +11 -7
- 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/checkbox.d.ts +7 -2
- package/dist/components/base/choice-inputs/choice-types.d.ts +1 -1
- package/dist/components/base/choice-inputs/switch-card.d.ts +7 -0
- package/dist/components/base/choice-inputs/toggle-field.d.ts +7 -0
- package/dist/components/base/combobox/index.d.ts +4 -2
- package/dist/components/base/date-pickers/datepicker.types.d.ts +7 -0
- package/dist/components/base/feedback/alert.d.ts +1 -1
- package/dist/components/base/forms/controlled-form-field.d.ts +6 -6
- package/dist/components/base/forms/form-field.d.ts +5 -3
- package/dist/components/base/forms/form-sizing.d.ts +7 -7
- package/dist/components/base/forms/index.d.ts +1 -0
- package/dist/components/base/forms/server-errors.d.ts +16 -0
- package/dist/components/base/forms/workflow.d.ts +11 -2
- package/dist/components/base/forms-numeric/coordinates-input.d.ts +4 -0
- package/dist/components/base/metadata-list/metadata-list.d.ts +3 -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 +13 -4
- 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/structure/composition.recipes.d.ts +17 -0
- package/dist/components/base/text-inputs/hooks/use-form-field-state.d.ts +7 -2
- package/dist/components/base/text-inputs/input.d.ts +4 -2
- package/dist/components/base/text-inputs/textarea.d.ts +4 -2
- package/dist/components/base/toaster/index.d.ts +1 -0
- package/dist/components/base/value-inputs/date-time-input.d.ts +2 -1
- package/dist/components/base/value-inputs/slider.d.ts +5 -1
- package/dist/components/base/value-inputs/tags-input.d.ts +5 -1
- 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/typography/text.styles.d.ts +26 -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/composition.recipes-COdiFhxB.js +19 -0
- package/dist/composition.recipes-COdiFhxB.js.map +1 -0
- package/dist/containers-CIxwbZt5.js +112 -0
- 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-ClBuk_UK.js → copyable-DIznBqiT.js} +7 -7
- package/dist/{copyable-ClBuk_UK.js.map → copyable-DIznBqiT.js.map} +1 -1
- package/dist/{data-display-DT_khPl_.js → data-display-BdgCAw8T.js} +277 -285
- package/dist/data-display-BdgCAw8T.js.map +1 -0
- package/dist/{date-DCrsDTZc.js → date-Cq8ioE4o.js} +5 -5
- package/dist/{date-DCrsDTZc.js.map → date-Cq8ioE4o.js.map} +1 -1
- package/dist/{date-picker-B2K3ucWn.js → date-picker-RlIzKom_.js} +501 -480
- package/dist/date-picker-RlIzKom_.js.map +1 -0
- package/dist/date-pickers-DY-CpXS1.js +179 -0
- package/dist/date-pickers-DY-CpXS1.js.map +1 -0
- package/dist/{display-hAc1HjpI.js → display-KsZLw9Ov.js} +9 -9
- package/dist/{display-hAc1HjpI.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 +222 -220
- 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 +249 -249
- package/dist/features/email-composer.js.map +1 -1
- package/dist/features/event-calendar.js +264 -269
- 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 +827 -777
- 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 +1246 -1169
- 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 +127 -123
- package/dist/features/resource.js.map +1 -1
- package/dist/features/rich-text-editor.js +2 -2
- package/dist/features/schema-form.js +254 -253
- package/dist/features/schema-form.js.map +1 -1
- 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 +95 -96
- package/dist/features/theme-tweaker.js.map +1 -1
- package/dist/{feedback-BYIhtitP.js → feedback-Dm4izqFn.js} +81 -80
- package/dist/feedback-Dm4izqFn.js.map +1 -0
- package/dist/{field-affordance-recipes-DZhnIL_Y.js → field-affordance-recipes-DWcNcOjh.js} +4 -4
- package/dist/field-affordance-recipes-DWcNcOjh.js.map +1 -0
- package/dist/{filters-DJVAveHA.js → filters-DzgSJpMK.js} +693 -645
- package/dist/filters-DzgSJpMK.js.map +1 -0
- package/dist/{form-field-CwH9y77i.js → form-field-BriWAXyg.js} +14 -8
- package/dist/form-field-BriWAXyg.js.map +1 -0
- package/dist/{form-sizing-BdP_Mf5p.js → form-sizing-Bs2qFUeE.js} +4 -4
- package/dist/form-sizing-Bs2qFUeE.js.map +1 -0
- package/dist/forms-C0RGnJTe.js +216 -0
- package/dist/forms-C0RGnJTe.js.map +1 -0
- package/dist/{forms-numeric-B_jraJaQ.js → forms-numeric-DIhghX1Q.js} +295 -291
- package/dist/forms-numeric-DIhghX1Q.js.map +1 -0
- package/dist/{header-BSfIEWbI.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/useFormErrors.d.ts +1 -1
- package/dist/{hooks-ClH9thn4.js → hooks-DB6CJ4MR.js} +26 -14
- package/dist/hooks-DB6CJ4MR.js.map +1 -0
- package/dist/{icon-badge-DYKIwvOV.js → icon-badge-DZF-YjQp.js} +4 -4
- package/dist/{icon-badge-DYKIwvOV.js.map → icon-badge-DZF-YjQp.js.map} +1 -1
- package/dist/index.js +4 -5
- package/dist/input-CvyDQlY7.js +289 -0
- package/dist/input-CvyDQlY7.js.map +1 -0
- package/dist/input-DMBwAZmr.js +21 -0
- package/dist/input-DMBwAZmr.js.map +1 -0
- package/dist/item-DjCcM18E.js +277 -0
- 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 +41 -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/ui-provider/types.d.ts +1 -1
- package/dist/lib/utils.js +1 -1
- package/dist/map-demo-tile.svg +1 -1
- package/dist/{media-gallery-3zIVLMWH.js → media-gallery-C-vChPmE.js} +6 -6
- package/dist/{media-gallery-3zIVLMWH.js.map → media-gallery-C-vChPmE.js.map} +1 -1
- package/dist/{mentions-CGlEJ15c.js → mentions-0_4nWuI-.js} +10 -10
- package/dist/{mentions-CGlEJ15c.js.map → mentions-0_4nWuI-.js.map} +1 -1
- package/dist/{message-DZ_ruyUV.js → message-g8p7eVtN.js} +7 -7
- package/dist/message-g8p7eVtN.js.map +1 -0
- package/dist/metadata-list-C3MkU-Om.js +443 -0
- 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-BzhHI3lo.js → navigation-DaRjthVk.js} +101 -82
- package/dist/navigation-DaRjthVk.js.map +1 -0
- package/dist/{navigation-row-recipes-BFLCk_Aq.js → navigation-row-recipes-BGVLvU_O.js} +9 -9
- package/dist/navigation-row-recipes-BGVLvU_O.js.map +1 -0
- package/dist/{number-DbV1Dija.js → number-CRU3kGuk.js} +5 -5
- package/dist/{number-DbV1Dija.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-BL25hu2s.js → pagination-CgCjElfu.js} +7 -7
- package/dist/{pagination-BL25hu2s.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-Cn9rUkdc.js → popover-menu-DlnQ2zlR.js} +7 -7
- package/dist/{popover-menu-Cn9rUkdc.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-BFK08r9M.js → primitives-ByWgGUgt.js} +6 -6
- package/dist/{primitives-BFK08r9M.js.map → primitives-ByWgGUgt.js.map} +1 -1
- package/dist/primitives.js +4 -4
- package/dist/{progress-B1VnCT0K.js → progress-BJhQP9WX.js} +9 -9
- package/dist/{progress-B1VnCT0K.js.map → progress-BJhQP9WX.js.map} +1 -1
- package/dist/{receipt-BVSOH3Xo.js → receipt-tOc7B3hw.js} +7 -7
- package/dist/receipt-tOc7B3hw.js.map +1 -0
- package/dist/{rich-text-GOUyKQ-s.js → rich-text-Dth5E882.js} +4 -4
- package/dist/{rich-text-GOUyKQ-s.js.map → rich-text-Dth5E882.js.map} +1 -1
- package/dist/{rich-text-editor-cRLC-eBK.js → rich-text-editor-C1fOjBTd.js} +429 -430
- package/dist/rich-text-editor-C1fOjBTd.js.map +1 -0
- package/dist/{rich-text-editor-toolbar-DfXg0-VC.js → rich-text-editor-toolbar-laT3tpBT.js} +33 -29
- package/dist/rich-text-editor-toolbar-laT3tpBT.js.map +1 -0
- package/dist/{scroll-area-DcI-M1UT.js → scroll-area-B0dB2cBi.js} +2 -2
- package/dist/{scroll-area-DcI-M1UT.js.map → scroll-area-B0dB2cBi.js.map} +1 -1
- package/dist/{separator-Bom7NsGO.js → separator-Bb17I4pu.js} +2 -2
- package/dist/{separator-Bom7NsGO.js.map → separator-Bb17I4pu.js.map} +1 -1
- package/dist/{separator-BDV-Y648.js → separator-Ct_WSWTJ.js} +3 -3
- package/dist/{separator-BDV-Y648.js.map → separator-Ct_WSWTJ.js.map} +1 -1
- package/dist/services/actions.js +1 -1
- package/dist/settings-Bar5wiSo.js +167 -0
- 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-BmisBK-3.js → structure-DuxKl954.js} +3 -3
- package/dist/{structure-BmisBK-3.js.map → structure-DuxKl954.js.map} +1 -1
- package/dist/{structure.recipes-EPz60cU8.js → structure.recipes-BB4-n58V.js} +2 -2
- package/dist/{structure.recipes-EPz60cU8.js.map → structure.recipes-BB4-n58V.js.map} +1 -1
- package/dist/style.css +1 -1
- package/dist/{table-DsfzoUia.js → table-B4TE7iOV.js} +3 -3
- package/dist/{table-DsfzoUia.js.map → table-B4TE7iOV.js.map} +1 -1
- package/dist/{table-BweFy_P9.js → table-CFOWY9pQ.js} +394 -388
- package/dist/table-CFOWY9pQ.js.map +1 -0
- package/dist/{tabs-CDocW5D1.js → tabs-e7ko9S2o.js} +11 -11
- package/dist/tabs-e7ko9S2o.js.map +1 -0
- package/dist/{text-inputs-f9Ia-aCi.js → text-inputs-B1culiSK.js} +107 -104
- package/dist/text-inputs-B1culiSK.js.map +1 -0
- package/dist/{text.styles-g4He6UIW.js → text.styles-B64My8RZ.js} +25 -10
- package/dist/text.styles-B64My8RZ.js.map +1 -0
- package/dist/theme.css +192 -149
- package/dist/{timelines-CwM_9IhD.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-WnKQzwbq.js → tree-CzUJHnFs.js} +9 -9
- package/dist/{tree-WnKQzwbq.js.map → tree-CzUJHnFs.js.map} +1 -1
- package/dist/typography/rich-text.js +1 -1
- package/dist/typography-BQnine1k.js +117 -0
- package/dist/typography-BQnine1k.js.map +1 -0
- 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-CXyxmQBP.js → upload-BOW6U2tI.js} +25 -24
- package/dist/upload-BOW6U2tI.js.map +1 -0
- package/dist/{upload-queue-Boscubn9.js → upload-queue-qUXn1ykN.js} +16 -14
- package/dist/upload-queue-qUXn1ykN.js.map +1 -0
- package/dist/{usage-card-BhO5eqkX.js → usage-card-BeSLY0i0.js} +145 -137
- package/dist/usage-card-BeSLY0i0.js.map +1 -0
- package/dist/{utils-BRhFDwuU.js → utils-B6kKb8jB.js} +303 -144
- 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-BP8OG6h5.js → value-typography-uAmWUAL1.js} +2 -2
- package/dist/{value-typography-BP8OG6h5.js.map → value-typography-uAmWUAL1.js.map} +1 -1
- package/dist/workspace-DHeHv0qw.js +411 -0
- package/dist/workspace-DHeHv0qw.js.map +1 -0
- package/docs/consumer-skill/SKILL.md +15 -129
- package/docs/consumer-skill/agents/themelia-ui-designer.md +96 -0
- package/docs/consumer-skill/examples/app-layout.tsx +74 -13
- package/docs/consumer-skill/examples/authentication.tsx +77 -0
- 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 +30 -38
- 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 +88 -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-bindings.tsx +86 -0
- package/docs/consumer-skill/examples/rhf-edit-page.tsx +141 -0
- package/docs/consumer-skill/examples/rhf-overlay-form.tsx +105 -0
- package/docs/consumer-skill/examples/rhf-transport.tsx +28 -0
- package/docs/consumer-skill/examples/token-domain-structure.tsx +68 -0
- package/docs/consumer-skill/references/agents-md.md +23 -11
- package/docs/consumer-skill/references/analytics.md +18 -1
- package/docs/consumer-skill/references/authentication.md +42 -0
- package/docs/consumer-skill/references/commerce-composition.md +97 -0
- package/docs/consumer-skill/references/component-contracts.json +325201 -0
- package/docs/consumer-skill/references/composition-mapping.md +106 -0
- package/docs/consumer-skill/references/composition.md +198 -46
- 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 +43 -9
- package/docs/consumer-skill/references/discovery.md +109 -8
- package/docs/consumer-skill/references/domain-structures.md +124 -0
- package/docs/consumer-skill/references/installation.md +51 -36
- package/docs/consumer-skill/references/integration.md +41 -2
- package/docs/consumer-skill/references/product-composition.md +94 -0
- package/docs/consumer-skill/references/public-api.json +4390 -475
- package/docs/consumer-skill/references/review.md +47 -5
- package/docs/consumer-skill/references/rhf-workflows.md +93 -0
- package/docs/consumer-skill/references/screen-archetypes.md +34 -0
- package/docs/consumer-skill/references/screen-decisions.md +126 -0
- package/docs/consumer-skill/references/theming.md +25 -27
- package/docs/consumer-skill/references/tokens.json +20 -11
- 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 +9 -2
- package/docs/consumer-skill/scripts/composition-policy.mjs +39 -3
- package/docs/consumer-skill/scripts/composition-schema.d.mts +2 -0
- package/docs/consumer-skill/scripts/composition-schema.mjs +32 -0
- package/docs/consumer-skill/scripts/composition.mjs +254 -0
- package/docs/consumer-skill/scripts/discovery.mjs +96 -10
- package/docs/consumer-skill/scripts/inspect-component.mjs +11 -0
- package/docs/consumer-skill/scripts/inspect-tokens.mjs +11 -0
- package/docs/consumer-skill/scripts/inspection.mjs +193 -0
- package/docs/consumer-skill/scripts/map-composition.mjs +12 -0
- package/docs/consumer-skill/scripts/setup-skills.mjs +111 -0
- package/docs/consumer-skill/scripts/surface-policy.mjs +5 -5
- package/docs/consumer-skills/themelia-components/SKILL.md +31 -0
- package/docs/consumer-skills/themelia-composition/SKILL.md +34 -0
- package/docs/consumer-skills/themelia-design/SKILL.md +55 -0
- package/docs/consumer-skills/themelia-forms/SKILL.md +12 -0
- package/docs/consumer-skills/themelia-foundation/SKILL.md +15 -0
- package/docs/consumer-skills/themelia-tokenization/SKILL.md +42 -0
- package/package.json +4 -2
- package/templates/README.md +39 -0
- package/templates/admin-shell-template.tsx +382 -0
- package/templates/analytics-operations-template.tsx +376 -0
- package/templates/customers-template.tsx +509 -0
- package/templates/index.ts +29 -0
- package/templates/orders-template.tsx +1102 -0
- package/templates/products-template.tsx +834 -0
- package/templates/user-permissions-template.tsx +450 -0
- package/dist/accordion-Cjb6sx0G.js.map +0 -1
- package/dist/action-menu-CllU52Mm.js +0 -280
- package/dist/action-menu-CllU52Mm.js.map +0 -1
- package/dist/affordance-geometry.generated-tF36bREk.js.map +0 -1
- package/dist/ai-artifact-DvTwDVyL.js.map +0 -1
- package/dist/app-shell-C4FhvCqF.js +0 -236
- package/dist/app-shell-C4FhvCqF.js.map +0 -1
- package/dist/auth-BGua8ouh.js.map +0 -1
- package/dist/avatar-DAPlDvhJ.js.map +0 -1
- package/dist/base/cascader.js.map +0 -1
- package/dist/batch-action-bar-DnUJ21NQ.js.map +0 -1
- package/dist/button-DVzspB_G.js.map +0 -1
- package/dist/buttons-DPZekJFu.js.map +0 -1
- package/dist/cards-BaBZR-AU.js +0 -68
- package/dist/cards-BaBZR-AU.js.map +0 -1
- package/dist/chart-ZOYyK2xG.js +0 -155
- package/dist/chart-ZOYyK2xG.js.map +0 -1
- package/dist/checkbox-AWIhNhmo.js.map +0 -1
- package/dist/choice-inputs-CNHvARCJ.js +0 -770
- package/dist/choice-inputs-CNHvARCJ.js.map +0 -1
- package/dist/code-block-DeneBJR_.js.map +0 -1
- package/dist/combobox-DaHESuiL.js +0 -355
- package/dist/combobox-DaHESuiL.js.map +0 -1
- package/dist/combobox-Dxo2fAYQ.js.map +0 -1
- package/dist/command-C25VMRII.js.map +0 -1
- package/dist/comments-DD0DUPwJ.js.map +0 -1
- package/dist/containers-Mu1LMGV1.js +0 -103
- package/dist/containers-Mu1LMGV1.js.map +0 -1
- package/dist/control-group-recipes-DBXmfh2E.js.map +0 -1
- package/dist/data-display-DT_khPl_.js.map +0 -1
- package/dist/date-picker-B2K3ucWn.js.map +0 -1
- package/dist/date-pickers-Ds8gLaoP.js +0 -175
- package/dist/date-pickers-Ds8gLaoP.js.map +0 -1
- package/dist/dropdown-menu-Cl4X7L5S.js +0 -193
- package/dist/dropdown-menu-Cl4X7L5S.js.map +0 -1
- package/dist/feedback-BYIhtitP.js.map +0 -1
- package/dist/field-affordance-recipes-DZhnIL_Y.js.map +0 -1
- package/dist/filters-DJVAveHA.js.map +0 -1
- package/dist/form-field-CwH9y77i.js.map +0 -1
- package/dist/form-sizing-BdP_Mf5p.js.map +0 -1
- package/dist/forms-B9G_xwzi.js +0 -194
- package/dist/forms-B9G_xwzi.js.map +0 -1
- package/dist/forms-numeric-B_jraJaQ.js.map +0 -1
- package/dist/header-BSfIEWbI.js.map +0 -1
- package/dist/hooks-ClH9thn4.js.map +0 -1
- package/dist/input-CZw8iU99.js +0 -21
- package/dist/input-CZw8iU99.js.map +0 -1
- package/dist/input-DQdEd0YD.js +0 -263
- package/dist/input-DQdEd0YD.js.map +0 -1
- package/dist/item-K5_ghvze.js +0 -275
- package/dist/item-K5_ghvze.js.map +0 -1
- package/dist/message-DZ_ruyUV.js.map +0 -1
- package/dist/metadata-list-8N16ZMW_.js +0 -405
- package/dist/metadata-list-8N16ZMW_.js.map +0 -1
- package/dist/motion-recipes-ChBg4HBq.js.map +0 -1
- package/dist/navigation-Bnotn4AQ.js +0 -145
- package/dist/navigation-Bnotn4AQ.js.map +0 -1
- package/dist/navigation-BzhHI3lo.js.map +0 -1
- package/dist/navigation-row-recipes-BFLCk_Aq.js.map +0 -1
- package/dist/overflow-tab-bar-CWY7Nogn.js +0 -282
- package/dist/overflow-tab-bar-CWY7Nogn.js.map +0 -1
- package/dist/overlays-tMkF-VAN.js +0 -1003
- package/dist/overlays-tMkF-VAN.js.map +0 -1
- package/dist/page-CL9YeH_V.js +0 -224
- package/dist/page-CL9YeH_V.js.map +0 -1
- package/dist/page-header-commands-DOb6WsfD.js +0 -126
- package/dist/page-header-commands-DOb6WsfD.js.map +0 -1
- package/dist/popover-gnTOhbFM.js +0 -198
- package/dist/popover-gnTOhbFM.js.map +0 -1
- package/dist/popover.recipes-D3j8R8Yp.js.map +0 -1
- package/dist/receipt-BVSOH3Xo.js.map +0 -1
- package/dist/rich-text-editor-cRLC-eBK.js.map +0 -1
- package/dist/rich-text-editor-toolbar-DfXg0-VC.js.map +0 -1
- package/dist/settings-ybnjVwbd.js +0 -171
- package/dist/settings-ybnjVwbd.js.map +0 -1
- package/dist/sheet-ijlsjq-n.js +0 -213
- package/dist/sheet-ijlsjq-n.js.map +0 -1
- package/dist/sidebar-Db6gkh3U.js +0 -619
- package/dist/sidebar-Db6gkh3U.js.map +0 -1
- package/dist/sidebar-DkTO4VTO.js +0 -512
- package/dist/sidebar-DkTO4VTO.js.map +0 -1
- package/dist/skeleton-Byjnt7qr.js +0 -264
- package/dist/skeleton-Byjnt7qr.js.map +0 -1
- package/dist/smart-card-DiC5aac3.js +0 -604
- package/dist/smart-card-DiC5aac3.js.map +0 -1
- package/dist/table-BweFy_P9.js.map +0 -1
- package/dist/tabs-CDocW5D1.js.map +0 -1
- package/dist/text-inputs-f9Ia-aCi.js.map +0 -1
- package/dist/text.styles-g4He6UIW.js.map +0 -1
- package/dist/theme-scope-BJ6eE2xt.js +0 -50
- package/dist/theme-scope-BJ6eE2xt.js.map +0 -1
- package/dist/timelines-CwM_9IhD.js.map +0 -1
- package/dist/tooltip-yiRJUFjp.js +0 -111
- package/dist/tooltip-yiRJUFjp.js.map +0 -1
- package/dist/typography-UTnveOEy.js +0 -117
- package/dist/typography-UTnveOEy.js.map +0 -1
- package/dist/ui-provider-C_U0Xma4.js +0 -136
- package/dist/ui-provider-C_U0Xma4.js.map +0 -1
- package/dist/upload-CXyxmQBP.js.map +0 -1
- package/dist/upload-queue-Boscubn9.js.map +0 -1
- package/dist/usage-card-BhO5eqkX.js.map +0 -1
- package/dist/use-mobile-vaLKwgyf.js +0 -15
- package/dist/use-mobile-vaLKwgyf.js.map +0 -1
- package/dist/utils-BRhFDwuU.js.map +0 -1
- package/dist/value-inputs-TaX4OjNk.js +0 -963
- package/dist/value-inputs-TaX4OjNk.js.map +0 -1
- package/dist/workspace-B-OEm3Kf.js +0 -408
- package/dist/workspace-B-OEm3Kf.js.map +0 -1
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { useEffect, useId, useRef } from 'react';
|
|
2
|
+
import { useForm } from 'react-hook-form';
|
|
3
|
+
import { Button } from 'themelia-react-ui/base/buttons';
|
|
4
|
+
import { ControlledFormField, ErrorSummary } from 'themelia-react-ui/base/forms';
|
|
5
|
+
import { Input } from 'themelia-react-ui/base/text-inputs';
|
|
6
|
+
import { Select, ToggleField } from 'themelia-react-ui/base/choice-inputs';
|
|
7
|
+
import { Stack } from 'themelia-react-ui/base/structure';
|
|
8
|
+
import { ActionDialog, ActionDrawer, useOverlayVisibility } from 'themelia-react-ui/features/overlays';
|
|
9
|
+
|
|
10
|
+
export interface CustomerDraft { name: string; email: string; segment: string; notify: boolean; }
|
|
11
|
+
export interface CustomerDraftRecord extends CustomerDraft { id: string; }
|
|
12
|
+
export type CustomerSaveResult =
|
|
13
|
+
| { ok: true; record: CustomerDraftRecord }
|
|
14
|
+
| { ok: false; errors: Partial<Record<'name' | 'email', string>>; message?: string };
|
|
15
|
+
export interface RHFOverlayFormProps {
|
|
16
|
+
record?: CustomerDraftRecord;
|
|
17
|
+
/** Resolve only when transport finishes; reject network failures. */
|
|
18
|
+
onSave: (draft: CustomerDraft, recordId?: string) => Promise<CustomerSaveResult>;
|
|
19
|
+
onSaved: (record: CustomerDraftRecord) => void;
|
|
20
|
+
}
|
|
21
|
+
const empty: CustomerDraft = { name: '', email: '', segment: 'standard', notify: true };
|
|
22
|
+
|
|
23
|
+
/** Mount with a record key if the selected customer changes while editing. */
|
|
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) {
|
|
36
|
+
const id = useId();
|
|
37
|
+
const overlay = useOverlayVisibility();
|
|
38
|
+
const lock = useRef(false);
|
|
39
|
+
const pendingFocus = useRef<'name' | 'email' | undefined>(undefined);
|
|
40
|
+
const form = useForm<CustomerDraft>({ defaultValues: record ?? empty, mode: 'onBlur' });
|
|
41
|
+
const { isSubmitting, errors } = form.formState;
|
|
42
|
+
const { setFocus } = form;
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
if (!isSubmitting && pendingFocus.current) {
|
|
45
|
+
setFocus(pendingFocus.current);
|
|
46
|
+
pendingFocus.current = undefined;
|
|
47
|
+
}
|
|
48
|
+
}, [isSubmitting, setFocus]);
|
|
49
|
+
const summary = [errors.name?.message, errors.email?.message, errors.root?.server?.message].filter((message): message is string => Boolean(message));
|
|
50
|
+
function open() {
|
|
51
|
+
// Snapshot on an intentional open; never reset from background record updates.
|
|
52
|
+
form.reset(record ? { name: record.name, email: record.email, segment: record.segment, notify: record.notify } : empty);
|
|
53
|
+
overlay.show();
|
|
54
|
+
}
|
|
55
|
+
const submit = form.handleSubmit(async values => {
|
|
56
|
+
if (lock.current) return;
|
|
57
|
+
lock.current = true;
|
|
58
|
+
pendingFocus.current = undefined;
|
|
59
|
+
form.clearErrors();
|
|
60
|
+
try {
|
|
61
|
+
const result = await onSave(values, record?.id);
|
|
62
|
+
if (!result.ok) {
|
|
63
|
+
let focused = false;
|
|
64
|
+
for (const name of ['name', 'email'] as const) if (result.errors[name]) {
|
|
65
|
+
form.setError(name, { type: 'server', message: result.errors[name] });
|
|
66
|
+
if (!focused) pendingFocus.current = name;
|
|
67
|
+
focused = true;
|
|
68
|
+
}
|
|
69
|
+
form.setError('root.server', { type: 'server', message: result.message ?? 'Review the highlighted fields. Your draft is kept.' });
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
form.reset(result.record);
|
|
73
|
+
onSaved(result.record);
|
|
74
|
+
overlay.hide();
|
|
75
|
+
} catch {
|
|
76
|
+
form.setError('root.server', { type: 'transport', message: 'Customer could not be saved. Your draft is kept; retry Save customer.' });
|
|
77
|
+
} finally { lock.current = false; }
|
|
78
|
+
});
|
|
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}>
|
|
88
|
+
<Stack gap="xl">
|
|
89
|
+
{summary.length > 0 && <ErrorSummary title="Customer could not be saved" errors={summary} />}
|
|
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.' } }}>
|
|
91
|
+
{(field, _error, invalid) => <Input ref={field.ref} name={field.name} value={field.value} onValueChange={value => field.onChange(value)} onBlur={field.onBlur} invalid={invalid} disabled={isSubmitting} />}
|
|
92
|
+
</ControlledFormField>
|
|
93
|
+
<ControlledFormField control={form.control} name="email" label="Email" required rules={{ required: 'Enter an email.', pattern: { value: /^[^\s@]+@[^\s@]+\.[^\s@]+$/, message: 'Enter a valid email.' } }}>
|
|
94
|
+
{(field, _error, invalid) => <Input type="email" ref={field.ref} name={field.name} value={field.value} onValueChange={value => field.onChange(value)} onBlur={field.onBlur} invalid={invalid} disabled={isSubmitting} />}
|
|
95
|
+
</ControlledFormField>
|
|
96
|
+
<ControlledFormField control={form.control} name="segment" label="Segment">
|
|
97
|
+
{(field, _error, invalid) => <Select ref={field.ref} name={field.name} value={field.value} onValueChange={value => field.onChange(value ?? '')} onBlur={field.onBlur} invalid={invalid} disabled={isSubmitting} options={[{ value: 'standard', label: 'Standard' }, { value: 'wholesale', label: 'Wholesale' }]} />}
|
|
98
|
+
</ControlledFormField>
|
|
99
|
+
<ControlledFormField control={form.control} name="notify">
|
|
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} />}
|
|
101
|
+
</ControlledFormField>
|
|
102
|
+
</Stack>
|
|
103
|
+
</form>,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** App-owned result: a callback transport reports an outcome before it finishes. */
|
|
2
|
+
export type SaveOutcome<TValues> =
|
|
3
|
+
| { ok: true; values: TValues }
|
|
4
|
+
| { ok: false; errors: Record<string, string | readonly string[]>; message?: string };
|
|
5
|
+
export interface SaveVisitCallbacks<TValues> {
|
|
6
|
+
onSuccess: (saved: TValues) => void;
|
|
7
|
+
onError: (errors: Record<string, string | readonly string[]>) => void;
|
|
8
|
+
onCancel: () => void;
|
|
9
|
+
onFinish: () => void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** Inertia adapter calls onFinish only when its complete visit lifecycle ends. */
|
|
13
|
+
export function awaitCallbackSave<TValues>(
|
|
14
|
+
values: TValues,
|
|
15
|
+
visit: (values: TValues, callbacks: SaveVisitCallbacks<TValues>) => void,
|
|
16
|
+
): Promise<SaveOutcome<TValues>> {
|
|
17
|
+
return new Promise((resolve, reject) => {
|
|
18
|
+
let outcome: SaveOutcome<TValues> = { ok: false, errors: {}, message: 'The request finished without a saved result.' };
|
|
19
|
+
try {
|
|
20
|
+
visit(values, {
|
|
21
|
+
onSuccess: saved => { outcome = { ok: true, values: saved }; },
|
|
22
|
+
onError: errors => { outcome = { ok: false, errors }; },
|
|
23
|
+
onCancel: () => { outcome = { ok: false, errors: {}, message: 'Saving was cancelled. Your draft is kept.' }; },
|
|
24
|
+
onFinish: () => resolve(outcome),
|
|
25
|
+
});
|
|
26
|
+
} catch (error) { reject(error); }
|
|
27
|
+
});
|
|
28
|
+
}
|
|
@@ -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,20 +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
|
-
|
|
12
|
-
|
|
11
|
+
Read the matching node_modules/themelia-react-ui/docs/consumer-skills/<name>/SKILL.md:
|
|
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:
|
|
13
20
|
node node_modules/themelia-react-ui/docs/consumer-skill/scripts/find-components.mjs <task nouns>
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
21
|
+
node node_modules/themelia-react-ui/docs/consumer-skill/scripts/map-composition.mjs --roles
|
|
22
|
+
node node_modules/themelia-react-ui/docs/consumer-skill/scripts/inspect-component.mjs <symbol> --import <exact import>
|
|
23
|
+
node node_modules/themelia-react-ui/docs/consumer-skill/scripts/inspect-tokens.mjs <role or root>
|
|
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.
|
|
19
30
|
Done means: node node_modules/themelia-react-ui/docs/consumer-skill/scripts/check-composition.mjs <changed files>
|
|
20
|
-
reports no errors (fix
|
|
21
|
-
|
|
22
|
-
|
|
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.
|
|
23
35
|
<!-- themelia-react-ui:end -->
|
|
24
36
|
```
|
|
25
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,42 @@
|
|
|
1
|
+
# Authentication composition
|
|
2
|
+
|
|
3
|
+
## Authentication pages
|
|
4
|
+
|
|
5
|
+
Use `AuthShell` from `themelia-react-ui/layout/auth` for login, sign-in,
|
|
6
|
+
registration, recovery and verification screens. It already renders the main
|
|
7
|
+
landmark, an AuthCard and the title as the page's h1. Give it `title` and
|
|
8
|
+
`description`; adding Page, another main, AuthCard or a repeated heading around
|
|
9
|
+
its form duplicates those owners. `variant="bare"` keeps the shell's rhythm
|
|
10
|
+
on the page surface; `split` adds contextual content through `splitPanel`.
|
|
11
|
+
Use standalone AuthCard only when the application already owns the surrounding
|
|
12
|
+
layout and landmark.
|
|
13
|
+
|
|
14
|
+
The [password sign-in recipe](../examples/authentication.tsx) exports
|
|
15
|
+
`PasswordSignIn`. It composes AuthForm, FormField, Input and PasswordInput,
|
|
16
|
+
one explicit primary submit action, and AuthFormRow for remember-device and
|
|
17
|
+
recovery controls. FormField associates labels through the control IDs.
|
|
18
|
+
The horizontal Stack renders a native label around Checkbox and its copy:
|
|
19
|
+
the whole label is clickable, and `direction="horizontal"` plus `gap="md"`
|
|
20
|
+
keeps the square beside the text. Do not give that checkbox a separate
|
|
21
|
+
vertical FormField label. AuthFormRow wraps auxiliary controls at narrow widths.
|
|
22
|
+
|
|
23
|
+
AuthShell footerLinks and AuthFooterLinks accept `renderLink` for the app's
|
|
24
|
+
router. Supply only destinations available to the anonymous visitor and useful
|
|
25
|
+
for this flow, such as recovery or return to the originating application.
|
|
26
|
+
Choose a return destination from trusted application context. Workspace,
|
|
27
|
+
account and administration navigation belongs to the corresponding signed-in
|
|
28
|
+
experience. An application without a relevant return destination can omit it.
|
|
29
|
+
Translations and additional supported authentication methods remain app choices.
|
|
30
|
+
|
|
31
|
+
The recipe delegates authentication and successful navigation to `onSignIn`.
|
|
32
|
+
It guards duplicate submissions, exposes `aria-busy`, disables editable controls
|
|
33
|
+
while pending, and announces a retryable failure without discarding the input.
|
|
34
|
+
Required email/password controls retain native validation and autocomplete.
|
|
35
|
+
The app owns server validation, field error associations, redirects, session
|
|
36
|
+
handling, cancellation and any superseded-request policy its transport needs.
|
|
37
|
+
Install `react-hook-form` to resolve the imported forms family's declarations
|
|
38
|
+
under strict checking; this recipe does not require its runtime form adapter.
|
|
39
|
+
|
|
40
|
+
Verify keyboard submit, native labels and password reveal, pending and failed
|
|
41
|
+
sign-in, retry, and the actual anonymous destinations. Inspect the form at narrow
|
|
42
|
+
and desktop widths in light/dark; source checks do not establish wrapping or focus.
|
|
@@ -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.
|