@umbra.ui/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/controls/Dropdown/types.d.ts +5 -0
- package/dist/components/controls/Dropdown/types.d.ts.map +1 -0
- package/dist/components/controls/Dropdown/types.js +1 -0
- package/dist/components/controls/SegmentedControl/types.d.ts +6 -0
- package/dist/components/controls/SegmentedControl/types.d.ts.map +1 -0
- package/dist/components/controls/SegmentedControl/types.js +1 -0
- package/dist/components/dialogs/Alert/types.d.ts +7 -0
- package/dist/components/dialogs/Alert/types.d.ts.map +1 -0
- package/dist/components/dialogs/Alert/types.js +1 -0
- package/dist/components/dialogs/Toast/types.d.ts +34 -0
- package/dist/components/dialogs/Toast/types.d.ts.map +1 -0
- package/dist/components/dialogs/Toast/types.js +10 -0
- package/dist/components/dialogs/Toast/useToast.d.ts +36 -0
- package/dist/components/dialogs/Toast/useToast.d.ts.map +1 -0
- package/dist/components/dialogs/Toast/useToast.js +90 -0
- package/dist/components/indicators/Tooltip/tooltip.d.ts +3 -0
- package/dist/components/indicators/Tooltip/tooltip.d.ts.map +1 -0
- package/dist/components/indicators/Tooltip/tooltip.js +33 -0
- package/dist/components/indicators/Tooltip/types.d.ts +14 -0
- package/dist/components/indicators/Tooltip/types.d.ts.map +1 -0
- package/dist/components/indicators/Tooltip/types.js +1 -0
- package/dist/components/indicators/Tooltip/useTooltip.d.ts +18 -0
- package/dist/components/indicators/Tooltip/useTooltip.d.ts.map +1 -0
- package/dist/components/indicators/Tooltip/useTooltip.js +57 -0
- package/dist/components/inputs/Tags/tag-bar-styles.d.ts +14 -0
- package/dist/components/inputs/Tags/tag-bar-styles.d.ts.map +1 -0
- package/dist/components/inputs/Tags/tag-bar-styles.js +313 -0
- package/dist/components/inputs/Tags/types.d.ts +93 -0
- package/dist/components/inputs/Tags/types.d.ts.map +1 -0
- package/dist/components/inputs/Tags/types.js +216 -0
- package/dist/components/inputs/search/types.d.ts +9 -0
- package/dist/components/inputs/search/types.d.ts.map +1 -0
- package/dist/components/inputs/search/types.js +1 -0
- package/dist/components/navigation/adaptive/types.d.ts +16 -0
- package/dist/components/navigation/adaptive/types.d.ts.map +1 -0
- package/dist/components/navigation/adaptive/types.js +1 -0
- package/dist/components/navigation/adaptive/useAdaptiveLayout.d.ts +27 -0
- package/dist/components/navigation/adaptive/useAdaptiveLayout.d.ts.map +1 -0
- package/dist/components/navigation/adaptive/useAdaptiveLayout.js +40 -0
- package/dist/components/navigation/adaptive/useBreakpoints.d.ts +6 -0
- package/dist/components/navigation/adaptive/useBreakpoints.d.ts.map +1 -0
- package/dist/components/navigation/adaptive/useBreakpoints.js +37 -0
- package/dist/components/navigation/adaptive/useContainerMonitor.d.ts +93 -0
- package/dist/components/navigation/adaptive/useContainerMonitor.d.ts.map +1 -0
- package/dist/components/navigation/adaptive/useContainerMonitor.js +145 -0
- package/dist/components/navigation/adaptive/useViewAnimation.d.ts +31 -0
- package/dist/components/navigation/adaptive/useViewAnimation.d.ts.map +1 -0
- package/dist/components/navigation/adaptive/useViewAnimation.js +591 -0
- package/dist/components/navigation/adaptive/useViewResize.d.ts +52 -0
- package/dist/components/navigation/adaptive/useViewResize.d.ts.map +1 -0
- package/dist/components/navigation/adaptive/useViewResize.js +146 -0
- package/dist/components/navigation/navstack/useNavigationStack.d.ts +25 -0
- package/dist/components/navigation/navstack/useNavigationStack.d.ts.map +1 -0
- package/dist/components/navigation/navstack/useNavigationStack.js +133 -0
- package/dist/components/navigation/slideover/useSlideoverController.d.ts +20 -0
- package/dist/components/navigation/slideover/useSlideoverController.d.ts.map +1 -0
- package/dist/components/navigation/slideover/useSlideoverController.js +267 -0
- package/dist/components/navigation/splitview/useSplitViewController.d.ts +20 -0
- package/dist/components/navigation/splitview/useSplitViewController.d.ts.map +1 -0
- package/dist/components/navigation/splitview/useSplitViewController.js +325 -0
- package/dist/components/navigation/tabcontroller/types.d.ts +21 -0
- package/dist/components/navigation/tabcontroller/types.d.ts.map +1 -0
- package/dist/components/navigation/tabcontroller/types.js +1 -0
- package/dist/components/navigation/tabcontroller/useTabController.d.ts +5 -0
- package/dist/components/navigation/tabcontroller/useTabController.d.ts.map +1 -0
- package/dist/components/navigation/tabcontroller/useTabController.js +10 -0
- package/dist/components/navigation/types.d.ts +8 -0
- package/dist/components/navigation/types.d.ts.map +1 -0
- package/dist/components/navigation/types.js +1 -0
- package/dist/components/pickers/CollectionPicker/types.d.ts +11 -0
- package/dist/components/pickers/CollectionPicker/types.d.ts.map +1 -0
- package/dist/components/pickers/CollectionPicker/types.js +1 -0
- package/dist/components/pickers/ColorPicker/colors.d.ts +13 -0
- package/dist/components/pickers/ColorPicker/colors.d.ts.map +1 -0
- package/dist/components/pickers/ColorPicker/colors.js +266 -0
- package/dist/components/pickers/FilePicker/types.d.ts +10 -0
- package/dist/components/pickers/FilePicker/types.d.ts.map +1 -0
- package/dist/components/pickers/FilePicker/types.js +1 -0
- package/dist/index.d.ts +91 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +196 -0
- package/dist/theme.d.ts +73 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +279 -0
- package/dist/themes/blank.d.ts +7 -0
- package/dist/themes/blank.d.ts.map +1 -0
- package/dist/themes/blank.js +543 -0
- package/dist/themes/crimson-dark.d.ts +4 -0
- package/dist/themes/crimson-dark.d.ts.map +1 -0
- package/dist/themes/crimson-dark.js +552 -0
- package/dist/themes/cyan-light.d.ts +4 -0
- package/dist/themes/cyan-light.d.ts.map +1 -0
- package/dist/themes/cyan-light.js +552 -0
- package/dist/themes/dark.d.ts +4 -0
- package/dist/themes/dark.d.ts.map +1 -0
- package/dist/themes/dark.js +551 -0
- package/dist/themes/gold-dark.d.ts +4 -0
- package/dist/themes/gold-dark.d.ts.map +1 -0
- package/dist/themes/gold-dark.js +552 -0
- package/dist/themes/grass-dark.d.ts +4 -0
- package/dist/themes/grass-dark.d.ts.map +1 -0
- package/dist/themes/grass-dark.js +552 -0
- package/dist/themes/indigo.d.ts +4 -0
- package/dist/themes/indigo.d.ts.map +1 -0
- package/dist/themes/indigo.js +552 -0
- package/dist/themes/light.d.ts +4 -0
- package/dist/themes/light.d.ts.map +1 -0
- package/dist/themes/light.js +551 -0
- package/dist/themes/orange-dark.d.ts +4 -0
- package/dist/themes/orange-dark.d.ts.map +1 -0
- package/dist/themes/orange-dark.js +551 -0
- package/dist/themes/orange-light.d.ts +4 -0
- package/dist/themes/orange-light.d.ts.map +1 -0
- package/dist/themes/orange-light.js +551 -0
- package/package.json +62 -0
- package/src/components/controls/Button/Button.vue +417 -0
- package/src/components/controls/Button/README.md +348 -0
- package/src/components/controls/Button/theme.css +200 -0
- package/src/components/controls/Checkbox/Checkbox.vue +164 -0
- package/src/components/controls/Checkbox/README.md +441 -0
- package/src/components/controls/Checkbox/theme.css +36 -0
- package/src/components/controls/Dropdown/Dropdown.vue +476 -0
- package/src/components/controls/Dropdown/README.md +370 -0
- package/src/components/controls/Dropdown/theme.css +50 -0
- package/src/components/controls/Dropdown/types.ts +6 -0
- package/src/components/controls/IconButton/IconButton.vue +267 -0
- package/src/components/controls/IconButton/README.md +502 -0
- package/src/components/controls/IconButton/theme.css +89 -0
- package/src/components/controls/Radio/README.md +591 -0
- package/src/components/controls/Radio/Radio.vue +89 -0
- package/src/components/controls/Radio/theme.css +14 -0
- package/src/components/controls/RangeSlider/README.md +608 -0
- package/src/components/controls/RangeSlider/RangeSlider.vue +535 -0
- package/src/components/controls/RangeSlider/theme.css +80 -0
- package/src/components/controls/SegmentedControl/README.md +587 -0
- package/src/components/controls/SegmentedControl/SegmentedControl.vue +284 -0
- package/src/components/controls/SegmentedControl/theme.css +60 -0
- package/src/components/controls/SegmentedControl/types.ts +5 -0
- package/src/components/controls/Slider/README.md +627 -0
- package/src/components/controls/Slider/Slider.vue +260 -0
- package/src/components/controls/Slider/theme.css +74 -0
- package/src/components/controls/Stepper/README.md +601 -0
- package/src/components/controls/Stepper/Stepper.vue +103 -0
- package/src/components/controls/Stepper/theme.css +53 -0
- package/src/components/controls/Switch/README.md +667 -0
- package/src/components/controls/Switch/Switch.vue +127 -0
- package/src/components/controls/Switch/theme.css +42 -0
- package/src/components/dialogs/Alert/Alert.vue +218 -0
- package/src/components/dialogs/Alert/README.md +450 -0
- package/src/components/dialogs/Alert/theme.css +44 -0
- package/src/components/dialogs/Alert/types.ts +11 -0
- package/src/components/dialogs/Toast/README.md +522 -0
- package/src/components/dialogs/Toast/Toast.vue +296 -0
- package/src/components/dialogs/Toast/ToastContainer.vue +330 -0
- package/src/components/dialogs/Toast/theme.css +44 -0
- package/src/components/dialogs/Toast/types.ts +46 -0
- package/src/components/dialogs/Toast/useToast.ts +127 -0
- package/src/components/indicators/ProgressBar/ProgressBar.vue +98 -0
- package/src/components/indicators/ProgressBar/README.md +744 -0
- package/src/components/indicators/ProgressBar/theme.css +36 -0
- package/src/components/indicators/Tooltip/README.md +723 -0
- package/src/components/indicators/Tooltip/TooltipProvider.vue +142 -0
- package/src/components/indicators/Tooltip/theme.css +18 -0
- package/src/components/indicators/Tooltip/tooltip.ts +48 -0
- package/src/components/indicators/Tooltip/types.ts +15 -0
- package/src/components/indicators/Tooltip/useTooltip.ts +71 -0
- package/src/components/inputs/AutogrowTextView/AutogrowTextView.vue +110 -0
- package/src/components/inputs/AutogrowTextView/README.md +643 -0
- package/src/components/inputs/AutogrowTextView/theme.css +28 -0
- package/src/components/inputs/InputCard/InputCard.vue +600 -0
- package/src/components/inputs/InputCard/README.md +636 -0
- package/src/components/inputs/InputEmail/InputEmail.vue +698 -0
- package/src/components/inputs/InputEmail/README.md +764 -0
- package/src/components/inputs/InputNumber/InputNumber.vue +300 -0
- package/src/components/inputs/InputNumber/README.md +749 -0
- package/src/components/inputs/InputPhone/InputPhone.vue +645 -0
- package/src/components/inputs/InputPhone/README.md +636 -0
- package/src/components/inputs/InputSecure/InputSecure.vue +646 -0
- package/src/components/inputs/InputSecure/README.md +771 -0
- package/src/components/inputs/InputText/InputText.vue +225 -0
- package/src/components/inputs/InputText/README.md +844 -0
- package/src/components/inputs/OTP/OTP.vue +349 -0
- package/src/components/inputs/OTP/README.md +736 -0
- package/src/components/inputs/OTP/theme.css +50 -0
- package/src/components/inputs/StringCapture/README.md +718 -0
- package/src/components/inputs/StringCapture/StringCapture.vue +315 -0
- package/src/components/inputs/StringCapture/theme.css +86 -0
- package/src/components/inputs/Tags/README.md +897 -0
- package/src/components/inputs/Tags/TagBar.vue +793 -0
- package/src/components/inputs/Tags/TagCreation.vue +219 -0
- package/src/components/inputs/Tags/TagPicker.vue +380 -0
- package/src/components/inputs/Tags/tag-bar-styles.ts +354 -0
- package/src/components/inputs/Tags/theme.css +121 -0
- package/src/components/inputs/Tags/types.ts +346 -0
- package/src/components/inputs/search/README.md +759 -0
- package/src/components/inputs/search/SearchBar.vue +394 -0
- package/src/components/inputs/search/SearchResults.vue +310 -0
- package/src/components/inputs/search/theme.css +187 -0
- package/src/components/inputs/search/types.ts +8 -0
- package/src/components/inputs/theme.css +102 -0
- package/src/components/menus/ActionMenu/ActionMenu.vue +383 -0
- package/src/components/menus/ActionMenu/README.md +825 -0
- package/src/components/menus/ActionMenu/theme.css +93 -0
- package/src/components/models/Popover/Popover.vue +551 -0
- package/src/components/models/Popover/README.md +885 -0
- package/src/components/models/Popover/theme.css +52 -0
- package/src/components/models/Sheet/README.md +1159 -0
- package/src/components/models/Sheet/Sheet.vue +465 -0
- package/src/components/models/Sheet/theme.css +72 -0
- package/src/components/models/Sidebar/README.md +1228 -0
- package/src/components/models/Sidebar/Sidebar.vue +480 -0
- package/src/components/models/Sidebar/theme.css +90 -0
- package/src/components/navigation/adaptive/AdaptiveLayout.vue +779 -0
- package/src/components/navigation/adaptive/AdaptiveLayoutBreadcrumbs.vue +192 -0
- package/src/components/navigation/adaptive/AdaptiveLayoutMenuButton.vue +149 -0
- package/src/components/navigation/adaptive/README.md +768 -0
- package/src/components/navigation/adaptive/types.ts +19 -0
- package/src/components/navigation/adaptive/useAdaptiveLayout.ts +89 -0
- package/src/components/navigation/adaptive/useBreakpoints.ts +41 -0
- package/src/components/navigation/adaptive/useContainerMonitor.ts +214 -0
- package/src/components/navigation/adaptive/useViewAnimation.ts +721 -0
- package/src/components/navigation/adaptive/useViewResize.ts +211 -0
- package/src/components/navigation/navstack/NavigationStack.vue +180 -0
- package/src/components/navigation/navstack/README.md +994 -0
- package/src/components/navigation/navstack/useNavigationStack.ts +164 -0
- package/src/components/navigation/slideover/README.md +1275 -0
- package/src/components/navigation/slideover/SlideoverController.vue +287 -0
- package/src/components/navigation/slideover/useSlideoverController.ts +320 -0
- package/src/components/navigation/splitview/README.md +1115 -0
- package/src/components/navigation/splitview/SplitViewController.vue +176 -0
- package/src/components/navigation/splitview/useSplitViewController.ts +388 -0
- package/src/components/navigation/tabcontroller/README.md +919 -0
- package/src/components/navigation/tabcontroller/TabController.vue +307 -0
- package/src/components/navigation/tabcontroller/TabItem.vue +57 -0
- package/src/components/navigation/tabcontroller/types.ts +24 -0
- package/src/components/navigation/tabcontroller/useTabController.ts +18 -0
- package/src/components/navigation/theme.css +91 -0
- package/src/components/navigation/types.ts +7 -0
- package/src/components/pickers/CollectionPicker/CollectionPicker.vue +398 -0
- package/src/components/pickers/CollectionPicker/README.md +1115 -0
- package/src/components/pickers/CollectionPicker/theme.css +14 -0
- package/src/components/pickers/CollectionPicker/types.ts +11 -0
- package/src/components/pickers/ColorPicker/ColorPicker.vue +376 -0
- package/src/components/pickers/ColorPicker/README.md +1439 -0
- package/src/components/pickers/ColorPicker/colors.ts +299 -0
- package/src/components/pickers/ColorPicker/theme.css +32 -0
- package/src/components/pickers/DatePicker/DatePicker.vue +660 -0
- package/src/components/pickers/DatePicker/README.md +1195 -0
- package/src/components/pickers/DatePicker/theme.css +22 -0
- package/src/components/pickers/FilePicker/FilePicker.vue +534 -0
- package/src/components/pickers/FilePicker/README.md +1542 -0
- package/src/components/pickers/FilePicker/theme.css +48 -0
- package/src/components/pickers/FilePicker/types.ts +10 -0
- package/src/components/pickers/IconPicker/IconPicker.vue +327 -0
- package/src/components/pickers/IconPicker/README.md +1161 -0
- package/src/components/pickers/IconPicker/theme.css +28 -0
- package/src/components/pickers/theme.css +82 -0
- package/src/components/views/MarkdownViewer/MarkdownViewer.vue +442 -0
- package/src/components/views/MarkdownViewer/README.md +833 -0
- package/src/components/views/MarkdownViewer/theme.css +130 -0
- package/src/index.ts +263 -0
- package/src/theme.ts +378 -0
- package/src/themes/crimson-dark.ts +556 -0
- package/src/themes/cyan-light.ts +556 -0
- package/src/themes/dark.ts +557 -0
- package/src/themes/gold-dark.ts +556 -0
- package/src/themes/grass-dark.ts +556 -0
- package/src/themes/indigo.ts +556 -0
- package/src/themes/light.ts +557 -0
- package/src/themes/orange-dark.ts +557 -0
- package/src/themes/orange-light.ts +557 -0
- package/src/vue.d.ts +45 -0
package/dist/theme.d.ts
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { type Ref, type ComputedRef } from "vue";
|
|
2
|
+
export type Theme = "light" | "dark" | "custom";
|
|
3
|
+
export interface ThemeConfig {
|
|
4
|
+
theme: Theme;
|
|
5
|
+
autoDetect: boolean;
|
|
6
|
+
customThemeId?: string;
|
|
7
|
+
customThemeColorMode?: "light" | "dark";
|
|
8
|
+
}
|
|
9
|
+
declare class ThemeManager {
|
|
10
|
+
private currentTheme;
|
|
11
|
+
private autoDetect;
|
|
12
|
+
private mediaQuery;
|
|
13
|
+
private systemThemeListener;
|
|
14
|
+
private customThemeId;
|
|
15
|
+
private customThemeColorMode;
|
|
16
|
+
constructor();
|
|
17
|
+
private initialize;
|
|
18
|
+
private loadConfig;
|
|
19
|
+
private saveConfig;
|
|
20
|
+
private setupSystemThemeDetection;
|
|
21
|
+
private removeSystemThemeListener;
|
|
22
|
+
setTheme(theme: Theme, save?: boolean): void;
|
|
23
|
+
setCustomTheme(customThemeId: string, customThemeColorMode: "light" | "dark", save?: boolean): void;
|
|
24
|
+
getTheme(): Theme;
|
|
25
|
+
getConfig(): ThemeConfig;
|
|
26
|
+
setAutoDetect(enabled: boolean): void;
|
|
27
|
+
isAutoDetectEnabled(): boolean;
|
|
28
|
+
toggleTheme(): void;
|
|
29
|
+
destroy(): void;
|
|
30
|
+
get theme(): Readonly<Ref<Theme>>;
|
|
31
|
+
get customThemeIdRef(): Readonly<Ref<string | undefined>>;
|
|
32
|
+
get customThemeColorModeRef(): Readonly<Ref<"light" | "dark" | undefined>>;
|
|
33
|
+
get autoDetectRef(): Readonly<Ref<boolean>>;
|
|
34
|
+
get configRef(): ComputedRef<ThemeConfig>;
|
|
35
|
+
}
|
|
36
|
+
export declare const themeManager: ThemeManager;
|
|
37
|
+
export declare const currentTheme: Readonly<Ref<Theme, Theme>>;
|
|
38
|
+
export declare const customThemeId: Readonly<Ref<string | undefined, string | undefined>>;
|
|
39
|
+
export declare const customThemeColorMode: Readonly<Ref<"dark" | "light" | undefined, "dark" | "light" | undefined>>;
|
|
40
|
+
export declare const autoDetect: Readonly<Ref<boolean, boolean>>;
|
|
41
|
+
export declare const themeConfig: ComputedRef<ThemeConfig>;
|
|
42
|
+
export declare const setTheme: (theme: Theme, save?: boolean) => void;
|
|
43
|
+
export declare const setCustomTheme: (customThemeId: string, customThemeColorMode: "light" | "dark", save?: boolean) => void;
|
|
44
|
+
export declare const getTheme: () => Theme;
|
|
45
|
+
export declare const getThemeConfig: () => ThemeConfig;
|
|
46
|
+
export declare const toggleTheme: () => void;
|
|
47
|
+
export declare const setAutoDetect: (enabled: boolean) => void;
|
|
48
|
+
export declare const isAutoDetectEnabled: () => boolean;
|
|
49
|
+
export declare const destroyThemeManager: () => void;
|
|
50
|
+
export declare const registerCustomTheme: (themeId: string, cssVariables: Record<string, string>) => void;
|
|
51
|
+
export declare const unregisterCustomTheme: (themeId: string) => void;
|
|
52
|
+
export declare const isThemeRegistered: (themeId: string) => boolean;
|
|
53
|
+
export declare const getRegisteredThemes: () => string[];
|
|
54
|
+
export declare const useTheme: () => {
|
|
55
|
+
theme: Readonly<Ref<Theme, Theme>>;
|
|
56
|
+
customThemeId: Readonly<Ref<string | undefined, string | undefined>>;
|
|
57
|
+
customThemeColorMode: Readonly<Ref<"dark" | "light" | undefined, "dark" | "light" | undefined>>;
|
|
58
|
+
autoDetect: Readonly<Ref<boolean, boolean>>;
|
|
59
|
+
config: ComputedRef<ThemeConfig>;
|
|
60
|
+
setTheme: (theme: Theme, save?: boolean) => void;
|
|
61
|
+
setCustomTheme: (customThemeId: string, customThemeColorMode: "light" | "dark", save?: boolean) => void;
|
|
62
|
+
toggleTheme: () => void;
|
|
63
|
+
setAutoDetect: (enabled: boolean) => void;
|
|
64
|
+
registerCustomTheme: (themeId: string, cssVariables: Record<string, string>) => void;
|
|
65
|
+
unregisterCustomTheme: (themeId: string) => void;
|
|
66
|
+
isThemeRegistered: (themeId: string) => boolean;
|
|
67
|
+
getRegisteredThemes: () => string[];
|
|
68
|
+
getTheme: () => Theme;
|
|
69
|
+
getThemeConfig: () => ThemeConfig;
|
|
70
|
+
isAutoDetectEnabled: () => boolean;
|
|
71
|
+
};
|
|
72
|
+
export {};
|
|
73
|
+
//# sourceMappingURL=theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"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"}
|
package/dist/theme.js
ADDED
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { ref, computed, readonly } from "vue";
|
|
2
|
+
// Track registered themes to avoid duplicates
|
|
3
|
+
const registeredThemes = new Set();
|
|
4
|
+
class ThemeManager {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.currentTheme = ref("light");
|
|
7
|
+
this.autoDetect = ref(true);
|
|
8
|
+
this.mediaQuery = null;
|
|
9
|
+
this.systemThemeListener = null;
|
|
10
|
+
this.customThemeId = ref(undefined);
|
|
11
|
+
this.customThemeColorMode = ref(undefined);
|
|
12
|
+
this.initialize();
|
|
13
|
+
}
|
|
14
|
+
initialize() {
|
|
15
|
+
// Load saved configuration
|
|
16
|
+
const savedConfig = this.loadConfig();
|
|
17
|
+
if (savedConfig) {
|
|
18
|
+
this.autoDetect.value = savedConfig.autoDetect;
|
|
19
|
+
this.customThemeId.value = savedConfig.customThemeId;
|
|
20
|
+
this.customThemeColorMode.value = savedConfig.customThemeColorMode;
|
|
21
|
+
// If auto-detect is enabled, use system theme regardless of saved theme
|
|
22
|
+
if (this.autoDetect.value) {
|
|
23
|
+
this.setupSystemThemeDetection();
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
// Use saved theme only if auto-detect is disabled
|
|
27
|
+
if (savedConfig.theme === "custom" &&
|
|
28
|
+
this.customThemeId.value &&
|
|
29
|
+
this.customThemeColorMode.value) {
|
|
30
|
+
// Properly restore custom theme with both ID and color mode
|
|
31
|
+
this.setCustomTheme(this.customThemeId.value, this.customThemeColorMode.value, false);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
this.setTheme(savedConfig.theme, false);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
// First time setup - default to auto-detect
|
|
40
|
+
this.setupSystemThemeDetection();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
loadConfig() {
|
|
44
|
+
try {
|
|
45
|
+
const saved = localStorage.getItem("umbra-theme-config");
|
|
46
|
+
return saved ? JSON.parse(saved) : null;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
saveConfig() {
|
|
53
|
+
const config = {
|
|
54
|
+
theme: this.currentTheme.value,
|
|
55
|
+
autoDetect: this.autoDetect.value,
|
|
56
|
+
customThemeId: this.customThemeId.value,
|
|
57
|
+
customThemeColorMode: this.customThemeColorMode.value,
|
|
58
|
+
};
|
|
59
|
+
try {
|
|
60
|
+
localStorage.setItem("umbra-theme-config", JSON.stringify(config));
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
console.warn("Failed to save theme configuration:", e);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
setupSystemThemeDetection() {
|
|
67
|
+
// Clean up existing listener if any
|
|
68
|
+
this.removeSystemThemeListener();
|
|
69
|
+
this.mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
|
|
70
|
+
const systemTheme = this.mediaQuery.matches ? "dark" : "light";
|
|
71
|
+
this.setTheme(systemTheme, false);
|
|
72
|
+
// Create and store the listener
|
|
73
|
+
this.systemThemeListener = (e) => {
|
|
74
|
+
if (this.autoDetect.value) {
|
|
75
|
+
this.setTheme(e.matches ? "dark" : "light", false);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
this.mediaQuery.addEventListener("change", this.systemThemeListener);
|
|
79
|
+
}
|
|
80
|
+
removeSystemThemeListener() {
|
|
81
|
+
if (this.mediaQuery && this.systemThemeListener) {
|
|
82
|
+
this.mediaQuery.removeEventListener("change", this.systemThemeListener);
|
|
83
|
+
this.systemThemeListener = null;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
setTheme(theme, save = true) {
|
|
87
|
+
this.currentTheme.value = theme;
|
|
88
|
+
// Remove all theme-related classes and attributes
|
|
89
|
+
document.documentElement.classList.remove("light", "light-theme", "dark", "dark-theme");
|
|
90
|
+
document.documentElement.removeAttribute("data-theme");
|
|
91
|
+
document.documentElement.removeAttribute("data-custom-theme");
|
|
92
|
+
// Apply theme using CSS classes
|
|
93
|
+
if (theme === "custom" && this.customThemeId.value) {
|
|
94
|
+
document.documentElement.setAttribute("data-theme", "custom");
|
|
95
|
+
document.documentElement.setAttribute("data-custom-theme", this.customThemeId.value);
|
|
96
|
+
// Also set the color mode class for custom themes
|
|
97
|
+
if (this.customThemeColorMode.value === "dark") {
|
|
98
|
+
document.documentElement.classList.add("dark", "dark-theme");
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
document.documentElement.classList.add("light", "light-theme");
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else if (theme === "dark") {
|
|
105
|
+
document.documentElement.classList.add("dark", "dark-theme");
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
document.documentElement.classList.add("light", "light-theme");
|
|
109
|
+
}
|
|
110
|
+
if (save) {
|
|
111
|
+
this.saveConfig();
|
|
112
|
+
}
|
|
113
|
+
// Dispatch theme change event
|
|
114
|
+
window.dispatchEvent(new CustomEvent("theme-change", {
|
|
115
|
+
detail: {
|
|
116
|
+
theme,
|
|
117
|
+
customThemeId: theme === "custom" ? this.customThemeId.value : undefined,
|
|
118
|
+
customThemeColorMode: theme === "custom" ? this.customThemeColorMode.value : undefined,
|
|
119
|
+
},
|
|
120
|
+
}));
|
|
121
|
+
}
|
|
122
|
+
setCustomTheme(customThemeId, customThemeColorMode, save = true) {
|
|
123
|
+
this.customThemeId.value = customThemeId;
|
|
124
|
+
this.customThemeColorMode.value = customThemeColorMode;
|
|
125
|
+
this.setTheme("custom", save);
|
|
126
|
+
}
|
|
127
|
+
getTheme() {
|
|
128
|
+
return this.currentTheme.value;
|
|
129
|
+
}
|
|
130
|
+
getConfig() {
|
|
131
|
+
return {
|
|
132
|
+
theme: this.currentTheme.value,
|
|
133
|
+
autoDetect: this.autoDetect.value,
|
|
134
|
+
customThemeId: this.customThemeId.value,
|
|
135
|
+
customThemeColorMode: this.customThemeColorMode.value,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
setAutoDetect(enabled) {
|
|
139
|
+
this.autoDetect.value = enabled;
|
|
140
|
+
if (enabled) {
|
|
141
|
+
this.setupSystemThemeDetection();
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
this.removeSystemThemeListener();
|
|
145
|
+
}
|
|
146
|
+
this.saveConfig();
|
|
147
|
+
}
|
|
148
|
+
isAutoDetectEnabled() {
|
|
149
|
+
return this.autoDetect.value;
|
|
150
|
+
}
|
|
151
|
+
toggleTheme() {
|
|
152
|
+
// Disable auto-detect when manually toggling
|
|
153
|
+
if (this.autoDetect.value) {
|
|
154
|
+
this.setAutoDetect(false);
|
|
155
|
+
}
|
|
156
|
+
// Toggle between light and dark only
|
|
157
|
+
// If custom theme is active, switch to light
|
|
158
|
+
let newTheme;
|
|
159
|
+
switch (this.currentTheme.value) {
|
|
160
|
+
case "light":
|
|
161
|
+
newTheme = "dark";
|
|
162
|
+
break;
|
|
163
|
+
case "dark":
|
|
164
|
+
newTheme = "light";
|
|
165
|
+
break;
|
|
166
|
+
case "custom":
|
|
167
|
+
newTheme = "light";
|
|
168
|
+
break;
|
|
169
|
+
default:
|
|
170
|
+
newTheme = "light";
|
|
171
|
+
}
|
|
172
|
+
this.setTheme(newTheme);
|
|
173
|
+
}
|
|
174
|
+
destroy() {
|
|
175
|
+
this.removeSystemThemeListener();
|
|
176
|
+
}
|
|
177
|
+
// Expose reactive references as readonly for components
|
|
178
|
+
get theme() {
|
|
179
|
+
return readonly(this.currentTheme);
|
|
180
|
+
}
|
|
181
|
+
get customThemeIdRef() {
|
|
182
|
+
return readonly(this.customThemeId);
|
|
183
|
+
}
|
|
184
|
+
get customThemeColorModeRef() {
|
|
185
|
+
return readonly(this.customThemeColorMode);
|
|
186
|
+
}
|
|
187
|
+
get autoDetectRef() {
|
|
188
|
+
return readonly(this.autoDetect);
|
|
189
|
+
}
|
|
190
|
+
// Computed property for the full config
|
|
191
|
+
get configRef() {
|
|
192
|
+
return computed(() => ({
|
|
193
|
+
theme: this.currentTheme.value,
|
|
194
|
+
autoDetect: this.autoDetect.value,
|
|
195
|
+
customThemeId: this.customThemeId.value,
|
|
196
|
+
customThemeColorMode: this.customThemeColorMode.value,
|
|
197
|
+
}));
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// Create singleton instance
|
|
201
|
+
export const themeManager = new ThemeManager();
|
|
202
|
+
// Export reactive references for direct use in components
|
|
203
|
+
export const currentTheme = themeManager.theme;
|
|
204
|
+
export const customThemeId = themeManager.customThemeIdRef;
|
|
205
|
+
export const customThemeColorMode = themeManager.customThemeColorModeRef;
|
|
206
|
+
export const autoDetect = themeManager.autoDetectRef;
|
|
207
|
+
export const themeConfig = themeManager.configRef;
|
|
208
|
+
// Export convenience functions (keep existing API)
|
|
209
|
+
export const setTheme = (theme, save) => themeManager.setTheme(theme, save);
|
|
210
|
+
export const setCustomTheme = (customThemeId, customThemeColorMode, save) => themeManager.setCustomTheme(customThemeId, customThemeColorMode, save);
|
|
211
|
+
export const getTheme = () => themeManager.getTheme();
|
|
212
|
+
export const getThemeConfig = () => themeManager.getConfig();
|
|
213
|
+
export const toggleTheme = () => themeManager.toggleTheme();
|
|
214
|
+
export const setAutoDetect = (enabled) => themeManager.setAutoDetect(enabled);
|
|
215
|
+
export const isAutoDetectEnabled = () => themeManager.isAutoDetectEnabled();
|
|
216
|
+
// Cleanup function for SPA navigation
|
|
217
|
+
export const destroyThemeManager = () => themeManager.destroy();
|
|
218
|
+
// Custom theme registration utilities
|
|
219
|
+
export const registerCustomTheme = (themeId, cssVariables) => {
|
|
220
|
+
// Check if already registered
|
|
221
|
+
if (registeredThemes.has(themeId)) {
|
|
222
|
+
console.warn(`Theme "${themeId}" is already registered`);
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
// Check if style element already exists (e.g., from hot reload)
|
|
226
|
+
const existing = document.querySelector(`style[data-umbra-custom-theme="${themeId}"]`);
|
|
227
|
+
if (existing) {
|
|
228
|
+
existing.remove();
|
|
229
|
+
}
|
|
230
|
+
const style = document.createElement("style");
|
|
231
|
+
style.setAttribute("data-umbra-custom-theme", themeId);
|
|
232
|
+
const cssVars = Object.entries(cssVariables)
|
|
233
|
+
.map(([key, value]) => ` ${key}: ${value};`)
|
|
234
|
+
.join("\n");
|
|
235
|
+
style.textContent = `
|
|
236
|
+
[data-theme="custom"][data-custom-theme="${themeId}"] {
|
|
237
|
+
${cssVars}
|
|
238
|
+
}`;
|
|
239
|
+
document.head.appendChild(style);
|
|
240
|
+
registeredThemes.add(themeId);
|
|
241
|
+
};
|
|
242
|
+
export const unregisterCustomTheme = (themeId) => {
|
|
243
|
+
const styleElement = document.querySelector(`style[data-umbra-custom-theme="${themeId}"]`);
|
|
244
|
+
if (styleElement) {
|
|
245
|
+
styleElement.remove();
|
|
246
|
+
registeredThemes.delete(themeId);
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
export const isThemeRegistered = (themeId) => {
|
|
250
|
+
return registeredThemes.has(themeId);
|
|
251
|
+
};
|
|
252
|
+
export const getRegisteredThemes = () => {
|
|
253
|
+
return Array.from(registeredThemes);
|
|
254
|
+
};
|
|
255
|
+
// Composable for use in Vue components
|
|
256
|
+
export const useTheme = () => {
|
|
257
|
+
return {
|
|
258
|
+
// Reactive refs
|
|
259
|
+
theme: currentTheme,
|
|
260
|
+
customThemeId,
|
|
261
|
+
customThemeColorMode,
|
|
262
|
+
autoDetect,
|
|
263
|
+
config: themeConfig,
|
|
264
|
+
// Methods
|
|
265
|
+
setTheme,
|
|
266
|
+
setCustomTheme,
|
|
267
|
+
toggleTheme,
|
|
268
|
+
setAutoDetect,
|
|
269
|
+
// Custom theme registration (for advanced usage)
|
|
270
|
+
registerCustomTheme,
|
|
271
|
+
unregisterCustomTheme,
|
|
272
|
+
isThemeRegistered,
|
|
273
|
+
getRegisteredThemes,
|
|
274
|
+
// Non-reactive getters (for backward compatibility)
|
|
275
|
+
getTheme,
|
|
276
|
+
getThemeConfig,
|
|
277
|
+
isAutoDetectEnabled,
|
|
278
|
+
};
|
|
279
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blank.d.ts","sourceRoot":"","sources":["../../src/themes/blank.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED,eAAO,MAAM,aAAa,EAAE,WAwhB3B,CAAC;AAGF,eAAe,aAAa,CAAC"}
|