@camstack/ui-library 0.1.38 → 0.1.40

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.
Files changed (159) hide show
  1. package/dist/composites/addon-global-settings-form.d.ts +60 -0
  2. package/dist/composites/addon-page-props.d.ts +12 -0
  3. package/dist/composites/agent-step-editor.d.ts +15 -0
  4. package/dist/composites/app-shell/app-shell.d.ts +19 -0
  5. package/dist/composites/app-shell/index.d.ts +3 -0
  6. package/dist/composites/app-shell/sidebar-item.d.ts +10 -0
  7. package/dist/composites/app-shell/sidebar.d.ts +14 -0
  8. package/dist/composites/audio-classification-list.d.ts +20 -0
  9. package/dist/composites/audio-level-waveform.d.ts +35 -0
  10. package/dist/composites/audio-waveform.d.ts +20 -0
  11. package/dist/composites/battery-badge.d.ts +12 -0
  12. package/dist/composites/breadcrumb.d.ts +25 -0
  13. package/dist/composites/camera-stream-player.d.ts +87 -0
  14. package/dist/composites/code-block.d.ts +6 -0
  15. package/dist/composites/config-form-builder.d.ts +18 -0
  16. package/dist/composites/config-form-field.d.ts +70 -0
  17. package/dist/composites/confirm-action-button.d.ts +41 -0
  18. package/dist/composites/confirm-dialog.d.ts +13 -0
  19. package/dist/composites/data-table/data-table-header.d.ts +10 -0
  20. package/dist/composites/data-table/data-table-pagination.d.ts +9 -0
  21. package/dist/composites/data-table/data-table-row.d.ts +10 -0
  22. package/dist/composites/data-table/data-table.d.ts +2 -0
  23. package/dist/composites/data-table/index.d.ts +2 -0
  24. package/dist/composites/data-table/types.d.ts +34 -0
  25. package/dist/composites/data-table.d.ts +37 -0
  26. package/dist/composites/detection-canvas.d.ts +29 -0
  27. package/dist/composites/detection-colors.d.ts +15 -0
  28. package/dist/composites/detection-overlay.d.ts +9 -0
  29. package/dist/composites/detection-result-tree.d.ts +11 -0
  30. package/dist/composites/dev-shell.d.ts +20 -0
  31. package/dist/composites/device-activity-panel.d.ts +29 -0
  32. package/dist/composites/device-card.d.ts +38 -0
  33. package/dist/composites/device-grid.d.ts +12 -0
  34. package/dist/composites/device-item/actions.d.ts +9 -0
  35. package/dist/composites/device-item/children-accordion.d.ts +11 -0
  36. package/dist/composites/device-item/features.d.ts +17 -0
  37. package/dist/composites/device-item/header.d.ts +14 -0
  38. package/dist/composites/device-item/helpers.d.ts +147 -0
  39. package/dist/composites/device-item/index.d.ts +5 -0
  40. package/dist/composites/device-item/preview.d.ts +23 -0
  41. package/dist/composites/device-item/status-dot.d.ts +5 -0
  42. package/dist/composites/device-list/empty-state.d.ts +6 -0
  43. package/dist/composites/device-list/filter-chips.d.ts +19 -0
  44. package/dist/composites/device-list/group.d.ts +6 -0
  45. package/dist/composites/device-list/index.d.ts +31 -0
  46. package/dist/composites/device-list/pagination.d.ts +18 -0
  47. package/dist/composites/device-list/url-state.d.ts +24 -0
  48. package/dist/composites/discovery-panel.d.ts +26 -0
  49. package/dist/composites/doorbell-recent-panel.d.ts +10 -0
  50. package/dist/composites/empty-state.d.ts +10 -0
  51. package/dist/composites/event-stream.d.ts +48 -0
  52. package/dist/composites/filter-bar.d.ts +28 -0
  53. package/dist/composites/form-field.d.ts +11 -0
  54. package/dist/composites/image-selector.d.ts +25 -0
  55. package/dist/composites/index.d.ts +99 -0
  56. package/dist/composites/inference-config-selector.d.ts +44 -0
  57. package/dist/composites/kebab-menu.d.ts +39 -0
  58. package/dist/composites/key-value-list.d.ts +9 -0
  59. package/dist/composites/log-stream.d.ts +61 -0
  60. package/dist/composites/login-form.d.ts +8 -0
  61. package/dist/composites/mount-addon-page.d.ts +16 -0
  62. package/dist/composites/node-picker.d.ts +15 -0
  63. package/dist/composites/page-header.d.ts +8 -0
  64. package/dist/composites/phase-icon.d.ts +5 -0
  65. package/dist/composites/pipeline-builder.d.ts +43 -0
  66. package/dist/composites/pipeline-runtime-selector.d.ts +16 -0
  67. package/dist/composites/pipeline-step.d.ts +65 -0
  68. package/dist/composites/pipeline-tree-matrix.d.ts +31 -0
  69. package/dist/composites/provider-badge.d.ts +7 -0
  70. package/dist/composites/ptz-overlay.d.ts +20 -0
  71. package/dist/composites/response-log.d.ts +9 -0
  72. package/dist/composites/slide-over-panel.d.ts +11 -0
  73. package/dist/composites/snapshot-button.d.ts +25 -0
  74. package/dist/composites/stat-card.d.ts +10 -0
  75. package/dist/composites/state-values-stream.d.ts +30 -0
  76. package/dist/composites/status-badge.d.ts +10 -0
  77. package/dist/composites/step-timings.d.ts +9 -0
  78. package/dist/composites/step-tree-master.d.ts +28 -0
  79. package/dist/composites/stream-panel.d.ts +143 -0
  80. package/dist/composites/version-badge.d.ts +24 -0
  81. package/dist/composites/widget-slot.d.ts +20 -0
  82. package/dist/contexts/custom-field-renderers.d.ts +26 -0
  83. package/dist/contexts/device-context.d.ts +20 -0
  84. package/dist/contexts/player-overlays.d.ts +56 -0
  85. package/dist/contexts/system-context.d.ts +19 -0
  86. package/dist/contexts/widget-registry.d.ts +68 -0
  87. package/dist/contexts/zone-editing.d.ts +59 -0
  88. package/dist/generated/system-hooks.d.ts +933 -0
  89. package/dist/hooks/index.d.ts +27 -0
  90. package/dist/hooks/use-cluster-nodes.d.ts +17 -0
  91. package/dist/hooks/use-debounced-string.d.ts +1 -0
  92. package/dist/hooks/use-device-battery.d.ts +14 -0
  93. package/dist/hooks/use-device-capability.d.ts +17 -0
  94. package/dist/hooks/use-device-detections.d.ts +50 -0
  95. package/dist/hooks/use-device-features.d.ts +25 -0
  96. package/dist/hooks/use-device-proxy.d.ts +106 -0
  97. package/dist/hooks/use-device-snapshot.d.ts +10 -0
  98. package/dist/hooks/use-device-webrtc.d.ts +108 -0
  99. package/dist/hooks/use-devices.d.ts +13 -0
  100. package/dist/hooks/use-doorbell-events.d.ts +20 -0
  101. package/dist/hooks/use-event-invalidation.d.ts +1 -0
  102. package/dist/hooks/use-event-stream.d.ts +5 -0
  103. package/dist/hooks/use-is-mobile.d.ts +8 -0
  104. package/dist/hooks/use-live-buffer.d.ts +8 -0
  105. package/dist/hooks/use-live-event.d.ts +3 -0
  106. package/dist/hooks/use-ptz.d.ts +54 -0
  107. package/dist/hooks/use-system-query.d.ts +12 -0
  108. package/dist/icons/index.d.ts +2 -0
  109. package/dist/icons/provider-icons.d.ts +3 -0
  110. package/dist/icons/status-icons.d.ts +3 -0
  111. package/dist/index.cjs +24217 -3992
  112. package/dist/index.cjs.map +1 -1
  113. package/dist/index.d.ts +14 -744
  114. package/dist/index.js +23553 -3936
  115. package/dist/index.js.map +1 -1
  116. package/dist/lib/cn.d.ts +2 -0
  117. package/dist/lib/index.d.ts +8 -0
  118. package/dist/lib/mf-runtime-init.d.ts +1 -0
  119. package/dist/lib/phase-config.d.ts +16 -0
  120. package/dist/lib/pipeline-mirror.d.ts +23 -0
  121. package/dist/lib/responsive.d.ts +81 -0
  122. package/dist/lib/shared-context.d.ts +5 -0
  123. package/dist/lib/validate-template.d.ts +2 -0
  124. package/dist/primitives/badge.d.ts +11 -0
  125. package/dist/primitives/bottom-sheet.d.ts +9 -0
  126. package/dist/primitives/button.d.ts +10 -0
  127. package/dist/primitives/card.d.ts +9 -0
  128. package/dist/primitives/checkbox.d.ts +4 -0
  129. package/dist/primitives/collapsible-card.d.ts +15 -0
  130. package/dist/primitives/dialog.d.ts +20 -0
  131. package/dist/primitives/dropdown.d.ts +19 -0
  132. package/dist/primitives/floating-panel.d.ts +22 -0
  133. package/dist/primitives/icon-button.d.ts +13 -0
  134. package/dist/primitives/index.d.ts +21 -0
  135. package/dist/primitives/input.d.ts +11 -0
  136. package/dist/primitives/label.d.ts +4 -0
  137. package/dist/primitives/mobile-drawer.d.ts +10 -0
  138. package/dist/primitives/popover.d.ts +10 -0
  139. package/dist/primitives/scroll-area.d.ts +4 -0
  140. package/dist/primitives/select.d.ts +9 -0
  141. package/dist/primitives/separator.d.ts +9 -0
  142. package/dist/primitives/skeleton.d.ts +4 -0
  143. package/dist/primitives/switch.d.ts +7 -0
  144. package/dist/primitives/tabs.d.ts +17 -0
  145. package/dist/primitives/tooltip.d.ts +6 -0
  146. package/dist/theme/create-theme.d.ts +2 -0
  147. package/dist/theme/defaults.d.ts +4 -0
  148. package/dist/theme/index.cjs +230 -250
  149. package/dist/theme/index.cjs.map +1 -1
  150. package/dist/theme/index.d.ts +6 -128
  151. package/dist/theme/index.js +214 -216
  152. package/dist/theme/index.js.map +1 -1
  153. package/dist/theme/theme-provider.d.ts +10 -0
  154. package/dist/theme/theme-to-css.d.ts +2 -0
  155. package/dist/theme/{index.d.cts → types.d.ts} +5 -27
  156. package/dist/theme/use-theme-mode.d.ts +2 -0
  157. package/dist/trpc-react.d.ts +7 -0
  158. package/package.json +23 -4
  159. package/dist/index.d.cts +0 -744
