themelia-ui 3.0.0 → 3.2.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 +60 -33
- package/.agents/skills/themelia-ui/manifest.json +23 -0
- package/.agents/skills/themelia-ui/references/api-compatibility.md +5 -4
- package/.agents/skills/themelia-ui/references/blocks.md +123 -0
- package/.agents/skills/themelia-ui/references/composition-ladder.md +8 -8
- package/.agents/skills/themelia-ui/references/composition.md +100 -19
- package/.agents/skills/themelia-ui/references/forms.md +23 -3
- package/.agents/skills/themelia-ui/references/framework-wiring.md +41 -13
- package/.agents/skills/themelia-ui/references/i18n.md +4 -2
- package/.agents/skills/themelia-ui/references/imports.md +104 -104
- package/.agents/skills/themelia-ui/references/installation.md +60 -31
- package/.agents/skills/themelia-ui/references/migration.md +156 -5
- package/.agents/skills/themelia-ui/references/provider-and-scoping.md +37 -25
- package/.agents/skills/themelia-ui/references/reference-workflows.md +43 -0
- package/.agents/skills/themelia-ui/references/structure-and-spacing.md +147 -0
- package/.agents/skills/themelia-ui/references/theming.md +174 -131
- package/.agents/skills/themelia-ui/references/troubleshooting.md +88 -30
- package/.agents/skills/themelia-ui/references/verification.md +60 -5
- package/CHANGELOG.md +212 -0
- package/README.md +48 -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-Cg2HhuBe.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-Ddhz43Bz.js +279 -0
- package/dist/chart-BkK3Xm10.js +201 -0
- package/dist/choice-inputs-NwRxvmZN.js +694 -0
- package/dist/combobox-519ubijc.js +292 -0
- package/dist/command-JjApYFds.js +156 -0
- package/dist/comments-CCQ2QRaU.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/forms/form-field.d.ts +2 -2
- 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 +4 -2
- package/dist/components/base/structure/grid.d.ts +10 -4
- package/dist/components/base/structure/index.d.ts +1 -1
- package/dist/components/base/structure/split.d.ts +4 -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/combobox/fetching-combobox.d.ts +2 -1
- package/dist/components/features/combobox/resource-combobox.d.ts +3 -0
- package/dist/components/features/combobox/use-suggestions.d.ts +7 -0
- 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-BwCwKIVM.js +685 -0
- package/dist/{dialog-CtFCuTUF.js → dialog-CAnwRNrm.js} +1 -1
- package/dist/display-a7AoX_u7.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 +328 -314
- 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-BhsTkWpZ.js} +386 -383
- package/dist/forms-C0WeNPFF.js +250 -0
- package/dist/forms-numeric-IwQ1ltNf.js +582 -0
- package/dist/hooks/use-native-dialog.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/input-group-HS_Z0Ei_.js +119 -0
- package/dist/item-M2pmpWXh.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 +50 -46
- 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/lib/ui-provider/ui-scope.d.ts +1 -1
- package/dist/{mentions-BbsEHlcH.js → mentions-BOxbigwp.js} +113 -111
- package/dist/navigation-Bgu7Vc0M.js +622 -0
- package/dist/navigation-DiYACqpE.js +216 -0
- package/dist/overlay-BuQOl8aP.js +356 -0
- package/dist/{overlays-DvVoS3td.js → overlays-1sULyytH.js} +77 -75
- package/dist/popover-CA7SP_iz.js +127 -0
- package/dist/popover-menu-QXgQeWeG.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-CeH20dvr.js +445 -0
- package/dist/rich-text-editor-D_Ppm8yh.js +491 -0
- package/dist/{sheet-CKcmRbJ9.js → sheet-CJ1-OAla.js} +3 -3
- package/dist/sidebar-D8uGqxio.js +421 -0
- package/dist/skeleton-BTKNKTdj.js +173 -0
- package/dist/spinner-Tc1QCnxM.js +30 -0
- package/dist/{structure-D0WGQAP3.js → structure-CynEZ-OY.js} +15 -23
- package/dist/style.css +1 -1
- package/dist/styles/TOKENS.md +116 -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-B7dtIFUx.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-BR_jNgvz.js} +57 -49
- package/dist/{timelines-BB7550mz.js → timelines-DXG1BfIN.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-CYuoJykZ.js +968 -0
- package/dist/use-async-preview-BFwf9ElY.js +188 -0
- package/dist/value-inputs-ng8aVJJZ.js +728 -0
- package/docs/README.md +13 -3
- package/docs/build/browser-composition-fixture.ts +28 -0
- package/docs/build/recipes.md +11484 -10723
- package/docs/generated/component-index.json +9809 -9169
- 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 +84 -14
- 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 +320 -70
- 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 +317 -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} +15 -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} +57 -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 +71 -5
- package/docs/generated/components/features--comments.md +0 -1
- package/docs/generated/components/features--data-view.md +63 -8
- package/docs/generated/components/features--event-calendar.md +1 -2
- package/docs/generated/components/features--filters.md +11 -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 +105 -38
- package/docs/generated/components/features--mentions.md +7 -7
- package/docs/generated/components/features--overlays.md +75 -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 +42 -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 +41 -11
- package/docs/generated/components/layout--auth.md +8 -9
- package/docs/generated/components/layout--containers.md +40 -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 +33 -5
- package/docs/generated/components/layout--settings.md +0 -1
- package/docs/generated/components/layout--sidebar.md +47 -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 +96 -78
- package/docs/generated/composition-ladder.md +8 -8
- package/docs/generated/consumer-contract.json +5736 -0
- 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 +755 -810
- package/docs/generated/workflows/communications-overview/analytics/communications-reference.tsx +19 -0
- package/docs/generated/workflows/index.json +691 -0
- package/docs/generated/workflows/media-picking/media-library/media-picking-reference.tsx +63 -0
- package/docs/generated/workflows/media-picking/media-library/reference-data.ts +3 -0
- package/docs/generated/workflows/multi-section-form/form-workflow/multi-section-reference.tsx +46 -0
- package/docs/generated/workflows/nested-action-flow/action-overlays/nested-action-reference.tsx +39 -0
- package/docs/generated/workflows/record-detail/page-layout/record-detail-reference.tsx +24 -0
- package/docs/generated/workflows/resource-index/data-view/resource-index-reference.tsx +51 -0
- package/docs/generated/workflows/scoped-resource-selection/combobox/scoped-resource-reference.tsx +50 -0
- package/docs/generated/workflows/website-content-editor/media-library/reference-data.ts +3 -0
- package/docs/generated/workflows/website-content-editor/rich-text-editor/website-content-reference.tsx +33 -0
- package/docs/generated/workflows/workspace-navigation/app-shell/workspace-navigation-reference.tsx +26 -0
- package/docs/learn/api-compatibility.md +5 -4
- package/docs/learn/blocks.md +123 -0
- package/docs/learn/composition.md +100 -19
- package/docs/learn/forms.md +23 -3
- package/docs/learn/framework-wiring.md +41 -13
- package/docs/learn/i18n.md +4 -2
- package/docs/learn/installation.md +60 -31
- package/docs/learn/migration.md +156 -5
- package/docs/learn/provider-and-scoping.md +37 -25
- package/docs/learn/reference-workflows.md +43 -0
- package/docs/learn/structure-and-spacing.md +147 -0
- package/docs/learn/theming.md +174 -131
- package/docs/learn/troubleshooting.md +88 -30
- package/docs/learn/verification.md +60 -5
- package/package.json +42 -473
- package/scripts/consumer/codemod.mjs +50 -32
- package/scripts/consumer/contract-reader.mjs +42 -0
- package/scripts/consumer/css-scan.mjs +51 -0
- package/scripts/consumer/diagnose.mjs +136 -0
- package/scripts/consumer/find-component.mjs +30 -17
- package/scripts/consumer/install-skill.mjs +93 -11
- package/src/styles/TOKENS.md +116 -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
package/docs/learn/theming.md
CHANGED
|
@@ -1,146 +1,192 @@
|
|
|
1
1
|
# Theming
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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 on a region reaches its descendants unless another scope or preset overrides it.
|
|
7
|
+
[`src/styles/TOKENS.md`](../../src/styles/TOKENS.md)
|
|
8
|
+
names the variable for each role.
|
|
11
9
|
|
|
12
10
|
## Setting a theme
|
|
13
11
|
|
|
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:
|
|
12
|
+
Set the variables you change on `:root`. A colour takes a `light-dark()` pair, or one value
|
|
13
|
+
for both modes:
|
|
20
14
|
|
|
21
15
|
```css
|
|
22
16
|
:root {
|
|
23
|
-
--
|
|
24
|
-
--
|
|
25
|
-
--radius:
|
|
26
|
-
--radius-sm: 0.
|
|
17
|
+
--primary: light-dark(oklch(0.55 0.19 250), oklch(0.72 0.14 250));
|
|
18
|
+
--primary-foreground: light-dark(oklch(0.985 0 0), oklch(0.2 0.03 250));
|
|
19
|
+
--radius: 0.75rem;
|
|
20
|
+
--radius-sm: 0.375rem;
|
|
21
|
+
--font-sans: "Your interface font", sans-serif;
|
|
27
22
|
}
|
|
28
23
|
```
|
|
29
24
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
25
|
+
That one block reaches every region, including popups portalled to `<body>` and a dark
|
|
26
|
+
region inside a light page. Component styles do not redeclare theme colour defaults;
|
|
27
|
+
an explicit regional theme override takes precedence within that region.
|
|
28
|
+
|
|
29
|
+
The same values work on any element, for a region of their own:
|
|
35
30
|
|
|
36
31
|
```css
|
|
37
|
-
|
|
38
|
-
--primary: oklch(0.
|
|
32
|
+
.marketing {
|
|
33
|
+
--primary: oklch(0.6 0.2 30);
|
|
39
34
|
}
|
|
40
35
|
```
|
|
41
36
|
|
|
42
|
-
|
|
43
|
-
|
|
37
|
+
A provider takes them as config and writes them on its own element:
|
|
38
|
+
|
|
39
|
+
```tsx fragment — shape only, not a program
|
|
40
|
+
<UIProvider config={{ theme: { colors: { primary: "light-dark(#2563eb, #60a5fa)" } } }}>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Colours passed this way reach the provider's subtree. A popup portalled to `<body>` leaves
|
|
44
|
+
that subtree; render it into the provider with `UIPortalHost` (see
|
|
45
|
+
[Provider and scoping](./provider-and-scoping.md#portals-and-scopes)), or set the value on
|
|
46
|
+
`:root` instead.
|
|
44
47
|
|
|
45
|
-
|
|
48
|
+
## Ready-made themes
|
|
49
|
+
|
|
50
|
+
Four themes ship with the kit, each a style rather than a colour: Soft (large corners,
|
|
51
|
+
diffuse shadows, comfortable spacing), Sharp (square corners, hairlines, no shadows), Dense
|
|
52
|
+
(compact spacing and small corners, for data) and Editorial (serif headings on warm paper, a
|
|
53
|
+
step larger type). Each is a `ThemePreset`: a `label`, a `description`, and the provider
|
|
54
|
+
`config` it sets. That config reaches past colour to radii, shadows and border weight, density,
|
|
55
|
+
typography, motion and component defaults, such as the card surface. Every theme's colours
|
|
56
|
+
hold WCAG AA contrast in both modes, as the kit's own do.
|
|
46
57
|
|
|
47
58
|
```tsx fragment — shape only, not a program
|
|
48
|
-
|
|
59
|
+
import { themes } from "themelia-ui/theming"
|
|
60
|
+
|
|
61
|
+
<UIProvider config={themes.sharp.config}>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Switching themes is handing the provider another theme's config. Keep the choice in state,
|
|
65
|
+
and wrap the application in `UIPortalHost`, so menus and popovers, which portal to `<body>`,
|
|
66
|
+
take the theme too:
|
|
67
|
+
|
|
68
|
+
```tsx fragment — shape only, not a program
|
|
69
|
+
const [name, setName] = useState<ThemeName>("soft")
|
|
70
|
+
|
|
71
|
+
<UIProvider config={themes[name].config}>
|
|
72
|
+
<UIPortalHost>
|
|
73
|
+
<App onThemeChange={setName} />
|
|
74
|
+
</UIPortalHost>
|
|
75
|
+
</UIProvider>
|
|
49
76
|
```
|
|
50
77
|
|
|
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.
|
|
78
|
+
A nested provider themes one region the same way. Settings of your own go beside a theme's:
|
|
79
|
+
`config={{ ...themes.dense.config, formatting: { locale: "de-DE" } }}`.
|
|
55
80
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
81
|
+
A theme of your own is the same shape. Start from one of these and change what you need:
|
|
82
|
+
|
|
83
|
+
```tsx fragment — shape only, not a program
|
|
84
|
+
const brand: ThemePreset = {
|
|
85
|
+
label: "Brand",
|
|
86
|
+
description: "Our product's look.",
|
|
87
|
+
config: {
|
|
88
|
+
...themes.sharp.config,
|
|
89
|
+
density: "comfortable",
|
|
90
|
+
theme: {
|
|
91
|
+
...themes.sharp.config.theme,
|
|
92
|
+
colors: {
|
|
93
|
+
...themes.sharp.config.theme?.colors,
|
|
94
|
+
primary: "light-dark(oklch(0.5 0.19 15), oklch(0.76 0.13 15))",
|
|
95
|
+
"primary-foreground": "light-dark(oklch(0.985 0 0), oklch(0.2 0.05 15))",
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
A square theme should set `defaults.card.surface` to `"card"`: the default `framed` surface is
|
|
103
|
+
a band that follows the corner, and with no corner to follow it reads as a box in a box. Write
|
|
104
|
+
a zero radius as `0px`: the kit subtracts lengths from the radii, and `calc()` cannot subtract
|
|
105
|
+
a length from a bare `0`. Write no shadow as `0 0 transparent`, not `none`: a popup lists
|
|
106
|
+
`--shadow-lg` after its hairline, and `none` cannot stand in a list, so the popup would lose
|
|
107
|
+
its edge.
|
|
108
|
+
|
|
109
|
+
To edit a theme's colours and variables visually, load them into the theme editor with
|
|
110
|
+
`themeFromConfig(themes.soft.config.theme)` from `themelia-ui/features/theme-tweaker`; the
|
|
111
|
+
editor exports the result as CSS or provider config.
|
|
60
112
|
|
|
61
113
|
## Start with the shared controls
|
|
62
114
|
|
|
63
|
-
Most
|
|
64
|
-
family and the two radii. They follow a component's role rather than its name:
|
|
115
|
+
Most adjustments need only these, and they follow a component's role rather than its name:
|
|
65
116
|
|
|
66
117
|
```css
|
|
67
118
|
:root {
|
|
68
|
-
--
|
|
69
|
-
--
|
|
70
|
-
--
|
|
71
|
-
--
|
|
72
|
-
--
|
|
73
|
-
--radius: 0.75rem;
|
|
74
|
-
--radius-sm: 0.375rem;
|
|
119
|
+
--padding: 1.25rem; /* container insets: cards, dialogs, sheets, popovers */
|
|
120
|
+
--padding-sm: 0.625rem; /* item insets: rows, cells, chips, fields */
|
|
121
|
+
--gap: 1.25rem; /* between groups: fields, cards, sections */
|
|
122
|
+
--gap-sm: 0.625rem; /* inside a group: icon and label, title and description */
|
|
123
|
+
--control-height: 2.25rem;
|
|
124
|
+
--radius: 0.75rem; /* containers */
|
|
125
|
+
--radius-sm: 0.375rem; /* what sits inside them; nothing derives one from the other */
|
|
75
126
|
}
|
|
76
127
|
```
|
|
77
128
|
|
|
78
|
-
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
- Dark mode inherits the chosen fonts.
|
|
129
|
+
- A nested corner is the container's radius less its inset, computed where it is used, so
|
|
130
|
+
menus and option lists keep their rows concentric at any radius.
|
|
131
|
+
- A density preset sets the four lengths and the two control heights on its region (see
|
|
132
|
+
[Scale and density](#scale-and-density)); a value you set on `:root` applies where no preset
|
|
133
|
+
is in effect.
|
|
84
134
|
|
|
85
135
|
**Fonts.** The kit ships Geist for text and Geist Mono for code and identifiers (SIL OFL 1.1),
|
|
86
136
|
as variable-weight woff2 files beside `core.css`, one per script. A browser downloads a file
|
|
87
137
|
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.
|
|
138
|
+
`--font-mono` to its own fonts downloads none of them. `--font-heading` is unset by default,
|
|
139
|
+
and headings fall back to the interface font.
|
|
89
140
|
|
|
90
141
|
Compose title and description regions with CardHeader, ContentBlock or OverlayHeader, action
|
|
91
142
|
regions with CardFooter or OverlayFooter, and label/value facts with MetadataList. These
|
|
92
143
|
components own their spacing, so the application does not reproduce it.
|
|
93
|
-
|
|
94
|
-
|
|
144
|
+
See [Structure and spacing](./structure-and-spacing.md) for the owner and responsive-width
|
|
145
|
+
contracts before changing layout values.
|
|
95
146
|
|
|
96
|
-
## Scale
|
|
147
|
+
## Scale and density
|
|
97
148
|
|
|
98
|
-
|
|
149
|
+
Controls take two sizes, `default` and `sm`. A denser or roomier region is a scope instead,
|
|
150
|
+
so everything inside it moves together:
|
|
99
151
|
|
|
100
|
-
|
|
|
101
|
-
|
|
102
|
-
|
|
|
103
|
-
|
|
|
104
|
-
|
|
|
152
|
+
| Setting | Moves |
|
|
153
|
+
| --- | --- |
|
|
154
|
+
| `density` | the four lengths and the two control heights; type keeps its size |
|
|
155
|
+
| `scale` | the same, the two icon sizes, and type |
|
|
156
|
+
| `typography.scale` | type alone, through `--text-scale` |
|
|
105
157
|
|
|
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.
|
|
158
|
+
```tsx fragment — shape only, not a program
|
|
159
|
+
<UIProvider config={{ density: "compact" }}>
|
|
160
|
+
<UIProvider config={{ scale: 1.125 }}>
|
|
161
|
+
<UIProvider config={{ typography: { scale: 0.875 } }}>
|
|
162
|
+
```
|
|
114
163
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
164
|
+
The provider computes `scale` in JavaScript and writes the lengths themselves, rounded to
|
|
165
|
+
whole pixels, so no length is multiplied twice. A density preset also works without a
|
|
166
|
+
provider: any element can carry `data-density="compact"` or `"comfortable"`.
|
|
118
167
|
|
|
119
|
-
A
|
|
120
|
-
|
|
168
|
+
A preset sets its lengths on the region. To change a length under one preset, set it for
|
|
169
|
+
that preset: `[data-density="compact"] { --padding: 0.625rem; }`.
|
|
121
170
|
|
|
122
171
|
## Dark mode
|
|
123
172
|
|
|
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.
|
|
173
|
+
Colours switch through `color-scheme`, which the kit sets from three signals: a `.dark` or
|
|
174
|
+
`.light` class, `data-theme="dark"` or `"light"`, and, with neither, the operating system's
|
|
175
|
+
preference. Each colour's `light-dark()` pair resolves on the element that paints it, so a
|
|
176
|
+
dark region inside a light page needs only `data-theme="dark"` (or a nested provider with
|
|
177
|
+
`colorScheme: "dark"`) on its container, and a light island inside a dark page the same.
|
|
135
178
|
|
|
136
|
-
|
|
137
|
-
|
|
179
|
+
A value of your own switches the same way: write `light-dark()` in the value, never a rule
|
|
180
|
+
under `.dark` or `@media (prefers-color-scheme: dark)`, which would miss a dark region inside
|
|
181
|
+
a light page.
|
|
138
182
|
|
|
139
183
|
## Editing a theme at runtime
|
|
140
184
|
|
|
141
185
|
`ThemeTweaker` (`themelia-ui/features/theme-tweaker`) lets people change appearance, accent
|
|
142
186
|
colour, density, corners and font while the app runs, and exports CSS theme values and
|
|
143
187
|
provider configuration separately. Mount it as a floating button, a full-page route, or both.
|
|
188
|
+
The exported stylesheet is one `:root` block in which each colour it changed is a
|
|
189
|
+
`light-dark()` pair.
|
|
144
190
|
|
|
145
191
|
The application owns the theme and provider state, above its router:
|
|
146
192
|
|
|
@@ -155,7 +201,6 @@ import { UIProvider, type UIConfig } from "themelia-ui/ui-provider"
|
|
|
155
201
|
import {
|
|
156
202
|
ThemeTweaker, createTheme, themeToStyle, useAppliedTheme, type ThemeDefinition,
|
|
157
203
|
} from "themelia-ui/features/theme-tweaker"
|
|
158
|
-
import "themelia-ui/features/theme-tweaker.css"
|
|
159
204
|
|
|
160
205
|
export function ThemedApp({ children }: { children: ReactNode }) {
|
|
161
206
|
const [theme, setTheme] = useState<ThemeDefinition>(() => createTheme())
|
|
@@ -195,10 +240,11 @@ const overrides = deriveThemePalette({ primary: "#3b82f6" })
|
|
|
195
240
|
// { "--primary": "#3b82f6", "--primary-foreground": "oklch(0.18 0.01 260)", … }
|
|
196
241
|
```
|
|
197
242
|
|
|
198
|
-
The keys are
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
243
|
+
The keys are theme variables, so write them on `:root` or pass them to a `Scope`'s `vars`.
|
|
244
|
+
The derived values stay CSS (`color-mix(in oklch, var(--primary) 10%, var(--background))`
|
|
245
|
+
rather than a computed literal), so they keep following the variables they derive from.
|
|
246
|
+
Derive one set for each mode and pair them, as the ThemeTweaker does, when the two should
|
|
247
|
+
differ.
|
|
202
248
|
|
|
203
249
|
`readableForeground(background)` **measures** WCAG contrast against both candidates and
|
|
204
250
|
returns the better one, with the ratio and whether it clears AA:
|
|
@@ -215,64 +261,61 @@ Both functions are also re-exported from `features/theme-tweaker`.
|
|
|
215
261
|
|
|
216
262
|
## Design tokens (DTCG)
|
|
217
263
|
|
|
218
|
-
`themelia-ui/tokens.json` is the
|
|
219
|
-
|
|
264
|
+
`themelia-ui/tokens.json` is the theme in [W3C DTCG][dtcg] format, for Figma and tools like
|
|
265
|
+
Style Dictionary. Each colour is a token in `theme.light` and one in `theme.dark`; every other
|
|
266
|
+
variable is written once in `theme.light` and aliased from `theme.dark`. Colours are OKLCH
|
|
267
|
+
objects with a `hex` fallback:
|
|
220
268
|
|
|
221
269
|
```json
|
|
222
270
|
{ "$value": { "colorSpace": "oklch", "components": [0.45, 0.124, 167.35], "hex": "#006a47" } }
|
|
223
271
|
```
|
|
224
272
|
|
|
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.
|
|
273
|
+
Shadows, durations, the easing curve and the font stacks carry their DTCG types. The two tint
|
|
274
|
+
strengths are percentages, which DTCG cannot express, and the unset font roles have no value;
|
|
275
|
+
the file lists them under its `$extensions`.
|
|
231
276
|
|
|
232
277
|
[dtcg]: https://www.designtokens.org/TR/drafts/format/
|
|
233
278
|
|
|
234
279
|
## Tailwind CSS v4
|
|
235
280
|
|
|
236
281
|
The kit ships no Tailwind and needs none. If your application already uses Tailwind v4,
|
|
237
|
-
import the bridge after Tailwind
|
|
238
|
-
this contract:
|
|
282
|
+
import the bridge after Tailwind, and its utilities resolve against the theme:
|
|
239
283
|
|
|
240
284
|
```css
|
|
241
285
|
@import "tailwindcss";
|
|
242
|
-
@import "themelia-ui/core.css";
|
|
243
286
|
@import "themelia-ui/tailwind.css";
|
|
244
287
|
```
|
|
245
288
|
|
|
246
|
-
|
|
247
|
-
`
|
|
248
|
-
|
|
249
|
-
`
|
|
250
|
-
|
|
251
|
-
`
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
289
|
+
The kit's own CSS arrives with its components. Do not `@import` `themelia-ui/style.css` or
|
|
290
|
+
`themelia-ui/core.css` here as well: that inlines a second copy.
|
|
291
|
+
|
|
292
|
+
`bg-primary` is `var(--primary)`, `rounded` is the container radius and `rounded-sm` the
|
|
293
|
+
item radius, `p-padding` and `gap-gap-sm` are the kit's lengths, and `text-sm` is
|
|
294
|
+
`calc(0.875rem * var(--text-scale))`, which follows the type factor as Text does. Every
|
|
295
|
+
utility reads the variable **at the element**, so a dark region, a `[data-density="compact"]`
|
|
296
|
+
scope, a nested `UIProvider` and a provider's `theme.radiusSm` or `typography.fonts` all move
|
|
297
|
+
Tailwind's output the way they move the kit's own.
|
|
298
|
+
|
|
299
|
+
**Import the bridge even if you never write a kit utility.** Both projects descend from
|
|
300
|
+
shadcn, so custom-property names collide: `--radius`, `--radius-sm`, `--shadow`,
|
|
301
|
+
`--shadow-lg`, `--text-xs` through `--text-2xl` and the font stacks. Tailwind emits its
|
|
302
|
+
defaults onto `:root` inside `@layer theme`, and depending on the order your application
|
|
303
|
+
imports its CSS, that layer can sit above the kit's `tokens` layer. Without the bridge,
|
|
304
|
+
Tailwind can win every shared name:
|
|
262
305
|
|
|
263
306
|
| what | kit | Tailwind takes it to |
|
|
264
307
|
| --- | --- | --- |
|
|
265
|
-
| `--radius-sm` | `0.5rem`, the kit's
|
|
266
|
-
| `--
|
|
308
|
+
| `--radius-sm` | `0.5rem`, the kit's item radius | `0.25rem` |
|
|
309
|
+
| `--shadow-lg` | the kit's floating shadow | Tailwind's `shadow-lg` |
|
|
267
310
|
| `--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
311
|
|
|
270
|
-
The symptom is a slightly wrong radius
|
|
271
|
-
|
|
272
|
-
|
|
312
|
+
The symptom is a slightly wrong radius or shadow, not an error. The bridge restates those
|
|
313
|
+
names with the kit's own values, so Tailwind's override becomes a no-op in either order. It is
|
|
314
|
+
generated from the theme. The kit declares nothing in Tailwind's `--animate-*` namespace, so
|
|
315
|
+
`animate-spin` and its neighbours stay Tailwind's own.
|
|
273
316
|
|
|
274
|
-
The bridge is
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
literals (the
|
|
278
|
-
|
|
317
|
+
The bridge is theme declarations and nothing else: no rules and no utilities, and Tailwind
|
|
318
|
+
drops every key no utility uses, so it costs nothing you do not use. Keys that read a kit
|
|
319
|
+
variable or a formula are `@theme inline`, so they resolve at the element; the restated
|
|
320
|
+
literals (the radii, shadows and font stacks) are a plain `@theme`, so their utilities read
|
|
321
|
+
the variable and follow a theme that moves it.
|
|
@@ -1,10 +1,37 @@
|
|
|
1
1
|
# Troubleshooting
|
|
2
2
|
|
|
3
|
+
Before patching a shared component, trace its callers and inspect one representative of
|
|
4
|
+
every affected surface. Recheck open portals, nested forms and small screens when shared
|
|
5
|
+
spacing or naming changes. Use the [read-only diagnosis and completion record](./verification.md)
|
|
6
|
+
to distinguish contract errors, advisory composition findings and unavailable coverage.
|
|
7
|
+
|
|
8
|
+
## A lookup still shows another workspace
|
|
9
|
+
|
|
10
|
+
Set `scopeKey` on ResourceCombobox, SuggestionsCombobox or useSuggestions. Callback identity is not an invalidation API.
|
|
11
|
+
The key invalidates answers and errors while keeping query/open/value ownership; explicitly
|
|
12
|
+
clear a selected id if it is invalid in the new scope. See the [complete selector](./reference-workflows.md).
|
|
13
|
+
|
|
14
|
+
## Validation resolves but the dialog closes
|
|
15
|
+
|
|
16
|
+
Set `closeOnAsyncComplete={false}` and close controlled `open` after successful validation
|
|
17
|
+
and mutation. Use `formId` for native submission and keep one mutation owner. Nested child
|
|
18
|
+
cancel/Escape should leave the parent draft visible; verify focus returns to the child invoker.
|
|
19
|
+
|
|
3
20
|
## A component is unstyled
|
|
4
21
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
22
|
+
A component brings its own CSS in a bundler. When it arrives unstyled:
|
|
23
|
+
|
|
24
|
+
- **Server rendering with Vite** (Astro, React Router, TanStack Start, Vike): add
|
|
25
|
+
`themelia-ui`, and any installed package that imports it, to `ssr.noExternal`. See
|
|
26
|
+
[Server rendering with Vite](./installation.md#server-rendering-with-vite).
|
|
27
|
+
- **Parcel:** set `"@parcel/resolver-default": { "packageExports": true }`.
|
|
28
|
+
- **Custom resolve conditions:** a bundler config that sets its own conditions replaces the
|
|
29
|
+
defaults, and the kit's CSS resolves only under `module`. Keep it: in Vite 6 or later,
|
|
30
|
+
spread `defaultClientConditions` into `resolve.conditions` and `defaultServerConditions`
|
|
31
|
+
into `ssr.resolve.conditions` (both exported from `vite`); in esbuild, add `module` to
|
|
32
|
+
`conditions`.
|
|
33
|
+
- **No bundler:** link `style.css`. See
|
|
34
|
+
[Loading the CSS](./installation.md#loading-the-css).
|
|
8
35
|
|
|
9
36
|
Overrides need no `!important` or selector escalation: the kit's rules are layered, and
|
|
10
37
|
unlayered application CSS beats them.
|
|
@@ -12,15 +39,36 @@ unlayered application CSS beats them.
|
|
|
12
39
|
## Node throws on a `.css` import
|
|
13
40
|
|
|
14
41
|
`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.
|
|
42
|
+
that imports a stylesheet, without a bundler. The kit's own CSS imports resolve to an empty
|
|
43
|
+
module in Node. Import your stylesheets where your bundler or framework processes CSS, or map
|
|
44
|
+
`\.css$` to a stub in a test runner that runs your modules directly.
|
|
18
45
|
|
|
19
46
|
## Jest: `Cannot use import statement outside a module`
|
|
20
47
|
|
|
21
48
|
The package is ES modules, and Jest transforms nothing in `node_modules` by default. Exempt
|
|
22
49
|
the package in `transformIgnorePatterns`. See [In Node](./installation.md#in-node).
|
|
23
50
|
|
|
51
|
+
## Jest: `Cannot find module '#core.css'`
|
|
52
|
+
|
|
53
|
+
Jest resolves the package's `imports` map from 29.4 onwards. Upgrade Jest.
|
|
54
|
+
|
|
55
|
+
## A build fails on a `.css` file
|
|
56
|
+
|
|
57
|
+
A bundler that resolves the package's `module` condition bundles its CSS as well. A server
|
|
58
|
+
build with no CSS handling, such as a webpack or Rollup config without a CSS loader, fails on
|
|
59
|
+
it. Leave the package external in that build, so Node loads it with no CSS, or add a loader
|
|
60
|
+
that ignores `.css`. A client build needs a CSS loader too; with one in place, remove any
|
|
61
|
+
`<link>` to a kit stylesheet, since the CSS now arrives with the components.
|
|
62
|
+
|
|
63
|
+
## The kit's CSS loads twice
|
|
64
|
+
|
|
65
|
+
Components bring their own CSS, so an application that also imports `themelia-ui/style.css`
|
|
66
|
+
or a module stylesheet from JavaScript, or `@import`s one into its own CSS, ships the same
|
|
67
|
+
rules twice. Remove those imports: the upgrade codemod removes the JavaScript ones and lists
|
|
68
|
+
the rest. A JavaScript import of `themelia-ui/core.css` is harmless, since bundlers keep one
|
|
69
|
+
copy. A page whose JavaScript is bundled that also links a kit stylesheet with an HTML
|
|
70
|
+
`<link>` loads it twice as well; remove the `<link>`.
|
|
71
|
+
|
|
24
72
|
## A subpath does not resolve
|
|
25
73
|
|
|
26
74
|
There are no tier barrels such as `themelia-ui/base`. Use the generated
|
|
@@ -30,7 +78,10 @@ There are no tier barrels such as `themelia-ui/base`. Use the generated
|
|
|
30
78
|
node node_modules/themelia-ui/scripts/consumer/find-component.mjs "what the UI must do"
|
|
31
79
|
```
|
|
32
80
|
|
|
33
|
-
Import the returned
|
|
81
|
+
Import the returned module path; in a bundled app its CSS comes with it.
|
|
82
|
+
|
|
83
|
+
Parcel reads a package's `exports` only with `"@parcel/resolver-default": { "packageExports":
|
|
84
|
+
true }` in the application's `package.json`.
|
|
34
85
|
|
|
35
86
|
## An optional peer is missing
|
|
36
87
|
|
|
@@ -40,23 +91,20 @@ listed there, report it as a package containment defect.
|
|
|
40
91
|
|
|
41
92
|
## A theme or density override does not apply
|
|
42
93
|
|
|
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`.
|
|
94
|
+
Theme defaults are declared at `:root` and inherit until an explicit scope override or
|
|
95
|
+
density preset establishes another value. When an override does not show:
|
|
96
|
+
|
|
97
|
+
- **Is it the theme's name?** A 3.0 name such as `--space-md`, `--control-h` or
|
|
98
|
+
`--primary-10` is gone; the codemod renames or reports each one, and
|
|
99
|
+
[`src/styles/TOKENS.md`](../../src/styles/TOKENS.md) names the variable for every role.
|
|
100
|
+
- **Is a density preset in effect?** A `data-density` region (or a provider's `density`) sets
|
|
101
|
+
the lengths and control heights on its element, so a value set further out does not reach
|
|
102
|
+
inside it. Set the value for the preset too: `[data-density="compact"] { --padding: … }`.
|
|
103
|
+
- **Is it a colour set to one value?** One value applies in both modes. For a separate dark
|
|
104
|
+
value, write `light-dark(light, dark)`; a rule under `.dark` misses a dark region inside a
|
|
105
|
+
light page.
|
|
106
|
+
- **Is it in a portalled popup?** A value set on a provider or a region reaches its subtree,
|
|
107
|
+
and a popup portalled to `<body>` leaves it; see the next section.
|
|
60
108
|
|
|
61
109
|
See [Theming](./theming.md#setting-a-theme) and
|
|
62
110
|
[Provider and scoping](./provider-and-scoping.md).
|
|
@@ -66,8 +114,8 @@ See [Theming](./theming.md#setting-a-theme) and
|
|
|
66
114
|
Popups portal to `<body>` by default, outside any nested scope, so they miss its density,
|
|
67
115
|
colour scheme and token overrides. Wrap the region in `UIPortalHost` so its popups render
|
|
68
116
|
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
|
-
|
|
117
|
+
`documentTarget` mirrors only `data-theme` and `data-density` to the document; a value that
|
|
118
|
+
`<body>` popups must see belongs on `:root`. See
|
|
71
119
|
[Provider and scoping](./provider-and-scoping.md#portals-and-scopes).
|
|
72
120
|
|
|
73
121
|
## A controlled component appears frozen
|
|
@@ -87,17 +135,27 @@ element's semantics while applying the component's behaviour and geometry.
|
|
|
87
135
|
|
|
88
136
|
Use `CSPProvider` with the request nonce. For a policy that forbids style elements entirely,
|
|
89
137
|
set `disableStyleElements` and serve the documented Base UI behaviour rules from an external
|
|
90
|
-
stylesheet. The
|
|
138
|
+
stylesheet. The kit's stylesheets are ordinary static CSS. See
|
|
91
139
|
[Provider and scoping](./provider-and-scoping.md#strict-content-security-policy).
|
|
92
140
|
|
|
141
|
+
If the report names `style-src-attr`, a nonce or `disableStyleElements` will not authorize
|
|
142
|
+
server-rendered style attributes. Inspect the adopted components' SSR output and use the
|
|
143
|
+
separate attribute-policy strategy described in that guide.
|
|
144
|
+
|
|
145
|
+
In a bundled app the kit's CSS follows your own pipeline: stylesheet files in production,
|
|
146
|
+
while a dev server or `style-loader` that injects `<style>` elements needs the nonce, as your
|
|
147
|
+
own CSS does.
|
|
148
|
+
|
|
93
149
|
## The design looks inconsistent after overrides
|
|
94
150
|
|
|
95
151
|
Override global semantic tokens first: colour roles, radius, spacing and density,
|
|
96
|
-
typography, and control geometry.
|
|
97
|
-
|
|
152
|
+
typography, and control geometry. Variables prefixed `--_` are private implementation detail.
|
|
153
|
+
Use a component-level variable only when its module reference documents a public extension
|
|
154
|
+
point. Do not target hashed CSS
|
|
98
155
|
Module names; use the stable `data-slot` attributes and BEM hooks such as
|
|
99
156
|
`{name}--component`, and for a state the attributes the primitives set (`data-open`, `data-checked`, `data-disabled`,
|
|
100
|
-
`data-highlighted`, `data-popup-open`). Radix's `[data-state="open"]`
|
|
157
|
+
`data-highlighted`, `data-popup-open`). Do not assume Radix's `[data-state="open"]` for Base
|
|
158
|
+
UI primitives. Use a module's own `data-state` only when its API documents that contract.
|
|
101
159
|
|
|
102
160
|
## Rich text and untrusted HTML
|
|
103
161
|
|