themelia-react-ui 1.0.1 → 2.0.0
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 +417 -0
- package/README.md +67 -16
- package/dist/{accordion-B-5Focs8.js → accordion-CQXVcd7Q.js} +15 -15
- package/dist/accordion-CQXVcd7Q.js.map +1 -0
- package/dist/action-menu-BTpyPWJ2.js +264 -0
- package/dist/action-menu-BTpyPWJ2.js.map +1 -0
- package/dist/affordance-geometry.generated-CCIXb2A1.js +68 -0
- package/dist/affordance-geometry.generated-CCIXb2A1.js.map +1 -0
- package/dist/{ai-artifact-B5tPpXnS.js → ai-artifact-2PQ2fItc.js} +206 -215
- package/dist/ai-artifact-2PQ2fItc.js.map +1 -0
- package/dist/{app-shell-at8Kt4l_.js → app-shell-BE_j8-AT.js} +11 -10
- package/dist/app-shell-BE_j8-AT.js.map +1 -0
- package/dist/{attachment-BO2R47wn.js → attachment-q69dlt5Y.js} +14 -14
- package/dist/attachment-q69dlt5Y.js.map +1 -0
- package/dist/auth-M3vGMgDR.js +723 -0
- package/dist/auth-M3vGMgDR.js.map +1 -0
- package/dist/{avatar-Bpzty83c.js → avatar-djdaaQ_s.js} +15 -13
- package/dist/avatar-djdaaQ_s.js.map +1 -0
- package/dist/{badge-BZXZT9wd.js → badge-0tATj-tW.js} +9 -9
- package/dist/badge-0tATj-tW.js.map +1 -0
- 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/buttons.js +3 -2
- package/dist/base/cards.js +3 -3
- package/dist/base/carousel.js +33 -35
- package/dist/base/carousel.js.map +1 -1
- package/dist/base/cascader.js +246 -222
- package/dist/base/cascader.js.map +1 -1
- 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 +1 -1
- package/dist/base/command.js +1 -1
- package/dist/base/copyable.js +1 -1
- package/dist/base/date-pickers.js +3 -3
- package/dist/base/display.js +7 -7
- package/dist/base/feedback.js +4 -4
- package/dist/base/forms-numeric.js +1 -1
- package/dist/base/forms.js +2 -2
- package/dist/base/inline-edit.js +94 -92
- package/dist/base/inline-edit.js.map +1 -1
- package/dist/base/item.js +1 -1
- package/dist/base/media-gallery.js +1 -1
- package/dist/base/navigation.js +6 -6
- package/dist/base/popover-menu.js +1 -1
- package/dist/base/popover.js +1 -1
- package/dist/base/qr-code.js +7 -4
- package/dist/base/qr-code.js.map +1 -1
- package/dist/base/repeaters.js +53 -53
- package/dist/base/repeaters.js.map +1 -1
- package/dist/base/sheet.js +1 -1
- package/dist/base/sidebar.js +1 -1
- package/dist/base/signature-pad.js +84 -82
- package/dist/base/signature-pad.js.map +1 -1
- package/dist/base/skeleton.js +1 -1
- package/dist/base/spinner.js +1 -1
- 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 +7 -7
- 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/blocks/admin.js +228 -219
- package/dist/blocks/admin.js.map +1 -1
- package/dist/blocks/ai.js +182 -212
- package/dist/blocks/ai.js.map +1 -1
- package/dist/blocks/analytics/usage-card.js +1 -1
- package/dist/blocks/analytics.js +665 -620
- package/dist/blocks/analytics.js.map +1 -1
- package/dist/blocks/collaboration.js +2 -2
- package/dist/blocks/commerce/receipt.js +1 -1
- package/dist/blocks/commerce.js +1439 -1553
- package/dist/blocks/commerce.js.map +1 -1
- package/dist/blocks/data-display.js +1 -1
- package/dist/blocks/onboarding.js +6 -6
- package/dist/blocks/onboarding.js.map +1 -1
- package/dist/blocks/planning.js +88 -97
- package/dist/blocks/planning.js.map +1 -1
- package/dist/blocks/timelines.js +1 -1
- package/dist/{breadcrumbs-DdQ_I5ra.js → breadcrumbs-BG_FfMK4.js} +10 -9
- package/dist/breadcrumbs-BG_FfMK4.js.map +1 -0
- package/dist/button-BS3KDg00.js +674 -0
- package/dist/button-BS3KDg00.js.map +1 -0
- package/dist/{button-BS6l5JUw.js → button-R9CCoH7A.js} +3 -3
- package/dist/button-R9CCoH7A.js.map +1 -0
- package/dist/buttons-DS0ZIwJ_.js +99 -0
- package/dist/buttons-DS0ZIwJ_.js.map +1 -0
- package/dist/{cards-Cum56XOF.js → cards-QoJ4syG9.js} +12 -12
- package/dist/{cards-Cum56XOF.js.map → cards-QoJ4syG9.js.map} +1 -1
- package/dist/chart-DwYRKKc-.js +152 -0
- package/dist/chart-DwYRKKc-.js.map +1 -0
- package/dist/checkbox-B7ygNTYp.js +35 -0
- package/dist/checkbox-B7ygNTYp.js.map +1 -0
- package/dist/choice-inputs-DrJ17tpL.js +752 -0
- package/dist/choice-inputs-DrJ17tpL.js.map +1 -0
- package/dist/{code-block-xHKbAJDj.js → code-block-CD0B7M93.js} +27 -27
- package/dist/code-block-CD0B7M93.js.map +1 -0
- package/dist/{collapsible-DsnktFNv.js → collapsible-oMUGM4tr.js} +3 -3
- package/dist/{collapsible-DsnktFNv.js.map → collapsible-oMUGM4tr.js.map} +1 -1
- package/dist/{collection-content-C4fthJV_.js → collection-content-Ys-OZOkY.js} +3 -3
- package/dist/{collection-content-C4fthJV_.js.map → collection-content-Ys-OZOkY.js.map} +1 -1
- package/dist/combobox-6dvVny2q.js +272 -0
- package/dist/combobox-6dvVny2q.js.map +1 -0
- package/dist/combobox-CB7039j7.js +865 -0
- package/dist/combobox-CB7039j7.js.map +1 -0
- package/dist/{command-C0xe7u9B.js → command-kPMPjIxJ.js} +35 -31
- package/dist/command-kPMPjIxJ.js.map +1 -0
- package/dist/{comments-DviPLnwy.js → comments-You0Bzbr.js} +434 -409
- package/dist/comments-You0Bzbr.js.map +1 -0
- package/dist/components/base/accordion/accordion-variants.d.ts +3 -3
- package/dist/components/base/action-menu/action-menu.d.ts +7 -2
- package/dist/components/base/avatar/stacked-avatars.d.ts +5 -4
- package/dist/components/base/badge/badge.d.ts +1 -1
- package/dist/components/base/badge/badge.recipes.d.ts +4 -4
- package/dist/components/base/buttons/base-button.d.ts +7 -0
- package/dist/components/base/buttons/button-group.recipes.d.ts +2 -2
- package/dist/components/base/buttons/button.recipes.d.ts +10 -19
- package/dist/components/base/buttons/button.variants.d.ts +1 -0
- package/dist/components/base/buttons/loader-button.d.ts +3 -1
- package/dist/components/base/buttons/text-button.d.ts +2 -2
- package/dist/components/base/buttons/use-pending-button-focus.d.ts +3 -0
- package/dist/components/base/cards/card.recipes.d.ts +13 -5
- package/dist/components/base/cards/partials/card-primitives.d.ts +9 -4
- package/dist/components/base/cards/smart-card.types.d.ts +1 -1
- package/dist/components/base/carousel/carousel.d.ts +3 -1
- package/dist/components/base/chart/chart.d.ts +7 -7
- package/dist/components/base/choice-inputs/checkbox.d.ts +6 -7
- package/dist/components/base/choice-inputs/choice-types.d.ts +10 -1
- package/dist/components/base/choice-inputs/pill-radio-group.d.ts +9 -0
- package/dist/components/base/choice-inputs/select-popup.d.ts +9 -1
- package/dist/components/base/choice-inputs/switch-card.d.ts +1 -1
- package/dist/components/base/date-pickers/date-picker-field.d.ts +23 -0
- package/dist/components/base/date-pickers/date-picker.recipes.d.ts +5 -18
- package/dist/components/base/date-pickers/datepicker.types.d.ts +16 -3
- package/dist/components/base/display/alert-dialog.d.ts +8 -2
- package/dist/components/base/display/content-block.d.ts +4 -2
- package/dist/components/base/display/date-block.d.ts +1 -1
- package/dist/components/base/display/dialog.d.ts +12 -5
- package/dist/components/base/display/surface-title.d.ts +6 -1
- package/dist/components/base/feedback/alert.d.ts +1 -1
- package/dist/components/base/feedback/state-display.d.ts +5 -4
- package/dist/components/base/forms/form-field.d.ts +1 -0
- package/dist/components/base/forms/form-sizing.d.ts +35 -3
- package/dist/components/base/forms/workflow.d.ts +2 -0
- package/dist/components/base/forms-numeric/coordinates-input.d.ts +3 -0
- package/dist/components/base/forms-numeric/rounding-mode-select.d.ts +4 -1
- package/dist/components/base/navigation/dropdown-menu.d.ts +2 -2
- package/dist/components/base/navigation/language-switcher.d.ts +4 -1
- package/dist/components/base/navigation/overflow-tab-bar.d.ts +7 -0
- package/dist/components/base/navigation/page-header/page-header.d.ts +4 -1
- package/dist/components/base/navigation/tabs.d.ts +3 -5
- package/dist/components/base/popover/popover.recipes.d.ts +3 -3
- package/dist/components/base/qr-code/qr-code.d.ts +2 -0
- package/dist/components/base/sheet/index.d.ts +29 -1
- package/dist/components/base/sheet/sheet.d.ts +14 -5
- package/dist/components/base/spinner/spinner.d.ts +3 -2
- package/dist/components/base/structure/structure.types.d.ts +1 -1
- package/dist/components/base/table/index.d.ts +1 -1
- package/dist/components/base/text-inputs/clear-native-field.d.ts +2 -0
- package/dist/components/base/text-inputs/input-group.d.ts +2 -2
- package/dist/components/base/text-inputs/input-trailing-action.d.ts +3 -0
- package/dist/components/base/upload/upload.recipes.d.ts +11 -0
- package/dist/components/base/value-inputs/date-time-input.d.ts +4 -2
- package/dist/components/base/value-inputs/tags-input.d.ts +2 -0
- package/dist/components/blocks/admin/api-key-list/api-key-list.types.d.ts +1 -1
- package/dist/components/blocks/analytics/format-metric-value.d.ts +11 -1
- package/dist/components/blocks/analytics/index.d.ts +1 -1
- package/dist/components/blocks/analytics/types.d.ts +1 -1
- package/dist/components/blocks/analytics/use-metric-format-options.d.ts +3 -0
- package/dist/components/blocks/collaboration/message/message.recipes.d.ts +12 -0
- package/dist/components/blocks/commerce/address-card/address-card.d.ts +1 -1
- package/dist/components/blocks/commerce/address-card/types.d.ts +3 -1
- package/dist/components/blocks/commerce/booking-calendar-event-card/booking-calendar-event-card.d.ts +4 -0
- package/dist/components/blocks/commerce/booking-calendar-event-card/booking-calendar-event-card.types.d.ts +2 -2
- package/dist/components/blocks/commerce/discount-stack/types.d.ts +1 -1
- package/dist/components/blocks/commerce/inventory-section/types.d.ts +4 -1
- package/dist/components/blocks/commerce/loyalty-points/types.d.ts +1 -1
- package/dist/components/blocks/commerce/order-status/types.d.ts +4 -0
- package/dist/components/blocks/commerce/payment-method/payment-method.d.ts +1 -1
- package/dist/components/blocks/commerce/payment-method/types.d.ts +3 -1
- package/dist/components/blocks/commerce/seo-listing/seo-listing-card.d.ts +1 -1
- package/dist/components/blocks/commerce/seo-listing/types.d.ts +3 -1
- package/dist/components/blocks/commerce/vendor-profile/types.d.ts +4 -1
- package/dist/components/blocks/data-display/dense-info-card/dense-info.strings.d.ts +4 -1
- package/dist/components/blocks/data-display/empty-state/partials/illustrations/document-stack.d.ts +1 -4
- package/dist/components/blocks/data-display/empty-state/partials/illustrations/inbox-clean.d.ts +1 -4
- package/dist/components/blocks/data-display/empty-state/partials/illustrations/index.d.ts +3 -3
- package/dist/components/blocks/data-display/empty-state/partials/illustrations/stacked-cards.d.ts +1 -6
- package/dist/components/blocks/data-display/inline-stat/inline-stat.d.ts +4 -1
- package/dist/components/features/combobox/components/error-message.d.ts +1 -1
- package/dist/components/features/comments/hooks/use-attachment-upload.d.ts +5 -0
- package/dist/components/features/filters/facets/search-facet.d.ts +0 -12
- package/dist/components/features/filters/facets/tags-facet.d.ts +1 -1
- package/dist/components/features/global-search/partials/global-search-idle-state.d.ts +1 -1
- package/dist/components/features/media-library/media-library.d.ts +1 -1
- package/dist/components/features/media-library/media-library.types.d.ts +9 -1
- package/dist/components/features/media-library/partials/media-library-partials.d.ts +1 -1
- package/dist/components/features/overlays/alert-dialog.d.ts +1 -1
- package/dist/components/features/overlays/drawer.d.ts +1 -1
- package/dist/components/features/overlays/hooks/use-overlay-actions.d.ts +2 -2
- package/dist/components/features/overlays/hooks/use-overlay-visibility.d.ts +11 -4
- package/dist/components/features/overlays/hooks/use-pending-overlay-focus.d.ts +2 -0
- package/dist/components/features/overlays/overlay-tone-icon.d.ts +37 -0
- package/dist/components/features/overlays/overlays.types.d.ts +46 -22
- package/dist/components/features/products/components/product-variants-manager.d.ts +1 -1
- package/dist/components/features/products/partials/index.d.ts +1 -1
- package/dist/components/features/products/partials/product-metric-tile.d.ts +6 -0
- package/dist/components/features/products/partials/product-tone.d.ts +11 -1
- package/dist/components/features/products/products.types.d.ts +2 -1
- package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +2 -1
- package/dist/components/features/table/data-table.d.ts +1 -1
- package/dist/components/features/table/partials/cell-renderers.d.ts +1 -1
- package/dist/components/features/table/table.types.d.ts +1 -1
- package/dist/components/features/theme-tweaker/theme-provider-settings.d.ts +3 -1
- package/dist/components/layout/auth/auth.types.d.ts +1 -0
- package/dist/components/layout/page/index.d.ts +1 -1
- package/dist/components/layout/page/page.d.ts +0 -1
- package/dist/components/layout/page/page.types.d.ts +62 -6
- package/dist/components/layout/page/partials/page-header-commands.d.ts +13 -0
- package/dist/components/layout/page/partials/page-header.d.ts +1 -1
- package/dist/components/layout/sidebar/sidebar.context.d.ts +1 -1
- package/dist/components/layout/sidebar/sidebar.types.d.ts +4 -0
- package/dist/components/layout/workspace/workspace.types.d.ts +3 -0
- package/dist/components/primitives/date.d.ts +16 -3
- package/dist/components/primitives/dimensions.d.ts +6 -0
- package/dist/components/primitives/duration.d.ts +6 -0
- package/dist/components/primitives/file-size.d.ts +6 -0
- package/dist/components/primitives/index.d.ts +1 -1
- package/dist/components/primitives/initials.d.ts +11 -2
- package/dist/components/primitives/link.d.ts +7 -0
- package/dist/components/primitives/money.d.ts +29 -7
- package/dist/components/primitives/number.d.ts +17 -0
- package/dist/components/primitives/value-typography.d.ts +54 -0
- package/dist/components/primitives/value.d.ts +31 -6
- package/dist/components/typography/heading.d.ts +13 -2
- package/dist/components/typography/index.d.ts +1 -1
- package/dist/components/typography/label.d.ts +3 -0
- package/dist/components/typography/running-text.d.ts +12 -0
- package/dist/components/typography/text-link.d.ts +23 -1
- package/dist/components/typography/text.d.ts +12 -0
- package/dist/components/typography/text.styles.d.ts +37 -5
- package/dist/components/ui/button.d.ts +1 -1
- package/dist/components/ui/checkbox.d.ts +5 -0
- package/dist/components/ui/overlay.recipes.d.ts +15 -2
- package/dist/components/ui/popover.d.ts +1 -1
- package/dist/components/ui/select.d.ts +3 -1
- package/dist/components/ui/sidebar.d.ts +1 -1
- package/dist/components/ui/switch.d.ts +5 -0
- package/dist/components/ui/table.d.ts +2 -1
- package/dist/container.recipes-D9t8MHR3.js +27 -0
- package/dist/container.recipes-D9t8MHR3.js.map +1 -0
- package/dist/{containers-6s-ucRQQ.js → containers-D_L4mTVb.js} +34 -57
- package/dist/containers-D_L4mTVb.js.map +1 -0
- package/dist/control-group-recipes-DBXmfh2E.js +21 -0
- package/dist/control-group-recipes-DBXmfh2E.js.map +1 -0
- package/dist/{copyable-B7SBXJMr.js → copyable-DDjTeW_j.js} +6 -6
- package/dist/{copyable-B7SBXJMr.js.map → copyable-DDjTeW_j.js.map} +1 -1
- package/dist/data-display-3xWQUnMA.js +1335 -0
- package/dist/data-display-3xWQUnMA.js.map +1 -0
- package/dist/date-picker-DrDFj8Lo.js +1527 -0
- package/dist/date-picker-DrDFj8Lo.js.map +1 -0
- package/dist/date-pickers-CnFCb0n2.js +174 -0
- package/dist/date-pickers-CnFCb0n2.js.map +1 -0
- package/dist/date-uf3z37Nm.js +144 -0
- package/dist/date-uf3z37Nm.js.map +1 -0
- package/dist/{display-CFM5myut.js → display-DrdvPwF0.js} +25 -25
- package/dist/display-DrdvPwF0.js.map +1 -0
- package/dist/{dropdown-menu-BlnyHr-9.js → dropdown-menu-CURh59jb.js} +22 -15
- package/dist/dropdown-menu-CURh59jb.js.map +1 -0
- package/dist/features/activities.js +177 -163
- package/dist/features/activities.js.map +1 -1
- package/dist/features/ai-chat.js +187 -183
- package/dist/features/ai-chat.js.map +1 -1
- package/dist/features/async-preview.js +9 -9
- 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 +25 -23
- package/dist/features/data-view.js.map +1 -1
- package/dist/features/email-composer/engine.js +1 -1
- package/dist/features/email-composer.js +353 -355
- package/dist/features/email-composer.js.map +1 -1
- package/dist/features/event-calendar.js +346 -354
- package/dist/features/event-calendar.js.map +1 -1
- package/dist/features/filters.js +1 -1
- package/dist/features/global-search.js +225 -227
- package/dist/features/global-search.js.map +1 -1
- package/dist/features/kanban.js +29 -29
- package/dist/features/kanban.js.map +1 -1
- package/dist/features/map.js +59 -58
- package/dist/features/map.js.map +1 -1
- package/dist/features/media-library.js +898 -900
- 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 +1412 -1444
- package/dist/features/products.js.map +1 -1
- package/dist/features/questionnaire.js +51 -49
- package/dist/features/questionnaire.js.map +1 -1
- package/dist/features/resource-assignment.js +103 -97
- package/dist/features/resource-assignment.js.map +1 -1
- package/dist/features/resource.js +13 -13
- package/dist/features/resource.js.map +1 -1
- package/dist/features/rich-text-editor.js +2 -2
- package/dist/features/schema-form.js +187 -183
- package/dist/features/schema-form.js.map +1 -1
- package/dist/features/suggestions.js +3 -3
- package/dist/features/sync.js +7 -7
- package/dist/features/sync.js.map +1 -1
- package/dist/features/table.js +1 -1
- package/dist/features/theme-tweaker.js +508 -503
- package/dist/features/theme-tweaker.js.map +1 -1
- package/dist/{feedback-DWUkgEjR.js → feedback-C7nR0UtT.js} +30 -31
- package/dist/feedback-C7nR0UtT.js.map +1 -0
- package/dist/field-affordance-recipes-CkOCdE2y.js +46 -0
- package/dist/field-affordance-recipes-CkOCdE2y.js.map +1 -0
- package/dist/{field-state-recipes-CBTRt9Bt.js → field-state-recipes-C-MFBX_8.js} +5 -5
- package/dist/field-state-recipes-C-MFBX_8.js.map +1 -0
- package/dist/{filters-BhsUtsxW.js → filters-Da-gNPsE.js} +760 -765
- package/dist/filters-Da-gNPsE.js.map +1 -0
- package/dist/{form-field-Bn7ZH1rA.js → form-field-VZRULhUK.js} +20 -12
- package/dist/form-field-VZRULhUK.js.map +1 -0
- package/dist/form-sizing-uWP4lzVh.js +126 -0
- package/dist/form-sizing-uWP4lzVh.js.map +1 -0
- package/dist/{forms-B7pzS25o.js → forms-DDeEnXSY.js} +38 -38
- package/dist/forms-DDeEnXSY.js.map +1 -0
- package/dist/forms-numeric-D3CO60IF.js +905 -0
- package/dist/forms-numeric-D3CO60IF.js.map +1 -0
- package/dist/{header-C59QZyxV.js → header-2ycNqGOR.js} +42 -37
- package/dist/header-2ycNqGOR.js.map +1 -0
- package/dist/{hooks-CM1Vp9Pe.js → hooks-DQ5SPwZw.js} +2 -2
- package/dist/{hooks-CM1Vp9Pe.js.map → hooks-DQ5SPwZw.js.map} +1 -1
- package/dist/{http-CLTVJc5I.js → http-CdEIHyQf.js} +2 -2
- package/dist/http-CdEIHyQf.js.map +1 -0
- package/dist/{icon-badge-Dv0RYQwj.js → icon-badge-DKlaKXoo.js} +4 -4
- package/dist/{icon-badge-Dv0RYQwj.js.map → icon-badge-DKlaKXoo.js.map} +1 -1
- package/dist/index.js +2 -2
- package/dist/input-BoLm9Hks.js +20 -0
- package/dist/input-BoLm9Hks.js.map +1 -0
- package/dist/input-DhQdBnV3.js +255 -0
- package/dist/input-DhQdBnV3.js.map +1 -0
- package/dist/item-xzh8Df65.js +264 -0
- package/dist/item-xzh8Df65.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 +1 -1
- package/dist/layout/settings.js +1 -1
- package/dist/layout/sidebar.js +2 -2
- package/dist/layout/workspace.js +1 -1
- package/dist/layout.js +10 -10
- package/dist/lib/affordance-geometry.generated.d.ts +46 -10
- package/dist/lib/control-group-recipes.d.ts +22 -0
- package/dist/lib/field-affordance-recipes.d.ts +70 -2
- package/dist/lib/field-state-recipes.d.ts +6 -4
- package/dist/lib/format.d.ts +9 -0
- package/dist/lib/money-format.d.ts +30 -0
- package/dist/lib/navigation-row-recipes.d.ts +3 -2
- package/dist/lib/overlay-anatomy-recipes.d.ts +2 -2
- package/dist/lib/surface-recipes.d.ts +13 -8
- package/dist/lib/token-merge.generated.d.ts +144 -2
- package/dist/lib/track-recipes.d.ts +1 -1
- package/dist/lib/ui-provider/provider.d.ts +7 -2
- package/dist/lib/ui-provider/store.d.ts +6 -2
- package/dist/lib/ui-provider/types.d.ts +9 -4
- package/dist/lib/use-prefers-reduced-motion.d.ts +2 -0
- package/dist/lib/utils.js +1 -1
- package/dist/media-gallery-DQUQ0m3O.js +201 -0
- package/dist/media-gallery-DQUQ0m3O.js.map +1 -0
- package/dist/{mentions-B8Ko-fhS.js → mentions-DwnO1hh4.js} +40 -39
- package/dist/{mentions-B8Ko-fhS.js.map → mentions-DwnO1hh4.js.map} +1 -1
- package/dist/message-YfFmbXNP.js +127 -0
- package/dist/message-YfFmbXNP.js.map +1 -0
- package/dist/{navigation-BUIn2Qxx.js → navigation-Cbp5V8gG.js} +27 -28
- package/dist/navigation-Cbp5V8gG.js.map +1 -0
- package/dist/navigation-Cs1npsPm.js +300 -0
- package/dist/navigation-Cs1npsPm.js.map +1 -0
- package/dist/{navigation-row-recipes-GVh11KiT.js → navigation-row-recipes-DlU-4QYO.js} +3 -3
- package/dist/navigation-row-recipes-DlU-4QYO.js.map +1 -0
- package/dist/number-CKRBYmZK.js +352 -0
- package/dist/number-CKRBYmZK.js.map +1 -0
- package/dist/overlay.recipes-CNO2S9V6.js +34 -0
- package/dist/overlay.recipes-CNO2S9V6.js.map +1 -0
- package/dist/overlays-DhZO7N-I.js +994 -0
- package/dist/overlays-DhZO7N-I.js.map +1 -0
- package/dist/page-C6R_8jFt.js +325 -0
- package/dist/page-C6R_8jFt.js.map +1 -0
- package/dist/{page-header-DQRa0jug.js → page-header-hUTzcRZX.js} +12 -12
- package/dist/page-header-hUTzcRZX.js.map +1 -0
- package/dist/{pagination-C29vvt3I.js → pagination-Cm0jqa3I.js} +21 -21
- package/dist/pagination-Cm0jqa3I.js.map +1 -0
- package/dist/{popover-CoLDEg19.js → popover-Dcv_9jxr.js} +23 -22
- package/dist/popover-Dcv_9jxr.js.map +1 -0
- package/dist/{popover-menu-GLIQTJTx.js → popover-menu-DnRFKnHP.js} +6 -6
- package/dist/{popover-menu-GLIQTJTx.js.map → popover-menu-DnRFKnHP.js.map} +1 -1
- package/dist/{popover.recipes-zgBhMlUu.js → popover.recipes-wmbvL8Ah.js} +5 -5
- package/dist/popover.recipes-wmbvL8Ah.js.map +1 -0
- package/dist/primitives-BHrwQXFC.js +379 -0
- package/dist/primitives-BHrwQXFC.js.map +1 -0
- package/dist/primitives.js +5 -5
- package/dist/{progress-BOe8l_FZ.js → progress-Br9WTFya.js} +12 -11
- package/dist/progress-Br9WTFya.js.map +1 -0
- package/dist/{receipt-BM8xsGFy.js → receipt-CV89q1fs.js} +8 -8
- package/dist/{receipt-BM8xsGFy.js.map → receipt-CV89q1fs.js.map} +1 -1
- package/dist/rich-text-editor-CF8QYt5p.js +574 -0
- package/dist/rich-text-editor-CF8QYt5p.js.map +1 -0
- package/dist/{rich-text-editor.recipes-DxvOE0Lp.js → rich-text-editor.recipes-CnrbmTS1.js} +35 -26
- package/dist/rich-text-editor.recipes-CnrbmTS1.js.map +1 -0
- package/dist/{rich-text-B7sBAdDG.js → rich-text-j-FGAeZW.js} +4 -4
- package/dist/{rich-text-B7sBAdDG.js.map → rich-text-j-FGAeZW.js.map} +1 -1
- package/dist/{scroll-area-BheMQ270.js → scroll-area-DRdr16Pt.js} +3 -3
- package/dist/scroll-area-DRdr16Pt.js.map +1 -0
- package/dist/{separator-DO0EbCEm.js → separator-BMEvwnSX.js} +2 -2
- package/dist/{separator-DO0EbCEm.js.map → separator-BMEvwnSX.js.map} +1 -1
- package/dist/{separator-Gk_WXH-l.js → separator-Do5GWDYi.js} +4 -4
- package/dist/separator-Do5GWDYi.js.map +1 -0
- package/dist/services/actions/action-adapters.d.ts +4 -0
- package/dist/services/actions.js +8 -3
- package/dist/services/actions.js.map +1 -1
- package/dist/{settings-BnCyyPOJ.js → settings-DHk0L2MF.js} +20 -19
- package/dist/settings-DHk0L2MF.js.map +1 -0
- package/dist/sheet-DRFNY1_D.js +207 -0
- package/dist/sheet-DRFNY1_D.js.map +1 -0
- package/dist/sidebar-Cb8WzOvE.js +511 -0
- package/dist/sidebar-Cb8WzOvE.js.map +1 -0
- package/dist/{sidebar-DPR7fmqN.js → sidebar-Crc9M9JV.js} +220 -201
- package/dist/sidebar-Crc9M9JV.js.map +1 -0
- package/dist/{skeleton-CmT1ppqb.js → skeleton-DVMXr15h.js} +5 -5
- package/dist/{skeleton-CmT1ppqb.js.map → skeleton-DVMXr15h.js.map} +1 -1
- package/dist/smart-card-Bek-TwUp.js +599 -0
- package/dist/smart-card-Bek-TwUp.js.map +1 -0
- package/dist/{spinner-BY9HbUEh.js → spinner-CmTAbEp0.js} +8 -6
- package/dist/spinner-CmTAbEp0.js.map +1 -0
- package/dist/{structure-MvKVq-oL.js → structure-hzCW-XsV.js} +3 -3
- package/dist/{structure-MvKVq-oL.js.map → structure-hzCW-XsV.js.map} +1 -1
- package/dist/{structure.recipes-Bqhf9oIh.js → structure.recipes-EPz60cU8.js} +37 -19
- package/dist/structure.recipes-EPz60cU8.js.map +1 -0
- package/dist/style.css +1 -1
- package/dist/surface-recipes-DOdoBXGm.js +28 -0
- package/dist/surface-recipes-DOdoBXGm.js.map +1 -0
- package/dist/table-D6zKeYQX.js +162 -0
- package/dist/table-D6zKeYQX.js.map +1 -0
- package/dist/table-Dn4XSrSB.js +1444 -0
- package/dist/table-Dn4XSrSB.js.map +1 -0
- package/dist/tabs-Dk8E_knt.js +189 -0
- package/dist/tabs-Dk8E_knt.js.map +1 -0
- package/dist/text-inputs-BFpku0Qd.js +331 -0
- package/dist/text-inputs-BFpku0Qd.js.map +1 -0
- package/dist/{text.styles-BwB7vAF2.js → text.styles-g4He6UIW.js} +26 -15
- package/dist/text.styles-g4He6UIW.js.map +1 -0
- package/dist/theme.css +90 -124
- package/dist/themes/green.css +24 -0
- package/dist/{timelines-B9ICkQcV.js → timelines-CxuAFIc2.js} +97 -104
- package/dist/timelines-CxuAFIc2.js.map +1 -0
- package/dist/track-recipes-CDcKmndW.js +10 -0
- package/dist/track-recipes-CDcKmndW.js.map +1 -0
- package/dist/{tree-BdWSaoFT.js → tree-BotPlyiD.js} +13 -13
- package/dist/{tree-BdWSaoFT.js.map → tree-BotPlyiD.js.map} +1 -1
- package/dist/typography/rich-text.js +1 -1
- package/dist/typography-CAr3dQhX.js +116 -0
- package/dist/typography-CAr3dQhX.js.map +1 -0
- package/dist/typography.js +2 -2
- package/dist/{ui-provider-CftIB6TY.js → ui-provider-D2_TeLqw.js} +22 -22
- package/dist/ui-provider-D2_TeLqw.js.map +1 -0
- package/dist/ui-provider.js +1 -1
- package/dist/{upload-D8Za5x_c.js → upload-B0WHW7ak.js} +278 -274
- package/dist/upload-B0WHW7ak.js.map +1 -0
- package/dist/{upload-queue-hIIYBLS7.js → upload-queue-BHZ_wBfd.js} +72 -75
- package/dist/upload-queue-BHZ_wBfd.js.map +1 -0
- package/dist/{usage-card-DnmnJ58D.js → usage-card-U0YBLTNT.js} +31 -33
- package/dist/usage-card-U0YBLTNT.js.map +1 -0
- package/dist/utils-Cospvlj1.js +4445 -0
- package/dist/utils-Cospvlj1.js.map +1 -0
- package/dist/value-inputs-CjfzGMsN.js +854 -0
- package/dist/value-inputs-CjfzGMsN.js.map +1 -0
- package/dist/value-typography-Deb3yQZg.js +116 -0
- package/dist/value-typography-Deb3yQZg.js.map +1 -0
- package/dist/{workspace-C1PZmk8L.js → workspace-YoFjXi6i.js} +97 -105
- package/dist/workspace-YoFjXi6i.js.map +1 -0
- package/docs/consumer-skill/SKILL.md +123 -119
- package/docs/consumer-skill/examples/analytics.tsx +34 -0
- package/docs/consumer-skill/examples/app-layout.tsx +42 -14
- package/docs/consumer-skill/examples/detail.tsx +20 -5
- package/docs/consumer-skill/examples/edit.tsx +1 -1
- package/docs/consumer-skill/examples/layout-blocks.tsx +20 -0
- package/docs/consumer-skill/examples/manifest.json +37 -3
- package/docs/consumer-skill/examples/scoped-directory.tsx +2 -2
- package/docs/consumer-skill/examples/website.tsx +56 -0
- package/docs/consumer-skill/references/analytics.md +70 -0
- package/docs/consumer-skill/references/composition.md +195 -9
- package/docs/consumer-skill/references/design-contract.md +33 -7
- package/docs/consumer-skill/references/discovery.md +80 -5
- package/docs/consumer-skill/references/installation.md +22 -0
- package/docs/consumer-skill/references/integration.md +46 -1
- package/docs/consumer-skill/references/public-api.json +2083 -237
- package/docs/consumer-skill/references/review.md +74 -6
- package/docs/consumer-skill/references/theming.md +59 -8
- package/docs/consumer-skill/references/tokens.json +180 -9
- package/docs/consumer-skill/references/workflows.md +34 -0
- package/docs/consumer-skill/scripts/check-composition.mjs +1 -1
- package/docs/consumer-skill/scripts/composition-policy.mjs +271 -18
- package/docs/consumer-skill/scripts/discovery.mjs +69 -9
- package/docs/consumer-skill/scripts/pin-button-defaults.mjs +95 -0
- package/docs/consumer-skill/scripts/surface-policy.mjs +44 -0
- package/package.json +11 -6
- package/dist/accordion-B-5Focs8.js.map +0 -1
- package/dist/action-menu-Cx3SdfbN.js +0 -265
- package/dist/action-menu-Cx3SdfbN.js.map +0 -1
- package/dist/affordance-geometry.generated-D8Jcfb0G.js +0 -32
- package/dist/affordance-geometry.generated-D8Jcfb0G.js.map +0 -1
- package/dist/ai-artifact-B5tPpXnS.js.map +0 -1
- package/dist/app-shell-at8Kt4l_.js.map +0 -1
- package/dist/attachment-BO2R47wn.js.map +0 -1
- package/dist/auth-OFwWSAap.js +0 -704
- package/dist/auth-OFwWSAap.js.map +0 -1
- package/dist/avatar-Bpzty83c.js.map +0 -1
- package/dist/badge-BZXZT9wd.js.map +0 -1
- package/dist/breadcrumbs-DdQ_I5ra.js.map +0 -1
- package/dist/button-BS6l5JUw.js.map +0 -1
- package/dist/buttons-Co6GavvM.js +0 -674
- package/dist/buttons-Co6GavvM.js.map +0 -1
- package/dist/chart-DVfcwQu6.js +0 -149
- package/dist/chart-DVfcwQu6.js.map +0 -1
- package/dist/checkbox-BavDRjF7.js +0 -34
- package/dist/checkbox-BavDRjF7.js.map +0 -1
- package/dist/choice-inputs-CC7XqPQO.js +0 -619
- package/dist/choice-inputs-CC7XqPQO.js.map +0 -1
- package/dist/code-block-xHKbAJDj.js.map +0 -1
- package/dist/combobox-DEbdr-3u.js +0 -273
- package/dist/combobox-DEbdr-3u.js.map +0 -1
- package/dist/combobox-xv3yJbzl.js +0 -850
- package/dist/combobox-xv3yJbzl.js.map +0 -1
- package/dist/command-C0xe7u9B.js.map +0 -1
- package/dist/comments-DviPLnwy.js.map +0 -1
- package/dist/containers-6s-ucRQQ.js.map +0 -1
- package/dist/data-display-cWIRdeaf.js +0 -1129
- package/dist/data-display-cWIRdeaf.js.map +0 -1
- package/dist/date-BFNMnrS5.js +0 -140
- package/dist/date-BFNMnrS5.js.map +0 -1
- package/dist/date-picker-CA6ogMQB.js +0 -1521
- package/dist/date-picker-CA6ogMQB.js.map +0 -1
- package/dist/date-pickers-BPIKLdsD.js +0 -224
- package/dist/date-pickers-BPIKLdsD.js.map +0 -1
- package/dist/display-CFM5myut.js.map +0 -1
- package/dist/dropdown-menu-BlnyHr-9.js.map +0 -1
- package/dist/feedback-DWUkgEjR.js.map +0 -1
- package/dist/field-affordance-recipes-IjzPrCTw.js +0 -17
- package/dist/field-affordance-recipes-IjzPrCTw.js.map +0 -1
- package/dist/field-state-recipes-CBTRt9Bt.js.map +0 -1
- package/dist/filters-BhsUtsxW.js.map +0 -1
- package/dist/form-field-Bn7ZH1rA.js.map +0 -1
- package/dist/form-sizing-BWs70_a2.js +0 -100
- package/dist/form-sizing-BWs70_a2.js.map +0 -1
- package/dist/format-iamDSqs2.js +0 -110
- package/dist/format-iamDSqs2.js.map +0 -1
- package/dist/forms-B7pzS25o.js.map +0 -1
- package/dist/forms-numeric-BUBxELBv.js +0 -867
- package/dist/forms-numeric-BUBxELBv.js.map +0 -1
- package/dist/header-C59QZyxV.js.map +0 -1
- package/dist/http-CLTVJc5I.js.map +0 -1
- package/dist/input-WwYQZJzG.js +0 -202
- package/dist/input-WwYQZJzG.js.map +0 -1
- package/dist/input-ci9fIgFH.js +0 -20
- package/dist/input-ci9fIgFH.js.map +0 -1
- package/dist/item-pJ0GsOiJ.js +0 -257
- package/dist/item-pJ0GsOiJ.js.map +0 -1
- package/dist/media-gallery-DhDRgnVZ.js +0 -200
- package/dist/media-gallery-DhDRgnVZ.js.map +0 -1
- package/dist/message-COsdEvXT.js +0 -108
- package/dist/message-COsdEvXT.js.map +0 -1
- package/dist/navigation-BUIn2Qxx.js.map +0 -1
- package/dist/navigation-DBEu4POU.js +0 -267
- package/dist/navigation-DBEu4POU.js.map +0 -1
- package/dist/navigation-row-recipes-GVh11KiT.js.map +0 -1
- package/dist/number-BNT_BIzJ.js +0 -269
- package/dist/number-BNT_BIzJ.js.map +0 -1
- package/dist/overlay.recipes-BxW5FIfK.js +0 -6
- package/dist/overlay.recipes-BxW5FIfK.js.map +0 -1
- package/dist/overlays-B11wZka6.js +0 -982
- package/dist/overlays-B11wZka6.js.map +0 -1
- package/dist/page-BV6ioQg3.js +0 -202
- package/dist/page-BV6ioQg3.js.map +0 -1
- package/dist/page-header-DQRa0jug.js.map +0 -1
- package/dist/pagination-C29vvt3I.js.map +0 -1
- package/dist/popover-CoLDEg19.js.map +0 -1
- package/dist/popover.recipes-zgBhMlUu.js.map +0 -1
- package/dist/primitives-DKPOGVpj.js +0 -330
- package/dist/primitives-DKPOGVpj.js.map +0 -1
- package/dist/progress-BOe8l_FZ.js.map +0 -1
- package/dist/rich-text-editor-CoVrTiSv.js +0 -575
- package/dist/rich-text-editor-CoVrTiSv.js.map +0 -1
- package/dist/rich-text-editor.recipes-DxvOE0Lp.js.map +0 -1
- package/dist/scroll-area-BheMQ270.js.map +0 -1
- package/dist/select-B2mb-qN2.js +0 -108
- package/dist/select-B2mb-qN2.js.map +0 -1
- package/dist/separator-Gk_WXH-l.js.map +0 -1
- package/dist/settings-BnCyyPOJ.js.map +0 -1
- package/dist/sheet-B-q914Ad.js +0 -205
- package/dist/sheet-B-q914Ad.js.map +0 -1
- package/dist/sidebar-C_2p3Tfj.js +0 -501
- package/dist/sidebar-C_2p3Tfj.js.map +0 -1
- package/dist/sidebar-DPR7fmqN.js.map +0 -1
- package/dist/smart-card-CYLn46e6.js +0 -578
- package/dist/smart-card-CYLn46e6.js.map +0 -1
- package/dist/spinner-BY9HbUEh.js.map +0 -1
- package/dist/structure.recipes-Bqhf9oIh.js.map +0 -1
- package/dist/surface-recipes-CQfRr-VL.js +0 -27
- package/dist/surface-recipes-CQfRr-VL.js.map +0 -1
- package/dist/table-BS39xnlq.js +0 -1424
- package/dist/table-BS39xnlq.js.map +0 -1
- package/dist/table-DnlAJ-xR.js +0 -146
- package/dist/table-DnlAJ-xR.js.map +0 -1
- package/dist/tabs-B5cNMWiP.js +0 -187
- package/dist/tabs-B5cNMWiP.js.map +0 -1
- package/dist/text-inputs-Dh9XGyiS.js +0 -331
- package/dist/text-inputs-Dh9XGyiS.js.map +0 -1
- package/dist/text.styles-BwB7vAF2.js.map +0 -1
- package/dist/timelines-B9ICkQcV.js.map +0 -1
- package/dist/track-recipes-LLPNVwFg.js +0 -10
- package/dist/track-recipes-LLPNVwFg.js.map +0 -1
- package/dist/typography-Cv8MT-82.js +0 -96
- package/dist/typography-Cv8MT-82.js.map +0 -1
- package/dist/ui-provider-CftIB6TY.js.map +0 -1
- package/dist/upload-D8Za5x_c.js.map +0 -1
- package/dist/upload-queue-hIIYBLS7.js.map +0 -1
- package/dist/usage-card-DnmnJ58D.js.map +0 -1
- package/dist/utils-C2EKeIw3.js +0 -72
- package/dist/utils-C2EKeIw3.js.map +0 -1
- package/dist/value-inputs-DX2dbxjj.js +0 -824
- package/dist/value-inputs-DX2dbxjj.js.map +0 -1
- package/dist/workspace-C1PZmk8L.js.map +0 -1
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Metrics and statistics
|
|
2
|
+
|
|
3
|
+
Use this reference for dashboard KPIs, revenue overviews, statistic cards and
|
|
4
|
+
usage summaries. The finder returns exact owners, relevant symbols and recipe
|
|
5
|
+
reads; declarations establish the current props. These components present
|
|
6
|
+
application data and never fetch or define a business metric.
|
|
7
|
+
|
|
8
|
+
## Select the subject owner
|
|
9
|
+
|
|
10
|
+
| Subject | Public owner | Frame and lifecycle |
|
|
11
|
+
| --- | --- | --- |
|
|
12
|
+
| One KPI with value, trend or sparkline | `Metric` from `themelia-react-ui/blocks/analytics` | `variant="card"` owns its Card; default/compact/minimal support lower-level composition. Has loading/error presentation. |
|
|
13
|
+
| Peer dashboard KPIs or revenue figures | `MetricGrid` from `themelia-react-ui/blocks/analytics` | Defaults to card metrics; owns gaps and columns responding to its parent. `columns` is a maximum. Has loading, while error/retry/empty remain app-owned. |
|
|
14
|
+
| Metrics sharing one strip and period action | `MetricBar` from `themelia-react-ui/blocks/analytics` | One strip from `MetricData[]`; period callback requests the current period value. App owns choosing/fetching periods and request states. |
|
|
15
|
+
| Current versus previous metric | `MetricComparison` from `themelia-react-ui/blocks/analytics` | Uses current/previous `MetricData`; app defines the comparison baseline. |
|
|
16
|
+
| Used/limit quotas with shares, daily values and period selection | `UsageCard` from `themelia-react-ui/blocks/analytics/usage-card` | Owns a Card and ready/loading/error/empty presentation with retry/period callbacks. No optional chart peer. |
|
|
17
|
+
| One plain label/value fact | `InlineStat` from `themelia-react-ui/blocks/data-display` | Card-free; app chooses whether this subject needs a Card. |
|
|
18
|
+
| Several facts about one record | `MetadataList` from `themelia-react-ui/blocks/data-display` | Card-free; value primitives own formatting. |
|
|
19
|
+
| Caller-owned chart series | `ChartCard` from `themelia-react-ui/blocks/analytics` | Card-free chart composition; caller supplies chart content and an optional Card boundary. |
|
|
20
|
+
|
|
21
|
+
Start with these subject owners before constructing a Card with a number and
|
|
22
|
+
supporting text. Reuse their formatting, hierarchy and relevant states when
|
|
23
|
+
the contract fits. A custom Card remains appropriate for a distinct subject
|
|
24
|
+
or task with content/coordination these owners do not represent; keep their
|
|
25
|
+
supported lower owners where useful. Do not put another Card around an owner
|
|
26
|
+
that already renders its own surface.
|
|
27
|
+
|
|
28
|
+
## Dashboard and revenue data
|
|
29
|
+
|
|
30
|
+
[Analytics recipe](../examples/analytics.tsx) exports `RevenueOverview`,
|
|
31
|
+
`RevenueMetric` and `PlainStatistic`. The overview accepts discriminated request
|
|
32
|
+
state: loading renders MetricGrid skeletons, error replaces data with retry,
|
|
33
|
+
and a ready empty array renders EmptyState. The parent supplies labels/IDs for
|
|
34
|
+
loading metrics, accepts server data, executes retry and ignores stale results.
|
|
35
|
+
It adds no implicit Card around the grid. The other exports show a standalone
|
|
36
|
+
Metric and a plain factual InlineStat.
|
|
37
|
+
|
|
38
|
+
`MetricData` requires stable `id`, `label` and `value`. Numeric currency values
|
|
39
|
+
use `valueType="currency"` plus `currency`; pass major currency units, rather
|
|
40
|
+
than a Money primitive's `unit="minor"` contract. Percentage values follow the
|
|
41
|
+
shared formatter's ratio contract (0.12 renders 12%). `null` is unavailable;
|
|
42
|
+
zero is real data. A string is already display data. `change.value` is caller
|
|
43
|
+
copy, `change.direction` describes movement, and `trend` can override whether
|
|
44
|
+
movement is positive, negative or neutral. A decline in churn can be positive.
|
|
45
|
+
Keep the selected period and baseline clear in application context.
|
|
46
|
+
|
|
47
|
+
`MetricGrid` forwards one `variant`, size and state recipe to its peers. Its
|
|
48
|
+
default `gap="xl"` and Card insets remain independent from text/media `size`.
|
|
49
|
+
Narrow parents reduce track count even on a wide viewport. Use `columns` and
|
|
50
|
+
the public variants rather than overriding its internal grid, Card padding,
|
|
51
|
+
value typography or sparkline geometry.
|
|
52
|
+
|
|
53
|
+
The analytics family declaration/runtime graph requires the optional `recharts`
|
|
54
|
+
peer even when a selected presentation hides its sparkline. Read the finder
|
|
55
|
+
result's peers and installed declarations. UsageCard has a focused leaf import;
|
|
56
|
+
its quota model differs from general MetricData.
|
|
57
|
+
|
|
58
|
+
## Usage, facts and verification
|
|
59
|
+
|
|
60
|
+
For `UsageCard` period/loading/error/retry and quota meaning, read
|
|
61
|
+
[usage workflow](workflows.md#task-summaries-usage-and-inline-editing) and its
|
|
62
|
+
[workspace summary recipe](../examples/planning-usage-edit.tsx).
|
|
63
|
+
For record facts, choose MetadataList and primitives through the
|
|
64
|
+
[detail recipe](../examples/detail.tsx), then decide Page and Card boundaries
|
|
65
|
+
using [composition](composition.md#compose-from-the-task).
|
|
66
|
+
|
|
67
|
+
Verify zero/unavailable values, loading/error/retry/empty, accepted period data,
|
|
68
|
+
long labels/amounts, narrow parent widths and light/dark surfaces. Run the app's
|
|
69
|
+
types and behavior checks; discovery and typechecking do not prove rendered
|
|
70
|
+
geometry, keyboard callbacks or business-data correctness.
|
|
@@ -30,6 +30,7 @@ a detail workspace or a form; they need different information hierarchies.
|
|
|
30
30
|
| ResourceCell | Identity inside a table cell | Item for independent list entries; MetadataList for label/value facts about one subject |
|
|
31
31
|
| 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
32
|
| Card | One subject needs a frame and headed regions | `surface="flat" padding="none"` inside an existing boundary; nested DataTable uses its own `surface="flat"` |
|
|
33
|
+
| 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 |
|
|
33
34
|
| FormField / InlineEdit | A field needs label/hint/error, or isolated save/cancel | Complete feature/overlay for a workflow; app form owns whole-record submission |
|
|
34
35
|
|
|
35
36
|
For a DataTable composition, put queries in `topbarContent`, exports or collection
|
|
@@ -53,11 +54,26 @@ accessibility needs and the task can justify richer rows. Explain the priority.
|
|
|
53
54
|
Custom ResourceCell metadata is caller content; use shared supporting typography
|
|
54
55
|
and CellStack where its smaller secondary-value contract fits.
|
|
55
56
|
|
|
56
|
-
Commands need explicit importance as well as scope.
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
57
|
+
Commands need explicit importance as well as scope. Describe page commands by
|
|
58
|
+
role in Page's header: `primaryAction` is the route's one main command, and
|
|
59
|
+
`secondaryActions` lists supporting commands in priority order. The header owns
|
|
60
|
+
their treatment: a solid primary button, outline secondary buttons, and a More
|
|
61
|
+
actions menu for overflow, destructive commands and narrow screens. Choosing which
|
|
62
|
+
command is primary, which are `destructive`, and which are `visible` remains an
|
|
63
|
+
application decision; confirm destructive commands in their handler. Use
|
|
64
|
+
`actions` only for non-command controls such as a period select. A back link,
|
|
65
|
+
export and destructive command should not all inherit the same visual emphasis.
|
|
66
|
+
|
|
67
|
+
```tsx
|
|
68
|
+
<Page header={{
|
|
69
|
+
title: 'Contacts',
|
|
70
|
+
primaryAction: { label: 'New contact', icon: Plus, onClick: onCreate },
|
|
71
|
+
secondaryActions: [
|
|
72
|
+
{ label: 'Export', onClick: onExport },
|
|
73
|
+
{ label: 'Delete list', destructive: true, onClick: confirmDelete },
|
|
74
|
+
],
|
|
75
|
+
}}>{/* route content */}</Page>
|
|
76
|
+
```
|
|
61
77
|
|
|
62
78
|
| Drift | Better decision |
|
|
63
79
|
| --- | --- |
|
|
@@ -74,6 +90,48 @@ and public anatomy, not imitate one screenshot.
|
|
|
74
90
|
|
|
75
91
|
Use the exact family declarations from public-api.json. Catalogue URLs and source folders are not import contracts.
|
|
76
92
|
|
|
93
|
+
For dashboard KPIs, revenue and statistic cards, read the focused
|
|
94
|
+
[analytics selection and recipe](analytics.md). Metric's card variant,
|
|
95
|
+
MetricGrid's default peers and UsageCard own their surfaces. A distinct custom
|
|
96
|
+
Card subject remains valid; compare the complete subject contract before rebuilding
|
|
97
|
+
formatting, hierarchy or request-state presentation from lower text primitives.
|
|
98
|
+
|
|
99
|
+
For rows, grids, main/aside regions and matching peer gaps, use the
|
|
100
|
+
[layout-owner map](#structure-and-spacing).
|
|
101
|
+
|
|
102
|
+
### Headed blocks inside surfaces
|
|
103
|
+
|
|
104
|
+
AddressCard, PaymentMethod, SeoListingCard and ProductVariantsManager accept
|
|
105
|
+
Card's `surface`, `padding` and `headerDivider` props. Use `surface="card"` when
|
|
106
|
+
that owner is the framed subject; it supplies the header and aligned body insets
|
|
107
|
+
and inherits provider dividers. Do not add an untitled padded Card around it.
|
|
108
|
+
Omit surface for an unframed embedded subject; its header rule defaults off.
|
|
109
|
+
An explicit divider still wins. ProductVariantsManager also forwards
|
|
110
|
+
`footerDivider` for its footer slot. Separate reusable body content can still be
|
|
111
|
+
composed in a caller-owned Card; choose one owner for each headed boundary.
|
|
112
|
+
|
|
113
|
+
## Public websites and service overviews
|
|
114
|
+
|
|
115
|
+
Compose a landing page or public website from its content. `Container` owns the
|
|
116
|
+
centered measure and inline gutters; `Section` owns semantic content groups and
|
|
117
|
+
their sibling rhythm. Stack/Grid arrange copy, actions and peer subjects. Shared
|
|
118
|
+
Heading/Text roles preserve typography while heading tags express document order.
|
|
119
|
+
Choose `Page` when its route identity, commands and composition slots fit; choose
|
|
120
|
+
Container/Section when content leads. AppLayout supplies application chrome when
|
|
121
|
+
the product needs it. These are application choices, not required website shells.
|
|
122
|
+
|
|
123
|
+
The app owns section order, hero content, media, link destinations, responsive
|
|
124
|
+
placement and brand theming through existing semantic roots. Keep one inset owner:
|
|
125
|
+
Container supplies inline gutters, a site boundary may supply semantic block
|
|
126
|
+
padding, and each independently framed subject keeps Card's default inset.
|
|
127
|
+
|
|
128
|
+
A service offer or pricing option is a legitimate Card subject. Put its name and
|
|
129
|
+
description in the header, price through Money, and navigation in the footer seam.
|
|
130
|
+
Metric/MetricGrid represent observed KPIs and comparisons; a selling price belongs
|
|
131
|
+
to the offer's content. Preserve application-owned currency, billing terms and
|
|
132
|
+
destinations. See the typed [website recipe](../examples/website.tsx), which uses
|
|
133
|
+
ordinary document scrolling and a responsive service grid with real link actions.
|
|
134
|
+
|
|
77
135
|
## Typography and rich content
|
|
78
136
|
|
|
79
137
|
Choose Heading, Text, DisplayLabel, Label and TextLink from the published
|
|
@@ -101,24 +159,108 @@ the content owner. Embedded React UI can opt out of reading rhythm through
|
|
|
101
159
|
`not-typeset` or `data-not-typeset` on its subtree; those opt-outs do not bypass
|
|
102
160
|
HTML sanitization or establish a separate typography system.
|
|
103
161
|
|
|
162
|
+
### Visual heading emphasis
|
|
163
|
+
|
|
164
|
+
`Heading tag="h1"` preserves the compact admin default. For website/hero copy,
|
|
165
|
+
choose `size="3xl"` or `size="4xl"`; sections may use `size="xl"` or `"2xl"`.
|
|
166
|
+
The semantic tag, visual size and surrounding Section/Stack gap are independent.
|
|
167
|
+
Existing text-size classes remain supported overrides. Section owns rhythm,
|
|
168
|
+
Container owns measure/gutters, and application utilities may own a hero's outer
|
|
169
|
+
padding or background. No additional section/hero theme tokens are required.
|
|
170
|
+
See the [website example](../examples/website.tsx) for both hero and section emphasis.
|
|
171
|
+
|
|
172
|
+
|
|
104
173
|
## Card anatomy
|
|
105
174
|
|
|
106
175
|
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 default corners and using rounded-inner on that body.
|
|
107
176
|
|
|
177
|
+
Choose one ordinary Card surface through UIProvider's `card.defaultSurface` and
|
|
178
|
+
let sibling subjects inherit it. Explicit per-card surfaces win: mixing `card`
|
|
179
|
+
and `framed` intentionally changes their visible treatment. Header placement is
|
|
180
|
+
independent: `inside` keeps the heading with the body; `frame` puts context and
|
|
181
|
+
commands on the outer frame above the inset body. A Card title needs no icon;
|
|
182
|
+
pass `icon={<Icon />}` only when the glyph carries meaning (state, a brand, a type
|
|
183
|
+
users scan for), never as raw SVG in title JSX. Custom titles remain appropriate
|
|
184
|
+
for richer content. Facts and rows follow the same rule: one glyph repeated on
|
|
185
|
+
every MetadataList item or Item row is decoration, so leave `icon`/media empty.
|
|
186
|
+
|
|
108
187
|
Card `gap` owns spacing between regions; `contentGap` owns direct body-child
|
|
109
188
|
spacing; `textGap` owns title/supporting-copy rhythm. Region spacing defaults to
|
|
110
189
|
`xl` (`md` for `padding="none"`). Use a semantic region gap for compact cards
|
|
111
190
|
instead of resetting padding or adding local margins.
|
|
112
191
|
|
|
192
|
+
Ordinary independent cards omit `padding` and retain `md` (the full surface
|
|
193
|
+
inset, 20px at default roots). `sm` is half that inset (10px), for a deliberately
|
|
194
|
+
compact subject; it is not the default for forms, settings, metrics or resource
|
|
195
|
+
pages. Component size and
|
|
196
|
+
density do not choose Card padding. `lg` uses 1.8 times the inset (36px), while
|
|
197
|
+
`none` removes it. All sizes follow the surface roots and space-scale.
|
|
198
|
+
Dividers are off by default and
|
|
199
|
+
should stay off: separate a card's sections with `contentGap` or a Stack gap
|
|
200
|
+
clearly larger than the row gap (`2xl` between sections). UIProvider can configure
|
|
201
|
+
`card.defaultHeaderDivider` and `card.defaultFooterDivider`; explicit per-card
|
|
202
|
+
booleans win. Header/footer-only cards still render one shared divider.
|
|
203
|
+
|
|
113
204
|
Use titleSuffix for status/count/version badges. Long titles/suffixes wrap through the shared owner; no literal spaces/local margins to manufacture gaps. headerAction/actions are trailing controls, headerStart pre-title context. footerSlot/footer definitions own card-level actions; footerDivider owns the rule and inset. Do not simulate a footer inside children. SmartCard and ContentBlock are deprecated migration names; use Card in new code.
|
|
114
205
|
|
|
115
206
|
Reusable blocks/features stay card-free unless their explicit purpose is a card. Frame them at the composition boundary.
|
|
116
207
|
|
|
117
208
|
## Structure and spacing
|
|
118
209
|
|
|
119
|
-
|
|
210
|
+
Choose the smallest owner that describes the region. These layout blocks are
|
|
211
|
+
published primitives and layouts, not the domain compositions under `blocks/*`.
|
|
120
212
|
|
|
121
|
-
|
|
213
|
+
| Responsibility | Exact family and owner | Contract to preserve |
|
|
214
|
+
| --- | --- | --- |
|
|
215
|
+
| Vertical siblings or an action row | `base/structure`: Stack | Vertical by default; `direction="horizontal"` creates a row and wraps by default. Default gap is `md` (8px). There is no separate Row export. |
|
|
216
|
+
| Known responsive tracks | `base/structure`: Grid | Scalar columns are literal; use `columns={{base:1,lg:3}}` for breakpoints. Omitted columns use one, then two from md. Default gap is `xl` (16px). |
|
|
217
|
+
| Track spans | `base/structure`: GridCell | Use `span={{base:1,lg:2}}` inside the nearest Grid; keep meaningful DOM order. |
|
|
218
|
+
| Equal tiles that fit their parent | `base/structure`: AdaptiveGrid | Select `minColumnWidth`; tracks follow available width. Use Grid for prescribed breakpoints or TwoColumnLayout for a supporting rail. |
|
|
219
|
+
| Centered measure and inline gutters | `layout/containers`: Container | Defaults to xl measure and md gutter. Owns no vertical inset, scrolling or surface chrome. |
|
|
220
|
+
| A semantic content section | `layout/containers`: Section | Owns sibling rhythm, default `xl`; it adds no Card frame or page gutter. |
|
|
221
|
+
| Main content with a supporting rail | `layout/containers`: TwoColumnLayout | Owns header/main/aside/footer order and `2xl` gaps (24px). Main/aside contents choose their own Stack gaps. Page rhythm (header to body, major Sections) uses `3xl` (32px). |
|
|
222
|
+
| A bounded page scroll region | `layout/containers`: PageViewport | Owns scrolling and query containment, with no padding. AppLayout already supplies one. |
|
|
223
|
+
| Route title, commands and page content | `layout/page`: Page | Owns measure, inline/block gutters and header/body rhythm. Use `narrow` for a focused resource. |
|
|
224
|
+
| Application header/sidebar chrome | `layout/app-shell`: AppLayout | Select the shell variant, compose slots and router callbacks, and let its viewport contain Page. |
|
|
225
|
+
| A framed subject | `base/cards`: Card | Owns surface padding, header/body/footer alignment and separators; layout blocks own the space between Cards. |
|
|
226
|
+
|
|
227
|
+
See the typed [layout-block composition](../examples/layout-blocks.tsx) when composing these owners.
|
|
228
|
+
|
|
229
|
+
Use these public structures for repeated passive composition rather than
|
|
230
|
+
rebuilding the same flex/grid spacing on divs. Tailwind remains appropriate for
|
|
231
|
+
positioning, overflow, chart/table geometry and custom intrinsic tracks. Structure
|
|
232
|
+
preserves child identity; it does not inspect, clone, reorder or frame children.
|
|
233
|
+
|
|
234
|
+
### Main and aside Card gaps
|
|
235
|
+
|
|
236
|
+
Peer Cards in a Page/TwoColumnLayout workspace use `gap="2xl"` on both main and
|
|
237
|
+
aside Stacks to match its 24px grid gap. Give a peer Grid the same gap when it
|
|
238
|
+
belongs to that rhythm. A compact local card grid may deliberately keep Grid's
|
|
239
|
+
16px default. Stack's 8px default is general sibling spacing, not an automatic
|
|
240
|
+
Card rhythm; choose the role explicitly. Values above use shipped roots and
|
|
241
|
+
scale through the existing space-scale contract.
|
|
242
|
+
|
|
243
|
+
The [region recipe](../examples/layout-blocks.tsx) keeps both inner Stacks on that same peer gap.
|
|
244
|
+
|
|
245
|
+
Use `textGap="normal"|"dense"` for title/description copy; keep action gaps,
|
|
246
|
+
form groups, peer regions and surface insets independent. Do not use small copy
|
|
247
|
+
gaps between independent Cards or shrink Card padding to match control density.
|
|
248
|
+
Framed Card rings extend outside layout rectangles: inspect visible clearance
|
|
249
|
+
in both axes as well as computed gaps.
|
|
250
|
+
|
|
251
|
+
### Horizontal rows
|
|
252
|
+
|
|
253
|
+
See the typed [layout-block composition](../examples/layout-blocks.tsx): Page
|
|
254
|
+
supplies its boundary, TwoColumnLayout splits the regions, inner Stacks share
|
|
255
|
+
peer rhythm, and a horizontal Stack wraps footer actions. The app supplies the
|
|
256
|
+
subjects and commands. For viewport-responsive columns use Grid; for available
|
|
257
|
+
parent width use AdaptiveGrid or `TwoColumnLayout adaptTo="container"`.
|
|
258
|
+
|
|
259
|
+
MetadataList owns medium-weight labels and normal-weight routine values. Its
|
|
260
|
+
compact density tightens gaps/rows without shrinking primary values. Plain values
|
|
261
|
+
and typed descriptors retain the shared roles; React nodes, `display` and `render`
|
|
262
|
+
preserve supplied typography. Keep custom formatted values consistent with value
|
|
263
|
+
primitives rather than replacing labels and values with undifferentiated Text.
|
|
122
264
|
|
|
123
265
|
## Menus and controls
|
|
124
266
|
|
|
@@ -132,6 +274,13 @@ PopoverContent type="display" owns substantive-content padding; type="menu" comp
|
|
|
132
274
|
| density="compact" / "default" / "comfortable" | Collection row block rhythm, independent from inline spacing |
|
|
133
275
|
| size="sm" / "md" / "lg" | Supported control's scale; consult its declaration and provider precedence |
|
|
134
276
|
|
|
277
|
+
Input, Button, Select and filter-facet triggers share bounded inner corners
|
|
278
|
+
and corresponding heights; Card and popup shells use the global outer radius. Omitted sizes inherit the provider; explicit sizes win.
|
|
279
|
+
Keep action/control roots equal when those controls adjoin. Compact menu rows,
|
|
280
|
+
surface insets and control sizes remain independent; density can tighten the
|
|
281
|
+
inner-radius height bound without changing outer corners.
|
|
282
|
+
Inset segmented children use the supported compound owner's same-height frame.
|
|
283
|
+
|
|
135
284
|
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.
|
|
136
285
|
|
|
137
286
|
At shipped roots, compact shell padding is 8px; row inline padding is 12px; default row block padding is 8px and minimum height 36px. 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 (8px inline). Header text bodies without a leading control and footer captions add the row inset once, aligning text at 20px. Actions keep the 8px shell edge. Nested public slots do not repeat these insets.
|
|
@@ -150,8 +299,8 @@ Use exact themelia-react-ui paths. Presentation imports use blocks/<family>, rep
|
|
|
150
299
|
## Copy rhythm
|
|
151
300
|
|
|
152
301
|
For title/supporting-copy rhythm use `textGap="normal" | "dense"` on Card,
|
|
153
|
-
PageHeading and public surface headers
|
|
154
|
-
|
|
302
|
+
PageHeading and public surface headers. The installed token reference records
|
|
303
|
+
their unscaled defaults. Item/ItemContent and menu popover headers default to dense.
|
|
155
304
|
Stack/Grid accept the same semantic gaps, including responsive objects and
|
|
156
305
|
axis overrides. Keep surface insets and action-cluster gaps on their owners;
|
|
157
306
|
do not add a second margin to descriptions.
|
|
@@ -257,6 +406,43 @@ parent width while preserving main-before-aside DOM/focus order.
|
|
|
257
406
|
|
|
258
407
|
See the installed [workspace recipe](../examples/app-layout.tsx).
|
|
259
408
|
|
|
409
|
+
PageViewport owns scrolling and adds no padding. Page defaults to `gutter="lg"`
|
|
410
|
+
and `padding="lg"` (36px at shipped roots), so it owns inline/block space once.
|
|
411
|
+
`narrow` selects centered `md` width; explicit `maxWidth` wins. Header copy
|
|
412
|
+
defaults to dense; `textGap="normal"` is an explicit alternative. Do not assume
|
|
413
|
+
an app shell supplies gutters because it supplies a viewport. Set `gutter="none"`
|
|
414
|
+
only when an actual parent Container/surface supplies the inline inset, such as
|
|
415
|
+
StackedLayout's contained mode. Block padding remains independent.
|
|
416
|
+
That contained measure uses the same large gutter as Page; ordinary Container
|
|
417
|
+
defaults remain unchanged.
|
|
418
|
+
|
|
419
|
+
Select width from the task: a single focused resource/form can use `narrow`;
|
|
420
|
+
a record with a supporting aside can retain the default `lg` measure and use
|
|
421
|
+
TwoColumnLayout. A wide comparison/directory can deliberately use `maxWidth="full"`.
|
|
422
|
+
Setting full on every route defeats the resource measure. Do not remove Page's
|
|
423
|
+
gutters to make its title touch the sidebar; align the header and body through
|
|
424
|
+
the same Page. Density, container measure and page inset are separate choices.
|
|
425
|
+
The [detail recipe](../examples/detail.tsx) includes `AccountDetailPage`: a
|
|
426
|
+
centered resource measure, route-level commands, native Card icon/frame anatomy
|
|
427
|
+
and MetadataList facts, with no duplicated subject header or gutter.
|
|
428
|
+
|
|
429
|
+
Compose HeaderUserMenu in topbar `slots.headerEnd` or a local toolbar, and
|
|
430
|
+
SidebarNavigationUser in AppSidebar `slots.footer` when account access belongs
|
|
431
|
+
in navigation. Use SidebarWorkspaceDropdown for workspace links, or add a
|
|
432
|
+
custom control through `slots.headerEnd` alongside the logo. `headerStart` and
|
|
433
|
+
`headerEnd` stay inside the padded, fixed header; `slots.header` replaces it all.
|
|
434
|
+
`beforeNavigation` scrolls with the links. SidebarFooter owns its rule and inset.
|
|
435
|
+
LayoutSidebarProvider defaults to compact row gaps; explicit density still wins.
|
|
436
|
+
WorkspaceLayout owns its own bounded content inset; do not add a padded Page
|
|
437
|
+
inside it. WorkspaceRecordHeader and WorkspaceLocaleStrip align to the same
|
|
438
|
+
large inline surface role. Record copy supports textGap with a dense default.
|
|
439
|
+
Below 80rem of its own width, WorkspaceLayout scrolls header and body together;
|
|
440
|
+
above that boundary its main region scrolls beside the sidebar. Its rail appears
|
|
441
|
+
at 96rem. Supply header/drawer access to essential hidden regions on narrow
|
|
442
|
+
screens; this passive layout does not create a complete mobile workflow.
|
|
443
|
+
Do not infer workspace/user menus from a generic Avatar: choose their actual
|
|
444
|
+
published owners and supply permitted callbacks. The app owns user/workspace data.
|
|
445
|
+
|
|
260
446
|
## Task and usage summaries, editable fields
|
|
261
447
|
|
|
262
448
|
| Intent | Public owner | Composition boundary |
|
|
@@ -57,15 +57,36 @@ an explicitly expandable card retains its collapse region.
|
|
|
57
57
|
| `--space-scale` | Shared gaps, inline insets and surface padding | Row block/control-height density |
|
|
58
58
|
| `--density-scale` | Action/control heights and row block padding | Inline room or primary text hierarchy |
|
|
59
59
|
|
|
60
|
-
`--gap-normal` and `--gap-dense` default to 0.
|
|
60
|
+
`--gap-normal` and `--gap-dense` default to 0.25rem and 0.125rem. Their utilities
|
|
61
61
|
multiply once by `--space-scale`. Descriptions have no extra margin. These are
|
|
62
62
|
copy gaps; larger section and action-cluster gaps remain on their own owners.
|
|
63
63
|
The [token reference](tokens.json) records the installed defaults and vocabulary.
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
65
|
+
Outer Card, popup and Command shells use `rounded-radius`: the shadcn root,
|
|
66
|
+
12px by default. Input, Button, Select/facet triggers, collection highlights,
|
|
67
|
+
navigation rows and intentional nested bodies use the shared `rounded-inner`
|
|
68
|
+
role, 9px by default. It derives at 0.75× and is bounded by one quarter of the
|
|
69
|
+
smaller action/control base height, scaled by density. A larger global root
|
|
70
|
+
therefore cannot turn short controls into capsules. See [the exact theme
|
|
71
|
+
recipe](theming.md). Density can tighten the inner bound; it does not change
|
|
72
|
+
outer corners. Spacing scale and padding do not select another radius tier.
|
|
73
|
+
|
|
74
|
+
Use the public component defaults instead of adding radius classes to callers.
|
|
75
|
+
Joined edges may reset their meeting corners. Circular indicators and avatars
|
|
76
|
+
retain their shape; Badge retains its root-based recipe. Elevation uses the
|
|
77
|
+
existing shadow ladder, with family recipes selecting the tier; neither a
|
|
78
|
+
card/menu radius root nor a separate shadow root is needed.
|
|
79
|
+
|
|
80
|
+
For appearance feedback, compare the actual open/focused state with the requested
|
|
81
|
+
theme value. Inspect CSS radius resolution, dimensions, clipping, borders and
|
|
82
|
+
rings as well as the computed root. Correct the visible problem at its owner;
|
|
83
|
+
matching radius values alone do not establish that the result looks right.
|
|
84
|
+
|
|
85
|
+
For adjoining fields and actions, keep `--height-action` and `--height-control`
|
|
86
|
+
equal and choose corresponding supported sizes. Omit `size` to inherit the
|
|
87
|
+
provider scale; an explicit prop intentionally takes precedence. Feature wrappers
|
|
88
|
+
should preserve that inheritance rather than force `md` on one facet while its
|
|
89
|
+
neighbor inherits `sm`. Deliberately different action/field roots remain supported.
|
|
69
90
|
|
|
70
91
|
Structural dividers use one private recipe owner with explicit frame, anchored
|
|
71
92
|
and modal roles. They share the semantic `border` root; their established strength
|
|
@@ -102,12 +123,17 @@ for logical geometry, keyboard navigation and anchored positioning; see
|
|
|
102
123
|
3. Change an existing shared root at the intended [theme boundary](theming.md) when several related components should move together.
|
|
103
124
|
4. If the public API cannot express a recurring composition, request an additive seam at that owner. Keep genuinely application-specific geometry namespaced in the application.
|
|
104
125
|
|
|
105
|
-
|
|
106
|
-
|
|
126
|
+
Use Card's `padding` and slots, and Popover/Command/Select/Combobox's supported
|
|
127
|
+
inset and region props to correct shared padding. Preserve their internal recipe
|
|
128
|
+
instead of replacing it through `contentClassName`, inline styles, descendants and
|
|
107
129
|
forwarding wrappers. Likewise, do not locally replace fixed control typography
|
|
108
130
|
or make descriptions carry surrounding margins. The same restriction applies
|
|
109
131
|
to token-backed overrides: a semantic utility can still be used on the wrong owner.
|
|
110
132
|
|
|
133
|
+
For custom copy, use `<Stack gap="dense">` around a title and description rather
|
|
134
|
+
than `className="mt-space-sm"` on the description's Text. Preserve Text/Heading's
|
|
135
|
+
size and semantic-element APIs; move surrounding margins to the structure owner.
|
|
136
|
+
|
|
111
137
|
Theme inheritance belongs to CSS. Use ThemeScope for scoped portals; an explicit
|
|
112
138
|
portal container must live in the intended boundary. Provider defaults and app
|
|
113
139
|
callbacks do not form a parallel JavaScript styling system. Opening a popup is
|
|
@@ -14,11 +14,22 @@ node node_modules/themelia-react-ui/docs/consumer-skill/scripts/find-components.
|
|
|
14
14
|
|
|
15
15
|
For a copied skill, replace the script path with that copy's `scripts/find-components.mjs`. Copy the complete skill folder: the script resolves its adjacent `references/public-api.json` relative to itself, regardless of the working directory. It needs Node compatible with the package's engine requirement, not an npm/global CLI or extra dependency.
|
|
16
16
|
|
|
17
|
-
Queries accept multiple words, quoted or separate. Every term must match
|
|
17
|
+
Queries accept multiple words, quoted or separate. Every term must match metadata
|
|
18
|
+
as a word; `stat` does not match `state` or `status`. An unknown term produces
|
|
19
|
+
empty results. Exact imports and case-exact exported names such as `Table` or
|
|
20
|
+
`Empty` select their precise contract. Ordinary task nouns `table` and `empty`
|
|
21
|
+
retain DataTable/DataView and EmptyState alongside the base anatomy. Exported
|
|
22
|
+
types and helper symbols remain available by their exact API name; documented
|
|
23
|
+
component symbols and curated aliases drive task recommendations.
|
|
24
|
+
`--layer` filters the technical package layer: `foundations`, `base`, `layout`,
|
|
25
|
+
`blocks` or `features`. This differs from browse sections: Structure browses
|
|
26
|
+
Foundations but filters under `--layer base`. `--limit` accepts 1–100 and defaults
|
|
27
|
+
to 5. Invalid flags/options or incompatible indexes exit nonzero on stderr.
|
|
18
28
|
|
|
19
29
|
If a query returns no results, shorten it to the main responsibility or an exact
|
|
20
|
-
symbol, then remove the layer filter.
|
|
21
|
-
|
|
30
|
+
symbol, then remove the layer filter. No result does not prove the package lacks
|
|
31
|
+
that responsibility. Read the selected result's choose/avoid guidance and
|
|
32
|
+
alternatives, then follow `nextReads`; do not load every reference. For routine compact searchable selection, search
|
|
22
33
|
`PopoverMenu` or `compact searchable selection`; surface adjectives describe
|
|
23
34
|
variants, not permission to rebuild the owner's padding.
|
|
24
35
|
|
|
@@ -35,13 +46,77 @@ or `theme boundary`. Read choose/avoid and app-owned responsibilities before
|
|
|
35
46
|
deciding; a directory result does not require DataView when its workflow differs.
|
|
36
47
|
Unknown terms still return no result; no fuzzy API or guessed prop is invented.
|
|
37
48
|
|
|
38
|
-
|
|
49
|
+
Task language also includes `dashboard KPIs`, `dashboard metrics`, `revenue
|
|
50
|
+
overview`, `statistic cards`, `usage statistics` and `single resource page`.
|
|
51
|
+
`dark header` and `light header` select AppLayout shell composition.
|
|
52
|
+
KPI peers select MetricGrid/MetricBar guidance; one statistic card selects Metric;
|
|
53
|
+
usage quotas select the focused UsageCard leaf; a record route selects Page.
|
|
54
|
+
The [analytics reference](analytics.md) explains their boundary with simple
|
|
55
|
+
InlineStat facts, MetadataList and legitimate custom Card subjects.
|
|
56
|
+
|
|
57
|
+
`kpi`, `metric card`, `number card`, `statistics` and `stat` expose Metric.
|
|
58
|
+
`key value` and `details` retain MetadataList and InlineStat before helper rows.
|
|
59
|
+
`chat` includes Message/MessageBubble as well as AiChat: choose message presentation
|
|
60
|
+
or the complete prompt/conversation workflow according to the task. `markdown`
|
|
61
|
+
routes to RichText's sanitized `html` display contract; the application converts
|
|
62
|
+
Markdown to HTML. It does not introduce a Markdown parser or an invented renderer.
|
|
63
|
+
|
|
64
|
+
For `website landing page`, `public website` or `service overview`, discovery
|
|
65
|
+
selects Container/Section and the focused [website composition](composition.md#public-websites-and-service-overviews)
|
|
66
|
+
recipe. Choose Page instead when its route identity/command contract fits the
|
|
67
|
+
content; application chrome and analytics are separate responsibilities.
|
|
68
|
+
|
|
69
|
+
For geometry, `radius`, `border radius`, `control corners` and `control heights` select the existing UIProvider/theme
|
|
70
|
+
boundary guidance; `copy gaps` selects Structure. Their focused references explain
|
|
71
|
+
outer/inner corner roles, corresponding sizes, inherited defaults and normal/dense
|
|
72
|
+
copy rhythm even when no executable recipe matches the query. `page padding`
|
|
73
|
+
selects Page; `card padding` selects Card. Read those owners before adding local
|
|
74
|
+
gutters, reducing normal Card insets or rebuilding their headers/footers.
|
|
75
|
+
|
|
76
|
+
Output is deterministic JSON: package/version, query/options, total matching
|
|
77
|
+
families and bounded `results`. Each result includes exact `import`, packaged
|
|
78
|
+
`declaration`, technical `layer`, responsibility, required `optionalPeers`, match
|
|
79
|
+
kind, exact `matchedSymbols`, `relevantSymbols`, `nextReads` and up to three
|
|
80
|
+
relevant guidance entries. Exact symbol queries keep that symbol; intent queries
|
|
81
|
+
derive relevantSymbols from selected catalogue API sections and current public
|
|
82
|
+
exports. An exact family import retains the complete public symbol vocabulary.
|
|
83
|
+
Deprecated migration names such as `SmartCard` or `ContentBlockProps` never
|
|
84
|
+
appear in intent recommendations. When a result touches one, its `deprecated`
|
|
85
|
+
map names the replacement, for example `{ "SmartCard": "Use Card." }`; write
|
|
86
|
+
new code with the replacement. The public index carries the same map per family.
|
|
87
|
+
Exact guide aliases precede generic overlap, and unrelated family pages
|
|
88
|
+
do not fill the result merely to reach three entries.
|
|
89
|
+
|
|
90
|
+
`nextReads.declaration` is relative to the installed package root.
|
|
91
|
+
`nextReads.references` and `nextReads.examples[].file` are relative to this
|
|
92
|
+
skill folder, so they also work with a complete copied skill. Examples report
|
|
93
|
+
their actual exported recipe names and the selected public symbols they use.
|
|
94
|
+
Recipe selection requires symbol overlap, not just a common family import.
|
|
95
|
+
This prevents a PageHeader selection from inheriting Page-only recipes. A
|
|
96
|
+
recipe's `optionalPeers` comes from its manifest and can include other families'
|
|
97
|
+
requirements beyond the selected owner's peers. Inspect it before copying. A
|
|
98
|
+
selected family with no matching recipe reports empty references/examples;
|
|
99
|
+
use its declaration and the [full index](public-api.json), without guessing.
|
|
100
|
+
|
|
101
|
+
Family sections/guidance placement follows browse responsibility. Guidance
|
|
102
|
+
carries jobs, tags, aliases, choose/avoid, app ownership, browse context, API
|
|
103
|
+
sections/symbols and alternatives resolved to exact imports. Results suggest
|
|
104
|
+
owners and focused reads; declarations establish actual props and behavior.
|
|
39
105
|
|
|
40
106
|
Read each declaration relative to the installed package root, for example `node_modules/themelia-react-ui/dist/components/base/cards/index.d.ts`, following its relative exports as needed. Copying this skill copies metadata, not the declaration tree: use declarations from the same installed package version. Never combine metadata from one version with another version's declarations.
|
|
41
107
|
|
|
42
108
|
`ThemeScope` has distinct contracts. Root and `themelia-react-ui/ui-provider` export the basic CSS-inheritance boundary with native div/style props and portal hosting. `themelia-react-ui/features/theme-tweaker` exports the advanced theme-definition scope. Inspect the result's responsibility and that exact family's declaration before selecting props.
|
|
43
109
|
|
|
44
|
-
The index retains
|
|
110
|
+
The index retains schemaVersion/discoveryVersion 1; optional family `recipes` and `references`
|
|
111
|
+
are compatible additions. Package identity/peers derive from the published
|
|
112
|
+
manifest, symbols/declarations from live exports, and jobs/guidance from the
|
|
113
|
+
consumer catalogue. Recipe metadata derives from the existing example manifest,
|
|
114
|
+
each export's actual use of exact public imports and reference-to-recipe section links; it adds no
|
|
115
|
+
independent task taxonomy. Older matching indexes without recipes still work
|
|
116
|
+
and return empty recipe reads. Utility/root responsibilities have explicit
|
|
117
|
+
owners when no catalogue family represents them. Optional peer requirements
|
|
118
|
+
follow transitive local imports, including type-only and resolved `@types` peers.
|
|
119
|
+
These describe whole-family requirements; tree shaking may produce a smaller graph.
|
|
45
120
|
|
|
46
121
|
Routing, records, translation, permissions and backend effects stay in the application. Discovery grants no publication or global installation authority.
|
|
47
122
|
|
|
@@ -64,6 +64,28 @@ files or publisher markers in the copy are not checked. Keep local product polic
|
|
|
64
64
|
outside the package guidance. Recopy the complete folder after upgrades, and
|
|
65
65
|
read declarations from the installed package.
|
|
66
66
|
|
|
67
|
+
## Upgrading to the neutral button default
|
|
68
|
+
|
|
69
|
+
An untoned `Button` is now the neutral outline (`tone="secondary"`,
|
|
70
|
+
`buttonStyle="outline"`); a Button with a `tone` and no `buttonStyle` stays
|
|
71
|
+
solid. Screens that relied on untoned Buttons being the solid primary can keep
|
|
72
|
+
their look with the bundled codemod. It reports by default and edits only with
|
|
73
|
+
`--write`; review the diff before committing:
|
|
74
|
+
|
|
75
|
+
```sh
|
|
76
|
+
node node_modules/themelia-react-ui/docs/consumer-skill/scripts/pin-button-defaults.mjs src
|
|
77
|
+
node node_modules/themelia-react-ui/docs/consumer-skill/scripts/pin-button-defaults.mjs --write src
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
It adds `tone="primary"` to every Button, BaseButton or BaseButtonLink imported
|
|
81
|
+
from the package without a `tone`. Add `--solid-only` to skip untoned outline
|
|
82
|
+
and ghost Buttons so they turn neutral instead of keeping the brand color.
|
|
83
|
+
Buttons whose props come from a spread are listed as `unresolved` for review.
|
|
84
|
+
Apps that already set `UIProvider` `button.defaultTone` keep that tone and do not
|
|
85
|
+
need the codemod; `button: { defaultTone: 'primary', defaultButtonStyle: 'solid' }`
|
|
86
|
+
restores the previous default app-wide. Afterwards, demote extra primaries so
|
|
87
|
+
each page or surface keeps one.
|
|
88
|
+
|
|
67
89
|
## Manual skill copying
|
|
68
90
|
|
|
69
91
|
1. Choose an agent skill destination in the user's configured skills directory,
|
|
@@ -18,6 +18,20 @@ Load intentional, scoped app overrides after the package stylesheet. Keep broad
|
|
|
18
18
|
|
|
19
19
|
UIProvider supplies stable mount-time defaults: explicit prop, provider default, fallback. Per-mount requests/data/callbacks stay on components. ThemeScope from themelia-react-ui/ui-provider places descendant portals inside its CSS boundary. A styled div does not relocate body portals; explicit Base UI portal containers take precedence.
|
|
20
20
|
|
|
21
|
+
For separated card regions, configure the single application provider with
|
|
22
|
+
`card: { defaultSurface: 'card', defaultHeaderDivider: true, defaultFooterDivider: true }`.
|
|
23
|
+
Explicit Card booleans, including false, override these defaults. Ordinary card
|
|
24
|
+
padding remains md, independent of density. The typed [workspace recipe](../examples/app-layout.tsx)
|
|
25
|
+
exports `workspaceUIDefaults` for that root configuration and composes the public
|
|
26
|
+
workspace/user controls. It does not mount another UIProvider inside the app.
|
|
27
|
+
|
|
28
|
+
Page owns inline/block insets and offers `narrow` for a centered resource page.
|
|
29
|
+
PageViewport owns scroll containment only. Check actual padding before passing
|
|
30
|
+
`gutter="none"`; a local guide claiming all shell viewports are padded contradicts
|
|
31
|
+
the installed contract. Fix that app policy through its own review rather than
|
|
32
|
+
compensating with card or field padding. Bounded AppSidebar instances use h-full
|
|
33
|
+
inside the shell's constrained column; standalone sidebars may use viewport height.
|
|
34
|
+
|
|
21
35
|
For RTL, pair the native DOM direction with `DirectionProvider` from the same
|
|
22
36
|
entrypoint. Native `dir` owns text flow and logical CSS geometry; the provider
|
|
23
37
|
owns Base UI keyboard navigation and popup positioning. It does not set `dir`.
|
|
@@ -36,7 +50,38 @@ does not replace the single mount-time UIProvider configuration boundary.
|
|
|
36
50
|
|
|
37
51
|
Routing comes through href, callbacks or Base UI render composition. React Router is not required. Component chunks preserve client boundaries; pure utilities remain separate.
|
|
38
52
|
|
|
39
|
-
|
|
53
|
+
## Dialogs, confirmations and drawers
|
|
54
|
+
|
|
55
|
+
Every dialog-like surface comes from `themelia-react-ui/features/overlays`; it is
|
|
56
|
+
the only modal system. The overlay owners hold focus entry and trapping, Escape
|
|
57
|
+
and outside-click dismissal, focus return to the trigger, pending and error
|
|
58
|
+
states, portal theming and the shared scrim (a plain tint, never a blur).
|
|
59
|
+
|
|
60
|
+
| Need | Owner |
|
|
61
|
+
| --- | --- |
|
|
62
|
+
| A focused edit or form with confirm/cancel | `ActionDialog` |
|
|
63
|
+
| A yes/no question, or a destructive confirmation | `ConfirmDialog` (destructive tone for irreversible actions) |
|
|
64
|
+
| A longer form, filters or record details beside the page | `ActionDrawer` |
|
|
65
|
+
| Open state, triggers and several overlays on one screen | `useOverlayVisibility` (`overlayProps`, `show`, `hide`) |
|
|
66
|
+
|
|
67
|
+
Pass `overlayProps` for visibility. `onAsyncConfirm` awaits the operation and
|
|
68
|
+
keeps the overlay open on failure; `onError` reports it. Do not also pass
|
|
69
|
+
`onConfirm`, which takes precedence. Each overlay owns one primary command, its
|
|
70
|
+
confirm button; compose the body with the ordinary Stack, FormField and Card
|
|
71
|
+
anatomy and leave its insets to the overlay.
|
|
72
|
+
|
|
73
|
+
Do not hand-roll a modal (a `fixed inset-0` scrim, `role="dialog"`,
|
|
74
|
+
`aria-modal`), do not import the lower-level `Dialog`, `AlertDialog` or `Sheet`
|
|
75
|
+
building blocks, and do not add another modal library (Radix Dialog,
|
|
76
|
+
react-modal, vaul, Headless UI or React Aria dialogs). The optional checker
|
|
77
|
+
warns on each of these. Popovers, menus, selects and tooltips are anchored
|
|
78
|
+
surfaces, not dialogs: use their own owners.
|
|
79
|
+
|
|
80
|
+
To show a table full screen, use `DataTable`'s own mode (`fullscreen` or
|
|
81
|
+
`defaultFullscreen`, `onFullscreenChange`, `showFullscreenToggle`) instead of
|
|
82
|
+
moving the table into a dialog. It maximises the table in place, so scroll
|
|
83
|
+
position, focus and column state survive; Escape leaves, Tab stays inside and
|
|
84
|
+
focus returns to the toggle.
|
|
40
85
|
|
|
41
86
|
PlaceAutocomplete from themelia-react-ui/features/map uses Photon by default. Supply a stable or useCallback-memoized searchPlaces: PlaceSearchCallback to use your geocoder; it receives PlaceSearchOptions and an AbortSignal and returns Promise<PlaceFeature[]>. Adapt provider results to the existing place shape and OSM identifiers (duplicates are removed by osm_id). Changing provider identity or search options cancels the old lookup and searches the current query. Respect the signal; superseded responses are ignored even if a provider cannot cancel. Keep provider identity stable during ordinary renders. Notification callbacks may be inline. onSearchError reports current failures; the built-in Retry action repeats the lookup and strings.retry localizes its label.
|
|
42
87
|
|