@nocoo/basalt 3.2.0 → 3.2.4
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 +25 -19
- package/ai/COMPATIBILITY.md +41 -36
- package/ai/DESIGN.md +73 -56
- package/ai/INTEGRATION.md +819 -825
- package/ai/RECIPES.md +334 -135
- package/ai/USAGE.md +2 -2
- package/ai/registry.json +454 -97
- package/ai/sources.json +2 -2
- package/dist/assets/brand-mark.js +1 -2
- package/dist/charts/area.js +1 -2
- package/dist/charts/bar.js +1 -2
- package/dist/charts/bullet.js +1 -2
- package/dist/charts/chart-colors.js +1 -2
- package/dist/charts/charts.js +1 -2
- package/dist/charts/config.js +1 -2
- package/dist/charts/custom-chart.js +1 -2
- package/dist/charts/date-navigation.js +1 -2
- package/dist/charts/donut.js +1 -2
- package/dist/charts/frame.js +3 -4
- package/dist/charts/frame.js.map +1 -1
- package/dist/charts/funnel.js +1 -2
- package/dist/charts/gauge.js +1 -2
- package/dist/charts/grouped-bar.js +1 -2
- package/dist/charts/heatmap-calendar.js +7 -11
- package/dist/charts/heatmap-calendar.js.map +1 -1
- package/dist/charts/heatmap-matrix.js +4 -5
- package/dist/charts/heatmap-matrix.js.map +1 -1
- package/dist/charts/item-list.js +1 -2
- package/dist/charts/legend.js +1 -2
- package/dist/charts/line.js +1 -2
- package/dist/charts/palette.js +1 -2
- package/dist/charts/radar.js +1 -2
- package/dist/charts/sample.js +1 -2
- package/dist/charts/sankey.js +1 -2
- package/dist/charts/series.js +1 -2
- package/dist/charts/slot-bar.js +1 -2
- package/dist/charts/sparkline.js +1 -2
- package/dist/charts/stacked-bar.js +1 -2
- package/dist/charts/stat-card.js +1 -2
- package/dist/charts/timeline.js +1 -2
- package/dist/charts/timeseries.js +1 -2
- package/dist/charts/tooltip.js +31 -27
- package/dist/charts/tooltip.js.map +1 -1
- package/dist/components/accordion.js +1 -2
- package/dist/components/alert-dialog.js +1 -2
- package/dist/components/app-header.js +2 -3
- package/dist/components/app-header.js.map +1 -1
- package/dist/components/app-shell.js +2 -3
- package/dist/components/app-shell.js.map +1 -1
- package/dist/components/approval-card.js +1 -2
- package/dist/components/autocomplete.js +1 -2
- package/dist/components/avatar.js +1 -2
- package/dist/components/badge.js +1 -2
- package/dist/components/banner.js +1 -2
- package/dist/components/basalt-mark.js +1 -2
- package/dist/components/battery-meter.js +1 -2
- package/dist/components/breadcrumbs.js +1 -2
- package/dist/components/button.d.ts +1 -1
- package/dist/components/button.js +3 -3
- package/dist/components/button.js.map +1 -1
- package/dist/components/chat-bubble.js +1 -2
- package/dist/components/chat-composer.js +2 -3
- package/dist/components/chat-composer.js.map +1 -1
- package/dist/components/chat-header.js +1 -2
- package/dist/components/chat-inbox.js +1 -2
- package/dist/components/chat-markdown.js +1 -2
- package/dist/components/chat-message.js +2 -3
- package/dist/components/chat-message.js.map +1 -1
- package/dist/components/checkbox.js +1 -2
- package/dist/components/clipboard-text.js +1 -2
- package/dist/components/code.js +2 -3
- package/dist/components/code.js.map +1 -1
- package/dist/components/collapsible.js +1 -2
- package/dist/components/collapsible.js.map +1 -1
- package/dist/components/combobox.js +1 -2
- package/dist/components/command-palette.js +3 -4
- package/dist/components/command-palette.js.map +1 -1
- package/dist/components/confirm-dialog.js +3 -12
- package/dist/components/confirm-dialog.js.map +1 -1
- package/dist/components/context-cards.js +2 -3
- package/dist/components/context-cards.js.map +1 -1
- package/dist/components/context-menu.js +2 -3
- package/dist/components/context-menu.js.map +1 -1
- package/dist/components/data-table.js +129 -131
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/date-picker.js +7 -18
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/delete-resource.js +1 -2
- package/dist/components/description-list.js +1 -2
- package/dist/components/dialog.js +1 -2
- package/dist/components/diff-table.js +2 -3
- package/dist/components/diff-table.js.map +1 -1
- package/dist/components/dock.js +1 -2
- package/dist/components/dock.js.map +1 -1
- package/dist/components/dropdown-menu.js +2 -3
- package/dist/components/dropdown-menu.js.map +1 -1
- package/dist/components/editable-nav-item.js +3 -4
- package/dist/components/editable-nav-item.js.map +1 -1
- package/dist/components/empty.js +1 -2
- package/dist/components/fab.js +1 -2
- package/dist/components/field.js +1 -2
- package/dist/components/file-dropzone.js +2 -3
- package/dist/components/file-dropzone.js.map +1 -1
- package/dist/components/filter-bar.js +2 -3
- package/dist/components/filter-bar.js.map +1 -1
- package/dist/components/flow.js +1 -2
- package/dist/components/grid.js +1 -2
- package/dist/components/hover-card.js +1 -2
- package/dist/components/icon-picker.js +4 -5
- package/dist/components/icon-picker.js.map +1 -1
- package/dist/components/inline-editable.js +2 -3
- package/dist/components/inline-editable.js.map +1 -1
- package/dist/components/input-area.js +1 -2
- package/dist/components/input-group.js +4 -5
- package/dist/components/input-group.js.map +1 -1
- package/dist/components/input.js +1 -2
- package/dist/components/label.js +1 -2
- package/dist/components/layer-card.js +3 -3
- package/dist/components/layer-card.js.map +1 -1
- package/dist/components/link.js +2 -3
- package/dist/components/link.js.map +1 -1
- package/dist/components/loader.js +1 -2
- package/dist/components/loading-screen.js +1 -2
- package/dist/components/menu-bar.js +3 -4
- package/dist/components/menu-bar.js.map +1 -1
- package/dist/components/meter.js +1 -2
- package/dist/components/multi-select.js +2 -3
- package/dist/components/multi-select.js.map +1 -1
- package/dist/components/navigation-menu.js +1 -2
- package/dist/components/overlay.d.ts +3 -6
- package/dist/components/overlay.js +4 -5
- package/dist/components/overlay.js.map +1 -1
- package/dist/components/page-header.js +1 -2
- package/dist/components/pagination.js +1 -2
- package/dist/components/popover.js +1 -2
- package/dist/components/prompt-bar.js +1 -2
- package/dist/components/radio.js +2 -7
- package/dist/components/radio.js.map +1 -1
- package/dist/components/recommendation-card.js +1 -2
- package/dist/components/resource-list.js +1 -2
- package/dist/components/responsive-master-detail.js +3 -4
- package/dist/components/responsive-master-detail.js.map +1 -1
- package/dist/components/scroll-area.js +2 -3
- package/dist/components/scroll-area.js.map +1 -1
- package/dist/components/section-rule.js +1 -2
- package/dist/components/segment-control.js +2 -3
- package/dist/components/segment-control.js.map +1 -1
- package/dist/components/select.js +2 -3
- package/dist/components/select.js.map +1 -1
- package/dist/components/sensitive-input.js +2 -3
- package/dist/components/sensitive-input.js.map +1 -1
- package/dist/components/separator.js +1 -2
- package/dist/components/sheet.js +1 -2
- package/dist/components/sidebar.d.ts +53 -19
- package/dist/components/sidebar.js +201 -100
- package/dist/components/sidebar.js.map +1 -1
- package/dist/components/skeleton-line.js +1 -2
- package/dist/components/slider.js +1 -2
- package/dist/components/stat-strip.js +1 -2
- package/dist/components/switch.js +1 -2
- package/dist/components/table-of-contents.js +1 -2
- package/dist/components/table-pager.js +1 -2
- package/dist/components/table.js +2 -3
- package/dist/components/table.js.map +1 -1
- package/dist/components/tabs.js +2 -3
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/tag-badge.js +1 -2
- package/dist/components/tag-color-picker.js +3 -4
- package/dist/components/tag-color-picker.js.map +1 -1
- package/dist/components/text.js +1 -2
- package/dist/components/theme-toggle.js +1 -2
- package/dist/components/thinking.js +1 -2
- package/dist/components/toast.js +2 -3
- package/dist/components/toast.js.map +1 -1
- package/dist/components/toggle-group.js +1 -2
- package/dist/components/toggle.js +1 -2
- package/dist/components/tool-chips.js +1 -2
- package/dist/components/toolbar.js +9 -10
- package/dist/components/toolbar.js.map +1 -1
- package/dist/components/tooltip.js +1 -2
- package/dist/components/typeahead-field.js +6 -21
- package/dist/components/typeahead-field.js.map +1 -1
- package/dist/components/upload-queue.js +1 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +11 -11
- package/dist/models/agent-feedback.js +1 -2
- package/dist/models/avatar.js +1 -2
- package/dist/models/code.js +1 -2
- package/dist/models/context-cards.js +1 -2
- package/dist/models/diff-table.js +1 -2
- package/dist/models/recommendation.js +1 -2
- package/dist/providers/accent.js +2 -7
- package/dist/providers/accent.js.map +1 -1
- package/dist/providers/link.js +1 -2
- package/dist/providers/theme.js +2 -7
- package/dist/providers/theme.js.map +1 -1
- package/dist/styles/base.css +71 -0
- package/dist/styles/standalone.css +127 -98
- package/dist/styles/tailwind.css +10 -2
- package/dist/styles/tokens.css +55 -7
- package/dist/utils/cn.js +1 -2
- package/dist/utils/control-surface.js +1 -2
- package/dist/utils/navigation.d.ts +2 -2
- package/dist/utils/navigation.js +2 -3
- package/dist/utils/navigation.js.map +1 -1
- package/dist/utils/preference-store.js +1 -2
- package/dist/utils/selection-indicator.js +1 -2
- package/dist/utils/use-checkable-group.js +1 -2
- package/dist/utils/use-hover-highlight.js +2 -3
- package/dist/utils/use-hover-highlight.js.map +1 -1
- package/dist/viewmodels/use-approval-card.js +11 -13
- package/dist/viewmodels/use-approval-card.js.map +1 -1
- package/dist/viewmodels/use-chat-composer.js +1 -2
- package/dist/viewmodels/use-chat-message.js +1 -2
- package/dist/viewmodels/use-code-block.js +1 -2
- package/dist/viewmodels/use-code-block.js.map +1 -1
- package/dist/viewmodels/use-context-cards.js +1 -2
- package/dist/viewmodels/use-diff-table.js +1 -2
- package/dist/viewmodels/use-diff-table.js.map +1 -1
- package/dist/viewmodels/use-loader.js +1 -2
- package/dist/viewmodels/use-recommendation-card.js +1 -2
- package/dist/viewmodels/use-recommendation-card.js.map +1 -1
- package/dist/viewmodels/use-thinking.js +1 -2
- package/dist/viewmodels/use-tool-chips.js +1 -2
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accent.js","names":["ACCENT_SWATCHES","LEGACY_ACCENT_IDS","DEFAULT_ACCENT_ID","STORAGE_KEY","AccentContext","createContext","accentSwatchById","normalized","id","swatch","channel","c","parseHslChannels","hue","sat","light","hsl","hslToRgbChannels","k","n","h","a","s","l","f","relativeLuminance","rgb","wcagContrast","lA","rgbA","lB","rgbB","DARK_TEXT_RGB","WHITE_TEXT_RGB","LIGHT_SURFACES_RGB","DARK_SURFACES_RGB","compositeRgb","top","bottom","deriveSemanticPrimary","origL","dark","targetSurfaces","foreground","start","bg","hoverOk","accentForeground","contrastWhite","applyAccent","applySwatch","semanticPrimary","root","isValidAccentId","value","validHsl","isDarkMode","AccentProvider","controlledAccent","isControlled","swatches","useMemo","override","paletteOverrides","store","useState","createPreferenceStore","defaultAccent","storageKey","persist","getServerSnapshot","useCallback","storeAccent","useSyncExternalStore","currentAccent","applyToDocument","apply","observer","setAccent","validId","next","onAccentChange","useAccent","ctx","useContext"],"sources":["../../src/providers/accent.tsx"],"sourcesContent":["import {\n\tcreateContext,\n\ttype ReactNode,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseState,\n\tuseSyncExternalStore,\n} from \"react\";\nimport { createPreferenceStore } from \"../utils/preference-store\";\n\nexport type AccentSwatch = {\n\tid: string;\n\tlabel: string;\n\ttoken: string;\n\tlight: string;\n\tdark: string;\n};\n\n/** Twelve candy accents inspired by the translucent iMac and iPhone 5C finishes. */\nexport const ACCENT_SWATCHES: readonly AccentSwatch[] = [\n\t{\n\t\tid: \"primary\",\n\t\tlabel: \"Blue\",\n\t\ttoken: \"--basalt-accent-1\",\n\t\tlight: \"204 88% 62%\",\n\t\tdark: \"204 90% 70%\",\n\t},\n\t{\n\t\tid: \"sky\",\n\t\tlabel: \"Ice\",\n\t\ttoken: \"--basalt-accent-2\",\n\t\tlight: \"191 79% 70%\",\n\t\tdark: \"191 79% 74%\",\n\t},\n\t{\n\t\tid: \"teal\",\n\t\tlabel: \"Bondi\",\n\t\ttoken: \"--basalt-accent-3\",\n\t\tlight: \"182 62% 47%\",\n\t\tdark: \"182 62% 63%\",\n\t},\n\t{\n\t\tid: \"green\",\n\t\tlabel: \"Green\",\n\t\ttoken: \"--basalt-accent-4\",\n\t\tlight: \"113 58% 62%\",\n\t\tdark: \"113 58% 70%\",\n\t},\n\t{\n\t\tid: \"lime\",\n\t\tlabel: \"Lime\",\n\t\ttoken: \"--basalt-accent-5\",\n\t\tlight: \"79 70% 64%\",\n\t\tdark: \"79 70% 70%\",\n\t},\n\t{\n\t\tid: \"amber\",\n\t\tlabel: \"Yellow\",\n\t\ttoken: \"--basalt-accent-6\",\n\t\tlight: \"49 100% 69%\",\n\t\tdark: \"49 100% 73%\",\n\t},\n\t{\n\t\tid: \"orange\",\n\t\tlabel: \"Tangerine\",\n\t\ttoken: \"--basalt-accent-7\",\n\t\tlight: \"27 95% 65%\",\n\t\tdark: \"27 95% 72%\",\n\t},\n\t{\n\t\tid: \"red\",\n\t\tlabel: \"Strawberry\",\n\t\ttoken: \"--basalt-accent-8\",\n\t\tlight: \"5 85% 66%\",\n\t\tdark: \"5 85% 73%\",\n\t},\n\t{\n\t\tid: \"rose\",\n\t\tlabel: \"Pink\",\n\t\ttoken: \"--basalt-accent-9\",\n\t\tlight: \"345 88% 72%\",\n\t\tdark: \"345 88% 77%\",\n\t},\n\t{\n\t\tid: \"purple\",\n\t\tlabel: \"Grape\",\n\t\ttoken: \"--basalt-accent-10\",\n\t\tlight: \"280 53% 71%\",\n\t\tdark: \"280 53% 77%\",\n\t},\n\t{\n\t\tid: \"indigo\",\n\t\tlabel: \"Blueberry\",\n\t\ttoken: \"--basalt-accent-11\",\n\t\tlight: \"237 66% 69%\",\n\t\tdark: \"237 66% 77%\",\n\t},\n\t{\n\t\tid: \"gray\",\n\t\tlabel: \"Pearl\",\n\t\ttoken: \"--basalt-accent-12\",\n\t\tlight: \"210 20% 87%\",\n\t\tdark: \"210 20% 88%\",\n\t},\n];\n\nconst LEGACY_ACCENT_IDS = new Map<string, string>([\n\t[\"jade\", \"teal\"],\n\t[\"vermilion\", \"red\"],\n\t[\"magenta\", \"rose\"],\n\t[\"orchid\", \"purple\"],\n\t[\"cobalt\", \"indigo\"],\n\t[\"steel\", \"primary\"],\n\t[\"cadet\", \"sky\"],\n\t[\"seafoam\", \"teal\"],\n\t[\"olive\", \"lime\"],\n\t[\"gold\", \"amber\"],\n\t[\"tangerine\", \"orange\"],\n\t[\"crimson\", \"red\"],\n]);\n\nexport const DEFAULT_ACCENT_ID = \"primary\";\nconst STORAGE_KEY = \"basalt-accent\";\n\ntype AccentContextValue = {\n\taccent: string;\n\tsetAccent: (id: string) => void;\n\tswatches: readonly AccentSwatch[];\n};\n\nconst AccentContext = createContext<AccentContextValue | null>(null);\n\nexport function accentSwatchById(id: string | null | undefined): AccentSwatch {\n\tconst normalized = LEGACY_ACCENT_IDS.get(id ?? \"\") ?? id;\n\treturn ACCENT_SWATCHES.find((swatch) => swatch.id === normalized) ?? ACCENT_SWATCHES[0];\n}\n\nfunction channel(c: number) {\n\treturn c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n}\n\nfunction parseHslChannels(hsl: string): [number, number, number] {\n\tconst [hue, sat, light] = hsl.trim().split(/\\s+/);\n\tconst h = Number(hue);\n\tconst s = Number(sat.replace(\"%\", \"\")) / 100;\n\tconst l = Number(light.replace(\"%\", \"\")) / 100;\n\treturn [h, s, l];\n}\n\nfunction hslToRgbChannels(h: number, s: number, l: number): [number, number, number] {\n\tconst k = (n: number) => (n + h / 30) % 12;\n\tconst a = s * Math.min(l, 1 - l);\n\tconst f = (n: number) => l - a * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1)));\n\treturn [255 * f(0), 255 * f(8), 255 * f(4)];\n}\n\nfunction relativeLuminance(rgb: [number, number, number]): number {\n\treturn (\n\t\t0.2126 * channel(rgb[0] / 255) + 0.7152 * channel(rgb[1] / 255) + 0.0722 * channel(rgb[2] / 255)\n\t);\n}\n\nfunction wcagContrast(rgbA: [number, number, number], rgbB: [number, number, number]): number {\n\tconst lA = relativeLuminance(rgbA);\n\tconst lB = relativeLuminance(rgbB);\n\treturn (Math.max(lA, lB) + 0.05) / (Math.min(lA, lB) + 0.05);\n}\n\nconst DARK_TEXT_RGB: [number, number, number] = [26, 26, 26]; // 0 0% 10%\nconst WHITE_TEXT_RGB: [number, number, number] = [255, 255, 255]; // 0 0% 100%\n\nconst LIGHT_SURFACES_RGB: [number, number, number][] = [\n\t[238, 239, 242], // background\n\t[246, 247, 248], // card\n\t[252, 252, 253], // secondary\n\t[255, 255, 255], // bright\n];\n\nconst DARK_SURFACES_RGB: [number, number, number][] = [\n\t[23, 23, 23], // background\n\t[27, 27, 27], // card\n\t[31, 31, 31], // secondary\n\t[36, 36, 36], // bright\n];\n\nfunction compositeRgb(\n\ttop: [number, number, number, number],\n\tbottom: [number, number, number],\n): [number, number, number] {\n\treturn [\n\t\ttop[0] * top[3] + bottom[0] * (1 - top[3]),\n\t\ttop[1] * top[3] + bottom[1] * (1 - top[3]),\n\t\ttop[2] * top[3] + bottom[2] * (1 - top[3]),\n\t];\n}\n\nfunction deriveSemanticPrimary(swatch: AccentSwatch, dark: boolean): string {\n\tconst [h, s, origL] = parseHslChannels(dark ? swatch.dark : swatch.light);\n\tconst targetSurfaces = dark ? DARK_SURFACES_RGB : LIGHT_SURFACES_RGB;\n\tconst foreground = dark ? DARK_TEXT_RGB : WHITE_TEXT_RGB;\n\tconst start = dark\n\t\t? Math.max(Math.round(origL * 100), 45)\n\t\t: Math.min(Math.round(origL * 100), 60);\n\n\tfor (let l = start; dark ? l <= 85 : l >= 15; l += dark ? 1 : -1) {\n\t\tconst rgb = hslToRgbChannels(h, s, l / 100);\n\t\tconst minTextR = Math.min(...targetSurfaces.map((bg) => wcagContrast(rgb, bg)));\n\t\tif (minTextR < 4.55) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (wcagContrast(rgb, foreground) < 4.55) {\n\t\t\tcontinue;\n\t\t}\n\t\tlet hoverOk = true;\n\t\tfor (const bg of targetSurfaces) {\n\t\t\tconst hoverBg = compositeRgb([...rgb, 0.9], bg);\n\t\t\tif (wcagContrast(hoverBg, foreground) < 4.55) {\n\t\t\t\thoverOk = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (hoverOk) {\n\t\t\treturn `${h} ${Math.round(s * 100)}% ${l}%`;\n\t\t}\n\t}\n\treturn dark ? swatch.dark : swatch.light;\n}\n\nexport function accentForeground(hsl: string) {\n\tconst [h, s, l] = parseHslChannels(hsl);\n\tconst rgb = hslToRgbChannels(h, s, l);\n\tconst contrastWhite = wcagContrast(rgb, WHITE_TEXT_RGB);\n\tconst contrastDark = wcagContrast(rgb, DARK_TEXT_RGB);\n\treturn contrastDark >= contrastWhite ? (\"0 0% 10%\" as const) : (\"0 0% 100%\" as const);\n}\n\nexport function applyAccent(id: string, dark = false) {\n\tif (typeof document === \"undefined\") {\n\t\treturn;\n\t}\n\tapplySwatch(accentSwatchById(id), dark);\n}\n\nfunction applySwatch(swatch: AccentSwatch, dark: boolean) {\n\tconst semanticPrimary = deriveSemanticPrimary(swatch, dark);\n\tconst root = document.documentElement;\n\troot.style.setProperty(\"--basalt-primary\", semanticPrimary);\n\troot.style.setProperty(\"--basalt-primary-foreground\", accentForeground(semanticPrimary));\n\troot.style.setProperty(\"--basalt-ring\", semanticPrimary);\n\troot.dataset.accent = swatch.id;\n}\n\nexport interface AccentProviderProps {\n\t/** Color overrides for the twelve preset IDs, using HSL channels (for example `204 88% 62%`).\n\t * Invalid pairs and unknown IDs are ignored. Persistence belongs to the application.\n\t * Chart colors remain fixed. */\n\tpaletteOverrides?: Readonly<Record<string, { light: string; dark: string }>>;\n\t/**\n\t * Application components wrapped by the accent context.\n\t */\n\tchildren: ReactNode;\n\t/**\n\t * Storage key used for accent persistence.\n\t * @default \"basalt-accent\"\n\t */\n\tstorageKey?: string;\n\t/**\n\t * Initial accent identifier used when no stored preference exists or during SSR.\n\t * @default \"primary\"\n\t */\n\tdefaultAccent?: string;\n\t/**\n\t * Whether to persist accent changes to localStorage.\n\t * If false, localStorage is never read or written.\n\t * @default true\n\t */\n\tpersist?: boolean;\n\t/**\n\t * Controlled accent identifier. When provided, the provider acts as a controlled component\n\t * and internal state is driven by this prop.\n\t */\n\taccent?: string;\n\t/**\n\t * Callback fired when accent change is requested.\n\t * In controlled mode, callers are responsible for updating `accent`.\n\t */\n\tonAccentChange?: (accent: string) => void;\n\t/**\n\t * Whether to apply accent CSS variables and data-accent attribute to document.documentElement.\n\t * Set to false when a host theme system manages CSS variables directly.\n\t * @default true\n\t */\n\tapplyToDocument?: boolean;\n}\n\nfunction isValidAccentId(value: unknown): value is string {\n\treturn (\n\t\ttypeof value === \"string\" &&\n\t\t(ACCENT_SWATCHES.some((s) => s.id === value) || LEGACY_ACCENT_IDS.has(value))\n\t);\n}\n\nfunction validHsl(value: unknown): value is string {\n\tif (typeof value !== \"string\" || !/^\\d+(?:\\.\\d+)?\\s+\\d+(?:\\.\\d+)?%\\s+\\d+(?:\\.\\d+)?%$/.test(value))\n\t\treturn false;\n\tconst [h, s, l] = parseHslChannels(value);\n\treturn h <= 360 && s <= 1 && l <= 1;\n}\n\nfunction isDarkMode(): boolean {\n\tif (typeof document === \"undefined\") {\n\t\treturn false;\n\t}\n\treturn document.documentElement.classList.contains(\"dark\");\n}\n\nexport function AccentProvider({\n\tchildren,\n\tpaletteOverrides,\n\tstorageKey = STORAGE_KEY,\n\tdefaultAccent = DEFAULT_ACCENT_ID,\n\tpersist = true,\n\taccent: controlledAccent,\n\tonAccentChange,\n\tapplyToDocument = true,\n}: AccentProviderProps) {\n\tconst isControlled = controlledAccent !== undefined;\n\tconst swatches = useMemo(\n\t\t() =>\n\t\t\tACCENT_SWATCHES.map((swatch) => {\n\t\t\t\tconst override = paletteOverrides?.[swatch.id];\n\t\t\t\treturn override && validHsl(override.light) && validHsl(override.dark)\n\t\t\t\t\t? { ...swatch, light: override.light, dark: override.dark }\n\t\t\t\t\t: swatch;\n\t\t\t}),\n\t\t[paletteOverrides],\n\t);\n\n\tconst [store] = useState(() =>\n\t\tcreatePreferenceStore({\n\t\t\tstorageKey,\n\t\t\tdefaultValue: defaultAccent,\n\t\t\tpersist,\n\t\t\tisValid: isValidAccentId,\n\t\t\tnormalize: (value) => accentSwatchById(value).id,\n\t\t\teventName: \"basalt:accent-change\",\n\t\t}),\n\t);\n\n\tuseEffect(() => {\n\t\tstore.updateConfig({ storageKey, defaultValue: defaultAccent, persist });\n\t}, [store, storageKey, defaultAccent, persist]);\n\n\tconst getServerSnapshot = useCallback(() => accentSwatchById(defaultAccent).id, [defaultAccent]);\n\n\tconst storeAccent = useSyncExternalStore(store.subscribe, store.getSnapshot, getServerSnapshot);\n\n\tconst currentAccent = isControlled ? accentSwatchById(controlledAccent).id : storeAccent;\n\n\tuseEffect(() => {\n\t\tif (!applyToDocument || typeof document === \"undefined\") {\n\t\t\treturn;\n\t\t}\n\t\tconst apply = () => {\n\t\t\tconst dark = isDarkMode();\n\t\t\tfor (const swatch of swatches)\n\t\t\t\tdocument.documentElement.style.setProperty(swatch.token, dark ? swatch.dark : swatch.light);\n\t\t\tapplySwatch(swatches.find((swatch) => swatch.id === currentAccent) ?? swatches[0], dark);\n\t\t};\n\t\tapply();\n\t\tconst observer = new MutationObserver(apply);\n\t\tobserver.observe(document.documentElement, { attributes: true, attributeFilter: [\"class\"] });\n\t\treturn () => observer.disconnect();\n\t}, [currentAccent, applyToDocument, swatches]);\n\n\tconst setAccent = useCallback(\n\t\t(next: string) => {\n\t\t\tconst validId = accentSwatchById(next).id;\n\t\t\tif (isControlled) {\n\t\t\t\tonAccentChange?.(validId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstore.setValue(validId);\n\t\t\tonAccentChange?.(validId);\n\t\t},\n\t\t[isControlled, onAccentChange, store],\n\t);\n\n\tconst value = useMemo(\n\t\t() => ({ accent: currentAccent, setAccent, swatches }),\n\t\t[currentAccent, setAccent, swatches],\n\t);\n\treturn <AccentContext.Provider value={value}>{children}</AccentContext.Provider>;\n}\n\nexport function useAccent() {\n\tconst ctx = useContext(AccentContext);\n\tif (!ctx) {\n\t\tthrow new Error(\"useAccent must be used within AccentProvider\");\n\t}\n\treturn ctx;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"accent.js","names":["ACCENT_SWATCHES","LEGACY_ACCENT_IDS","DEFAULT_ACCENT_ID","STORAGE_KEY","AccentContext","createContext","accentSwatchById","normalized","id","swatch","channel","c","parseHslChannels","hue","sat","light","hsl","hslToRgbChannels","k","n","h","a","s","l","f","relativeLuminance","rgb","wcagContrast","lA","rgbA","lB","rgbB","DARK_TEXT_RGB","WHITE_TEXT_RGB","LIGHT_SURFACES_RGB","DARK_SURFACES_RGB","compositeRgb","top","bottom","deriveSemanticPrimary","origL","dark","targetSurfaces","foreground","start","bg","hoverOk","accentForeground","contrastWhite","applyAccent","applySwatch","semanticPrimary","root","isValidAccentId","value","validHsl","isDarkMode","AccentProvider","controlledAccent","isControlled","swatches","useMemo","override","paletteOverrides","store","useState","createPreferenceStore","defaultAccent","storageKey","persist","getServerSnapshot","useCallback","storeAccent","useSyncExternalStore","currentAccent","applyToDocument","apply","observer","setAccent","validId","next","onAccentChange","useAccent","ctx","useContext"],"sources":["../../src/providers/accent.tsx"],"sourcesContent":["import {\n\tcreateContext,\n\ttype ReactNode,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseState,\n\tuseSyncExternalStore,\n} from \"react\";\nimport { createPreferenceStore } from \"../utils/preference-store\";\n\nexport type AccentSwatch = {\n\tid: string;\n\tlabel: string;\n\ttoken: string;\n\tlight: string;\n\tdark: string;\n};\n\n/** Twelve candy accents inspired by the translucent iMac and iPhone 5C finishes. */\nexport const ACCENT_SWATCHES: readonly AccentSwatch[] = [\n\t{\n\t\tid: \"primary\",\n\t\tlabel: \"Blue\",\n\t\ttoken: \"--basalt-accent-1\",\n\t\tlight: \"204 88% 62%\",\n\t\tdark: \"204 90% 70%\",\n\t},\n\t{\n\t\tid: \"sky\",\n\t\tlabel: \"Ice\",\n\t\ttoken: \"--basalt-accent-2\",\n\t\tlight: \"191 79% 70%\",\n\t\tdark: \"191 79% 74%\",\n\t},\n\t{\n\t\tid: \"teal\",\n\t\tlabel: \"Bondi\",\n\t\ttoken: \"--basalt-accent-3\",\n\t\tlight: \"182 62% 47%\",\n\t\tdark: \"182 62% 63%\",\n\t},\n\t{\n\t\tid: \"green\",\n\t\tlabel: \"Green\",\n\t\ttoken: \"--basalt-accent-4\",\n\t\tlight: \"113 58% 62%\",\n\t\tdark: \"113 58% 70%\",\n\t},\n\t{\n\t\tid: \"lime\",\n\t\tlabel: \"Lime\",\n\t\ttoken: \"--basalt-accent-5\",\n\t\tlight: \"79 70% 64%\",\n\t\tdark: \"79 70% 70%\",\n\t},\n\t{\n\t\tid: \"amber\",\n\t\tlabel: \"Yellow\",\n\t\ttoken: \"--basalt-accent-6\",\n\t\tlight: \"49 100% 69%\",\n\t\tdark: \"49 100% 73%\",\n\t},\n\t{\n\t\tid: \"orange\",\n\t\tlabel: \"Tangerine\",\n\t\ttoken: \"--basalt-accent-7\",\n\t\tlight: \"27 95% 65%\",\n\t\tdark: \"27 95% 72%\",\n\t},\n\t{\n\t\tid: \"red\",\n\t\tlabel: \"Strawberry\",\n\t\ttoken: \"--basalt-accent-8\",\n\t\tlight: \"5 85% 66%\",\n\t\tdark: \"5 85% 73%\",\n\t},\n\t{\n\t\tid: \"rose\",\n\t\tlabel: \"Pink\",\n\t\ttoken: \"--basalt-accent-9\",\n\t\tlight: \"345 88% 72%\",\n\t\tdark: \"345 88% 77%\",\n\t},\n\t{\n\t\tid: \"purple\",\n\t\tlabel: \"Grape\",\n\t\ttoken: \"--basalt-accent-10\",\n\t\tlight: \"280 53% 71%\",\n\t\tdark: \"280 53% 77%\",\n\t},\n\t{\n\t\tid: \"indigo\",\n\t\tlabel: \"Blueberry\",\n\t\ttoken: \"--basalt-accent-11\",\n\t\tlight: \"237 66% 69%\",\n\t\tdark: \"237 66% 77%\",\n\t},\n\t{\n\t\tid: \"gray\",\n\t\tlabel: \"Pearl\",\n\t\ttoken: \"--basalt-accent-12\",\n\t\tlight: \"210 20% 87%\",\n\t\tdark: \"210 20% 88%\",\n\t},\n];\n\nconst LEGACY_ACCENT_IDS = new Map<string, string>([\n\t[\"jade\", \"teal\"],\n\t[\"vermilion\", \"red\"],\n\t[\"magenta\", \"rose\"],\n\t[\"orchid\", \"purple\"],\n\t[\"cobalt\", \"indigo\"],\n\t[\"steel\", \"primary\"],\n\t[\"cadet\", \"sky\"],\n\t[\"seafoam\", \"teal\"],\n\t[\"olive\", \"lime\"],\n\t[\"gold\", \"amber\"],\n\t[\"tangerine\", \"orange\"],\n\t[\"crimson\", \"red\"],\n]);\n\nexport const DEFAULT_ACCENT_ID = \"primary\";\nconst STORAGE_KEY = \"basalt-accent\";\n\ntype AccentContextValue = {\n\taccent: string;\n\tsetAccent: (id: string) => void;\n\tswatches: readonly AccentSwatch[];\n};\n\nconst AccentContext = createContext<AccentContextValue | null>(null);\n\nexport function accentSwatchById(id: string | null | undefined): AccentSwatch {\n\tconst normalized = LEGACY_ACCENT_IDS.get(id ?? \"\") ?? id;\n\treturn ACCENT_SWATCHES.find((swatch) => swatch.id === normalized) ?? ACCENT_SWATCHES[0];\n}\n\nfunction channel(c: number) {\n\treturn c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n}\n\nfunction parseHslChannels(hsl: string): [number, number, number] {\n\tconst [hue, sat, light] = hsl.trim().split(/\\s+/);\n\tconst h = Number(hue);\n\tconst s = Number(sat.replace(\"%\", \"\")) / 100;\n\tconst l = Number(light.replace(\"%\", \"\")) / 100;\n\treturn [h, s, l];\n}\n\nfunction hslToRgbChannels(h: number, s: number, l: number): [number, number, number] {\n\tconst k = (n: number) => (n + h / 30) % 12;\n\tconst a = s * Math.min(l, 1 - l);\n\tconst f = (n: number) => l - a * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1)));\n\treturn [255 * f(0), 255 * f(8), 255 * f(4)];\n}\n\nfunction relativeLuminance(rgb: [number, number, number]): number {\n\treturn (\n\t\t0.2126 * channel(rgb[0] / 255) + 0.7152 * channel(rgb[1] / 255) + 0.0722 * channel(rgb[2] / 255)\n\t);\n}\n\nfunction wcagContrast(rgbA: [number, number, number], rgbB: [number, number, number]): number {\n\tconst lA = relativeLuminance(rgbA);\n\tconst lB = relativeLuminance(rgbB);\n\treturn (Math.max(lA, lB) + 0.05) / (Math.min(lA, lB) + 0.05);\n}\n\nconst DARK_TEXT_RGB: [number, number, number] = [26, 26, 26]; // 0 0% 10%\nconst WHITE_TEXT_RGB: [number, number, number] = [255, 255, 255]; // 0 0% 100%\n\nconst LIGHT_SURFACES_RGB: [number, number, number][] = [\n\t[238, 239, 242], // background\n\t[246, 247, 248], // card\n\t[252, 252, 253], // secondary\n\t[255, 255, 255], // bright\n];\n\nconst DARK_SURFACES_RGB: [number, number, number][] = [\n\t[23, 23, 23], // background\n\t[27, 27, 27], // card\n\t[31, 31, 31], // secondary\n\t[36, 36, 36], // bright\n];\n\nfunction compositeRgb(\n\ttop: [number, number, number, number],\n\tbottom: [number, number, number],\n): [number, number, number] {\n\treturn [\n\t\ttop[0] * top[3] + bottom[0] * (1 - top[3]),\n\t\ttop[1] * top[3] + bottom[1] * (1 - top[3]),\n\t\ttop[2] * top[3] + bottom[2] * (1 - top[3]),\n\t];\n}\n\nfunction deriveSemanticPrimary(swatch: AccentSwatch, dark: boolean): string {\n\tconst [h, s, origL] = parseHslChannels(dark ? swatch.dark : swatch.light);\n\tconst targetSurfaces = dark ? DARK_SURFACES_RGB : LIGHT_SURFACES_RGB;\n\tconst foreground = dark ? DARK_TEXT_RGB : WHITE_TEXT_RGB;\n\tconst start = dark\n\t\t? Math.max(Math.round(origL * 100), 45)\n\t\t: Math.min(Math.round(origL * 100), 60);\n\n\tfor (let l = start; dark ? l <= 85 : l >= 15; l += dark ? 1 : -1) {\n\t\tconst rgb = hslToRgbChannels(h, s, l / 100);\n\t\tconst minTextR = Math.min(...targetSurfaces.map((bg) => wcagContrast(rgb, bg)));\n\t\tif (minTextR < 4.55) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (wcagContrast(rgb, foreground) < 4.55) {\n\t\t\tcontinue;\n\t\t}\n\t\tlet hoverOk = true;\n\t\tfor (const bg of targetSurfaces) {\n\t\t\tconst hoverBg = compositeRgb([...rgb, 0.9], bg);\n\t\t\tif (wcagContrast(hoverBg, foreground) < 4.55) {\n\t\t\t\thoverOk = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (hoverOk) {\n\t\t\treturn `${h} ${Math.round(s * 100)}% ${l}%`;\n\t\t}\n\t}\n\treturn dark ? swatch.dark : swatch.light;\n}\n\nexport function accentForeground(hsl: string) {\n\tconst [h, s, l] = parseHslChannels(hsl);\n\tconst rgb = hslToRgbChannels(h, s, l);\n\tconst contrastWhite = wcagContrast(rgb, WHITE_TEXT_RGB);\n\tconst contrastDark = wcagContrast(rgb, DARK_TEXT_RGB);\n\treturn contrastDark >= contrastWhite ? (\"0 0% 10%\" as const) : (\"0 0% 100%\" as const);\n}\n\nexport function applyAccent(id: string, dark = false) {\n\tif (typeof document === \"undefined\") {\n\t\treturn;\n\t}\n\tapplySwatch(accentSwatchById(id), dark);\n}\n\nfunction applySwatch(swatch: AccentSwatch, dark: boolean) {\n\tconst semanticPrimary = deriveSemanticPrimary(swatch, dark);\n\tconst root = document.documentElement;\n\troot.style.setProperty(\"--basalt-primary\", semanticPrimary);\n\troot.style.setProperty(\"--basalt-primary-foreground\", accentForeground(semanticPrimary));\n\troot.style.setProperty(\"--basalt-ring\", semanticPrimary);\n\troot.dataset.accent = swatch.id;\n}\n\nexport interface AccentProviderProps {\n\t/** Color overrides for the twelve preset IDs, using HSL channels (for example `204 88% 62%`).\n\t * Invalid pairs and unknown IDs are ignored. Persistence belongs to the application.\n\t * Chart colors remain fixed. */\n\tpaletteOverrides?: Readonly<Record<string, { light: string; dark: string }>>;\n\t/**\n\t * Application components wrapped by the accent context.\n\t */\n\tchildren: ReactNode;\n\t/**\n\t * Storage key used for accent persistence.\n\t * @default \"basalt-accent\"\n\t */\n\tstorageKey?: string;\n\t/**\n\t * Initial accent identifier used when no stored preference exists or during SSR.\n\t * @default \"primary\"\n\t */\n\tdefaultAccent?: string;\n\t/**\n\t * Whether to persist accent changes to localStorage.\n\t * If false, localStorage is never read or written.\n\t * @default true\n\t */\n\tpersist?: boolean;\n\t/**\n\t * Controlled accent identifier. When provided, the provider acts as a controlled component\n\t * and internal state is driven by this prop.\n\t */\n\taccent?: string;\n\t/**\n\t * Callback fired when accent change is requested.\n\t * In controlled mode, callers are responsible for updating `accent`.\n\t */\n\tonAccentChange?: (accent: string) => void;\n\t/**\n\t * Whether to apply accent CSS variables and data-accent attribute to document.documentElement.\n\t * Set to false when a host theme system manages CSS variables directly.\n\t * @default true\n\t */\n\tapplyToDocument?: boolean;\n}\n\nfunction isValidAccentId(value: unknown): value is string {\n\treturn (\n\t\ttypeof value === \"string\" &&\n\t\t(ACCENT_SWATCHES.some((s) => s.id === value) || LEGACY_ACCENT_IDS.has(value))\n\t);\n}\n\nfunction validHsl(value: unknown): value is string {\n\tif (typeof value !== \"string\" || !/^\\d+(?:\\.\\d+)?\\s+\\d+(?:\\.\\d+)?%\\s+\\d+(?:\\.\\d+)?%$/.test(value))\n\t\treturn false;\n\tconst [h, s, l] = parseHslChannels(value);\n\treturn h <= 360 && s <= 1 && l <= 1;\n}\n\nfunction isDarkMode(): boolean {\n\tif (typeof document === \"undefined\") {\n\t\treturn false;\n\t}\n\treturn document.documentElement.classList.contains(\"dark\");\n}\n\nexport function AccentProvider({\n\tchildren,\n\tpaletteOverrides,\n\tstorageKey = STORAGE_KEY,\n\tdefaultAccent = DEFAULT_ACCENT_ID,\n\tpersist = true,\n\taccent: controlledAccent,\n\tonAccentChange,\n\tapplyToDocument = true,\n}: AccentProviderProps) {\n\tconst isControlled = controlledAccent !== undefined;\n\tconst swatches = useMemo(\n\t\t() =>\n\t\t\tACCENT_SWATCHES.map((swatch) => {\n\t\t\t\tconst override = paletteOverrides?.[swatch.id];\n\t\t\t\treturn override && validHsl(override.light) && validHsl(override.dark)\n\t\t\t\t\t? { ...swatch, light: override.light, dark: override.dark }\n\t\t\t\t\t: swatch;\n\t\t\t}),\n\t\t[paletteOverrides],\n\t);\n\n\tconst [store] = useState(() =>\n\t\tcreatePreferenceStore({\n\t\t\tstorageKey,\n\t\t\tdefaultValue: defaultAccent,\n\t\t\tpersist,\n\t\t\tisValid: isValidAccentId,\n\t\t\tnormalize: (value) => accentSwatchById(value).id,\n\t\t\teventName: \"basalt:accent-change\",\n\t\t}),\n\t);\n\n\tuseEffect(() => {\n\t\tstore.updateConfig({ storageKey, defaultValue: defaultAccent, persist });\n\t}, [store, storageKey, defaultAccent, persist]);\n\n\tconst getServerSnapshot = useCallback(() => accentSwatchById(defaultAccent).id, [defaultAccent]);\n\n\tconst storeAccent = useSyncExternalStore(store.subscribe, store.getSnapshot, getServerSnapshot);\n\n\tconst currentAccent = isControlled ? accentSwatchById(controlledAccent).id : storeAccent;\n\n\tuseEffect(() => {\n\t\tif (!applyToDocument || typeof document === \"undefined\") {\n\t\t\treturn;\n\t\t}\n\t\tconst apply = () => {\n\t\t\tconst dark = isDarkMode();\n\t\t\tfor (const swatch of swatches)\n\t\t\t\tdocument.documentElement.style.setProperty(swatch.token, dark ? swatch.dark : swatch.light);\n\t\t\tapplySwatch(swatches.find((swatch) => swatch.id === currentAccent) ?? swatches[0], dark);\n\t\t};\n\t\tapply();\n\t\tconst observer = new MutationObserver(apply);\n\t\tobserver.observe(document.documentElement, { attributes: true, attributeFilter: [\"class\"] });\n\t\treturn () => observer.disconnect();\n\t}, [currentAccent, applyToDocument, swatches]);\n\n\tconst setAccent = useCallback(\n\t\t(next: string) => {\n\t\t\tconst validId = accentSwatchById(next).id;\n\t\t\tif (isControlled) {\n\t\t\t\tonAccentChange?.(validId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstore.setValue(validId);\n\t\t\tonAccentChange?.(validId);\n\t\t},\n\t\t[isControlled, onAccentChange, store],\n\t);\n\n\tconst value = useMemo(\n\t\t() => ({ accent: currentAccent, setAccent, swatches }),\n\t\t[currentAccent, setAccent, swatches],\n\t);\n\treturn <AccentContext.Provider value={value}>{children}</AccentContext.Provider>;\n}\n\nexport function useAccent() {\n\tconst ctx = useContext(AccentContext);\n\tif (!ctx) {\n\t\tthrow new Error(\"useAccent must be used within AccentProvider\");\n\t}\n\treturn ctx;\n}\n"],"mappings":"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"}
|
package/dist/providers/link.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { createContext as e, useContext as t } from "react";
|
|
3
3
|
import { jsx as n } from "react/jsx-runtime";
|
|
4
|
-
|
|
4
|
+
// src/providers/link.tsx
|
|
5
5
|
var r = e("a");
|
|
6
6
|
function i({ render: e, children: t }) {
|
|
7
7
|
return /* @__PURE__ */ n(r.Provider, {
|
|
@@ -12,7 +12,6 @@ function i({ render: e, children: t }) {
|
|
|
12
12
|
function a() {
|
|
13
13
|
return t(r);
|
|
14
14
|
}
|
|
15
|
-
//#endregion
|
|
16
15
|
export { i as LinkProvider, a as useLinkComponent };
|
|
17
16
|
|
|
18
17
|
//# sourceMappingURL=link.js.map
|
package/dist/providers/theme.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { createPreferenceStore as e } from "../utils/preference-store.js";
|
|
3
3
|
import { createContext as t, useCallback as n, useContext as r, useEffect as i, useMemo as a, useState as o, useSyncExternalStore as s } from "react";
|
|
4
4
|
import { jsx as c } from "react/jsx-runtime";
|
|
5
|
-
|
|
5
|
+
// src/providers/theme.tsx
|
|
6
6
|
var l = "theme", u = t(null);
|
|
7
7
|
function d(e) {
|
|
8
8
|
if (typeof document > "u") return;
|
|
@@ -49,11 +49,7 @@ function p({ children: t, storageKey: r = l, defaultTheme: p = "system", persist
|
|
|
49
49
|
}
|
|
50
50
|
}, [S, _]);
|
|
51
51
|
let C = n((e) => {
|
|
52
|
-
|
|
53
|
-
g?.(e);
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
y.setValue(e), g?.(e);
|
|
52
|
+
v || y.setValue(e), g?.(e);
|
|
57
53
|
}, [
|
|
58
54
|
v,
|
|
59
55
|
g,
|
|
@@ -72,7 +68,6 @@ function m() {
|
|
|
72
68
|
if (!e) throw Error("useTheme must be used within ThemeProvider");
|
|
73
69
|
return e;
|
|
74
70
|
}
|
|
75
|
-
//#endregion
|
|
76
71
|
export { p as ThemeProvider, m as useTheme };
|
|
77
72
|
|
|
78
73
|
//# sourceMappingURL=theme.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.js","names":["STORAGE_KEY","ThemeContext","createContext","applyTheme","root","systemDark","dark","theme","isValidTheme","value","ThemeProvider","controlledTheme","isControlled","store","useState","createPreferenceStore","defaultTheme","storageKey","persist","getServerSnapshot","useCallback","storeTheme","useSyncExternalStore","currentTheme","applyToDocument","mq","onChange","setTheme","next","onThemeChange","useMemo","useTheme","ctx","useContext"],"sources":["../../src/providers/theme.tsx"],"sourcesContent":["import {\n\tcreateContext,\n\ttype ReactNode,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseState,\n\tuseSyncExternalStore,\n} from \"react\";\nimport { createPreferenceStore } from \"../utils/preference-store\";\n\nexport type BasaltTheme = \"light\" | \"dark\" | \"system\";\n\nconst STORAGE_KEY = \"theme\";\n\ntype ThemeContextValue = {\n\ttheme: BasaltTheme;\n\tsetTheme: (theme: BasaltTheme) => void;\n};\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nfunction applyTheme(theme: BasaltTheme) {\n\tif (typeof document === \"undefined\") {\n\t\treturn;\n\t}\n\tconst root = document.documentElement;\n\tlet systemDark = false;\n\ttry {\n\t\tif (typeof window !== \"undefined\" && typeof window.matchMedia === \"function\") {\n\t\t\tsystemDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n\t\t}\n\t} catch {\n\t\tsystemDark = false;\n\t}\n\tconst dark = theme === \"dark\" || (theme === \"system\" && systemDark);\n\troot.classList.toggle(\"dark\", dark);\n\troot.classList.toggle(\"light\", !dark);\n\troot.dataset.mode = dark ? \"dark\" : \"light\";\n}\n\nexport interface ThemeProviderProps {\n\t/**\n\t * Application components wrapped by the theme context.\n\t */\n\tchildren: ReactNode;\n\t/**\n\t * Storage key used for theme persistence.\n\t * @default \"theme\"\n\t */\n\tstorageKey?: string;\n\t/**\n\t * Initial theme used when no stored preference exists or during SSR.\n\t * @default \"system\"\n\t */\n\tdefaultTheme?: BasaltTheme;\n\t/**\n\t * Whether to persist theme changes to localStorage.\n\t * If false, localStorage is never read or written.\n\t * @default true\n\t */\n\tpersist?: boolean;\n\t/**\n\t * Controlled theme value. When provided, the provider acts as a controlled component\n\t * and internal state is driven by this prop.\n\t */\n\ttheme?: BasaltTheme;\n\t/**\n\t * Callback fired when theme change is requested.\n\t * In controlled mode, callers are responsible for updating `theme`.\n\t */\n\tonThemeChange?: (theme: BasaltTheme) => void;\n\t/**\n\t * Whether to apply mode classes and data-mode attribute to document.documentElement.\n\t * Set to false when a host theme system manages the document root.\n\t * @default true\n\t */\n\tapplyToDocument?: boolean;\n}\n\nfunction isValidTheme(value: unknown): value is BasaltTheme {\n\treturn value === \"light\" || value === \"dark\" || value === \"system\";\n}\n\nexport function ThemeProvider({\n\tchildren,\n\tstorageKey = STORAGE_KEY,\n\tdefaultTheme = \"system\",\n\tpersist = true,\n\ttheme: controlledTheme,\n\tonThemeChange,\n\tapplyToDocument = true,\n}: ThemeProviderProps) {\n\tconst isControlled = controlledTheme !== undefined;\n\n\tconst [store] = useState(() =>\n\t\tcreatePreferenceStore({\n\t\t\tstorageKey,\n\t\t\tdefaultValue: defaultTheme,\n\t\t\tpersist,\n\t\t\tisValid: isValidTheme,\n\t\t\tnormalize: (value) => value,\n\t\t\teventName: \"basalt:theme-change\",\n\t\t}),\n\t);\n\n\tuseEffect(() => {\n\t\tstore.updateConfig({ storageKey, defaultValue: defaultTheme, persist });\n\t}, [store, storageKey, defaultTheme, persist]);\n\n\tconst getServerSnapshot = useCallback(() => defaultTheme, [defaultTheme]);\n\n\tconst storeTheme = useSyncExternalStore(store.subscribe, store.getSnapshot, getServerSnapshot);\n\n\tconst currentTheme = isControlled ? controlledTheme : storeTheme;\n\n\tuseEffect(() => {\n\t\tif (!applyToDocument || typeof window === \"undefined\") {\n\t\t\treturn;\n\t\t}\n\t\tapplyTheme(currentTheme);\n\t\tif (currentTheme !== \"system\") {\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n\t\t\tconst onChange = () => applyTheme(\"system\");\n\t\t\tmq.addEventListener(\"change\", onChange);\n\t\t\treturn () => mq.removeEventListener(\"change\", onChange);\n\t\t} catch {\n\t\t\t// matchMedia not supported or restricted\n\t\t\treturn;\n\t\t}\n\t}, [currentTheme, applyToDocument]);\n\n\tconst setTheme = useCallback(\n\t\t(next: BasaltTheme) => {\n\t\t\tif (isControlled) {\n\t\t\t\tonThemeChange?.(next);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstore.setValue(next);\n\t\t\tonThemeChange?.(next);\n\t\t},\n\t\t[isControlled, onThemeChange, store],\n\t);\n\n\tconst value = useMemo(() => ({ theme: currentTheme, setTheme }), [currentTheme, setTheme]);\n\n\treturn <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n}\n\nexport function useTheme() {\n\tconst ctx = useContext(ThemeContext);\n\tif (!ctx) {\n\t\tthrow new Error(\"useTheme must be used within ThemeProvider\");\n\t}\n\treturn ctx;\n}\n"],"mappings":";;;;;AAcA,IAAMA,IAAc,SAOdC,IAAeC,EAAwC,IAAI;AAEjE,SAASC,EAAW,GAAoB;CACvC,IAAI,OAAO,WAAa,KACvB;CAED,IAAMC,IAAO,SAAS,iBAClBC,IAAa;CACjB,IAAI;EACH,AAAI,OAAO,SAAW,OAAe,OAAO,OAAO,cAAe,eACjE,IAAa,OAAO,WAAW,8BAA8B,CAAC,CAAC;CAEjE,QAAQ;EACP,IAAa;CACd;CACA,IAAMC,IAAOC,MAAU,UAAWA,MAAU,YAAYF;CAGxD,AAFAD,EAAK,UAAU,OAAO,QAAQE,CAAI,GAClCF,EAAK,UAAU,OAAO,SAAS,CAACE,CAAI,GACpC,EAAK,QAAQ,OAAOA,IAAO,SAAS;AACrC;AAyCA,SAASE,EAAa,GAAsC;CAC3D,OAAOC,MAAU,WAAWA,MAAU,UAAUA,MAAU;AAC3D;AAEA,SAAgBC,EAAc,EAC7B,aACA,gBAAaV,GACb,kBAAe,UACf,aAAU,IACV,OAAOW,GACP,kBACA,qBAAkB,MACI;CACtB,IAAMC,IAAeD,MAAoB,KAAA,GAEnC,CAACE,KAASC,QACfC,EAAsB;EACrB;EACA,cAAcC;EACd;EACA,SAASR;EACT,YAAY,MAAUC;EACtB,WAAW;CACZ,CAAC,CACF;CAEA,QAAgB;EACf,EAAM,aAAa;GAAE;GAAY,cAAcO;GAAc;EAAQ,CAAC;CACvE,GAAG;EAACH;EAAOI;EAAYD;EAAcE;CAAO,CAAC;CAE7C,IAAMC,IAAoBC,QAAkBJ,GAAc,CAACA,CAAY,CAAC,GAElEK,IAAaC,EAAqBT,EAAM,WAAWA,EAAM,aAAaM,CAAiB,GAEvFI,IAAeX,IAAeD,IAAkBU;CAEtD,QAAgB;EACf,IAAKG,KAAmB,OAAO,SAAW,QAG1CrB,EAAWoB,CAAY,GACnBA,MAAiB,WAGrB,IAAI;GACH,IAAME,IAAK,OAAO,WAAW,8BAA8B,GACrDC,UAAiBvB,EAAW,QAAQ;GAE1C,OADAsB,EAAG,iBAAiB,UAAUC,CAAQ,SACzBD,EAAG,oBAAoB,UAAUC,CAAQ;EACvD,QAAQ;GAEP;EACD;CACD,GAAG,CAACH,GAAcC,CAAe,CAAC;CAElC,IAAMG,IAAWP,GACf,MAAsB;EACtB,
|
|
1
|
+
{"version":3,"file":"theme.js","names":["STORAGE_KEY","ThemeContext","createContext","applyTheme","root","systemDark","dark","theme","isValidTheme","value","ThemeProvider","controlledTheme","isControlled","store","useState","createPreferenceStore","defaultTheme","storageKey","persist","getServerSnapshot","useCallback","storeTheme","useSyncExternalStore","currentTheme","applyToDocument","mq","onChange","setTheme","next","onThemeChange","useMemo","useTheme","ctx","useContext"],"sources":["../../src/providers/theme.tsx"],"sourcesContent":["import {\n\tcreateContext,\n\ttype ReactNode,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseState,\n\tuseSyncExternalStore,\n} from \"react\";\nimport { createPreferenceStore } from \"../utils/preference-store\";\n\nexport type BasaltTheme = \"light\" | \"dark\" | \"system\";\n\nconst STORAGE_KEY = \"theme\";\n\ntype ThemeContextValue = {\n\ttheme: BasaltTheme;\n\tsetTheme: (theme: BasaltTheme) => void;\n};\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nfunction applyTheme(theme: BasaltTheme) {\n\tif (typeof document === \"undefined\") {\n\t\treturn;\n\t}\n\tconst root = document.documentElement;\n\tlet systemDark = false;\n\ttry {\n\t\tif (typeof window !== \"undefined\" && typeof window.matchMedia === \"function\") {\n\t\t\tsystemDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n\t\t}\n\t} catch {\n\t\tsystemDark = false;\n\t}\n\tconst dark = theme === \"dark\" || (theme === \"system\" && systemDark);\n\troot.classList.toggle(\"dark\", dark);\n\troot.classList.toggle(\"light\", !dark);\n\troot.dataset.mode = dark ? \"dark\" : \"light\";\n}\n\nexport interface ThemeProviderProps {\n\t/**\n\t * Application components wrapped by the theme context.\n\t */\n\tchildren: ReactNode;\n\t/**\n\t * Storage key used for theme persistence.\n\t * @default \"theme\"\n\t */\n\tstorageKey?: string;\n\t/**\n\t * Initial theme used when no stored preference exists or during SSR.\n\t * @default \"system\"\n\t */\n\tdefaultTheme?: BasaltTheme;\n\t/**\n\t * Whether to persist theme changes to localStorage.\n\t * If false, localStorage is never read or written.\n\t * @default true\n\t */\n\tpersist?: boolean;\n\t/**\n\t * Controlled theme value. When provided, the provider acts as a controlled component\n\t * and internal state is driven by this prop.\n\t */\n\ttheme?: BasaltTheme;\n\t/**\n\t * Callback fired when theme change is requested.\n\t * In controlled mode, callers are responsible for updating `theme`.\n\t */\n\tonThemeChange?: (theme: BasaltTheme) => void;\n\t/**\n\t * Whether to apply mode classes and data-mode attribute to document.documentElement.\n\t * Set to false when a host theme system manages the document root.\n\t * @default true\n\t */\n\tapplyToDocument?: boolean;\n}\n\nfunction isValidTheme(value: unknown): value is BasaltTheme {\n\treturn value === \"light\" || value === \"dark\" || value === \"system\";\n}\n\nexport function ThemeProvider({\n\tchildren,\n\tstorageKey = STORAGE_KEY,\n\tdefaultTheme = \"system\",\n\tpersist = true,\n\ttheme: controlledTheme,\n\tonThemeChange,\n\tapplyToDocument = true,\n}: ThemeProviderProps) {\n\tconst isControlled = controlledTheme !== undefined;\n\n\tconst [store] = useState(() =>\n\t\tcreatePreferenceStore({\n\t\t\tstorageKey,\n\t\t\tdefaultValue: defaultTheme,\n\t\t\tpersist,\n\t\t\tisValid: isValidTheme,\n\t\t\tnormalize: (value) => value,\n\t\t\teventName: \"basalt:theme-change\",\n\t\t}),\n\t);\n\n\tuseEffect(() => {\n\t\tstore.updateConfig({ storageKey, defaultValue: defaultTheme, persist });\n\t}, [store, storageKey, defaultTheme, persist]);\n\n\tconst getServerSnapshot = useCallback(() => defaultTheme, [defaultTheme]);\n\n\tconst storeTheme = useSyncExternalStore(store.subscribe, store.getSnapshot, getServerSnapshot);\n\n\tconst currentTheme = isControlled ? controlledTheme : storeTheme;\n\n\tuseEffect(() => {\n\t\tif (!applyToDocument || typeof window === \"undefined\") {\n\t\t\treturn;\n\t\t}\n\t\tapplyTheme(currentTheme);\n\t\tif (currentTheme !== \"system\") {\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n\t\t\tconst onChange = () => applyTheme(\"system\");\n\t\t\tmq.addEventListener(\"change\", onChange);\n\t\t\treturn () => mq.removeEventListener(\"change\", onChange);\n\t\t} catch {\n\t\t\t// matchMedia not supported or restricted\n\t\t\treturn;\n\t\t}\n\t}, [currentTheme, applyToDocument]);\n\n\tconst setTheme = useCallback(\n\t\t(next: BasaltTheme) => {\n\t\t\tif (isControlled) {\n\t\t\t\tonThemeChange?.(next);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstore.setValue(next);\n\t\t\tonThemeChange?.(next);\n\t\t},\n\t\t[isControlled, onThemeChange, store],\n\t);\n\n\tconst value = useMemo(() => ({ theme: currentTheme, setTheme }), [currentTheme, setTheme]);\n\n\treturn <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n}\n\nexport function useTheme() {\n\tconst ctx = useContext(ThemeContext);\n\tif (!ctx) {\n\t\tthrow new Error(\"useTheme must be used within ThemeProvider\");\n\t}\n\treturn ctx;\n}\n"],"mappings":";;;;;AAcA,IAAMA,IAAc,SAOdC,IAAeC,EAAwC,IAAI;AAEjE,SAASC,EAAW,GAAoB;CACvC,IAAI,OAAO,WAAa,KACvB;CAED,IAAMC,IAAO,SAAS,iBAClBC,IAAa;CACjB,IAAI;EACH,AAAI,OAAO,SAAW,OAAe,OAAO,OAAO,cAAe,eACjE,IAAa,OAAO,WAAW,8BAA8B,CAAC,CAAC;CAEjE,QAAQ;EACP,IAAa;CACd;CACA,IAAMC,IAAOC,MAAU,UAAWA,MAAU,YAAYF;CAGxD,AAFAD,EAAK,UAAU,OAAO,QAAQE,CAAI,GAClCF,EAAK,UAAU,OAAO,SAAS,CAACE,CAAI,GACpC,EAAK,QAAQ,OAAOA,IAAO,SAAS;AACrC;AAyCA,SAASE,EAAa,GAAsC;CAC3D,OAAOC,MAAU,WAAWA,MAAU,UAAUA,MAAU;AAC3D;AAEA,SAAgBC,EAAc,EAC7B,aACA,gBAAaV,GACb,kBAAe,UACf,aAAU,IACV,OAAOW,GACP,kBACA,qBAAkB,MACI;CACtB,IAAMC,IAAeD,MAAoB,KAAA,GAEnC,CAACE,KAASC,QACfC,EAAsB;EACrB;EACA,cAAcC;EACd;EACA,SAASR;EACT,YAAY,MAAUC;EACtB,WAAW;CACZ,CAAC,CACF;CAEA,QAAgB;EACf,EAAM,aAAa;GAAE;GAAY,cAAcO;GAAc;EAAQ,CAAC;CACvE,GAAG;EAACH;EAAOI;EAAYD;EAAcE;CAAO,CAAC;CAE7C,IAAMC,IAAoBC,QAAkBJ,GAAc,CAACA,CAAY,CAAC,GAElEK,IAAaC,EAAqBT,EAAM,WAAWA,EAAM,aAAaM,CAAiB,GAEvFI,IAAeX,IAAeD,IAAkBU;CAEtD,QAAgB;EACf,IAAKG,KAAmB,OAAO,SAAW,QAG1CrB,EAAWoB,CAAY,GACnBA,MAAiB,WAGrB,IAAI;GACH,IAAME,IAAK,OAAO,WAAW,8BAA8B,GACrDC,UAAiBvB,EAAW,QAAQ;GAE1C,OADAsB,EAAG,iBAAiB,UAAUC,CAAQ,SACzBD,EAAG,oBAAoB,UAAUC,CAAQ;EACvD,QAAQ;GAEP;EACD;CACD,GAAG,CAACH,GAAcC,CAAe,CAAC;CAElC,IAAMG,IAAWP,GACf,MAAsB;EACtB,AAAIR,KAIJC,EAAM,SAASe,CAAI,GACnBC,IAAgBD,CAAI;CACrB,GACA;EAAChB;EAAciB;EAAehB;CAAK,CACpC,GAEMJ,IAAQqB,SAAe;EAAE,OAAOP;EAAc;CAAS,IAAI,CAACA,GAAcI,CAAQ,CAAC;CAEzF,OAAO,kBAAC1B,EAAa,UAAd;EAA8B;EAAQ;CAAgC,CAAA;AAC9E;AAEA,SAAgB8B,IAAW;CAC1B,IAAMC,IAAMC,EAAWhC,CAAY;CACnC,IAAI,CAAC+B,GACJ,MAAU,MAAM,4CAA4C;CAE7D,OAAOA;AACR"}
|
package/dist/styles/base.css
CHANGED
|
@@ -202,6 +202,63 @@
|
|
|
202
202
|
}
|
|
203
203
|
|
|
204
204
|
@layer components {
|
|
205
|
+
:is(.basalt-focus, .basalt-action) {
|
|
206
|
+
scroll-margin: var(--basalt-focus-clearance);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
:is(.basalt-focus, .basalt-action):focus:not(:focus-visible) {
|
|
210
|
+
outline: none;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
:is(.basalt-focus, .basalt-action):focus-visible,
|
|
214
|
+
.basalt-nav-actions :focus-visible,
|
|
215
|
+
.basalt-focus-frame:has(> .basalt-focus:focus-visible)::after,
|
|
216
|
+
.basalt-focus-group:has(:is(input, textarea):focus-visible):not(
|
|
217
|
+
:has(.basalt-focus-group :focus-visible)
|
|
218
|
+
) {
|
|
219
|
+
outline: var(--basalt-focus-width) solid hsl(var(--basalt-ring));
|
|
220
|
+
outline-offset: var(--basalt-focus-offset);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
.basalt-focus-inset:focus-visible,
|
|
224
|
+
.basalt-focus-frame:has(> .basalt-focus:focus-visible)::after,
|
|
225
|
+
.basalt-focus-group.basalt-focus-inset:has(:is(input, textarea):focus-visible):not(
|
|
226
|
+
:has(.basalt-focus-group :focus-visible)
|
|
227
|
+
),
|
|
228
|
+
.basalt-focus-group .basalt-choice:focus-visible,
|
|
229
|
+
.basalt-nav-actions .basalt-choice:focus-visible {
|
|
230
|
+
outline-offset: calc(-1 * var(--basalt-focus-offset));
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
.basalt-focus-group :is(input, textarea):focus-visible,
|
|
234
|
+
.basalt-focus-frame > .basalt-focus:focus-visible {
|
|
235
|
+
outline: none;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
.basalt-focus-frame:has(> .basalt-focus:focus-visible)::after {
|
|
239
|
+
content: "";
|
|
240
|
+
position: absolute;
|
|
241
|
+
inset: 0;
|
|
242
|
+
z-index: 1;
|
|
243
|
+
border-radius: inherit;
|
|
244
|
+
pointer-events: none;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
@media (forced-colors: active) {
|
|
248
|
+
:is(.basalt-focus, .basalt-action):focus-visible,
|
|
249
|
+
.basalt-nav-actions :focus-visible,
|
|
250
|
+
.basalt-focus-frame:has(> .basalt-focus:focus-visible)::after,
|
|
251
|
+
.basalt-focus-group:has(:is(input, textarea):focus-visible):not(
|
|
252
|
+
:has(.basalt-focus-group :focus-visible)
|
|
253
|
+
) {
|
|
254
|
+
outline: 2px solid Highlight;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
.basalt-focus-group :is(input, textarea):focus-visible {
|
|
258
|
+
outline: none;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
205
262
|
[data-basalt-header][data-density="compact"]
|
|
206
263
|
:where([data-basalt-header-leading], [data-basalt-header-actions])
|
|
207
264
|
:where(button, a, [role="button"]) {
|
|
@@ -209,3 +266,17 @@
|
|
|
209
266
|
min-width: var(--basalt-size-touch);
|
|
210
267
|
}
|
|
211
268
|
}
|
|
269
|
+
|
|
270
|
+
:is(.basalt-focus, .basalt-action):focus-visible,
|
|
271
|
+
.basalt-nav-actions :focus-visible,
|
|
272
|
+
.basalt-focus-group:has(:is(input, textarea):focus-visible):not(
|
|
273
|
+
:has(.basalt-focus-group :focus-visible)
|
|
274
|
+
),
|
|
275
|
+
.basalt-chart :focus-visible {
|
|
276
|
+
transition: none;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
.basalt-focus-swatch:focus-visible {
|
|
280
|
+
box-shadow: inset 0 0 0 calc(var(--basalt-focus-offset) + var(--basalt-focus-width))
|
|
281
|
+
hsl(var(--basalt-background));
|
|
282
|
+
}
|
|
@@ -27,6 +27,9 @@
|
|
|
27
27
|
--basalt-space-md: 0.375rem;
|
|
28
28
|
--basalt-space-lg: 0.5rem;
|
|
29
29
|
--basalt-space-default: var(--basalt-space-lg);
|
|
30
|
+
--basalt-focus-width: 0.0625rem;
|
|
31
|
+
--basalt-focus-offset: 0.125rem;
|
|
32
|
+
--basalt-focus-clearance: var(--basalt-space-sm);
|
|
30
33
|
--basalt-text-xs: 0.75rem;
|
|
31
34
|
--basalt-text-sm: 0.75rem;
|
|
32
35
|
--basalt-text-code: 0.875rem;
|
|
@@ -144,8 +147,14 @@
|
|
|
144
147
|
);
|
|
145
148
|
--basalt-size-action: var(--basalt-size-control);
|
|
146
149
|
--basalt-space-nav-inset: var(--basalt-space-lg);
|
|
147
|
-
--basalt-space-
|
|
150
|
+
--basalt-space-sidebar-inset: var(--basalt-space-layout);
|
|
151
|
+
--basalt-space-nav-gap: var(--basalt-space-sm);
|
|
148
152
|
--basalt-size-rail: 4.25rem;
|
|
153
|
+
--basalt-size-sidebar-brand-slot: calc(
|
|
154
|
+
var(--basalt-size-rail) -
|
|
155
|
+
2 *
|
|
156
|
+
var(--basalt-space-layout-lg)
|
|
157
|
+
);
|
|
149
158
|
}
|
|
150
159
|
:root, .light, [data-mode="light"] {
|
|
151
160
|
--basalt-background: 220 14% 94%;
|
|
@@ -581,6 +590,38 @@
|
|
|
581
590
|
min-block-size: calc(1lh + 2 * var(--basalt-space-control-y) + 2 * var(--basalt-border-width));
|
|
582
591
|
padding-inline: var(--basalt-space-sm);
|
|
583
592
|
}
|
|
593
|
+
.basalt-action-icon-sm {
|
|
594
|
+
inline-size: var(--basalt-size-control-sm);
|
|
595
|
+
max-inline-size: var(--basalt-size-control-sm);
|
|
596
|
+
min-inline-size: var(--basalt-size-control-sm);
|
|
597
|
+
block-size: var(--basalt-size-control-sm);
|
|
598
|
+
max-block-size: var(--basalt-size-control-sm);
|
|
599
|
+
min-block-size: var(--basalt-size-control-sm);
|
|
600
|
+
padding: 0;
|
|
601
|
+
}
|
|
602
|
+
.basalt-nav-list {
|
|
603
|
+
padding: var(--basalt-space-nav-inset);
|
|
604
|
+
}
|
|
605
|
+
.basalt-sidebar-nav {
|
|
606
|
+
padding-inline: var(--basalt-space-sidebar-inset);
|
|
607
|
+
}
|
|
608
|
+
.basalt-sidebar-brand-action {
|
|
609
|
+
flex-shrink: 0;
|
|
610
|
+
margin-inline-end: calc(-1 * var(--basalt-space-md));
|
|
611
|
+
}
|
|
612
|
+
.p-basalt-nav-inset {
|
|
613
|
+
padding: var(--basalt-space-nav-inset);
|
|
614
|
+
}
|
|
615
|
+
.px-basalt-nav-inset {
|
|
616
|
+
padding-inline: var(--basalt-space-nav-inset);
|
|
617
|
+
}
|
|
618
|
+
.px-basalt-sidebar-inset {
|
|
619
|
+
padding-inline: var(--basalt-space-sidebar-inset);
|
|
620
|
+
}
|
|
621
|
+
.size-basalt-sidebar-brand-slot {
|
|
622
|
+
inline-size: var(--basalt-size-sidebar-brand-slot);
|
|
623
|
+
block-size: var(--basalt-size-sidebar-brand-slot);
|
|
624
|
+
}
|
|
584
625
|
.basalt-action-inset {
|
|
585
626
|
border-width: 0;
|
|
586
627
|
min-block-size: calc(1lh + 2 * var(--basalt-space-control-y));
|
|
@@ -629,14 +670,19 @@
|
|
|
629
670
|
pointer-events: none;
|
|
630
671
|
opacity: 0.5;
|
|
631
672
|
}
|
|
632
|
-
[data-basalt-sidebar][data-collapsed] :is([data-slot="sidebar-header"], [data-slot="sidebar-footer"]) {
|
|
633
|
-
justify-content: center;
|
|
634
|
-
}
|
|
635
673
|
[data-basalt-sidebar][data-collapsed] [data-slot="sidebar-footer"] {
|
|
636
674
|
align-items: center;
|
|
637
675
|
}
|
|
638
|
-
[data-basalt-sidebar][data-collapsed] [data-slot="sidebar-nav"]
|
|
639
|
-
|
|
676
|
+
[data-basalt-sidebar][data-collapsed] [data-slot="sidebar-nav"] {
|
|
677
|
+
padding-inline: calc((var(--basalt-size-rail) - var(--basalt-size-control)) / 2);
|
|
678
|
+
padding-block-start: calc(var(--basalt-size-control-sm) + var(--basalt-space-lg));
|
|
679
|
+
}
|
|
680
|
+
[data-basalt-sidebar][data-collapsed] [data-slot="sidebar-brand-action"] {
|
|
681
|
+
position: absolute;
|
|
682
|
+
inset-block-start: 100%;
|
|
683
|
+
inset-inline-start: calc( (var(--basalt-size-sidebar-brand-slot) - var(--basalt-size-control-sm)) / 2 );
|
|
684
|
+
z-index: 1;
|
|
685
|
+
margin: 0;
|
|
640
686
|
}
|
|
641
687
|
@media (prefers-reduced-motion: reduce) {
|
|
642
688
|
.basalt-nav-item {
|
|
@@ -1194,17 +1240,60 @@
|
|
|
1194
1240
|
}
|
|
1195
1241
|
}
|
|
1196
1242
|
@layer components {
|
|
1243
|
+
:is(.basalt-focus, .basalt-action) {
|
|
1244
|
+
scroll-margin: var(--basalt-focus-clearance);
|
|
1245
|
+
}
|
|
1246
|
+
:is(.basalt-focus, .basalt-action):focus:not(:focus-visible) {
|
|
1247
|
+
outline: none;
|
|
1248
|
+
}
|
|
1249
|
+
:is(.basalt-focus, .basalt-action):focus-visible, .basalt-nav-actions :focus-visible, .basalt-focus-frame:has(> .basalt-focus:focus-visible)::after, .basalt-focus-group:has(:is(input, textarea):focus-visible):not( :has(.basalt-focus-group :focus-visible) ) {
|
|
1250
|
+
outline: var(--basalt-focus-width) solid hsl(var(--basalt-ring));
|
|
1251
|
+
outline-offset: var(--basalt-focus-offset);
|
|
1252
|
+
}
|
|
1253
|
+
.basalt-focus-inset:focus-visible, .basalt-focus-frame:has(> .basalt-focus:focus-visible)::after, .basalt-focus-group.basalt-focus-inset:has(:is(input, textarea):focus-visible):not( :has(.basalt-focus-group :focus-visible) ), .basalt-focus-group .basalt-choice:focus-visible, .basalt-nav-actions .basalt-choice:focus-visible {
|
|
1254
|
+
outline-offset: calc(-1 * var(--basalt-focus-offset));
|
|
1255
|
+
}
|
|
1256
|
+
.basalt-focus-group :is(input, textarea):focus-visible, .basalt-focus-frame > .basalt-focus:focus-visible {
|
|
1257
|
+
outline: none;
|
|
1258
|
+
}
|
|
1259
|
+
.basalt-focus-frame:has(> .basalt-focus:focus-visible)::after {
|
|
1260
|
+
content: "";
|
|
1261
|
+
position: absolute;
|
|
1262
|
+
inset: 0;
|
|
1263
|
+
z-index: 1;
|
|
1264
|
+
border-radius: inherit;
|
|
1265
|
+
pointer-events: none;
|
|
1266
|
+
}
|
|
1267
|
+
@media (forced-colors: active) {
|
|
1268
|
+
:is(.basalt-focus, .basalt-action):focus-visible, .basalt-nav-actions :focus-visible, .basalt-focus-frame:has(> .basalt-focus:focus-visible)::after, .basalt-focus-group:has(:is(input, textarea):focus-visible):not( :has(.basalt-focus-group :focus-visible) ) {
|
|
1269
|
+
outline: 2px solid Highlight;
|
|
1270
|
+
}
|
|
1271
|
+
.basalt-focus-group :is(input, textarea):focus-visible {
|
|
1272
|
+
outline: none;
|
|
1273
|
+
}
|
|
1274
|
+
}
|
|
1197
1275
|
[data-basalt-header][data-density="compact"] :where([data-basalt-header-leading], [data-basalt-header-actions]) :where(button, a, [role="button"]) {
|
|
1198
1276
|
min-height: var(--basalt-size-touch);
|
|
1199
1277
|
min-width: var(--basalt-size-touch);
|
|
1200
1278
|
}
|
|
1201
1279
|
}
|
|
1280
|
+
:is(.basalt-focus, .basalt-action):focus-visible, .basalt-nav-actions :focus-visible, .basalt-focus-group:has(:is(input, textarea):focus-visible):not( :has(.basalt-focus-group :focus-visible) ), .basalt-chart :focus-visible {
|
|
1281
|
+
transition: none;
|
|
1282
|
+
}
|
|
1283
|
+
.basalt-focus-swatch:focus-visible {
|
|
1284
|
+
box-shadow: inset 0 0 0 calc(var(--basalt-focus-offset) + var(--basalt-focus-width)) hsl(var(--basalt-background));
|
|
1285
|
+
}
|
|
1202
1286
|
.basalt-chart .recharts-sector:focus:not(:focus-visible), .basalt-chart .recharts-rectangle:focus:not(:focus-visible), .basalt-chart .recharts-layer:focus:not(:focus-visible), .basalt-chart .recharts-surface:focus:not(:focus-visible) {
|
|
1203
1287
|
outline: none;
|
|
1204
1288
|
}
|
|
1205
1289
|
.basalt-chart :focus-visible {
|
|
1206
|
-
outline:
|
|
1207
|
-
outline-offset:
|
|
1290
|
+
outline: var(--basalt-focus-width) solid hsl(var(--basalt-ring));
|
|
1291
|
+
outline-offset: var(--basalt-focus-offset);
|
|
1292
|
+
}
|
|
1293
|
+
@media (forced-colors: active) {
|
|
1294
|
+
.basalt-chart :focus-visible {
|
|
1295
|
+
outline: 2px solid Highlight;
|
|
1296
|
+
}
|
|
1208
1297
|
}
|
|
1209
1298
|
@layer utilities {
|
|
1210
1299
|
.pointer-events-none {
|
|
@@ -1547,6 +1636,10 @@
|
|
|
1547
1636
|
width: var(--basalt-size-icon-sm);
|
|
1548
1637
|
height: var(--basalt-size-icon-sm);
|
|
1549
1638
|
}
|
|
1639
|
+
.size-basalt-sidebar-brand-slot {
|
|
1640
|
+
width: var(--basalt-size-sidebar-brand-slot);
|
|
1641
|
+
height: var(--basalt-size-sidebar-brand-slot);
|
|
1642
|
+
}
|
|
1550
1643
|
.size-full {
|
|
1551
1644
|
width: 100%;
|
|
1552
1645
|
height: 100%;
|
|
@@ -1800,6 +1893,9 @@
|
|
|
1800
1893
|
.w-basalt-rail {
|
|
1801
1894
|
width: var(--basalt-size-rail);
|
|
1802
1895
|
}
|
|
1896
|
+
.w-basalt-sidebar-brand-slot {
|
|
1897
|
+
width: var(--basalt-size-sidebar-brand-slot);
|
|
1898
|
+
}
|
|
1803
1899
|
.w-fit {
|
|
1804
1900
|
width: fit-content;
|
|
1805
1901
|
}
|
|
@@ -1924,6 +2020,9 @@
|
|
|
1924
2020
|
.resize-none {
|
|
1925
2021
|
resize: none;
|
|
1926
2022
|
}
|
|
2023
|
+
.scroll-p-basalt-space-sm {
|
|
2024
|
+
scroll-padding: var(--basalt-space-sm);
|
|
2025
|
+
}
|
|
1927
2026
|
.list-decimal {
|
|
1928
2027
|
list-style-type: decimal;
|
|
1929
2028
|
}
|
|
@@ -2268,6 +2367,10 @@
|
|
|
2268
2367
|
.rounded-none {
|
|
2269
2368
|
border-radius: 0;
|
|
2270
2369
|
}
|
|
2370
|
+
.rounded-t-basalt-lg {
|
|
2371
|
+
border-top-left-radius: var(--basalt-radius-lg);
|
|
2372
|
+
border-top-right-radius: var(--basalt-radius-lg);
|
|
2373
|
+
}
|
|
2271
2374
|
.rounded-l-basalt-md {
|
|
2272
2375
|
border-top-left-radius: var(--basalt-radius-md);
|
|
2273
2376
|
border-bottom-left-radius: var(--basalt-radius-md);
|
|
@@ -2592,9 +2695,6 @@
|
|
|
2592
2695
|
.p-basalt-menu-inset {
|
|
2593
2696
|
padding: var(--basalt-space-menu-inset);
|
|
2594
2697
|
}
|
|
2595
|
-
.p-basalt-nav-inset {
|
|
2596
|
-
padding: var(--basalt-space-nav-inset);
|
|
2597
|
-
}
|
|
2598
2698
|
.p-basalt-space-lg {
|
|
2599
2699
|
padding: var(--basalt-space-lg);
|
|
2600
2700
|
}
|
|
@@ -2643,9 +2743,6 @@
|
|
|
2643
2743
|
.px-basalt-menu-x {
|
|
2644
2744
|
padding-inline: var(--basalt-space-menu-x);
|
|
2645
2745
|
}
|
|
2646
|
-
.px-basalt-nav-inset {
|
|
2647
|
-
padding-inline: var(--basalt-space-nav-inset);
|
|
2648
|
-
}
|
|
2649
2746
|
.px-basalt-panel-x {
|
|
2650
2747
|
padding-inline: var(--basalt-space-panel-x);
|
|
2651
2748
|
}
|
|
@@ -2694,9 +2791,6 @@
|
|
|
2694
2791
|
.py-basalt-menu-y {
|
|
2695
2792
|
padding-block: var(--basalt-space-menu-y);
|
|
2696
2793
|
}
|
|
2697
|
-
.py-basalt-nav-inset {
|
|
2698
|
-
padding-block: var(--basalt-space-nav-inset);
|
|
2699
|
-
}
|
|
2700
2794
|
.py-basalt-panel-y {
|
|
2701
2795
|
padding-block: var(--basalt-space-panel-y);
|
|
2702
2796
|
}
|
|
@@ -2745,6 +2839,9 @@
|
|
|
2745
2839
|
.pt-basalt-nav-gap {
|
|
2746
2840
|
padding-top: var(--basalt-space-nav-gap);
|
|
2747
2841
|
}
|
|
2842
|
+
.pt-basalt-space-lg {
|
|
2843
|
+
padding-top: var(--basalt-space-lg);
|
|
2844
|
+
}
|
|
2748
2845
|
.pr-basalt-row-x {
|
|
2749
2846
|
padding-right: var(--basalt-space-row-x);
|
|
2750
2847
|
}
|
|
@@ -2757,6 +2854,9 @@
|
|
|
2757
2854
|
.pb-0 {
|
|
2758
2855
|
padding-bottom: 0px;
|
|
2759
2856
|
}
|
|
2857
|
+
.pb-basalt-layout {
|
|
2858
|
+
padding-bottom: var(--basalt-space-layout);
|
|
2859
|
+
}
|
|
2760
2860
|
.pb-basalt-panel-y {
|
|
2761
2861
|
padding-bottom: var(--basalt-space-panel-y);
|
|
2762
2862
|
}
|
|
@@ -2766,9 +2866,6 @@
|
|
|
2766
2866
|
.pb-basalt-space-lg {
|
|
2767
2867
|
padding-bottom: var(--basalt-space-lg);
|
|
2768
2868
|
}
|
|
2769
|
-
.pb-basalt-space-sm {
|
|
2770
|
-
padding-bottom: var(--basalt-space-sm);
|
|
2771
|
-
}
|
|
2772
2869
|
.pl-\[calc\(var\(--basalt-size-icon-lg\)\/2\+var\(--basalt-space-row-gap\)\)\] {
|
|
2773
2870
|
padding-left: calc(var(--basalt-size-icon-lg) / 2 + var(--basalt-space-row-gap));
|
|
2774
2871
|
}
|
|
@@ -3242,15 +3339,13 @@
|
|
|
3242
3339
|
border-top-right-radius: var(--basalt-radius-md);
|
|
3243
3340
|
border-bottom-right-radius: var(--basalt-radius-md);
|
|
3244
3341
|
}
|
|
3342
|
+
.last\:rounded-b-basalt-lg:last-child {
|
|
3343
|
+
border-bottom-right-radius: var(--basalt-radius-lg);
|
|
3344
|
+
border-bottom-left-radius: var(--basalt-radius-lg);
|
|
3345
|
+
}
|
|
3245
3346
|
.focus-within\:z-2:focus-within {
|
|
3246
3347
|
z-index: 2;
|
|
3247
3348
|
}
|
|
3248
|
-
.focus-within\:border-basalt-ring:focus-within {
|
|
3249
|
-
border-color: hsl(var(--basalt-ring));
|
|
3250
|
-
}
|
|
3251
|
-
.focus-within\:ring-basalt-ring:focus-within {
|
|
3252
|
-
--tw-ring-color: hsl(var(--basalt-ring));
|
|
3253
|
-
}
|
|
3254
3349
|
@media (hover: hover) {
|
|
3255
3350
|
.hover\:scale-\[1\.03\]:hover {
|
|
3256
3351
|
scale: 1.03;
|
|
@@ -3344,63 +3439,9 @@
|
|
|
3344
3439
|
.focus-visible\:z-2:focus-visible {
|
|
3345
3440
|
z-index: 2;
|
|
3346
3441
|
}
|
|
3347
|
-
.focus-visible\:border-basalt-ring:focus-visible {
|
|
3348
|
-
border-color: hsl(var(--basalt-ring));
|
|
3349
|
-
}
|
|
3350
|
-
.focus-visible\:border-transparent:focus-visible {
|
|
3351
|
-
border-color: transparent;
|
|
3352
|
-
}
|
|
3353
3442
|
.focus-visible\:bg-basalt-hover:focus-visible {
|
|
3354
3443
|
background-color: var(--basalt-hover);
|
|
3355
3444
|
}
|
|
3356
|
-
.focus-visible\:ring-0:focus-visible {
|
|
3357
|
-
--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
|
|
3358
|
-
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
3359
|
-
}
|
|
3360
|
-
.focus-visible\:ring-1:focus-visible {
|
|
3361
|
-
--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
|
|
3362
|
-
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
3363
|
-
}
|
|
3364
|
-
.focus-visible\:ring-2:focus-visible {
|
|
3365
|
-
--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
|
|
3366
|
-
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
3367
|
-
}
|
|
3368
|
-
.focus-visible\:ring-basalt-ring:focus-visible {
|
|
3369
|
-
--tw-ring-color: hsl(var(--basalt-ring));
|
|
3370
|
-
}
|
|
3371
|
-
.focus-visible\:ring-offset-0:focus-visible {
|
|
3372
|
-
--tw-ring-offset-width: 0px;
|
|
3373
|
-
--tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
|
|
3374
|
-
}
|
|
3375
|
-
.focus-visible\:ring-offset-2:focus-visible {
|
|
3376
|
-
--tw-ring-offset-width: 2px;
|
|
3377
|
-
--tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
|
|
3378
|
-
}
|
|
3379
|
-
.focus-visible\:ring-offset-basalt-background:focus-visible {
|
|
3380
|
-
--tw-ring-offset-color: hsl(var(--basalt-background));
|
|
3381
|
-
}
|
|
3382
|
-
.focus-visible\:outline-2:focus-visible {
|
|
3383
|
-
outline-style: var(--tw-outline-style);
|
|
3384
|
-
outline-width: 2px;
|
|
3385
|
-
}
|
|
3386
|
-
.focus-visible\:-outline-offset-2:focus-visible {
|
|
3387
|
-
outline-offset: calc(2px * -1);
|
|
3388
|
-
}
|
|
3389
|
-
.focus-visible\:outline-offset-1:focus-visible {
|
|
3390
|
-
outline-offset: 1px;
|
|
3391
|
-
}
|
|
3392
|
-
.focus-visible\:outline-offset-2:focus-visible {
|
|
3393
|
-
outline-offset: 2px;
|
|
3394
|
-
}
|
|
3395
|
-
.focus-visible\:outline-basalt-primary:focus-visible {
|
|
3396
|
-
outline-color: hsl(var(--basalt-primary));
|
|
3397
|
-
}
|
|
3398
|
-
.focus-visible\:outline-basalt-ring:focus-visible {
|
|
3399
|
-
outline-color: hsl(var(--basalt-ring));
|
|
3400
|
-
}
|
|
3401
|
-
.focus-visible\:ring-inset:focus-visible {
|
|
3402
|
-
--tw-ring-inset: inset;
|
|
3403
|
-
}
|
|
3404
3445
|
.active\:scale-\[0\.98\]:active {
|
|
3405
3446
|
scale: 0.98;
|
|
3406
3447
|
}
|
|
@@ -3515,9 +3556,6 @@
|
|
|
3515
3556
|
.data-\[state\=checked\]\:text-basalt-primary-foreground[data-state="checked"] {
|
|
3516
3557
|
color: hsl(var(--basalt-primary-foreground));
|
|
3517
3558
|
}
|
|
3518
|
-
.data-\[state\=checked\]\:focus-visible\:ring-basalt-primary-foreground[data-state="checked"]:focus-visible {
|
|
3519
|
-
--tw-ring-color: hsl(var(--basalt-primary-foreground));
|
|
3520
|
-
}
|
|
3521
3559
|
.data-\[state\=closed\]\:animate-basalt-collapsible-up[data-state="closed"] {
|
|
3522
3560
|
animation: basalt-collapsible-up var(--basalt-motion-fast)
|
|
3523
3561
|
var(--basalt-motion-ease);
|
|
@@ -3530,6 +3568,10 @@
|
|
|
3530
3568
|
animation: basalt-overlay-out var(--basalt-floating-duration-exit)
|
|
3531
3569
|
var(--basalt-motion-ease-exit) forwards;
|
|
3532
3570
|
}
|
|
3571
|
+
.data-\[state\=closed\]\:rounded-b-basalt-lg[data-state="closed"] {
|
|
3572
|
+
border-bottom-right-radius: var(--basalt-radius-lg);
|
|
3573
|
+
border-bottom-left-radius: var(--basalt-radius-lg);
|
|
3574
|
+
}
|
|
3533
3575
|
.data-\[state\=indeterminate\]\:bg-basalt-primary[data-state="indeterminate"] {
|
|
3534
3576
|
background-color: hsl(var(--basalt-primary));
|
|
3535
3577
|
}
|
|
@@ -3542,9 +3584,6 @@
|
|
|
3542
3584
|
.data-\[state\=on\]\:text-basalt-primary-foreground[data-state="on"] {
|
|
3543
3585
|
color: hsl(var(--basalt-primary-foreground));
|
|
3544
3586
|
}
|
|
3545
|
-
.data-\[state\=on\]\:focus-visible\:ring-basalt-primary-foreground[data-state="on"]:focus-visible {
|
|
3546
|
-
--tw-ring-color: hsl(var(--basalt-primary-foreground));
|
|
3547
|
-
}
|
|
3548
3587
|
.data-\[state\=open\]\:animate-basalt-collapsible-down[data-state="open"] {
|
|
3549
3588
|
animation: basalt-collapsible-down var(--basalt-motion-normal)
|
|
3550
3589
|
var(--basalt-motion-ease);
|
|
@@ -3661,8 +3700,8 @@
|
|
|
3661
3700
|
.md\:p-basalt-layout-lg {
|
|
3662
3701
|
padding: var(--basalt-space-layout-lg);
|
|
3663
3702
|
}
|
|
3664
|
-
.md\:px-basalt-
|
|
3665
|
-
padding-inline: var(--basalt-space-
|
|
3703
|
+
.md\:px-basalt-layout-sm {
|
|
3704
|
+
padding-inline: var(--basalt-space-layout-sm);
|
|
3666
3705
|
}
|
|
3667
3706
|
.md\:shadow-sm {
|
|
3668
3707
|
--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
|
|
@@ -3692,16 +3731,6 @@
|
|
|
3692
3731
|
padding-inline: var(--basalt-space-layout-xl);
|
|
3693
3732
|
}
|
|
3694
3733
|
}
|
|
3695
|
-
.\[\&_\.recharts-surface\:focus-visible\]\:outline-2 .recharts-surface:focus-visible {
|
|
3696
|
-
outline-style: var(--tw-outline-style);
|
|
3697
|
-
outline-width: 2px;
|
|
3698
|
-
}
|
|
3699
|
-
.\[\&_\.recharts-surface\:focus-visible\]\:outline-offset-2 .recharts-surface:focus-visible {
|
|
3700
|
-
outline-offset: 2px;
|
|
3701
|
-
}
|
|
3702
|
-
.\[\&_\.recharts-surface\:focus-visible\]\:outline-basalt-ring .recharts-surface:focus-visible {
|
|
3703
|
-
outline-color: hsl(var(--basalt-ring));
|
|
3704
|
-
}
|
|
3705
3734
|
.\[\&_\[cmdk-group-heading\]\]\:px-basalt-space-lg [cmdk-group-heading] {
|
|
3706
3735
|
padding-inline: var(--basalt-space-lg);
|
|
3707
3736
|
}
|