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
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Composition review and checks
|
|
2
|
+
|
|
3
|
+
Use after selecting owners, or when auditing a screen. Read only the relevant
|
|
4
|
+
workflow/declarations; this is a review aid, not a new design system.
|
|
5
|
+
|
|
6
|
+
## Review the task and hierarchy
|
|
7
|
+
|
|
8
|
+
- Can the user identify the subject, scope and next action? A contextual fact
|
|
9
|
+
may be repeated for a separate purpose, but should not compete with itself.
|
|
10
|
+
- Do independent records, facts, metrics and editable fields use appropriate
|
|
11
|
+
owners? Inspect an existing feature before reconstructing its lifecycle.
|
|
12
|
+
- Do primary commands have explicit emphasis and page/collection/record scope?
|
|
13
|
+
Keep bulk actions tied to selection. Secondary/destructive importance is semantic.
|
|
14
|
+
- Do rows lead with identity and useful decision information? Preserve access
|
|
15
|
+
to hidden facts without forcing every fact into a tall identity stack.
|
|
16
|
+
- Does each gutter, inset and sibling/copy gap have one owner? Review the whole
|
|
17
|
+
parent/child chain. A token-backed utility on the wrong owner can still drift.
|
|
18
|
+
- Does the same composition remain readable with long copy, translations,
|
|
19
|
+
empty/missing values and narrow parent width? Zero and unavailable differ.
|
|
20
|
+
|
|
21
|
+
These criteria allow different product layouts. Do not impose a universal card
|
|
22
|
+
count, row-line limit, primary button count or one-column form rule.
|
|
23
|
+
|
|
24
|
+
## Optional source checker
|
|
25
|
+
|
|
26
|
+
The package ships a read-only script, not an npm bin/global CLI. It needs the
|
|
27
|
+
consumer's TypeScript development dependency and Node matching the package engine:
|
|
28
|
+
|
|
29
|
+
```sh
|
|
30
|
+
node node_modules/themelia-react-ui/docs/consumer-skill/scripts/check-composition.mjs resources/js/pages resources/js/components
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Pass explicit files/directories; `.tsx`, `.ts`, `.jsx` and `.js` are inspected.
|
|
34
|
+
It resolves TypeScript from the app working directory and uses its adjacent
|
|
35
|
+
versioned public index. A complete copied skill works too, after the installed
|
|
36
|
+
identity check. It neither edits files nor installs dependencies. Add this
|
|
37
|
+
command to app CI if useful; repository lint is not automatically installed.
|
|
38
|
+
|
|
39
|
+
Errors cover unknown package entrypoints/symbols and statically detected overrides
|
|
40
|
+
of protected Card/popup insets, Card badges in headerAction/headerStart rather
|
|
41
|
+
than titleSuffix, control geometry/typography, fixed DisplayLabel/Badge
|
|
42
|
+
roles, cross-role shell/inner radius replacements, display-copy margins, or
|
|
43
|
+
attenuated shared focus rings on imported controls. Intentional nested bodies,
|
|
44
|
+
circular owners and joined-edge corner resets retain their roles. Import ownership
|
|
45
|
+
follows lexical bindings, preserving locally shadowed application components. Deprecated migration
|
|
46
|
+
owners, nested framed subjects and repeated literal headings produce review
|
|
47
|
+
warnings; warnings alone do not fail CI. Messages identify the owner and remedy.
|
|
48
|
+
Standalone compact Cards and Page gutter removal also produce review warnings.
|
|
49
|
+
Verified Card-owning Metric/card-grid, UsageCard and TaskCard compositions also
|
|
50
|
+
participate in nested-surface and peer-gap review. Metric without its card variant,
|
|
51
|
+
compact MetricGrid, flat TaskCard, ChartCard and Receipt do not establish a frame.
|
|
52
|
+
Direct framed/default Card peers, including GridCell-wrapped peers, in a statically
|
|
53
|
+
small Stack/Grid gap also warn; omitted gaps use the actual component defaults.
|
|
54
|
+
Review visible ring clearance and the application's ordinary surface policy.
|
|
55
|
+
Review the compact subject and actual parent inset; PageViewport supplies none.
|
|
56
|
+
Recognizable metric cards, repeated fact rows and centered empty regions suggest
|
|
57
|
+
Metric/MetricGrid, MetadataList/InlineStat or EmptyState. Lower-level Empty and
|
|
58
|
+
modal anatomy suggest their complete workflow owners. These semantic guesses
|
|
59
|
+
are contextual warnings: keep valid custom subjects, editable rows and modal
|
|
60
|
+
lifecycles when the complete owner's contract differs. An arbitrary *Card name
|
|
61
|
+
never establishes ownership; ChartCard and Receipt are useful counterexamples.
|
|
62
|
+
Use existing app lint/typechecking for wider language, utility and accessibility
|
|
63
|
+
coverage. The script is deliberately small and does not replace them.
|
|
64
|
+
|
|
65
|
+
Coverage is limited to direct public imports, aliases/namespaces, native paragraph/
|
|
66
|
+
heading copy and same-file static classes/styles/props. Dynamic expressions are reported as unresolved;
|
|
67
|
+
cross-file wrappers, external CSS, render functions and runtime values require
|
|
68
|
+
review. Do not treat an empty report as proof of complete compliance or taste.
|
|
69
|
+
|
|
70
|
+
## Rendered and interaction evidence
|
|
71
|
+
|
|
72
|
+
Source checks establish imports and known ownership violations. Separately inspect
|
|
73
|
+
actual rectangles, wrapping, shared insets, title/action alignment and information
|
|
74
|
+
weight at supported parent widths and light/dark scopes. Open relevant menus and
|
|
75
|
+
overlays; a closed trigger cannot prove portal theming or popup geometry.
|
|
76
|
+
|
|
77
|
+
Execute affected callbacks, keyboard/focus, cancellation, validation, pending
|
|
78
|
+
and failure/retry states. Use deferred requests to observe pending behavior.
|
|
79
|
+
Confirm accepted data changes and draft retention; a toast is only feedback.
|
|
80
|
+
Compare before/after at the same conditions and record unverified limits.
|
|
81
|
+
|
|
82
|
+
Treat the user's appearance feedback as an acceptance criterion. Reproduce the
|
|
83
|
+
reported state at its actual width/theme and improve the responsible composition
|
|
84
|
+
or shared recipe. Keep source findings, measurements and inspected-image judgment
|
|
85
|
+
distinct: matching classes/radii and zero overflow do not establish a coherent
|
|
86
|
+
appearance. Inspect borders, rings, clipping and settled transforms in the actual
|
|
87
|
+
state. Compare the requested theme value before changing a shared default; an
|
|
88
|
+
image should demonstrate that the correction addresses the visible complaint.
|
|
89
|
+
|
|
90
|
+
## Application policy
|
|
91
|
+
|
|
92
|
+
Keep a small app-owned reference linked from its agent instructions: name the
|
|
93
|
+
shell/header/gutter owners, routing/query/form adapters, scope semantics,
|
|
94
|
+
information priorities and relevant local tests. Link current representative
|
|
95
|
+
pages. Preserve permissions, transport, translations and product-specific forms.
|
|
96
|
+
Do not copy the package API manual or edit the packaged skill to encode local policy.
|
|
97
|
+
|
|
98
|
+
When agent output is wrong, inspect installed/copied identity, whether the skill
|
|
99
|
+
was loaded, its discovery results, the actual declarations/runtime, and competing
|
|
100
|
+
app adapters/guides. An import-valid screen can still follow the wrong ownership
|
|
101
|
+
rule. Check current source rather than strengthening every sentence into a ban;
|
|
102
|
+
document concrete contradictions and fix the owning policy. Static checks cannot
|
|
103
|
+
infer product meaning or prove which instructions an agent actually followed.
|
|
104
|
+
|
|
105
|
+
Package declarations define supported props; this skill defines shared composition
|
|
106
|
+
and anatomy; the app defines business meaning and page conventions. If a shared
|
|
107
|
+
owner fails in a valid composition, isolate a reproduction and report the owning
|
|
108
|
+
contract. Do not spread private selectors or copy the control to hide the issue.
|
|
109
|
+
|
|
110
|
+
## When a valid composition looks wrong
|
|
111
|
+
|
|
112
|
+
Compare the installed declarations, shipped CSS and copied skill version first.
|
|
113
|
+
Test without the app reset when fonts, borders or list insets differ. Combine
|
|
114
|
+
field affordances and vary density separately from spacing; inspect long copy
|
|
115
|
+
in a narrow parent at a wide viewport too. Source checks cannot detect these.
|
|
116
|
+
|
|
117
|
+
Prefer a minimal public-API reproduction over private descendant CSS. For example,
|
|
118
|
+
use Metric's card variant for a navigable KPI with formatted value/trend instead
|
|
119
|
+
of recreating its hierarchy with Card + Text. Use Heading's `size` for visual
|
|
120
|
+
emphasis while `tag` keeps semantic level; its default admin scale is deliberate.
|
|
121
|
+
A custom Card subject or an application-owned hero remains valid.
|
|
122
|
+
|
|
123
|
+
Run discovery using both the task phrase and exact family/symbol. A zero result
|
|
124
|
+
is not permission to invent an export: inspect public-api.json/declarations and
|
|
125
|
+
report a missing capability. Static unknown spreads/classes remain unresolved;
|
|
126
|
+
review them at runtime rather than treating an empty finding list as approval.
|
|
@@ -8,21 +8,50 @@ Use shadcn semantic surfaces/foregrounds: background, card, popover, primary, se
|
|
|
8
8
|
|
|
9
9
|
tokens.json distinguishes 23 structural roots, advanced typography/status settings, and derived utility spellings. A utility is not another public variable. Keep overrides in one stylesheet at root or ThemeScope, without copying computed CSS into JavaScript.
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
The default `--radius` is 0.75rem (12px). One public root drives two shared
|
|
12
|
+
roles; component owners choose the role, so ordinary callers add no radius class.
|
|
13
|
+
|
|
14
|
+
| Role | Owners | Default |
|
|
15
|
+
| --- | --- | --- |
|
|
16
|
+
| `rounded-radius` | Cards, popup/command shells and other outer surfaces | 12px |
|
|
17
|
+
| `rounded-inner` | Inputs, buttons, select/facet triggers, collection/navigation rows and intentional nested bodies | 9px |
|
|
18
|
+
|
|
19
|
+
Standalone controls retain the inner role; a complete nested Card retains its
|
|
20
|
+
outer-shell role. Physical nesting does not select a different recipe.
|
|
21
|
+
|
|
22
|
+
The inner role is `min(radius × 0.75, min(height-action, height-control) ×
|
|
23
|
+
density-scale ÷ 4)`. The height bound keeps short controls restrained when an app
|
|
24
|
+
increases the global radius; a 0.75 multiplier alone would still produce capsules.
|
|
25
|
+
The smaller base height preserves a common inner radius when action and field
|
|
26
|
+
heights differ. Density scales that bound once: the default roots at density
|
|
27
|
+
0.875 yield 7.875px inner corners. Control size variants share the role; spacing
|
|
28
|
+
scale and surface padding do not change it. Do not override the derived alias as
|
|
29
|
+
another theme setting. Circular avatars/dots and joined-edge resets retain their
|
|
30
|
+
explicit shape mechanics; Badge retains its own root-based recipe.
|
|
31
|
+
|
|
32
|
+
CSS fits overlapping curves to the actual box, so computed values alone do not
|
|
33
|
+
prove the visible shape. Inspect settled corners, borders, clipping and focus
|
|
34
|
+
rings in opened surfaces. Change `--radius` at the theme boundary, rather than
|
|
35
|
+
replacing individual components' owned corners.
|
|
12
36
|
|
|
13
37
|
```css
|
|
14
|
-
/*
|
|
38
|
+
/* Intentional 40px controls, after style.css; overrides need no Tailwind build. */
|
|
15
39
|
:root {
|
|
16
|
-
--radius:
|
|
40
|
+
--radius: 0.75rem;
|
|
17
41
|
--height-action: 2.5rem;
|
|
18
42
|
--height-control: 2.5rem;
|
|
19
|
-
--surface-x:
|
|
20
|
-
--surface-y:
|
|
43
|
+
--surface-x: 1.25rem;
|
|
44
|
+
--surface-y: 1.25rem;
|
|
21
45
|
}
|
|
22
46
|
```
|
|
23
47
|
|
|
24
48
|
Action and editable-control heights are separate roles; keep roots equal for adjoining alignment. `--space-scale` multiplies structural gaps, inline insets and surface padding. `--density-scale` multiplies action/control height and collection block padding. Roots are unscaled measurements; do not pre-multiply and then apply the utility again.
|
|
25
49
|
|
|
50
|
+
Both surface roots default to 1.25rem. At a 16px root font and space-scale 1,
|
|
51
|
+
ordinary surface insets are 20px, compact insets are 10px and large insets are
|
|
52
|
+
36px. Page's default large gutters inherit that same recipe. Row insets,
|
|
53
|
+
control heights and copy gaps keep their independent roots.
|
|
54
|
+
|
|
26
55
|
| Shared geometry | Root / derivation |
|
|
27
56
|
| --- | --- |
|
|
28
57
|
| Actions versus fields | `--height-action` versus `--height-control`; default size uses the root times density-scale |
|
|
@@ -40,6 +69,12 @@ Explicit portal containers take precedence over the nearest ThemeScope. Place th
|
|
|
40
69
|
|
|
41
70
|
Apps using semantic utilities in their own JSX process themelia-react-ui/theme.css after Tailwind in a Tailwind v4 stylesheet. Compiled style.css styles shipped components but does not compile arbitrary app utility names. Keep app-owned classes namespaced and layout-focused.
|
|
42
71
|
|
|
72
|
+
The package class merger recognizes token overrides only for advertised utilities and exact class spellings emitted by the library stylesheet, including their negative, important and responsive forms. A valid Tailwind alias such as `m-space-2xl` can still be absent from that stylesheet. Unshipped aliases preserve existing fallback classes; they do not receive package override semantics merely because an app's separate Tailwind build can generate them. Use the app's own merge configuration for additional app-compiled aliases.
|
|
73
|
+
|
|
74
|
+
`ring` and `sidebar-ring` are focus roles tested at full strength. Preserve that
|
|
75
|
+
strength and verify at least 3:1 against adjacent surfaces when overriding the
|
|
76
|
+
theme; adding opacity can invalidate contrast even when the root color passes.
|
|
77
|
+
|
|
43
78
|
## Extend without drift
|
|
44
79
|
|
|
45
80
|
Reuse existing color, text, action/control, row, surface or shell responsibilities first. An app token stays app-owned, not a package knob. New package tokens require multiple consumers, one owner/default/purpose, contract/docs updates and scoped behavior verification. Never expand the budget to fix one preview.
|
|
@@ -49,8 +84,18 @@ Use public structures/utilities for custom composition. Missing API seams should
|
|
|
49
84
|
|
|
50
85
|
## Copy rhythm
|
|
51
86
|
|
|
52
|
-
Normal title/description gaps use `--gap-normal` (0.
|
|
53
|
-
copy uses `--gap-dense` (0.
|
|
87
|
+
Normal title/description gaps use `--gap-normal` (0.25rem); dense row and menu
|
|
88
|
+
copy uses `--gap-dense` (0.125rem). Both multiply once by `--space-scale` and
|
|
54
89
|
inherit through ThemeScope and portaled surfaces. Control heights and insets
|
|
55
90
|
remain separate. Use `textGap="normal" | "dense"` on headed surfaces and
|
|
56
91
|
`gap="normal" | "dense"` on Stack/Grid instead of adding a description margin.
|
|
92
|
+
|
|
93
|
+
## Independent geometry roles
|
|
94
|
+
|
|
95
|
+
Use `--space-scale` for room around content and `--density-scale` for control
|
|
96
|
+
heights. `--icon` and `--avatar` set media dimensions independently. Component
|
|
97
|
+
`size` picks a shared sm/md/lg recipe; collection `density` changes row padding.
|
|
98
|
+
Test these choices separately and in combination. Tables follow row insets,
|
|
99
|
+
Cards and code/message bodies follow surfaces, and image containment uses generic
|
|
100
|
+
spacing. Foundation directional spacing utilities ship with style.css and use
|
|
101
|
+
the same seven steps as gaps; generated spellings are not new theme roots.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"package": "themelia-react-ui",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"structural": [
|
|
5
5
|
{
|
|
6
6
|
"name": "--space-scale",
|
|
@@ -14,12 +14,12 @@
|
|
|
14
14
|
},
|
|
15
15
|
{
|
|
16
16
|
"name": "--gap-normal",
|
|
17
|
-
"default": "0.
|
|
17
|
+
"default": "0.25rem",
|
|
18
18
|
"purpose": "Vertical rhythm between titles and structural descriptions."
|
|
19
19
|
},
|
|
20
20
|
{
|
|
21
21
|
"name": "--gap-dense",
|
|
22
|
-
"default": "0.
|
|
22
|
+
"default": "0.125rem",
|
|
23
23
|
"purpose": "Vertical rhythm between row titles and compact supporting copy."
|
|
24
24
|
},
|
|
25
25
|
{
|
|
@@ -49,12 +49,12 @@
|
|
|
49
49
|
},
|
|
50
50
|
{
|
|
51
51
|
"name": "--surface-x",
|
|
52
|
-
"default": "
|
|
52
|
+
"default": "1.25rem",
|
|
53
53
|
"purpose": "Default inline inset for cards and multi-content surfaces."
|
|
54
54
|
},
|
|
55
55
|
{
|
|
56
56
|
"name": "--surface-y",
|
|
57
|
-
"default": "
|
|
57
|
+
"default": "1.25rem",
|
|
58
58
|
"purpose": "Default block inset for cards and multi-content surfaces."
|
|
59
59
|
},
|
|
60
60
|
{
|
|
@@ -120,11 +120,11 @@
|
|
|
120
120
|
],
|
|
121
121
|
"radius": {
|
|
122
122
|
"name": "--radius",
|
|
123
|
-
"default": "
|
|
124
|
-
"purpose": "
|
|
123
|
+
"default": "0.75rem",
|
|
124
|
+
"purpose": "Shared 8px corners keep short controls rectangular; nested corners derive from this root.",
|
|
125
125
|
"defaultUtility": "rounded-radius",
|
|
126
126
|
"innerUtility": "rounded-inner",
|
|
127
|
-
"innerFormula": "calc(var(--radius) * 0.
|
|
127
|
+
"innerFormula": "min(calc(var(--radius) * 0.75), calc(min(var(--height-action), var(--height-control)) * var(--density-scale) / 4))"
|
|
128
128
|
},
|
|
129
129
|
"advanced": [
|
|
130
130
|
"--font-heading",
|
|
@@ -256,7 +256,175 @@
|
|
|
256
256
|
"gap-x-normal",
|
|
257
257
|
"gap-x-dense",
|
|
258
258
|
"gap-y-normal",
|
|
259
|
-
"gap-y-dense"
|
|
259
|
+
"gap-y-dense",
|
|
260
|
+
"pt-space-2xs",
|
|
261
|
+
"pt-space-xs",
|
|
262
|
+
"pt-space-sm",
|
|
263
|
+
"pt-space-md",
|
|
264
|
+
"pt-space-lg",
|
|
265
|
+
"pt-space-xl",
|
|
266
|
+
"pt-space-2xl",
|
|
267
|
+
"pb-space-2xs",
|
|
268
|
+
"pb-space-xs",
|
|
269
|
+
"pb-space-sm",
|
|
270
|
+
"pb-space-md",
|
|
271
|
+
"pb-space-lg",
|
|
272
|
+
"pb-space-xl",
|
|
273
|
+
"pb-space-2xl",
|
|
274
|
+
"pl-space-2xs",
|
|
275
|
+
"pl-space-xs",
|
|
276
|
+
"pl-space-sm",
|
|
277
|
+
"pl-space-md",
|
|
278
|
+
"pl-space-lg",
|
|
279
|
+
"pl-space-xl",
|
|
280
|
+
"pl-space-2xl",
|
|
281
|
+
"pr-space-2xs",
|
|
282
|
+
"pr-space-xs",
|
|
283
|
+
"pr-space-sm",
|
|
284
|
+
"pr-space-md",
|
|
285
|
+
"pr-space-lg",
|
|
286
|
+
"pr-space-xl",
|
|
287
|
+
"pr-space-2xl",
|
|
288
|
+
"ps-space-2xs",
|
|
289
|
+
"ps-space-xs",
|
|
290
|
+
"ps-space-sm",
|
|
291
|
+
"ps-space-md",
|
|
292
|
+
"ps-space-lg",
|
|
293
|
+
"ps-space-xl",
|
|
294
|
+
"ps-space-2xl",
|
|
295
|
+
"pe-space-2xs",
|
|
296
|
+
"pe-space-xs",
|
|
297
|
+
"pe-space-sm",
|
|
298
|
+
"pe-space-md",
|
|
299
|
+
"pe-space-lg",
|
|
300
|
+
"pe-space-xl",
|
|
301
|
+
"pe-space-2xl",
|
|
302
|
+
"m-space-2xs",
|
|
303
|
+
"m-space-xs",
|
|
304
|
+
"m-space-sm",
|
|
305
|
+
"m-space-md",
|
|
306
|
+
"m-space-lg",
|
|
307
|
+
"m-space-xl",
|
|
308
|
+
"m-space-2xl",
|
|
309
|
+
"mx-space-2xs",
|
|
310
|
+
"mx-space-xs",
|
|
311
|
+
"mx-space-sm",
|
|
312
|
+
"mx-space-md",
|
|
313
|
+
"mx-space-lg",
|
|
314
|
+
"mx-space-xl",
|
|
315
|
+
"mx-space-2xl",
|
|
316
|
+
"my-space-2xs",
|
|
317
|
+
"my-space-xs",
|
|
318
|
+
"my-space-sm",
|
|
319
|
+
"my-space-md",
|
|
320
|
+
"my-space-lg",
|
|
321
|
+
"my-space-xl",
|
|
322
|
+
"my-space-2xl",
|
|
323
|
+
"mt-space-2xs",
|
|
324
|
+
"mt-space-xs",
|
|
325
|
+
"mt-space-sm",
|
|
326
|
+
"mt-space-md",
|
|
327
|
+
"mt-space-lg",
|
|
328
|
+
"mt-space-xl",
|
|
329
|
+
"mt-space-2xl",
|
|
330
|
+
"mb-space-2xs",
|
|
331
|
+
"mb-space-xs",
|
|
332
|
+
"mb-space-sm",
|
|
333
|
+
"mb-space-md",
|
|
334
|
+
"mb-space-lg",
|
|
335
|
+
"mb-space-xl",
|
|
336
|
+
"mb-space-2xl",
|
|
337
|
+
"ml-space-2xs",
|
|
338
|
+
"ml-space-xs",
|
|
339
|
+
"ml-space-sm",
|
|
340
|
+
"ml-space-md",
|
|
341
|
+
"ml-space-lg",
|
|
342
|
+
"ml-space-xl",
|
|
343
|
+
"ml-space-2xl",
|
|
344
|
+
"mr-space-2xs",
|
|
345
|
+
"mr-space-xs",
|
|
346
|
+
"mr-space-sm",
|
|
347
|
+
"mr-space-md",
|
|
348
|
+
"mr-space-lg",
|
|
349
|
+
"mr-space-xl",
|
|
350
|
+
"mr-space-2xl",
|
|
351
|
+
"ms-space-2xs",
|
|
352
|
+
"ms-space-xs",
|
|
353
|
+
"ms-space-sm",
|
|
354
|
+
"ms-space-md",
|
|
355
|
+
"ms-space-lg",
|
|
356
|
+
"ms-space-xl",
|
|
357
|
+
"ms-space-2xl",
|
|
358
|
+
"me-space-2xs",
|
|
359
|
+
"me-space-xs",
|
|
360
|
+
"me-space-sm",
|
|
361
|
+
"me-space-md",
|
|
362
|
+
"me-space-lg",
|
|
363
|
+
"me-space-xl",
|
|
364
|
+
"me-space-2xl",
|
|
365
|
+
"top-space-2xs",
|
|
366
|
+
"top-space-xs",
|
|
367
|
+
"top-space-sm",
|
|
368
|
+
"top-space-md",
|
|
369
|
+
"top-space-lg",
|
|
370
|
+
"top-space-xl",
|
|
371
|
+
"top-space-2xl",
|
|
372
|
+
"bottom-space-2xs",
|
|
373
|
+
"bottom-space-xs",
|
|
374
|
+
"bottom-space-sm",
|
|
375
|
+
"bottom-space-md",
|
|
376
|
+
"bottom-space-lg",
|
|
377
|
+
"bottom-space-xl",
|
|
378
|
+
"bottom-space-2xl",
|
|
379
|
+
"left-space-2xs",
|
|
380
|
+
"left-space-xs",
|
|
381
|
+
"left-space-sm",
|
|
382
|
+
"left-space-md",
|
|
383
|
+
"left-space-lg",
|
|
384
|
+
"left-space-xl",
|
|
385
|
+
"left-space-2xl",
|
|
386
|
+
"right-space-2xs",
|
|
387
|
+
"right-space-xs",
|
|
388
|
+
"right-space-sm",
|
|
389
|
+
"right-space-md",
|
|
390
|
+
"right-space-lg",
|
|
391
|
+
"right-space-xl",
|
|
392
|
+
"right-space-2xl",
|
|
393
|
+
"start-space-2xs",
|
|
394
|
+
"start-space-xs",
|
|
395
|
+
"start-space-sm",
|
|
396
|
+
"start-space-md",
|
|
397
|
+
"start-space-lg",
|
|
398
|
+
"start-space-xl",
|
|
399
|
+
"start-space-2xl",
|
|
400
|
+
"end-space-2xs",
|
|
401
|
+
"end-space-xs",
|
|
402
|
+
"end-space-sm",
|
|
403
|
+
"end-space-md",
|
|
404
|
+
"end-space-lg",
|
|
405
|
+
"end-space-xl",
|
|
406
|
+
"end-space-2xl",
|
|
407
|
+
"inset-space-2xs",
|
|
408
|
+
"inset-space-xs",
|
|
409
|
+
"inset-space-sm",
|
|
410
|
+
"inset-space-md",
|
|
411
|
+
"inset-space-lg",
|
|
412
|
+
"inset-space-xl",
|
|
413
|
+
"inset-space-2xl",
|
|
414
|
+
"inset-x-space-2xs",
|
|
415
|
+
"inset-x-space-xs",
|
|
416
|
+
"inset-x-space-sm",
|
|
417
|
+
"inset-x-space-md",
|
|
418
|
+
"inset-x-space-lg",
|
|
419
|
+
"inset-x-space-xl",
|
|
420
|
+
"inset-x-space-2xl",
|
|
421
|
+
"inset-y-space-2xs",
|
|
422
|
+
"inset-y-space-xs",
|
|
423
|
+
"inset-y-space-sm",
|
|
424
|
+
"inset-y-space-md",
|
|
425
|
+
"inset-y-space-lg",
|
|
426
|
+
"inset-y-space-xl",
|
|
427
|
+
"inset-y-space-2xl"
|
|
260
428
|
],
|
|
261
429
|
"states": [
|
|
262
430
|
"text-link-color",
|
|
@@ -8,16 +8,93 @@ The [example manifest](../examples/manifest.json) owns filenames, exported compo
|
|
|
8
8
|
|
|
9
9
|
[AccountIndex](../examples/index-table.tsx) exports `AccountIndex`, `AccountIndexProps`, `AccountRow` and `AccountIndexState`. Props are `state`, `onRetry`, `hrefFor(record)` and `onNavigate(href)`. The app drives the discriminated state: `loading`, `error` with a message, or `ready` with records. An empty ready collection renders the table's empty state. `onRetry` starts your loader; it must update app state through loading to ready/error. Stable row IDs belong to the records.
|
|
10
10
|
|
|
11
|
-
This recipe uses `themelia-react-ui/features/table`, so install `@tanstack/react-table` as an optional peer. Card frames
|
|
11
|
+
This recipe uses `themelia-react-ui/features/table`, so install `@tanstack/react-table` as an optional peer. Card frames an independent Accounts subject; the nested table uses `surface="flat"`. For a primary route collection use its own native table surface, as in the scoped directory below. A row action calls your navigation callback with your URL; `href` alone on a table action does not navigate. Supply your router callback or ordinary browser navigation. The library neither requests records nor chooses routes.
|
|
12
12
|
|
|
13
13
|
Verify loading, empty refresh, failure/retry and ready records. Open the row menu with pointer and keyboard, activate Open account, and assert the requested URL. Check narrow overflow and email-link behavior. If you need a presentational table without TanStack features, discover `themelia-react-ui/base/table` and inspect its separate declaration.
|
|
14
14
|
|
|
15
|
+
`enableResizing` enables pointer and keyboard separators on individual/grouped
|
|
16
|
+
headers. Arrow keys follow inherited text direction; Home/End use leaf minimums
|
|
17
|
+
and explicit maximums from your column definitions. The table owns its one named
|
|
18
|
+
scroll region. Verify grouped widths, sticky header rows and first-column behavior
|
|
19
|
+
with real overflow in both directions, rather than adding another focusable wrapper.
|
|
20
|
+
|
|
21
|
+
## Comment attachments
|
|
22
|
+
|
|
23
|
+
`Comments` and `CommentComposer` announce attachment validation/upload errors.
|
|
24
|
+
Use their existing attachment error `strings` for localization. Headless
|
|
25
|
+
`useAttachmentUpload` accepts those same keys through `strings`; render feedback
|
|
26
|
+
from `onError` in your own composer. Failed chips retain retry/remove actions.
|
|
27
|
+
Reset/removal aborts pending uploads; the app owns transport and persistence.
|
|
28
|
+
|
|
15
29
|
## Detail and framing
|
|
16
30
|
|
|
17
31
|
[AccountDetail](../examples/detail.tsx) exports `AccountDetail`, `AccountDetailProps` and `AccountDetailRecord`. Supply `account`, `onEdit(id)` and `onBack()`. Card owns the frame/header/body/footer; Name, Email, Date, Money and Value own formatting and missing-value fallbacks. `balanceMinor` uses `Money unit="minor"`; currency and date values come from the app.
|
|
18
32
|
|
|
19
33
|
No optional peers are needed. The app supplies the loaded record and owns navigation, locale/provider defaults and permissions. Verify missing email/date/balance, a real minor-unit amount, Edit/Back callbacks, and the one-column mobile/two-column desktop composition in light/dark themes.
|
|
20
34
|
|
|
35
|
+
## Scoped directory
|
|
36
|
+
|
|
37
|
+
[ScopedDirectory](../examples/scoped-directory.tsx) demonstrates a primary route
|
|
38
|
+
collection. Page owns Contacts, the fixed business context and the explicit
|
|
39
|
+
primary New contact command. DataTable owns the surface; FilterLayout occupies
|
|
40
|
+
`topbarContent`, optional export occupies `topbarEnd`, and Open contact is a row
|
|
41
|
+
action. ResourceCell owns identity, shared small secondary Text supplies role,
|
|
42
|
+
and Email owns formatting. Other operational facts belong in the contact detail
|
|
43
|
+
reached by `onOpen`; the example does not append every fact to compact identity.
|
|
44
|
+
|
|
45
|
+
The optional `compact` prop is an app presentation decision from available parent
|
|
46
|
+
width. It keeps email reach in the identity cell and omits the comparison Email
|
|
47
|
+
column, preserving one copy and reachable row actions. This deliberately retains
|
|
48
|
+
one task-critical fact; other metadata stays in detail. Choose the threshold
|
|
49
|
+
from actual content and work-region measurements, not a universal library setting.
|
|
50
|
+
|
|
51
|
+
The app supplies `scope`, discriminated `state`, controlled `filters`, navigation
|
|
52
|
+
and loading callbacks. `onQueryChange({ scopeId, filters })` preserves fixed
|
|
53
|
+
business context even when criteria clear. It does not request records itself.
|
|
54
|
+
The recipe removes a blank `q` search criterion without normalizing unrelated
|
|
55
|
+
filter types. Native search can emit an empty string; the app owns query meaning.
|
|
56
|
+
The app updates filters/state, ignores stale responses and preserves scope/query
|
|
57
|
+
in pagination URLs. A criteria-driven business selector would be a different
|
|
58
|
+
product contract. The recipe's English labels are example copy: adapt labels,
|
|
59
|
+
criteria and component `strings` for app translation and permissions.
|
|
60
|
+
|
|
61
|
+
Strict imported declarations require the manifest's optional peers. DataTable
|
|
62
|
+
sorting is disabled because the app's server owns query order. Loading/error
|
|
63
|
+
feedback occupies the empty result region while query context remains mounted;
|
|
64
|
+
accepted records replace it. Use the public loading/preview owner if retaining
|
|
65
|
+
previous results is required by your app. Avoid stale pagination metadata during
|
|
66
|
+
loading/errors. Run the same query with loading, failure, retry and empty results.
|
|
67
|
+
|
|
68
|
+
Verify one contextual lead, primary command, query/clear scope retention,
|
|
69
|
+
row-menu navigation, server page callbacks and long-name/mobile containment.
|
|
70
|
+
Opening a record preserves access to supporting facts. Integrated queries and
|
|
71
|
+
separate query regions are both supported; choose by task and keep one owner.
|
|
72
|
+
|
|
73
|
+
Keep DataTable column/action definitions stable when unrelated parent feedback
|
|
74
|
+
changes. Changing a cell renderer's identity can remount its menu trigger and
|
|
75
|
+
lose return focus. This recipe memoizes row actions by `onOpen`; the app keeps
|
|
76
|
+
that callback stable when its meaning is unchanged. Stabilize these lifecycle
|
|
77
|
+
inputs deliberately, not every object. A real record/scope change can replace
|
|
78
|
+
definitions; the app then chooses appropriate destination focus.
|
|
79
|
+
|
|
80
|
+
## Single resource page
|
|
81
|
+
|
|
82
|
+
Use `Page`, `PageHeader` and `PageActions` from `themelia-react-ui/layout/page`
|
|
83
|
+
for the record route's identity, back navigation, content bounds and commands.
|
|
84
|
+
The [layout recipe](../examples/app-layout.tsx) demonstrates that route boundary;
|
|
85
|
+
the [detail recipe](../examples/detail.tsx) demonstrates an independently framed
|
|
86
|
+
record subject with MetadataList and value primitives. Decide whether the record
|
|
87
|
+
needs that independent Card before nesting it under Page. Avoid repeating the
|
|
88
|
+
route heading just to frame the same facts. Page owns gutters; PageViewport owns
|
|
89
|
+
scrolling only. App navigation, record loading/missing/error/retry, permissions,
|
|
90
|
+
edit and delete callbacks remain application responsibilities.
|
|
91
|
+
|
|
92
|
+
Use `WorkspaceLayout` from `themelia-react-ui/layout/workspace` when independently composed record header,
|
|
93
|
+
sidebar/main/rail regions are needed; inspect `features/resource` for complete
|
|
94
|
+
resource coordination. A single record does not automatically need either.
|
|
95
|
+
Read [layout composition](composition.md#application-layouts) for boundary and
|
|
96
|
+
parent-width behavior, then the exact selected declaration for its current props.
|
|
97
|
+
|
|
21
98
|
## Validated editing
|
|
22
99
|
|
|
23
100
|
[AccountEdit](../examples/edit.tsx) exports `AccountEdit`, `AccountEditProps` and `AccountEditValue`. Supply `initial`, `onSave(value): Promise<AccountEditValue>` and `onCancel()`. Mount with `key={initial.id}` when switching records. The draft is local to that mount; resetting the same record's draft deliberately also requires a new key or your own controlled adaptation.
|
|
@@ -37,3 +114,54 @@ Your delete callback owns persistence and record removal. Reject failures instea
|
|
|
37
114
|
Verify open/title/description, trapped keyboard focus, Cancel/Escape without a deletion callback, pending dismissal prevention, rejected callback with an open error, retry and successful closure, exactly one backend effect, and trigger focus restoration. Check the opened error dialog in dark/mobile as well as light/desktop. Do not infer these interactions from typechecking or screenshots.
|
|
38
115
|
|
|
39
116
|
The existing [AccountComposition](../examples/composition.tsx) remains a basic Card/ActionDialog composition with `save(name): Promise<void>`. Its callback must reject on failure; the app owns persistence. The four recipes above add progressive collection/detail/edit/delete ownership without changing that example's contract.
|
|
117
|
+
|
|
118
|
+
## Task summaries, usage and inline editing
|
|
119
|
+
|
|
120
|
+
[Workspace summary](../examples/planning-usage-edit.tsx) composes three focused
|
|
121
|
+
owners. `TaskCard` from `themelia-react-ui/blocks/planning` owns the explicit Card
|
|
122
|
+
surface, completion summary, disclosure and controlled subtask proposals.
|
|
123
|
+
Update `items` after `onItemCompletedChange`; supply each item's `busy` or
|
|
124
|
+
`error` from your persistence lifecycle. Workflow status, due-date formatting,
|
|
125
|
+
assignment and Open navigation remain application data/callbacks.
|
|
126
|
+
|
|
127
|
+
Click passive header content or use the native caret (pointer, Enter or Space)
|
|
128
|
+
to request expansion. Both respect `expanded`/`onExpandedChange` and `disabled`;
|
|
129
|
+
header clicks focus the caret. Subtask and footer actions remain independent.
|
|
130
|
+
The block owns the segmented progress drawing, completion strikethrough and
|
|
131
|
+
compact checklist insets. Its progress value follows accepted `items`, including
|
|
132
|
+
undo; workflow status stays separate. Reduced motion disables the ring animation.
|
|
133
|
+
|
|
134
|
+
`UsageCard` from `themelia-react-ui/blocks/analytics/usage-card` is a standalone
|
|
135
|
+
quota/analytics composition with no optional chart dependency. Supply matching
|
|
136
|
+
`data`, `period` and `status` after `onPeriodChange`; cancel or ignore stale
|
|
137
|
+
application requests. `limit: null` means unlimited, omitted limits or values
|
|
138
|
+
mean unavailable, and zero is real data. Category percentages describe shares
|
|
139
|
+
of reported usage; bounded graphics never hide actual over-quota amounts.
|
|
140
|
+
Daily data is chronological application data with text equivalents. The block
|
|
141
|
+
owns no subscription or billing requests; `footerAction` is application content.
|
|
142
|
+
|
|
143
|
+
`InlineEdit` from `themelia-react-ui/base/inline-edit` uses our native Input or
|
|
144
|
+
Textarea. Supply `onSave(value, { signal })` for asynchronous persistence and
|
|
145
|
+
update a controlled saved value through `onValueChange`. Required/validation
|
|
146
|
+
checks apply when saving a draft. Parent forms serialize the committed value
|
|
147
|
+
through `name`; they own validation of their complete stored data. Enter saves
|
|
148
|
+
a single line, Control/Command Enter saves multiline text, and Escape cancels.
|
|
149
|
+
Cancellation invalidates late UI results and aborts the supplied signal; the
|
|
150
|
+
application owns actual transport and server effects. Read-only display stays
|
|
151
|
+
passive. Use Card at a composition boundary for a framed field section.
|
|
152
|
+
|
|
153
|
+
Display and editing share the Input frame and `size`, `invalid`, `loading`,
|
|
154
|
+
`clearable`, `onClear` and `showCharacterCount` APIs. The stable field/action
|
|
155
|
+
grid transitions width and honors reduced motion; multiline actions form a
|
|
156
|
+
centered column. Use `inputProps`/`textareaProps` for native editor attributes,
|
|
157
|
+
adornments, resizing and control-specific strings. State/value/ref/form ownership
|
|
158
|
+
stays with InlineEdit. Native constraints run on Save; uncommitted controls are
|
|
159
|
+
isolated from the parent form. External loading retains a draft while disabling
|
|
160
|
+
edits/save, and leaves cancellation available.
|
|
161
|
+
|
|
162
|
+
The field/action gap uses the existing `lg` spacing step; the action group uses
|
|
163
|
+
`xs`. Single-line actions form a horizontal pair and multiline actions a centered
|
|
164
|
+
column. Keep these library-owned controls and geometry instead of replacing
|
|
165
|
+
them with app-styled fields. Verify cancellation during persistence, retained
|
|
166
|
+
drafts after rejection, native constraints, committed FormData, controlled
|
|
167
|
+
expansion, checkbox/Open independence and async period retry in your app.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
4
|
+
import { validateIndex } from './discovery.mjs';
|
|
5
|
+
import { analyzeComposition } from './composition-policy.mjs';
|
|
6
|
+
|
|
7
|
+
try {
|
|
8
|
+
const targets = process.argv.slice(2);
|
|
9
|
+
if (!targets.length || targets.some(target => target.startsWith('-'))) throw new Error('Pass explicit source files/directories; no flags or automatic app-wide scan.');
|
|
10
|
+
const requireFromApp = createRequire(path.join(process.cwd(), 'package.json'));
|
|
11
|
+
const ts = requireFromApp('typescript');
|
|
12
|
+
const index = validateIndex(JSON.parse(fs.readFileSync(new URL('../references/public-api.json', import.meta.url), 'utf8')));
|
|
13
|
+
const files = new Set();
|
|
14
|
+
function collect(target) {
|
|
15
|
+
const info = fs.lstatSync(target);
|
|
16
|
+
if (info.isSymbolicLink()) throw new Error(`Use a real source path instead of a symlink: ${target}`);
|
|
17
|
+
if (info.isDirectory()) {
|
|
18
|
+
for (const entry of fs.readdirSync(target).sort()) if (!['node_modules', '.git', 'dist', 'build'].includes(entry)) collect(path.join(target, entry));
|
|
19
|
+
} else if (/\.[jt]sx?$/.test(target) && !/\.d\.ts$/.test(target)) files.add(path.resolve(target));
|
|
20
|
+
}
|
|
21
|
+
targets.forEach(collect);
|
|
22
|
+
if (!files.size) throw new Error('No supported source files found in the supplied paths.');
|
|
23
|
+
const reports = [...files].sort().map(filename => analyzeComposition(fs.readFileSync(filename, 'utf8'), { filename, index, ts }));
|
|
24
|
+
const findings = reports.flatMap(report => report.findings);
|
|
25
|
+
const errors = findings.filter(finding => finding.severity === 'error').length;
|
|
26
|
+
process.stdout.write(JSON.stringify({ package: index.package, version: index.version, files: files.size, errors, warnings: findings.length - errors, findings, unresolved: reports.flatMap(report => report.unresolved), limits: 'Source analysis only: recognized imports and same-file static JSX. External CSS, cross-file wrappers and dynamic values require review. No rendered, interaction, visual-acceptance or production-readiness verdict.' }, null, 2) + '\n');
|
|
27
|
+
process.exitCode = errors ? 1 : 0;
|
|
28
|
+
} catch (error) {
|
|
29
|
+
process.stderr.write(`check-composition: ${error.message}\nRun from the consumer app with its TypeScript development dependency installed.\n`);
|
|
30
|
+
process.exitCode = 1;
|
|
31
|
+
}
|