@miragon/mcp-toolkit-ui 2.5.0 → 2.7.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/README.md +8 -2
- package/dist/app/builder/BuilderBanners.d.ts +7 -2
- package/dist/app/builder/BuilderBanners.d.ts.map +1 -1
- package/dist/app/builder/BuilderBanners.js +8 -3
- package/dist/app/builder/BuilderBanners.js.map +1 -1
- package/dist/app/builder/CanvasRow.d.ts.map +1 -1
- package/dist/app/builder/CanvasRow.js +12 -14
- package/dist/app/builder/CanvasRow.js.map +1 -1
- package/dist/app/builder/CatalogueSheet.d.ts.map +1 -1
- package/dist/app/builder/CatalogueSheet.js +6 -5
- package/dist/app/builder/CatalogueSheet.js.map +1 -1
- package/dist/app/builder/EmptyHint.d.ts +4 -0
- package/dist/app/builder/EmptyHint.d.ts.map +1 -1
- package/dist/app/builder/EmptyHint.js +6 -1
- package/dist/app/builder/EmptyHint.js.map +1 -1
- package/dist/app/builder/LayoutSurface.js +3 -3
- package/dist/app/builder/LayoutSurface.js.map +1 -1
- package/dist/app/builder/PipelineStrip.d.ts +3 -1
- package/dist/app/builder/PipelineStrip.d.ts.map +1 -1
- package/dist/app/builder/PipelineStrip.js +11 -6
- package/dist/app/builder/PipelineStrip.js.map +1 -1
- package/dist/app/builder/SaveDialog.d.ts.map +1 -1
- package/dist/app/builder/SaveDialog.js +2 -2
- package/dist/app/builder/SaveDialog.js.map +1 -1
- package/dist/app/builder/Toolbar.d.ts +3 -1
- package/dist/app/builder/Toolbar.d.ts.map +1 -1
- package/dist/app/builder/Toolbar.js +9 -3
- package/dist/app/builder/Toolbar.js.map +1 -1
- package/dist/app/builder/Workspace.js +2 -2
- package/dist/app/builder/Workspace.js.map +1 -1
- package/dist/app/builder/builder-model.d.ts +3 -2
- package/dist/app/builder/builder-model.d.ts.map +1 -1
- package/dist/app/builder/builder-model.js +5 -4
- package/dist/app/builder/builder-model.js.map +1 -1
- package/dist/app/builder/labels.d.ts +13 -62
- package/dist/app/builder/labels.d.ts.map +1 -1
- package/dist/app/builder/labels.js +9 -58
- package/dist/app/builder/labels.js.map +1 -1
- package/dist/app/builder/status-chip.d.ts.map +1 -1
- package/dist/app/builder/status-chip.js +3 -2
- package/dist/app/builder/status-chip.js.map +1 -1
- package/dist/app/builder/use-builder-catalogue.d.ts +1 -0
- package/dist/app/builder/use-builder-catalogue.d.ts.map +1 -1
- package/dist/app/builder/use-builder-catalogue.js +6 -0
- package/dist/app/builder/use-builder-catalogue.js.map +1 -1
- package/dist/app/builder/use-save-dashboard.d.ts +3 -1
- package/dist/app/builder/use-save-dashboard.d.ts.map +1 -1
- package/dist/app/builder/use-save-dashboard.js +3 -1
- package/dist/app/builder/use-save-dashboard.js.map +1 -1
- package/dist/app/index.d.ts +1 -1
- package/dist/app/index.d.ts.map +1 -1
- package/dist/app/index.js.map +1 -1
- package/dist/app/layout-builder.d.ts +7 -2
- package/dist/app/layout-builder.d.ts.map +1 -1
- package/dist/app/layout-builder.js +17 -5
- package/dist/app/layout-builder.js.map +1 -1
- package/dist/app/mcp-app-view-chrome.d.ts +94 -20
- package/dist/app/mcp-app-view-chrome.d.ts.map +1 -1
- package/dist/app/mcp-app-view-chrome.js +109 -40
- package/dist/app/mcp-app-view-chrome.js.map +1 -1
- package/dist/app/mcp-app-view-states.d.ts +15 -0
- package/dist/app/mcp-app-view-states.d.ts.map +1 -0
- package/dist/app/mcp-app-view-states.js +34 -0
- package/dist/app/mcp-app-view-states.js.map +1 -0
- package/dist/app/mcp-app-view.d.ts +40 -5
- package/dist/app/mcp-app-view.d.ts.map +1 -1
- package/dist/app/mcp-app-view.js +174 -128
- package/dist/app/mcp-app-view.js.map +1 -1
- package/dist/app/mcp-toolkit-app.d.ts +2 -1
- package/dist/app/mcp-toolkit-app.d.ts.map +1 -1
- package/dist/app/mcp-toolkit-app.js +25 -3
- package/dist/app/mcp-toolkit-app.js.map +1 -1
- package/dist/app/use-view-lifecycle.d.ts +38 -0
- package/dist/app/use-view-lifecycle.d.ts.map +1 -0
- package/dist/app/use-view-lifecycle.js +79 -0
- package/dist/app/use-view-lifecycle.js.map +1 -0
- package/dist/app/view-lifecycle.d.ts +109 -0
- package/dist/app/view-lifecycle.d.ts.map +1 -0
- package/dist/app/view-lifecycle.js +120 -0
- package/dist/app/view-lifecycle.js.map +1 -0
- package/dist/app/widget-props-sheet.d.ts +3 -9
- package/dist/app/widget-props-sheet.d.ts.map +1 -1
- package/dist/app/widget-props-sheet.js +6 -13
- package/dist/app/widget-props-sheet.js.map +1 -1
- package/dist/app/widget-renderer.d.ts +41 -1
- package/dist/app/widget-renderer.d.ts.map +1 -1
- package/dist/app/widget-renderer.js +82 -31
- package/dist/app/widget-renderer.js.map +1 -1
- package/dist/components/DrillButton.d.ts.map +1 -1
- package/dist/components/DrillButton.js +2 -1
- package/dist/components/DrillButton.js.map +1 -1
- package/dist/components/EmptyState.d.ts +33 -0
- package/dist/components/EmptyState.d.ts.map +1 -0
- package/dist/components/EmptyState.js +17 -0
- package/dist/components/EmptyState.js.map +1 -0
- package/dist/components/ErrorState.d.ts +50 -0
- package/dist/components/ErrorState.d.ts.map +1 -0
- package/dist/components/ErrorState.js +60 -0
- package/dist/components/ErrorState.js.map +1 -0
- package/dist/components/FilterBar.d.ts +1 -1
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +7 -4
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/GroupCard.d.ts.map +1 -1
- package/dist/components/GroupCard.js +2 -1
- package/dist/components/GroupCard.js.map +1 -1
- package/dist/components/KpiGrid.d.ts +10 -3
- package/dist/components/KpiGrid.d.ts.map +1 -1
- package/dist/components/KpiGrid.js +31 -9
- package/dist/components/KpiGrid.js.map +1 -1
- package/dist/components/ListFooter.d.ts +3 -2
- package/dist/components/ListFooter.d.ts.map +1 -1
- package/dist/components/ListFooter.js +14 -4
- package/dist/components/ListFooter.js.map +1 -1
- package/dist/components/Pills.d.ts +10 -6
- package/dist/components/Pills.d.ts.map +1 -1
- package/dist/components/Pills.js +12 -6
- package/dist/components/Pills.js.map +1 -1
- package/dist/components/Toast.d.ts +37 -0
- package/dist/components/Toast.d.ts.map +1 -0
- package/dist/components/Toast.js +91 -0
- package/dist/components/Toast.js.map +1 -0
- package/dist/components/WidgetHeader.js +1 -1
- package/dist/hooks/use-tool-result-recovery.d.ts +23 -1
- package/dist/hooks/use-tool-result-recovery.d.ts.map +1 -1
- package/dist/hooks/use-tool-result-recovery.js +21 -7
- package/dist/hooks/use-tool-result-recovery.js.map +1 -1
- package/dist/hooks/use-view-data.d.ts +6 -0
- package/dist/hooks/use-view-data.d.ts.map +1 -1
- package/dist/hooks/use-view-data.js +6 -1
- package/dist/hooks/use-view-data.js.map +1 -1
- package/dist/index.d.ts +12 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -4
- package/dist/index.js.map +1 -1
- package/dist/lib/focus-ring.d.ts +18 -0
- package/dist/lib/focus-ring.d.ts.map +1 -0
- package/dist/lib/focus-ring.js +18 -0
- package/dist/lib/focus-ring.js.map +1 -0
- package/dist/lib/icon-stroke.d.ts +12 -0
- package/dist/lib/icon-stroke.d.ts.map +1 -0
- package/dist/lib/icon-stroke.js +12 -0
- package/dist/lib/icon-stroke.js.map +1 -0
- package/dist/lib/toast-model.d.ts +46 -0
- package/dist/lib/toast-model.d.ts.map +1 -0
- package/dist/lib/toast-model.js +36 -0
- package/dist/lib/toast-model.js.map +1 -0
- package/dist/lib/tone-utils.d.ts +43 -9
- package/dist/lib/tone-utils.d.ts.map +1 -1
- package/dist/lib/tone-utils.js +36 -7
- package/dist/lib/tone-utils.js.map +1 -1
- package/dist/locale/index.d.ts +3 -1
- package/dist/locale/index.d.ts.map +1 -1
- package/dist/locale/index.js +2 -1
- package/dist/locale/index.js.map +1 -1
- package/dist/locale/locale-provider.d.ts +42 -1
- package/dist/locale/locale-provider.d.ts.map +1 -1
- package/dist/locale/locale-provider.js +44 -3
- package/dist/locale/locale-provider.js.map +1 -1
- package/dist/locale/message-types.d.ts +223 -0
- package/dist/locale/message-types.d.ts.map +1 -0
- package/dist/locale/message-types.js +7 -0
- package/dist/locale/message-types.js.map +1 -0
- package/dist/locale/messages-de.d.ts +9 -0
- package/dist/locale/messages-de.d.ts.map +1 -0
- package/dist/locale/messages-de.js +151 -0
- package/dist/locale/messages-de.js.map +1 -0
- package/dist/locale/messages-en.d.ts +8 -0
- package/dist/locale/messages-en.d.ts.map +1 -0
- package/dist/locale/messages-en.js +150 -0
- package/dist/locale/messages-en.js.map +1 -0
- package/dist/locale/toolkit-messages.d.ts +39 -0
- package/dist/locale/toolkit-messages.d.ts.map +1 -0
- package/dist/locale/toolkit-messages.js +50 -0
- package/dist/locale/toolkit-messages.js.map +1 -0
- package/dist/primitives/alert.d.ts.map +1 -1
- package/dist/primitives/alert.js +4 -2
- package/dist/primitives/alert.js.map +1 -1
- package/dist/primitives/badge.d.ts +1 -1
- package/dist/primitives/badge.d.ts.map +1 -1
- package/dist/primitives/badge.js +14 -6
- package/dist/primitives/badge.js.map +1 -1
- package/dist/primitives/button.d.ts.map +1 -1
- package/dist/primitives/button.js +12 -8
- package/dist/primitives/button.js.map +1 -1
- package/dist/primitives/card.js +4 -4
- package/dist/primitives/card.js.map +1 -1
- package/dist/primitives/dialog.d.ts +7 -3
- package/dist/primitives/dialog.d.ts.map +1 -1
- package/dist/primitives/dialog.js +14 -7
- package/dist/primitives/dialog.js.map +1 -1
- package/dist/primitives/input.d.ts.map +1 -1
- package/dist/primitives/input.js +4 -1
- package/dist/primitives/input.js.map +1 -1
- package/dist/primitives/scroll-area.js +1 -1
- package/dist/primitives/scroll-area.js.map +1 -1
- package/dist/primitives/select.d.ts.map +1 -1
- package/dist/primitives/select.js +5 -2
- package/dist/primitives/select.js.map +1 -1
- package/dist/primitives/sheet.d.ts +3 -1
- package/dist/primitives/sheet.d.ts.map +1 -1
- package/dist/primitives/sheet.js +12 -6
- package/dist/primitives/sheet.js.map +1 -1
- package/dist/primitives/skeleton.js +1 -1
- package/dist/primitives/skeleton.js.map +1 -1
- package/dist/primitives/switch.d.ts.map +1 -1
- package/dist/primitives/switch.js +2 -1
- package/dist/primitives/switch.js.map +1 -1
- package/dist/primitives/tabs.d.ts.map +1 -1
- package/dist/primitives/tabs.js +5 -3
- package/dist/primitives/tabs.js.map +1 -1
- package/dist/render-cases.d.ts.map +1 -1
- package/dist/render-cases.js +20 -2
- package/dist/render-cases.js.map +1 -1
- package/dist/render-scan.d.ts +25 -0
- package/dist/render-scan.d.ts.map +1 -0
- package/dist/render-scan.js +66 -0
- package/dist/render-scan.js.map +1 -0
- package/dist/theme/cd-tokens.d.ts +66 -0
- package/dist/theme/cd-tokens.d.ts.map +1 -0
- package/dist/theme/cd-tokens.js +64 -0
- package/dist/theme/cd-tokens.js.map +1 -0
- package/dist/theme/create-theme.d.ts +196 -39
- package/dist/theme/create-theme.d.ts.map +1 -1
- package/dist/theme/create-theme.js +189 -13
- package/dist/theme/create-theme.js.map +1 -1
- package/dist/theme/fonts.d.ts +38 -0
- package/dist/theme/fonts.d.ts.map +1 -0
- package/dist/theme/fonts.js +56 -0
- package/dist/theme/fonts.js.map +1 -0
- package/dist/theme/host-fonts.d.ts +39 -0
- package/dist/theme/host-fonts.d.ts.map +1 -0
- package/dist/theme/host-fonts.js +44 -0
- package/dist/theme/host-fonts.js.map +1 -0
- package/dist/theme/index.d.ts +8 -1
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +5 -1
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/portal-container.d.ts +16 -0
- package/dist/theme/portal-container.d.ts.map +1 -0
- package/dist/theme/portal-container.js +19 -0
- package/dist/theme/portal-container.js.map +1 -0
- package/dist/theme/presets.d.ts +24 -9
- package/dist/theme/presets.d.ts.map +1 -1
- package/dist/theme/presets.js +44 -11
- package/dist/theme/presets.js.map +1 -1
- package/dist/theme/theme-provider.d.ts +27 -9
- package/dist/theme/theme-provider.d.ts.map +1 -1
- package/dist/theme/theme-provider.js +42 -20
- package/dist/theme/theme-provider.js.map +1 -1
- package/package.json +13 -8
- package/src/app/builder/BuilderBanners.tsx +26 -13
- package/src/app/builder/CanvasRow.tsx +22 -21
- package/src/app/builder/CatalogueSheet.tsx +16 -14
- package/src/app/builder/EmptyHint.tsx +16 -11
- package/src/app/builder/LayoutSurface.tsx +7 -7
- package/src/app/builder/PipelineStrip.tsx +26 -17
- package/src/app/builder/SaveDialog.tsx +11 -12
- package/src/app/builder/Toolbar.tsx +19 -7
- package/src/app/builder/Workspace.tsx +5 -3
- package/src/app/builder/builder-feedback.test.tsx +75 -0
- package/src/app/builder/builder-model.test.ts +5 -0
- package/src/app/builder/builder-model.ts +5 -4
- package/src/app/builder/labels.ts +15 -121
- package/src/app/builder/status-chip.tsx +8 -4
- package/src/app/builder/use-builder-catalogue.ts +6 -0
- package/src/app/builder/use-save-dashboard.ts +5 -0
- package/src/app/index.ts +8 -1
- package/src/app/layout-builder.tsx +23 -3
- package/src/app/mcp-app-view-chrome.test.tsx +347 -14
- package/src/app/mcp-app-view-chrome.tsx +278 -100
- package/src/app/mcp-app-view-states.tsx +100 -0
- package/src/app/mcp-app-view.test.tsx +258 -0
- package/src/app/mcp-app-view.tsx +292 -185
- package/src/app/mcp-toolkit-app.tsx +31 -7
- package/src/app/use-view-lifecycle.ts +116 -0
- package/src/app/view-lifecycle.test.ts +227 -0
- package/src/app/view-lifecycle.ts +174 -0
- package/src/app/widget-props-sheet.tsx +13 -26
- package/src/app/widget-renderer.render.test.tsx +131 -0
- package/src/app/widget-renderer.tsx +136 -38
- package/src/components/DrillButton.tsx +2 -1
- package/src/components/EmptyState.tsx +81 -0
- package/src/components/ErrorState.tsx +182 -0
- package/src/components/FilterBar.tsx +9 -6
- package/src/components/GroupCard.tsx +3 -2
- package/src/components/KpiGrid.tsx +75 -44
- package/src/components/ListFooter.tsx +17 -6
- package/src/components/Pills.tsx +20 -11
- package/src/components/Toast.tsx +188 -0
- package/src/components/WidgetHeader.tsx +1 -1
- package/src/components/feedback-states.test.tsx +225 -0
- package/src/components/tone-figures.test.tsx +54 -0
- package/src/fonts.css +19 -0
- package/src/globals.css +9 -165
- package/src/hooks/use-tool-result-recovery.test.ts +25 -1
- package/src/hooks/use-tool-result-recovery.ts +34 -6
- package/src/hooks/use-view-data.test.tsx +60 -0
- package/src/hooks/use-view-data.ts +12 -1
- package/src/i18n-coverage.test.tsx +323 -0
- package/src/index.ts +57 -5
- package/src/lib/focus-ring.ts +20 -0
- package/src/lib/icon-stroke.test.ts +59 -0
- package/src/lib/icon-stroke.ts +13 -0
- package/src/lib/toast-model.test.ts +68 -0
- package/src/lib/toast-model.ts +63 -0
- package/src/lib/tone-utils.test.ts +47 -14
- package/src/lib/tone-utils.ts +61 -13
- package/src/locale/index.ts +13 -1
- package/src/locale/locale-provider.test.tsx +87 -0
- package/src/locale/locale-provider.tsx +90 -3
- package/src/locale/message-types.ts +221 -0
- package/src/locale/messages-de.ts +159 -0
- package/src/locale/messages-en.ts +157 -0
- package/src/locale/toolkit-messages.test.ts +216 -0
- package/src/locale/toolkit-messages.ts +82 -0
- package/src/no-hardcoded-copy.test.ts +432 -0
- package/src/primitives/alert.tsx +4 -2
- package/src/primitives/badge.tsx +14 -7
- package/src/primitives/button.tsx +13 -8
- package/src/primitives/card.tsx +4 -4
- package/src/primitives/dialog.tsx +32 -7
- package/src/primitives/input.tsx +5 -3
- package/src/primitives/scroll-area.tsx +1 -1
- package/src/primitives/select.tsx +6 -3
- package/src/primitives/sheet.tsx +26 -6
- package/src/primitives/skeleton.tsx +1 -1
- package/src/primitives/switch.tsx +4 -2
- package/src/primitives/tabs.tsx +9 -6
- package/src/render-cases.tsx +45 -1
- package/src/render-scan.ts +75 -0
- package/src/theme/cd-tokens.generated.css +48 -0
- package/src/theme/cd-tokens.test.ts +107 -0
- package/src/theme/cd-tokens.ts +67 -0
- package/src/theme/create-theme.test.ts +243 -5
- package/src/theme/create-theme.ts +313 -41
- package/src/theme/fonts.test.ts +85 -0
- package/src/theme/fonts.ts +72 -0
- package/src/theme/host-fonts.test.ts +135 -0
- package/src/theme/host-fonts.ts +52 -0
- package/src/theme/index.ts +15 -1
- package/src/theme/portal-container.ts +20 -0
- package/src/theme/presets.ts +44 -11
- package/src/theme/theme-css.test.ts +568 -0
- package/src/theme/theme-provider.test.tsx +82 -0
- package/src/theme/theme-provider.tsx +60 -24
- package/src/theme.css +314 -0
- package/ui-catalog.json +344 -17
|
@@ -7,7 +7,8 @@ import {
|
|
|
7
7
|
type CSSProperties,
|
|
8
8
|
type ReactNode,
|
|
9
9
|
} from "react"
|
|
10
|
-
import type
|
|
10
|
+
import { resolveThemeVars, type ThemeDefinition } from "./create-theme.js"
|
|
11
|
+
import { PortalContainerContext } from "./portal-container.js"
|
|
11
12
|
|
|
12
13
|
/**
|
|
13
14
|
* How the `.dark` class is resolved on the theme scope:
|
|
@@ -74,8 +75,11 @@ function useResolvedMode(mode: ThemeMode): "light" | "dark" {
|
|
|
74
75
|
/** Props for {@link ThemeProvider}. */
|
|
75
76
|
export interface ThemeProviderProps {
|
|
76
77
|
/**
|
|
77
|
-
* The white-label theme to apply (from {@link createTheme}
|
|
78
|
-
*
|
|
78
|
+
* The white-label theme to apply (from {@link createTheme}). Omit to keep the
|
|
79
|
+
* theme of the nearest enclosing `ThemeProvider` (re-applied in this
|
|
80
|
+
* provider's mode, so a light island inside a dark branded scope stays on
|
|
81
|
+
* the brand), or, at the top, to manage only the light/dark `mode` against
|
|
82
|
+
* the toolkit defaults (the Miragon theme).
|
|
79
83
|
*/
|
|
80
84
|
theme?: ThemeDefinition
|
|
81
85
|
/**
|
|
@@ -97,19 +101,34 @@ export interface ThemeProviderProps {
|
|
|
97
101
|
/**
|
|
98
102
|
* Apply a white-label {@link ThemeDefinition} to a subtree. Renders a wrapper
|
|
99
103
|
* element carrying the theme's CSS variables as inline `style`, so they override
|
|
100
|
-
* the
|
|
101
|
-
* `text-
|
|
104
|
+
* the toolkit's defaults (the Miragon theme) for every descendant — `Card`,
|
|
105
|
+
* `Button`, `bg-card`, `text-link`, and `rounded-md` all re-skin without
|
|
106
|
+
* touching the widgets.
|
|
102
107
|
*
|
|
103
|
-
* Dark mode is handled at the scope: the `.dark` class
|
|
104
|
-
* (not `<html>`) per the resolved {@link ThemeMode}
|
|
105
|
-
*
|
|
108
|
+
* Dark mode is handled at the scope: the `.dark` class and `data-theme-mode`
|
|
109
|
+
* are set on the wrapper (not `<html>`) per the resolved {@link ThemeMode}. In
|
|
110
|
+
* dark mode the wrapper gets the toolkit's dark roles plus the theme's dark
|
|
111
|
+
* tokens and its mode-invariant light tokens ({@link resolveThemeVars}) — a
|
|
112
|
+
* light surface colour never leaks into a dark scope (mcp-toolkit#178 N35). A
|
|
113
|
+
* light scope inside a dark scope stays light: there, `data-theme-mode="light"`
|
|
114
|
+
* re-declares the toolkit's light roles. A light scope in a light document
|
|
115
|
+
* re-declares nothing and keeps what the document set (a consumer's `:root`
|
|
116
|
+
* brand). A nested provider without `theme` re-applies the enclosing one's
|
|
117
|
+
* theme in its own mode. This keeps theming local — two differently themed
|
|
106
118
|
* subtrees (e.g. a brand preview gallery) coexist on one page.
|
|
107
119
|
*
|
|
120
|
+
* Overlays opened inside the scope (Dialog, Sheet, Select) portal into a node
|
|
121
|
+
* within it, so they wear the same theme and mode (#178 N36,
|
|
122
|
+
* {@link usePortalContainer}). That node is the wrapper's FIRST child, an empty
|
|
123
|
+
* `display: contents` element: it draws no box, and `space-*`, `divide-*`,
|
|
124
|
+
* `gap` and `last:` on the wrapper see only your children. Only selectors on
|
|
125
|
+
* the wrapper's first/nth child (`first:`, `odd:`) count it.
|
|
126
|
+
*
|
|
108
127
|
* Uses only React + the DOM (no `mcp-use/react`), so it ships from the root
|
|
109
128
|
* barrel and works in a host-free standalone app, a host, or SSR alike.
|
|
110
129
|
*
|
|
111
130
|
* @example
|
|
112
|
-
* <ThemeProvider theme={
|
|
131
|
+
* <ThemeProvider theme={brand} mode={host.theme ?? "system"}>
|
|
113
132
|
* <YourWidget />
|
|
114
133
|
* </ThemeProvider>
|
|
115
134
|
*/
|
|
@@ -122,31 +141,48 @@ export function ThemeProvider({
|
|
|
122
141
|
}: ThemeProviderProps): ReactNode {
|
|
123
142
|
const resolvedMode = useResolvedMode(mode)
|
|
124
143
|
const isDark = resolvedMode === "dark"
|
|
144
|
+
const [portalContainer, setPortalContainer] = useState<HTMLElement | null>(null)
|
|
145
|
+
// Without its own theme a nested provider keeps the enclosing one's brand.
|
|
146
|
+
const enclosing = useContext(ThemeContext)
|
|
147
|
+
const activeTheme = theme ?? enclosing?.theme ?? null
|
|
125
148
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
if (isDark && theme.darkVars) {
|
|
131
|
-
return { ...theme.vars, ...theme.darkVars }
|
|
132
|
-
}
|
|
133
|
-
return theme.vars
|
|
134
|
-
}, [theme, isDark])
|
|
149
|
+
const style = useMemo<CSSProperties>(
|
|
150
|
+
() => resolveThemeVars(activeTheme, resolvedMode),
|
|
151
|
+
[activeTheme, resolvedMode],
|
|
152
|
+
)
|
|
135
153
|
|
|
136
154
|
const value = useMemo<ThemeContextValue>(
|
|
137
|
-
() => ({ theme:
|
|
138
|
-
[
|
|
155
|
+
() => ({ theme: activeTheme, mode, resolvedMode }),
|
|
156
|
+
[activeTheme, mode, resolvedMode],
|
|
139
157
|
)
|
|
140
158
|
|
|
141
|
-
const classes = [
|
|
159
|
+
const classes = [
|
|
160
|
+
isDark ? "dark" : undefined,
|
|
161
|
+
"bg-background text-foreground font-sans",
|
|
162
|
+
className,
|
|
163
|
+
]
|
|
142
164
|
.filter(Boolean)
|
|
143
165
|
.join(" ")
|
|
144
166
|
|
|
167
|
+
// The portal node OPENS the scope as an empty `display: contents` element:
|
|
168
|
+
// it draws no box, yet overlays portaled into it inherit the scope's
|
|
169
|
+
// variables and its `.dark` / `data-theme-mode`. First, not last: Tailwind's
|
|
170
|
+
// `space-*`/`divide-*` and `last:` target the last child, so a trailing node
|
|
171
|
+
// would hand the real last child a margin or divider it never had.
|
|
172
|
+
const PortalRoot = As === "span" ? "span" : "div"
|
|
173
|
+
|
|
145
174
|
return (
|
|
146
175
|
<ThemeContext.Provider value={value}>
|
|
147
|
-
<
|
|
148
|
-
{
|
|
149
|
-
|
|
176
|
+
<PortalContainerContext.Provider value={portalContainer}>
|
|
177
|
+
<As className={classes} style={style} data-theme-mode={resolvedMode}>
|
|
178
|
+
<PortalRoot
|
|
179
|
+
ref={setPortalContainer}
|
|
180
|
+
data-slot="theme-portal"
|
|
181
|
+
style={{ display: "contents" }}
|
|
182
|
+
/>
|
|
183
|
+
{children}
|
|
184
|
+
</As>
|
|
185
|
+
</PortalContainerContext.Provider>
|
|
150
186
|
</ThemeContext.Provider>
|
|
151
187
|
)
|
|
152
188
|
}
|
package/src/theme.css
ADDED
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @miragon/mcp-toolkit-ui/theme.css — the toolkit's design tokens and base
|
|
3
|
+
* layer, without Tailwind's entry point. `globals.css` is this file plus
|
|
4
|
+
* `@import "tailwindcss"` and the toolkit's `@source`; import THIS file instead
|
|
5
|
+
* when your own stylesheet already imports Tailwind:
|
|
6
|
+
*
|
|
7
|
+
* @import "tailwindcss";
|
|
8
|
+
* @source "../node_modules/@miragon/mcp-toolkit-ui/src";
|
|
9
|
+
* @import "@miragon/mcp-toolkit-ui/theme.css";
|
|
10
|
+
*
|
|
11
|
+
* Three layers (modeler-tool-design §13):
|
|
12
|
+
* 1. `--cd-*` the Miragon corporate-design tokens, vendored unchanged.
|
|
13
|
+
* 2. Roles `--primary`, `--link`, `--focus`, `--<tone>`, `--<tone>-soft`,
|
|
14
|
+
* `--<tone>-ink`, radii, shadows, motion, fonts — light AND dark,
|
|
15
|
+
* each pointing at `--cd-*` only (never at another role, so a
|
|
16
|
+
* role overridden on a scope cannot leave a stale alias behind;
|
|
17
|
+
* the font roles also name the host's font, `--host-font-*`).
|
|
18
|
+
* 3. Utilities Tailwind's `@theme` maps utilities onto the roles.
|
|
19
|
+
* A brand (a customer's, or a host's neutral palette) overrides layer 2 only —
|
|
20
|
+
* see docs/guides/white-labeling.md. Components use role names exclusively.
|
|
21
|
+
*/
|
|
22
|
+
@import "tw-animate-css";
|
|
23
|
+
/* Vendort aus Miragon/corporate-identity. Nicht bearbeiten, zum Aktualisieren neu kopieren. */
|
|
24
|
+
@import "./theme/cd-tokens.generated.css";
|
|
25
|
+
|
|
26
|
+
/*
|
|
27
|
+
* Dark mode follows the host: a `.dark` class (the toolkit's ThemeProvider, a
|
|
28
|
+
* shell that mirrors the host theme) or `data-theme="dark"` (what SEP-1865
|
|
29
|
+
* hosts and mcp-use's ThemeProvider write on <html>). `data-theme-mode="light"`
|
|
30
|
+
* marks a forced-light island — a light ThemeProvider, or an always-light
|
|
31
|
+
* surface such as a diagram's paper and its zoom chrome.
|
|
32
|
+
*
|
|
33
|
+
* `dark:` follows the NEAREST mode scope: an element is dark when it sits in a
|
|
34
|
+
* dark scope with no light island in between. The second branch is a dark
|
|
35
|
+
* scope nested in a light island (a dark preview inside a light app); one
|
|
36
|
+
* such re-nesting is supported, which also covers a light island inside it.
|
|
37
|
+
*/
|
|
38
|
+
@custom-variant dark (&:is(:is(.dark, [data-theme="dark"], [data-theme-mode="dark"]) *:not([data-theme-mode="light"] *), [data-theme-mode="light"] :is(.dark, [data-theme="dark"], [data-theme-mode="dark"]) *:not([data-theme-mode="light"] :is(.dark, [data-theme="dark"], [data-theme-mode="dark"]) [data-theme-mode="light"] *)));
|
|
39
|
+
|
|
40
|
+
@theme inline {
|
|
41
|
+
--font-heading: var(--font-sans);
|
|
42
|
+
--color-sidebar-ring: var(--sidebar-ring);
|
|
43
|
+
--color-sidebar-border: var(--sidebar-border);
|
|
44
|
+
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
45
|
+
--color-sidebar-accent: var(--sidebar-accent);
|
|
46
|
+
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
47
|
+
--color-sidebar-primary: var(--sidebar-primary);
|
|
48
|
+
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
49
|
+
--color-sidebar: var(--sidebar);
|
|
50
|
+
--color-chart-5: var(--chart-5);
|
|
51
|
+
--color-chart-4: var(--chart-4);
|
|
52
|
+
--color-chart-3: var(--chart-3);
|
|
53
|
+
--color-chart-2: var(--chart-2);
|
|
54
|
+
--color-chart-1: var(--chart-1);
|
|
55
|
+
--color-ring: var(--ring);
|
|
56
|
+
--color-focus: var(--focus);
|
|
57
|
+
--color-input: var(--input);
|
|
58
|
+
--color-border: var(--border);
|
|
59
|
+
--color-destructive: var(--destructive);
|
|
60
|
+
--color-destructive-foreground: var(--destructive-foreground);
|
|
61
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
62
|
+
--color-accent: var(--accent);
|
|
63
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
64
|
+
--color-muted: var(--muted);
|
|
65
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
66
|
+
--color-secondary: var(--secondary);
|
|
67
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
68
|
+
--color-primary-hover: var(--primary-hover);
|
|
69
|
+
--color-primary: var(--primary);
|
|
70
|
+
--color-link: var(--link);
|
|
71
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
72
|
+
--color-popover: var(--popover);
|
|
73
|
+
--color-card-foreground: var(--card-foreground);
|
|
74
|
+
--color-card: var(--card);
|
|
75
|
+
--color-foreground: var(--foreground);
|
|
76
|
+
--color-background: var(--background);
|
|
77
|
+
--color-scrim: var(--scrim);
|
|
78
|
+
/* Status tones — three roles each (CI §3.3): the colour itself for fills,
|
|
79
|
+
dots, borders and icons (`bg-danger`, `border-danger`); a tint for
|
|
80
|
+
surfaces (`bg-danger-soft`, the text on it is the foreground); and the
|
|
81
|
+
TEXT colour of a tone on a plain surface (`text-danger-ink`, e.g. a
|
|
82
|
+
field error). Success and warning reach only 1.67:1 / 1.83:1 on white,
|
|
83
|
+
so their ink is the foreground. Figures never take a tone colour. */
|
|
84
|
+
--color-danger: var(--danger);
|
|
85
|
+
--color-danger-soft: var(--danger-soft);
|
|
86
|
+
--color-danger-ink: var(--danger-ink);
|
|
87
|
+
--color-warning: var(--warning);
|
|
88
|
+
--color-warning-soft: var(--warning-soft);
|
|
89
|
+
--color-warning-ink: var(--warning-ink);
|
|
90
|
+
--color-success: var(--success);
|
|
91
|
+
--color-success-soft: var(--success-soft);
|
|
92
|
+
--color-success-ink: var(--success-ink);
|
|
93
|
+
--color-info: var(--info);
|
|
94
|
+
--color-info-soft: var(--info-soft);
|
|
95
|
+
--color-info-ink: var(--info-ink);
|
|
96
|
+
/* Larger legacy steps keep deriving from the base `--radius`. */
|
|
97
|
+
--radius-xl: calc(var(--radius) * 1.4);
|
|
98
|
+
--radius-2xl: calc(var(--radius) * 1.8);
|
|
99
|
+
--radius-3xl: calc(var(--radius) * 2.2);
|
|
100
|
+
--radius-4xl: calc(var(--radius) * 2.6);
|
|
101
|
+
--default-transition-duration: var(--motion-fast);
|
|
102
|
+
--default-transition-timing-function: var(--ease);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/* Utilities whose role carries the utility's own name (`rounded-md` →
|
|
106
|
+
`var(--radius-md)`, `shadow-2` → `var(--shadow-2)`, `font-mono` →
|
|
107
|
+
`var(--font-mono)`). `reference` keeps Tailwind from emitting the
|
|
108
|
+
self-referencing theme variable; the roles below define the values. */
|
|
109
|
+
@theme inline reference {
|
|
110
|
+
--radius-sm: var(--radius-sm);
|
|
111
|
+
--radius-md: var(--radius-md);
|
|
112
|
+
--radius-lg: var(--radius-lg);
|
|
113
|
+
--radius-pill: var(--radius-pill);
|
|
114
|
+
--shadow-1: var(--shadow-1);
|
|
115
|
+
--shadow-2: var(--shadow-2);
|
|
116
|
+
--shadow-3: var(--shadow-3);
|
|
117
|
+
--font-sans: var(--font-sans);
|
|
118
|
+
--font-mono: var(--font-mono);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/* ── Mode-independent roles ───────────────────────────────────────────────── */
|
|
122
|
+
:root {
|
|
123
|
+
--radius: var(--cd-radius-md);
|
|
124
|
+
--radius-sm: var(--cd-radius-sm);
|
|
125
|
+
--radius-md: var(--cd-radius-md);
|
|
126
|
+
--radius-lg: var(--cd-radius-lg);
|
|
127
|
+
--radius-pill: var(--cd-radius-pill);
|
|
128
|
+
--shadow-1: var(--cd-shadow-1);
|
|
129
|
+
--shadow-2: var(--cd-shadow-2);
|
|
130
|
+
--shadow-3: var(--cd-shadow-3);
|
|
131
|
+
--motion-fast: var(--cd-motion-fast);
|
|
132
|
+
--motion-base: var(--cd-motion-base);
|
|
133
|
+
--motion-slow: var(--cd-motion-slow);
|
|
134
|
+
--ease: var(--cd-ease);
|
|
135
|
+
/* Geist first, then the host's font, then the system stack. Loading Geist
|
|
136
|
+
is opt-in (fonts.css or fontFaces()); where it is not loaded the next
|
|
137
|
+
family renders. A SEP-1865 host sends its font as --font-sans and
|
|
138
|
+
--font-mono, the same names as these roles: McpToolkitApp moves it to
|
|
139
|
+
--host-font-sans / --host-font-mono (adoptHostFontVariables), so it
|
|
140
|
+
fills the fallback slot instead of replacing the whole stack. A brand
|
|
141
|
+
sets --font-sans itself. */
|
|
142
|
+
--font-sans:
|
|
143
|
+
"Geist", "Geist Variable", var(--host-font-sans, ui-sans-serif), system-ui, sans-serif;
|
|
144
|
+
--font-mono:
|
|
145
|
+
"Geist Mono", "Geist Mono Variable", var(--host-font-mono, ui-monospace), SFMono-Regular, Menlo,
|
|
146
|
+
Consolas, monospace;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/* ── Light roles ──────────────────────────────────────────────────────────── */
|
|
150
|
+
/* Re-declared on a forced-light island only where it sits inside a dark
|
|
151
|
+
scope, so it stays light there. A light scope in a light document
|
|
152
|
+
re-declares nothing and inherits what the document set, a consumer's
|
|
153
|
+
`:root` brand included. `:where()` keeps the island selector at (0,1,0):
|
|
154
|
+
a brand rule on `[data-theme-mode="light"]` after this file still wins. */
|
|
155
|
+
:root,
|
|
156
|
+
:where(.dark, [data-theme="dark"], [data-theme-mode="dark"]) [data-theme-mode="light"] {
|
|
157
|
+
--background: var(--cd-weiss);
|
|
158
|
+
--foreground: var(--cd-schwarz);
|
|
159
|
+
--card: var(--cd-weiss);
|
|
160
|
+
--card-foreground: var(--cd-schwarz);
|
|
161
|
+
--popover: var(--cd-weiss);
|
|
162
|
+
--popover-foreground: var(--cd-schwarz);
|
|
163
|
+
--primary: var(--cd-blau);
|
|
164
|
+
--primary-foreground: var(--cd-weiss);
|
|
165
|
+
--primary-hover: var(--cd-blau-link);
|
|
166
|
+
--secondary: var(--cd-grau);
|
|
167
|
+
--secondary-foreground: var(--cd-schwarz);
|
|
168
|
+
--muted: var(--cd-grau);
|
|
169
|
+
--muted-foreground: var(--cd-text-leise);
|
|
170
|
+
--accent: var(--cd-info-soft);
|
|
171
|
+
--accent-foreground: var(--cd-blau-link);
|
|
172
|
+
--link: var(--cd-blau-link);
|
|
173
|
+
--destructive: var(--cd-danger);
|
|
174
|
+
--destructive-foreground: var(--cd-weiss);
|
|
175
|
+
--border: var(--cd-linie);
|
|
176
|
+
--input: var(--cd-kontur);
|
|
177
|
+
--ring: var(--cd-blau-link);
|
|
178
|
+
--focus: var(--cd-blau-link);
|
|
179
|
+
--success: var(--cd-success);
|
|
180
|
+
--success-soft: var(--cd-success-soft);
|
|
181
|
+
--success-ink: var(--cd-schwarz);
|
|
182
|
+
--warning: var(--cd-warning);
|
|
183
|
+
--warning-soft: var(--cd-warning-soft);
|
|
184
|
+
--warning-ink: var(--cd-schwarz);
|
|
185
|
+
--danger: var(--cd-danger);
|
|
186
|
+
--danger-soft: var(--cd-danger-soft);
|
|
187
|
+
--danger-ink: var(--cd-danger);
|
|
188
|
+
--info: var(--cd-info);
|
|
189
|
+
--info-soft: var(--cd-info-soft);
|
|
190
|
+
--info-ink: var(--cd-info);
|
|
191
|
+
--chart-1: var(--cd-blau);
|
|
192
|
+
--chart-2: var(--cd-gruen);
|
|
193
|
+
--chart-3: var(--cd-blau-hell);
|
|
194
|
+
--chart-4: var(--cd-kontur);
|
|
195
|
+
--chart-5: var(--cd-schwarz);
|
|
196
|
+
--sidebar: var(--cd-grau);
|
|
197
|
+
--sidebar-foreground: var(--cd-schwarz);
|
|
198
|
+
--sidebar-primary: var(--cd-blau);
|
|
199
|
+
--sidebar-primary-foreground: var(--cd-weiss);
|
|
200
|
+
--sidebar-accent: var(--cd-info-soft);
|
|
201
|
+
--sidebar-accent-foreground: var(--cd-blau-link);
|
|
202
|
+
--sidebar-border: var(--cd-linie);
|
|
203
|
+
--sidebar-ring: var(--cd-blau-link);
|
|
204
|
+
--scrim: color-mix(in srgb, var(--cd-schwarz) 42%, transparent);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/* ── Dark roles (CI dark-ground rules) ────────────────────────────────────── */
|
|
208
|
+
/* --cd-schwarz is the ground; quiet surfaces lift it with white. Text white,
|
|
209
|
+
links and accent text green, buttons stay blue with white text, focus
|
|
210
|
+
blau-hell, status in the -hell values WITHOUT tinted fills, quiet text
|
|
211
|
+
--cd-kontur. --cd-kontur keeps 4.5:1 only up to a 3 % lift, so the quiet
|
|
212
|
+
surfaces quiet text sits on (--muted, --sidebar) lift 3 %. The
|
|
213
|
+
hover/selected (--accent) and secondary surfaces lift 10 % to stay
|
|
214
|
+
visible; quiet text on them switches to their foreground (both pinned in
|
|
215
|
+
theme-css.test.ts). --popover stays on the ground: --cd-blau (a checked
|
|
216
|
+
Switch in a sheet) reaches 3:1 only there (3.08:1; 2.92:1 at a 2 % lift).
|
|
217
|
+
Overlays stand off the page by their border and a scrim that pushes the
|
|
218
|
+
page back harder than on light. A destructive action keeps the
|
|
219
|
+
--cd-danger fill: white on --cd-danger-hell is 2.79:1. */
|
|
220
|
+
.dark,
|
|
221
|
+
[data-theme="dark"],
|
|
222
|
+
[data-theme-mode="dark"] {
|
|
223
|
+
--background: var(--cd-schwarz);
|
|
224
|
+
--foreground: var(--cd-weiss);
|
|
225
|
+
--card: var(--cd-schwarz);
|
|
226
|
+
--card-foreground: var(--cd-weiss);
|
|
227
|
+
--popover: var(--cd-schwarz);
|
|
228
|
+
--popover-foreground: var(--cd-weiss);
|
|
229
|
+
--primary: var(--cd-blau);
|
|
230
|
+
--primary-foreground: var(--cd-weiss);
|
|
231
|
+
--primary-hover: var(--cd-blau-link);
|
|
232
|
+
--secondary: color-mix(in srgb, var(--cd-weiss) 10%, var(--cd-schwarz));
|
|
233
|
+
--secondary-foreground: var(--cd-weiss);
|
|
234
|
+
--muted: color-mix(in srgb, var(--cd-weiss) 3%, var(--cd-schwarz));
|
|
235
|
+
--muted-foreground: var(--cd-kontur);
|
|
236
|
+
--accent: color-mix(in srgb, var(--cd-weiss) 10%, var(--cd-schwarz));
|
|
237
|
+
--accent-foreground: var(--cd-weiss);
|
|
238
|
+
--link: var(--cd-gruen);
|
|
239
|
+
--destructive: var(--cd-danger);
|
|
240
|
+
--destructive-foreground: var(--cd-weiss);
|
|
241
|
+
--border: color-mix(in srgb, var(--cd-weiss) 14%, transparent);
|
|
242
|
+
--input: var(--cd-kontur);
|
|
243
|
+
--ring: var(--cd-blau-hell);
|
|
244
|
+
--focus: var(--cd-blau-hell);
|
|
245
|
+
--success: var(--cd-success-hell);
|
|
246
|
+
--success-soft: transparent;
|
|
247
|
+
--success-ink: var(--cd-success-hell);
|
|
248
|
+
--warning: var(--cd-warning-hell);
|
|
249
|
+
--warning-soft: transparent;
|
|
250
|
+
--warning-ink: var(--cd-warning-hell);
|
|
251
|
+
--danger: var(--cd-danger-hell);
|
|
252
|
+
--danger-soft: transparent;
|
|
253
|
+
--danger-ink: var(--cd-danger-hell);
|
|
254
|
+
--info: var(--cd-info-hell);
|
|
255
|
+
--info-soft: transparent;
|
|
256
|
+
--info-ink: var(--cd-info-hell);
|
|
257
|
+
--chart-1: var(--cd-blau-hell);
|
|
258
|
+
--chart-2: var(--cd-gruen);
|
|
259
|
+
--chart-3: var(--cd-blau);
|
|
260
|
+
--chart-4: var(--cd-kontur);
|
|
261
|
+
--chart-5: var(--cd-weiss);
|
|
262
|
+
--sidebar: color-mix(in srgb, var(--cd-weiss) 3%, var(--cd-schwarz));
|
|
263
|
+
--sidebar-foreground: var(--cd-weiss);
|
|
264
|
+
--sidebar-primary: var(--cd-blau);
|
|
265
|
+
--sidebar-primary-foreground: var(--cd-weiss);
|
|
266
|
+
--sidebar-accent: color-mix(in srgb, var(--cd-weiss) 10%, var(--cd-schwarz));
|
|
267
|
+
--sidebar-accent-foreground: var(--cd-weiss);
|
|
268
|
+
--sidebar-border: color-mix(in srgb, var(--cd-weiss) 14%, transparent);
|
|
269
|
+
--sidebar-ring: var(--cd-blau-hell);
|
|
270
|
+
--scrim: color-mix(in srgb, var(--cd-schwarz) 72%, transparent);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
@layer base {
|
|
274
|
+
*,
|
|
275
|
+
*::before,
|
|
276
|
+
*::after {
|
|
277
|
+
@apply border-border outline-focus;
|
|
278
|
+
}
|
|
279
|
+
html,
|
|
280
|
+
body {
|
|
281
|
+
@apply bg-background text-foreground;
|
|
282
|
+
}
|
|
283
|
+
/* An opaque focus ring (>= 3:1 in both modes) on every focusable element,
|
|
284
|
+
including raw <button>s. Components with their own ring (FOCUS_RING) win:
|
|
285
|
+
utilities are a later layer. */
|
|
286
|
+
:focus-visible {
|
|
287
|
+
outline: 2px solid var(--focus);
|
|
288
|
+
outline-offset: 2px;
|
|
289
|
+
}
|
|
290
|
+
/* Native controls and scrollbars follow the mode. Declared on <body> and
|
|
291
|
+
the mode scopes, never on <html>: a root color-scheme that differs from
|
|
292
|
+
the host's iframe element makes the browser paint an opaque canvas
|
|
293
|
+
behind the view, which mcp-use keeps transparent on purpose. */
|
|
294
|
+
body,
|
|
295
|
+
:where(body) [data-theme-mode="light"] {
|
|
296
|
+
color-scheme: light;
|
|
297
|
+
}
|
|
298
|
+
:is(.dark, [data-theme="dark"]) body,
|
|
299
|
+
body:is(.dark, [data-theme="dark"], [data-theme-mode="dark"]),
|
|
300
|
+
:where(body) :is(.dark, [data-theme="dark"], [data-theme-mode="dark"]) {
|
|
301
|
+
color-scheme: dark;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/* Reduced motion, always (modeler-tool-design §7). */
|
|
306
|
+
@media (prefers-reduced-motion: reduce) {
|
|
307
|
+
*,
|
|
308
|
+
*::before,
|
|
309
|
+
*::after {
|
|
310
|
+
animation-duration: 0.001ms !important;
|
|
311
|
+
animation-iteration-count: 1 !important;
|
|
312
|
+
transition-duration: 0.001ms !important;
|
|
313
|
+
}
|
|
314
|
+
}
|