themelia-react-ui 1.0.0 → 1.0.2
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 +190 -1
- package/README.md +92 -13
- package/dist/{accordion-BRWh3BM1.js → accordion-BRTcsp8J.js} +8 -8
- package/dist/accordion-BRTcsp8J.js.map +1 -0
- package/dist/{action-menu-Cx3SdfbN.js → action-menu-Drxw_vJk.js} +36 -36
- package/dist/action-menu-Drxw_vJk.js.map +1 -0
- package/dist/affordance-geometry.generated-CL84ZN9A.js +63 -0
- package/dist/affordance-geometry.generated-CL84ZN9A.js.map +1 -0
- package/dist/{ai-artifact-DkOArd3-.js → ai-artifact-DLVdK0Py.js} +151 -155
- package/dist/ai-artifact-DLVdK0Py.js.map +1 -0
- package/dist/{app-shell-BH_bGcE2.js → app-shell-C_fKpljx.js} +11 -10
- package/dist/app-shell-C_fKpljx.js.map +1 -0
- package/dist/{attachment-DsLgNHXt.js → attachment-DbjUWsP0.js} +12 -12
- package/dist/{attachment-DsLgNHXt.js.map → attachment-DbjUWsP0.js.map} +1 -1
- package/dist/auth-CAQcasMV.js +723 -0
- package/dist/auth-CAQcasMV.js.map +1 -0
- package/dist/{avatar-CsnWaYmt.js → avatar-Bu2HhitA.js} +76 -71
- package/dist/avatar-Bu2HhitA.js.map +1 -0
- package/dist/{badge-BZXZT9wd.js → badge-CzId1Wlm.js} +4 -4
- package/dist/{badge-BZXZT9wd.js.map → badge-CzId1Wlm.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/buttons.js +3 -2
- package/dist/base/cards.js +3 -3
- package/dist/base/carousel.js +25 -27
- package/dist/base/carousel.js.map +1 -1
- package/dist/base/cascader.js +150 -148
- package/dist/base/cascader.js.map +1 -1
- package/dist/base/chart.js +1 -1
- package/dist/base/choice-inputs.js +3 -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 -3
- package/dist/base/forms-numeric.js +1 -1
- package/dist/base/forms.js +2 -2
- package/dist/base/inline-edit.js +233 -0
- package/dist/base/inline-edit.js.map +1 -0
- 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 +1 -1
- package/dist/base/repeaters.js +33 -33
- 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 +83 -81
- 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 +6 -6
- 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 +134 -134
- package/dist/blocks/admin.js.map +1 -1
- package/dist/blocks/ai.js +120 -117
- package/dist/blocks/ai.js.map +1 -1
- package/dist/blocks/analytics/usage-card.js +3 -0
- package/dist/blocks/analytics.js +530 -491
- 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 +395 -383
- 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 +311 -0
- package/dist/blocks/planning.js.map +1 -0
- package/dist/blocks/timelines.js +1 -1
- package/dist/{breadcrumbs-DdQ_I5ra.js → breadcrumbs-BuYz5SDU.js} +9 -8
- package/dist/breadcrumbs-BuYz5SDU.js.map +1 -0
- package/dist/button-BZDasD04.js +651 -0
- package/dist/button-BZDasD04.js.map +1 -0
- package/dist/{button-BS6l5JUw.js → button-BZyfTvwm.js} +3 -3
- package/dist/button-BZyfTvwm.js.map +1 -0
- package/dist/buttons-D_6KJvEE.js +99 -0
- package/dist/buttons-D_6KJvEE.js.map +1 -0
- package/dist/{cards-BMB0laLG.js → cards-qGSErLw_.js} +12 -12
- package/dist/{cards-BMB0laLG.js.map → cards-qGSErLw_.js.map} +1 -1
- package/dist/chart-Bsc5BICK.js +150 -0
- package/dist/chart-Bsc5BICK.js.map +1 -0
- package/dist/checkbox-BQNDjUCh.js +34 -0
- package/dist/checkbox-BQNDjUCh.js.map +1 -0
- package/dist/choice-inputs-Mk3iWbhr.js +725 -0
- package/dist/choice-inputs-Mk3iWbhr.js.map +1 -0
- package/dist/{code-block-DIlqzoiD.js → code-block-DzHKRybS.js} +23 -23
- package/dist/code-block-DzHKRybS.js.map +1 -0
- package/dist/{collapsible-DsnktFNv.js → collapsible-ClvC7Bj3.js} +3 -3
- package/dist/{collapsible-DsnktFNv.js.map → collapsible-ClvC7Bj3.js.map} +1 -1
- package/dist/{collection-content-C4fthJV_.js → collection-content-D6S8cv_n.js} +3 -3
- package/dist/{collection-content-C4fthJV_.js.map → collection-content-D6S8cv_n.js.map} +1 -1
- package/dist/{combobox-HDftpzxt.js → combobox-BFnbJJp3.js} +18 -18
- package/dist/combobox-BFnbJJp3.js.map +1 -0
- package/dist/{combobox-CHD750do.js → combobox-hozNwUcc.js} +313 -316
- package/dist/combobox-hozNwUcc.js.map +1 -0
- package/dist/{command-D0kWBZfd.js → command-BnmSchli.js} +9 -9
- package/dist/command-BnmSchli.js.map +1 -0
- package/dist/comments-u5L0OGip.js +1156 -0
- package/dist/comments-u5L0OGip.js.map +1 -0
- package/dist/components/base/buttons/button-group.recipes.d.ts +1 -1
- package/dist/components/base/buttons/button.recipes.d.ts +10 -19
- 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 +3 -1
- package/dist/components/base/date-pickers/date-picker.recipes.d.ts +5 -18
- package/dist/components/base/date-pickers/datepicker.types.d.ts +3 -0
- package/dist/components/base/forms/form-field.d.ts +1 -0
- package/dist/components/base/forms/form-sizing.d.ts +3 -3
- package/dist/components/base/inline-edit/index.d.ts +2 -0
- package/dist/components/base/inline-edit/inline-edit.d.ts +81 -0
- package/dist/components/base/inline-edit/inline-edit.recipes.d.ts +6 -0
- 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/structure/structure.recipes.d.ts +6 -0
- 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-trailing-action.d.ts +3 -0
- package/dist/components/blocks/analytics/index.d.ts +1 -0
- package/dist/components/blocks/analytics/types.d.ts +1 -1
- package/dist/components/blocks/analytics/usage-card/index.d.ts +3 -0
- package/dist/components/blocks/analytics/usage-card/types.d.ts +52 -0
- package/dist/components/blocks/analytics/usage-card/usage-card.d.ts +6 -0
- package/dist/components/blocks/analytics/usage-card/usage-card.data.d.ts +19 -0
- package/dist/components/blocks/analytics/usage-card/usage-card.strings.d.ts +22 -0
- package/dist/components/blocks/collaboration/message/message.recipes.d.ts +12 -0
- 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/planning/index.d.ts +3 -0
- package/dist/components/blocks/planning/task-card.d.ts +3 -0
- package/dist/components/blocks/planning/task-card.strings.d.ts +15 -0
- package/dist/components/blocks/planning/task-card.types.d.ts +66 -0
- 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/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/hooks/use-pending-overlay-focus.d.ts +2 -0
- package/dist/components/features/overlays/overlays.types.d.ts +5 -4
- 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/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/page.d.ts +0 -1
- package/dist/components/layout/page/page.types.d.ts +9 -3
- 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/typography/heading.d.ts +5 -2
- package/dist/components/typography/index.d.ts +1 -1
- package/dist/components/typography/text.styles.d.ts +10 -0
- package/dist/components/ui/popover.d.ts +1 -1
- package/dist/components/ui/sidebar.d.ts +1 -1
- 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-CPNyNo1_.js → containers-DqB-bSYE.js} +34 -56
- package/dist/containers-DqB-bSYE.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-BTSByfmq.js} +6 -6
- package/dist/{copyable-B7SBXJMr.js.map → copyable-BTSByfmq.js.map} +1 -1
- package/dist/{data-display-b3d1TfL4.js → data-display-Bihs9Ven.js} +542 -329
- package/dist/data-display-Bihs9Ven.js.map +1 -0
- package/dist/{date-BFNMnrS5.js → date-DOKhJPu7.js} +4 -4
- package/dist/{date-BFNMnrS5.js.map → date-DOKhJPu7.js.map} +1 -1
- package/dist/{date-picker-DI6kPNof.js → date-picker-DzP5HQq7.js} +492 -472
- package/dist/date-picker-DzP5HQq7.js.map +1 -0
- package/dist/date-pickers-BpgGz7S-.js +196 -0
- package/dist/date-pickers-BpgGz7S-.js.map +1 -0
- package/dist/{display-ByI5tkqy.js → display-CS6Hbk18.js} +8 -8
- package/dist/{display-ByI5tkqy.js.map → display-CS6Hbk18.js.map} +1 -1
- package/dist/{dropdown-menu-BlnyHr-9.js → dropdown-menu-D-boNgGO.js} +7 -7
- package/dist/{dropdown-menu-BlnyHr-9.js.map → dropdown-menu-D-boNgGO.js.map} +1 -1
- package/dist/features/activities.js +152 -141
- package/dist/features/activities.js.map +1 -1
- package/dist/features/ai-chat.js +182 -179
- 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 +103 -104
- package/dist/features/email-composer.js.map +1 -1
- package/dist/features/event-calendar.js +375 -373
- package/dist/features/event-calendar.js.map +1 -1
- package/dist/features/filters.js +1 -1
- package/dist/features/global-search.js +222 -224
- 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 +856 -855
- 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 +1210 -1209
- package/dist/features/products.js.map +1 -1
- package/dist/features/questionnaire.js +133 -132
- package/dist/features/questionnaire.js.map +1 -1
- package/dist/features/resource-assignment.js +29 -31
- 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 +82 -82
- package/dist/features/schema-form.js.map +1 -1
- package/dist/features/suggestions.js +3 -3
- package/dist/features/sync.js +4 -4
- package/dist/features/sync.js.map +1 -1
- package/dist/features/table.js +1 -1
- package/dist/features/theme-tweaker.js +456 -450
- package/dist/features/theme-tweaker.js.map +1 -1
- package/dist/feedback-CJkUAapr.js +233 -0
- package/dist/feedback-CJkUAapr.js.map +1 -0
- package/dist/field-affordance-recipes-uKY4MsZ_.js +25 -0
- package/dist/field-affordance-recipes-uKY4MsZ_.js.map +1 -0
- package/dist/{field-state-recipes-CBTRt9Bt.js → field-state-recipes-DQQpiLWC.js} +3 -3
- package/dist/field-state-recipes-DQQpiLWC.js.map +1 -0
- package/dist/{filters-qtrcv1hf.js → filters-D6FF8L6s.js} +715 -720
- package/dist/filters-D6FF8L6s.js.map +1 -0
- package/dist/{form-field-C6W-y2hR.js → form-field-CZwrkP7m.js} +17 -9
- package/dist/form-field-CZwrkP7m.js.map +1 -0
- package/dist/{form-sizing-39NohSqn.js → form-sizing-QP8aIRaW.js} +10 -6
- package/dist/form-sizing-QP8aIRaW.js.map +1 -0
- package/dist/{forms-BF-HSbff.js → forms-B5NCbkSC.js} +35 -35
- package/dist/{forms-BF-HSbff.js.map → forms-B5NCbkSC.js.map} +1 -1
- package/dist/forms-numeric-Crrm80Lm.js +867 -0
- package/dist/forms-numeric-Crrm80Lm.js.map +1 -0
- package/dist/{header-B8ex54cY.js → header-kxruN3RM.js} +53 -49
- package/dist/header-kxruN3RM.js.map +1 -0
- package/dist/{hooks-D6UBVzf2.js → hooks-BrlnCwQd.js} +2 -2
- package/dist/{hooks-D6UBVzf2.js.map → hooks-BrlnCwQd.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-Btc6pQrp.js} +4 -4
- package/dist/{icon-badge-Dv0RYQwj.js.map → icon-badge-Btc6pQrp.js.map} +1 -1
- package/dist/index.js +2 -2
- package/dist/input-SX9V0AL3.js +255 -0
- package/dist/input-SX9V0AL3.js.map +1 -0
- package/dist/input-vxcaNCYC.js +20 -0
- package/dist/input-vxcaNCYC.js.map +1 -0
- package/dist/{item-pJ0GsOiJ.js → item-DE4YnuJx.js} +18 -17
- package/dist/item-DE4YnuJx.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 +44 -4
- package/dist/lib/control-group-recipes.d.ts +22 -0
- package/dist/lib/field-affordance-recipes.d.ts +35 -2
- package/dist/lib/field-state-recipes.d.ts +2 -2
- package/dist/lib/navigation-row-recipes.d.ts +3 -2
- package/dist/lib/overlay-anatomy-recipes.d.ts +1 -1
- package/dist/lib/surface-recipes.d.ts +5 -2
- package/dist/lib/token-merge.generated.d.ts +144 -2
- package/dist/lib/ui-provider/types.d.ts +4 -2
- package/dist/lib/use-prefers-reduced-motion.d.ts +2 -0
- package/dist/lib/utils.js +1 -1
- package/dist/{media-gallery-Ca4YmvBi.js → media-gallery-DLp3HAz0.js} +75 -74
- package/dist/media-gallery-DLp3HAz0.js.map +1 -0
- package/dist/{mentions-CRio8mTm.js → mentions-Cl0Kt_Pd.js} +52 -50
- package/dist/{mentions-CRio8mTm.js.map → mentions-Cl0Kt_Pd.js.map} +1 -1
- package/dist/message-SZUNB1eX.js +127 -0
- package/dist/message-SZUNB1eX.js.map +1 -0
- package/dist/{navigation-BTrEb5u4.js → navigation-DnQSNMT0.js} +64 -55
- package/dist/navigation-DnQSNMT0.js.map +1 -0
- package/dist/{navigation-DqEITuD2.js → navigation-DyytsLRB.js} +37 -37
- package/dist/navigation-DyytsLRB.js.map +1 -0
- package/dist/{navigation-row-recipes-BFpvGPGE.js → navigation-row-recipes-DQEXQcqY.js} +3 -3
- package/dist/navigation-row-recipes-DQEXQcqY.js.map +1 -0
- package/dist/{number-BNT_BIzJ.js → number-DasMFWEG.js} +4 -4
- package/dist/{number-BNT_BIzJ.js.map → number-DasMFWEG.js.map} +1 -1
- package/dist/overlays-DUbs1KEi.js +1011 -0
- package/dist/overlays-DUbs1KEi.js.map +1 -0
- package/dist/{page-BMBGjJY8.js → page-hGmT4nWK.js} +75 -64
- package/dist/page-hGmT4nWK.js.map +1 -0
- package/dist/{page-header-BH41wCyY.js → page-header-D8nERkn5.js} +9 -9
- package/dist/page-header-D8nERkn5.js.map +1 -0
- package/dist/{pagination-C29vvt3I.js → pagination-NLGqRirf.js} +20 -20
- package/dist/pagination-NLGqRirf.js.map +1 -0
- package/dist/{popover-TInGXsjg.js → popover-CghIYdQf.js} +23 -22
- package/dist/popover-CghIYdQf.js.map +1 -0
- package/dist/{popover-menu-BzqXqE72.js → popover-menu-B4PoWhRl.js} +6 -6
- package/dist/{popover-menu-BzqXqE72.js.map → popover-menu-B4PoWhRl.js.map} +1 -1
- package/dist/{popover.recipes-zgBhMlUu.js → popover.recipes-QlD4JenO.js} +5 -5
- package/dist/popover.recipes-QlD4JenO.js.map +1 -0
- package/dist/{primitives-DKPOGVpj.js → primitives-C7ff0QaI.js} +120 -113
- package/dist/primitives-C7ff0QaI.js.map +1 -0
- package/dist/primitives.js +3 -3
- package/dist/progress-BroqrAyV.js +169 -0
- package/dist/progress-BroqrAyV.js.map +1 -0
- package/dist/{receipt-DYWTQGEc.js → receipt-BuJynLgf.js} +8 -8
- package/dist/{receipt-DYWTQGEc.js.map → receipt-BuJynLgf.js.map} +1 -1
- package/dist/{rich-text-B7sBAdDG.js → rich-text-DlxDOtf4.js} +4 -4
- package/dist/{rich-text-B7sBAdDG.js.map → rich-text-DlxDOtf4.js.map} +1 -1
- package/dist/rich-text-editor-BKyG7rWz.js +574 -0
- package/dist/rich-text-editor-BKyG7rWz.js.map +1 -0
- package/dist/{rich-text-editor.recipes-DxvOE0Lp.js → rich-text-editor.recipes-B72Nfuze.js} +35 -26
- package/dist/rich-text-editor.recipes-B72Nfuze.js.map +1 -0
- package/dist/{scroll-area-BheMQ270.js → scroll-area-D-pIhEKl.js} +3 -3
- package/dist/scroll-area-D-pIhEKl.js.map +1 -0
- package/dist/{separator-Gk_WXH-l.js → separator-BNIgG3au.js} +3 -3
- package/dist/{separator-Gk_WXH-l.js.map → separator-BNIgG3au.js.map} +1 -1
- package/dist/{separator-DO0EbCEm.js → separator-BhtFyo4x.js} +2 -2
- package/dist/{separator-DO0EbCEm.js.map → separator-BhtFyo4x.js.map} +1 -1
- package/dist/services/actions.js +1 -1
- package/dist/{settings-D9f_wdIC.js → settings-DOTOzeZ2.js} +10 -9
- package/dist/{settings-D9f_wdIC.js.map → settings-DOTOzeZ2.js.map} +1 -1
- package/dist/{sheet-vOUloJ4O.js → sheet-BFhrNehm.js} +11 -11
- package/dist/sheet-BFhrNehm.js.map +1 -0
- package/dist/{sidebar-CNBKFDRW.js → sidebar-CyR4XKwR.js} +219 -200
- package/dist/sidebar-CyR4XKwR.js.map +1 -0
- package/dist/{sidebar-C3UKkbC5.js → sidebar-SvGJ0Zwi.js} +63 -58
- package/dist/sidebar-SvGJ0Zwi.js.map +1 -0
- package/dist/{skeleton-BvRhK8y-.js → skeleton-3F0uhYn3.js} +4 -4
- package/dist/{skeleton-BvRhK8y-.js.map → skeleton-3F0uhYn3.js.map} +1 -1
- package/dist/{smart-card-B5FcKODh.js → smart-card-DjGVV2xr.js} +206 -199
- package/dist/smart-card-DjGVV2xr.js.map +1 -0
- package/dist/{spinner-JtlFJ7Nc.js → spinner-Cpf7oRkF.js} +5 -5
- package/dist/{spinner-JtlFJ7Nc.js.map → spinner-Cpf7oRkF.js.map} +1 -1
- package/dist/{structure-BvW4vG4H.js → structure-CRdqVawd.js} +14 -14
- package/dist/{structure-BvW4vG4H.js.map → structure-CRdqVawd.js.map} +1 -1
- package/dist/{structure.recipes-DjqnBpwz.js → structure.recipes-Bqhf9oIh.js} +2 -2
- package/dist/structure.recipes-Bqhf9oIh.js.map +1 -0
- package/dist/style.css +1 -1
- package/dist/{surface-recipes-CQfRr-VL.js → surface-recipes-Dd__PD-w.js} +4 -3
- package/dist/surface-recipes-Dd__PD-w.js.map +1 -0
- package/dist/{table-DnlAJ-xR.js → table-CLtJTxoR.js} +17 -16
- package/dist/table-CLtJTxoR.js.map +1 -0
- package/dist/table-CcRDZiLP.js +1444 -0
- package/dist/table-CcRDZiLP.js.map +1 -0
- package/dist/tabs-BNgu7g0u.js +188 -0
- package/dist/tabs-BNgu7g0u.js.map +1 -0
- package/dist/text-inputs-DsR56TR-.js +330 -0
- package/dist/text-inputs-DsR56TR-.js.map +1 -0
- package/dist/{text.styles-BwB7vAF2.js → text.styles-Q4sGAIgA.js} +18 -10
- package/dist/text.styles-Q4sGAIgA.js.map +1 -0
- package/dist/theme.css +77 -115
- package/dist/{timelines-CnZ2S_Gr.js → timelines-D1pkt3se.js} +84 -78
- package/dist/timelines-D1pkt3se.js.map +1 -0
- package/dist/{tree-COD9BGdU.js → tree-BtmYyMZV.js} +8 -8
- package/dist/{tree-COD9BGdU.js.map → tree-BtmYyMZV.js.map} +1 -1
- package/dist/typography/rich-text.js +1 -1
- package/dist/typography-BxQgiZyw.js +96 -0
- package/dist/typography-BxQgiZyw.js.map +1 -0
- package/dist/typography.js +1 -1
- package/dist/{ui-provider-CftIB6TY.js → ui-provider-DRPn3qNl.js} +3 -2
- package/dist/ui-provider-DRPn3qNl.js.map +1 -0
- package/dist/ui-provider.js +1 -1
- package/dist/{upload-DIzw1dx1.js → upload-CDbYw1WN.js} +326 -323
- package/dist/upload-CDbYw1WN.js.map +1 -0
- package/dist/{upload-queue-xRJ3qDmd.js → upload-queue-CNd_hH_a.js} +25 -25
- package/dist/upload-queue-CNd_hH_a.js.map +1 -0
- package/dist/usage-card-VyJLUwRr.js +457 -0
- package/dist/usage-card-VyJLUwRr.js.map +1 -0
- package/dist/utils-BvH9PSmq.js +4275 -0
- package/dist/utils-BvH9PSmq.js.map +1 -0
- package/dist/value-inputs-D0KCrfVC.js +840 -0
- package/dist/value-inputs-D0KCrfVC.js.map +1 -0
- package/dist/{workspace-Cbqz4FzN.js → workspace-CcR8r-Nt.js} +115 -122
- package/dist/workspace-CcR8r-Nt.js.map +1 -0
- package/docs/consumer-skill/SKILL.md +112 -18
- package/docs/consumer-skill/examples/analytics.tsx +34 -0
- package/docs/consumer-skill/examples/app-layout.tsx +42 -12
- package/docs/consumer-skill/examples/detail.tsx +24 -9
- package/docs/consumer-skill/examples/manifest.json +27 -1
- package/docs/consumer-skill/examples/planning-usage-edit.tsx +29 -0
- package/docs/consumer-skill/examples/scoped-directory.tsx +77 -0
- 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 +219 -2
- package/docs/consumer-skill/references/design-contract.md +37 -10
- package/docs/consumer-skill/references/discovery.md +93 -5
- package/docs/consumer-skill/references/installation.md +20 -3
- package/docs/consumer-skill/references/integration.md +26 -0
- package/docs/consumer-skill/references/public-api.json +2416 -388
- package/docs/consumer-skill/references/review.md +126 -0
- package/docs/consumer-skill/references/theming.md +52 -7
- package/docs/consumer-skill/references/tokens.json +177 -9
- package/docs/consumer-skill/references/workflows.md +129 -1
- package/docs/consumer-skill/scripts/check-composition.mjs +31 -0
- package/docs/consumer-skill/scripts/composition-policy.mjs +317 -0
- package/docs/consumer-skill/scripts/discovery.mjs +65 -8
- package/docs/consumer-skill/scripts/surface-policy.mjs +66 -0
- package/package.json +30 -6
- package/dist/accordion-BRWh3BM1.js.map +0 -1
- package/dist/action-menu-Cx3SdfbN.js.map +0 -1
- package/dist/affordance-geometry.generated-DXl-Zb3Z.js +0 -23
- package/dist/affordance-geometry.generated-DXl-Zb3Z.js.map +0 -1
- package/dist/ai-artifact-DkOArd3-.js.map +0 -1
- package/dist/app-shell-BH_bGcE2.js.map +0 -1
- package/dist/auth-BDB1V_2q.js +0 -704
- package/dist/auth-BDB1V_2q.js.map +0 -1
- package/dist/avatar-CsnWaYmt.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/choice-inputs-CavA-SGV.js +0 -644
- package/dist/choice-inputs-CavA-SGV.js.map +0 -1
- package/dist/code-block-DIlqzoiD.js.map +0 -1
- package/dist/combobox-CHD750do.js.map +0 -1
- package/dist/combobox-HDftpzxt.js.map +0 -1
- package/dist/command-D0kWBZfd.js.map +0 -1
- package/dist/comments-CvYeglMS.js +0 -1132
- package/dist/comments-CvYeglMS.js.map +0 -1
- package/dist/containers-CPNyNo1_.js.map +0 -1
- package/dist/data-display-b3d1TfL4.js.map +0 -1
- package/dist/date-picker-DI6kPNof.js.map +0 -1
- package/dist/date-pickers-ByP6Cv2z.js +0 -224
- package/dist/date-pickers-ByP6Cv2z.js.map +0 -1
- package/dist/feedback-a9j9J-9A.js +0 -391
- package/dist/feedback-a9j9J-9A.js.map +0 -1
- package/dist/field-affordance-recipes-CHdUtn2Z.js +0 -17
- package/dist/field-affordance-recipes-CHdUtn2Z.js.map +0 -1
- package/dist/field-state-recipes-CBTRt9Bt.js.map +0 -1
- package/dist/filters-qtrcv1hf.js.map +0 -1
- package/dist/form-field-C6W-y2hR.js.map +0 -1
- package/dist/form-sizing-39NohSqn.js.map +0 -1
- package/dist/forms-numeric-Y15Bg5Nr.js +0 -867
- package/dist/forms-numeric-Y15Bg5Nr.js.map +0 -1
- package/dist/header-B8ex54cY.js.map +0 -1
- package/dist/http-CLTVJc5I.js.map +0 -1
- package/dist/input-DMorJiTI.js +0 -202
- package/dist/input-DMorJiTI.js.map +0 -1
- package/dist/input-ci9fIgFH.js +0 -20
- package/dist/input-ci9fIgFH.js.map +0 -1
- package/dist/item-pJ0GsOiJ.js.map +0 -1
- package/dist/media-gallery-Ca4YmvBi.js.map +0 -1
- package/dist/message-B5-6LeYl.js +0 -108
- package/dist/message-B5-6LeYl.js.map +0 -1
- package/dist/navigation-BTrEb5u4.js.map +0 -1
- package/dist/navigation-DqEITuD2.js.map +0 -1
- package/dist/navigation-row-recipes-BFpvGPGE.js.map +0 -1
- package/dist/overlays-DBqV0J_V.js +0 -982
- package/dist/overlays-DBqV0J_V.js.map +0 -1
- package/dist/page-BMBGjJY8.js.map +0 -1
- package/dist/page-header-BH41wCyY.js.map +0 -1
- package/dist/pagination-C29vvt3I.js.map +0 -1
- package/dist/popover-TInGXsjg.js.map +0 -1
- package/dist/popover.recipes-zgBhMlUu.js.map +0 -1
- package/dist/primitives-DKPOGVpj.js.map +0 -1
- package/dist/rich-text-editor-BZSJchAF.js +0 -575
- package/dist/rich-text-editor-BZSJchAF.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/sheet-vOUloJ4O.js.map +0 -1
- package/dist/sidebar-C3UKkbC5.js.map +0 -1
- package/dist/sidebar-CNBKFDRW.js.map +0 -1
- package/dist/smart-card-B5FcKODh.js.map +0 -1
- package/dist/structure.recipes-DjqnBpwz.js.map +0 -1
- package/dist/surface-recipes-CQfRr-VL.js.map +0 -1
- package/dist/table-DnlAJ-xR.js.map +0 -1
- package/dist/table-ghtAQ-JJ.js +0 -1424
- package/dist/table-ghtAQ-JJ.js.map +0 -1
- package/dist/tabs-DY09eoZg.js +0 -187
- package/dist/tabs-DY09eoZg.js.map +0 -1
- package/dist/text-inputs-BhOcedTo.js +0 -331
- package/dist/text-inputs-BhOcedTo.js.map +0 -1
- package/dist/text.styles-BwB7vAF2.js.map +0 -1
- package/dist/timelines-CnZ2S_Gr.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-DIzw1dx1.js.map +0 -1
- package/dist/upload-queue-xRJ3qDmd.js.map +0 -1
- package/dist/utils-C2EKeIw3.js +0 -72
- package/dist/utils-C2EKeIw3.js.map +0 -1
- package/dist/value-inputs-Co1fu-xv.js +0 -824
- package/dist/value-inputs-Co1fu-xv.js.map +0 -1
- package/dist/workspace-Cbqz4FzN.js.map +0 -1
|
@@ -16,12 +16,158 @@ 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
|
+
## Compose from the task
|
|
20
|
+
|
|
21
|
+
Identify the user's next decision before selecting components. Establish fixed
|
|
22
|
+
context (account, parent entity, workspace), editable query criteria, leading
|
|
23
|
+
information, page/collection/record commands, and loading/empty/error/edit states.
|
|
24
|
+
Then assign owners. A task may require a comparison table, a compact directory,
|
|
25
|
+
a detail workspace or a form; they need different information hierarchies.
|
|
26
|
+
|
|
27
|
+
| Decision | Use when | Alternative / boundary |
|
|
28
|
+
| --- | --- | --- |
|
|
29
|
+
| 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
|
+
| ResourceCell | Identity inside a table cell | Item for independent list entries; MetadataList for label/value facts about one subject |
|
|
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
|
+
| 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 |
|
|
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 |
|
|
35
|
+
|
|
36
|
+
For a DataTable composition, put queries in `topbarContent`, exports or collection
|
|
37
|
+
tools in `topbarEnd`, selection commands in `bulkActions`, and record commands
|
|
38
|
+
in `rowActions`. Other arrangements are valid when the product has a distinct
|
|
39
|
+
query region; choose one owner deliberately and keep queries close to their
|
|
40
|
+
results. DataView already owns coordinated filtering; do not add a second filter
|
|
41
|
+
store around it without inspecting its contract.
|
|
42
|
+
|
|
43
|
+
Fixed scope and mutable criteria are different states. A collection reached
|
|
44
|
+
inside one business can show that business as context/navigation; query controls
|
|
45
|
+
then narrow that scope. If business is an editable filter, clearing it may widen
|
|
46
|
+
the collection. The app owns this meaning and transport. Do not accidentally
|
|
47
|
+
present fixed scope as a removable criterion or repeat it in every region.
|
|
48
|
+
|
|
49
|
+
Use primary identity plus task-critical supporting facts in compact rows.
|
|
50
|
+
When columns disappear, preserve access to other facts through detail/disclosure
|
|
51
|
+
or supported comparison controls. Avoid automatically appending every hidden
|
|
52
|
+
column to identity metadata. There is no universal row-line limit: long names,
|
|
53
|
+
accessibility needs and the task can justify richer rows. Explain the priority.
|
|
54
|
+
Custom ResourceCell metadata is caller content; use shared supporting typography
|
|
55
|
+
and CellStack where its smaller secondary-value contract fits.
|
|
56
|
+
|
|
57
|
+
Commands need explicit importance as well as scope. PageActions does not infer
|
|
58
|
+
primary tone from a label such as “New contact”; choose `tone="primary"` when
|
|
59
|
+
that is the route's main command. Permissions and destructive intent remain
|
|
60
|
+
application decisions. A back link, export and destructive command should not
|
|
61
|
+
all inherit the same visual emphasis by accident.
|
|
62
|
+
|
|
63
|
+
| Drift | Better decision |
|
|
64
|
+
| --- | --- |
|
|
65
|
+
| Same parent named in header, context strip and fixed filter | One contextual lead; repeat only where it clarifies a separate task |
|
|
66
|
+
| Every hidden column becomes identity metadata | Prioritize visible facts and retain access to the rest |
|
|
67
|
+
| Repeated route title on an otherwise untitled table Card | Route header plus native collection surface |
|
|
68
|
+
| Child and parent both add the same gutter/inset | Assign visible space once at its owner |
|
|
69
|
+
| New local controls to imitate an existing workflow | Inspect the public feature/parts/callback seams first |
|
|
70
|
+
|
|
71
|
+
See the [scoped directory recipe](../examples/scoped-directory.tsx) and
|
|
72
|
+
[workflow explanation](workflows.md#scoped-directory). Review decisions using
|
|
73
|
+
[review and checks](review.md); valid alternatives should preserve task semantics
|
|
74
|
+
and public anatomy, not imitate one screenshot.
|
|
75
|
+
|
|
19
76
|
Use the exact family declarations from public-api.json. Catalogue URLs and source folders are not import contracts.
|
|
20
77
|
|
|
78
|
+
For dashboard KPIs, revenue and statistic cards, read the focused
|
|
79
|
+
[analytics selection and recipe](analytics.md). Metric's card variant,
|
|
80
|
+
MetricGrid's default peers and UsageCard own their surfaces. A distinct custom
|
|
81
|
+
Card subject remains valid; compare the complete subject contract before rebuilding
|
|
82
|
+
formatting, hierarchy or request-state presentation from lower text primitives.
|
|
83
|
+
|
|
84
|
+
## Public websites and service overviews
|
|
85
|
+
|
|
86
|
+
Compose a landing page or public website from its content. `Container` owns the
|
|
87
|
+
centered measure and inline gutters; `Section` owns semantic content groups and
|
|
88
|
+
their sibling rhythm. Stack/Grid arrange copy, actions and peer subjects. Shared
|
|
89
|
+
Heading/Text roles preserve typography while heading tags express document order.
|
|
90
|
+
Choose `Page` when its route identity, commands and composition slots fit; choose
|
|
91
|
+
Container/Section when content leads. AppLayout supplies application chrome when
|
|
92
|
+
the product needs it. These are application choices, not required website shells.
|
|
93
|
+
|
|
94
|
+
The app owns section order, hero content, media, link destinations, responsive
|
|
95
|
+
placement and brand theming through existing semantic roots. Keep one inset owner:
|
|
96
|
+
Container supplies inline gutters, a site boundary may supply semantic block
|
|
97
|
+
padding, and each independently framed subject keeps Card's default inset.
|
|
98
|
+
|
|
99
|
+
A service offer or pricing option is a legitimate Card subject. Put its name and
|
|
100
|
+
description in the header, price through Money, and navigation in the footer seam.
|
|
101
|
+
Metric/MetricGrid represent observed KPIs and comparisons; a selling price belongs
|
|
102
|
+
to the offer's content. Preserve application-owned currency, billing terms and
|
|
103
|
+
destinations. See the typed [website recipe](../examples/website.tsx), which uses
|
|
104
|
+
ordinary document scrolling and a responsive service grid with real link actions.
|
|
105
|
+
|
|
106
|
+
## Typography and rich content
|
|
107
|
+
|
|
108
|
+
Choose Heading, Text, DisplayLabel, Label and TextLink from the published
|
|
109
|
+
typography family by role. Set semantic tags independently of visual variants;
|
|
110
|
+
heading order describes the document, not a desired font size. Labels associate
|
|
111
|
+
controls with stable IDs. Money, Date, Email and other value primitives own
|
|
112
|
+
formatting, locale/unit handling and empty-value fallbacks; zero is real data.
|
|
113
|
+
The app owns accounting, timezone policy and the meaning of unavailable values.
|
|
114
|
+
|
|
115
|
+
Primary row values and labels use the shared default text size. Compact metadata,
|
|
116
|
+
form hints and row descriptions use smaller secondary copy; structural panel
|
|
117
|
+
descriptions use default-sized secondary text. Typography adds no outer margins.
|
|
118
|
+
Native editable text retains its responsive field recipe. Do not resize it to
|
|
119
|
+
imitate a display label or use density to make all text smaller.
|
|
120
|
+
|
|
121
|
+
RichText from `themelia-react-ui/typography/rich-text` displays sanitized HTML,
|
|
122
|
+
with a scoped reading rhythm inherited from typography and theme roots. Use
|
|
123
|
+
`tag="div"` for HTML containing paragraphs/headings/lists; its default `p` tag
|
|
124
|
+
is appropriate only for inline content. The allowlist strips arbitrary styling,
|
|
125
|
+
embedded media and unsafe links; it is not a Markdown parser or email-layout
|
|
126
|
+
renderer. Keep outer width/padding on the surrounding structure. RichTextEditor
|
|
127
|
+
owns editing; EmailComposer owns structured email/variable/delivery contracts.
|
|
128
|
+
Read the relevant declarations and [integration](integration.md) before choosing
|
|
129
|
+
the content owner. Embedded React UI can opt out of reading rhythm through
|
|
130
|
+
`not-typeset` or `data-not-typeset` on its subtree; those opt-outs do not bypass
|
|
131
|
+
HTML sanitization or establish a separate typography system.
|
|
132
|
+
|
|
133
|
+
### Visual heading emphasis
|
|
134
|
+
|
|
135
|
+
`Heading tag="h1"` preserves the compact admin default. For website/hero copy,
|
|
136
|
+
choose `size="3xl"` or `size="4xl"`; sections may use `size="xl"` or `"2xl"`.
|
|
137
|
+
The semantic tag, visual size and surrounding Section/Stack gap are independent.
|
|
138
|
+
Existing text-size classes remain supported overrides. Section owns rhythm,
|
|
139
|
+
Container owns measure/gutters, and application utilities may own a hero's outer
|
|
140
|
+
padding or background. No additional section/hero theme tokens are required.
|
|
141
|
+
See the [website example](../examples/website.tsx) for both hero and section emphasis.
|
|
142
|
+
|
|
143
|
+
|
|
21
144
|
## Card anatomy
|
|
22
145
|
|
|
23
146
|
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.
|
|
24
147
|
|
|
148
|
+
Choose one ordinary Card surface through UIProvider's `card.defaultSurface` and
|
|
149
|
+
let sibling subjects inherit it. Explicit per-card surfaces win: mixing `card`
|
|
150
|
+
and `framed` intentionally changes their visible treatment. Header placement is
|
|
151
|
+
independent: `inside` keeps the heading with the body; `frame` puts context and
|
|
152
|
+
commands on the outer frame above the inset body. Use `icon={<Icon />}` for a
|
|
153
|
+
routine heading glyph and plain `title`; embedding raw SVG in title JSX bypasses
|
|
154
|
+
the owner's icon sizing. Custom titles remain appropriate for richer content.
|
|
155
|
+
|
|
156
|
+
Card `gap` owns spacing between regions; `contentGap` owns direct body-child
|
|
157
|
+
spacing; `textGap` owns title/supporting-copy rhythm. Region spacing defaults to
|
|
158
|
+
`xl` (`md` for `padding="none"`). Use a semantic region gap for compact cards
|
|
159
|
+
instead of resetting padding or adding local margins.
|
|
160
|
+
|
|
161
|
+
Ordinary independent cards omit `padding` and retain `md` (the full surface
|
|
162
|
+
inset, 20px at default roots). `sm` is half that inset (10px), for a deliberately
|
|
163
|
+
compact subject; it is not the default for forms, settings, metrics or resource
|
|
164
|
+
pages. Component size and
|
|
165
|
+
density do not choose Card padding. `lg` uses 1.8 times the inset (36px), while
|
|
166
|
+
`none` removes it. All sizes follow the surface roots and space-scale.
|
|
167
|
+
UIProvider can configure both
|
|
168
|
+
`card.defaultHeaderDivider` and `card.defaultFooterDivider`; explicit per-card
|
|
169
|
+
booleans win. Header/footer-only cards still render one shared divider.
|
|
170
|
+
|
|
25
171
|
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.
|
|
26
172
|
|
|
27
173
|
Reusable blocks/features stay card-free unless their explicit purpose is a card. Frame them at the composition boundary.
|
|
@@ -32,6 +178,18 @@ Shells own gutters, surfaces own padding, sections own rhythm, Stack/Grid own si
|
|
|
32
178
|
|
|
33
179
|
Grid exposes viewport columns; AdaptiveGrid responds to parent width and a semantic minimum column size. GridCell spans belong to the nearest Grid. Keep narrow DOM order meaningful. Horizontal Stack wraps by default; disable it only when overflow is intentionally handled. Tailwind is appropriate for min-w-0, positioning, overflow and drawing geometry.
|
|
34
180
|
|
|
181
|
+
Independent surfaces need peer rhythm, usually `gap="xl"`; Stack's default
|
|
182
|
+
`md` is general sibling spacing, not a card-grid prescription. Framed Card rings
|
|
183
|
+
extend outside layout rectangles, so two rings can consume a small DOM gap.
|
|
184
|
+
Inspect visible edge clearance in both axes rather than accepting token use alone.
|
|
185
|
+
Copy gaps normal/dense are for supporting text, not spacing independent cards.
|
|
186
|
+
|
|
187
|
+
MetadataList owns medium-weight labels and normal-weight routine values. Its
|
|
188
|
+
compact density tightens gaps/rows without shrinking primary values. Plain values
|
|
189
|
+
and typed descriptors retain the shared roles; React nodes, `display` and `render`
|
|
190
|
+
preserve supplied typography. Keep custom formatted values consistent with value
|
|
191
|
+
primitives rather than replacing labels and values with undifferentiated Text.
|
|
192
|
+
|
|
35
193
|
## Menus and controls
|
|
36
194
|
|
|
37
195
|
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 align with row labels. 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.
|
|
@@ -44,6 +202,13 @@ PopoverContent type="display" owns substantive-content padding; type="menu" comp
|
|
|
44
202
|
| density="compact" / "default" / "comfortable" | Collection row block rhythm, independent from inline spacing |
|
|
45
203
|
| size="sm" / "md" / "lg" | Supported control's scale; consult its declaration and provider precedence |
|
|
46
204
|
|
|
205
|
+
Input, Button, Select and filter-facet triggers share bounded inner corners
|
|
206
|
+
and corresponding heights; Card and popup shells use the global outer radius. Omitted sizes inherit the provider; explicit sizes win.
|
|
207
|
+
Keep action/control roots equal when those controls adjoin. Compact menu rows,
|
|
208
|
+
surface insets and control sizes remain independent; density can tighten the
|
|
209
|
+
inner-radius height bound without changing outer corners.
|
|
210
|
+
Inset segmented children use the supported compound owner's same-height frame.
|
|
211
|
+
|
|
47
212
|
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.
|
|
48
213
|
|
|
49
214
|
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.
|
|
@@ -62,8 +227,8 @@ Use exact themelia-react-ui paths. Presentation imports use blocks/<family>, rep
|
|
|
62
227
|
## Copy rhythm
|
|
63
228
|
|
|
64
229
|
For title/supporting-copy rhythm use `textGap="normal" | "dense"` on Card,
|
|
65
|
-
PageHeading and public surface headers
|
|
66
|
-
|
|
230
|
+
PageHeading and public surface headers. The installed token reference records
|
|
231
|
+
their unscaled defaults. Item/ItemContent and menu popover headers default to dense.
|
|
67
232
|
Stack/Grid accept the same semantic gaps, including responsive objects and
|
|
68
233
|
axis overrides. Keep surface insets and action-cluster gaps on their owners;
|
|
69
234
|
do not add a second margin to descriptions.
|
|
@@ -168,3 +333,55 @@ adaptTo="container" inside Container/PageViewport to adapt at 48rem of usable
|
|
|
168
333
|
parent width while preserving main-before-aside DOM/focus order.
|
|
169
334
|
|
|
170
335
|
See the installed [workspace recipe](../examples/app-layout.tsx).
|
|
336
|
+
|
|
337
|
+
PageViewport owns scrolling and adds no padding. Page defaults to `gutter="lg"`
|
|
338
|
+
and `padding="lg"` (36px at shipped roots), so it owns inline/block space once.
|
|
339
|
+
`narrow` selects centered `md` width; explicit `maxWidth` wins. Header copy
|
|
340
|
+
defaults to dense; `textGap="normal"` is an explicit alternative. Do not assume
|
|
341
|
+
an app shell supplies gutters because it supplies a viewport. Set `gutter="none"`
|
|
342
|
+
only when an actual parent Container/surface supplies the inline inset, such as
|
|
343
|
+
StackedLayout's contained mode. Block padding remains independent.
|
|
344
|
+
That contained measure uses the same large gutter as Page; ordinary Container
|
|
345
|
+
defaults remain unchanged.
|
|
346
|
+
|
|
347
|
+
Select width from the task: a single focused resource/form can use `narrow`;
|
|
348
|
+
a record with a supporting aside can retain the default `lg` measure and use
|
|
349
|
+
TwoColumnLayout. A wide comparison/directory can deliberately use `maxWidth="full"`.
|
|
350
|
+
Setting full on every route defeats the resource measure. Do not remove Page's
|
|
351
|
+
gutters to make its title touch the sidebar; align the header and body through
|
|
352
|
+
the same Page. Density, container measure and page inset are separate choices.
|
|
353
|
+
The [detail recipe](../examples/detail.tsx) includes `AccountDetailPage`: a
|
|
354
|
+
centered resource measure, route-level commands, native Card icon/frame anatomy
|
|
355
|
+
and MetadataList facts, with no duplicated subject header or gutter.
|
|
356
|
+
|
|
357
|
+
Compose HeaderUserMenu in topbar `slots.headerEnd` or a local toolbar, and
|
|
358
|
+
SidebarNavigationUser in AppSidebar `slots.footer` when account access belongs
|
|
359
|
+
in navigation. Use SidebarWorkspaceDropdown for workspace links, or add a
|
|
360
|
+
custom control through `slots.headerEnd` alongside the logo. `headerStart` and
|
|
361
|
+
`headerEnd` stay inside the padded, fixed header; `slots.header` replaces it all.
|
|
362
|
+
`beforeNavigation` scrolls with the links. SidebarFooter owns its rule and inset.
|
|
363
|
+
LayoutSidebarProvider defaults to compact row gaps; explicit density still wins.
|
|
364
|
+
WorkspaceLayout owns its own bounded content inset; do not add a padded Page
|
|
365
|
+
inside it. WorkspaceRecordHeader and WorkspaceLocaleStrip align to the same
|
|
366
|
+
large inline surface role. Record copy supports textGap with a dense default.
|
|
367
|
+
Below 80rem of its own width, WorkspaceLayout scrolls header and body together;
|
|
368
|
+
above that boundary its main region scrolls beside the sidebar. Its rail appears
|
|
369
|
+
at 96rem. Supply header/drawer access to essential hidden regions on narrow
|
|
370
|
+
screens; this passive layout does not create a complete mobile workflow.
|
|
371
|
+
Do not infer workspace/user menus from a generic Avatar: choose their actual
|
|
372
|
+
published owners and supply permitted callbacks. The app owns user/workspace data.
|
|
373
|
+
|
|
374
|
+
## Task and usage summaries, editable fields
|
|
375
|
+
|
|
376
|
+
| Intent | Public owner | Composition boundary |
|
|
377
|
+
| --- | --- | --- |
|
|
378
|
+
| Task summary and expandable checklist | `TaskCard` from `themelia-react-ui/blocks/planning` | Owns one Card and its header/body/footer; supply authoritative items and callbacks. |
|
|
379
|
+
| Quotas, category/daily analytics and period selection | `UsageCard` from `themelia-react-ui/blocks/analytics/usage-card` | Owns one Card; supply data/request state and optional app footer action. |
|
|
380
|
+
| Edit one saved field in place | `InlineEdit` from `themelia-react-ui/base/inline-edit` | Owns FormField and native control/action anatomy; place it inside the app's chosen surface. |
|
|
381
|
+
|
|
382
|
+
Use Card's `gap` for region rhythm and `textGap` for title/supporting-copy rhythm;
|
|
383
|
+
neither changes Card insets. These blocks use the canonical surface, typography,
|
|
384
|
+
formatted-value and structure owners. Drawn rings and mini charts retain private
|
|
385
|
+
geometry and semantic chart/status colors. Read the
|
|
386
|
+
[workflow contracts](workflows.md#task-summaries-usage-and-inline-editing) and
|
|
387
|
+
[typed workspace recipe](../examples/planning-usage-edit.tsx) for integration.
|
|
@@ -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
|
|
@@ -133,9 +159,10 @@ overrides, semantic borders, and new raw spacing/control drift. The shipped
|
|
|
133
159
|
typed examples go through the same design checks as library compositions.
|
|
134
160
|
|
|
135
161
|
Those repository checks do not run automatically in a consuming application.
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
162
|
+
The opt-in source checker in [review and checks](review.md) covers a smaller,
|
|
163
|
+
documented set of direct-import/static-anatomy rules. Run the app's lint, types,
|
|
164
|
+
build and interaction tests for broader coverage. The package does not strip
|
|
165
|
+
arbitrary CSS at runtime or install audit/skill tooling globally.
|
|
139
166
|
|
|
140
167
|
Static lint cannot prove alignment, readable wrapping, CSS authored elsewhere,
|
|
141
168
|
unknown dynamic styles, focus restoration or callback behavior. Verify long
|
|
@@ -14,20 +14,108 @@ 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
|
|
|
25
|
-
|
|
36
|
+
When the same symbol is re-exported by an aggregate family, its documented
|
|
37
|
+
component owner ranks first. For example, `UsageCard` selects
|
|
38
|
+
`themelia-react-ui/blocks/analytics/usage-card` with no optional chart peer;
|
|
39
|
+
requesting the exact `themelia-react-ui/blocks/analytics` import still selects
|
|
40
|
+
that broader family. Read the reported peers and declaration for your selection.
|
|
41
|
+
|
|
42
|
+
Exact curated intent aliases rank below exact imports/symbols and above generic
|
|
43
|
+
description matches. Start with responsibilities such as `record directory`,
|
|
44
|
+
`comparison table`, `identity cell`, `fact list`, `page header`, `query toolbar`
|
|
45
|
+
or `theme boundary`. Read choose/avoid and app-owned responsibilities before
|
|
46
|
+
deciding; a directory result does not require DataView when its workflow differs.
|
|
47
|
+
Unknown terms still return no result; no fuzzy API or guessed prop is invented.
|
|
48
|
+
|
|
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
|
+
Exact guide aliases precede generic overlap, and unrelated family pages
|
|
84
|
+
do not fill the result merely to reach three entries.
|
|
85
|
+
|
|
86
|
+
`nextReads.declaration` is relative to the installed package root.
|
|
87
|
+
`nextReads.references` and `nextReads.examples[].file` are relative to this
|
|
88
|
+
skill folder, so they also work with a complete copied skill. Examples report
|
|
89
|
+
their actual exported recipe names and the selected public symbols they use.
|
|
90
|
+
Recipe selection requires symbol overlap, not just a common family import.
|
|
91
|
+
This prevents a PageHeader selection from inheriting Page-only recipes. A
|
|
92
|
+
recipe's `optionalPeers` comes from its manifest and can include other families'
|
|
93
|
+
requirements beyond the selected owner's peers. Inspect it before copying. A
|
|
94
|
+
selected family with no matching recipe reports empty references/examples;
|
|
95
|
+
use its declaration and the [full index](public-api.json), without guessing.
|
|
96
|
+
|
|
97
|
+
Family sections/guidance placement follows browse responsibility. Guidance
|
|
98
|
+
carries jobs, tags, aliases, choose/avoid, app ownership, browse context, API
|
|
99
|
+
sections/symbols and alternatives resolved to exact imports. Results suggest
|
|
100
|
+
owners and focused reads; declarations establish actual props and behavior.
|
|
26
101
|
|
|
27
102
|
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.
|
|
28
103
|
|
|
29
104
|
`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.
|
|
30
105
|
|
|
31
|
-
The index retains
|
|
106
|
+
The index retains schemaVersion/discoveryVersion 1; optional family `recipes` and `references`
|
|
107
|
+
are compatible additions. Package identity/peers derive from the published
|
|
108
|
+
manifest, symbols/declarations from live exports, and jobs/guidance from the
|
|
109
|
+
consumer catalogue. Recipe metadata derives from the existing example manifest,
|
|
110
|
+
each export's actual use of exact public imports and reference-to-recipe section links; it adds no
|
|
111
|
+
independent task taxonomy. Older matching indexes without recipes still work
|
|
112
|
+
and return empty recipe reads. Utility/root responsibilities have explicit
|
|
113
|
+
owners when no catalogue family represents them. Optional peer requirements
|
|
114
|
+
follow transitive local imports, including type-only and resolved `@types` peers.
|
|
115
|
+
These describe whole-family requirements; tree shaking may produce a smaller graph.
|
|
32
116
|
|
|
33
117
|
Routing, records, translation, permissions and backend effects stay in the application. Discovery grants no publication or global installation authority.
|
|
118
|
+
|
|
119
|
+
The index's `stylesheets` list derives from published CSS exports, including
|
|
120
|
+
optional map styling. The source checker uses it instead of assuming every
|
|
121
|
+
Themelia import is a component family.
|
|
@@ -32,6 +32,21 @@ for (const file of ['public-api.json', 'tokens.json']) {
|
|
|
32
32
|
const selected = readJson(path.join(selectedSkill, 'references', file));
|
|
33
33
|
assert.deepEqual(selected, installed, 'Copied skill is stale; refresh the complete folder');
|
|
34
34
|
}
|
|
35
|
+
if (fs.realpathSync(selectedSkill) !== fs.realpathSync(installedSkill)) {
|
|
36
|
+
function compareAssets(directory) {
|
|
37
|
+
for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
|
|
38
|
+
if (entry.name === '.DS_Store') continue;
|
|
39
|
+
const installed = path.join(directory, entry.name);
|
|
40
|
+
const selected = path.join(selectedSkill, path.relative(installedSkill, installed));
|
|
41
|
+
const info = fs.lstatSync(installed);
|
|
42
|
+
assert(!info.isSymbolicLink(), 'Installed guidance must contain real assets');
|
|
43
|
+
assert(fs.existsSync(selected) && !fs.lstatSync(selected).isSymbolicLink(), 'Copied skill is stale; missing or linked asset');
|
|
44
|
+
if (info.isDirectory()) compareAssets(installed);
|
|
45
|
+
else assert(fs.readFileSync(installed).equals(fs.readFileSync(selected)), 'Copied skill is stale; refresh the complete folder');
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
compareAssets(installedSkill);
|
|
49
|
+
}
|
|
35
50
|
console.log(JSON.stringify({ package: manifest.name, version: manifest.version, root, skill: selectedSkill }, null, 2));
|
|
36
51
|
JS
|
|
37
52
|
```
|
|
@@ -43,9 +58,11 @@ finder reports its own metadata version; it does not inspect the app installatio
|
|
|
43
58
|
|
|
44
59
|
To check a copied skill, set `THEMELIA_SKILL_DIR` to its complete directory when
|
|
45
60
|
running the recipe. The comparison checks metadata contents as well as version,
|
|
46
|
-
so stale copies with the same development version are caught.
|
|
47
|
-
|
|
48
|
-
|
|
61
|
+
so stale copies with the same development version are caught. Every installed
|
|
62
|
+
guidance/script/example asset is also compared byte-for-byte; extra app-owned
|
|
63
|
+
files or publisher markers in the copy are not checked. Keep local product policy
|
|
64
|
+
outside the package guidance. Recopy the complete folder after upgrades, and
|
|
65
|
+
read declarations from the installed package.
|
|
49
66
|
|
|
50
67
|
## Manual skill copying
|
|
51
68
|
|
|
@@ -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`.
|
|
@@ -54,4 +68,16 @@ Server code imports pure helpers from `themelia-react-ui/features/email-composer
|
|
|
54
68
|
|
|
55
69
|
Maintainer enforcement uses @shadcn/lint through Oxlint plus AST/contract checks. These are not runtime dependencies or a published consumer audit CLI. Configure app lint using published utilities/imports; do not copy repository migration-debt allowances. There is no Sass/SASSC pipeline in this Tailwind package.
|
|
56
70
|
|
|
71
|
+
For opt-in import/anatomy checks, the package now includes a read-only Node script
|
|
72
|
+
using the app's TypeScript dev dependency; see [review and checks](review.md).
|
|
73
|
+
It is not a global CLI or a complete visual auditor. Keep product policies and
|
|
74
|
+
current adapter/page examples in an app-owned reference, separate from this skill.
|
|
75
|
+
|
|
57
76
|
The maintainer installed-tarball harness proves the basic provider/control/overlay SSR and hydration fixture, pure email preparation without editor peers, controlled table and email-composer workflows, and optional client module initialization. It checks hydration diagnostics and real callbacks in light/dark at narrow/wide widths. Optional module initialization alone does not prove its complete workflow or server-rendering support; verify the features your app uses. `check:all` runs the serial package and curated browser gates; evidence collection is a separate `collect:browser` command. Both are repository maintainer commands, not installed consumer CLIs.
|
|
77
|
+
|
|
78
|
+
The scoped directory fixture also runs the packaged recipe's query/clear,
|
|
79
|
+
fixed-scope, loading/error/retry, empty and keyboard row-menu callbacks. It checks
|
|
80
|
+
both container content edges without global preflight; Container and DataTable
|
|
81
|
+
own border-box sizing. Stabilize lifecycle inputs as explained in
|
|
82
|
+
[workflows](workflows.md#scoped-directory). These are example/runtime proofs,
|
|
83
|
+
not evidence of an independent agent choosing the same composition.
|