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,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: themelia-ui-designer
|
|
3
|
+
description: Product designer for apps built with themelia-react-ui. Delegate a new view, a redesign, or a screen that works but reads poorly; it reads the real records, writes a view spec, builds with public owners, renders 390 and 1440 wide in light and dark, scores a critique rubric and fixes. Ask for review mode to get a read-only, independent critique of existing screens.
|
|
4
|
+
model: inherit
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Themelia UI designer
|
|
8
|
+
|
|
9
|
+
You are a product designer who builds. Your result is a view that lets its user
|
|
10
|
+
decide quickly from real records, built with themelia-react-ui public owners and
|
|
11
|
+
app markup over its tokens. You remove before you add, spend emphasis on
|
|
12
|
+
purpose, and judge rendered screens rather than source.
|
|
13
|
+
|
|
14
|
+
## Inputs
|
|
15
|
+
|
|
16
|
+
The parent names the mode (`design` or `review`, default `design`), the routes
|
|
17
|
+
or files, where the records live, the dev server URL when one runs, and any
|
|
18
|
+
constraints. Ask the parent only when a decision depends on something the
|
|
19
|
+
records, the brief and the code cannot tell you.
|
|
20
|
+
|
|
21
|
+
## Load first
|
|
22
|
+
|
|
23
|
+
- `node_modules/themelia-react-ui/docs/consumer-skills/themelia-design/SKILL.md`
|
|
24
|
+
- `node_modules/themelia-react-ui/docs/consumer-skill/references/data-reading.md`
|
|
25
|
+
- `node_modules/themelia-react-ui/docs/consumer-skill/references/view-spec.md`
|
|
26
|
+
- `node_modules/themelia-react-ui/docs/consumer-skill/references/view-craft.md`
|
|
27
|
+
- `node_modules/themelia-react-ui/docs/consumer-skill/references/critique-rubric.md`
|
|
28
|
+
- `node_modules/themelia-react-ui/docs/consumer-skills/themelia-composition/SKILL.md`
|
|
29
|
+
for owners, surfaces and insets
|
|
30
|
+
- The app's `AGENTS.md` or `CLAUDE.md`: its rules win over this file.
|
|
31
|
+
|
|
32
|
+
## Design mode
|
|
33
|
+
|
|
34
|
+
1. **Read the data.** Open the records (fixtures, mocks, types, API samples).
|
|
35
|
+
Read a typical, a large, an exceptional and an empty record. Write the data
|
|
36
|
+
brief.
|
|
37
|
+
2. **Baseline.** If the view exists, render it and score the rubric before
|
|
38
|
+
changing anything. Keep these screenshots for the report.
|
|
39
|
+
3. **Spec.** Write the view spec where the parent says, otherwise
|
|
40
|
+
`design/<view>.md`. Rank information, name the focal point, draw 390 and
|
|
41
|
+
1440 wireframes, choose an encoding per fact.
|
|
42
|
+
4. **Owners.** Find and verify owners before JSX:
|
|
43
|
+
- `node node_modules/themelia-react-ui/docs/consumer-skill/scripts/find-components.mjs <task nouns>`
|
|
44
|
+
- `node node_modules/themelia-react-ui/docs/consumer-skill/scripts/map-composition.mjs --pattern record-detail|collection|edit|analytics --main <need> --aside <need>`
|
|
45
|
+
- `node node_modules/themelia-react-ui/docs/consumer-skill/scripts/inspect-component.mjs <Symbol> --import <exact import> --prop <name>`
|
|
46
|
+
- `node node_modules/themelia-react-ui/docs/consumer-skill/scripts/inspect-tokens.mjs <role or root>`
|
|
47
|
+
5. **One subject first.** Build one representative subject and render it at
|
|
48
|
+
both widths before repeating it.
|
|
49
|
+
6. **Build the view.** Change only the app files in scope and new app
|
|
50
|
+
components. Never edit `node_modules` or the package.
|
|
51
|
+
7. **Render.** Use the browser tool you have (built-in browser, Chrome or the
|
|
52
|
+
app's Playwright). Capture 390×844 and 1440×900 in light and dark, plus the
|
|
53
|
+
opened, error and accepted states the view supports. Wait for rendered state
|
|
54
|
+
instead of fixed delays. Run the rubric's census at each width.
|
|
55
|
+
Without a browser tool, stop here: return the render checklist (routes,
|
|
56
|
+
widths, themes, states) and mark appearance unverified. Never claim visual
|
|
57
|
+
quality without screenshots.
|
|
58
|
+
8. **Critique.** Score the rubric as a reviewer who did not build the view.
|
|
59
|
+
Write findings in the rubric's format.
|
|
60
|
+
9. **Fix.** Repair the lowest-scoring criterion at its owner, render again and
|
|
61
|
+
score again. Stop after three rounds and report what remains.
|
|
62
|
+
10. **Check.** Run the app's typecheck, lint, tests and build, and
|
|
63
|
+
`node node_modules/themelia-react-ui/docs/consumer-skill/scripts/check-composition.mjs <changed files>`.
|
|
64
|
+
Execute the callbacks, validation, focus and error/retry paths your change
|
|
65
|
+
touched.
|
|
66
|
+
|
|
67
|
+
## Review mode
|
|
68
|
+
|
|
69
|
+
Read-only: do not edit files. Load the same references. Read the records and
|
|
70
|
+
write your own data brief, render the routes and form your five-second answers
|
|
71
|
+
before reading any design notes; then compare intent with result. Return the
|
|
72
|
+
scores, findings and screenshots.
|
|
73
|
+
|
|
74
|
+
## Rules
|
|
75
|
+
|
|
76
|
+
- Real records only. No invented figures, trends or states; data gaps stay
|
|
77
|
+
visible and are reported.
|
|
78
|
+
- Public imports only. No anatomy class overrides, new colours or tokens, blur,
|
|
79
|
+
decorative icons, filler cards or prose explaining the screen.
|
|
80
|
+
- Do not add navigation, cards or commands because a prop allows them.
|
|
81
|
+
- Keep existing behaviour: every command still works, explains why it is
|
|
82
|
+
disabled, or is removed with a reason.
|
|
83
|
+
- Report a library limit by owner and prop with the workaround used.
|
|
84
|
+
|
|
85
|
+
## Report
|
|
86
|
+
|
|
87
|
+
1. Rubric scores before and after, per criterion, width and theme.
|
|
88
|
+
2. Screenshot paths for each width, theme and state.
|
|
89
|
+
3. The decisions that changed the view and why, including what was removed.
|
|
90
|
+
4. Checks and interactions run, with results.
|
|
91
|
+
5. Library gaps: owner, prop, workaround.
|
|
92
|
+
6. Unverified: widths, themes, states or interactions not exercised.
|
|
93
|
+
|
|
94
|
+
Keep measurements and screenshots separate from judgement: "the census shows 9
|
|
95
|
+
text levels in Purchased goods" is evidence; "the view is clearer" is a claim
|
|
96
|
+
that needs it.
|
|
@@ -3,8 +3,8 @@ import { Card } from 'themelia-react-ui/base/cards';
|
|
|
3
3
|
import { SidebarTrigger } from 'themelia-react-ui/base/sidebar';
|
|
4
4
|
import { AppLayout, type AppLayoutVariant } from 'themelia-react-ui/layout/app-shell';
|
|
5
5
|
import { HeaderUserMenu, type HeaderUserMenuProps } from 'themelia-react-ui/layout/header';
|
|
6
|
-
import { Page } from 'themelia-react-ui/layout/page';
|
|
7
|
-
import { AppSidebar, LayoutSidebarProvider, SidebarNavigationUser, type AppSidebarProps } from 'themelia-react-ui/layout/sidebar';
|
|
6
|
+
import { Page, type PageProps } from 'themelia-react-ui/layout/page';
|
|
7
|
+
import { AppSidebar, LayoutSidebarProvider, SidebarNavigationUser, type AppSidebarProps, type LayoutSidebarProviderProps } from 'themelia-react-ui/layout/sidebar';
|
|
8
8
|
import type { UIConfig } from 'themelia-react-ui/ui-provider';
|
|
9
9
|
import { Text } from 'themelia-react-ui/typography';
|
|
10
10
|
|
|
@@ -26,15 +26,13 @@ export interface WorkspaceLayoutProps {
|
|
|
26
26
|
workspaceSwitcher?: ReactNode;
|
|
27
27
|
user?: HeaderUserMenuProps['user'];
|
|
28
28
|
onLogout?: () => void;
|
|
29
|
-
onCreate: () => void;
|
|
30
|
-
narrow?: boolean;
|
|
31
29
|
children?: ReactNode;
|
|
32
30
|
}
|
|
33
31
|
|
|
34
32
|
/** The app accepts route/identity data and wires navigation/persistence callbacks. */
|
|
35
33
|
export function WorkspaceLayout({ variant = 'inset', sidebar, navigationGroups = {},
|
|
36
34
|
currentUrl, renderLink, workspaceLinks, workspaceSwitcher, user, onLogout,
|
|
37
|
-
|
|
35
|
+
children }: WorkspaceLayoutProps) {
|
|
38
36
|
const sidebarAccount = !sidebar && (variant === 'sidebar' || variant === 'inset');
|
|
39
37
|
const brand = <Text weight="semibold">Admin</Text>;
|
|
40
38
|
const account = user && !sidebarAccount ? <HeaderUserMenu user={user} onLogout={onLogout} /> : null;
|
|
@@ -42,18 +40,81 @@ export function WorkspaceLayout({ variant = 'inset', sidebar, navigationGroups =
|
|
|
42
40
|
currentUrl={currentUrl} renderLink={renderLink} navigationGroups={navigationGroups}
|
|
43
41
|
workspaceLinks={workspaceSwitcher ? undefined : workspaceLinks}
|
|
44
42
|
slots={{ headerEnd: workspaceSwitcher, footer: user && sidebarAccount ? <SidebarNavigationUser user={user} onLogout={onLogout} /> : undefined }} />;
|
|
45
|
-
const content = <Page narrow={narrow} gutter={variant === 'stacked' ? 'none' : undefined}
|
|
46
|
-
header={{ title: 'Workspace', description: 'Review activity and manage your records.',
|
|
47
|
-
primaryAction: { label: 'Create record', onClick: onCreate } }}>
|
|
48
|
-
{children ?? <Card title="Activity" footerText="Latest workspace activity"><Text>Application content goes here.</Text></Card>}
|
|
49
|
-
</Page>;
|
|
50
43
|
const trigger = <SidebarTrigger />;
|
|
51
44
|
return <LayoutSidebarProvider adaptTo="container" className="min-h-0">
|
|
52
45
|
{variant === 'stacked' ? <AppLayout variant="stacked" className="h-svh min-h-0" logo={brand}
|
|
53
|
-
slots={{headerEnd: account}}>{
|
|
46
|
+
slots={{headerEnd: account}}>{children}</AppLayout>
|
|
54
47
|
: variant === 'sidebar' || variant === 'inset' ? <AppLayout variant={variant} className="h-svh min-h-0"
|
|
55
|
-
sidebar={navigation} sidebarTrigger={trigger} slots={{ toolbarStart: brand, toolbarEnd: account }}>{
|
|
48
|
+
sidebar={navigation} sidebarTrigger={trigger} slots={{ toolbarStart: brand, toolbarEnd: account }}>{children}</AppLayout>
|
|
56
49
|
: <AppLayout variant={variant} className="h-svh min-h-0" logo={brand} sidebar={navigation}
|
|
57
|
-
sidebarTrigger={trigger} slots={{headerEnd: account}}>{
|
|
50
|
+
sidebarTrigger={trigger} slots={{headerEnd: account}}>{children}</AppLayout>}
|
|
51
|
+
</LayoutSidebarProvider>;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface WorkspaceRegionsLayoutProps {
|
|
55
|
+
/** Supply SidebarNavigationRail for a persistent area rail. */
|
|
56
|
+
primaryNavigation?: ReactNode;
|
|
57
|
+
sidebarPresentation?: 'panel' | 'rail';
|
|
58
|
+
navigationGroups?: AppSidebarProps['navigationGroups'];
|
|
59
|
+
contextualNavigationGroups?: AppSidebarProps['navigationGroups'];
|
|
60
|
+
/** Independent of shell/rail presentation: minimize to icons, hide, or stay expanded. */
|
|
61
|
+
contextualCollapsible?: AppSidebarProps['collapsible'];
|
|
62
|
+
/** A defined replacement wins over contextual groups; null removes the region. */
|
|
63
|
+
secondarySidebar?: ReactNode;
|
|
64
|
+
currentUrl?: string;
|
|
65
|
+
renderLink?: AppSidebarProps['renderLink'];
|
|
66
|
+
secondarySidebarWidth?: string;
|
|
67
|
+
openPanels?: LayoutSidebarProviderProps['openPanels'];
|
|
68
|
+
defaultOpenPanels?: LayoutSidebarProviderProps['defaultOpenPanels'];
|
|
69
|
+
onOpenPanelsChange?: LayoutSidebarProviderProps['onOpenPanelsChange'];
|
|
70
|
+
mobilePanel?: LayoutSidebarProviderProps['mobilePanel'];
|
|
71
|
+
onMobilePanelChange?: LayoutSidebarProviderProps['onMobilePanelChange'];
|
|
72
|
+
user?: HeaderUserMenuProps['user'];
|
|
73
|
+
onLogout?: () => void;
|
|
74
|
+
children?: ReactNode;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** One provider coordinates the primary area and adjacent contextual navigation. */
|
|
78
|
+
export function WorkspaceRegionsLayout({ primaryNavigation, sidebarPresentation = 'panel',
|
|
79
|
+
navigationGroups = {}, contextualNavigationGroups, contextualCollapsible = 'icon', secondarySidebar,
|
|
80
|
+
currentUrl, renderLink, secondarySidebarWidth,
|
|
81
|
+
openPanels, defaultOpenPanels = ['primary', 'secondary'], onOpenPanelsChange,
|
|
82
|
+
mobilePanel, onMobilePanelChange, user, onLogout, children }: WorkspaceRegionsLayoutProps) {
|
|
83
|
+
const hasContextualNavigation = secondarySidebar !== undefined
|
|
84
|
+
? secondarySidebar != null && secondarySidebar !== false : contextualNavigationGroups !== undefined;
|
|
85
|
+
return <LayoutSidebarProvider adaptTo="container" className="min-h-0"
|
|
86
|
+
navigationPanel={hasContextualNavigation ? 'secondary' : 'primary'}
|
|
87
|
+
openPanels={openPanels} defaultOpenPanels={defaultOpenPanels} onOpenPanelsChange={onOpenPanelsChange}
|
|
88
|
+
mobilePanel={mobilePanel} onMobilePanelChange={onMobilePanelChange}>
|
|
89
|
+
<AppLayout variant="light-header" contentSurface="inset" className="h-svh min-h-0"
|
|
90
|
+
logo={<Text weight="semibold">Admin</Text>} sidebarTrigger={<SidebarTrigger />}
|
|
91
|
+
sidebarPresentation={sidebarPresentation}
|
|
92
|
+
mobileSidebarMode={sidebarPresentation === 'rail' ? 'inline' : 'drawer'}
|
|
93
|
+
secondarySidebarWidth={secondarySidebarWidth}
|
|
94
|
+
slots={{
|
|
95
|
+
headerEnd: user && <HeaderUserMenu user={user} onLogout={onLogout} />,
|
|
96
|
+
sidebar: primaryNavigation ?? <AppSidebar className="h-full" surface="transparent" menuDensity="comfortable"
|
|
97
|
+
navigationGroups={navigationGroups} currentUrl={currentUrl} renderLink={renderLink} />,
|
|
98
|
+
secondarySidebar: hasContextualNavigation ? secondarySidebar !== undefined ? secondarySidebar : <AppSidebar className="h-full" surface="transparent"
|
|
99
|
+
collapsible={contextualCollapsible} menuDensity="comfortable" searchable
|
|
100
|
+
navigationGroups={contextualNavigationGroups} currentUrl={currentUrl} renderLink={renderLink} /> : undefined,
|
|
101
|
+
}}>{children}</AppLayout>
|
|
58
102
|
</LayoutSidebarProvider>;
|
|
59
103
|
}
|
|
104
|
+
|
|
105
|
+
export interface WorkspaceExamplePageProps {
|
|
106
|
+
onCreate: () => void;
|
|
107
|
+
narrow?: boolean;
|
|
108
|
+
/** Use none when a stacked/contained parent already owns the inline gutter. */
|
|
109
|
+
gutter?: PageProps['gutter'];
|
|
110
|
+
children?: ReactNode;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** Illustrative route content; mount this or another route Page inside the shell. */
|
|
114
|
+
export function WorkspaceExamplePage({ onCreate, narrow, gutter, children }: WorkspaceExamplePageProps) {
|
|
115
|
+
return <Page narrow={narrow} gutter={gutter}
|
|
116
|
+
header={{ title: 'Workspace', description: 'Review activity and manage your records.',
|
|
117
|
+
primaryAction: { label: 'Create record', onClick: onCreate } }}>
|
|
118
|
+
{children ?? <Card title="Activity" footerText="Latest workspace activity"><Text>Application content goes here.</Text></Card>}
|
|
119
|
+
</Page>;
|
|
120
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { useId, useRef, useState, type FormEvent } from 'react';
|
|
2
|
+
import { Button } from 'themelia-react-ui/base/buttons';
|
|
3
|
+
import { Checkbox } from 'themelia-react-ui/base/choice-inputs';
|
|
4
|
+
import { FormField } from 'themelia-react-ui/base/forms';
|
|
5
|
+
import { Stack } from 'themelia-react-ui/base/structure';
|
|
6
|
+
import { Input, PasswordInput } from 'themelia-react-ui/base/text-inputs';
|
|
7
|
+
import { AuthFooterLinks, AuthForm, AuthFormRow, AuthShell, type AuthShellProps } from 'themelia-react-ui/layout/auth';
|
|
8
|
+
import { Text } from 'themelia-react-ui/typography';
|
|
9
|
+
|
|
10
|
+
export interface PasswordSignInValue {
|
|
11
|
+
email: string;
|
|
12
|
+
password: string;
|
|
13
|
+
rememberDevice: boolean;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface PasswordSignInProps {
|
|
17
|
+
productName: string;
|
|
18
|
+
recoveryHref: string;
|
|
19
|
+
/** Optional public destination relevant to this sign-in flow. */
|
|
20
|
+
returnHref?: string;
|
|
21
|
+
renderLink?: AuthShellProps['renderLink'];
|
|
22
|
+
/** The app authenticates and navigates after success; reject on failure. */
|
|
23
|
+
onSignIn: (value: PasswordSignInValue) => Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function PasswordSignIn({ productName, recoveryHref, returnHref, renderLink, onSignIn }: PasswordSignInProps) {
|
|
27
|
+
const id = useId();
|
|
28
|
+
const inFlight = useRef(false);
|
|
29
|
+
const [email, setEmail] = useState('');
|
|
30
|
+
const [password, setPassword] = useState('');
|
|
31
|
+
const [rememberDevice, setRememberDevice] = useState(false);
|
|
32
|
+
const [pending, setPending] = useState(false);
|
|
33
|
+
const [error, setError] = useState<string>();
|
|
34
|
+
|
|
35
|
+
async function submit(event: FormEvent<HTMLFormElement>) {
|
|
36
|
+
event.preventDefault();
|
|
37
|
+
if (inFlight.current) return;
|
|
38
|
+
inFlight.current = true;
|
|
39
|
+
setError(undefined);
|
|
40
|
+
setPending(true);
|
|
41
|
+
try {
|
|
42
|
+
await onSignIn({ email, password, rememberDevice });
|
|
43
|
+
} catch {
|
|
44
|
+
setError('Sign-in failed. Check your details and try again.');
|
|
45
|
+
} finally {
|
|
46
|
+
inFlight.current = false;
|
|
47
|
+
setPending(false);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return <AuthShell brand={{ label: productName }} title="Sign in"
|
|
52
|
+
description="Use your account to continue." renderLink={renderLink}
|
|
53
|
+
footerLinks={returnHref ? [{ id: 'return', label: 'Return to application', href: returnHref }] : []}>
|
|
54
|
+
<AuthForm onSubmit={submit} aria-label="Password sign in" aria-busy={pending}>
|
|
55
|
+
<FormField label="Email" htmlFor={`${id}-email`} required>
|
|
56
|
+
<Input id={`${id}-email`} name="email" type="email" autoComplete="username"
|
|
57
|
+
required disabled={pending} value={email} onChange={event => setEmail(event.target.value)} />
|
|
58
|
+
</FormField>
|
|
59
|
+
<FormField label="Password" htmlFor={`${id}-password`} required>
|
|
60
|
+
<PasswordInput id={`${id}-password`} name="password" autoComplete="current-password"
|
|
61
|
+
required disabled={pending} value={password} onChange={event => setPassword(event.target.value)} />
|
|
62
|
+
</FormField>
|
|
63
|
+
<AuthFormRow>
|
|
64
|
+
<Stack render={<label htmlFor={`${id}-remember`} />} direction="horizontal" gap="md" wrap={false}>
|
|
65
|
+
<Checkbox id={`${id}-remember`} name="rememberDevice" checked={rememberDevice}
|
|
66
|
+
disabled={pending} onCheckedChange={checked => setRememberDevice(checked === true)} />
|
|
67
|
+
<Text tag="span">Remember this device</Text>
|
|
68
|
+
</Stack>
|
|
69
|
+
<AuthFooterLinks aria-label="Account recovery" renderLink={renderLink}
|
|
70
|
+
links={[{ id: 'recovery', label: 'Forgot password?', href: recoveryHref, disabled: pending }]} />
|
|
71
|
+
</AuthFormRow>
|
|
72
|
+
{error && <Text type="error" role="alert">{error}</Text>}
|
|
73
|
+
<Button tone="primary" type="submit" fullWidth loading={pending}
|
|
74
|
+
strings={{ loading: 'Signing in…' }}>Sign in</Button>
|
|
75
|
+
</AuthForm>
|
|
76
|
+
</AuthShell>;
|
|
77
|
+
}
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { CreditCard, FileText, Send } from 'lucide-react';
|
|
2
|
+
import { Badge } from 'themelia-react-ui/base/badge';
|
|
3
|
+
import { Card } from 'themelia-react-ui/base/cards';
|
|
4
|
+
import { Alert, AlertDescription, AlertTitle } from 'themelia-react-ui/base/feedback';
|
|
5
|
+
import { Stack } from 'themelia-react-ui/base/structure';
|
|
6
|
+
import {
|
|
7
|
+
AddressCard,
|
|
8
|
+
AmountRow,
|
|
9
|
+
FulfillmentGroup,
|
|
10
|
+
InvoiceHeader,
|
|
11
|
+
InvoiceLineItems,
|
|
12
|
+
OrderCustomer,
|
|
13
|
+
OrderLineItem,
|
|
14
|
+
OrderSummary,
|
|
15
|
+
OrderTimeline,
|
|
16
|
+
OrderTransactions,
|
|
17
|
+
PaymentTimeline,
|
|
18
|
+
ShipmentTracking,
|
|
19
|
+
SummaryPanel,
|
|
20
|
+
type InvoiceColumn,
|
|
21
|
+
type InvoiceLineItem,
|
|
22
|
+
} from 'themelia-react-ui/blocks/commerce';
|
|
23
|
+
import { Page } from 'themelia-react-ui/layout/page';
|
|
24
|
+
import { Money, Number as NumberValue } from 'themelia-react-ui/primitives';
|
|
25
|
+
import { Text } from 'themelia-react-ui/typography';
|
|
26
|
+
|
|
27
|
+
/** Mock accepted order values; the app owns tax, shipping and price calculations. */
|
|
28
|
+
export function SoldProductWithSummary() {
|
|
29
|
+
return (
|
|
30
|
+
<Card title="Items and totals">
|
|
31
|
+
<Stack gap="xl">
|
|
32
|
+
<OrderLineItem
|
|
33
|
+
id="mug-sand-350"
|
|
34
|
+
title="Ceramic mug"
|
|
35
|
+
variantTitle="350 ml / Sand"
|
|
36
|
+
sku="MUG-350-SAND"
|
|
37
|
+
unitPrice="€18.00"
|
|
38
|
+
quantity={2}
|
|
39
|
+
total="€36.00"
|
|
40
|
+
/>
|
|
41
|
+
<SummaryPanel>
|
|
42
|
+
<AmountRow label="Subtotal" amount="€36.00" />
|
|
43
|
+
<AmountRow label="Shipping" amount="€6.50" />
|
|
44
|
+
<AmountRow label="Tax" note="20%" amount="€8.50" />
|
|
45
|
+
<AmountRow label="Grand total" amount="€51.00" total rollup />
|
|
46
|
+
</SummaryPanel>
|
|
47
|
+
</Stack>
|
|
48
|
+
</Card>
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Custom JSX values keep their roles: quiet regular breakdown, bold financial total. */
|
|
53
|
+
export function CustomServiceInvoice() {
|
|
54
|
+
// Custom columns replace the default four-column/mobile recipe with this two-column grid.
|
|
55
|
+
const serviceColumns: InvoiceColumn<InvoiceLineItem>[] = [
|
|
56
|
+
{
|
|
57
|
+
id: 'service',
|
|
58
|
+
header: 'Service',
|
|
59
|
+
width: 'minmax(0, 1fr)',
|
|
60
|
+
cell: (item) => (
|
|
61
|
+
<Stack gap="xs">
|
|
62
|
+
<Text type="inherit" className="wrap-anywhere">{item.description}</Text>
|
|
63
|
+
<Text tag="span" size="xs" type="secondary">
|
|
64
|
+
<NumberValue value={item.qty} /> × <Money amount={item.price} currency="EUR" />
|
|
65
|
+
</Text>
|
|
66
|
+
</Stack>
|
|
67
|
+
),
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
id: 'line-total',
|
|
71
|
+
header: 'Line total',
|
|
72
|
+
width: 'max-content',
|
|
73
|
+
align: 'right',
|
|
74
|
+
cell: (item) => <Money type="inherit" amount={item.total} currency="EUR" weight="regular" />,
|
|
75
|
+
},
|
|
76
|
+
];
|
|
77
|
+
|
|
78
|
+
return (
|
|
79
|
+
<InvoiceLineItems
|
|
80
|
+
items={[
|
|
81
|
+
{ description: 'Design services', qty: 1, price: 335, total: 335 },
|
|
82
|
+
{ description: 'Research workshop', qty: 2, price: 380, total: 760 },
|
|
83
|
+
{ description: 'Implementation support', qty: 3, price: 425, total: 1275 },
|
|
84
|
+
]}
|
|
85
|
+
columns={serviceColumns}
|
|
86
|
+
footerRows={[
|
|
87
|
+
{ label: 'Subtotal', value: <Money type="inherit" amount={2370} currency="EUR" weight="regular" /> },
|
|
88
|
+
{ label: 'VAT (20%)', value: <Money type="inherit" amount={474} currency="EUR" weight="regular" /> },
|
|
89
|
+
// emphasis controls the label/spacing; this React-node value owns its weight.
|
|
90
|
+
{ label: 'Invoice total', value: <Money type="inherit" amount={2844} currency="EUR" weight="bold" />, emphasis: 'total' },
|
|
91
|
+
]}
|
|
92
|
+
/>
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export interface OrderFulfillmentDetailProps {
|
|
97
|
+
/** Requests fulfillment of the open group; the app accepts and reloads the order. */
|
|
98
|
+
onFulfill: () => void;
|
|
99
|
+
onPrintPackingSlip: () => void;
|
|
100
|
+
/** Opens the app's refund workflow, for example in an ActionDrawer. */
|
|
101
|
+
onRefund: () => void;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* One order route: Page owns the heading and commands, each subject is framed
|
|
106
|
+
* once, and the buyer and payment ledger sit in the aside. Mock accepted values.
|
|
107
|
+
*/
|
|
108
|
+
export function OrderFulfillmentDetail({ onFulfill, onPrintPackingSlip, onRefund }: OrderFulfillmentDetailProps) {
|
|
109
|
+
return (
|
|
110
|
+
<Page
|
|
111
|
+
header={{
|
|
112
|
+
title: 'Order #1042',
|
|
113
|
+
slots: { titleSuffix: <><Badge tone="warning">Partially fulfilled</Badge><Badge tone="success">Paid</Badge></> },
|
|
114
|
+
primaryAction: { label: 'Fulfill items', onClick: onFulfill },
|
|
115
|
+
secondaryActions: [{ label: 'Print packing slip', onClick: onPrintPackingSlip }, { label: 'Refund', onClick: onRefund }],
|
|
116
|
+
}}
|
|
117
|
+
aside={(
|
|
118
|
+
<>
|
|
119
|
+
<OrderCustomer
|
|
120
|
+
surface="card"
|
|
121
|
+
name="Ava Chen"
|
|
122
|
+
email="ava.chen@example.com"
|
|
123
|
+
orderCount={4}
|
|
124
|
+
shippingAddress={{ name: 'Ava Chen', line1: '18 Ermou Street', city: 'Athens', postalCode: '105 63', country: 'Greece' }}
|
|
125
|
+
billingSameAsShipping
|
|
126
|
+
/>
|
|
127
|
+
<OrderSummary
|
|
128
|
+
surface="card"
|
|
129
|
+
goods={[{ label: 'Subtotal', amount: '€104.00' }, { label: 'Shipping', amount: '€6.50' }]}
|
|
130
|
+
total={{ label: 'Total', amount: '€110.50' }}
|
|
131
|
+
payments={[{ label: 'Paid by card', amount: '€110.50' }]}
|
|
132
|
+
paymentStatus="paid"
|
|
133
|
+
/>
|
|
134
|
+
<OrderTransactions
|
|
135
|
+
surface="card"
|
|
136
|
+
transactions={[
|
|
137
|
+
{ id: 'auth', kind: 'authorization', status: 'success', amount: '€110.50', processedAt: '12 Oct, 09:14', method: 'Visa •••• 4242' },
|
|
138
|
+
{ id: 'capture', kind: 'capture', status: 'success', amount: '€110.50', processedAt: '12 Oct, 09:15', reference: 'ch_3PqL2x' },
|
|
139
|
+
]}
|
|
140
|
+
/>
|
|
141
|
+
</>
|
|
142
|
+
)}
|
|
143
|
+
>
|
|
144
|
+
<Alert tone="warning">
|
|
145
|
+
<AlertTitle>Confirm the delivery address</AlertTitle>
|
|
146
|
+
<AlertDescription>The courier flagged the postal code; confirm it with the customer before the Athens parcel ships.</AlertDescription>
|
|
147
|
+
</Alert>
|
|
148
|
+
<FulfillmentGroup
|
|
149
|
+
status="unfulfilled"
|
|
150
|
+
location="Athens warehouse"
|
|
151
|
+
items={[{ id: 'shirt', title: 'Linen overshirt', variantTitle: 'Navy / M', sku: 'LIN-OVR-NVY-M', unitPrice: '€68.00', quantity: 1, total: '€68.00' }]}
|
|
152
|
+
actions={[{ id: 'fulfill', label: 'Fulfill items', onClick: onFulfill }, { id: 'slip', label: 'Print packing slip', onClick: onPrintPackingSlip }]}
|
|
153
|
+
/>
|
|
154
|
+
<FulfillmentGroup
|
|
155
|
+
status="fulfilled"
|
|
156
|
+
location="Thessaloniki store"
|
|
157
|
+
items={[{ id: 'mug', title: 'Stoneware mug', variantTitle: 'Salt', sku: 'MUG-STW-SALT', unitPrice: '€18.00', quantity: 2, total: '€36.00' }]}
|
|
158
|
+
/>
|
|
159
|
+
<ShipmentTracking
|
|
160
|
+
surface="card"
|
|
161
|
+
carrier="ACS Courier"
|
|
162
|
+
trackingNumber="7781 2290 114"
|
|
163
|
+
status="in_transit"
|
|
164
|
+
steps={[
|
|
165
|
+
{ label: 'Label created', done: true, timestamp: '12 Oct, 11:02' },
|
|
166
|
+
{ label: 'Picked up', done: true, timestamp: '12 Oct, 16:40' },
|
|
167
|
+
{ label: 'Out for delivery', done: false },
|
|
168
|
+
{ label: 'Delivered', done: false },
|
|
169
|
+
]}
|
|
170
|
+
/>
|
|
171
|
+
{/* OrderTimeline owns its title; the Card only frames it. */}
|
|
172
|
+
<Card>
|
|
173
|
+
<OrderTimeline
|
|
174
|
+
title="History"
|
|
175
|
+
events={[
|
|
176
|
+
{ id: 'placed', title: 'Order placed', timestamp: '12 Oct, 09:14', status: 'completed' },
|
|
177
|
+
{ id: 'shipped', title: 'Mugs shipped from Thessaloniki', timestamp: '12 Oct, 16:40', status: 'completed' },
|
|
178
|
+
{ id: 'athens', title: 'Overshirt awaiting fulfillment', timestamp: 'Now', status: 'current' },
|
|
179
|
+
]}
|
|
180
|
+
/>
|
|
181
|
+
</Card>
|
|
182
|
+
</Page>
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export interface ReceivableInvoiceDetailProps {
|
|
187
|
+
onRecordPayment: () => void;
|
|
188
|
+
onSendReminder: () => void;
|
|
189
|
+
onApplyCredit: () => void;
|
|
190
|
+
onExportPdf: () => void;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* One invoice route: the document Card is the only frame around its header,
|
|
195
|
+
* flat line items and ledger; settlement and history are separate subjects.
|
|
196
|
+
* Long secondary labels stay in the More actions menu beside the primary command.
|
|
197
|
+
*/
|
|
198
|
+
export function ReceivableInvoiceDetail({ onRecordPayment, onSendReminder, onApplyCredit, onExportPdf }: ReceivableInvoiceDetailProps) {
|
|
199
|
+
return (
|
|
200
|
+
<Page
|
|
201
|
+
header={{
|
|
202
|
+
title: 'INV-2026-118',
|
|
203
|
+
slots: { titleSuffix: <Badge tone="destructive">Overdue</Badge> },
|
|
204
|
+
primaryAction: { label: 'Record payment', onClick: onRecordPayment },
|
|
205
|
+
secondaryActions: [
|
|
206
|
+
{ label: 'Send reminder', onClick: onSendReminder },
|
|
207
|
+
{ label: 'Apply approved credit', onClick: onApplyCredit },
|
|
208
|
+
{ label: 'Export PDF', onClick: onExportPdf },
|
|
209
|
+
],
|
|
210
|
+
maxVisibleSecondaryActions: 1,
|
|
211
|
+
}}
|
|
212
|
+
aside={(
|
|
213
|
+
<>
|
|
214
|
+
<Card title="Settlement">
|
|
215
|
+
<SummaryPanel>
|
|
216
|
+
<AmountRow label="Invoice total" amount="€2,199.76" />
|
|
217
|
+
<AmountRow label="Bank transfer, 14 Oct" amount="€1,000.00" deduction />
|
|
218
|
+
<AmountRow label="Balance due" amount="€1,199.76" total rollup />
|
|
219
|
+
</SummaryPanel>
|
|
220
|
+
</Card>
|
|
221
|
+
<AddressCard
|
|
222
|
+
surface="card"
|
|
223
|
+
kind="billing"
|
|
224
|
+
name="Kalliope Studio IKE"
|
|
225
|
+
line1="42 Tsimiski Street"
|
|
226
|
+
city="Thessaloniki"
|
|
227
|
+
postalCode="546 23"
|
|
228
|
+
country="Greece"
|
|
229
|
+
/>
|
|
230
|
+
</>
|
|
231
|
+
)}
|
|
232
|
+
>
|
|
233
|
+
<Card>
|
|
234
|
+
<Stack gap="2xl">
|
|
235
|
+
<InvoiceHeader
|
|
236
|
+
invoiceNumber="INV-2026-118"
|
|
237
|
+
status="overdue"
|
|
238
|
+
from={{ name: 'Ledgerline Accounting', location: 'Athens' }}
|
|
239
|
+
to={{ name: 'Kalliope Studio IKE', location: 'Thessaloniki' }}
|
|
240
|
+
issuedDate="12 Oct 2026"
|
|
241
|
+
dueDate="26 Oct 2026"
|
|
242
|
+
amount="€1,199.76"
|
|
243
|
+
/>
|
|
244
|
+
<InvoiceLineItems
|
|
245
|
+
surface="flat"
|
|
246
|
+
currency="EUR"
|
|
247
|
+
items={[
|
|
248
|
+
{ description: 'Quarterly bookkeeping retainer, July to September 2026', qty: 1, price: 1275, total: 1275 },
|
|
249
|
+
{ description: 'Payroll processing (per employee)', qty: 14, price: 18.5, total: 259 },
|
|
250
|
+
{ description: 'VAT return preparation', qty: 1, price: 240, total: 240 },
|
|
251
|
+
]}
|
|
252
|
+
footerRows={[
|
|
253
|
+
{ label: 'Subtotal', value: <Money type="inherit" amount={1774} currency="EUR" weight="regular" /> },
|
|
254
|
+
{ label: 'VAT (24%)', value: <Money type="inherit" amount={425.76} currency="EUR" weight="regular" /> },
|
|
255
|
+
{ label: 'Invoice total', value: <Money type="inherit" amount={2199.76} currency="EUR" weight="bold" />, emphasis: 'total' },
|
|
256
|
+
]}
|
|
257
|
+
/>
|
|
258
|
+
</Stack>
|
|
259
|
+
</Card>
|
|
260
|
+
<Card title="Payment history">
|
|
261
|
+
<PaymentTimeline
|
|
262
|
+
events={[
|
|
263
|
+
{ label: 'Invoice issued', date: '12 Oct', icon: FileText, done: true },
|
|
264
|
+
{ label: 'Partial payment received', date: '14 Oct', amount: '€1,000.00', icon: CreditCard, done: true },
|
|
265
|
+
{ label: 'Reminder due', date: '28 Oct', icon: Send, done: false },
|
|
266
|
+
]}
|
|
267
|
+
/>
|
|
268
|
+
</Card>
|
|
269
|
+
</Page>
|
|
270
|
+
);
|
|
271
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import { Stack } from 'themelia-react-ui/base/structure';
|
|
3
|
+
import { InlineStat } from 'themelia-react-ui/blocks/data-display';
|
|
4
|
+
import { Money } from 'themelia-react-ui/primitives';
|
|
5
|
+
|
|
6
|
+
/** Card-free app content: its parent owns the subject title and any surface. */
|
|
7
|
+
export function AssessmentComparison({declared, assessed, currency, labels, actions}: {
|
|
8
|
+
declared: number;
|
|
9
|
+
assessed: number;
|
|
10
|
+
currency: string;
|
|
11
|
+
labels: {declared: string; assessed: string};
|
|
12
|
+
actions?: ReactNode;
|
|
13
|
+
}) {
|
|
14
|
+
return <Stack gap="xl" className="@container min-w-0">
|
|
15
|
+
<div className="grid min-w-0 grid-cols-1 gap-space-xl @lg:grid-cols-2">
|
|
16
|
+
<InlineStat layout="stacked" label={labels.declared} value={<Money amount={declared} currency={currency} />} />
|
|
17
|
+
<InlineStat layout="stacked" label={labels.assessed} value={<Money amount={assessed} currency={currency} />} />
|
|
18
|
+
</div>
|
|
19
|
+
{actions && <Stack direction="horizontal" justify="end" gap="md">{actions}</Stack>}
|
|
20
|
+
</Stack>;
|
|
21
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { useState, type ReactNode } from 'react';
|
|
2
|
+
import { Badge } from 'themelia-react-ui/base/badge';
|
|
2
3
|
import { Button } from 'themelia-react-ui/base/buttons';
|
|
3
4
|
import { Card } from 'themelia-react-ui/base/cards';
|
|
4
5
|
import { MetadataList } from 'themelia-react-ui/base/metadata-list';
|
|
@@ -21,7 +22,7 @@ export interface AccountDetailProps {
|
|
|
21
22
|
|
|
22
23
|
/** One framed subject for a drawer or dashboard: one quick control, no page chrome. */
|
|
23
24
|
export function AccountDetail({ account, onEdit }: AccountDetailProps) {
|
|
24
|
-
return <Card title={account.name}
|
|
25
|
+
return <Card title={account.name}
|
|
25
26
|
headerAction={<Button onClick={() => onEdit(account.id)}>Edit</Button>}>
|
|
26
27
|
<AccountFacts account={account}/>
|
|
27
28
|
</Card>;
|
|
@@ -52,9 +53,9 @@ export function AccountDetailPage({ account, onEdit, onBack, section, onSectionC
|
|
|
52
53
|
{ label: 'Send statement', onClick: () => onSendStatement(account.id) },
|
|
53
54
|
{ label: 'Delete account', destructive: true, onClick: () => { setError(undefined); deletion.show(); } },
|
|
54
55
|
];
|
|
55
|
-
return <Page header={{
|
|
56
|
+
return <Page narrow header={{
|
|
56
57
|
title: account.name, onBack, backLabel: 'Back to accounts',
|
|
57
|
-
|
|
58
|
+
slots: { titleSuffix: account.overdue ? <Badge tone="warning">Overdue</Badge> : null },
|
|
58
59
|
primaryAction: { label: 'Edit account', onClick: () => onEdit(account.id) },
|
|
59
60
|
secondaryActions: commands,
|
|
60
61
|
tabs: {
|
|
@@ -68,7 +69,7 @@ export function AccountDetailPage({ account, onEdit, onBack, section, onSectionC
|
|
|
68
69
|
},
|
|
69
70
|
}}>
|
|
70
71
|
{section === 'overview'
|
|
71
|
-
? <Card title="Contact and billing"
|
|
72
|
+
? <Card title="Contact and billing"><AccountFacts account={account}/></Card>
|
|
72
73
|
: children}
|
|
73
74
|
<ConfirmDialog {...deletion.overlayProps} destructive
|
|
74
75
|
title={`Delete ${account.name}?`} description="This permanently removes the account."
|