@@ -1,128 +1,6 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { ReactNode } from 'react';
3
-
4
- interface CamStackColorTokens {
5
- primary: string;
6
- primaryForeground: string;
7
- background: string;
8
- backgroundElevated: string;
9
- surface: string;
10
- surfaceHover: string;
11
- border: string;
12
- borderSubtle: string;
13
- foreground: string;
14
- foregroundMuted: string;
15
- foregroundSubtle: string;
16
- foregroundDisabled: string;
17
- success: string;
18
- warning: string;
19
- danger: string;
20
- info: string;
21
- provider: {
22
- frigate: string;
23
- scrypted: string;
24
- reolink: string;
25
- homeAssistant: string;
26
- rtsp: string;
27
- };
28
- }
29
- interface CamStackTheme {
30
- colors: {
31
- dark: CamStackColorTokens;
32
- light: CamStackColorTokens;
33
- };
34
- spacing: {
35
- xs: number;
36
- sm: number;
37
- md: number;
38
- lg: number;
39
- xl: number;
40
- '2xl': number;
41
- '3xl': number;
42
- };
43
- radius: {
44
- sm: number;
45
- md: number;
46
- lg: number;
47
- xl: number;
48
- };
49
- typography: {
50
- fontFamily: string;
51
- sizes: {
52
- xs: {
53
- fontSize: number;
54
- lineHeight: number;
55
- };
56
- sm: {
57
- fontSize: number;
58
- lineHeight: number;
59
- };
60
- base: {
61
- fontSize: number;
62
- lineHeight: number;
63
- };
64
- lg: {
65
- fontSize: number;
66
- lineHeight: number;
67
- };
68
- xl: {
69
- fontSize: number;
70
- lineHeight: number;
71
- };
72
- '2xl': {
73
- fontSize: number;
74
- lineHeight: number;
75
- };
76
- '3xl': {
77
- fontSize: number;
78
- lineHeight: number;
79
- };
80
- };
81
- weights: {
82
- regular: number;
83
- medium: number;
84
- semibold: number;
85
- bold: number;
86
- };
87
- };
88
- table: {
89
- rowHeight: number;
90
- headerHeight: number;
91
- cellPaddingX: number;
92
- cellPaddingY: number;
93
- };
94
- sidebar: {
95
- width: number;
96
- itemHeight: number;
97
- iconSize: number;
98
- };
99
- }
100
- type ThemeMode = 'dark' | 'light' | 'system';
101
- type DeepPartial<T> = {
102
- [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
103
- };
104
- interface UseThemeModeReturn {
105
- mode: ThemeMode;
106
- resolvedMode: 'dark' | 'light';
107
- setMode: (mode: ThemeMode) => void;
108
- toggleMode: () => void;
109
- }
110
-
111
- declare const darkColors: CamStackColorTokens;
112
- declare const lightColors: CamStackColorTokens;
113
- declare const defaultTheme: CamStackTheme;
114
-
115
- declare function createTheme(overrides?: DeepPartial<CamStackTheme>): CamStackTheme;
116
-
117
- declare function themeToCss(theme: CamStackTheme): string;
118
-
119
- interface ThemeProviderProps {
120
- children: ReactNode;
121
- defaultMode?: ThemeMode;
122
- storageKey?: string;
123
- }
124
- declare function ThemeProvider({ children, defaultMode, storageKey, }: ThemeProviderProps): react_jsx_runtime.JSX.Element;
125
-
126
- declare function useThemeMode(): UseThemeModeReturn;
127
-
128
- export { type CamStackColorTokens, type CamStackTheme, type DeepPartial, type ThemeMode, ThemeProvider, type UseThemeModeReturn, createTheme, darkColors, defaultTheme, lightColors, themeToCss, useThemeMode };
1
+ export type { CamStackColorTokens, CamStackTheme, ThemeMode, DeepPartial, UseThemeModeReturn, } from './types';
2
+ export { darkColors, lightColors, defaultTheme } from './defaults';
3
+ export { createTheme } from './create-theme';
4
+ export { themeToCss } from './theme-to-css';
5
+ export { ThemeProvider } from './theme-provider';
6
+ export { useThemeMode } from './use-theme-mode';
@@ -1,168 +1,176 @@
1
- // src/theme/defaults.ts
1
+ import { createContext, useCallback, useContext, useEffect, useMemo, useState } from "react";
2
+ import { jsx } from "react/jsx-runtime";
3
+ //#region src/theme/defaults.ts
2
4
  var providerColors = {
3
- frigate: "#3b82f6",
4
- scrypted: "#a855f7",
5
- reolink: "#06b6d4",
6
- homeAssistant: "#22d3ee",
7
- rtsp: "#78716c"
5
+ frigate: "#3b82f6",
6
+ scrypted: "#a855f7",
7
+ reolink: "#06b6d4",
8
+ homeAssistant: "#22d3ee",
9
+ rtsp: "#78716c"
8
10
  };
9
11
  var darkColors = {
10
- primary: "#f59e42",
11
- primaryForeground: "#0c0a09",
12
- background: "#0c0a09",
13
- backgroundElevated: "#1c1917",
14
- surface: "#1c1917",
15
- surfaceHover: "#292524",
16
- border: "#292524",
17
- borderSubtle: "#1c1917",
18
- foreground: "#fafaf9",
19
- foregroundMuted: "#a8a29e",
20
- foregroundSubtle: "#78716c",
21
- foregroundDisabled: "#57534e",
22
- success: "#4ade80",
23
- warning: "#fbbf24",
24
- danger: "#f87171",
25
- info: "#60a5fa",
26
- provider: providerColors
12
+ primary: "#f59e42",
13
+ primaryForeground: "#0c0a09",
14
+ background: "#0c0a09",
15
+ backgroundElevated: "#1c1917",
16
+ surface: "#1c1917",
17
+ surfaceHover: "#292524",
18
+ border: "#292524",
19
+ borderSubtle: "#1c1917",
20
+ foreground: "#fafaf9",
21
+ foregroundMuted: "#a8a29e",
22
+ foregroundSubtle: "#78716c",
23
+ foregroundDisabled: "#57534e",
24
+ success: "#4ade80",
25
+ warning: "#fbbf24",
26
+ danger: "#f87171",
27
+ info: "#60a5fa",
28
+ provider: providerColors
27
29
  };
28
30
  var lightColors = {
29
- primary: "#e67e22",
30
- primaryForeground: "#ffffff",
31
- background: "#fafaf9",
32
- backgroundElevated: "#ffffff",
33
- surface: "#f5f5f4",
34
- surfaceHover: "#e7e5e4",
35
- border: "#d6d3d1",
36
- borderSubtle: "#e7e5e4",
37
- foreground: "#1c1917",
38
- foregroundMuted: "#57534e",
39
- foregroundSubtle: "#78716c",
40
- foregroundDisabled: "#a8a29e",
41
- success: "#16a34a",
42
- warning: "#d97706",
43
- danger: "#dc2626",
44
- info: "#2563eb",
45
- provider: providerColors
31
+ primary: "#e67e22",
32
+ primaryForeground: "#ffffff",
33
+ background: "#fafaf9",
34
+ backgroundElevated: "#ffffff",
35
+ surface: "#f5f5f4",
36
+ surfaceHover: "#e7e5e4",
37
+ border: "#d6d3d1",
38
+ borderSubtle: "#e7e5e4",
39
+ foreground: "#1c1917",
40
+ foregroundMuted: "#57534e",
41
+ foregroundSubtle: "#78716c",
42
+ foregroundDisabled: "#a8a29e",
43
+ success: "#16a34a",
44
+ warning: "#d97706",
45
+ danger: "#dc2626",
46
+ info: "#2563eb",
47
+ provider: providerColors
46
48
  };
47
49
  var defaultTheme = {
48
- colors: {
49
- dark: darkColors,
50
- light: lightColors
51
- },
52
- spacing: {
53
- xs: 2,
54
- sm: 4,
55
- md: 8,
56
- lg: 12,
57
- xl: 16,
58
- "2xl": 24,
59
- "3xl": 32
60
- },
61
- radius: {
62
- sm: 4,
63
- md: 6,
64
- lg: 8,
65
- xl: 12
66
- },
67
- typography: {
68
- fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',
69
- sizes: {
70
- xs: { fontSize: 10, lineHeight: 14 },
71
- sm: { fontSize: 11, lineHeight: 16 },
72
- base: { fontSize: 12, lineHeight: 18 },
73
- lg: { fontSize: 13, lineHeight: 18 },
74
- xl: { fontSize: 14, lineHeight: 20 },
75
- "2xl": { fontSize: 16, lineHeight: 22 },
76
- "3xl": { fontSize: 20, lineHeight: 28 }
77
- },
78
- weights: {
79
- regular: 400,
80
- medium: 500,
81
- semibold: 600,
82
- bold: 700
83
- }
84
- },
85
- table: {
86
- rowHeight: 28,
87
- headerHeight: 24,
88
- cellPaddingX: 8,
89
- cellPaddingY: 6
90
- },
91
- sidebar: {
92
- width: 176,
93
- itemHeight: 28,
94
- iconSize: 14
95
- }
50
+ colors: {
51
+ dark: darkColors,
52
+ light: lightColors
53
+ },
54
+ spacing: {
55
+ xs: 2,
56
+ sm: 4,
57
+ md: 8,
58
+ lg: 12,
59
+ xl: 16,
60
+ "2xl": 24,
61
+ "3xl": 32
62
+ },
63
+ radius: {
64
+ sm: 4,
65
+ md: 6,
66
+ lg: 8,
67
+ xl: 12
68
+ },
69
+ typography: {
70
+ fontFamily: "-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif",
71
+ sizes: {
72
+ xs: {
73
+ fontSize: 10,
74
+ lineHeight: 14
75
+ },
76
+ sm: {
77
+ fontSize: 11,
78
+ lineHeight: 16
79
+ },
80
+ base: {
81
+ fontSize: 12,
82
+ lineHeight: 18
83
+ },
84
+ lg: {
85
+ fontSize: 13,
86
+ lineHeight: 18
87
+ },
88
+ xl: {
89
+ fontSize: 14,
90
+ lineHeight: 20
91
+ },
92
+ "2xl": {
93
+ fontSize: 16,
94
+ lineHeight: 22
95
+ },
96
+ "3xl": {
97
+ fontSize: 20,
98
+ lineHeight: 28
99
+ }
100
+ },
101
+ weights: {
102
+ regular: 400,
103
+ medium: 500,
104
+ semibold: 600,
105
+ bold: 700
106
+ }
107
+ },
108
+ table: {
109
+ rowHeight: 28,
110
+ headerHeight: 24,
111
+ cellPaddingX: 8,
112
+ cellPaddingY: 6
113
+ },
114
+ sidebar: {
115
+ width: 176,
116
+ itemHeight: 28,
117
+ iconSize: 14
118
+ }
96
119
  };
97
-
98
- // src/theme/create-theme.ts
120
+ //#endregion
121
+ //#region src/theme/create-theme.ts
99
122
  function deepMerge(target, source) {
100
- const result = { ...target };
101
- for (const key in source) {
102
- const sourceVal = source[key];
103
- const targetVal = target[key];
104
- if (sourceVal !== void 0 && typeof sourceVal === "object" && sourceVal !== null && !Array.isArray(sourceVal) && typeof targetVal === "object" && targetVal !== null) {
105
- result[key] = deepMerge(
106
- targetVal,
107
- sourceVal
108
- );
109
- } else if (sourceVal !== void 0) {
110
- result[key] = sourceVal;
111
- }
112
- }
113
- return result;
123
+ const result = { ...target };
124
+ for (const key in source) {
125
+ const sourceVal = source[key];
126
+ const targetVal = target[key];
127
+ if (sourceVal !== void 0 && typeof sourceVal === "object" && sourceVal !== null && !Array.isArray(sourceVal) && typeof targetVal === "object" && targetVal !== null) result[key] = deepMerge(targetVal, sourceVal);
128
+ else if (sourceVal !== void 0) result[key] = sourceVal;
129
+ }
130
+ return result;
114
131
  }
115
132
  function createTheme(overrides) {
116
- if (!overrides) return structuredClone(defaultTheme);
117
- return deepMerge(structuredClone(defaultTheme), overrides);
133
+ if (!overrides) return structuredClone(defaultTheme);
134
+ return deepMerge(structuredClone(defaultTheme), overrides);
118
135
  }
119
-
120
- // src/theme/theme-to-css.ts
136
+ //#endregion
137
+ //#region src/theme/theme-to-css.ts
121
138
  function camelToKebab(str) {
122
- return str.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);
139
+ return str.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);
123
140
  }
