themelia-ui 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/themelia-ui/SKILL.md +27 -29
- package/.agents/skills/themelia-ui/references/api-compatibility.md +3 -3
- package/.agents/skills/themelia-ui/references/composition.md +2 -18
- package/.agents/skills/themelia-ui/references/framework-wiring.md +8 -8
- package/.agents/skills/themelia-ui/references/imports.md +104 -104
- package/.agents/skills/themelia-ui/references/installation.md +55 -27
- package/.agents/skills/themelia-ui/references/migration.md +136 -5
- package/.agents/skills/themelia-ui/references/provider-and-scoping.md +13 -19
- package/.agents/skills/themelia-ui/references/theming.md +170 -131
- package/.agents/skills/themelia-ui/references/troubleshooting.md +62 -27
- package/.agents/skills/themelia-ui/references/verification.md +2 -3
- package/CHANGELOG.md +187 -0
- package/README.md +45 -60
- package/dist/accordion-CHuzMmWL.js +143 -0
- package/dist/{action-menu-BNLURfMK.js → action-menu-BwiL_F6I.js} +35 -33
- package/dist/{alert-dialog-BMVo6Z-8.js → alert-dialog-Bmo1YrTm.js} +1 -1
- package/dist/avatar-Dc_BNYfB.js +93 -0
- package/dist/badge-VlJVZjdm.js +45 -0
- package/dist/base/accordion.js +1 -1
- package/dist/base/action-menu.js +1 -1
- package/dist/base/alert-dialog.js +1 -1
- package/dist/base/aspect-ratio.js +3 -1
- package/dist/base/avatar.js +1 -1
- package/dist/base/badge.js +2 -2
- package/dist/base/batch-action-bar.js +1 -1
- package/dist/base/buttons.js +1 -1
- package/dist/base/cards.js +1 -1
- package/dist/base/carousel.js +6 -4
- package/dist/base/chart.js +1 -1
- package/dist/base/choice-inputs.js +1 -1
- package/dist/base/combobox.js +1 -1
- package/dist/base/command.js +1 -1
- package/dist/base/context-menu.js +22 -21
- package/dist/base/copyable.js +1 -1
- package/dist/base/date-pickers.js +1 -1
- package/dist/base/dialog.js +1 -1
- package/dist/base/display.js +1 -1
- package/dist/base/dropdown-menu.js +1 -1
- package/dist/base/feedback.js +1 -1
- package/dist/base/forms-numeric.js +1 -1
- package/dist/base/forms.js +1 -1
- package/dist/base/hover-card.js +26 -23
- package/dist/base/input-group.js +1 -1
- package/dist/base/item.js +1 -1
- package/dist/base/label.js +1 -1
- package/dist/base/menubar.js +20 -14
- package/dist/base/navigation-menu.js +47 -38
- package/dist/base/navigation.js +1 -1
- package/dist/base/otp-input.js +36 -30
- package/dist/base/overlay.js +1 -1
- package/dist/base/popover-menu.js +1 -1
- package/dist/base/popover.js +1 -1
- package/dist/base/qr-code.js +51 -47
- package/dist/base/repeaters.js +1 -1
- package/dist/base/resizable.js +2 -0
- package/dist/base/sheet.js +1 -1
- package/dist/base/sidebar.js +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 +1 -1
- package/dist/base/timeline.js +1 -1
- package/dist/base/toaster.js +1 -1
- package/dist/base/toggle.js +21 -15
- package/dist/base/toolbar.js +1 -1
- package/dist/base/tooltip.js +1 -1
- package/dist/base/typography.js +2 -2
- package/dist/base/upload.js +1 -1
- package/dist/base/value-inputs.js +1 -1
- package/dist/{batch-action-bar-BZYNKXdV.js → batch-action-bar-DZVMVW83.js} +11 -8
- package/dist/{admin/patterns → blocks/admin}/access.js +79 -76
- package/dist/blocks/admin/commerce.js +2493 -0
- package/dist/{patterns → blocks}/analytics.js +312 -303
- package/dist/{patterns → blocks}/onboarding.js +27 -23
- package/dist/{patterns → blocks}/timelines.js +1 -1
- package/dist/buttons-BX2JfL5X.js +173 -0
- package/dist/cards-DdiICdMM.js +279 -0
- package/dist/chart-BkK3Xm10.js +201 -0
- package/dist/choice-inputs-CCw-0gD6.js +694 -0
- package/dist/combobox-Byu8N-Oe.js +274 -0
- package/dist/command-CnB_IZSo.js +156 -0
- package/dist/comments-C6Y_ddMt.js +1443 -0
- package/dist/components/base/action-menu/action-menu.d.ts +1 -1
- package/dist/components/base/action-menu/action-menu.types.d.ts +2 -2
- package/dist/components/base/avatar/avatar.d.ts +5 -2
- package/dist/components/base/badge/badge.d.ts +10 -10
- package/dist/components/base/badge/badge.variants.d.ts +1 -2
- package/dist/components/base/badge/index.d.ts +1 -2
- package/dist/components/base/buttons/button.d.ts +9 -8
- package/dist/components/base/buttons/button.types.d.ts +2 -2
- package/dist/components/base/buttons/index.d.ts +1 -1
- package/dist/components/base/buttons/text-button.d.ts +1 -1
- package/dist/components/base/cards/card-actions.d.ts +1 -1
- package/dist/components/base/cards/card.d.ts +3 -1
- package/dist/components/base/cards/partials/card-header.d.ts +2 -1
- package/dist/components/base/choice-inputs/choice.types.d.ts +2 -2
- package/dist/components/base/choice-inputs/partials/choice-parts.d.ts +3 -3
- package/dist/components/base/command/command.d.ts +5 -2
- package/dist/components/base/display/icon-badge.d.ts +5 -3
- package/dist/components/base/display/index.d.ts +1 -1
- package/dist/components/base/display/metadata-list.d.ts +6 -6
- package/dist/components/base/display/metadata-value.d.ts +1 -1
- package/dist/components/base/display/separator.d.ts +2 -2
- package/dist/components/base/feedback/alert.d.ts +3 -2
- package/dist/components/base/feedback/empty.d.ts +5 -4
- package/dist/components/base/feedback/progress-circle.d.ts +2 -2
- package/dist/components/base/feedback/progress.d.ts +3 -1
- package/dist/components/base/input-group/input-group.d.ts +8 -10
- package/dist/components/base/item/item.d.ts +2 -2
- package/dist/components/base/overlay/index.d.ts +1 -1
- package/dist/components/base/overlay/overlay.types.d.ts +7 -5
- package/dist/components/base/qr-code/qr-code.d.ts +4 -4
- package/dist/components/base/sheet/sheet.d.ts +1 -1
- package/dist/components/base/sidebar/sidebar.d.ts +9 -13
- package/dist/components/base/spinner/spinner.d.ts +2 -2
- package/dist/components/base/structure/adaptive-grid.d.ts +3 -3
- package/dist/components/base/structure/bleed.d.ts +3 -2
- package/dist/components/base/structure/grid.d.ts +2 -2
- package/dist/components/base/structure/index.d.ts +1 -1
- package/dist/components/base/structure/split.d.ts +3 -3
- package/dist/components/base/structure/stack.d.ts +5 -5
- package/dist/components/base/structure/structure.maps.d.ts +2 -1
- package/dist/components/base/structure/structure.types.d.ts +10 -4
- package/dist/components/base/toggle/toggle.d.ts +2 -2
- package/dist/components/base/toolbar/toolbar.d.ts +3 -3
- package/dist/components/base/typography/index.d.ts +2 -0
- package/dist/components/base/typography/rich-text/rich-text.variants.d.ts +9 -0
- package/dist/components/base/typography/text/index.d.ts +1 -0
- package/dist/components/base/typography/text/text.d.ts +15 -8
- package/dist/components/base/typography/text/text.variants.d.ts +41 -0
- package/dist/components/base/value-inputs/color-input.d.ts +1 -7
- package/dist/components/base/value-inputs/slider.d.ts +2 -7
- package/dist/components/{admin/patterns → blocks/admin}/commerce/vendor-profile.d.ts +2 -1
- package/dist/components/{patterns → blocks}/analytics/analytics.strings.d.ts +2 -5
- package/dist/components/features/actions/action-adapters.d.ts +3 -3
- package/dist/components/features/actions/actions.types.d.ts +3 -5
- package/dist/components/features/actions/index.d.ts +1 -1
- package/dist/components/features/activities/activities-feed.d.ts +1 -1
- package/dist/components/features/activities/activities.types.d.ts +4 -4
- package/dist/components/features/activities/activity-parts.d.ts +3 -3
- package/dist/components/features/activities/activity-row.d.ts +4 -4
- package/dist/components/features/activities/index.d.ts +1 -1
- package/dist/components/features/ai-chat/ai-chat.types.d.ts +10 -3
- package/dist/components/features/ai-chat/ai-message-surfaces.d.ts +1 -1
- package/dist/components/features/ai-chat/ai-work-surfaces.d.ts +1 -1
- package/dist/components/features/combobox/combobox.strings.d.ts +2 -2
- package/dist/components/features/event-calendar/event-calendar.types.d.ts +3 -0
- package/dist/components/features/media-library/index.d.ts +1 -1
- package/dist/components/features/media-library/media-library-parts.d.ts +4 -3
- package/dist/components/features/media-library/media-library-views.d.ts +4 -3
- package/dist/components/features/media-library/media-library.d.ts +1 -1
- package/dist/components/features/media-library/media-library.strings.d.ts +12 -13
- package/dist/components/features/media-library/media-library.types.d.ts +11 -9
- package/dist/components/features/media-library/media-resource-gallery.d.ts +1 -1
- package/dist/components/features/media-library/use-media-library.d.ts +1 -4
- package/dist/components/features/overlays/action-overlay-frame.d.ts +1 -1
- package/dist/components/features/overlays/index.d.ts +1 -1
- package/dist/components/features/overlays/overlay-parts.d.ts +3 -3
- package/dist/components/features/overlays/overlays.types.d.ts +8 -7
- package/dist/components/features/rich-text-editor/index.d.ts +0 -1
- package/dist/components/features/table/data-table-body.d.ts +1 -1
- package/dist/components/features/table/data-table-expanded-row.d.ts +27 -0
- package/dist/components/features/table/data-table-header.d.ts +1 -1
- package/dist/components/features/table/data-table-size.d.ts +1 -1
- package/dist/components/features/table/data-table.d.ts +1 -1
- package/dist/components/features/table/index.d.ts +1 -1
- package/dist/components/features/table/table-helpers.d.ts +9 -3
- package/dist/components/features/table/table.strings.d.ts +11 -0
- package/dist/components/features/table/table.types.d.ts +60 -2
- package/dist/components/features/theme-tweaker/index.d.ts +1 -1
- package/dist/components/features/theme-tweaker/theme-tweaker.strings.d.ts +1 -1
- package/dist/components/features/theme-tweaker/theme-tweaker.types.d.ts +6 -10
- package/dist/components/features/theme-tweaker/theme-tweaker.utils.d.ts +22 -6
- package/dist/components/layout/app-shell/topbar-sidebar-layout.d.ts +1 -1
- package/dist/components/layout/auth/auth.d.ts +1 -1
- package/dist/components/layout/auth/auth.types.d.ts +1 -1
- package/dist/components/primitives/value.d.ts +3 -1
- package/dist/containers-B8d8U9GS.js +2 -0
- package/dist/{copyable-H1TUEY-H.js → copyable-D9Okb1w6.js} +12 -11
- package/dist/core.css +2 -2
- package/dist/css/access.css +2 -1
- package/dist/css/accordion.css +2 -1
- package/dist/css/action-menu.css +2 -1
- package/dist/css/activities.css +2 -1
- package/dist/css/ai-chat.css +2 -1
- package/dist/css/analytics.css +2 -1
- package/dist/css/app-shell.css +2 -1
- package/dist/css/aspect-ratio.css +2 -1
- package/dist/css/async-preview.css +2 -1
- package/dist/css/auth.css +2 -1
- package/dist/css/avatar.css +2 -1
- package/dist/css/badge.css +2 -1
- package/dist/css/batch-action-bar.css +2 -1
- package/dist/css/buttons.css +2 -1
- package/dist/css/cards.css +2 -1
- package/dist/css/carousel.css +2 -1
- package/dist/css/chart.css +2 -1
- package/dist/css/choice-inputs.css +2 -1
- package/dist/css/combobox.css +2 -1
- package/dist/css/combobox2.css +2 -1
- package/dist/css/command.css +2 -1
- package/dist/css/comments.css +2 -1
- package/dist/css/commerce.css +2 -1
- package/dist/css/containers.css +2 -1
- package/dist/css/copyable.css +2 -1
- package/dist/css/data-view.css +2 -1
- package/dist/css/date-pickers.css +2 -1
- package/dist/css/display.css +2 -1
- package/dist/css/dropdown-menu.css +2 -1
- package/dist/css/event-calendar.css +2 -1
- package/dist/css/feedback.css +2 -1
- package/dist/css/filters.css +2 -1
- package/dist/css/forms-numeric.css +2 -1
- package/dist/css/forms.css +2 -1
- package/dist/css/global-search.css +2 -1
- package/dist/css/header.css +2 -1
- package/dist/css/hover-card.css +2 -1
- package/dist/css/input-group.css +2 -1
- package/dist/css/item.css +2 -1
- package/dist/css/kanban.css +2 -1
- package/dist/css/label.css +2 -1
- package/dist/css/map.css +2 -1
- package/dist/css/media-library.css +2 -1
- package/dist/css/mentions.css +2 -1
- package/dist/css/menubar.css +2 -1
- package/dist/css/navigation-menu.css +2 -1
- package/dist/css/navigation.css +2 -1
- package/dist/css/navigation2.css +2 -1
- package/dist/css/onboarding.css +2 -1
- package/dist/css/otp-input.css +2 -1
- package/dist/css/overlay.css +2 -1
- package/dist/css/overlays.css +2 -1
- package/dist/css/page.css +2 -1
- package/dist/css/popover-menu.css +2 -1
- package/dist/css/popover.css +2 -1
- package/dist/css/primitives.css +2 -1
- package/dist/css/products.css +2 -1
- package/dist/css/qr-code.css +2 -1
- package/dist/css/repeaters.css +2 -1
- package/dist/css/resizable.css +2 -1
- package/dist/css/resource-assignment.css +2 -1
- package/dist/css/resource.css +2 -1
- package/dist/css/rich-text-editor.css +2 -1
- package/dist/css/schema-form.css +2 -1
- package/dist/css/sidebar.css +2 -1
- package/dist/css/sidebar2.css +2 -1
- package/dist/css/skeleton.css +2 -1
- package/dist/css/spinner.css +2 -1
- package/dist/css/structure.css +2 -1
- package/dist/css/sync.css +2 -1
- package/dist/css/table.css +2 -1
- package/dist/css/table2.css +2 -1
- package/dist/css/text-inputs.css +2 -1
- package/dist/css/theme-tweaker.css +2 -1
- package/dist/css/timeline.css +2 -1
- package/dist/css/timelines.css +2 -1
- package/dist/css/toaster.css +2 -1
- package/dist/css/toggle.css +2 -1
- package/dist/css/toolbar.css +2 -1
- package/dist/css/tooltip.css +2 -1
- package/dist/css/typography.css +2 -1
- package/dist/css/upload.css +2 -1
- package/dist/css/value-inputs.css +2 -1
- package/dist/css/workspace.css +2 -1
- package/dist/css-graph.json +1027 -0
- package/dist/date-pickers-C2HgjpFU.js +685 -0
- package/dist/{dialog-CtFCuTUF.js → dialog-0nRFg5Zs.js} +1 -1
- package/dist/display-BGN834xV.js +664 -0
- package/dist/dropdown-menu-Br8kvjrF.js +235 -0
- package/dist/empty.js +0 -0
- package/dist/features/actions.js +6 -6
- package/dist/features/activities.js +219 -216
- package/dist/features/ai-chat.js +593 -565
- package/dist/features/async-preview.js +105 -286
- package/dist/features/combobox.js +119 -117
- package/dist/features/comments.js +1 -1
- package/dist/features/data-view.js +56 -55
- package/dist/features/event-calendar.js +189 -185
- package/dist/features/filters.js +1 -1
- package/dist/features/global-search.js +259 -260
- package/dist/features/kanban.js +39 -37
- package/dist/features/map.js +357 -354
- package/dist/features/media-library.js +931 -931
- package/dist/features/mentions.js +1 -1
- package/dist/features/overlays.js +1 -1
- package/dist/features/products.js +950 -942
- package/dist/features/resource-assignment.js +39 -37
- package/dist/features/resource.js +70 -71
- package/dist/features/rich-text-editor.js +2 -2
- package/dist/features/schema-form.js +342 -338
- package/dist/features/sync.js +14 -12
- package/dist/features/table.js +1 -1
- package/dist/features/theme-tweaker.js +1002 -962
- package/dist/feedback-D4qVsKlD.js +430 -0
- package/dist/{filters-DOLKRSmb.js → filters-geLuSlFL.js} +386 -383
- package/dist/forms-NxbJK4Mh.js +250 -0
- package/dist/forms-numeric-C6NMdj6G.js +582 -0
- package/dist/index.js +2 -2
- package/dist/input-group-HS_Z0Ei_.js +119 -0
- package/dist/item-CuUJyETl.js +150 -0
- package/dist/{label-DumoMDm6.js → label-HOBXAscw.js} +7 -5
- package/dist/layout/app-shell.js +4 -2
- package/dist/layout/auth.js +102 -100
- package/dist/layout/header.js +190 -180
- package/dist/layout/navigation.js +1 -1
- package/dist/layout/page.js +18 -16
- package/dist/layout/settings.js +2 -2
- package/dist/layout/sidebar.js +43 -43
- package/dist/layout/workspace.js +71 -69
- package/dist/lib/action-presentation.d.ts +3 -3
- package/dist/lib/component-vocabulary.d.ts +2 -2
- package/dist/lib/css-length.d.ts +2 -0
- package/dist/lib/responsive.d.ts +1 -1
- package/dist/lib/theming/index.d.ts +1 -0
- package/dist/lib/theming/recipes.d.ts +2 -2
- package/dist/lib/theming/themes/dense.d.ts +3 -0
- package/dist/lib/theming/themes/editorial.d.ts +3 -0
- package/dist/lib/theming/themes/index.d.ts +8 -0
- package/dist/lib/theming/themes/pair.d.ts +7 -0
- package/dist/lib/theming/themes/sharp.d.ts +3 -0
- package/dist/lib/theming/themes/soft.d.ts +3 -0
- package/dist/lib/theming/themes/types.d.ts +12 -0
- package/dist/lib/ui-provider/index.d.ts +1 -1
- package/dist/lib/ui-provider/scope.d.ts +5 -8
- package/dist/lib/ui-provider/tokens.d.ts +11 -3
- package/dist/lib/ui-provider/tokens.generated.d.ts +6 -4
- package/dist/lib/ui-provider/types.d.ts +17 -19
- package/dist/{mentions-BbsEHlcH.js → mentions-oeYNv_j1.js} +113 -111
- package/dist/navigation-BTX5Ti0Z.js +622 -0
- package/dist/navigation-WYKjDhZq.js +216 -0
- package/dist/overlay-C8RAgi2_.js +356 -0
- package/dist/{overlays-DvVoS3td.js → overlays-9BxwFTou.js} +77 -75
- package/dist/popover-CA7SP_iz.js +127 -0
- package/dist/popover-menu-DcLeiw9r.js +192 -0
- package/dist/{primitives-D0bdDozz.js → primitives-BskKlf35.js} +181 -178
- package/dist/primitives.js +1 -1
- package/dist/profiles/admin.json +6 -36
- package/dist/profiles/general.json +6 -96
- package/dist/repeaters-DfptvbGA.js +445 -0
- package/dist/rich-text-editor-D_Ppm8yh.js +491 -0
- package/dist/{sheet-CKcmRbJ9.js → sheet-D-DVZH_b.js} +3 -3
- package/dist/sidebar-DXQOy_Cb.js +421 -0
- package/dist/skeleton-CubvHel9.js +173 -0
- package/dist/spinner-Tc1QCnxM.js +30 -0
- package/dist/{structure-D0WGQAP3.js → structure-B9Y5NkP_.js} +15 -22
- package/dist/style.css +1 -1
- package/dist/styles/TOKENS.md +115 -275
- package/dist/styles/animation.css +114 -0
- package/dist/styles/base.css +7 -6
- package/dist/styles/fields.css +45 -63
- package/dist/styles/focus.css +12 -0
- package/dist/styles/forced-colors.css +11 -10
- package/dist/styles/index.css +23 -30
- package/dist/styles/map.css +45 -34
- package/dist/styles/mentions.css +14 -52
- package/dist/styles/overlays.css +7 -7
- package/dist/styles/tailwind.css +76 -127
- package/dist/styles/targets.css +3 -3
- package/dist/styles/theme/colour.css +86 -0
- package/dist/styles/theme/density.css +31 -0
- package/dist/styles/theme/elevation.css +9 -0
- package/dist/styles/theme/layout.css +18 -0
- package/dist/styles/theme/motion.css +18 -0
- package/dist/styles/theme/shape.css +12 -0
- package/dist/styles/theme/size.css +10 -0
- package/dist/styles/theme/spacing.css +11 -0
- package/dist/styles/theme/typography.css +20 -0
- package/dist/styles/tone.css +61 -0
- package/dist/table-DT_20ity.js +1262 -0
- package/dist/table-Ds_eO9av.js +191 -0
- package/dist/tailwind.css +76 -127
- package/dist/text-inputs-BboE77nZ.js +395 -0
- package/dist/theming-C5ygF5uf.js +292 -0
- package/dist/theming.js +2 -2
- package/dist/{timeline-BdaGRyj-.js → timeline-BRZbSdhf.js} +57 -49
- package/dist/{timelines-BB7550mz.js → timelines-DczZKW5p.js} +69 -67
- package/dist/{toaster-bBMgXm8z.js → toaster-CXL8L7Mm.js} +106 -99
- package/dist/tokens.json +1027 -636
- package/dist/toolbar-DBK-c4yy.js +74 -0
- package/dist/tooltip-BPYP-jUm.js +76 -0
- package/dist/{typography-BkxEiwQ1.js → typography-DmeR05Er.js} +87 -53
- package/dist/{ui-provider-Cmoq6i_D.js → ui-provider-DpzLUD12.js} +117 -69
- package/dist/ui-provider.js +1 -1
- package/dist/upload-C_6mlbfl.js +968 -0
- package/dist/use-async-preview-BFwf9ElY.js +188 -0
- package/dist/value-inputs-CnO6RZeT.js +728 -0
- package/docs/README.md +2 -2
- package/docs/build/recipes.md +10992 -10628
- package/docs/generated/component-index.json +11133 -11624
- package/docs/generated/components/INDEX.md +5 -5
- package/docs/generated/components/base--accordion.md +51 -2
- package/docs/generated/components/base--action-menu.md +14 -15
- package/docs/generated/components/base--alert-dialog.md +3 -4
- package/docs/generated/components/base--aspect-ratio.md +3 -4
- package/docs/generated/components/base--avatar.md +7 -7
- package/docs/generated/components/base--badge.md +159 -27
- package/docs/generated/components/base--batch-action-bar.md +6 -7
- package/docs/generated/components/base--buttons.md +151 -47
- package/docs/generated/components/base--cards.md +107 -14
- package/docs/generated/components/base--carousel.md +1 -2
- package/docs/generated/components/base--chart.md +44 -8
- package/docs/generated/components/base--choice-inputs.md +10 -11
- package/docs/generated/components/base--combobox.md +3 -4
- package/docs/generated/components/base--command.md +6 -6
- package/docs/generated/components/base--context-menu.md +1 -2
- package/docs/generated/components/base--copyable.md +6 -7
- package/docs/generated/components/base--date-pickers.md +6 -7
- package/docs/generated/components/base--dialog.md +6 -7
- package/docs/generated/components/base--direction.md +1 -1
- package/docs/generated/components/base--display.md +234 -54
- package/docs/generated/components/base--dropdown-menu.md +6 -7
- package/docs/generated/components/base--feedback.md +71 -18
- package/docs/generated/components/base--forms-numeric.md +6 -7
- package/docs/generated/components/base--forms.md +12 -13
- package/docs/generated/components/base--hover-card.md +3 -4
- package/docs/generated/components/base--input-group.md +27 -30
- package/docs/generated/components/base--item.md +8 -9
- package/docs/generated/components/base--label.md +2 -3
- package/docs/generated/components/base--menubar.md +2 -4
- package/docs/generated/components/base--navigation-menu.md +2 -3
- package/docs/generated/components/base--navigation.md +2 -3
- package/docs/generated/components/base--otp-input.md +3 -4
- package/docs/generated/components/base--overlay.md +56 -47
- package/docs/generated/components/base--popover-menu.md +7 -8
- package/docs/generated/components/base--popover.md +9 -10
- package/docs/generated/components/base--qr-code.md +7 -8
- package/docs/generated/components/base--repeaters.md +6 -7
- package/docs/generated/components/base--resizable.md +2 -3
- package/docs/generated/components/base--sheet.md +12 -13
- package/docs/generated/components/base--sidebar.md +9 -11
- package/docs/generated/components/base--skeleton.md +6 -7
- package/docs/generated/components/base--slot.md +1 -1
- package/docs/generated/components/base--spinner.md +5 -7
- package/docs/generated/components/base--structure.md +264 -65
- package/docs/generated/components/base--table.md +61 -3
- package/docs/generated/components/base--text-inputs.md +17 -18
- package/docs/generated/components/base--timeline.md +45 -4
- package/docs/generated/components/base--toaster.md +43 -12
- package/docs/generated/components/base--toggle.md +11 -12
- package/docs/generated/components/base--toolbar.md +7 -8
- package/docs/generated/components/base--tooltip.md +5 -6
- package/docs/generated/components/base--typography.md +279 -32
- package/docs/generated/components/base--upload.md +8 -9
- package/docs/generated/components/base--value-inputs.md +9 -38
- package/docs/generated/components/{admin--patterns--access.md → blocks--admin--access.md} +5 -6
- package/docs/generated/components/{admin--patterns--commerce.md → blocks--admin--commerce.md} +40 -41
- package/docs/generated/components/{patterns--analytics.md → blocks--analytics.md} +13 -14
- package/docs/generated/components/{patterns--onboarding.md → blocks--onboarding.md} +6 -7
- package/docs/generated/components/{patterns--timelines.md → blocks--timelines.md} +6 -7
- package/docs/generated/components/features--actions.md +8 -18
- package/docs/generated/components/features--activities.md +31 -32
- package/docs/generated/components/features--ai-chat.md +15 -15
- package/docs/generated/components/features--async-preview.md +5 -6
- package/docs/generated/components/features--combobox.md +4 -5
- package/docs/generated/components/features--comments.md +0 -1
- package/docs/generated/components/features--data-view.md +4 -5
- package/docs/generated/components/features--event-calendar.md +1 -2
- package/docs/generated/components/features--filters.md +1 -2
- package/docs/generated/components/features--global-search.md +1 -2
- package/docs/generated/components/features--kanban.md +1 -2
- package/docs/generated/components/features--map.md +1 -2
- package/docs/generated/components/features--media-library.md +37 -38
- package/docs/generated/components/features--mentions.md +7 -7
- package/docs/generated/components/features--overlays.md +21 -22
- package/docs/generated/components/features--products.md +10 -11
- package/docs/generated/components/features--resource-assignment.md +2 -3
- package/docs/generated/components/features--resource.md +3 -4
- package/docs/generated/components/features--rich-text-editor.md +4 -13
- package/docs/generated/components/features--schema-form.md +1 -2
- package/docs/generated/components/features--sync.md +2 -3
- package/docs/generated/components/features--table.md +162 -12
- package/docs/generated/components/features--theme-tweaker.md +30 -15
- package/docs/generated/components/forms.md +2 -2
- package/docs/generated/components/layout--app-shell.md +10 -11
- package/docs/generated/components/layout--auth.md +8 -9
- package/docs/generated/components/layout--containers.md +0 -1
- package/docs/generated/components/layout--header.md +2 -3
- package/docs/generated/components/layout--navigation.md +0 -1
- package/docs/generated/components/layout--page.md +3 -4
- package/docs/generated/components/layout--settings.md +0 -1
- package/docs/generated/components/layout--sidebar.md +6 -7
- package/docs/generated/components/layout--workspace.md +3 -4
- package/docs/generated/components/primitives.md +128 -17
- package/docs/generated/components/theming.md +147 -4
- package/docs/generated/components/ui-provider.md +95 -77
- package/docs/generated/imports.md +104 -104
- package/docs/generated/migration-broad-imports.json +267 -90
- package/docs/generated/migration-broad-imports.md +266 -101
- package/docs/generated/migration-codemod.json +365 -70
- package/docs/generated/migration.md +665 -95
- package/docs/generated/profiles.md +27 -27
- package/docs/generated/public-api.md +104 -102
- package/docs/generated/recipes.json +585 -810
- package/docs/learn/api-compatibility.md +3 -3
- package/docs/learn/composition.md +2 -18
- package/docs/learn/framework-wiring.md +8 -8
- package/docs/learn/installation.md +55 -27
- package/docs/learn/migration.md +136 -5
- package/docs/learn/provider-and-scoping.md +13 -19
- package/docs/learn/theming.md +170 -131
- package/docs/learn/troubleshooting.md +62 -27
- package/docs/learn/verification.md +2 -3
- package/package.json +39 -473
- package/scripts/consumer/codemod.mjs +51 -12
- package/scripts/consumer/find-component.mjs +2 -4
- package/src/styles/TOKENS.md +115 -275
- package/dist/accordion-6YPJ9XRO.js +0 -135
- package/dist/admin/patterns/access.css +0 -15
- package/dist/admin/patterns/commerce.css +0 -29
- package/dist/admin/patterns/commerce.js +0 -2493
- package/dist/avatar-CS7zow2q.js +0 -85
- package/dist/badge-CxOuTfVr.js +0 -63
- package/dist/base/accordion.css +0 -3
- package/dist/base/action-menu.css +0 -6
- package/dist/base/alert-dialog.css +0 -4
- package/dist/base/aspect-ratio.css +0 -2
- package/dist/base/avatar.css +0 -4
- package/dist/base/badge.css +0 -2
- package/dist/base/batch-action-bar.css +0 -5
- package/dist/base/buttons.css +0 -4
- package/dist/base/cards.css +0 -13
- package/dist/base/carousel.css +0 -5
- package/dist/base/chart.css +0 -2
- package/dist/base/choice-inputs.css +0 -10
- package/dist/base/combobox.css +0 -3
- package/dist/base/command.css +0 -9
- package/dist/base/context-menu.css +0 -2
- package/dist/base/copyable.css +0 -6
- package/dist/base/date-pickers.css +0 -11
- package/dist/base/dialog.css +0 -4
- package/dist/base/display.css +0 -8
- package/dist/base/dropdown-menu.css +0 -2
- package/dist/base/feedback.css +0 -5
- package/dist/base/forms-numeric.css +0 -12
- package/dist/base/forms.css +0 -14
- package/dist/base/hover-card.css +0 -2
- package/dist/base/input-group.css +0 -6
- package/dist/base/item.css +0 -9
- package/dist/base/label.css +0 -3
- package/dist/base/menubar.css +0 -2
- package/dist/base/navigation-menu.css +0 -2
- package/dist/base/navigation.css +0 -12
- package/dist/base/otp-input.css +0 -9
- package/dist/base/overlay.css +0 -4
- package/dist/base/popover-menu.css +0 -11
- package/dist/base/popover.css +0 -3
- package/dist/base/qr-code.css +0 -2
- package/dist/base/repeaters.css +0 -18
- package/dist/base/resizable.css +0 -2
- package/dist/base/sheet.css +0 -4
- package/dist/base/sidebar.css +0 -12
- package/dist/base/skeleton.css +0 -9
- package/dist/base/spinner.css +0 -2
- package/dist/base/structure.css +0 -2
- package/dist/base/table.css +0 -3
- package/dist/base/text-inputs.css +0 -2
- package/dist/base/timeline.css +0 -9
- package/dist/base/toaster.css +0 -2
- package/dist/base/toggle.css +0 -2
- package/dist/base/toolbar.css +0 -5
- package/dist/base/tooltip.css +0 -2
- package/dist/base/typography.css +0 -2
- package/dist/base/upload.css +0 -10
- package/dist/base/value-inputs.css +0 -14
- package/dist/buttons-CqXKWty3.js +0 -179
- package/dist/cards-C6Ulbkw7.js +0 -271
- package/dist/chart-nomhJ87z.js +0 -193
- package/dist/choice-inputs-OUDn0kQw.js +0 -680
- package/dist/combobox-C8oP92bT.js +0 -266
- package/dist/command-Bp3B6pUu.js +0 -143
- package/dist/comments-CAnDlyXO.js +0 -1438
- package/dist/components/admin/patterns/index.d.ts +0 -2
- package/dist/components/features/rich-text-editor/exec-command-engine.d.ts +0 -2
- package/dist/components/patterns/index.d.ts +0 -3
- package/dist/css/styles.css +0 -1
- package/dist/date-pickers-DOwIT-Nk.js +0 -661
- package/dist/display-B3Q17h5z.js +0 -645
- package/dist/dropdown-menu-TyNLCLML.js +0 -223
- package/dist/features/actions.css +0 -11
- package/dist/features/activities.css +0 -25
- package/dist/features/ai-chat.css +0 -14
- package/dist/features/async-preview.css +0 -10
- package/dist/features/combobox.css +0 -12
- package/dist/features/comments.css +0 -24
- package/dist/features/data-view.css +0 -31
- package/dist/features/event-calendar.css +0 -17
- package/dist/features/filters.css +0 -24
- package/dist/features/global-search.css +0 -19
- package/dist/features/kanban.css +0 -7
- package/dist/features/map.css +0 -15
- package/dist/features/media-library.css +0 -27
- package/dist/features/mentions.css +0 -17
- package/dist/features/overlays.css +0 -11
- package/dist/features/products.css +0 -29
- package/dist/features/resource-assignment.css +0 -14
- package/dist/features/resource.css +0 -15
- package/dist/features/rich-text-editor.css +0 -8
- package/dist/features/schema-form.css +0 -22
- package/dist/features/sync.css +0 -11
- package/dist/features/table.css +0 -20
- package/dist/features/theme-tweaker.css +0 -27
- package/dist/feedback-DRerHGuV.js +0 -469
- package/dist/forms-CPrGGif_.js +0 -242
- package/dist/forms-numeric-CPVsL7Vf.js +0 -569
- package/dist/index.css +0 -3
- package/dist/input-group-BYe0rhoB.js +0 -126
- package/dist/item-B3yQ26as.js +0 -146
- package/dist/layout/app-shell.css +0 -13
- package/dist/layout/auth.css +0 -14
- package/dist/layout/containers.css +0 -2
- package/dist/layout/header.css +0 -20
- package/dist/layout/navigation.css +0 -11
- package/dist/layout/page.css +0 -15
- package/dist/layout/settings.css +0 -16
- package/dist/layout/sidebar.css +0 -16
- package/dist/layout/workspace.css +0 -15
- package/dist/navigation-CsqTA16F.js +0 -614
- package/dist/navigation-DzxzPuwg.js +0 -202
- package/dist/overlay-WQOsLd69.js +0 -345
- package/dist/patterns/analytics.css +0 -15
- package/dist/patterns/onboarding.css +0 -11
- package/dist/patterns/timelines.css +0 -11
- package/dist/popover-DriLnIFc.js +0 -123
- package/dist/popover-menu-C2UCMAe7.js +0 -189
- package/dist/primitives.css +0 -3
- package/dist/repeaters-DuP1N0nw.js +0 -438
- package/dist/rich-text-editor-BQXFe9oN.js +0 -595
- package/dist/sidebar-D0N6ckJL.js +0 -412
- package/dist/skeleton-DGR9df28.js +0 -172
- package/dist/spinner-CUAVFecI.js +0 -52
- package/dist/styles/FACTORS.md +0 -36
- package/dist/styles/SCOPES.md +0 -86
- package/dist/styles/themes/default.css +0 -164
- package/dist/styles/theming/animation.css +0 -143
- package/dist/styles/theming/colors.css +0 -97
- package/dist/styles/theming/feedback.css +0 -17
- package/dist/styles/theming/field.css +0 -21
- package/dist/styles/theming/focus.css +0 -88
- package/dist/styles/theming/layers.css +0 -13
- package/dist/styles/theming/layout.css +0 -21
- package/dist/styles/theming/motion.css +0 -42
- package/dist/styles/theming/overlay.css +0 -52
- package/dist/styles/theming/sizing.css +0 -118
- package/dist/styles/theming/text.css +0 -30
- package/dist/styles/theming/typography.css +0 -26
- package/dist/styles/tokens/components.css +0 -22
- package/dist/styles/tokens/foundation.css +0 -80
- package/dist/styles/tokens/layout.css +0 -19
- package/dist/styles/tokens/palette.css +0 -88
- package/dist/styles/tokens/primitives.css +0 -18
- package/dist/styles/tokens/states.css +0 -77
- package/dist/table-BC4qqsUb.js +0 -180
- package/dist/table-BHDpjajL.js +0 -982
- package/dist/text-inputs-DF_lD7pA.js +0 -385
- package/dist/theming-D6KRU7hO.js +0 -104
- package/dist/toolbar-DWRywF0R.js +0 -68
- package/dist/tooltip-t1VQQ2tZ.js +0 -73
- package/dist/upload-B38YZeFJ.js +0 -938
- package/dist/value-inputs-Q4ymjXlV.js +0 -716
- package/src/styles/FACTORS.md +0 -36
- package/src/styles/SCOPES.md +0 -86
- /package/dist/components/{admin/patterns → blocks/admin}/access/admin.strings.d.ts +0 -0
- /package/dist/components/{admin/patterns → blocks/admin}/access/credential-list.d.ts +0 -0
- /package/dist/components/{admin/patterns → blocks/admin}/access/index.d.ts +0 -0
- /package/dist/components/{admin/patterns → blocks/admin}/access/role-permissions.d.ts +0 -0
- /package/dist/components/{admin/patterns → blocks/admin}/access/sensitive-action.d.ts +0 -0
- /package/dist/components/{admin/patterns → blocks/admin}/commerce/account.d.ts +0 -0
- /package/dist/components/{admin/patterns → blocks/admin}/commerce/address-lines.d.ts +0 -0
- /package/dist/components/{admin/patterns → blocks/admin}/commerce/booking.d.ts +0 -0
- /package/dist/components/{admin/patterns → blocks/admin}/commerce/cart.d.ts +0 -0
- /package/dist/components/{admin/patterns → blocks/admin}/commerce/commerce.strings.d.ts +0 -0
- /package/dist/components/{admin/patterns → blocks/admin}/commerce/commerce.types.d.ts +0 -0
- /package/dist/components/{admin/patterns → blocks/admin}/commerce/format-amount.d.ts +0 -0
- /package/dist/components/{admin/patterns → blocks/admin}/commerce/index.d.ts +0 -0
- /package/dist/components/{admin/patterns → blocks/admin}/commerce/inventory-section.d.ts +0 -0
- /package/dist/components/{admin/patterns → blocks/admin}/commerce/invoice.d.ts +0 -0
- /package/dist/components/{admin/patterns → blocks/admin}/commerce/loyalty.d.ts +0 -0
- /package/dist/components/{admin/patterns → blocks/admin}/commerce/order-customer.d.ts +0 -0
- /package/dist/components/{admin/patterns → blocks/admin}/commerce/order-detail.d.ts +0 -0
- /package/dist/components/{admin/patterns → blocks/admin}/commerce/order-line-item.d.ts +0 -0
- /package/dist/components/{admin/patterns → blocks/admin}/commerce/order-transactions.d.ts +0 -0
- /package/dist/components/{admin/patterns → blocks/admin}/commerce/order.d.ts +0 -0
- /package/dist/components/{admin/patterns → blocks/admin}/commerce/seo-listing.d.ts +0 -0
- /package/dist/components/{admin/patterns → blocks/admin}/commerce/seo-score.d.ts +0 -0
- /package/dist/components/{admin/patterns → blocks/admin}/commerce/summary-panel.d.ts +0 -0
- /package/dist/components/{patterns → blocks}/analytics/activity-heatmap.d.ts +0 -0
- /package/dist/components/{patterns → blocks}/analytics/analytics.types.d.ts +0 -0
- /package/dist/components/{patterns → blocks}/analytics/chart-card.d.ts +0 -0
- /package/dist/components/{patterns → blocks}/analytics/format-metric-value.d.ts +0 -0
- /package/dist/components/{patterns → blocks}/analytics/index.d.ts +0 -0
- /package/dist/components/{patterns → blocks}/analytics/metric-bar.d.ts +0 -0
- /package/dist/components/{patterns → blocks}/analytics/metric-comparison.d.ts +0 -0
- /package/dist/components/{patterns → blocks}/analytics/metric-gradient.d.ts +0 -0
- /package/dist/components/{patterns → blocks}/analytics/metric-grid.d.ts +0 -0
- /package/dist/components/{patterns → blocks}/analytics/metric-micro-grid.d.ts +0 -0
- /package/dist/components/{patterns → blocks}/analytics/metric-skeleton.d.ts +0 -0
- /package/dist/components/{patterns → blocks}/analytics/metric-trend-chip.d.ts +0 -0
- /package/dist/components/{patterns → blocks}/analytics/metric.d.ts +0 -0
- /package/dist/components/{patterns → blocks}/analytics/time-ruler.d.ts +0 -0
- /package/dist/components/{patterns → blocks}/onboarding/checklist.d.ts +0 -0
- /package/dist/components/{patterns → blocks}/onboarding/index.d.ts +0 -0
- /package/dist/components/{patterns → blocks}/onboarding/onboarding.strings.d.ts +0 -0
- /package/dist/components/{patterns → blocks}/timelines/changelog-timeline.d.ts +0 -0
- /package/dist/components/{patterns → blocks}/timelines/index.d.ts +0 -0
- /package/dist/components/{patterns → blocks}/timelines/milestones-timeline.d.ts +0 -0
- /package/dist/components/{patterns → blocks}/timelines/steps.d.ts +0 -0
- /package/dist/components/{patterns → blocks}/timelines/timelines.strings.d.ts +0 -0
- /package/dist/styles/{theming/breakpoints.css → breakpoints.css} +0 -0
|
@@ -1,146 +1,188 @@
|
|
|
1
1
|
# Theming
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
Component tokens are not the theming surface: most are a `var()` off the contract, and the
|
|
9
|
-
rest is geometry no theme would touch. Override one only where a module reference names it
|
|
10
|
-
as an extension point.
|
|
3
|
+
The theme is about eighty variables, declared once at `:root` in `src/styles/theme/`. Each
|
|
4
|
+
colour holds both modes as `light-dark(light, dark)`, and every length, shadow, tint and
|
|
5
|
+
duration comes as a pair. Components derive everything else where they use it, so a value
|
|
6
|
+
you set anywhere reaches every component below it. `src/styles/TOKENS.md` (`node_modules/themelia-ui/src/styles/TOKENS.md`)
|
|
7
|
+
names the variable for each role.
|
|
11
8
|
|
|
12
9
|
## Setting a theme
|
|
13
10
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
A **raw input** (`--radius`, `--radius-sm`, a font stack, a palette step, a scale factor) is
|
|
17
|
-
declared once at `:root` and inherits everywhere. The semantic colours resolve through the
|
|
18
|
-
palette (`--primary` is `--brand-600` in light and `--brand-350` in dark), so a rebrand that
|
|
19
|
-
sets palette steps reaches every scope:
|
|
11
|
+
Set the variables you change on `:root`. A colour takes a `light-dark()` pair, or one value
|
|
12
|
+
for both modes:
|
|
20
13
|
|
|
21
14
|
```css
|
|
22
15
|
:root {
|
|
23
|
-
--
|
|
24
|
-
--
|
|
25
|
-
--radius:
|
|
26
|
-
--radius-sm: 0.
|
|
16
|
+
--primary: light-dark(oklch(0.55 0.19 250), oklch(0.72 0.14 250));
|
|
17
|
+
--primary-foreground: light-dark(oklch(0.985 0 0), oklch(0.2 0.03 250));
|
|
18
|
+
--radius: 0.75rem;
|
|
19
|
+
--radius-sm: 0.375rem;
|
|
20
|
+
--font-sans: "Your interface font", sans-serif;
|
|
27
21
|
}
|
|
28
22
|
```
|
|
29
23
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
`<body>`:
|
|
24
|
+
That one block reaches every region, including popups portalled to `<body>` and a dark
|
|
25
|
+
region inside a light page: nothing below `:root` declares a colour again.
|
|
26
|
+
|
|
27
|
+
The same values work on any element, for a region of their own:
|
|
35
28
|
|
|
36
29
|
```css
|
|
37
|
-
|
|
38
|
-
--primary: oklch(0.
|
|
30
|
+
.marketing {
|
|
31
|
+
--primary: oklch(0.6 0.2 30);
|
|
39
32
|
}
|
|
40
33
|
```
|
|
41
34
|
|
|
42
|
-
|
|
43
|
-
|
|
35
|
+
A provider takes them as config and writes them on its own element:
|
|
36
|
+
|
|
37
|
+
```tsx fragment — shape only, not a program
|
|
38
|
+
<UIProvider config={{ theme: { colors: { primary: "light-dark(#2563eb, #60a5fa)" } } }}>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Colours passed this way reach the provider's subtree. A popup portalled to `<body>` leaves
|
|
42
|
+
that subtree; render it into the provider with `UIPortalHost` (see
|
|
43
|
+
[Provider and scoping](provider-and-scoping.md#portals-and-scopes)), or set the value on
|
|
44
|
+
`:root` instead.
|
|
44
45
|
|
|
45
|
-
|
|
46
|
+
## Ready-made themes
|
|
47
|
+
|
|
48
|
+
Four themes ship with the kit, each a style rather than a colour: Soft (large corners,
|
|
49
|
+
diffuse shadows, comfortable spacing), Sharp (square corners, hairlines, no shadows), Dense
|
|
50
|
+
(compact spacing and small corners, for data) and Editorial (serif headings on warm paper, a
|
|
51
|
+
step larger type). Each is a `ThemePreset`: a `label`, a `description`, and the provider
|
|
52
|
+
`config` it sets. That config reaches past colour to radii, shadows and border weight, density,
|
|
53
|
+
typography, motion and component defaults, such as the card surface. Every theme's colours
|
|
54
|
+
hold WCAG AA contrast in both modes, as the kit's own do.
|
|
46
55
|
|
|
47
56
|
```tsx fragment — shape only, not a program
|
|
48
|
-
|
|
57
|
+
import { themes } from "themelia-ui/theming"
|
|
58
|
+
|
|
59
|
+
<UIProvider config={themes.sharp.config}>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Switching themes is handing the provider another theme's config. Keep the choice in state,
|
|
63
|
+
and wrap the application in `UIPortalHost`, so menus and popovers, which portal to `<body>`,
|
|
64
|
+
take the theme too:
|
|
65
|
+
|
|
66
|
+
```tsx fragment — shape only, not a program
|
|
67
|
+
const [name, setName] = useState<ThemeName>("soft")
|
|
68
|
+
|
|
69
|
+
<UIProvider config={themes[name].config}>
|
|
70
|
+
<UIPortalHost>
|
|
71
|
+
<App onThemeChange={setName} />
|
|
72
|
+
</UIPortalHost>
|
|
73
|
+
</UIProvider>
|
|
49
74
|
```
|
|
50
75
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
portalled outside the provider never see them. `theme.palette` reaches every boundary inside
|
|
54
|
-
the provider, because each one derives its colours from the palette.
|
|
76
|
+
A nested provider themes one region the same way. Settings of your own go beside a theme's:
|
|
77
|
+
`config={{ ...themes.dense.config, formatting: { locale: "de-DE" } }}`.
|
|
55
78
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
79
|
+
A theme of your own is the same shape. Start from one of these and change what you need:
|
|
80
|
+
|
|
81
|
+
```tsx fragment — shape only, not a program
|
|
82
|
+
const brand: ThemePreset = {
|
|
83
|
+
label: "Brand",
|
|
84
|
+
description: "Our product's look.",
|
|
85
|
+
config: {
|
|
86
|
+
...themes.sharp.config,
|
|
87
|
+
density: "comfortable",
|
|
88
|
+
theme: {
|
|
89
|
+
...themes.sharp.config.theme,
|
|
90
|
+
colors: {
|
|
91
|
+
...themes.sharp.config.theme?.colors,
|
|
92
|
+
primary: "light-dark(oklch(0.5 0.19 15), oklch(0.76 0.13 15))",
|
|
93
|
+
"primary-foreground": "light-dark(oklch(0.985 0 0), oklch(0.2 0.05 15))",
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
A square theme should set `defaults.card.surface` to `"card"`: the default `framed` surface is
|
|
101
|
+
a band that follows the corner, and with no corner to follow it reads as a box in a box. Write
|
|
102
|
+
a zero radius as `0px`: the kit subtracts lengths from the radii, and `calc()` cannot subtract
|
|
103
|
+
a length from a bare `0`. Write no shadow as `0 0 transparent`, not `none`: a popup lists
|
|
104
|
+
`--shadow-lg` after its hairline, and `none` cannot stand in a list, so the popup would lose
|
|
105
|
+
its edge.
|
|
106
|
+
|
|
107
|
+
To edit a theme's colours and variables visually, load them into the theme editor with
|
|
108
|
+
`themeFromConfig(themes.soft.config.theme)` from `themelia-ui/features/theme-tweaker`; the
|
|
109
|
+
editor exports the result as CSS or provider config.
|
|
60
110
|
|
|
61
111
|
## Start with the shared controls
|
|
62
112
|
|
|
63
|
-
Most
|
|
64
|
-
family and the two radii. They follow a component's role rather than its name:
|
|
113
|
+
Most adjustments need only these, and they follow a component's role rather than its name:
|
|
65
114
|
|
|
66
115
|
```css
|
|
67
116
|
:root {
|
|
68
|
-
--
|
|
69
|
-
--
|
|
70
|
-
--
|
|
71
|
-
--
|
|
72
|
-
--
|
|
73
|
-
--radius: 0.75rem;
|
|
74
|
-
--radius-sm: 0.375rem;
|
|
117
|
+
--padding: 1.25rem; /* container insets: cards, dialogs, sheets, popovers */
|
|
118
|
+
--padding-sm: 0.625rem; /* item insets: rows, cells, chips, fields */
|
|
119
|
+
--gap: 1.25rem; /* between groups: fields, cards, sections */
|
|
120
|
+
--gap-sm: 0.625rem; /* inside a group: icon and label, title and description */
|
|
121
|
+
--control-height: 2.25rem;
|
|
122
|
+
--radius: 0.75rem; /* containers */
|
|
123
|
+
--radius-sm: 0.375rem; /* what sits inside them; nothing derives one from the other */
|
|
75
124
|
}
|
|
76
125
|
```
|
|
77
126
|
|
|
78
|
-
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
- Dark mode inherits the chosen fonts.
|
|
127
|
+
- A nested corner is the container's radius less its inset, computed where it is used, so
|
|
128
|
+
menus and option lists keep their rows concentric at any radius.
|
|
129
|
+
- A density preset sets the four lengths and the two control heights on its region (see
|
|
130
|
+
[Scale and density](#scale-and-density)); a value you set on `:root` applies where no preset
|
|
131
|
+
is in effect.
|
|
84
132
|
|
|
85
133
|
**Fonts.** The kit ships Geist for text and Geist Mono for code and identifiers (SIL OFL 1.1),
|
|
86
134
|
as variable-weight woff2 files beside `core.css`, one per script. A browser downloads a file
|
|
87
135
|
only when text in that script renders in that family, so a theme that sets `--font-sans` and
|
|
88
|
-
`--font-mono` to its own fonts downloads none of them.
|
|
136
|
+
`--font-mono` to its own fonts downloads none of them. `--font-heading` is unset by default,
|
|
137
|
+
and headings fall back to the interface font.
|
|
89
138
|
|
|
90
139
|
Compose title and description regions with CardHeader, ContentBlock or OverlayHeader, action
|
|
91
140
|
regions with CardFooter or OverlayFooter, and label/value facts with MetadataList. These
|
|
92
141
|
components own their spacing, so the application does not reproduce it.
|
|
93
|
-
`--content-block-p` and `--overlay-region-p` override one surface's inset locally; leave them
|
|
94
|
-
unset so the surface follows the theme.
|
|
95
142
|
|
|
96
|
-
## Scale
|
|
143
|
+
## Scale and density
|
|
97
144
|
|
|
98
|
-
|
|
145
|
+
Controls take two sizes, `default` and `sm`. A denser or roomier region is a scope instead,
|
|
146
|
+
so everything inside it moves together:
|
|
99
147
|
|
|
100
|
-
|
|
|
101
|
-
|
|
102
|
-
|
|
|
103
|
-
|
|
|
104
|
-
|
|
|
148
|
+
| Setting | Moves |
|
|
149
|
+
| --- | --- |
|
|
150
|
+
| `density` | the four lengths and the two control heights; type keeps its size |
|
|
151
|
+
| `scale` | the same, the two icon sizes, and type |
|
|
152
|
+
| `typography.scale` | type alone, through `--text-scale` |
|
|
105
153
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
change spacing, control heights and row rhythm without resizing readable type. Controls are
|
|
112
|
-
34, 30 and 24px at the default and 32, 28 and 23px under `compact`. Use `scale` when the
|
|
113
|
-
whole scoped UI should move together.
|
|
154
|
+
```tsx fragment — shape only, not a program
|
|
155
|
+
<UIProvider config={{ density: "compact" }}>
|
|
156
|
+
<UIProvider config={{ scale: 1.125 }}>
|
|
157
|
+
<UIProvider config={{ typography: { scale: 0.875 } }}>
|
|
158
|
+
```
|
|
114
159
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
160
|
+
The provider computes `scale` in JavaScript and writes the lengths themselves, rounded to
|
|
161
|
+
whole pixels, so no length is multiplied twice. A density preset also works without a
|
|
162
|
+
provider: any element can carry `data-density="compact"` or `"comfortable"`.
|
|
118
163
|
|
|
119
|
-
A
|
|
120
|
-
|
|
164
|
+
A preset sets its lengths on the region. To change a length under one preset, set it for
|
|
165
|
+
that preset: `[data-density="compact"] { --padding: 0.625rem; }`.
|
|
121
166
|
|
|
122
167
|
## Dark mode
|
|
123
168
|
|
|
124
|
-
|
|
125
|
-
`
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
A bare boundary under an explicit dark ancestor (a `Scope`, a `data-density` region, or a
|
|
131
|
-
nested provider on the default `system` scheme) resolves the dark values. An explicit light
|
|
132
|
-
island inside a dark tree keeps its own boundary light, but a bare boundary inside that
|
|
133
|
-
island resolves dark again; give it its own `data-theme`, or use `UIScope`, which writes the
|
|
134
|
-
resolved scheme on each boundary it renders.
|
|
169
|
+
Colours switch through `color-scheme`, which the kit sets from three signals: a `.dark` or
|
|
170
|
+
`.light` class, `data-theme="dark"` or `"light"`, and, with neither, the operating system's
|
|
171
|
+
preference. Each colour's `light-dark()` pair resolves on the element that paints it, so a
|
|
172
|
+
dark region inside a light page needs only `data-theme="dark"` (or a nested provider with
|
|
173
|
+
`colorScheme: "dark"`) on its container, and a light island inside a dark page the same.
|
|
135
174
|
|
|
136
|
-
|
|
137
|
-
|
|
175
|
+
A value of your own switches the same way: write `light-dark()` in the value, never a rule
|
|
176
|
+
under `.dark` or `@media (prefers-color-scheme: dark)`, which would miss a dark region inside
|
|
177
|
+
a light page.
|
|
138
178
|
|
|
139
179
|
## Editing a theme at runtime
|
|
140
180
|
|
|
141
181
|
`ThemeTweaker` (`themelia-ui/features/theme-tweaker`) lets people change appearance, accent
|
|
142
182
|
colour, density, corners and font while the app runs, and exports CSS theme values and
|
|
143
183
|
provider configuration separately. Mount it as a floating button, a full-page route, or both.
|
|
184
|
+
The exported stylesheet is one `:root` block in which each colour it changed is a
|
|
185
|
+
`light-dark()` pair.
|
|
144
186
|
|
|
145
187
|
The application owns the theme and provider state, above its router:
|
|
146
188
|
|
|
@@ -155,7 +197,6 @@ import { UIProvider, type UIConfig } from "themelia-ui/ui-provider"
|
|
|
155
197
|
import {
|
|
156
198
|
ThemeTweaker, createTheme, themeToStyle, useAppliedTheme, type ThemeDefinition,
|
|
157
199
|
} from "themelia-ui/features/theme-tweaker"
|
|
158
|
-
import "themelia-ui/features/theme-tweaker.css"
|
|
159
200
|
|
|
160
201
|
export function ThemedApp({ children }: { children: ReactNode }) {
|
|
161
202
|
const [theme, setTheme] = useState<ThemeDefinition>(() => createTheme())
|
|
@@ -195,10 +236,11 @@ const overrides = deriveThemePalette({ primary: "#3b82f6" })
|
|
|
195
236
|
// { "--primary": "#3b82f6", "--primary-foreground": "oklch(0.18 0.01 260)", … }
|
|
196
237
|
```
|
|
197
238
|
|
|
198
|
-
The keys are
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
239
|
+
The keys are theme variables, so write them on `:root` or pass them to a `Scope`'s `vars`.
|
|
240
|
+
The derived values stay CSS (`color-mix(in oklch, var(--primary) 10%, var(--background))`
|
|
241
|
+
rather than a computed literal), so they keep following the variables they derive from.
|
|
242
|
+
Derive one set for each mode and pair them, as the ThemeTweaker does, when the two should
|
|
243
|
+
differ.
|
|
202
244
|
|
|
203
245
|
`readableForeground(background)` **measures** WCAG contrast against both candidates and
|
|
204
246
|
returns the better one, with the ratio and whether it clears AA:
|
|
@@ -215,64 +257,61 @@ Both functions are also re-exported from `features/theme-tweaker`.
|
|
|
215
257
|
|
|
216
258
|
## Design tokens (DTCG)
|
|
217
259
|
|
|
218
|
-
`themelia-ui/tokens.json` is the
|
|
219
|
-
|
|
260
|
+
`themelia-ui/tokens.json` is the theme in [W3C DTCG][dtcg] format, for Figma and tools like
|
|
261
|
+
Style Dictionary. Each colour is a token in `theme.light` and one in `theme.dark`; every other
|
|
262
|
+
variable is written once in `theme.light` and aliased from `theme.dark`. Colours are OKLCH
|
|
263
|
+
objects with a `hex` fallback:
|
|
220
264
|
|
|
221
265
|
```json
|
|
222
266
|
{ "$value": { "colorSpace": "oklch", "components": [0.45, 0.124, 167.35], "hex": "#006a47" } }
|
|
223
267
|
```
|
|
224
268
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
other tokens; DTCG has no type for a mix, and resolving one would bake one theme's value in.
|
|
229
|
-
- **Shadows.** Each is a multi-layer shadow whose colour is a `color-mix()`; resolving it
|
|
230
|
-
would bake one theme's ink in.
|
|
269
|
+
Shadows, durations, the easing curve and the font stacks carry their DTCG types. The two tint
|
|
270
|
+
strengths are percentages, which DTCG cannot express, and the unset font roles have no value;
|
|
271
|
+
the file lists them under its `$extensions`.
|
|
231
272
|
|
|
232
273
|
[dtcg]: https://www.designtokens.org/TR/drafts/format/
|
|
233
274
|
|
|
234
275
|
## Tailwind CSS v4
|
|
235
276
|
|
|
236
277
|
The kit ships no Tailwind and needs none. If your application already uses Tailwind v4,
|
|
237
|
-
import the bridge after Tailwind
|
|
238
|
-
this contract:
|
|
278
|
+
import the bridge after Tailwind, and its utilities resolve against the theme:
|
|
239
279
|
|
|
240
280
|
```css
|
|
241
281
|
@import "tailwindcss";
|
|
242
|
-
@import "themelia-ui/core.css";
|
|
243
282
|
@import "themelia-ui/tailwind.css";
|
|
244
283
|
```
|
|
245
284
|
|
|
246
|
-
|
|
247
|
-
`
|
|
248
|
-
|
|
249
|
-
`
|
|
250
|
-
|
|
251
|
-
`
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
285
|
+
The kit's own CSS arrives with its components. Do not `@import` `themelia-ui/style.css` or
|
|
286
|
+
`themelia-ui/core.css` here as well: that inlines a second copy.
|
|
287
|
+
|
|
288
|
+
`bg-primary` is `var(--primary)`, `rounded` is the container radius and `rounded-sm` the
|
|
289
|
+
item radius, `p-padding` and `gap-gap-sm` are the kit's lengths, and `text-sm` is
|
|
290
|
+
`calc(0.875rem * var(--text-scale))`, which follows the type factor as Text does. Every
|
|
291
|
+
utility reads the variable **at the element**, so a dark region, a `[data-density="compact"]`
|
|
292
|
+
scope, a nested `UIProvider` and a provider's `theme.radiusSm` or `typography.fonts` all move
|
|
293
|
+
Tailwind's output the way they move the kit's own.
|
|
294
|
+
|
|
295
|
+
**Import the bridge even if you never write a kit utility.** Both projects descend from
|
|
296
|
+
shadcn, so custom-property names collide: `--radius`, `--radius-sm`, `--shadow`,
|
|
297
|
+
`--shadow-lg`, `--text-xs` through `--text-2xl` and the font stacks. Tailwind emits its
|
|
298
|
+
defaults onto `:root` inside `@layer theme`, and depending on the order your application
|
|
299
|
+
imports its CSS, that layer can sit above the kit's `tokens` layer. Without the bridge,
|
|
300
|
+
Tailwind can win every shared name:
|
|
262
301
|
|
|
263
302
|
| what | kit | Tailwind takes it to |
|
|
264
303
|
| --- | --- | --- |
|
|
265
|
-
| `--radius-sm` | `0.5rem`, the kit's
|
|
266
|
-
| `--
|
|
304
|
+
| `--radius-sm` | `0.5rem`, the kit's item radius | `0.25rem` |
|
|
305
|
+
| `--shadow-lg` | the kit's floating shadow | Tailwind's `shadow-lg` |
|
|
267
306
|
| `--font-sans` | Geist first | Tailwind's system stack |
|
|
268
|
-
| `--animate-pulse` | `pulse 2s var(--ease-in-out) infinite` | `pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite` |
|
|
269
307
|
|
|
270
|
-
The symptom is a slightly wrong radius
|
|
271
|
-
|
|
272
|
-
|
|
308
|
+
The symptom is a slightly wrong radius or shadow, not an error. The bridge restates those
|
|
309
|
+
names with the kit's own values, so Tailwind's override becomes a no-op in either order. It is
|
|
310
|
+
generated from the theme. The kit declares nothing in Tailwind's `--animate-*` namespace, so
|
|
311
|
+
`animate-spin` and its neighbours stay Tailwind's own.
|
|
273
312
|
|
|
274
|
-
The bridge is
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
literals (the
|
|
278
|
-
|
|
313
|
+
The bridge is theme declarations and nothing else: no rules and no utilities, and Tailwind
|
|
314
|
+
drops every key no utility uses, so it costs nothing you do not use. Keys that read a kit
|
|
315
|
+
variable or a formula are `@theme inline`, so they resolve at the element; the restated
|
|
316
|
+
literals (the radii, shadows and font stacks) are a plain `@theme`, so their utilities read
|
|
317
|
+
the variable and follow a theme that moves it.
|
|
@@ -2,9 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
## A component is unstyled
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
A component brings its own CSS in a bundler. When it arrives unstyled:
|
|
6
|
+
|
|
7
|
+
- **Server rendering with Vite** (Astro, React Router, TanStack Start, Vike): add
|
|
8
|
+
`themelia-ui`, and any installed package that imports it, to `ssr.noExternal`. See
|
|
9
|
+
[Server rendering with Vite](installation.md#server-rendering-with-vite).
|
|
10
|
+
- **Parcel:** set `"@parcel/resolver-default": { "packageExports": true }`.
|
|
11
|
+
- **Custom resolve conditions:** a bundler config that sets its own conditions replaces the
|
|
12
|
+
defaults, and the kit's CSS resolves only under `module`. Keep it: in Vite 6 or later,
|
|
13
|
+
spread `defaultClientConditions` into `resolve.conditions` and `defaultServerConditions`
|
|
14
|
+
into `ssr.resolve.conditions` (both exported from `vite`); in esbuild, add `module` to
|
|
15
|
+
`conditions`.
|
|
16
|
+
- **No bundler:** link `style.css`. See
|
|
17
|
+
[Loading the CSS](installation.md#loading-the-css).
|
|
8
18
|
|
|
9
19
|
Overrides need no `!important` or selector escalation: the kit's rules are layered, and
|
|
10
20
|
unlayered application CSS beats them.
|
|
@@ -12,15 +22,36 @@ unlayered application CSS beats them.
|
|
|
12
22
|
## Node throws on a `.css` import
|
|
13
23
|
|
|
14
24
|
`ERR_UNKNOWN_FILE_EXTENSION` for a `.css` file means Node is running one of your own modules
|
|
15
|
-
that imports a stylesheet, without a bundler. The kit's
|
|
16
|
-
stylesheets where your bundler or framework processes CSS, or map
|
|
17
|
-
test runner that runs your modules directly.
|
|
25
|
+
that imports a stylesheet, without a bundler. The kit's own CSS imports resolve to an empty
|
|
26
|
+
module in Node. Import your stylesheets where your bundler or framework processes CSS, or map
|
|
27
|
+
`\.css$` to a stub in a test runner that runs your modules directly.
|
|
18
28
|
|
|
19
29
|
## Jest: `Cannot use import statement outside a module`
|
|
20
30
|
|
|
21
31
|
The package is ES modules, and Jest transforms nothing in `node_modules` by default. Exempt
|
|
22
32
|
the package in `transformIgnorePatterns`. See [In Node](installation.md#in-node).
|
|
23
33
|
|
|
34
|
+
## Jest: `Cannot find module '#core.css'`
|
|
35
|
+
|
|
36
|
+
Jest resolves the package's `imports` map from 29.4 onwards. Upgrade Jest.
|
|
37
|
+
|
|
38
|
+
## A build fails on a `.css` file
|
|
39
|
+
|
|
40
|
+
A bundler that resolves the package's `module` condition bundles its CSS as well. A server
|
|
41
|
+
build with no CSS handling, such as a webpack or Rollup config without a CSS loader, fails on
|
|
42
|
+
it. Leave the package external in that build, so Node loads it with no CSS, or add a loader
|
|
43
|
+
that ignores `.css`. A client build needs a CSS loader too; with one in place, remove any
|
|
44
|
+
`<link>` to a kit stylesheet, since the CSS now arrives with the components.
|
|
45
|
+
|
|
46
|
+
## The kit's CSS loads twice
|
|
47
|
+
|
|
48
|
+
Components bring their own CSS, so an application that also imports `themelia-ui/style.css`
|
|
49
|
+
or a module stylesheet from JavaScript, or `@import`s one into its own CSS, ships the same
|
|
50
|
+
rules twice. Remove those imports: the upgrade codemod removes the JavaScript ones and lists
|
|
51
|
+
the rest. A JavaScript import of `themelia-ui/core.css` is harmless, since bundlers keep one
|
|
52
|
+
copy. A page whose JavaScript is bundled that also links a kit stylesheet with an HTML
|
|
53
|
+
`<link>` loads it twice as well; remove the `<link>`.
|
|
54
|
+
|
|
24
55
|
## A subpath does not resolve
|
|
25
56
|
|
|
26
57
|
There are no tier barrels such as `themelia-ui/base`. Use the generated
|
|
@@ -30,7 +61,10 @@ There are no tier barrels such as `themelia-ui/base`. Use the generated
|
|
|
30
61
|
node node_modules/themelia-ui/scripts/consumer/find-component.mjs "what the UI must do"
|
|
31
62
|
```
|
|
32
63
|
|
|
33
|
-
Import the returned
|
|
64
|
+
Import the returned module path; in a bundled app its CSS comes with it.
|
|
65
|
+
|
|
66
|
+
Parcel reads a package's `exports` only with `"@parcel/resolver-default": { "packageExports":
|
|
67
|
+
true }` in the application's `package.json`.
|
|
34
68
|
|
|
35
69
|
## An optional peer is missing
|
|
36
70
|
|
|
@@ -40,23 +74,20 @@ listed there, report it as a package containment defect.
|
|
|
40
74
|
|
|
41
75
|
## A theme or density override does not apply
|
|
42
76
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
(`theme.palette`), which each nested boundary derives its colours from.
|
|
58
|
-
- **A plain element** that is not a boundary sets the variable, and nothing re-derives from
|
|
59
|
-
it: the derived values were resolved above it. Wrap the region in `Scope`.
|
|
77
|
+
Every theme variable is declared once, at `:root`, and inherits from wherever you set it. When
|
|
78
|
+
an override does not show:
|
|
79
|
+
|
|
80
|
+
- **Is it the theme's name?** A 3.0 name such as `--space-md`, `--control-h` or
|
|
81
|
+
`--primary-10` is gone; the codemod renames or reports each one, and
|
|
82
|
+
`src/styles/TOKENS.md` (`node_modules/themelia-ui/src/styles/TOKENS.md`) names the variable for every role.
|
|
83
|
+
- **Is a density preset in effect?** A `data-density` region (or a provider's `density`) sets
|
|
84
|
+
the lengths and control heights on its element, so a value set further out does not reach
|
|
85
|
+
inside it. Set the value for the preset too: `[data-density="compact"] { --padding: … }`.
|
|
86
|
+
- **Is it a colour set to one value?** One value applies in both modes. For a separate dark
|
|
87
|
+
value, write `light-dark(light, dark)`; a rule under `.dark` misses a dark region inside a
|
|
88
|
+
light page.
|
|
89
|
+
- **Is it in a portalled popup?** A value set on a provider or a region reaches its subtree,
|
|
90
|
+
and a popup portalled to `<body>` leaves it; see the next section.
|
|
60
91
|
|
|
61
92
|
See [Theming](theming.md#setting-a-theme) and
|
|
62
93
|
[Provider and scoping](provider-and-scoping.md).
|
|
@@ -66,8 +97,8 @@ See [Theming](theming.md#setting-a-theme) and
|
|
|
66
97
|
Popups portal to `<body>` by default, outside any nested scope, so they miss its density,
|
|
67
98
|
colour scheme and token overrides. Wrap the region in `UIPortalHost` so its popups render
|
|
68
99
|
inside the scope, or pass the component a `container`. A root provider with a
|
|
69
|
-
`documentTarget` mirrors only `data-theme` and `data-density` to the document;
|
|
70
|
-
|
|
100
|
+
`documentTarget` mirrors only `data-theme` and `data-density` to the document; a value that
|
|
101
|
+
`<body>` popups must see belongs on `:root`. See
|
|
71
102
|
[Provider and scoping](provider-and-scoping.md#portals-and-scopes).
|
|
72
103
|
|
|
73
104
|
## A controlled component appears frozen
|
|
@@ -87,9 +118,13 @@ element's semantics while applying the component's behaviour and geometry.
|
|
|
87
118
|
|
|
88
119
|
Use `CSPProvider` with the request nonce. For a policy that forbids style elements entirely,
|
|
89
120
|
set `disableStyleElements` and serve the documented Base UI behaviour rules from an external
|
|
90
|
-
stylesheet. The
|
|
121
|
+
stylesheet. The kit's stylesheets are ordinary static CSS. See
|
|
91
122
|
[Provider and scoping](provider-and-scoping.md#strict-content-security-policy).
|
|
92
123
|
|
|
124
|
+
In a bundled app the kit's CSS follows your own pipeline: stylesheet files in production,
|
|
125
|
+
while a dev server or `style-loader` that injects `<style>` elements needs the nonce, as your
|
|
126
|
+
own CSS does.
|
|
127
|
+
|
|
93
128
|
## The design looks inconsistent after overrides
|
|
94
129
|
|
|
95
130
|
Override global semantic tokens first: colour roles, radius, spacing and density,
|
|
@@ -45,7 +45,6 @@ the module and token before adding a local patch: the package may be missing a d
|
|
|
45
45
|
|
|
46
46
|
Read the changelog (`node_modules/themelia-ui/CHANGELOG.md`), run the package's codemod when a release names one
|
|
47
47
|
(`node node_modules/themelia-ui/scripts/consumer/codemod.mjs --dry-run src/`), and let the
|
|
48
|
-
application's own type-check compare the installed declarations.
|
|
49
|
-
|
|
50
|
-
incorrect; a major may remove names outright, and its migration guide lists each one. See
|
|
48
|
+
application's own type-check compare the installed declarations. Removed names have no
|
|
49
|
+
compatibility alias in 3.1; its migration guide lists each replacement. See
|
|
51
50
|
[API compatibility](api-compatibility.md).
|