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,106 @@
|
|
|
1
|
+
# Executable composition mapping
|
|
2
|
+
|
|
3
|
+
Use this when a screen needs several cooperating owners or when a component's
|
|
4
|
+
surface and placement are unclear. The mapper resolves explicit responsibilities
|
|
5
|
+
into exact public components and supported regions. The application still decides
|
|
6
|
+
the user's priorities, data, commands and meaningful grouping.
|
|
7
|
+
|
|
8
|
+
First resolve the installed package and verify copied guidance using
|
|
9
|
+
[installed setup](installation.md). These commands assume its conventional
|
|
10
|
+
`node_modules` location:
|
|
11
|
+
|
|
12
|
+
```sh
|
|
13
|
+
node node_modules/themelia-react-ui/docs/consumer-skill/scripts/map-composition.mjs --roles
|
|
14
|
+
node node_modules/themelia-react-ui/docs/consumer-skill/scripts/map-composition.mjs --role facts
|
|
15
|
+
node node_modules/themelia-react-ui/docs/consumer-skill/scripts/map-composition.mjs --pattern record-detail --main invoice-lines --aside facts
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
For a complete copied bundle, use the shared skill's
|
|
19
|
+
`scripts/map-composition.mjs` instead. It resolves `public-api.json` and
|
|
20
|
+
`component-contracts.json` beside that script's shared references, independently
|
|
21
|
+
of the current directory. Node is sufficient; the mapper does not load React,
|
|
22
|
+
TypeScript, optional component peers or the consumer's application code.
|
|
23
|
+
|
|
24
|
+
## Describe responsibilities, then inspect the plan
|
|
25
|
+
|
|
26
|
+
1. Turn the business brief into independent subjects: for example invoice lines
|
|
27
|
+
in the main region and record facts in the supporting region. A responsibility
|
|
28
|
+
is a role tag reported by `--roles`; a complete business brief is not a role.
|
|
29
|
+
2. Use `--role` to inspect a role's mapped owners. Role names accept spaces or
|
|
30
|
+
kebab-case. A phrase that matches no role stays `unresolved` and may list
|
|
31
|
+
`suggestedRoles` that share its words; retry with one of them only when it
|
|
32
|
+
names the same job. A qualified `themelia-react-ui/<family>#<Symbol>` selector chooses
|
|
33
|
+
an exact mapped contract when a role has several candidates.
|
|
34
|
+
3. Select a pattern and repeat `--main` or `--aside` for each subject. Supported
|
|
35
|
+
patterns are `record-detail`, `collection`, `edit`, `analytics` and `embedded`.
|
|
36
|
+
They identify structural context; they do not install form state, fetch data
|
|
37
|
+
or choose application-specific variants. Edit plans explicitly retain the
|
|
38
|
+
application's native form and submission requirements.
|
|
39
|
+
Use `--limit 1..10` to bound candidate details; it does not discard requested
|
|
40
|
+
subjects or hide unresolved coverage.
|
|
41
|
+
4. Read `tree`, `coverage`, `unresolved`, `warnings`, `requiredPeers`,
|
|
42
|
+
`applicationOwns` and the focused `nextReads` before implementing. Inspect each
|
|
43
|
+
chosen unfamiliar component with the [API inspector](discovery.md#inspect-a-selected-component).
|
|
44
|
+
|
|
45
|
+
`requiredPeers` lists the selected families' additional optional package peers;
|
|
46
|
+
`baselinePeers` lists the package's nonoptional peers. Both still require the
|
|
47
|
+
installed setup and matching versions. An empty additional list does not remove
|
|
48
|
+
React or Base UI requirements.
|
|
49
|
+
|
|
50
|
+
The record-detail example resolves a route owner and, because support is
|
|
51
|
+
requested, Page's mapped aside slot. Without support, edit/detail plans recommend narrow when its contract supports that prop. Its `tree.slots` uses actual insertion props
|
|
52
|
+
such as `children` and Page's direct `aside`. Older bundles without Page aside anatomy retain their explicit main/support layout. Parent-surface content can receive a
|
|
53
|
+
subject Card at that boundary. Already framed owners keep their own surface;
|
|
54
|
+
variant-dependent owners require inspection before choosing framing.
|
|
55
|
+
|
|
56
|
+
Collection plans can place an explicit toolbar need in the table seam:
|
|
57
|
+
|
|
58
|
+
```sh
|
|
59
|
+
node node_modules/themelia-react-ui/docs/consumer-skill/scripts/map-composition.mjs --pattern collection --main comparison-table --main query-toolbar
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
The mapped FilterLayout goes into DataTable's topbarContent with compact/clear
|
|
63
|
+
props, and the mapped FilterProvider wraps that table. Supply its definitions,
|
|
64
|
+
activeFilters and onFilterChange using the app's query transport. Toolbar order
|
|
65
|
+
in the request does not matter. Missing/ambiguous table seams or context mappings
|
|
66
|
+
remain unresolved; no detached filter strip or guessed provider is emitted.
|
|
67
|
+
|
|
68
|
+
For an existing Card boundary:
|
|
69
|
+
|
|
70
|
+
```sh
|
|
71
|
+
node node_modules/themelia-react-ui/docs/consumer-skill/scripts/map-composition.mjs --pattern embedded --parent Card --main facts
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
That plan uses the selected host's `children` region without adding another Page
|
|
75
|
+
or Card. Qualify an ambiguous parent with `--import <exact public import>`.
|
|
76
|
+
An embedded request without a parent leaves the host decision explicit; inspect
|
|
77
|
+
its unresolved ownership before creating a new boundary.
|
|
78
|
+
Only an explicitly declared route-child slot permits a Page inside a shell;
|
|
79
|
+
AuthShell and bounded workspaces are ordinary content hosts. Variant-dependent
|
|
80
|
+
hosts retain inspection warnings before another framed subject is added.
|
|
81
|
+
|
|
82
|
+
## Read the result's scope
|
|
83
|
+
|
|
84
|
+
The output is advisory JSON. `mapped` means the requested roles resolved under
|
|
85
|
+
the mapper's supported contracts. It does not mean an application is implemented,
|
|
86
|
+
accessible, visually accepted or ready for delivery. `partial` and `unresolved`
|
|
87
|
+
retain requests the mapper could not place or uniquely identify; choose a more
|
|
88
|
+
specific role or qualified mapped owner. Metadata coverage is deliberately
|
|
89
|
+
explicit: an unmapped component can still be a valid public component.
|
|
90
|
+
|
|
91
|
+
Mappings belong to exact import/symbol pairs in the existing authored catalogue,
|
|
92
|
+
then flow into its generated public index. They describe role tags, owner kind,
|
|
93
|
+
region/cell/overlay placement, surface ownership, insertion props and any authored
|
|
94
|
+
literal recommendations. Generation checks them against the actual public API.
|
|
95
|
+
They do not introduce another theme, token system or component registry.
|
|
96
|
+
|
|
97
|
+
Table-cell identities stay in column renderers, and overlays stay at their
|
|
98
|
+
composing app/feature boundary. Similar collection owners remain alternatives;
|
|
99
|
+
a request that cannot distinguish them stays unresolved. App data, callbacks,
|
|
100
|
+
permissions, forms and asynchronous lifecycle still follow the selected owner's
|
|
101
|
+
contract and matching recipe.
|
|
102
|
+
|
|
103
|
+
Use [composition ownership](composition.md), [screen archetypes](screen-archetypes.md)
|
|
104
|
+
and [form workflows](rhf-workflows.md) for the selected task. After implementing,
|
|
105
|
+
run the existing source checker and app checks, inspect narrow/wide light/dark
|
|
106
|
+
appearance, and execute the relevant interactions from [review](review.md).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Composition
|
|
2
2
|
|
|
3
|
-
The [design contract](design-contract.md) separates application layout freedom
|
|
3
|
+
The [design contract](design-contract.md#semantic-roles) defines shared spacing and typography roles and separates application layout freedom
|
|
4
4
|
from library-owned anatomy. Use supported props and slots inside shared surfaces;
|
|
5
5
|
keep placement, width, wrapping and overflow with the surrounding composition.
|
|
6
6
|
|
|
@@ -16,6 +16,12 @@ keep placement, width, wrapping and overflow with the surrounding composition.
|
|
|
16
16
|
| Reusable subject presentation | Blocks |
|
|
17
17
|
| Editing/selection/async lifecycle | Features with app callbacks |
|
|
18
18
|
|
|
19
|
+
Base controls, layouts and blocks also own their local interaction and
|
|
20
|
+
accessibility; features coordinate a complete business workflow. For choosing
|
|
21
|
+
compound APIs and building token-backed app content, read
|
|
22
|
+
[app-owned composites](custom-composition.md). It includes disclosure sections,
|
|
23
|
+
layer boundaries and a custom comparison seam.
|
|
24
|
+
|
|
19
25
|
## Compose from the task
|
|
20
26
|
|
|
21
27
|
Identify the user's next decision before selecting components. Establish fixed
|
|
@@ -29,11 +35,11 @@ a detail workspace or a form; they need different information hierarchies.
|
|
|
29
35
|
| DataView | Its coordinated query, view and collection lifecycle fits | DataTable with app-owned query transport and native toolbar slots when coordination differs; base Table for presentation without TanStack behavior |
|
|
30
36
|
| ResourceCell | Identity inside a table cell | Item for independent list entries; MetadataList for label/value facts about one subject |
|
|
31
37
|
| Page / application shell | Route identity, navigation, content bounds and page commands | Card for an independent subject within that route; do not repeat the same heading merely to frame a table |
|
|
32
|
-
| Card | One subject needs a frame and headed regions | `surface="flat" padding="none"` inside an existing boundary;
|
|
38
|
+
| Card | One subject needs a frame and headed regions | `surface="flat" padding="none"` inside an existing boundary; prefer DataTable directly in the layout, or Card padding="none" with a flat table |
|
|
33
39
|
| Metric / MetricGrid / MetricBar | A KPI needs formatted value, comparison/trend or peer layout | UsageCard for used/limit quotas; InlineStat for one plain fact, MetadataList for several record facts |
|
|
34
40
|
| FormField / InlineEdit | A field needs label/hint/error, or isolated save/cancel | Complete feature/overlay for a workflow; app form owns whole-record submission |
|
|
35
41
|
|
|
36
|
-
For a DataTable composition, put
|
|
42
|
+
For a DataTable composition, wrap it in FilterProvider and put `FilterLayout variant="compact" showClearFilters` in `topbarContent`, exports or collection
|
|
37
43
|
tools in `topbarEnd`, selection commands in `bulkActions`, and record commands
|
|
38
44
|
in `rowActions`. `bulkActions` render in the shared `BatchActionBar`, docked to
|
|
39
45
|
the viewport while rows are selected (`selectionToolbarPlacement="inline"` keeps
|
|
@@ -57,18 +63,22 @@ or supported comparison controls. Avoid automatically appending every hidden
|
|
|
57
63
|
column to identity metadata. There is no universal row-line limit: long names,
|
|
58
64
|
accessibility needs and the task can justify richer rows. Explain the priority.
|
|
59
65
|
Custom ResourceCell metadata is caller content; use shared supporting typography
|
|
60
|
-
and CellStack where its smaller secondary-value contract fits.
|
|
66
|
+
and CellStack where its smaller secondary-value contract fits. ResourceCell draws
|
|
67
|
+
its media circle only when you pass `imageUrl`, `icon` or `fallback`: order and
|
|
68
|
+
invoice identifiers stay plain text, and a person opts in with
|
|
69
|
+
`fallback={<Initials value={name} />}`.
|
|
61
70
|
|
|
62
71
|
Commands need explicit importance as well as scope. Describe page commands by
|
|
63
72
|
role in Page's header: `primaryAction` is the route's one main command, and
|
|
64
73
|
`secondaryActions` lists supporting commands in priority order. The header owns
|
|
65
74
|
their treatment and order: outline secondary buttons, the solid primary button,
|
|
66
75
|
then a More actions menu for overflow, destructive commands and narrow screens,
|
|
67
|
-
which always ends the row.
|
|
76
|
+
which always ends the desktop row. Below 40rem of actual header width, every
|
|
77
|
+
command, including primary, moves into one More actions menu. WorkspaceRecordHeader, ResourceHeader, the resource
|
|
68
78
|
shells and SettingsShell take the same props and render the same row. Choosing which
|
|
69
79
|
command is primary, which are `destructive`, and which are `visible` remains an
|
|
70
80
|
application decision; confirm destructive commands in their handler. Use
|
|
71
|
-
`actions`
|
|
81
|
+
the compatible direct `actions` prop for non-command controls such as a period select. A back link,
|
|
72
82
|
export and destructive command should not all inherit the same visual emphasis.
|
|
73
83
|
|
|
74
84
|
```tsx
|
|
@@ -82,7 +92,8 @@ export and destructive command should not all inherit the same visual emphasis.
|
|
|
82
92
|
}}>{/* route content */}</Page>
|
|
83
93
|
```
|
|
84
94
|
|
|
85
|
-
|
|
95
|
+
When a record has separately selected or routed sections, use `header.tabs`.
|
|
96
|
+
A continuous detail document can keep its sections in the body. The tabs sit under the header's
|
|
86
97
|
copy and commands, a `badge` shows a count, tabs that do not fit move into a More
|
|
87
98
|
menu, and `onValueChange` switches the section or routes. Labels name the
|
|
88
99
|
command; an icon on every command repeats it, so keep `+` on an add command and
|
|
@@ -91,7 +102,7 @@ leave the others plain.
|
|
|
91
102
|
```tsx
|
|
92
103
|
<Page header={{
|
|
93
104
|
title: member.name,
|
|
94
|
-
|
|
105
|
+
slots: { titleSuffix: <Badge tone="warning">Needs attention</Badge> },
|
|
95
106
|
primaryAction: { label: 'Generate report', onClick: onReport },
|
|
96
107
|
secondaryActions: [
|
|
97
108
|
{ label: 'Update profile', onClick: onEdit },
|
|
@@ -209,7 +220,7 @@ See the [website example](../examples/website.tsx) for both hero and section emp
|
|
|
209
220
|
|
|
210
221
|
## Card anatomy
|
|
211
222
|
|
|
212
|
-
Card surface="card" is the ordinary bordered surface; surface="framed" retains its ring recipe; surface="flat" padding="none" composes within an existing boundary. headerPlacement="frame" places title/icon/actions above an inset body, retaining
|
|
223
|
+
Card surface="card" is the ordinary bordered surface; surface="framed" retains its ring recipe; surface="flat" padding="none" composes within an existing boundary. headerPlacement="frame" places title/icon/actions above an inset body, retaining the surface corner and using rounded-radius on that body.
|
|
213
224
|
|
|
214
225
|
Choose one ordinary Card surface through UIProvider's `card.defaultSurface` and
|
|
215
226
|
let sibling subjects inherit it. Explicit per-card surfaces win: mixing `card`
|
|
@@ -222,21 +233,39 @@ for richer content. Facts and rows follow the same rule: one glyph repeated on
|
|
|
222
233
|
every MetadataList item or Item row is decoration, so leave `icon`/media empty.
|
|
223
234
|
|
|
224
235
|
Card `gap` owns spacing between regions; `contentGap` owns direct body-child
|
|
225
|
-
spacing; `textGap` owns title/supporting-copy rhythm.
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
236
|
+
spacing; `textGap` owns title/supporting-copy rhythm. Body children default to
|
|
237
|
+
the shared related `xl` gap (16px at default roots).
|
|
238
|
+
Use `contentGap="2xl"` for
|
|
239
|
+
independent sections. Omit it around an existing Grid/Stack or a single feature
|
|
240
|
+
that already owns its layout:
|
|
241
|
+
|
|
242
|
+
```tsx
|
|
243
|
+
<Card title="Billing" contentGap="xl">
|
|
244
|
+
<MetadataList columns={1} items={[
|
|
245
|
+
{ label: 'Plan', value: 'Studio' },
|
|
246
|
+
{ label: 'Billing cycle', value: 'Monthly' },
|
|
247
|
+
]} />
|
|
248
|
+
<Text type="secondary" size="xs">Invoices go to billing@northstar.example.</Text>
|
|
249
|
+
</Card>
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
This lets Card own body rhythm without an extra caller wrapper. For independent sections,
|
|
253
|
+
change the Card to `contentGap="2xl"` and let each section own its heading/copy
|
|
254
|
+
group. The default regional gap
|
|
255
|
+
follows the surface inset tier: 12px with `padding="sm"`, 24px with omitted/`md`
|
|
256
|
+
or `none`, and 32px with `lg`, before spacing scale. An explicit semantic `gap`
|
|
257
|
+
overrides it without changing the insets. See [semantic roles](design-contract.md#semantic-roles).
|
|
258
|
+
|
|
259
|
+
Ordinary independent cards omit `padding` and retain `md` (24px at default
|
|
260
|
+
roots). Card supports `sm` (12px), `md` (24px), `lg` (32px) and `none` (no inset).
|
|
261
|
+
The general surface scale also has a 16px tier; Card does not expose it as a padding prop.
|
|
262
|
+
Component size and density do not choose Card padding. All tiers follow the
|
|
263
|
+
surface roots and space-scale.
|
|
264
|
+
Card defaults to `surface="card"`, with no header rule and a footer rule.
|
|
265
|
+
Flat, card-free structure and a `headerPlacement="frame"` header draw no rule
|
|
266
|
+
unless asked. UIProvider's `card.defaultHeaderDivider` (false) and
|
|
267
|
+
`card.defaultFooterDivider` (true) configure these rules app-wide; explicit
|
|
268
|
+
per-card booleans win. Header/footer-only cards render one shared divider.
|
|
240
269
|
Inside the body, separate a card's sections with `contentGap` or a Stack gap
|
|
241
270
|
clearly larger than the row gap (`2xl` between sections), not rules.
|
|
242
271
|
Overlays rule their regions the same way: `ActionDialog`, `ActionDrawer` and `ConfirmDialog`
|
|
@@ -306,26 +335,27 @@ primitives rather than replacing labels and values with undifferentiated Text.
|
|
|
306
335
|
|
|
307
336
|
## Menus and controls
|
|
308
337
|
|
|
309
|
-
PopoverContent type="display" owns substantive-content padding; type="menu" compact collection padding around already-padded rows. Popover and Command share inset="default" and inset="compact" paradigms. Mixed searchable shells use inset="flush"; public header/search/list/footer anatomy owns its insets automatically. CommandInput composes the public Input for control geometry and focus styling; its search region adds only outer spacing. Do not pass padding through className, contentClassName or inline styles. Compact header controls and footer actions align with row highlight edges; header text and footer captions
|
|
338
|
+
PopoverContent type="display" owns substantive-content padding; type="menu" compact collection padding around already-padded rows. Popover and Command share inset="default" and inset="compact" paradigms. Mixed searchable shells use inset="flush"; public header/search/list/footer anatomy owns its insets automatically. CommandInput composes the public Input for control geometry and focus styling; its search region adds only outer spacing. Do not pass padding through className, contentClassName or inline styles. Compact header controls and footer actions align with row highlight edges and the search field; header text and footer captions sit one small step inside that edge. Use PopoverHeader start for a leading control and PopoverFooter caption for supporting content alongside trailing action children. Dividers use the same semantic recipe. density selects vertical row rhythm without changing inline padding. ActionMenu owns action definitions, PopoverMenu searchable selection, DropdownMenu bespoke menu anatomy. Shared appearance preserves their accessible menu/listbox/dialog behavior.
|
|
310
339
|
|
|
311
340
|
| Choice | Responsibility |
|
|
312
341
|
| --- | --- |
|
|
313
342
|
| PopoverContent type="display" / type="menu" | Display versus collection anatomy and typography |
|
|
314
|
-
| inset="default" / "compact" |
|
|
343
|
+
| inset="default" / "compact" | Rich surface inset versus small collection shell |
|
|
315
344
|
| inset="flush" | Delegate insets to owned regions; not a density |
|
|
316
345
|
| density="compact" / "default" / "comfortable" | Collection row block rhythm, independent from inline spacing |
|
|
317
346
|
| size="sm" / "md" / "lg" | Supported control's scale; consult its declaration and provider precedence |
|
|
318
347
|
|
|
319
|
-
Input, Button, Select
|
|
320
|
-
and corresponding heights; Card and popup shells use the
|
|
348
|
+
Input, Button, Select, filter-facet triggers and badges share the default
|
|
349
|
+
`rounded-radius` corner and corresponding heights; Card and popup shells use the
|
|
350
|
+
larger `rounded-surface`. Omitted sizes inherit the provider; explicit sizes win.
|
|
321
351
|
Keep action/control roots equal when those controls adjoin. Compact menu rows,
|
|
322
|
-
surface insets and control sizes remain independent; density
|
|
323
|
-
|
|
352
|
+
surface insets and control sizes remain independent; density does not change
|
|
353
|
+
the corner.
|
|
324
354
|
Inset segmented children use the supported compound owner's same-height frame.
|
|
325
355
|
|
|
326
356
|
PopoverContent defaults to display/default; Command defaults to compact. An explicit PopoverContent type controls anatomy; explicit inset controls padding and takes precedence over the type's inferred inset. Without type, compact implies menu, other insets imply display. Put type="menu" inset="flush" on PopoverContent for a headed searchable picker. Popover is the interaction root and receives no surface props. PopoverMenu already assembles that picker anatomy; use its declared selection/search props. ComboboxPopup is flush because ComboboxList owns its inset. Do not add another wrapper inset around a normal collection list.
|
|
327
357
|
|
|
328
|
-
At shipped roots, compact shell padding is 8px; row inline padding is 12px; default row block padding is 8px and minimum height
|
|
358
|
+
At shipped roots, rich display padding is 24px and compact collection shell padding is 8px; row inline padding is 12px; default row block padding is 8px and minimum height 32px. Compact/comfortable rows use 6/10px block padding and 32/40px minimum heights. Content can grow when it wraps. These are token-derived measurements, not app constants. Flush compact header/footer shell padding matches the list (4px inline). Header text and footer captions add a small xs step (4px) to the md band inset (8px), rather than the full row inset. Actions keep the 4px shell edge. Nested public slots do not repeat these insets.
|
|
329
359
|
|
|
330
360
|
Input frames and outline buttons share the input semantic token; collection dividers use border/60; focus uses ring separately and draws one indicator everywhere (a full-strength edge inside a soft halo). Equal responsibilities share recipes, while different semantic roles retain their own treatment. CommandInput keeps its existing onValueChange search contract and native refs; use the actual public Input through its default composition rather than restyling an unframed native field.
|
|
331
361
|
|
|
@@ -427,6 +457,40 @@ to the existing shell and retains its typed slots; topbar props and toolbar
|
|
|
427
457
|
props are specific to their variants. The low-level TopbarSidebarLayout,
|
|
428
458
|
SidebarInsetLayout and StackedLayout remain available for deliberate composition.
|
|
429
459
|
|
|
460
|
+
Choose the structure before its options: a global Header above navigation, a
|
|
461
|
+
full-height AppSidebar beside the content Header, or the shadcn-style inset page
|
|
462
|
+
beside navigation. The catalogue leads with these three structures and reuses
|
|
463
|
+
the exact AppSidebar example from the Sidebar page. Single/dual navigation,
|
|
464
|
+
attached/floating frames and icon/offcanvas collapse configure a structure.
|
|
465
|
+
Example child destinations are text-only; an explicit child icon is reserved
|
|
466
|
+
for a case where it carries information.
|
|
467
|
+
|
|
468
|
+
Header-first light/dark variants accept `contentSurface="inset"` for a quiet
|
|
469
|
+
secondary canvas around the card-colored main surface; omission keeps plain.
|
|
470
|
+
SidebarInsetLayout retains `surface="inset" | "flush"`, and the sidebar/inset
|
|
471
|
+
presets retain their defaults. AppSidebar/LayoutSidebar `surface="transparent"`
|
|
472
|
+
shares the docked canvas; drawer surfaces remain opaque. This uses the existing
|
|
473
|
+
theme roles and structural roots.
|
|
474
|
+
|
|
475
|
+
The shared global header-height root defaults to 4rem. Use the playground's
|
|
476
|
+
full-viewport `?page=shells&layout=header|sidebar|inset` views to inspect
|
|
477
|
+
the composition, optionally with `&theme=dark`.
|
|
478
|
+
|
|
479
|
+
Sidebar shells accept `slots.sidebar` (primary) and `slots.secondarySidebar`
|
|
480
|
+
(contextual navigation). Each missing region removes its track. `sidebarWidth`
|
|
481
|
+
and `secondarySidebarWidth` size their own expanded region, with the
|
|
482
|
+
shared shell width as fallback. `sidebarPresentation="rail"` selects dedicated
|
|
483
|
+
primary navigation geometry independently of full-sidebar icon collapse. Use SidebarNavigationRail from
|
|
484
|
+
layout/sidebar for area navigation with items, value/onValueChange and
|
|
485
|
+
renderLink; it preserves accessible labels/tooltips and defaults to
|
|
486
|
+
collapsible="none". Its default background surface and divider distinguish it
|
|
487
|
+
from the contextual canvas. The 48px default derives from a 32px action plus
|
|
488
|
+
two 8px insets; full-sidebar icon collapse remains 60px. These are private
|
|
489
|
+
recipes, not extra consumer knobs. SidebarRail remains the collapse affordance.
|
|
490
|
+
The rail also accepts header, beforeNavigation, afterNavigation and footer
|
|
491
|
+
nodes or render callbacks with named state. Header/footer are pinned;
|
|
492
|
+
before/after content scrolls with its navigation.
|
|
493
|
+
|
|
430
494
|
The shell owns one PageViewport and framing. Give the root a constrained height
|
|
431
495
|
(`h-svh min-h-0` for full-screen apps). Page owns width, page gutters and
|
|
432
496
|
header/body rhythm, Card owns its insets, and Stack/Grid owns peer gaps. With
|
|
@@ -434,12 +498,49 @@ stacked/contained content, use Page gutter="none" to avoid repeating the shell's
|
|
|
434
498
|
Container gutter. Metric card size changes copy/media scale, keeping the default
|
|
435
499
|
surface inset in ready, loading and error states.
|
|
436
500
|
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
501
|
+
Keep the dual area rail docked on the left beside the full navigation panel,
|
|
502
|
+
and choose that panel's AppSidebar/LayoutSidebar `collapsible` independently
|
|
503
|
+
of its skin or AppLayout variant. `icon` minimizes it to a second compact
|
|
504
|
+
column, `offcanvas` hides it and leaves only the original rail, and `none`
|
|
505
|
+
keeps it expanded. Current examples default to `icon` and expose a preview
|
|
506
|
+
selector for the same modes; standalone navigation supports the same choice.
|
|
507
|
+
The primary area rail keeps its own `collapsible="none"` policy. One explicit
|
|
508
|
+
trigger controls the contextual panel; selecting an area opens it. At narrow widths the inline cluster pans a
|
|
509
|
+
minimum page canvas while its area rail stays pinned. It preserves the chosen
|
|
510
|
+
expansion state rather than silently minimizing. Do not repeat a contextual
|
|
511
|
+
group heading already supplied by its pinned
|
|
512
|
+
header. KPI peers use MetricGrid. Shared header/page/navigation recipes own the
|
|
513
|
+
spacing; Page remains the one page-padding owner.
|
|
514
|
+
|
|
515
|
+
Compose one LayoutSidebarProvider around the shell and its triggers. Shell slots
|
|
516
|
+
establish named scopes, so AppSidebar, LayoutSidebar and useLayoutSidebar() infer
|
|
517
|
+
their panel ID; ordinary compositions need no repeated IDs or nested provider.
|
|
518
|
+
Manual compositions can pass a panel ID explicitly. `SidebarTrigger panelId`
|
|
519
|
+
targets primary/secondary/aside; omission uses provider `navigationPanel`
|
|
520
|
+
(primary by default). That also selects the Ctrl/Command+B shortcut target;
|
|
521
|
+
keyboardShortcut changes the key or accepts false.
|
|
522
|
+
|
|
523
|
+
Desktop expansion uses openPanels/defaultOpenPanels/onOpenPanelsChange. Closed
|
|
524
|
+
icon panels leave a rail, offcanvas removes their track, and none remains visible.
|
|
525
|
+
Controlled openPanels wins over legacy primary open; otherwise open controls
|
|
526
|
+
primary and the provider owns other regions. defaultOpenPanels defines the
|
|
527
|
+
initial uncontrolled set; without it, defaultOpen keeps its primary meaning.
|
|
528
|
+
Primary changes notify onOpenChange and set changes notify onOpenPanelsChange.
|
|
529
|
+
The app accepts controlled proposals by updating the matching props; additional
|
|
530
|
+
persistence remains application-owned.
|
|
531
|
+
|
|
532
|
+
mobilePanel/onMobilePanelChange select one active undocked drawer, preserving
|
|
533
|
+
desktop preferences. Context presentation is docked/drawer; isMobile is its
|
|
534
|
+
drawer alias, including when a contextual panel undocks on a desktop viewport.
|
|
535
|
+
Other panel/drawer compositions retain default thresholds of 768/1024/1440px
|
|
536
|
+
for primary/secondary/aside against available shell width. The featured dual
|
|
537
|
+
cluster uses `mobileSidebarMode="inline"` to keep the rail and its adjacent
|
|
538
|
+
collapsible panel docked. Use adaptTo="container" on embedded providers to contain
|
|
539
|
+
their drawer and backdrop inside that provider. Essential
|
|
540
|
+
undocked regions need reachable targeted triggers. Account/search/page actions
|
|
541
|
+
remain application callbacks. Do not add another scroll viewport inside Page.
|
|
542
|
+
Use Header partials in shell slots to retain one header/inset owner. Header menus
|
|
543
|
+
retain the header theme through their portal host.
|
|
443
544
|
|
|
444
545
|
Header forwards native attributes, handlers and refs. PageHeader supports
|
|
445
546
|
textGap="normal" or "dense" without changing control or page insets. Header
|
|
@@ -448,11 +549,27 @@ TwoColumnLayout defaults to its existing viewport breakpoint; choose
|
|
|
448
549
|
adaptTo="container" inside Container/PageViewport to adapt at 48rem of usable
|
|
449
550
|
parent width while preserving main-before-aside DOM/focus order.
|
|
450
551
|
|
|
451
|
-
|
|
552
|
+
The installed [app-shell recipe](../examples/app-layout.tsx) exports a copyable
|
|
553
|
+
`WorkspaceLayout` that hosts route children directly. Put `AccountDetailPage` or
|
|
554
|
+
another route Page inside it. `WorkspaceExamplePage` separately demonstrates a
|
|
555
|
+
Workspace title, Create callback and narrow measure; replace that example when
|
|
556
|
+
composing a real route. `WorkspaceRegionsLayout` accepts primaryNavigation and
|
|
557
|
+
sidebarPresentation="rail" for a static SidebarNavigationRail beside contextual
|
|
558
|
+
navigation; omitted primaryNavigation builds the alternative grouped sidebar.
|
|
559
|
+
It coordinates controlled named state under one provider. The app's area rail
|
|
560
|
+
can use useLayoutSidebar('secondary') to open context when an area is selected.
|
|
561
|
+
A defined
|
|
562
|
+
secondarySidebar replacement wins over contextualNavigationGroups; null removes
|
|
563
|
+
that region. Without a replacement, groups build the standard AppSidebar with
|
|
564
|
+
`contextualCollapsible?: AppSidebarProps['collapsible']`, defaulting to `icon`.
|
|
565
|
+
Pass `offcanvas` to hide it or `none` to retain expanded navigation; a supplied
|
|
566
|
+
secondarySidebar owns its own policy. These recipe names are
|
|
567
|
+
local to the copied file; the public
|
|
568
|
+
`WorkspaceLayout` from `layout/workspace` is the record shell described below.
|
|
452
569
|
|
|
453
570
|
PageViewport owns scrolling and adds no padding. Page defaults to `gutter="lg"`
|
|
454
|
-
and `padding="lg"` (
|
|
455
|
-
`narrow` selects centered `md` width;
|
|
571
|
+
and `padding="lg"` (32px at shipped roots), so it owns inline/block space once.
|
|
572
|
+
`narrow` selects centered `md` width (48rem); otherwise an aside selects `xl` (80rem), and a single column uses `lg` (64rem). Explicit `maxWidth` wins over both. Header copy
|
|
456
573
|
defaults to dense; `textGap="normal"` is an explicit alternative. Do not assume
|
|
457
574
|
an app shell supplies gutters because it supplies a viewport. Set `gutter="none"`
|
|
458
575
|
only when an actual parent Container/surface supplies the inline inset, such as
|
|
@@ -460,14 +577,33 @@ StackedLayout's contained mode. Block padding remains independent.
|
|
|
460
577
|
That contained measure uses the same large gutter as Page; ordinary Container
|
|
461
578
|
defaults remain unchanged.
|
|
462
579
|
|
|
580
|
+
|
|
581
|
+
Page is the canonical route owner for new index/detail/edit screens. Its header
|
|
582
|
+
keeps title, description, back navigation, commands and tabs. Add content through
|
|
583
|
+
`header.slots.beforeTitle`, `titleSuffix`, `afterDescription` and `actions`.
|
|
584
|
+
Each accepts a React node or a callback receiving `{ renderLink, defaultContent }`.
|
|
585
|
+
Compose Badge for a title status and MetadataList for facts below the description;
|
|
586
|
+
there is no automatic metadata item shape or avatar column. Title, description and afterDescription stay in one tight left copy column;
|
|
587
|
+
actions occupy a separate right column aligned to the top. beforeTitle spans
|
|
588
|
+
above the columns, and tabs sit below. An actions renderer
|
|
589
|
+
can wrap or return `defaultContent` to retain the responsive command row; replacing
|
|
590
|
+
it owns its own command semantics. Legacy `slots.back`, `titleBadges`, `titleIcon`
|
|
591
|
+
and direct `actions` remain compatible. Direct toolbar, aside and lifecycle props compose at that
|
|
592
|
+
same boundary; explicit slots override matching direct regions. beforeHeader
|
|
593
|
+
precedes the header; afterHeader is the compatible toolbar fallback. Loading
|
|
594
|
+
precedes error, then empty, replacing only the main body while the header,
|
|
595
|
+
toolbar and aside remain mounted. Customize state strings or loading/error/empty
|
|
596
|
+
slots and wire onRetry. ResourceHeader/ResourceIndexShell/ResourceShowShell/
|
|
597
|
+
TabbedResourceShell retain legacy embedding behavior for migration.
|
|
598
|
+
|
|
463
599
|
Select width from the task: a single focused resource/form can use `narrow`;
|
|
464
|
-
a record with
|
|
465
|
-
TwoColumnLayout. A wide comparison/directory can deliberately use `maxWidth="full"`.
|
|
600
|
+
a record with supporting context uses Page `aside` and infers `xl` (80rem).
|
|
601
|
+
An explicit TwoColumnLayout inside Page should set `maxWidth="xl"`; it retains its own split contract. A wide comparison/directory can deliberately use `maxWidth="full"`.
|
|
466
602
|
Setting full on every route defeats the resource measure. Do not remove Page's
|
|
467
603
|
gutters to make its title touch the sidebar; align the header and body through
|
|
468
604
|
the same Page. Density, container measure and page inset are separate choices.
|
|
469
605
|
The [detail recipe](../examples/detail.tsx) includes `AccountDetailPage`: the
|
|
470
|
-
|
|
606
|
+
narrow record measure, a status badge, route-level commands and section tabs in
|
|
471
607
|
the header, and MetadataList facts in one framed Card, with no duplicated subject
|
|
472
608
|
header or gutter.
|
|
473
609
|
|
|
@@ -475,9 +611,23 @@ Compose HeaderUserMenu in topbar `slots.headerEnd` or a local toolbar, and
|
|
|
475
611
|
SidebarNavigationUser in AppSidebar `slots.footer` when account access belongs
|
|
476
612
|
in navigation. Use SidebarWorkspaceDropdown for workspace links, or add a
|
|
477
613
|
custom control through `slots.headerEnd` alongside the logo. `headerStart` and
|
|
478
|
-
`headerEnd` stay inside the padded, fixed header
|
|
479
|
-
|
|
480
|
-
|
|
614
|
+
`headerEnd` stay inside the padded, fixed header. The four header,
|
|
615
|
+
beforeNavigation, afterNavigation and footer slots accept nodes or callbacks
|
|
616
|
+
receiving `{ panelId, collapsed, presentation, isMobile, renderLink, defaultContent }`.
|
|
617
|
+
A legacy header node replaces the entire header; a callback supplies content
|
|
618
|
+
inside its library-owned inset. Both footer forms retain SidebarFooter's rule and
|
|
619
|
+
inset. Before/after navigation content scrolls with the links, so tall supporting
|
|
620
|
+
content belongs there. Ordered `{ id, label?, items }` navigation groups supplement
|
|
621
|
+
the Record form; use stable item IDs for branch state and live badges.
|
|
622
|
+
renderItemContent changes noninteractive row content while preserving the owning
|
|
623
|
+
link/disclosure/focus treatment; renderItem remains the full row escape hatch.
|
|
624
|
+
Current matching selects the most-specific href; render contexts expose ancestor
|
|
625
|
+
state separately from current active state. In icon mode, searchable
|
|
626
|
+
AppSidebar preserves its search band as an icon button that expands and focuses
|
|
627
|
+
the field without clearing the query. LayoutSidebarProvider defaults to
|
|
628
|
+
comfortable rows with a shared xs gap. Default keeps that gap with smaller
|
|
629
|
+
rows; compact uses a tighter 2xs gap. Caption and group spacing keep their own
|
|
630
|
+
larger roles. Explicit density still wins.
|
|
481
631
|
WorkspaceLayout owns its own bounded content inset; do not add a padded Page
|
|
482
632
|
inside it. WorkspaceRecordHeader and WorkspaceLocaleStrip align to the same
|
|
483
633
|
large inline surface role. Record copy supports textGap with a dense default.
|
|
@@ -502,3 +652,5 @@ formatted-value and structure owners. Drawn rings and mini charts retain private
|
|
|
502
652
|
geometry and semantic chart/status colors. Read the
|
|
503
653
|
[workflow contracts](workflows.md#task-summaries-usage-and-inline-editing) and
|
|
504
654
|
[typed workspace recipe](../examples/planning-usage-edit.tsx) for integration.
|
|
655
|
+
|
|
656
|
+
Explicit `type="display" inset="compact"` retains the small rich-surface tier (12px); collection compact insets use 8px. Display/default remains 24px. Chart tooltips and explicit small async previews retain their rich-content surface sizing.
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Critique rubric
|
|
2
|
+
|
|
3
|
+
Use to judge a rendered view: after building one, before handing it back, or when
|
|
4
|
+
reviewing someone else's screen. Judge screenshots and measurements, not source.
|
|
5
|
+
Valid API usage, passing checks and a correct data model do not make a view
|
|
6
|
+
clear.
|
|
7
|
+
|
|
8
|
+
Render the view at 390×844 and 1440×900, in light and dark, with the states the
|
|
9
|
+
task touches (opened menu or editor, error, accepted). Run the census below at
|
|
10
|
+
each width, then score every criterion.
|
|
11
|
+
|
|
12
|
+
## Criteria
|
|
13
|
+
|
|
14
|
+
Score each criterion 0 (fails), 1 (partly) or 2 (passes). Criteria marked
|
|
15
|
+
**blocking** must score 2 before the work is handed back.
|
|
16
|
+
|
|
17
|
+
| # | Criterion | Question | How to measure |
|
|
18
|
+
| --- | --- | --- | --- |
|
|
19
|
+
| 1 | Five-second test (**blocking**) | From the first viewport alone, can you say what this is, what state it is in and what to do next? | Write the three answers from the screenshot before reading source. Compare them with the data brief's decision and facts |
|
|
20
|
+
| 2 | Focal point | Is there one dominant element per view and per region, and is it the one the brief chose? | Look at a reduced screenshot; census `focalCandidates` lists the largest text and its position. The focal element is in the first viewport at both widths |
|
|
21
|
+
| 3 | Hierarchy (**blocking**) | Does each region use at most three text levels, ordered title, value, supporting? | Census `regions[].textLevels`; above 4 needs a reason (a badge or a value primitive's secondary part). Compare `textStyles` outliers with their owners |
|
|
22
|
+
| 4 | Emphasis budget | One solid primary command per page or surface; tones only where status changes the action? | Census `primaryCommands`: 0 means the next action has no emphasis, 2 or more on one surface means competition. Read each toned badge and name the status it states |
|
|
23
|
+
| 5 | Data integrity (**blocking**) | Do figures, units, signs and totals match the records; zero and missing differ; nothing invented? | Check three figures against the data and recompute one total or delta |
|
|
24
|
+
| 6 | Encoding fit | Does each chart answer a question you can write in one sentence, and does each table compare rows on shared columns? | Write the question beside each chart. Name the compared column for each table |
|
|
25
|
+
| 7 | Grouping and rhythm | Do gaps grow from within a group to between groups to between sections, without filler or box-in-box? | Census `regions[].insideFrame` lists frames inside frames. Measure sibling gaps in the DOM; equal gaps at every level fail |
|
|
26
|
+
| 8 | Alignment | Do peer regions share content start edges, and do numbers right-align on one axis? | Census `regions[].left` and `inset`: peers differ by at most 1px. A leading badge adds its own padding to `inset`; check it in the image |
|
|
27
|
+
| 9 | Narrow reading order | At 390 wide, does the decision content come before evidence, with no sideways page scroll? | `overflowX` is 0. Scroll position of the focal element and the primary command. Tables may scroll inside their own region |
|
|
28
|
+
| 10 | Theme and states | Does dark keep the same hierarchy and contrast, and are loading, empty, error and accepted states designed? | Dark screenshots of the same viewports; trigger each state the view supports |
|
|
29
|
+
|
|
30
|
+
Hand back at 16 of 20 or more with every blocking criterion at 2. Otherwise fix
|
|
31
|
+
the lowest-scoring criterion at its owner and score again. After three rounds,
|
|
32
|
+
stop and report what remains and why.
|
|
33
|
+
|
|
34
|
+
## Census
|
|
35
|
+
|
|
36
|
+
Run in the page through the browser tool's JavaScript evaluation. It reads
|
|
37
|
+
computed styles only and changes nothing.
|
|
38
|
+
|
|
39
|
+
```js
|
|
40
|
+
(() => {
|
|
41
|
+
const shown = el => { const r = el.getBoundingClientRect(); const s = getComputedStyle(el); return r.width > 0 && r.height > 0 && s.visibility !== 'hidden' && s.opacity !== '0'; };
|
|
42
|
+
const hasText = el => [...el.childNodes].some(node => node.nodeType === 3 && node.textContent.trim());
|
|
43
|
+
const words = el => (el.getAttribute('aria-label') || el.textContent || '').trim().replace(/\s+/g, ' ').slice(0, 40);
|
|
44
|
+
const probe = document.body.appendChild(Object.assign(document.createElement('span'), { style: 'background: var(--primary)' }));
|
|
45
|
+
const primary = getComputedStyle(probe).backgroundColor; probe.remove();
|
|
46
|
+
const all = [...document.querySelectorAll('body *')].filter(shown);
|
|
47
|
+
const texts = all.filter(hasText);
|
|
48
|
+
const style = el => { const s = getComputedStyle(el); return `${s.fontSize} ${s.fontWeight}`; };
|
|
49
|
+
const isFrame = el => { const s = getComputedStyle(el); const r = el.getBoundingClientRect();
|
|
50
|
+
return ['Top', 'Right', 'Bottom', 'Left'].every(side => parseFloat(s[`border${side}Width`]) > 0) && r.height >= 64 && r.width >= 160
|
|
51
|
+
&& !el.matches('input, textarea, select, button, [role="combobox"], [role="group"]') && !el.querySelector('h1'); };
|
|
52
|
+
const frames = all.filter(isFrame);
|
|
53
|
+
const owner = el => frames.filter(frame => frame !== el && frame.contains(el)).at(-1);
|
|
54
|
+
const regions = frames.map(frame => {
|
|
55
|
+
const own = texts.filter(el => frame.contains(el) && owner(el) === frame);
|
|
56
|
+
const first = own[0];
|
|
57
|
+
return { region: first ? words(first) : '(no text)', top: Math.round(frame.getBoundingClientRect().top + scrollY), left: Math.round(frame.getBoundingClientRect().left),
|
|
58
|
+
inset: first ? Math.round(first.getBoundingClientRect().left - frame.getBoundingClientRect().left) : null,
|
|
59
|
+
textLevels: new Set(own.map(style)).size, insideFrame: owner(frame) ? words(texts.find(el => owner(frame).contains(el)) || owner(frame)) : null };
|
|
60
|
+
}).sort((a, b) => a.top - b.top || a.left - b.left);
|
|
61
|
+
const counts = new Map(texts.map(style).map(key => [key, 0]));
|
|
62
|
+
for (const el of texts) counts.set(style(el), counts.get(style(el)) + 1);
|
|
63
|
+
return {
|
|
64
|
+
viewport: `${innerWidth}x${innerHeight}`,
|
|
65
|
+
overflowX: document.documentElement.scrollWidth - document.documentElement.clientWidth,
|
|
66
|
+
primaryCommands: all.filter(el => el.matches('button, a') && getComputedStyle(el).backgroundColor === primary).map(words),
|
|
67
|
+
focalCandidates: texts.map(el => ({ el, size: parseFloat(getComputedStyle(el).fontSize) })).sort((a, b) => b.size - a.size).slice(0, 3).map(({ el, size }) => `${size}px ${words(el)} @${Math.round(el.getBoundingClientRect().top + scrollY)}`),
|
|
68
|
+
textStyles: [...counts].sort((a, b) => b[1] - a[1]).map(([key, count]) => `${key} ×${count}`),
|
|
69
|
+
regions,
|
|
70
|
+
};
|
|
71
|
+
})()
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
The census lists signals, not verdicts. The application shell's frame (any frame
|
|
75
|
+
containing the page `h1`) is excluded. Frames are bordered regions at least
|
|
76
|
+
160×64px, so tables, cards and drawers appear. A surface without a border is not
|
|
77
|
+
listed: judge it in the image.
|
|
78
|
+
|
|
79
|
+
## Write findings
|
|
80
|
+
|
|
81
|
+
One finding per problem, most severe first:
|
|
82
|
+
|
|
83
|
+
```text
|
|
84
|
+
[criterion #] <where: route, region, width/theme>
|
|
85
|
+
Seen: <what the screenshot or census shows>
|
|
86
|
+
Why it matters: <the user's decision or reading it harms>
|
|
87
|
+
Fix: <owner and prop, or the content to remove or move>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
A finding names the owner that should change. "Looks cluttered" is not a
|
|
91
|
+
finding; "Purchased goods uses 9 text levels at 1440, so quantity, SKU and
|
|
92
|
+
location compete with the product name" is.
|
|
93
|
+
|
|
94
|
+
## Report the score
|
|
95
|
+
|
|
96
|
+
State the score per criterion, with the measurement behind each 1 or 0, for
|
|
97
|
+
every width and theme inspected. Say which states were not rendered: an
|
|
98
|
+
unrendered state is unverified, not passed.
|