124
141
  function colorTokenToCssVar(key) {
125
- return `--color-${camelToKebab(key)}`;
142
+ return `--color-${camelToKebab(key)}`;
126
143
  }
127
144
  function generateColorBlock(colors) {
128
- const lines = [];
129
- for (const [key, value] of Object.entries(colors)) {
130
- if (key === "provider") continue;
131
- lines.push(` ${colorTokenToCssVar(key)}: ${value};`);
132
- }
133
- return lines.join("\n");
145
+ const lines = [];
146
+ for (const [key, value] of Object.entries(colors)) {
147
+ if (key === "provider") continue;
148
+ lines.push(` ${colorTokenToCssVar(key)}: ${value};`);
149
+ }
150
+ return lines.join("\n");
134
151
  }
135
152
  function generateProviderColors(provider) {
136
- const lines = [];
137
- for (const [key, value] of Object.entries(provider)) {
138
- lines.push(` --color-provider-${camelToKebab(key)}: ${value};`);
139
- }
140
- return lines.join("\n");
153
+ const lines = [];
154
+ for (const [key, value] of Object.entries(provider)) lines.push(` --color-provider-${camelToKebab(key)}: ${value};`);
155
+ return lines.join("\n");
141
156
  }
142
157
  function generateSpacingTokens(spacing) {
143
- const lines = [];
144
- for (const [key, value] of Object.entries(spacing)) {
145
- lines.push(` --spacing-${key}: ${value}px;`);
146
- }
147
- return lines.join("\n");
158
+ const lines = [];
159
+ for (const [key, value] of Object.entries(spacing)) lines.push(` --spacing-${key}: ${value}px;`);
160
+ return lines.join("\n");
148
161
  }
