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,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: themelia-design
|
|
3
|
+
description: Use when designing or redesigning a Themelia view from real records, or when a screen works but reads poorly; reads the data for what matters, ranks information, chooses encodings and emphasis, and critiques rendered screens with a scored rubric. Not for component APIs or theme tokens.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Themelia design
|
|
7
|
+
|
|
8
|
+
Correct owners and passing checks make a view valid, not clear. This skill adds
|
|
9
|
+
the designer's part: what the view shows, what the eye reaches first, and
|
|
10
|
+
whether the rendered result lets the user decide quickly. Use
|
|
11
|
+
**themelia-composition** for owner selection, surfaces and inset ownership,
|
|
12
|
+
**themelia-components** for installed APIs and **themelia-tokenization** for
|
|
13
|
+
themes and density.
|
|
14
|
+
|
|
15
|
+
## Work in this order
|
|
16
|
+
|
|
17
|
+
1. **Read the data.** Read a typical, a large, an exceptional and an empty
|
|
18
|
+
record, then write the data brief: the decision, three facts that matter, the
|
|
19
|
+
anomaly, and states to show or omit. See
|
|
20
|
+
[data reading](../../consumer-skill/references/data-reading.md).
|
|
21
|
+
2. **Write the view spec.** Rank information as must, should, could and omit;
|
|
22
|
+
name the focal point; sketch 390 and 1440 wireframes in text; choose an
|
|
23
|
+
encoding per fact. See [view spec](../../consumer-skill/references/view-spec.md)
|
|
24
|
+
and [screen decisions](../../consumer-skill/references/screen-decisions.md).
|
|
25
|
+
3. **Find owners.** Map regions to owners with the finder, mapper and inspector
|
|
26
|
+
described in [discovery](../../consumer-skill/references/discovery.md);
|
|
27
|
+
[archetypes](../../consumer-skill/references/screen-archetypes.md) and
|
|
28
|
+
[metrics](../../consumer-skill/references/analytics.md) give starting points.
|
|
29
|
+
4. **Build one representative subject**, then the rest of the view.
|
|
30
|
+
5. **Render and critique.** Screenshot 390×844 and 1440×900 in light and dark
|
|
31
|
+
with the opened, error and accepted states the task touches. Run the census
|
|
32
|
+
and score the [critique rubric](../../consumer-skill/references/critique-rubric.md).
|
|
33
|
+
6. **Fix and repeat** at most three rounds, then report scores, decisions and
|
|
34
|
+
what stayed unverified.
|
|
35
|
+
|
|
36
|
+
## Taste, briefly
|
|
37
|
+
|
|
38
|
+
[View craft](../../consumer-skill/references/view-craft.md) holds the detail:
|
|
39
|
+
|
|
40
|
+
- One focal point per view and per region.
|
|
41
|
+
- One solid primary command per surface; at most three text levels per region;
|
|
42
|
+
tones only for status that changes the action.
|
|
43
|
+
- Encode by the fact's shape: a figure with its baseline, a trend where shape
|
|
44
|
+
matters, a table for comparable rows, a list for rows that differ.
|
|
45
|
+
- Label only ambiguous values; omit zero and not-applicable counters.
|
|
46
|
+
- Gaps grow outward; few edges; one frame per independent subject.
|
|
47
|
+
- Most improvements remove something. Never add decoration, colours, tokens or
|
|
48
|
+
anatomy overrides to make a view look designed.
|
|
49
|
+
|
|
50
|
+
## Delegate to the designer agent
|
|
51
|
+
|
|
52
|
+
For a whole view or a redesign, run the
|
|
53
|
+
[themelia-ui-designer agent](../../consumer-skill/agents/themelia-ui-designer.md):
|
|
54
|
+
`design` mode builds and self-critiques; `review` mode, in a fresh agent, gives
|
|
55
|
+
an independent read-only score.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: themelia-forms
|
|
3
|
+
description: Compatibility route for older Themelia form-skill instructions; use themelia-components for exact bindings and themelia-composition for complete edit/create workflows.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Themelia forms compatibility route
|
|
7
|
+
|
|
8
|
+
Use [themelia-components](../themelia-components/SKILL.md) to inspect actual value/event, callback, ref and controlled-state contracts. Use [themelia-composition](../themelia-composition/SKILL.md) for complete edit pages and overlay workflows.
|
|
9
|
+
|
|
10
|
+
The full [RHF workflows](../../consumer-skill/references/rhf-workflows.md), [typed bindings](../../consumer-skill/examples/rhf-bindings.tsx), [edit page](../../consumer-skill/examples/rhf-edit-page.tsx) and [overlay form](../../consumer-skill/examples/rhf-overlay-form.tsx) remain shared resources. Validation, dirty state, arrays, async transport, failure drafts, accepted-value reset and focus restoration retain their contracts.
|
|
11
|
+
|
|
12
|
+
This package path is retained for existing instructions. Install the complete current bundle through [installation](../../consumer-skill/references/installation.md); separately installed skills are not replaced automatically.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: themelia-foundation
|
|
3
|
+
description: Compatibility route for older Themelia instructions naming themelia-foundation; use the current components, tokenization, composition and design capabilities for new work.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Themelia foundation compatibility route
|
|
7
|
+
|
|
8
|
+
The canonical capability split is now:
|
|
9
|
+
|
|
10
|
+
- [themelia-components](../themelia-components/SKILL.md): installed setup, owner discovery, exact API inspection and framework integration.
|
|
11
|
+
- [themelia-tokenization](../themelia-tokenization/SKILL.md): CSS/theme setup, semantic roots, typography and scoped themes.
|
|
12
|
+
- [themelia-composition](../themelia-composition/SKILL.md): shell/route ownership, screen hierarchy and delivery.
|
|
13
|
+
- [themelia-design](../themelia-design/SKILL.md): data briefs, view specs and rubric-scored critique of rendered views.
|
|
14
|
+
|
|
15
|
+
Follow the matching capability. [Installation](../../consumer-skill/references/installation.md) explains the complete current bundle. This package path is retained for existing instructions; separately installed skills are not replaced automatically.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: themelia-tokenization
|
|
3
|
+
description: Build consistent domain structures with Themelia base/layout components, semantic JSX and token-backed Tailwind; also theme shared spacing, density, typography, colors and portals. Not library maintenance.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Themelia tokenization
|
|
7
|
+
|
|
8
|
+
Use mostly public base components and layout blocks. When a domain needs a particular structure, compose their content with semantic JSX and token-backed Tailwind on app-owned elements. **themelia-components** verifies APIs; **themelia-composition** decides hierarchy; **themelia-design** judges the rendered view. Read [domain structures](../../consumer-skill/references/domain-structures.md) and its executable allocation example; the [design contract](../../consumer-skill/references/design-contract.md) owns shared roles.
|
|
9
|
+
|
|
10
|
+
## Inspect before applying
|
|
11
|
+
|
|
12
|
+
Resolve installed identity and active CSS through [installation](../../consumer-skill/references/installation.md). Shipped component CSS and app-authored Tailwind compilation are separate setup paths. Override after package styles or inside ThemeScope.
|
|
13
|
+
|
|
14
|
+
```sh
|
|
15
|
+
node node_modules/themelia-react-ui/docs/consumer-skill/scripts/inspect-tokens.mjs gap-space-xl
|
|
16
|
+
node node_modules/themelia-react-ui/docs/consumer-skill/scripts/inspect-tokens.mjs --space-scale
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Read overrideRoot and exact spelling. Roots are settings; derived --spacing-*, --radius-* and --container-* aliases are not. Do not read those aliases in scoped calc expressions. The lookup does not index semantic colors; follow its stylesheet/theme reads.
|
|
20
|
+
|
|
21
|
+
## Compose without drift
|
|
22
|
+
|
|
23
|
+
Public props/parts own controls, rows, text and surfaces. Stack/Grid/AdaptiveGrid own routine sibling layout. Tailwind owns specialized tracks, parent queries, alignment, overflow and drawing on app markup. A valid token on the wrong owner still drifts: do not repad a public panel/menu or redraw its states. Use fitting domain owners; custom JSX shapes additional relationships.
|
|
24
|
+
|
|
25
|
+
| Relationship | Public gap / shipped default |
|
|
26
|
+
| --- | --- |
|
|
27
|
+
| Title + description | dense / normal: 2 / 4px |
|
|
28
|
+
| Compact affordances | xs: 4px |
|
|
29
|
+
| Commands | md: 8px |
|
|
30
|
+
| Related fields/content | xl: 16px |
|
|
31
|
+
| Independent subjects/columns | 2xl: 24px |
|
|
32
|
+
| Major page regions | 3xl: 32px |
|
|
33
|
+
|
|
34
|
+
Page owns gutters, Card owns insets, structures own peer gaps. Card flat removes paint, not its md inset (24px). Use padding none when an ancestor owns that room; align flat/painted peer content edges. A block inside adds no second Card/inset. Read [semantic roles](../../consumer-skill/references/design-contract.md#semantic-roles), not a screenshot's measurements.
|
|
35
|
+
|
|
36
|
+
Use Heading/Text props for copy roles and primitives for Money/Date/Number/contact/missing values. Semantic tag is separate from visual size. Rich trigger/slot labels can override inherited typography: preserve the owner's label scale, reserving larger headings for the actual subject. Density does not shrink primary content into metadata.
|
|
37
|
+
|
|
38
|
+
Pair shadcn surfaces/foregrounds. Badges are neutral for categories/counts; status tones communicate status. Numbers use UI sans/tabular figures; MonoValue is for codes. Existing action/control, row, surface, icon/avatar and shell roots cover geometry. --space-scale changes gaps/insets; --density-scale changes controls/rows. First repair duplicated padding and priorities before proposing mobile root changes. Use [theme boundaries](../../consumer-skill/references/theming.md); avoid private recipes, local focus scales, raw palettes and per-component tokens.
|
|
39
|
+
|
|
40
|
+
## Verify the effect
|
|
41
|
+
|
|
42
|
+
Vary spacing/density independently. Inspect both themes, narrow/wide parents, text hierarchy, adjoining heights, corners and clipping. Open a real menu/picker/overlay in the scoped theme and verify portal inheritance. Run app checks and [review](../../consumer-skill/references/review.md), execute keyboard/focus and relevant invalid/disabled states, and report source, inspected appearance and behavior separately. No Themelia theme-publishing CLI exists.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "themelia-react-ui",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.5",
|
|
4
4
|
"description": "A composable React UI library for modern admin applications, built on Base UI and Tailwind with shadcn-compatible themes, shared design tokens, reusable layouts, blocks and workflows.",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public",
|
|
@@ -30,6 +30,8 @@
|
|
|
30
30
|
"README.md",
|
|
31
31
|
"CHANGELOG.md",
|
|
32
32
|
"docs/consumer-skill",
|
|
33
|
+
"docs/consumer-skills",
|
|
34
|
+
"templates",
|
|
33
35
|
"THIRD_PARTY_NOTICES.md"
|
|
34
36
|
],
|
|
35
37
|
"sideEffects": [
|
|
@@ -477,7 +479,7 @@
|
|
|
477
479
|
"check:maps": "node scripts/test-client-boundaries.mjs --built",
|
|
478
480
|
"build:docs": "node scripts/build-static-docs.mjs",
|
|
479
481
|
"check:static-docs": "node scripts/check-static-docs.mjs",
|
|
480
|
-
"check:agent": "node --test scripts/test-consumer-discovery.mjs scripts/test-consumer-composition.mjs scripts/test-consumer-evals.mjs scripts/test-button-codemod.mjs scripts/test-consumer-skill-assets.mjs scripts/test-static-docs.mjs scripts/test-fixture-install.mjs && npm run check:skill",
|
|
482
|
+
"check:agent": "node --test scripts/test-consumer-discovery.mjs scripts/test-consumer-inspection.mjs scripts/test-consumer-mapper.mjs scripts/test-composition-metadata.mjs scripts/test-consumer-composition.mjs scripts/test-consumer-evals.mjs scripts/test-button-codemod.mjs scripts/test-consumer-skill-assets.mjs scripts/test-static-docs.mjs scripts/test-fixture-install.mjs && npm run check:skill",
|
|
481
483
|
"check:release": "npm run check:all && npm run check:agent && npm run build:docs && npm run check:static-docs"
|
|
482
484
|
},
|
|
483
485
|
"peerDependencies": {
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Admin composition examples
|
|
2
|
+
|
|
3
|
+
These shipped, copyable application blueprints demonstrate `themelia-react-ui` through its public imports. Open `/?page=templates` after `npm run dev` for the shared shell, or use the individual catalogue pages under Templates. They ship in `node_modules/themelia-react-ui/templates/` as source assets, not additional npm entrypoints. Copy and adapt them into the application.
|
|
4
|
+
|
|
5
|
+
The examples use local, in-memory records. A reload resets them. Connect your app's data loading, persistence, authorization, notification delivery and navigation at the shown callbacks; no backend or authentication service is included. Publishing settings and permissions here describe sample state, not server enforcement.
|
|
6
|
+
|
|
7
|
+
For production create/edit workflows, adapt the [RHF edit page](../docs/consumer-skill/examples/rhf-edit-page.tsx) and [RHF overlay form](../docs/consumer-skill/examples/rhf-overlay-form.tsx) to these domain screens. Replace their local draft state with RHF values, validation, arrays and dirty tracking, and await the app's complete transport before accepting a saved baseline. The [forms workflow guide](../docs/consumer-skill/references/rhf-workflows.md) supplies typed control bindings and Inertia/TanStack integration seams.
|
|
8
|
+
|
|
9
|
+
| File | Export | Composition demonstrated |
|
|
10
|
+
| --- | --- | --- |
|
|
11
|
+
| [admin-shell-template.tsx](admin-shell-template.tsx) | `AdminStarterShell`, `AdminTemplatesShowcase` | UIProvider defaults, all five AppLayout presets, AppSidebar, workspace context, breadcrumbs, notifications and account/settings menus |
|
|
12
|
+
| [orders-template.tsx](orders-template.tsx) | `OrdersAdminTemplate` | Page with a fulfillment primary command, TwoColumnLayout, Card, lifecycle-grouped Item rows, MetadataList, Money, AddressCard, PaymentMethod, ActivityLog and refund/tracking/note dialogs |
|
|
13
|
+
| [products-template.tsx](products-template.tsx) | `ProductsAdminTemplate` | ProductVariantsManager, ProductVariantDetails/Editor, SeoListingCard, publishing/organization forms and variant duplication |
|
|
14
|
+
| [customers-template.tsx](customers-template.tsx) | `CustomersAdminTemplate` | MetricBar, DataTable order history, MetadataList, AddressCard, ActivityLog, contact drafts and validated store-credit submission |
|
|
15
|
+
| [user-permissions-template.tsx](user-permissions-template.tsx) | `UserPermissionsTemplate` | FormField, DirtyStateBanner, role-based Page save and confirmed suspend commands, role presets and editable permission groups with a saved/discard baseline |
|
|
16
|
+
| [analytics-operations-template.tsx](analytics-operations-template.tsx) | `AnalyticsOperationsTemplate` | Numeric MetricBar KPIs, MetricComparison, ActivityHeatmap, UsageCard and an app-owned operations list |
|
|
17
|
+
|
|
18
|
+
For layout selection, read the [owner map](../docs/consumer-skill/references/composition.md#structure-and-spacing) and [typed layout-block recipe](../docs/consumer-skill/examples/layout-blocks.tsx). Use horizontal Stack for rows, Grid/GridCell for prescribed columns and spans, AdaptiveGrid for parent-driven equal tiles, and TwoColumnLayout for a main/support split.
|
|
19
|
+
|
|
20
|
+
## Boundaries to preserve when adapting
|
|
21
|
+
|
|
22
|
+
- `AdminTemplatesShowcase` supplies UIProvider defaults; embedded preview pages inherit the catalogue's provider. `AdminStarterShell` inherits the application's provider. `defaultDensity` belongs to the standalone showcase.
|
|
23
|
+
- Page owns gutters and the default resource measure, TwoColumnLayout owns the main/aside split, and Stack/Grid own peer gaps. These record and overview routes keep the default measure; only a wide directory or comparison opts into `maxWidth="full"`. Ordinary Cards retain the default padding. Compact control density does not shrink Cards. Peer Card stacks use `gap="2xl"`, matching Page and TwoColumnLayout’s 24px default rhythm in both axes; copy and form groups keep their own gaps.
|
|
24
|
+
- A headed address, payment, SEO or variants panel uses its own `surface="card"`. It delegates to Card's aligned header/body anatomy and inherits provider separators. Do not wrap it in an untitled padded Card. Omitted surface keeps these blocks unframed for embedding; an embedded header does not inherit an unintended Card separator.
|
|
25
|
+
- Put page commands in Page's header as `primaryAction` (one) and ordered
|
|
26
|
+
`secondaryActions`; the header owns their treatment, overflow and narrow-width
|
|
27
|
+
collapse. A destructive command is a `destructive: true` secondary action that
|
|
28
|
+
opens ConfirmDialog. Put subject commands in Card's header. Status/count badges use `titleSuffix`;
|
|
29
|
+
a status shown in the page header is not repeated in a card or fact list. Spacing separates a card's header, body and footer; a body separator is appropriate only between distinct body sections.
|
|
30
|
+
- Metrics use numeric values and formatting hints. Context such as “12 orders” belongs in a subtitle; it is not a directional trend. The analytics period changes the KPI strip; comparisons, heatmap and quota data are separately described monthly/current snapshots.
|
|
31
|
+
- Overlay edits start from a snapshot and update committed display state only on Save. Native forms use `formId` so required fields and submission ownership are preserved. App persistence should use the overlay's async contract with pending/error/retry handling before committing; do not bind a draft editor directly to committed record data.
|
|
32
|
+
- Local sidebar navigation preserves native link modifiers and closes the mobile drawer. Replace the local route map with your router adapter and record-aware destinations. Sample records across these pages are independent; a customer route is not an order's customer resolver.
|
|
33
|
+
- Choose the component that fits the subject. A lifecycle-specific order item group can use Item; editable permission groups can use ToggleField. Do not replace them with an unrelated block merely to increase the component count.
|
|
34
|
+
|
|
35
|
+
## Checks
|
|
36
|
+
|
|
37
|
+
`npm run typecheck`, `npm run lint` and `npm run check:design-lint` include `templates/`. `npm run check:package` also typechecks these sources against the installed tarball, from the installed tarball, alongside the shipped consumer-skill recipes. `node docs/consumer-skill/scripts/check-composition.mjs templates` is a supplementary static review; unresolved dynamic spreads still need source and interaction review.
|
|
38
|
+
|
|
39
|
+
`tests/browser/templates.spec.ts` covers Card boundaries at desktop/mobile widths in both themes, mobile navigation and contact/credit submission. The dated verification report records the images actually inspected and the checks executed. Static checks and screenshots do not establish backend integration.
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
import { useState, type ReactNode } from 'react';
|
|
2
|
+
import {
|
|
3
|
+
BarChart3,
|
|
4
|
+
Package,
|
|
5
|
+
Settings,
|
|
6
|
+
ShoppingBag,
|
|
7
|
+
Store,
|
|
8
|
+
Users,
|
|
9
|
+
} from 'lucide-react';
|
|
10
|
+
|
|
11
|
+
import { IconBadge } from 'themelia-react-ui/base/display';
|
|
12
|
+
import { Stack } from 'themelia-react-ui/base/structure';
|
|
13
|
+
import { useSidebar } from 'themelia-react-ui/base/sidebar';
|
|
14
|
+
import {
|
|
15
|
+
type BreadcrumbItem,
|
|
16
|
+
type LayoutLinkRenderProps,
|
|
17
|
+
type WorkspaceLink,
|
|
18
|
+
} from 'themelia-react-ui/layout';
|
|
19
|
+
import { AppLayout, type AppLayoutVariant } from 'themelia-react-ui/layout/app-shell';
|
|
20
|
+
import {
|
|
21
|
+
HeaderBreadcrumbs,
|
|
22
|
+
HeaderNotifications,
|
|
23
|
+
HeaderUserMenu,
|
|
24
|
+
type HeaderNotification,
|
|
25
|
+
type HeaderUserMenuProps,
|
|
26
|
+
} from 'themelia-react-ui/layout/header';
|
|
27
|
+
import {
|
|
28
|
+
AppSidebar,
|
|
29
|
+
LayoutSidebarProvider,
|
|
30
|
+
SidebarNavigationUser,
|
|
31
|
+
type AppSidebarProps,
|
|
32
|
+
} from 'themelia-react-ui/layout/sidebar';
|
|
33
|
+
import { Text } from 'themelia-react-ui/typography';
|
|
34
|
+
import {
|
|
35
|
+
UIProvider,
|
|
36
|
+
type ComponentScale,
|
|
37
|
+
type UIConfig,
|
|
38
|
+
} from 'themelia-react-ui/ui-provider';
|
|
39
|
+
|
|
40
|
+
import { AnalyticsOperationsTemplate } from './analytics-operations-template';
|
|
41
|
+
import { CustomersAdminTemplate } from './customers-template';
|
|
42
|
+
import { OrdersAdminTemplate } from './orders-template';
|
|
43
|
+
import { ProductsAdminTemplate } from './products-template';
|
|
44
|
+
import { UserPermissionsTemplate } from './user-permissions-template';
|
|
45
|
+
|
|
46
|
+
export type AdminTemplateId =
|
|
47
|
+
| 'orders'
|
|
48
|
+
| 'products'
|
|
49
|
+
| 'customers'
|
|
50
|
+
| 'user-permissions'
|
|
51
|
+
| 'analytics';
|
|
52
|
+
|
|
53
|
+
interface TemplateRouteMeta {
|
|
54
|
+
id: AdminTemplateId;
|
|
55
|
+
label: string;
|
|
56
|
+
url: string;
|
|
57
|
+
breadcrumbs: BreadcrumbItem[];
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const TEMPLATE_ROUTES: Record<AdminTemplateId, TemplateRouteMeta> = {
|
|
61
|
+
analytics: {
|
|
62
|
+
id: 'analytics',
|
|
63
|
+
label: 'Overview',
|
|
64
|
+
url: '/admin/overview',
|
|
65
|
+
breadcrumbs: [{ label: 'Store overview' }],
|
|
66
|
+
},
|
|
67
|
+
orders: {
|
|
68
|
+
id: 'orders',
|
|
69
|
+
label: 'Orders',
|
|
70
|
+
url: '/admin/orders',
|
|
71
|
+
breadcrumbs: [
|
|
72
|
+
{ label: 'Orders', href: '/admin/orders' },
|
|
73
|
+
{ label: '#1042' },
|
|
74
|
+
],
|
|
75
|
+
},
|
|
76
|
+
products: {
|
|
77
|
+
id: 'products',
|
|
78
|
+
label: 'Products',
|
|
79
|
+
url: '/admin/products',
|
|
80
|
+
breadcrumbs: [
|
|
81
|
+
{ label: 'Products', href: '/admin/products' },
|
|
82
|
+
{ label: 'Merino Wool Crewneck Sweater' },
|
|
83
|
+
],
|
|
84
|
+
},
|
|
85
|
+
customers: {
|
|
86
|
+
id: 'customers',
|
|
87
|
+
label: 'Customers',
|
|
88
|
+
url: '/admin/customers',
|
|
89
|
+
breadcrumbs: [
|
|
90
|
+
{ label: 'Customers', href: '/admin/customers' },
|
|
91
|
+
{ label: 'Elena Rostova' },
|
|
92
|
+
],
|
|
93
|
+
},
|
|
94
|
+
'user-permissions': {
|
|
95
|
+
id: 'user-permissions',
|
|
96
|
+
label: 'Settings',
|
|
97
|
+
url: '/admin/settings',
|
|
98
|
+
breadcrumbs: [
|
|
99
|
+
{ label: 'Settings', href: '/admin/settings' },
|
|
100
|
+
{ label: 'Staff & permissions' },
|
|
101
|
+
],
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
const SIDEBAR_ICON_MAP: NonNullable<AppSidebarProps['iconMap']> = {
|
|
106
|
+
analytics: BarChart3,
|
|
107
|
+
orders: ShoppingBag,
|
|
108
|
+
products: Package,
|
|
109
|
+
customers: Users,
|
|
110
|
+
settings: Settings,
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
const NAVIGATION_GROUPS: NonNullable<AppSidebarProps['navigationGroups']> = {
|
|
114
|
+
Store: [
|
|
115
|
+
{
|
|
116
|
+
label: 'Overview',
|
|
117
|
+
href: '/admin/overview',
|
|
118
|
+
icon: 'analytics',
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
label: 'Orders',
|
|
122
|
+
href: '/admin/orders',
|
|
123
|
+
icon: 'orders',
|
|
124
|
+
badge: '3',
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
label: 'Products',
|
|
128
|
+
href: '/admin/products',
|
|
129
|
+
icon: 'products',
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
label: 'Customers',
|
|
133
|
+
href: '/admin/customers',
|
|
134
|
+
icon: 'customers',
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
Settings: [
|
|
138
|
+
{
|
|
139
|
+
label: 'Staff & permissions',
|
|
140
|
+
href: '/admin/settings',
|
|
141
|
+
icon: 'settings',
|
|
142
|
+
},
|
|
143
|
+
],
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
const WORKSPACE_LINKS: WorkspaceLink[] = [
|
|
147
|
+
{
|
|
148
|
+
label: 'Oak & Loom — US Online Store',
|
|
149
|
+
url: '/admin/overview',
|
|
150
|
+
},
|
|
151
|
+
];
|
|
152
|
+
|
|
153
|
+
const CURRENT_USER: NonNullable<HeaderUserMenuProps['user']> = {
|
|
154
|
+
name: 'Maya Lin',
|
|
155
|
+
email: 'maya.lin@oakandloom.com',
|
|
156
|
+
role: 'Store Operations Lead',
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
const INITIAL_NOTIFICATIONS: HeaderNotification[] = [
|
|
160
|
+
{
|
|
161
|
+
id: 'notif-1',
|
|
162
|
+
title: 'Order #1042 shipped via UPS Ground',
|
|
163
|
+
description: 'Tracking 1Z999AA10123456784 scanned at Brooklyn hub.',
|
|
164
|
+
time: '12m ago',
|
|
165
|
+
tone: 'info',
|
|
166
|
+
read: false,
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
id: 'notif-2',
|
|
170
|
+
title: 'Low stock alert · Midnight Navy / Large',
|
|
171
|
+
description: '6 units remaining at Brooklyn Warehouse.',
|
|
172
|
+
time: '1h ago',
|
|
173
|
+
tone: 'warning',
|
|
174
|
+
read: false,
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
id: 'notif-3',
|
|
178
|
+
title: 'Daily Stripe payout deposited',
|
|
179
|
+
description: '6,420.50 USD settled to operating account.',
|
|
180
|
+
time: '3h ago',
|
|
181
|
+
tone: 'success',
|
|
182
|
+
read: true,
|
|
183
|
+
},
|
|
184
|
+
];
|
|
185
|
+
|
|
186
|
+
export const adminStarterUIDefaults: UIConfig = {
|
|
187
|
+
density: { defaultScale: 'md' },
|
|
188
|
+
card: {
|
|
189
|
+
defaultSurface: 'card',
|
|
190
|
+
},
|
|
191
|
+
formatting: { locale: 'en-US' },
|
|
192
|
+
money: { defaultCurrency: 'USD' },
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
export interface AdminStarterShellProps {
|
|
196
|
+
defaultTemplate?: AdminTemplateId;
|
|
197
|
+
activeTemplate?: AdminTemplateId;
|
|
198
|
+
onTemplateChange?: (template: AdminTemplateId) => void;
|
|
199
|
+
defaultShellVariant?: AppLayoutVariant;
|
|
200
|
+
children?: ReactNode;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function TemplateLink({ href, children, active, disabled, external, target, rel, onClick, onNavigate, ...props }: LayoutLinkRenderProps & { onNavigate: (id: AdminTemplateId) => void }) {
|
|
204
|
+
const { setOpenMobile } = useSidebar();
|
|
205
|
+
return <a {...props} href={disabled ? undefined : href} target={target ?? (external ? '_blank' : undefined)} rel={rel ?? (external ? 'noopener noreferrer' : undefined)} aria-current={active ? 'page' : undefined} aria-disabled={disabled || undefined} onClick={(event) => {
|
|
206
|
+
onClick?.(event);
|
|
207
|
+
if (disabled) { event.preventDefault(); return; }
|
|
208
|
+
if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || external || (target && target !== '_self')) return;
|
|
209
|
+
const route = Object.values(TEMPLATE_ROUTES).find((item) => item.url === href);
|
|
210
|
+
if (route) { event.preventDefault(); onNavigate(route.id); setOpenMobile(false); }
|
|
211
|
+
}}>{children}</a>;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function TemplateUserMenu({ sidebar = false, onNavigate }: { sidebar?: boolean; onNavigate: (id: AdminTemplateId) => void }) {
|
|
215
|
+
const { setOpenMobile } = useSidebar();
|
|
216
|
+
const openSettings = () => { onNavigate('user-permissions'); setOpenMobile(false); };
|
|
217
|
+
return sidebar ? <SidebarNavigationUser user={CURRENT_USER} onSettings={openSettings} /> : <HeaderUserMenu user={CURRENT_USER} onSettings={openSettings} />;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
export function AdminStarterShell({
|
|
221
|
+
defaultTemplate = 'orders',
|
|
222
|
+
activeTemplate: controlledTemplate,
|
|
223
|
+
onTemplateChange,
|
|
224
|
+
defaultShellVariant = 'inset',
|
|
225
|
+
children,
|
|
226
|
+
}: AdminStarterShellProps) {
|
|
227
|
+
const [internalTemplate, setInternalTemplate] = useState<AdminTemplateId>(defaultTemplate);
|
|
228
|
+
const [notifications, setNotifications] =
|
|
229
|
+
useState<HeaderNotification[]>(INITIAL_NOTIFICATIONS);
|
|
230
|
+
|
|
231
|
+
const activeTemplate = controlledTemplate ?? internalTemplate;
|
|
232
|
+
const activeMeta = TEMPLATE_ROUTES[activeTemplate];
|
|
233
|
+
|
|
234
|
+
const selectTemplate = (next: AdminTemplateId) => {
|
|
235
|
+
if (controlledTemplate === undefined) {
|
|
236
|
+
setInternalTemplate(next);
|
|
237
|
+
}
|
|
238
|
+
onTemplateChange?.(next);
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
const renderLink = (props: LayoutLinkRenderProps) => <TemplateLink {...props} onNavigate={selectTemplate} />;
|
|
242
|
+
|
|
243
|
+
const brandLogo = (
|
|
244
|
+
<Stack direction="horizontal" align="center" gap="sm" wrap={false}>
|
|
245
|
+
<IconBadge icon={Store} tone="primary" shape="square" />
|
|
246
|
+
<Stack gap="none" className="min-w-0">
|
|
247
|
+
<Text weight="semibold" size="sm" className="truncate">
|
|
248
|
+
Oak & Loom
|
|
249
|
+
</Text>
|
|
250
|
+
<Text size="xs" type="secondary" className="truncate">
|
|
251
|
+
Online Store
|
|
252
|
+
</Text>
|
|
253
|
+
</Stack>
|
|
254
|
+
</Stack>
|
|
255
|
+
);
|
|
256
|
+
|
|
257
|
+
const sidebarNode = (
|
|
258
|
+
<AppSidebar
|
|
259
|
+
className="h-full"
|
|
260
|
+
logo={brandLogo}
|
|
261
|
+
collapsedLogo={<IconBadge icon={Store} tone="primary" shape="square" />}
|
|
262
|
+
workspaceLinks={WORKSPACE_LINKS}
|
|
263
|
+
navigationGroups={NAVIGATION_GROUPS}
|
|
264
|
+
iconMap={SIDEBAR_ICON_MAP}
|
|
265
|
+
currentUrl={activeMeta.url}
|
|
266
|
+
renderLink={renderLink}
|
|
267
|
+
searchable
|
|
268
|
+
slots={{
|
|
269
|
+
footer: (
|
|
270
|
+
<TemplateUserMenu sidebar onNavigate={selectTemplate} />
|
|
271
|
+
),
|
|
272
|
+
}}
|
|
273
|
+
/>
|
|
274
|
+
);
|
|
275
|
+
|
|
276
|
+
const breadcrumbsNode = (
|
|
277
|
+
<HeaderBreadcrumbs
|
|
278
|
+
homeBreadcrumb={{ label: 'Oak & Loom', href: '/admin/overview' }}
|
|
279
|
+
breadcrumbs={activeMeta.breadcrumbs}
|
|
280
|
+
renderLink={renderLink}
|
|
281
|
+
/>
|
|
282
|
+
);
|
|
283
|
+
|
|
284
|
+
const trailingToolsNode = (
|
|
285
|
+
<Stack direction="horizontal" align="center" gap="sm" wrap={false}>
|
|
286
|
+
<HeaderNotifications
|
|
287
|
+
notifications={notifications}
|
|
288
|
+
onMarkAllRead={() =>
|
|
289
|
+
setNotifications((current) =>
|
|
290
|
+
current.map((item) => ({ ...item, read: true })),
|
|
291
|
+
)
|
|
292
|
+
}
|
|
293
|
+
/>
|
|
294
|
+
<TemplateUserMenu onNavigate={selectTemplate} />
|
|
295
|
+
</Stack>
|
|
296
|
+
);
|
|
297
|
+
|
|
298
|
+
const activePageNode =
|
|
299
|
+
children ??
|
|
300
|
+
(activeTemplate === 'orders' ? (
|
|
301
|
+
<OrdersAdminTemplate />
|
|
302
|
+
) : activeTemplate === 'products' ? (
|
|
303
|
+
<ProductsAdminTemplate />
|
|
304
|
+
) : activeTemplate === 'customers' ? (
|
|
305
|
+
<CustomersAdminTemplate />
|
|
306
|
+
) : activeTemplate === 'user-permissions' ? (
|
|
307
|
+
<UserPermissionsTemplate />
|
|
308
|
+
) : (
|
|
309
|
+
<AnalyticsOperationsTemplate />
|
|
310
|
+
));
|
|
311
|
+
|
|
312
|
+
return (
|
|
313
|
+
<LayoutSidebarProvider adaptTo="container" className="h-full min-h-0">
|
|
314
|
+
{defaultShellVariant === 'sidebar' || defaultShellVariant === 'inset' ? (
|
|
315
|
+
<AppLayout
|
|
316
|
+
variant={defaultShellVariant}
|
|
317
|
+
className="h-full min-h-0"
|
|
318
|
+
sidebar={sidebarNode}
|
|
319
|
+
slots={{
|
|
320
|
+
toolbarStart: breadcrumbsNode,
|
|
321
|
+
toolbarEnd: trailingToolsNode,
|
|
322
|
+
}}
|
|
323
|
+
>
|
|
324
|
+
{activePageNode}
|
|
325
|
+
</AppLayout>
|
|
326
|
+
) : defaultShellVariant === 'stacked' ? (
|
|
327
|
+
<AppLayout variant="stacked" className="h-full min-h-0" logo={brandLogo}
|
|
328
|
+
nav={<Stack direction="horizontal" gap="lg">{Object.values(TEMPLATE_ROUTES).map((route) => <TemplateLink key={route.id} href={route.url} active={route.id === activeTemplate} onNavigate={selectTemplate}>{route.label}</TemplateLink>)}</Stack>}
|
|
329
|
+
slots={{ headerEnd: trailingToolsNode }}>
|
|
330
|
+
{activePageNode}
|
|
331
|
+
</AppLayout>
|
|
332
|
+
) : (
|
|
333
|
+
<AppLayout
|
|
334
|
+
variant={defaultShellVariant}
|
|
335
|
+
className="h-full min-h-0"
|
|
336
|
+
logo={brandLogo}
|
|
337
|
+
sidebar={sidebarNode}
|
|
338
|
+
slots={{
|
|
339
|
+
headerStart: breadcrumbsNode,
|
|
340
|
+
headerEnd: trailingToolsNode,
|
|
341
|
+
}}
|
|
342
|
+
>
|
|
343
|
+
{activePageNode}
|
|
344
|
+
</AppLayout>
|
|
345
|
+
)}
|
|
346
|
+
</LayoutSidebarProvider>
|
|
347
|
+
);
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
export interface AdminTemplatesShowcaseProps extends AdminStarterShellProps {
|
|
351
|
+
defaultDensity?: ComponentScale;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
export function AdminTemplatesShowcase({ defaultDensity = 'md', ...props }: AdminTemplatesShowcaseProps) {
|
|
355
|
+
return (
|
|
356
|
+
<UIProvider config={{ ...adminStarterUIDefaults, density: { defaultScale: defaultDensity } }}>
|
|
357
|
+
<AdminStarterShell {...props} />
|
|
358
|
+
</UIProvider>
|
|
359
|
+
);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
export function OrdersTemplatePreview() {
|
|
363
|
+
return <OrdersAdminTemplate />;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
export function ProductsTemplatePreview() {
|
|
367
|
+
return <ProductsAdminTemplate />;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
export function CustomersTemplatePreview() {
|
|
371
|
+
return <CustomersAdminTemplate />;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
export function UserPermissionsTemplatePreview() {
|
|
375
|
+
return <UserPermissionsTemplate />;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
export function AnalyticsOperationsTemplatePreview() {
|
|
379
|
+
return <AnalyticsOperationsTemplate />;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
export default AdminTemplatesShowcase;
|