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,124 @@
|
|
|
1
|
+
# Token-backed domain structures
|
|
2
|
+
|
|
3
|
+
Use when a business relationship needs its own structure: an allocation ledger,
|
|
4
|
+
stock comparison, schedule, reconciliation or other subject whose arrangement is
|
|
5
|
+
more specific than a ready-made block. Start with [screen decisions](screen-decisions.md)
|
|
6
|
+
and the installed component discovery tools. Mostly compose public base
|
|
7
|
+
components, layout blocks, typography and value primitives; add semantic JSX and
|
|
8
|
+
Tailwind where the subject needs custom tracks, grouping or responsive behavior.
|
|
9
|
+
This is a normal application seam, not a fallback that requires a missing API.
|
|
10
|
+
|
|
11
|
+
## Divide the work deliberately
|
|
12
|
+
|
|
13
|
+
| Requirement | Owner |
|
|
14
|
+
| --- | --- |
|
|
15
|
+
| Route identity, commands, gutters and page regions | Page and the chosen app layout |
|
|
16
|
+
| A titled/framed/transparent subject with aligned insets | Card; paint and padding are independent |
|
|
17
|
+
| Routine stack, wrapping actions, equal tracks or column split | Stack, Grid, AdaptiveGrid, TwoColumnLayout |
|
|
18
|
+
| A product-specific comparison, local container adaptation or irregular tracks | App component with semantic JSX and Tailwind on its own elements |
|
|
19
|
+
| Display text and formatted values | Heading, Text, Money, Number, Date and related primitives |
|
|
20
|
+
| Selection, commands, menus, forms and overlays | The relevant public interactive owner and its supported parts |
|
|
21
|
+
| Business calculations, allocation rules and accepted state | App/domain logic or authoritative backend results |
|
|
22
|
+
|
|
23
|
+
Do not recreate Input, Menu, Button, Card anatomy or keyboard behavior in custom
|
|
24
|
+
markup. An app-owned region can still contain these owners. Extract a component
|
|
25
|
+
when it gives a coherent domain contract; a new file or custom component count
|
|
26
|
+
does not itself improve a screen.
|
|
27
|
+
|
|
28
|
+
## Choose classes by responsibility
|
|
29
|
+
|
|
30
|
+
Use `inspect-tokens.mjs` to verify the installed utility spelling and overrideRoot.
|
|
31
|
+
The following are shipped classes, not new variables:
|
|
32
|
+
|
|
33
|
+
| Intent on app-owned markup | Vocabulary |
|
|
34
|
+
| --- | --- |
|
|
35
|
+
| Close label/supporting copy | `gap-dense`, `gap-normal` or the equivalent Stack gap |
|
|
36
|
+
| Related values/fields | `gap-space-xl` |
|
|
37
|
+
| Separate subjects | `gap-space-2xl` |
|
|
38
|
+
| A custom surface region | `p-surface`, `px-surface`, `py-surface` when that element owns the inset |
|
|
39
|
+
| A custom plain row | `px-row-x`, `py-row-y` when its row inset is required |
|
|
40
|
+
| Layout and responsive geometry | `min-w-0`, `grid`, `grid-cols-[…]`, `@container/name`, named container queries, wrapping and overflow |
|
|
41
|
+
| App surface/foreground | `bg-card text-card-foreground`, `bg-background text-foreground`, `bg-sidebar text-sidebar-foreground` |
|
|
42
|
+
| Quiet copy / structural rule | Text type="secondary" / `border-border` |
|
|
43
|
+
|
|
44
|
+
Pick the relationship before the size. Page/Card already owning an inset means
|
|
45
|
+
the inner subject does not add `p-surface`. Flat Card retains md padding unless
|
|
46
|
+
explicitly changed; use padding="none" only under another inset owner or for an
|
|
47
|
+
intentional flush region. Transparent and painted peers can use the same inset
|
|
48
|
+
so their heading/body edges align.
|
|
49
|
+
|
|
50
|
+
Continuous sections can share one padded host and an unpadded internal Stack.
|
|
51
|
+
Separate padded flat Cards can accidentally add bottom inset + peer gap + top
|
|
52
|
+
inset; a valid token on each layer does not justify that combined distance.
|
|
53
|
+
|
|
54
|
+
Use a local container query when a subject can live in either a main column or
|
|
55
|
+
a narrow aside. Viewport width alone does not establish available space. An
|
|
56
|
+
arbitrary grid track or breakpoint can express product geometry; arbitrary
|
|
57
|
+
spacing, text sizes, radius or state palettes usually recreate a shared role.
|
|
58
|
+
Do not force essential rows into horizontal scrolling merely to retain every
|
|
59
|
+
desktop column. Preserve the important identity/value relationship in the
|
|
60
|
+
narrow composition and keep other detail accessible.
|
|
61
|
+
|
|
62
|
+
## Customize the theme, not each control
|
|
63
|
+
|
|
64
|
+
Keep shadcn surface/foreground pairs and use component tone/status props.
|
|
65
|
+
Use Heading/Text props instead of typography classes on imported text owners.
|
|
66
|
+
Use supported sizes/insets on controls and surfaces. Do not add local hover,
|
|
67
|
+
focus, selected or disabled recipes to a public component.
|
|
68
|
+
|
|
69
|
+
Typography props are not interchangeable: Heading selects semantic level and
|
|
70
|
+
visual size with tag/size; Text has its own supported tags and weight/type
|
|
71
|
+
contract. Inspect the exact export instead of assuming that a prop supported by
|
|
72
|
+
one typography owner exists on another.
|
|
73
|
+
|
|
74
|
+
Custom table cells retain those primitives' alignment and flow. Match the column
|
|
75
|
+
header and every line of the cell deliberately: a right-aligned Money above
|
|
76
|
+
left-aligned cost copy under a left-aligned header creates three conflicting
|
|
77
|
+
axes. Preserve the table's chosen alignment or use its supported column seam;
|
|
78
|
+
do not assume the surrounding cell overrides a child primitive's own default.
|
|
79
|
+
Keep primary prices/SKUs readable and move secondary detail to its inspection
|
|
80
|
+
subject when it prevents useful comparison.
|
|
81
|
+
|
|
82
|
+
Canonical roots are the settings: `--space-scale` changes shared gaps/insets;
|
|
83
|
+
`--density-scale` changes action/control/row geometry; `--surface-x` and
|
|
84
|
+
`--surface-y` own surface room. They have different responsibilities. A smaller
|
|
85
|
+
mobile viewport does not automatically justify globally shrinking all of them.
|
|
86
|
+
First repair duplicated insets, wrong group spacing and low-priority content.
|
|
87
|
+
When the product needs a shared responsive spacing policy, set the appropriate
|
|
88
|
+
existing root at its app/theme boundary in CSS and review affected siblings.
|
|
89
|
+
Preserve usable controls and copy; avoid component-specific token copies.
|
|
90
|
+
|
|
91
|
+
Use derived utilities as classes. Never override or read derived `--spacing-*`,
|
|
92
|
+
`--radius-*` or `--container-*` aliases inside a scoped formula: they resolve at
|
|
93
|
+
the root. If custom drawing needs a formula, derive from the canonical roots
|
|
94
|
+
and apply each scale once. ThemeScope handles scoped/portaled theme inheritance;
|
|
95
|
+
do not copy computed variables through JavaScript.
|
|
96
|
+
|
|
97
|
+
## Executable example
|
|
98
|
+
|
|
99
|
+
The [allocation subject](../examples/token-domain-structure.tsx) combines public
|
|
100
|
+
Card/Stack/Text/value owners with an app-owned definition grid. It compares
|
|
101
|
+
reserved quantities across locations, a relationship no block represents. Goods
|
|
102
|
+
that share one fulfillment status and ship-from location, with the commands that
|
|
103
|
+
move them on, are a `FulfillmentGroup` instead; see the
|
|
104
|
+
[order and invoice map](commerce-composition.md). Warehouse groups
|
|
105
|
+
and unavailable quantities stay near their goods. The custom grid changes at
|
|
106
|
+
its own container width; no control or surface recipe is replaced. The caller
|
|
107
|
+
supplies accepted quantities and optional public actions; the example does not
|
|
108
|
+
invent inventory allocation or fulfillment policy.
|
|
109
|
+
|
|
110
|
+
The [assessment comparison](../examples/custom-composition.tsx) is a smaller
|
|
111
|
+
example, and [commerce lines](../examples/commerce-lines.tsx) demonstrates a
|
|
112
|
+
block's typed content seam. Run these through the consumer checker after
|
|
113
|
+
adapting them. Ensure the app compiles its own Tailwind utilities as described in
|
|
114
|
+
[theming](theming.md); shipped component CSS does not compile app-authored classes.
|
|
115
|
+
|
|
116
|
+
## Inspect the result
|
|
117
|
+
|
|
118
|
+
Review actual hierarchy, peer content edges, spacing and wrapping in narrow/wide
|
|
119
|
+
parents, light/dark themes and independently changed spacing/density. Inspect
|
|
120
|
+
the image; zero overflow is not enough. Open a menu/editor in the active scope,
|
|
121
|
+
then verify keyboard/focus, invalid/disabled and accepted/error states. If a
|
|
122
|
+
supported public composition still drifts, report the exact owner and a minimal
|
|
123
|
+
reproduction so the shared component is repaired instead of patched with local
|
|
124
|
+
CSS. See [review](review.md) for separate source, appearance and interaction proof.
|
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
# Installed package and skill setup
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
## Choose the CSS path
|
|
4
|
+
|
|
5
|
+
**Standalone compiled CSS:** import `themelia-react-ui/style.css` once in the app entry. It includes component styles and the documented public utility vocabulary; components work without a host reset, Tailwind processing or private-source scanning. It deliberately omits global preflight. This path does not generate arbitrary utility classes written in app source.
|
|
6
|
+
|
|
7
|
+
**Tailwind v4 application utilities:** when the app authors Tailwind classes, process this application stylesheet through its Tailwind v4 build integration:
|
|
8
|
+
|
|
9
|
+
```css
|
|
10
|
+
@import "tailwindcss";
|
|
11
|
+
@import "themelia-react-ui/style.css";
|
|
12
|
+
@import "themelia-react-ui/theme.css";
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Tailwind supplies app-generated utilities and its layered preflight; theme.css makes the semantic and structural vocabulary available to that compilation. No package-private source scan is required. The default layer order is `theme, base, components, utilities`. Keep app resets inside `@layer base`; unlayered universal/tag resets outrank layered package styles regardless of import order. Do not blanket-reset `[data-slot]`, which also belongs to third-party and app markup. Put intentional scoped app overrides after these imports. See [integration](integration.md) for an optional app-owned reset and provider setup.
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
Themelia 2.0.5 requires the official `@base-ui/react ^1.9.0` npm peer alongside
|
|
4
19
|
React, React DOM and Lucide. An app already using `^1.9.0` can retain that range.
|
|
5
20
|
Remove any older private Base UI archive pin or override before refreshing the
|
|
6
21
|
lockfile; dismissal translations and nested popup focus belong to Themelia's
|
|
@@ -31,27 +46,15 @@ while (true) {
|
|
|
31
46
|
}
|
|
32
47
|
const installedSkill = path.join(root, 'docs/consumer-skill');
|
|
33
48
|
const selectedSkill = process.env.THEMELIA_SKILL_DIR ?? installedSkill;
|
|
34
|
-
for (const file of ['public-api.json', 'tokens.json']) {
|
|
49
|
+
for (const file of ['public-api.json', 'tokens.json', 'component-contracts.json']) {
|
|
35
50
|
const installed = readJson(path.join(installedSkill, 'references', file));
|
|
36
51
|
assert.equal(installed.package, manifest.name, 'Installed guidance package mismatch');
|
|
37
52
|
assert.equal(installed.version, manifest.version, 'Installed guidance version mismatch');
|
|
38
|
-
const selected = readJson(path.join(selectedSkill, 'references', file));
|
|
39
|
-
assert.deepEqual(selected, installed, 'Copied skill is stale; refresh the complete folder');
|
|
40
53
|
}
|
|
41
54
|
if (fs.realpathSync(selectedSkill) !== fs.realpathSync(installedSkill)) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const installed = path.join(directory, entry.name);
|
|
46
|
-
const selected = path.join(selectedSkill, path.relative(installedSkill, installed));
|
|
47
|
-
const info = fs.lstatSync(installed);
|
|
48
|
-
assert(!info.isSymbolicLink(), 'Installed guidance must contain real assets');
|
|
49
|
-
assert(fs.existsSync(selected) && !fs.lstatSync(selected).isSymbolicLink(), 'Copied skill is stale; missing or linked asset');
|
|
50
|
-
if (info.isDirectory()) compareAssets(installed);
|
|
51
|
-
else assert(fs.readFileSync(installed).equals(fs.readFileSync(selected)), 'Copied skill is stale; refresh the complete folder');
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
compareAssets(installedSkill);
|
|
55
|
+
const { pathToFileURL } = await import('node:url');
|
|
56
|
+
const { checkCopiedConsumerBundle } = await import(pathToFileURL(path.join(installedSkill, 'scripts/setup-skills.mjs')).href);
|
|
57
|
+
checkCopiedConsumerBundle({ packageRoot: root, destination: path.dirname(selectedSkill) });
|
|
55
58
|
}
|
|
56
59
|
// The app's project instructions block records the version it was pasted from.
|
|
57
60
|
const instructions = ['AGENTS.md', 'CLAUDE.md'].find(file => fs.existsSync(file));
|
|
@@ -61,7 +64,7 @@ console.log(JSON.stringify({ package: manifest.name, version: manifest.version,
|
|
|
61
64
|
JS
|
|
62
65
|
```
|
|
63
66
|
|
|
64
|
-
Use the reported root for the bundled finder, stylesheet paths and published
|
|
67
|
+
Use the reported root for the bundled finder/inspectors, stylesheet paths and published
|
|
65
68
|
declarations. Install required peers from that manifest and optional peers for
|
|
66
69
|
the exact imported families from `references/public-api.json`. A copied skill's
|
|
67
70
|
finder reports its own metadata version; it does not inspect the app installation.
|
|
@@ -71,7 +74,7 @@ running the recipe. The comparison checks metadata contents as well as version,
|
|
|
71
74
|
so stale copies with the same development version are caught. Every installed
|
|
72
75
|
guidance/script/example asset is also compared byte-for-byte; extra app-owned
|
|
73
76
|
files or publisher markers in the copy are not checked. Keep local product policy
|
|
74
|
-
outside the package guidance. Recopy the complete
|
|
77
|
+
outside the package guidance. Recopy the complete bundle after upgrades, and
|
|
75
78
|
read declarations from the installed package.
|
|
76
79
|
|
|
77
80
|
`agentsBlock` reports whether the app's `AGENTS.md` (or `CLAUDE.md`) carries the
|
|
@@ -102,20 +105,32 @@ need the codemod; `button: { defaultTone: 'primary', defaultButtonStyle: 'solid'
|
|
|
102
105
|
restores the previous default app-wide. Afterwards, demote extra primaries so
|
|
103
106
|
each page or surface keeps one.
|
|
104
107
|
|
|
105
|
-
##
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
108
|
+
## Copy the complete skill bundle
|
|
109
|
+
|
|
110
|
+
The package ships four focused capabilities, one compatibility/shared root and one agent definition. One copy of API/token/contract metadata, scripts and examples is shared by all three. Do not copy only an individual SKILL.md or duplicate the generated indexes into each skill.
|
|
111
|
+
|
|
112
|
+
When the user requests installation, run the bundled copy helper with their configured agent skills directory. For Codex the usual destination is `~/.codex/skills`; honor a configured alternative:
|
|
113
|
+
|
|
114
|
+
```sh
|
|
115
|
+
node node_modules/themelia-react-ui/docs/consumer-skill/scripts/setup-skills.mjs --copy --destination "$HOME/.codex/skills"
|
|
116
|
+
node node_modules/themelia-react-ui/docs/consumer-skill/scripts/setup-skills.mjs --check --destination "$HOME/.codex/skills"
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
It copies `themelia-components`, `themelia-tokenization`, `themelia-composition`, `themelia-design`, and `themelia-react-ui-consumer` as real sibling directories. Rich templates are copied once under the shared directory. Markdown links are rebased for this installed layout; no symlinks or repository paths are required. Existing canonical/shared destinations are rejected before writing: preserve or move the previous complete bundle before an upgrade, then copy the release together. `--check` compares every expected asset after rebasing, so stale content with an unchanged development version is caught.
|
|
120
|
+
|
|
121
|
+
### Copy the designer agent
|
|
122
|
+
|
|
123
|
+
`docs/consumer-skill/agents/themelia-ui-designer.md` is a Claude Code agent definition: a product designer that reads the records, writes a view spec, builds with public owners, renders 390 and 1440 wide in light and dark, scores the critique rubric and fixes. Its body reads skills and scripts through `node_modules/themelia-react-ui/...`, so it works wherever the skills were copied; other agents can follow it as a prompt. When the user requests it, copy it into the project's agents directory with the skills or on its own:
|
|
124
|
+
|
|
125
|
+
```sh
|
|
126
|
+
node node_modules/themelia-react-ui/docs/consumer-skill/scripts/setup-skills.mjs --copy --agents .claude/agents
|
|
127
|
+
node node_modules/themelia-react-ui/docs/consumer-skill/scripts/setup-skills.mjs --check --agents .claude/agents
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
An existing `themelia-ui-designer.md` is never overwritten; move it before copying a newer release. Other agent files are left untouched.
|
|
131
|
+
|
|
132
|
+
The package retains `docs/consumer-skills/themelia-foundation/SKILL.md` and `themelia-forms/SKILL.md` as compatibility routers. They are not added by fresh copying. Existing legacy or unrelated skills are left untouched; review older agent routing separately when upgrading. Keep app policy outside the copied package bundle.
|
|
133
|
+
|
|
134
|
+
For the identity recipe above, set `THEMELIA_SKILL_DIR` to the copied shared `themelia-react-ui-consumer` directory. In project instructions, use the generated [AGENTS.md block](agents-md.md) pointing at package skills, or point the four skill paths to their copied siblings. Invoke `$themelia-components` for setup, discovery and typed APIs/forms; `$themelia-tokenization` for themes and shared visual roles; `$themelia-composition` for screen hierarchy, workflows and visual repair; and `$themelia-design` for data briefs, view specs and rubric-scored critique of rendered views. The compatibility `$themelia-react-ui-consumer` entrypoint remains available.
|
|
135
|
+
|
|
136
|
+
Copying into an agent's global skill directory requires a user request. The npm package does not perform installation automatically. Run the consuming app's own type/lint/test/build scripts after integration; repository maintainer commands are not installed consumer commands.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Integration
|
|
2
2
|
|
|
3
|
-
Install required peers from the installed package.json; public-api.json records required/optional peers. Install optional peers for the imported families, including base families such as charts and QR code. Whole-family declaration requirements can exceed a tree-shaken runtime graph; follow the exact family's index and declarations. Import style.css once before overrides; it omits preflight
|
|
3
|
+
Install required peers from the installed package.json; public-api.json records required/optional peers. Install optional peers for the imported families, including base families such as charts and QR code. Whole-family declaration requirements can exceed a tree-shaken runtime graph; follow the exact family's index and declarations. Import style.css once before overrides; it omits global preflight and components remain usable without a host reset. Use the [installation CSS paths](installation.md#choose-the-css-path) when generating app utilities. Basic controls must not pull in unrelated map/editor/chart dependencies.
|
|
4
4
|
|
|
5
5
|
Put global resets in the lower-priority `base` layer, or use your framework's layered preflight. The package uses the `theme, base, components, utilities` layer order. Unlayered rules outrank layered component styles regardless of import order; a global `button { font: inherit }` can replace the library's control size and weight. For an app-owned reset:
|
|
6
6
|
|
|
@@ -18,7 +18,7 @@ Load intentional, scoped app overrides after the package stylesheet. Keep broad
|
|
|
18
18
|
|
|
19
19
|
UIProvider supplies stable mount-time defaults: explicit prop, provider default, fallback. Per-mount requests/data/callbacks stay on components. ThemeScope from themelia-react-ui/ui-provider places descendant portals inside its CSS boundary. A styled div does not relocate body portals; explicit Base UI portal containers take precedence.
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
Cards omit the header rule and keep the footer rule by default. To separate them by spacing
|
|
22
22
|
alone, configure the single application provider with
|
|
23
23
|
`card: { defaultHeaderDivider: false, defaultFooterDivider: false }`.
|
|
24
24
|
Explicit Card booleans override these defaults. Ordinary card
|
|
@@ -33,6 +33,41 @@ the installed contract. Fix that app policy through its own review rather than
|
|
|
33
33
|
compensating with card or field padding. Bounded AppSidebar instances use h-full
|
|
34
34
|
inside the shell's constrained column; standalone sidebars may use viewport height.
|
|
35
35
|
|
|
36
|
+
Use one LayoutSidebarProvider for AppLayout's primary and secondarySidebar
|
|
37
|
+
slots. Named scopes infer each AppSidebar/LayoutSidebar panel ID. Keep
|
|
38
|
+
desktop openPanels separate from mobilePanel, the single active undocked drawer;
|
|
39
|
+
update controlled props from their matching callbacks. Controlled openPanels
|
|
40
|
+
takes precedence over legacy primary open. Target essential supporting panels
|
|
41
|
+
with SidebarTrigger panelId, and use navigationPanel for the ordinary navigation
|
|
42
|
+
trigger/shortcut. The WorkspaceRegionsLayout recipe accepts primaryNavigation
|
|
43
|
+
and sidebarPresentation="rail" for a SidebarNavigationRail beside contextual
|
|
44
|
+
navigation, with grouped primary navigation as an alternative. It demonstrates
|
|
45
|
+
named state without a router dependency or another UIProvider. Inset framing
|
|
46
|
+
does not supply Page padding, and shell header slots take Header partials.
|
|
47
|
+
An embedded provider with adaptTo="container" contains its drawer and backdrop.
|
|
48
|
+
Use one explicit trigger for the inline full navigation beside the static left
|
|
49
|
+
area rail. Choose the contextual AppSidebar/LayoutSidebar `collapsible`
|
|
50
|
+
independently of the shell preset or sidebar skin: `icon` retains a second
|
|
51
|
+
compact column, `offcanvas` hides that panel and leaves only the primary rail,
|
|
52
|
+
and `none` keeps it expanded. Keep the static primary rail on its own `none`
|
|
53
|
+
policy. Current examples default to `icon` with a preview selector, and
|
|
54
|
+
standalone sidebars support the same choices. The copied
|
|
55
|
+
WorkspaceRegionsLayout recipe exposes `contextualCollapsible` with an `icon`
|
|
56
|
+
default; a secondarySidebar replacement owns its own mode. The app's
|
|
57
|
+
area-selection callback opens the corresponding contextual panel.
|
|
58
|
+
At narrow widths the inline cluster pans a minimum
|
|
59
|
+
page canvas, with its area rail pinned, and preserves expansion state. Shared
|
|
60
|
+
header, navigation and Page owners supply spacing. Dedicated area rails use the
|
|
61
|
+
background surface and an adjacent divider; their width is independent of
|
|
62
|
+
full-sidebar icon collapse.
|
|
63
|
+
|
|
64
|
+
SidebarNavigationRail shares AppSidebar's header, beforeNavigation,
|
|
65
|
+
afterNavigation and footer render slots. Header/footer stay pinned and
|
|
66
|
+
before/after content scrolls. Searchable AppSidebar retains its search band in
|
|
67
|
+
icon mode; its search button expands and focuses the field. Current
|
|
68
|
+
matching chooses the most-specific href and exposes ancestor state separately
|
|
69
|
+
to custom item renderers.
|
|
70
|
+
|
|
36
71
|
For RTL, pair the native DOM direction with `DirectionProvider` from the same
|
|
37
72
|
entrypoint. Native `dir` owns text flow and logical CSS geometry; the provider
|
|
38
73
|
owns Base UI keyboard navigation and popup positioning. It does not set `dir`.
|
|
@@ -113,3 +148,7 @@ both container content edges without global preflight; Container and DataTable
|
|
|
113
148
|
own border-box sizing. Stabilize lifecycle inputs as explained in
|
|
114
149
|
[workflows](workflows.md#scoped-directory). These are example/runtime proofs,
|
|
115
150
|
not evidence of an independent agent choosing the same composition.
|
|
151
|
+
|
|
152
|
+
## Form transport and router adapters
|
|
153
|
+
|
|
154
|
+
Use [RHF workflows](rhf-workflows.md#transport-lifecycle) for frontend state with Inertia callback visits or TanStack async mutations. Await the complete transport before resetting dirty state or closing an overlay. The framework stays in the app. `renderLink` on AppSidebar/Page headers adapts the app router: forward href, children, className, accessible/native attributes and onClick; preserve modifier/new-tab behavior and invoke the supplied click handler so mobile navigation can close. Use the [typed shell recipe](../examples/app-layout.tsx) for the exact public renderLink type rather than inventing a router prop. React Router Link, Inertia Link and TanStack Link each need an app adapter matching their own installed version.
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Product composition capability map
|
|
2
|
+
|
|
3
|
+
Compare the product's actual tasks with these public contracts before writing
|
|
4
|
+
JSX. A product view may combine existing owners and custom domain content; a new
|
|
5
|
+
wrapper name or a similar screenshot does not establish a missing capability.
|
|
6
|
+
Inspect exact types through `inspect-component.mjs`, including the prop/slot you
|
|
7
|
+
intend to use. The app owns authoritative data, permissions and persistence.
|
|
8
|
+
|
|
9
|
+
## Product view responsibilities
|
|
10
|
+
|
|
11
|
+
| Task and input contract | Existing owner and supported seam | App responsibility / reason to extend |
|
|
12
|
+
| --- | --- | --- |
|
|
13
|
+
| Product identity, facts and optional supporting regions | `ProductOverview` from `themelia-react-ui/features/products`: `details`, `options`, `variants`, `readiness` and named `slots` | Choose only relevant regions. Page still owns route identity/commands/gutters. Add a domain subject through a region slot when its relationships need a different structure. |
|
|
14
|
+
| Product imagery within identity | `ProductOverview.details.media`; a standalone region can use `slots.mainTop` | There is no top-level `ProductOverview.media` prop. `details.media` also supports a media-only subject; no dummy facts are required. |
|
|
15
|
+
| Color/size definitions and their values, independently from a table | `ProductOptionsMatrix`: `optionGroups`, editing/collapse state, awaited `onSaveEditingOption`, `onError`, cancellation, `renderValue`, `renderOptionActions` | Preserve IDs, reconcile accepted changes with sellable variants and historical orders, and apply validation/transport. Do not replace this editor with custom buttons just to rename/remove values. |
|
|
16
|
+
| Definitions and variant rows in one coordinated subject | `ProductVariantsManager`: `optionGroups`, `variants`, editing/grouping/selection state, row/bulk callbacks and render seams; `showGroupBy={false}` drops the Group by control for a short list. Each option's summary row is its edit button; `renderOptionActions` adds explicit commands | Its convenience arrangement is a choice. Supply accepted rows and real commands; it does not invent combinations or warehouse policy. Use separate matrix/table owners when placement needs to differ. |
|
|
17
|
+
| Compare sellable SKUs, prices, availability and status | `ProductVariantsBulkTable`: `visibleColumns`, `groupByOptionId`, `cellDisplay`, `renderCell`, row and bulk callbacks. `ProductVariantsTable` supplies a simpler variant list. | Pass meaningful values and stable IDs. For one stock figure the inventory cell may suffice; keep per-location reservations or shortages as a richer related subject. |
|
|
18
|
+
| Inspect the selected SKU and its chosen options | `ProductVariantDetails`: `variant`, `metadata`, `media`, `renderMetadata`, `renderOption`, `footerSlot` and action callbacks | Keep its identity/actions while adding warehouse, costing or allocation evidence through an appropriate slot or sibling region. A custom fact does not require rebuilding the whole variant subject. |
|
|
19
|
+
| Edit ordinary variant fields and selected option choices | `ProductVariantEditor`: controlled/default values, `optionFields`, `statusOptions`, `visibleFields`, per-field `errors`, app-owned `children` fields, awaited `onSubmit`, `submitting`, `onError`, cancel and footer. Inside `ActionDrawer`, share one `formId` and set `showHeader={false}` so the drawer owns the title and commands | App validates and returns accepted state. Its inventory field is one string; hide it with `visibleFields={{ inventory: false }}` and add per-warehouse balances or unit cost as `children`, which render inside the form before its commands. |
|
|
20
|
+
| Upload new local product images | `MediaGallery` from `themelia-react-ui/base/media-gallery`: controlled `File[]`, `onValueChange`, MIME/extension acceptance, file limit, previews, removal and keyboard/drag sorting | Transfer and persistence remain app-owned. The first file is the cover. This is not a persisted URL-record gallery. |
|
|
21
|
+
| Existing images attached to a product | `MediaResourceGallery` from `themelia-react-ui/features/media-library`: `items`, typed `accessors`, `primaryId`, primary/remove/reorder callbacks, `onAdd`, `readOnly` and `renderItem` | Adapt existing IDs/URLs; accept attachment changes through app state/transport. Do not fetch remote URLs merely to manufacture `File` objects. |
|
|
22
|
+
| Search/select reusable assets or upload into an asset catalogue | `MediaLibrary` or `MediaLibraryDialog`: item accessors, controlled selection, fetch/upload handlers and picker callbacks | The app owns catalogue requests and attachment persistence. A simple local file field does not require this complete workflow. |
|
|
23
|
+
|
|
24
|
+
For a simple single-SKU product, omit option-definition/combination work that the
|
|
25
|
+
model does not have. For an optioned product, definitions, sellable combinations
|
|
26
|
+
and a selected variant are different jobs; they need not be three custom cards.
|
|
27
|
+
The [products template](../../../templates/products-template.tsx) demonstrates
|
|
28
|
+
the larger public workflow. Its data and callbacks are examples, not your
|
|
29
|
+
product's business rules. Deprecated standalone product region-card exports are
|
|
30
|
+
compatibility APIs; use ProductOverview regions or the dedicated active owners.
|
|
31
|
+
|
|
32
|
+
## Media identity and lifecycle
|
|
33
|
+
|
|
34
|
+
Ask whether the input is a new browser `File[]` or already stored asset records.
|
|
35
|
+
Both can belong to a product gallery. The finder query `product media gallery`
|
|
36
|
+
therefore exposes both owners; `local product images` and `existing product
|
|
37
|
+
images` narrow the decision. Inspect their value and callback types before
|
|
38
|
+
choosing one.
|
|
39
|
+
|
|
40
|
+
MediaResourceGallery's accessors can read the app's own keys, filenames, image
|
|
41
|
+
URLs and alt text. It owns its frame, title and insets; use it as the region
|
|
42
|
+
surface instead of nesting it inside another Card. Choose `layout="grid"` or `"list"` to expose primary and
|
|
43
|
+
move commands; the compact `"field"` layout focuses on attachment/removal.
|
|
44
|
+
`onReorder` proposes IDs and records in the next order; these move controls differ
|
|
45
|
+
from MediaGallery's drag/keyboard file sorting. `onAdd`
|
|
46
|
+
usually opens the app's existing MediaLibraryDialog flow. Read-only presentation
|
|
47
|
+
needs no attachment commands.
|
|
48
|
+
|
|
49
|
+
`renderItem` replaces a complete gallery item, including its default controls.
|
|
50
|
+
Use it for an actual media-representation requirement, such as a supplied sprite
|
|
51
|
+
crop, while retaining the gallery's collection ownership. Reuse public buttons
|
|
52
|
+
and the render context's permitted primary/remove/move actions if the custom
|
|
53
|
+
item remains editable. A regular image URL needs no custom tile implementation.
|
|
54
|
+
|
|
55
|
+
## Existing owners and domain-specific structure
|
|
56
|
+
|
|
57
|
+
The comparison above is not a rule to force every product into ProductOverview
|
|
58
|
+
or to forbid custom components. Record the required task, candidate, inspected
|
|
59
|
+
prop/callback/render seam and remaining mismatch. For example, a warehouse
|
|
60
|
+
comparison may extend ProductVariantDetails.renderMetadata or sit beside it;
|
|
61
|
+
option name/value editing already has ProductOptionsMatrix. Keep controls,
|
|
62
|
+
focus, action states and ordinary text roles with their public owners.
|
|
63
|
+
|
|
64
|
+
Return the actual save Promise from ProductOptionsMatrix/Manager's
|
|
65
|
+
`onSaveEditingOption`. The owner keeps the editor pending, retains a rejected
|
|
66
|
+
draft with retry feedback, and requests closure through
|
|
67
|
+
`onEditingOptionIdChange` after acceptance or cancellation. `onError` can report
|
|
68
|
+
the failure to the app. Do not close/reset before the Promise settles or swallow
|
|
69
|
+
the rejection in a fire-and-forget wrapper.
|
|
70
|
+
|
|
71
|
+
Stock reservation arithmetic, option-to-variant reconciliation, unique SKU
|
|
72
|
+
validation, accepted prices and publication policy belong to the app. Changing
|
|
73
|
+
today's catalogue never rewrites a purchased order's selected options or prices.
|
|
74
|
+
A thumbnail, a file picker, an attached-asset gallery and a selected variant's
|
|
75
|
+
media slot have different contracts even if they show the same photograph.
|
|
76
|
+
|
|
77
|
+
## Executable product parts
|
|
78
|
+
|
|
79
|
+
The [product parts recipes](../examples/product-parts.tsx) show real option IDs,
|
|
80
|
+
save/cancel editing, a variant comparison with SKU/price/availability values,
|
|
81
|
+
the coordinated manager and a details/editor flow that retains a failed draft
|
|
82
|
+
until the caller returns accepted values. The option-only example edits local
|
|
83
|
+
definitions; it deliberately does not claim to reconcile a complete catalogue.
|
|
84
|
+
|
|
85
|
+
The [product media recipes](../examples/product-media.tsx) contrast caller-owned
|
|
86
|
+
File[] with typed persisted-asset accessors and attachment callbacks.
|
|
87
|
+
`MediaOnlyProductOverview` uses the actual details.media slot without dummy
|
|
88
|
+
metadata. No recipe changes a URL record into a File or imports private source.
|
|
89
|
+
|
|
90
|
+
Verify the chosen configuration: edit then cancel/save an option, preserve its
|
|
91
|
+
ID, select a different variant, inspect its media/stock, reject and retry a
|
|
92
|
+
variant save, change a cover/remove/reorder assets when supported, and inspect
|
|
93
|
+
narrow/wide light/dark output. Source typechecks, a retrieved symbol and the
|
|
94
|
+
presence of a callback do not prove those interactions or useful composition.
|