149
162
  function generateRadiusTokens(radius) {
150
- const lines = [];
151
- for (const [key, value] of Object.entries(radius)) {
152
- lines.push(` --radius-${key}: ${value}px;`);
153
- }
154
- return lines.join("\n");
163
+ const lines = [];
164
+ for (const [key, value] of Object.entries(radius)) lines.push(` --radius-${key}: ${value}px;`);
165
+ return lines.join("\n");
155
166
  }
156
167
  function themeToCss(theme) {
157
- const darkColorBlock = generateColorBlock(theme.colors.dark);
158
- const lightColorBlock = generateColorBlock(theme.colors.light);
159
- const providerBlock = generateProviderColors(theme.colors.dark.provider);
160
- const spacingBlock = generateSpacingTokens(theme.spacing);
161
- const radiusBlock = generateRadiusTokens(theme.radius);
162
- return `@theme {
163
- ${providerBlock}
164
- ${spacingBlock}
165
- ${radiusBlock}
168
+ const darkColorBlock = generateColorBlock(theme.colors.dark);
169
+ const lightColorBlock = generateColorBlock(theme.colors.light);
170
+ return `@theme {
171
+ ${generateProviderColors(theme.colors.dark.provider)}
172
+ ${generateSpacingTokens(theme.spacing)}
173
+ ${generateRadiusTokens(theme.radius)}
166
174
  }
167
175
 
168
176
  .dark {
@@ -175,99 +183,89 @@ ${lightColorBlock}
175
183
 
176
184
  @media (prefers-color-scheme: dark) {
177
185
  :root {
178
- ${darkColorBlock.replace(/^ /gm, " ")}
186
+ ${darkColorBlock.replace(/^ {2}/gm, " ")}
179
187
  }
180
188
  }
181
189
 
182
190
  @media (prefers-color-scheme: light) {
183
191
  :root {
184
- ${lightColorBlock.replace(/^ /gm, " ")}
192
+ ${lightColorBlock.replace(/^ {2}/gm, " ")}
185
193
  }
186
194
  }
187
195
  `;
188
196
  }
189
-
190
- // src/theme/theme-provider.tsx
191
- import { createContext, useCallback, useEffect, useMemo, useState } from "react";
192
- import { jsx } from "react/jsx-runtime";
197
+ //#endregion
198
+ //#region src/theme/theme-provider.tsx
193
199
  var ThemeContext = createContext(null);
194
- var TOGGLE_ORDER = ["dark", "light", "system"];
200
+ var TOGGLE_ORDER = [
201
+ "dark",
202
+ "light",
203
+ "system"
204
+ ];
195
205
  function getSystemPreference() {
196
- if (typeof window === "undefined") return "dark";
197
- return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
206
+ if (typeof window === "undefined") return "dark";
207
+ return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
198
208
  }
199
209
  function getInitialMode(storageKey, defaultMode) {
200
- if (typeof window === "undefined") return defaultMode;
201
- const stored = localStorage.getItem(storageKey);
202
- if (stored === "dark" || stored === "light" || stored === "system") {
203
- return stored;
204
- }
205
- return defaultMode;
210
+ if (typeof window === "undefined") return defaultMode;
211
+ const stored = localStorage.getItem(storageKey);
212
+ if (stored === "dark" || stored === "light" || stored === "system") return stored;
213
+ return defaultMode;
206
214
  }
207
215
  function resolveMode(mode) {
208
- if (mode === "system") return getSystemPreference();
209
- return mode;
216
+ if (mode === "system") return getSystemPreference();
217
+ return mode;
210
218
  }
211
- function ThemeProvider({
212
- children,
213
- defaultMode = "system",
214
- storageKey = "camstack-theme-mode"
215
- }) {
216
- const [mode, setModeState] = useState(() => getInitialMode(storageKey, defaultMode));
217
- const [resolvedMode, setResolvedMode] = useState(() => resolveMode(mode));
218
- const setMode = useCallback(
219
- (newMode) => {
220
- setModeState(newMode);
221
- setResolvedMode(resolveMode(newMode));
222
- if (typeof window !== "undefined") {
223
- localStorage.setItem(storageKey, newMode);
224
- }
225
- },
226
- [storageKey]
227
- );
228
- const toggleMode = useCallback(() => {
229
- const currentIndex = TOGGLE_ORDER.indexOf(mode);
230
- const nextIndex = (currentIndex + 1) % TOGGLE_ORDER.length;
231
- setMode(TOGGLE_ORDER[nextIndex] ?? "dark");
232
- }, [mode, setMode]);
233
- useEffect(() => {
234
- if (typeof document === "undefined") return;
235
- const root = document.documentElement;
236
- root.classList.remove("dark", "light");
237
- root.classList.add(resolvedMode);
238
- }, [mode, resolvedMode]);
239
- useEffect(() => {
240
- if (typeof window === "undefined" || mode !== "system") return;
241
- const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
242
- const handleChange = () => {
243
- setResolvedMode(getSystemPreference());
244
- };
245
- mediaQuery.addEventListener("change", handleChange);
246
- return () => mediaQuery.removeEventListener("change", handleChange);
247
- }, [mode]);
248
- const value = useMemo(
249
- () => ({ mode, resolvedMode, setMode, toggleMode }),
250
- [mode, resolvedMode, setMode, toggleMode]
251
- );
252
- return /* @__PURE__ */ jsx(ThemeContext.Provider, { value, children });
219
+ function ThemeProvider({ children, defaultMode = "system", storageKey = "camstack-theme-mode" }) {
220
+ const [mode, setModeState] = useState(() => getInitialMode(storageKey, defaultMode));
221
+ const [resolvedMode, setResolvedMode] = useState(() => resolveMode(mode));
222
+ const setMode = useCallback((newMode) => {
223
+ setModeState(newMode);
224
+ setResolvedMode(resolveMode(newMode));
225
+ if (typeof window !== "undefined") localStorage.setItem(storageKey, newMode);
226
+ }, [storageKey]);
227
+ const toggleMode = useCallback(() => {
228
+ setMode(TOGGLE_ORDER[(TOGGLE_ORDER.indexOf(mode) + 1) % TOGGLE_ORDER.length] ?? "dark");
229
+ }, [mode, setMode]);
230
+ useEffect(() => {
231
+ if (typeof document === "undefined") return;
232
+ const root = document.documentElement;
233
+ root.classList.remove("dark", "light");
234
+ root.classList.add(resolvedMode);
235
+ }, [mode, resolvedMode]);
236
+ useEffect(() => {
237
+ if (typeof window === "undefined" || mode !== "system") return;
238
+ const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
239
+ const handleChange = () => {
240
+ setResolvedMode(getSystemPreference());
241
+ };
242
+ mediaQuery.addEventListener("change", handleChange);
243
+ return () => mediaQuery.removeEventListener("change", handleChange);
244
+ }, [mode]);
245
+ const value = useMemo(() => ({
246
+ mode,
247
+ resolvedMode,
248
+ setMode,
249
+ toggleMode
250
+ }), [
251
+ mode,
252
+ resolvedMode,
253
+ setMode,
254
+ toggleMode
255
+ ]);
256
+ return /* @__PURE__ */ jsx(ThemeContext.Provider, {
257
+ value,
258
+ children
259
+ });
253
260
  }
254
-
255
- // src/theme/use-theme-mode.ts
256
- import { useContext } from "react";
261
+ //#endregion
262
+ //#region src/theme/use-theme-mode.ts
257
263
  function useThemeMode() {
258
- const context = useContext(ThemeContext);
259
- if (!context) {
260
- throw new Error("useThemeMode must be used within a ThemeProvider");
261
- }
262
- return context;
264
+ const context = useContext(ThemeContext);
265
+ if (!context) throw new Error("useThemeMode must be used within a ThemeProvider");
266
+ return context;
263
267
  }
264
- export {
265
- ThemeProvider,
266
- createTheme,
267
- darkColors,
268
- defaultTheme,
269
- lightColors,
270
- themeToCss,
271
- useThemeMode
272
- };
268
+ //#endregion
269
+ export { ThemeProvider, createTheme, darkColors, defaultTheme, lightColors, themeToCss, useThemeMode };
270
+
273
271
  //# sourceMappingURL=index.js.map