@tomny-dev/uzi 0.5.0 → 0.6.0-pr.60.173.1.802e4f7

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 (279) hide show
  1. package/README.md +5 -2
  2. package/dist/components/card/Card.d.ts +7 -5
  3. package/dist/components/card/Card.d.ts.map +1 -1
  4. package/dist/components/page-container/PageContainer.d.ts +2 -1
  5. package/dist/components/page-container/PageContainer.d.ts.map +1 -1
  6. package/dist/components/surface/Surface.d.ts +16 -0
  7. package/dist/components/surface/Surface.d.ts.map +1 -0
  8. package/dist/components/toolbar/Toolbar.d.ts +13 -0
  9. package/dist/components/toolbar/Toolbar.d.ts.map +1 -0
  10. package/dist/index.cjs +36 -31
  11. package/dist/index.d.ts +4 -0
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +34 -32
  14. package/dist/index10.cjs.map +1 -1
  15. package/dist/index10.js +19 -15
  16. package/dist/index10.js.map +1 -1
  17. package/dist/index11.cjs +21 -18
  18. package/dist/index11.cjs.map +1 -1
  19. package/dist/index11.js +8 -15
  20. package/dist/index11.js.map +1 -1
  21. package/dist/index12.cjs +7 -14
  22. package/dist/index12.cjs.map +1 -1
  23. package/dist/index12.js +15 -37
  24. package/dist/index12.js.map +1 -1
  25. package/dist/index13.cjs +18 -52
  26. package/dist/index13.cjs.map +1 -1
  27. package/dist/index13.js +15 -77
  28. package/dist/index13.js.map +1 -1
  29. package/dist/index14.cjs +15 -80
  30. package/dist/index14.cjs.map +1 -1
  31. package/dist/index14.js +37 -13
  32. package/dist/index14.js.map +1 -1
  33. package/dist/index15.cjs +52 -18
  34. package/dist/index15.cjs.map +1 -1
  35. package/dist/index15.js +77 -9
  36. package/dist/index15.js.map +1 -1
  37. package/dist/index16.cjs +79 -8
  38. package/dist/index16.cjs.map +1 -1
  39. package/dist/index16.js +13 -41
  40. package/dist/index16.js.map +1 -1
  41. package/dist/index17.cjs +18 -60
  42. package/dist/index17.cjs.map +1 -1
  43. package/dist/index17.js +9 -428
  44. package/dist/index17.js.map +1 -1
  45. package/dist/index18.cjs +8 -430
  46. package/dist/index18.cjs.map +1 -1
  47. package/dist/index18.js +42 -4
  48. package/dist/index18.js.map +1 -1
  49. package/dist/index19.cjs +61 -5
  50. package/dist/index19.cjs.map +1 -1
  51. package/dist/index19.js +430 -13
  52. package/dist/index19.js.map +1 -1
  53. package/dist/index20.cjs +430 -12
  54. package/dist/index20.cjs.map +1 -1
  55. package/dist/index20.js +4 -4
  56. package/dist/index20.js.map +1 -1
  57. package/dist/index21.cjs +5 -5
  58. package/dist/index21.cjs.map +1 -1
  59. package/dist/index21.js +12 -9
  60. package/dist/index21.js.map +1 -1
  61. package/dist/index22.cjs +12 -9
  62. package/dist/index22.cjs.map +1 -1
  63. package/dist/index22.js +4 -4
  64. package/dist/index22.js.map +1 -1
  65. package/dist/index23.cjs +5 -5
  66. package/dist/index23.cjs.map +1 -1
  67. package/dist/index23.js +9 -12
  68. package/dist/index23.js.map +1 -1
  69. package/dist/index24.cjs +9 -12
  70. package/dist/index24.cjs.map +1 -1
  71. package/dist/index24.js +4 -38
  72. package/dist/index24.js.map +1 -1
  73. package/dist/index25.cjs +5 -55
  74. package/dist/index25.cjs.map +1 -1
  75. package/dist/index25.js +11 -116
  76. package/dist/index25.js.map +1 -1
  77. package/dist/index26.cjs +10 -116
  78. package/dist/index26.cjs.map +1 -1
  79. package/dist/index26.js +31 -19
  80. package/dist/index26.js.map +1 -1
  81. package/dist/index27.cjs +42 -24
  82. package/dist/index27.cjs.map +1 -1
  83. package/dist/index27.js +106 -93
  84. package/dist/index27.js.map +1 -1
  85. package/dist/index28.cjs +106 -93
  86. package/dist/index28.cjs.map +1 -1
  87. package/dist/index28.js +26 -23
  88. package/dist/index28.js.map +1 -1
  89. package/dist/index29.cjs +37 -25
  90. package/dist/index29.cjs.map +1 -1
  91. package/dist/index29.js +107 -26
  92. package/dist/index29.js.map +1 -1
  93. package/dist/index30.cjs +110 -37
  94. package/dist/index30.cjs.map +1 -1
  95. package/dist/index30.js +21 -113
  96. package/dist/index30.js.map +1 -1
  97. package/dist/index31.cjs +19 -125
  98. package/dist/index31.cjs.map +1 -1
  99. package/dist/index31.js +26 -17
  100. package/dist/index31.js.map +1 -1
  101. package/dist/index32.cjs +37 -20
  102. package/dist/index32.cjs.map +1 -1
  103. package/dist/index32.js +108 -104
  104. package/dist/index32.js.map +1 -1
  105. package/dist/index33.cjs +122 -103
  106. package/dist/index33.cjs.map +1 -1
  107. package/dist/index33.js +17 -4
  108. package/dist/index33.js.map +1 -1
  109. package/dist/index34.cjs +20 -5
  110. package/dist/index34.cjs.map +1 -1
  111. package/dist/index34.js +106 -58
  112. package/dist/index34.js.map +1 -1
  113. package/dist/index35.cjs +106 -57
  114. package/dist/index35.cjs.map +1 -1
  115. package/dist/index35.js +4 -22
  116. package/dist/index35.js.map +1 -1
  117. package/dist/index36.cjs +5 -31
  118. package/dist/index36.cjs.map +1 -1
  119. package/dist/index36.js +55 -44
  120. package/dist/index36.js.map +1 -1
  121. package/dist/index37.cjs +55 -44
  122. package/dist/index37.cjs.map +1 -1
  123. package/dist/index37.js +21 -31
  124. package/dist/index37.js.map +1 -1
  125. package/dist/index38.cjs +30 -45
  126. package/dist/index38.cjs.map +1 -1
  127. package/dist/index38.js +46 -141
  128. package/dist/index38.js.map +1 -1
  129. package/dist/index39.cjs +46 -141
  130. package/dist/index39.cjs.map +1 -1
  131. package/dist/index39.js +31 -41
  132. package/dist/index39.js.map +1 -1
  133. package/dist/index40.cjs +45 -60
  134. package/dist/index40.cjs.map +1 -1
  135. package/dist/index40.js +139 -163
  136. package/dist/index40.js.map +1 -1
  137. package/dist/index41.cjs +137 -161
  138. package/dist/index41.cjs.map +1 -1
  139. package/dist/index41.js +41 -12
  140. package/dist/index41.js.map +1 -1
  141. package/dist/index42.cjs +60 -14
  142. package/dist/index42.cjs.map +1 -1
  143. package/dist/index42.js +167 -15
  144. package/dist/index42.js.map +1 -1
  145. package/dist/index43.cjs +166 -14
  146. package/dist/index43.cjs.map +1 -1
  147. package/dist/index43.js +12 -15
  148. package/dist/index43.js.map +1 -1
  149. package/dist/index44.cjs +14 -21
  150. package/dist/index44.cjs.map +1 -1
  151. package/dist/index44.js +15 -28
  152. package/dist/index44.js.map +1 -1
  153. package/dist/index45.cjs +14 -27
  154. package/dist/index45.cjs.map +1 -1
  155. package/dist/index45.js +10 -8
  156. package/dist/index45.js.map +1 -1
  157. package/dist/index46.cjs +11 -8
  158. package/dist/index46.cjs.map +1 -1
  159. package/dist/index46.js +22 -15
  160. package/dist/index46.js.map +1 -1
  161. package/dist/index47.cjs +22 -15
  162. package/dist/index47.cjs.map +1 -1
  163. package/dist/index47.js +9 -13
  164. package/dist/index47.js.map +1 -1
  165. package/dist/index48.cjs +10 -16
  166. package/dist/index48.cjs.map +1 -1
  167. package/dist/index48.js +18 -25
  168. package/dist/index48.js.map +1 -1
  169. package/dist/index49.cjs +18 -25
  170. package/dist/index49.cjs.map +1 -1
  171. package/dist/index49.js +17 -14
  172. package/dist/index49.js.map +1 -1
  173. package/dist/index50.cjs +24 -17
  174. package/dist/index50.cjs.map +1 -1
  175. package/dist/index50.js +28 -28
  176. package/dist/index50.js.map +1 -1
  177. package/dist/index51.cjs +27 -28
  178. package/dist/index51.cjs.map +1 -1
  179. package/dist/index51.js +14 -17
  180. package/dist/index51.js.map +1 -1
  181. package/dist/index52.cjs +17 -22
  182. package/dist/index52.cjs.map +1 -1
  183. package/dist/index52.js +23 -23
  184. package/dist/index52.js.map +1 -1
  185. package/dist/index53.cjs +23 -23
  186. package/dist/index53.cjs.map +1 -1
  187. package/dist/index53.js +17 -10
  188. package/dist/index53.js.map +1 -1
  189. package/dist/index54.cjs +22 -11
  190. package/dist/index54.cjs.map +1 -1
  191. package/dist/index54.js +28 -14
  192. package/dist/index54.js.map +1 -1
  193. package/dist/index55.cjs +28 -13
  194. package/dist/index55.cjs.map +1 -1
  195. package/dist/index55.js +17 -11
  196. package/dist/index55.js.map +1 -1
  197. package/dist/index56.cjs +23 -13
  198. package/dist/index56.cjs.map +1 -1
  199. package/dist/index56.js +24 -16
  200. package/dist/index56.js.map +1 -1
  201. package/dist/index57.cjs +24 -15
  202. package/dist/index57.cjs.map +1 -1
  203. package/dist/index57.js +10 -9
  204. package/dist/index57.js.map +1 -1
  205. package/dist/index58.cjs +11 -12
  206. package/dist/index58.cjs.map +1 -1
  207. package/dist/index58.js +12 -87
  208. package/dist/index58.js.map +1 -1
  209. package/dist/index59.cjs +12 -89
  210. package/dist/index59.cjs.map +1 -1
  211. package/dist/index59.js +11 -21
  212. package/dist/index59.js.map +1 -1
  213. package/dist/index60.cjs +13 -30
  214. package/dist/index60.cjs.map +1 -1
  215. package/dist/index60.js +17 -43
  216. package/dist/index60.js.map +1 -1
  217. package/dist/index61.cjs +16 -44
  218. package/dist/index61.cjs.map +1 -1
  219. package/dist/index61.js +9 -57
  220. package/dist/index61.js.map +1 -1
  221. package/dist/index62.cjs +11 -83
  222. package/dist/index62.cjs.map +1 -1
  223. package/dist/index62.js +83 -426
  224. package/dist/index62.js.map +1 -1
  225. package/dist/index63.cjs +82 -427
  226. package/dist/index63.cjs.map +1 -1
  227. package/dist/index63.js +21 -59
  228. package/dist/index63.js.map +1 -1
  229. package/dist/index64.cjs +30 -87
  230. package/dist/index64.cjs.map +1 -1
  231. package/dist/index64.js +44 -240
  232. package/dist/index64.js.map +1 -1
  233. package/dist/index65.cjs +43 -239
  234. package/dist/index65.cjs.map +1 -1
  235. package/dist/index65.js +57 -43
  236. package/dist/index65.js.map +1 -1
  237. package/dist/index66.cjs +84 -63
  238. package/dist/index66.cjs.map +1 -1
  239. package/dist/index66.js +426 -73
  240. package/dist/index66.js.map +1 -1
  241. package/dist/index67.cjs +426 -71
  242. package/dist/index67.cjs.map +1 -1
  243. package/dist/index67.js +59 -21
  244. package/dist/index67.js.map +1 -1
  245. package/dist/index68.cjs +87 -30
  246. package/dist/index68.cjs.map +1 -1
  247. package/dist/index68.js +233 -88
  248. package/dist/index68.js.map +1 -1
  249. package/dist/index69.cjs +232 -89
  250. package/dist/index69.cjs.map +1 -1
  251. package/dist/index69.js +40 -16
  252. package/dist/index69.js.map +1 -1
  253. package/dist/index70.cjs +56 -20
  254. package/dist/index70.cjs.map +1 -1
  255. package/dist/index70.js +72 -145
  256. package/dist/index70.js.map +1 -1
  257. package/dist/index71.cjs +72 -145
  258. package/dist/index71.cjs.map +1 -1
  259. package/dist/index71.js +25 -0
  260. package/dist/index71.js.map +1 -0
  261. package/dist/index72.cjs +34 -0
  262. package/dist/index72.cjs.map +1 -0
  263. package/dist/index72.js +101 -0
  264. package/dist/index72.js.map +1 -0
  265. package/dist/index73.cjs +105 -0
  266. package/dist/index73.cjs.map +1 -0
  267. package/dist/index73.js +23 -0
  268. package/dist/index73.js.map +1 -0
  269. package/dist/index74.cjs +31 -0
  270. package/dist/index74.cjs.map +1 -0
  271. package/dist/index74.js +159 -0
  272. package/dist/index74.js.map +1 -0
  273. package/dist/index75.cjs +161 -0
  274. package/dist/index75.cjs.map +1 -0
  275. package/dist/index8.js.map +1 -1
  276. package/dist/index9.cjs.map +1 -1
  277. package/dist/index9.js.map +1 -1
  278. package/dist/style.css +216 -45
  279. package/package.json +2 -2
package/dist/index35.cjs CHANGED
@@ -1,66 +1,115 @@
1
1
  "use client";
2
- const require_cx = require("./index4.cjs");
3
- const require_Button = require("./index6.cjs");
4
- const require_ThemeProvider = require("./index33.cjs");
5
- const require_theme_toggle_button_module = require("./index34.cjs");
2
+ const require_ToastContext = require("./index20.cjs");
3
+ const require_constants = require("./index34.cjs");
4
+ let react = require("react");
6
5
  let react_jsx_runtime = require("react/jsx-runtime");
7
- //#region src/components/theme-toggle-button/ThemeToggleButton.tsx
8
- function MoonIcon() {
9
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
10
- viewBox: "0 0 24 24",
11
- "aria-hidden": "true",
12
- width: "16",
13
- height: "16",
14
- fill: "none",
15
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
16
- d: "M20 15.2A8.5 8.5 0 0 1 8.8 4 9 9 0 1 0 20 15.2Z",
17
- stroke: "currentColor",
18
- strokeWidth: "1.8",
19
- strokeLinecap: "round",
20
- strokeLinejoin: "round"
21
- })
22
- });
6
+ //#region src/theme/ThemeProvider.tsx
7
+ var THEME_STORAGE_KEY = require_constants.THEME_STORAGE_KEY;
8
+ var ACCENT_STORAGE_KEY = require_constants.ACCENT_STORAGE_KEY;
9
+ var THEME_ATTRIBUTE = "data-uzi-theme";
10
+ var ACCENT_ATTRIBUTE = "data-uzi-accent";
11
+ var ThemeContext = (0, react.createContext)(void 0);
12
+ function isTheme(value) {
13
+ return require_constants.UZI_THEMES.includes(value);
23
14
  }
24
- function SunIcon() {
25
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
26
- viewBox: "0 0 24 24",
27
- "aria-hidden": "true",
28
- width: "16",
29
- height: "16",
30
- fill: "none",
31
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
32
- cx: "12",
33
- cy: "12",
34
- r: "4",
35
- stroke: "currentColor",
36
- strokeWidth: "1.8"
37
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
38
- d: "M12 2.75v2.5M12 18.75v2.5M21.25 12h-2.5M5.25 12h-2.5M18.54 5.46l-1.77 1.77M7.23 16.77l-1.77 1.77M18.54 18.54l-1.77-1.77M7.23 7.23 5.46 5.46",
39
- stroke: "currentColor",
40
- strokeWidth: "1.8",
41
- strokeLinecap: "round"
42
- })]
43
- });
15
+ function isAccent(value) {
16
+ return require_constants.UZI_ACCENTS.includes(value);
44
17
  }
45
- function ThemeToggleButton({ showLabel = false, lightLabel = "Light mode", darkLabel = "Dark mode", className, onClick, ...rest }) {
46
- const { resolvedTheme, toggleTheme } = require_ThemeProvider.useTheme();
47
- const nextThemeLabel = resolvedTheme === "dark" ? lightLabel : darkLabel;
48
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_Button.Button, {
49
- type: "button",
50
- variant: "ghost",
51
- size: showLabel ? "sm" : "icon",
52
- className: require_cx.cx(showLabel && require_theme_toggle_button_module.default.withLabel, className),
53
- "aria-label": `Switch to ${nextThemeLabel.toLowerCase()}`,
54
- title: `Switch to ${nextThemeLabel.toLowerCase()}`,
55
- onClick: (event) => {
56
- onClick?.(event);
57
- if (!event.defaultPrevented) toggleTheme();
58
- },
59
- ...rest,
60
- children: [resolvedTheme === "dark" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SunIcon, {}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MoonIcon, {}), showLabel && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: nextThemeLabel })]
18
+ function getSystemTheme() {
19
+ if (typeof window === "undefined") return "light";
20
+ return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
21
+ }
22
+ function ThemeProvider({ children, theme, defaultTheme = "system", accent, defaultAccent = "blue", onThemeChange, onAccentChange, storageKey = THEME_STORAGE_KEY, accentStorageKey = ACCENT_STORAGE_KEY, disableStorage = false, toastConfig }) {
23
+ const [internalTheme, setInternalTheme] = (0, react.useState)(defaultTheme);
24
+ const [internalAccent, setInternalAccent] = (0, react.useState)(defaultAccent);
25
+ const [systemTheme, setSystemTheme] = (0, react.useState)("light");
26
+ (0, react.useEffect)(() => {
27
+ setSystemTheme(getSystemTheme());
28
+ if (!disableStorage) {
29
+ const storedTheme = window.localStorage.getItem(storageKey);
30
+ if (isTheme(storedTheme)) setInternalTheme(storedTheme);
31
+ const storedAccent = window.localStorage.getItem(accentStorageKey);
32
+ if (isAccent(storedAccent)) setInternalAccent(storedAccent);
33
+ }
34
+ }, [
35
+ disableStorage,
36
+ storageKey,
37
+ accentStorageKey
38
+ ]);
39
+ const isThemeControlled = theme !== void 0;
40
+ const isAccentControlled = accent !== void 0;
41
+ const currentTheme = isThemeControlled ? theme : internalTheme;
42
+ const currentAccent = isAccentControlled ? accent : internalAccent;
43
+ const resolvedTheme = currentTheme === "system" ? systemTheme : currentTheme;
44
+ (0, react.useEffect)(() => {
45
+ if (typeof window === "undefined") return;
46
+ const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
47
+ const handleChange = () => setSystemTheme(mediaQuery.matches ? "dark" : "light");
48
+ handleChange();
49
+ mediaQuery.addEventListener("change", handleChange);
50
+ return () => mediaQuery.removeEventListener("change", handleChange);
51
+ }, []);
52
+ (0, react.useEffect)(() => {
53
+ if (typeof document === "undefined") return;
54
+ const root = document.documentElement;
55
+ root.setAttribute(THEME_ATTRIBUTE, resolvedTheme);
56
+ root.setAttribute(ACCENT_ATTRIBUTE, currentAccent);
57
+ root.style.colorScheme = resolvedTheme;
58
+ root.classList.toggle("dark", resolvedTheme === "dark");
59
+ }, [currentAccent, resolvedTheme]);
60
+ const setTheme = (0, react.useCallback)((nextTheme) => {
61
+ if (!isThemeControlled) setInternalTheme(nextTheme);
62
+ if (!disableStorage && typeof window !== "undefined") window.localStorage.setItem(storageKey, nextTheme);
63
+ onThemeChange?.(nextTheme);
64
+ }, [
65
+ disableStorage,
66
+ isThemeControlled,
67
+ onThemeChange,
68
+ storageKey
69
+ ]);
70
+ const setAccent = (0, react.useCallback)((nextAccent) => {
71
+ if (!isAccentControlled) setInternalAccent(nextAccent);
72
+ if (!disableStorage && typeof window !== "undefined") window.localStorage.setItem(accentStorageKey, nextAccent);
73
+ onAccentChange?.(nextAccent);
74
+ }, [
75
+ accentStorageKey,
76
+ disableStorage,
77
+ isAccentControlled,
78
+ onAccentChange
79
+ ]);
80
+ const toggleTheme = (0, react.useCallback)(() => {
81
+ setTheme(resolvedTheme === "dark" ? "light" : "dark");
82
+ }, [resolvedTheme, setTheme]);
83
+ const value = (0, react.useMemo)(() => ({
84
+ theme: currentTheme,
85
+ resolvedTheme,
86
+ accent: currentAccent,
87
+ setTheme,
88
+ setAccent,
89
+ toggleTheme
90
+ }), [
91
+ currentAccent,
92
+ currentTheme,
93
+ resolvedTheme,
94
+ setAccent,
95
+ setTheme,
96
+ toggleTheme
97
+ ]);
98
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ThemeContext.Provider, {
99
+ value,
100
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_ToastContext.ToastProvider, {
101
+ config: toastConfig,
102
+ children
103
+ })
61
104
  });
62
105
  }
106
+ function useTheme() {
107
+ const context = (0, react.useContext)(ThemeContext);
108
+ if (!context) throw new Error("useTheme must be used within a ThemeProvider");
109
+ return context;
110
+ }
63
111
  //#endregion
64
- exports.ThemeToggleButton = ThemeToggleButton;
112
+ exports.ThemeProvider = ThemeProvider;
113
+ exports.useTheme = useTheme;
65
114
 
66
115
  //# sourceMappingURL=index35.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index35.cjs","names":[],"sources":["../src/components/theme-toggle-button/ThemeToggleButton.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ButtonHTMLAttributes } from \"react\";\nimport { Button } from \"../button/Button\";\nimport { useTheme } from \"../../theme/ThemeProvider\";\nimport { cx } from \"../../utils/cx\";\nimport styles from \"./theme-toggle-button.module.css\";\n\nexport type ThemeToggleButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\"\n> & {\n showLabel?: boolean;\n lightLabel?: string;\n darkLabel?: string;\n};\n\nfunction MoonIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" width=\"16\" height=\"16\" fill=\"none\">\n <path\n d=\"M20 15.2A8.5 8.5 0 0 1 8.8 4 9 9 0 1 0 20 15.2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction SunIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" width=\"16\" height=\"16\" fill=\"none\">\n <circle cx=\"12\" cy=\"12\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <path\n d=\"M12 2.75v2.5M12 18.75v2.5M21.25 12h-2.5M5.25 12h-2.5M18.54 5.46l-1.77 1.77M7.23 16.77l-1.77 1.77M18.54 18.54l-1.77-1.77M7.23 7.23 5.46 5.46\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function ThemeToggleButton({\n showLabel = false,\n lightLabel = \"Light mode\",\n darkLabel = \"Dark mode\",\n className,\n onClick,\n ...rest\n}: ThemeToggleButtonProps) {\n const { resolvedTheme, toggleTheme } = useTheme();\n const nextThemeLabel = resolvedTheme === \"dark\" ? lightLabel : darkLabel;\n\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size={showLabel ? \"sm\" : \"icon\"}\n className={cx(showLabel && styles.withLabel, className)}\n aria-label={`Switch to ${nextThemeLabel.toLowerCase()}`}\n title={`Switch to ${nextThemeLabel.toLowerCase()}`}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) toggleTheme();\n }}\n {...rest}\n >\n {resolvedTheme === \"dark\" ? <SunIcon /> : <MoonIcon />}\n {showLabel && <span>{nextThemeLabel}</span>}\n </Button>\n );\n}\n"],"mappings":";;;;;;;AAiBA,SAAS,WAAW;CAClB,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EAAK,SAAQ;EAAY,eAAY;EAAO,OAAM;EAAK,QAAO;EAAK,MAAK;YACtE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;EAChB,CAAA;CACE,CAAA;AAET;AAEA,SAAS,UAAU;CACjB,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EAAK,SAAQ;EAAY,eAAY;EAAO,OAAM;EAAK,QAAO;EAAK,MAAK;YAAxE,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;GAAQ,IAAG;GAAK,IAAG;GAAK,GAAE;GAAI,QAAO;GAAe,aAAY;EAAO,CAAA,GACvE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;EACf,CAAA,CACE;;AAET;AAEA,SAAgB,kBAAkB,EAChC,YAAY,OACZ,aAAa,cACb,YAAY,aACZ,WACA,SACA,GAAG,QACsB;CACzB,MAAM,EAAE,eAAe,gBAAgB,sBAAA,SAAS;CAChD,MAAM,iBAAiB,kBAAkB,SAAS,aAAa;CAE/D,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,eAAA,QAAD;EACE,MAAK;EACL,SAAQ;EACR,MAAM,YAAY,OAAO;EACzB,WAAW,WAAA,GAAG,aAAa,mCAAA,QAAO,WAAW,SAAS;EACtD,cAAY,aAAa,eAAe,YAAY;EACpD,OAAO,aAAa,eAAe,YAAY;EAC/C,UAAU,UAAU;GAClB,UAAU,KAAK;GACf,IAAI,CAAC,MAAM,kBAAkB,YAAY;EAC3C;EACA,GAAI;YAXN,CAaG,kBAAkB,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,CAAU,CAAA,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,CAAW,CAAA,GACpD,aAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,eAAqB,CAAA,CACpC;;AAEZ"}
1
+ {"version":3,"file":"index35.cjs","names":[],"sources":["../src/theme/ThemeProvider.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from \"react\";\nimport { UZI_THEMES, UZI_ACCENTS, THEME_STORAGE_KEY as DEFAULT_THEME_KEY, ACCENT_STORAGE_KEY as DEFAULT_ACCENT_KEY } from \"./constants\";\nimport { ToastProvider } from \"../components/toast/ToastContext\";\nimport type { ToastConfig } from \"../components/toast/types\";\n\nexport type UziTheme = typeof UZI_THEMES[number];\nexport type UziResolvedTheme = \"light\" | \"dark\";\nexport type UziAccent = typeof UZI_ACCENTS[number];\n\ntype ThemeContextValue = {\n theme: UziTheme;\n resolvedTheme: UziResolvedTheme;\n accent: UziAccent;\n setTheme: (theme: UziTheme) => void;\n setAccent: (accent: UziAccent) => void;\n toggleTheme: () => void;\n};\n\ntype ThemeProviderProps = {\n children: ReactNode;\n theme?: UziTheme;\n defaultTheme?: UziTheme;\n accent?: UziAccent;\n defaultAccent?: UziAccent;\n onThemeChange?: (theme: UziTheme) => void;\n onAccentChange?: (accent: UziAccent) => void;\n storageKey?: string;\n accentStorageKey?: string;\n disableStorage?: boolean;\n toastConfig?: ToastConfig;\n};\n\nconst THEME_STORAGE_KEY = DEFAULT_THEME_KEY;\nconst ACCENT_STORAGE_KEY = DEFAULT_ACCENT_KEY;\nconst THEME_ATTRIBUTE = \"data-uzi-theme\";\nconst ACCENT_ATTRIBUTE = \"data-uzi-accent\";\n\nconst ThemeContext = createContext<ThemeContextValue | undefined>(undefined);\n\nfunction isTheme(value: string | null): value is UziTheme {\n return UZI_THEMES.includes(value as UziTheme);\n}\n\nfunction isAccent(value: string | null): value is UziAccent {\n return UZI_ACCENTS.includes(value as UziAccent);\n}\n\nfunction getSystemTheme(): UziResolvedTheme {\n if (typeof window === \"undefined\") return \"light\";\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\";\n}\n\nexport function ThemeProvider({\n children,\n theme,\n defaultTheme = \"system\",\n accent,\n defaultAccent = \"blue\",\n onThemeChange,\n onAccentChange,\n storageKey = THEME_STORAGE_KEY,\n accentStorageKey = ACCENT_STORAGE_KEY,\n disableStorage = false,\n toastConfig,\n}: ThemeProviderProps) {\n const [internalTheme, setInternalTheme] = useState<UziTheme>(defaultTheme);\n const [internalAccent, setInternalAccent] = useState<UziAccent>(defaultAccent);\n const [systemTheme, setSystemTheme] = useState<UziResolvedTheme>(\"light\");\n\n useEffect(() => {\n setSystemTheme(getSystemTheme());\n if (!disableStorage) {\n const storedTheme = window.localStorage.getItem(storageKey);\n if (isTheme(storedTheme)) setInternalTheme(storedTheme);\n const storedAccent = window.localStorage.getItem(accentStorageKey);\n if (isAccent(storedAccent)) setInternalAccent(storedAccent);\n }\n }, [disableStorage, storageKey, accentStorageKey]);\n\n const isThemeControlled = theme !== undefined;\n const isAccentControlled = accent !== undefined;\n\n const currentTheme = isThemeControlled ? theme : internalTheme;\n const currentAccent = isAccentControlled ? accent : internalAccent;\n const resolvedTheme = currentTheme === \"system\" ? systemTheme : currentTheme;\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const handleChange = () => setSystemTheme(mediaQuery.matches ? \"dark\" : \"light\");\n\n handleChange();\n mediaQuery.addEventListener(\"change\", handleChange);\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\n }, []);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const root = document.documentElement;\n root.setAttribute(THEME_ATTRIBUTE, resolvedTheme);\n root.setAttribute(ACCENT_ATTRIBUTE, currentAccent);\n root.style.colorScheme = resolvedTheme;\n root.classList.toggle(\"dark\", resolvedTheme === \"dark\");\n }, [currentAccent, resolvedTheme]);\n\n const setTheme = useCallback(\n (nextTheme: UziTheme) => {\n if (!isThemeControlled) setInternalTheme(nextTheme);\n if (!disableStorage && typeof window !== \"undefined\") {\n window.localStorage.setItem(storageKey, nextTheme);\n }\n onThemeChange?.(nextTheme);\n },\n [disableStorage, isThemeControlled, onThemeChange, storageKey],\n );\n\n const setAccent = useCallback(\n (nextAccent: UziAccent) => {\n if (!isAccentControlled) setInternalAccent(nextAccent);\n if (!disableStorage && typeof window !== \"undefined\") {\n window.localStorage.setItem(accentStorageKey, nextAccent);\n }\n onAccentChange?.(nextAccent);\n },\n [accentStorageKey, disableStorage, isAccentControlled, onAccentChange],\n );\n\n const toggleTheme = useCallback(() => {\n setTheme(resolvedTheme === \"dark\" ? \"light\" : \"dark\");\n }, [resolvedTheme, setTheme]);\n\n const value = useMemo<ThemeContextValue>(\n () => ({\n theme: currentTheme,\n resolvedTheme,\n accent: currentAccent,\n setTheme,\n setAccent,\n toggleTheme,\n }),\n [currentAccent, currentTheme, resolvedTheme, setAccent, setTheme, toggleTheme],\n );\n\n return (\n <ThemeContext.Provider value={value}>\n <ToastProvider config={toastConfig}>{children}</ToastProvider>\n </ThemeContext.Provider>\n );\n}\n\nexport function useTheme() {\n const context = useContext(ThemeContext);\n if (!context) throw new Error(\"useTheme must be used within a ThemeProvider\");\n return context;\n}\n"],"mappings":";;;;;;AA0CA,IAAM,oBAAoB,kBAAA;AAC1B,IAAM,qBAAqB,kBAAA;AAC3B,IAAM,kBAAkB;AACxB,IAAM,mBAAmB;AAEzB,IAAM,gBAAA,GAAA,MAAA,cAAA,CAA4D,KAAA,CAAS;AAE3E,SAAS,QAAQ,OAAyC;CACxD,OAAO,kBAAA,WAAW,SAAS,KAAiB;AAC9C;AAEA,SAAS,SAAS,OAA0C;CAC1D,OAAO,kBAAA,YAAY,SAAS,KAAkB;AAChD;AAEA,SAAS,iBAAmC;CAC1C,IAAI,OAAO,WAAW,aAAa,OAAO;CAC1C,OAAO,OAAO,WAAW,8BAA8B,CAAC,CAAC,UAAU,SAAS;AAC9E;AAEA,SAAgB,cAAc,EAC5B,UACA,OACA,eAAe,UACf,QACA,gBAAgB,QAChB,eACA,gBACA,aAAa,mBACb,mBAAmB,oBACnB,iBAAiB,OACjB,eACqB;CACrB,MAAM,CAAC,eAAe,qBAAA,GAAA,MAAA,SAAA,CAAuC,YAAY;CACzE,MAAM,CAAC,gBAAgB,sBAAA,GAAA,MAAA,SAAA,CAAyC,aAAa;CAC7E,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,SAAA,CAA6C,OAAO;CAExE,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,eAAe,eAAe,CAAC;EAC/B,IAAI,CAAC,gBAAgB;GACnB,MAAM,cAAc,OAAO,aAAa,QAAQ,UAAU;GAC1D,IAAI,QAAQ,WAAW,GAAG,iBAAiB,WAAW;GACtD,MAAM,eAAe,OAAO,aAAa,QAAQ,gBAAgB;GACjE,IAAI,SAAS,YAAY,GAAG,kBAAkB,YAAY;EAC5D;CACF,GAAG;EAAC;EAAgB;EAAY;CAAgB,CAAC;CAEjD,MAAM,oBAAoB,UAAU,KAAA;CACpC,MAAM,qBAAqB,WAAW,KAAA;CAEtC,MAAM,eAAe,oBAAoB,QAAQ;CACjD,MAAM,gBAAgB,qBAAqB,SAAS;CACpD,MAAM,gBAAgB,iBAAiB,WAAW,cAAc;CAEhE,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,IAAI,OAAO,WAAW,aAAa;EAEnC,MAAM,aAAa,OAAO,WAAW,8BAA8B;EACnE,MAAM,qBAAqB,eAAe,WAAW,UAAU,SAAS,OAAO;EAE/E,aAAa;EACb,WAAW,iBAAiB,UAAU,YAAY;EAClD,aAAa,WAAW,oBAAoB,UAAU,YAAY;CACpE,GAAG,CAAC,CAAC;CAEL,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,IAAI,OAAO,aAAa,aAAa;EACrC,MAAM,OAAO,SAAS;EACtB,KAAK,aAAa,iBAAiB,aAAa;EAChD,KAAK,aAAa,kBAAkB,aAAa;EACjD,KAAK,MAAM,cAAc;EACzB,KAAK,UAAU,OAAO,QAAQ,kBAAkB,MAAM;CACxD,GAAG,CAAC,eAAe,aAAa,CAAC;CAEjC,MAAM,YAAA,GAAA,MAAA,YAAA,EACH,cAAwB;EACvB,IAAI,CAAC,mBAAmB,iBAAiB,SAAS;EAClD,IAAI,CAAC,kBAAkB,OAAO,WAAW,aACvC,OAAO,aAAa,QAAQ,YAAY,SAAS;EAEnD,gBAAgB,SAAS;CAC3B,GACA;EAAC;EAAgB;EAAmB;EAAe;CAAU,CAC/D;CAEA,MAAM,aAAA,GAAA,MAAA,YAAA,EACH,eAA0B;EACzB,IAAI,CAAC,oBAAoB,kBAAkB,UAAU;EACrD,IAAI,CAAC,kBAAkB,OAAO,WAAW,aACvC,OAAO,aAAa,QAAQ,kBAAkB,UAAU;EAE1D,iBAAiB,UAAU;CAC7B,GACA;EAAC;EAAkB;EAAgB;EAAoB;CAAc,CACvE;CAEA,MAAM,eAAA,GAAA,MAAA,YAAA,OAAgC;EACpC,SAAS,kBAAkB,SAAS,UAAU,MAAM;CACtD,GAAG,CAAC,eAAe,QAAQ,CAAC;CAE5B,MAAM,SAAA,GAAA,MAAA,QAAA,QACG;EACL,OAAO;EACP;EACA,QAAQ;EACR;EACA;EACA;CACF,IACA;EAAC;EAAe;EAAc;EAAe;EAAW;EAAU;CAAW,CAC/E;CAEA,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAa,UAAd;EAA8B;YAC5B,iBAAA,GAAA,kBAAA,IAAA,CAAC,qBAAA,eAAD;GAAe,QAAQ;GAAc;EAAwB,CAAA;CACxC,CAAA;AAE3B;AAEA,SAAgB,WAAW;CACzB,MAAM,WAAA,GAAA,MAAA,WAAA,CAAqB,YAAY;CACvC,IAAI,CAAC,SAAS,MAAM,IAAI,MAAM,8CAA8C;CAC5E,OAAO;AACT"}
package/dist/index35.js CHANGED
@@ -1,25 +1,7 @@
1
- //#region src/components/top-bar/top-bar.module.css
2
- var topBar = "uzi-top-bar-module__topBar__MJ-7S";
3
- var topBarStatic = "uzi-top-bar-module__topBarStatic__JvEwt";
4
- var topBarInner = "uzi-top-bar-module__topBarInner__PBbi8";
5
- var topBarStart = "uzi-top-bar-module__topBarStart__DrdN2";
6
- var topBarBrand = "uzi-top-bar-module__topBarBrand__80VV3";
7
- var topBarBrandContent = "uzi-top-bar-module__topBarBrandContent__O4Uto";
8
- var topBarCenter = "uzi-top-bar-module__topBarCenter__Kwxg-";
9
- var topBarCenterGroup = "uzi-top-bar-module__topBarCenterGroup__7Ishp";
10
- var topBarActions = "uzi-top-bar-module__topBarActions__mgMd8";
11
- var top_bar_module_default = {
12
- topBar,
13
- topBarStatic,
14
- topBarInner,
15
- topBarStart,
16
- topBarBrand,
17
- topBarBrandContent,
18
- topBarCenter,
19
- topBarCenterGroup,
20
- topBarActions
21
- };
1
+ //#region src/components/theme-toggle-button/theme-toggle-button.module.css
2
+ var withLabel = "uzi-theme-toggle-button-module__withLabel__KqtDj";
3
+ var theme_toggle_button_module_default = { withLabel };
22
4
  //#endregion
23
- export { top_bar_module_default as default, topBar, topBarActions, topBarBrand, topBarBrandContent, topBarCenter, topBarCenterGroup, topBarInner, topBarStart, topBarStatic };
5
+ export { theme_toggle_button_module_default as default, withLabel };
24
6
 
25
7
  //# sourceMappingURL=index35.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index35.js","names":[],"sources":["../src/components/top-bar/top-bar.module.css"],"sourcesContent":[".topBar {\n position: sticky;\n top: 0;\n z-index: 30;\n border-bottom: 1px solid var(--ts-topbar-border, var(--border));\n background: var(--ts-topbar-bg, color-mix(in srgb, var(--background) 92%, transparent));\n box-shadow: var(--ts-topbar-shadow, 0 1px 2px rgba(0, 0, 0, 0.06));\n backdrop-filter: blur(12px);\n}\n\n.topBarStatic {\n position: relative;\n}\n\n.topBarInner {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1rem;\n min-height: 4.25rem;\n padding: env(safe-area-inset-top, 0) 1rem 0 1rem;\n}\n\n.topBarStart {\n display: flex;\n align-items: center;\n gap: 0.875rem;\n min-width: 0;\n flex: 1 1 auto;\n}\n\n.topBarBrand {\n display: inline-flex;\n align-items: center;\n gap: 0.625rem;\n min-width: 0;\n color: var(--ts-topbar-brand-fg, var(--foreground));\n text-decoration: none;\n}\n\n.topBarBrandContent {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.topBarCenter {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 0 1 auto;\n min-width: 0;\n}\n\n.topBarCenterGroup {\n display: inline-flex;\n align-items: center;\n gap: 1rem;\n min-width: 0;\n}\n\n.topBarActions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 0.75rem;\n min-width: 0;\n flex: 1 1 auto;\n}\n\n@media (max-width: 768px) {\n .topBarInner {\n min-height: 4rem;\n gap: 0.75rem;\n padding-left: max(0.75rem, env(safe-area-inset-left));\n padding-right: max(0.75rem, env(safe-area-inset-right));\n }\n\n .topBarStart {\n gap: 0.75rem;\n }\n\n .topBarActions {\n gap: 0.5rem;\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"index35.js","names":[],"sources":["../src/components/theme-toggle-button/theme-toggle-button.module.css"],"sourcesContent":[".withLabel {\n padding-left: 12px;\n padding-right: 12px;\n}\n"],"mappings":""}
package/dist/index36.cjs CHANGED
@@ -1,34 +1,8 @@
1
- //#region src/components/top-bar/top-bar.module.css
2
- var topBar = "uzi-top-bar-module__topBar__MJ-7S";
3
- var topBarStatic = "uzi-top-bar-module__topBarStatic__JvEwt";
4
- var topBarInner = "uzi-top-bar-module__topBarInner__PBbi8";
5
- var topBarStart = "uzi-top-bar-module__topBarStart__DrdN2";
6
- var topBarBrand = "uzi-top-bar-module__topBarBrand__80VV3";
7
- var topBarBrandContent = "uzi-top-bar-module__topBarBrandContent__O4Uto";
8
- var topBarCenter = "uzi-top-bar-module__topBarCenter__Kwxg-";
9
- var topBarCenterGroup = "uzi-top-bar-module__topBarCenterGroup__7Ishp";
10
- var topBarActions = "uzi-top-bar-module__topBarActions__mgMd8";
11
- var top_bar_module_default = {
12
- topBar,
13
- topBarStatic,
14
- topBarInner,
15
- topBarStart,
16
- topBarBrand,
17
- topBarBrandContent,
18
- topBarCenter,
19
- topBarCenterGroup,
20
- topBarActions
21
- };
1
+ //#region src/components/theme-toggle-button/theme-toggle-button.module.css
2
+ var withLabel = "uzi-theme-toggle-button-module__withLabel__KqtDj";
3
+ var theme_toggle_button_module_default = { withLabel };
22
4
  //#endregion
23
- exports.default = top_bar_module_default;
24
- exports.topBar = topBar;
25
- exports.topBarActions = topBarActions;
26
- exports.topBarBrand = topBarBrand;
27
- exports.topBarBrandContent = topBarBrandContent;
28
- exports.topBarCenter = topBarCenter;
29
- exports.topBarCenterGroup = topBarCenterGroup;
30
- exports.topBarInner = topBarInner;
31
- exports.topBarStart = topBarStart;
32
- exports.topBarStatic = topBarStatic;
5
+ exports.default = theme_toggle_button_module_default;
6
+ exports.withLabel = withLabel;
33
7
 
34
8
  //# sourceMappingURL=index36.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index36.cjs","names":[],"sources":["../src/components/top-bar/top-bar.module.css"],"sourcesContent":[".topBar {\n position: sticky;\n top: 0;\n z-index: 30;\n border-bottom: 1px solid var(--ts-topbar-border, var(--border));\n background: var(--ts-topbar-bg, color-mix(in srgb, var(--background) 92%, transparent));\n box-shadow: var(--ts-topbar-shadow, 0 1px 2px rgba(0, 0, 0, 0.06));\n backdrop-filter: blur(12px);\n}\n\n.topBarStatic {\n position: relative;\n}\n\n.topBarInner {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1rem;\n min-height: 4.25rem;\n padding: env(safe-area-inset-top, 0) 1rem 0 1rem;\n}\n\n.topBarStart {\n display: flex;\n align-items: center;\n gap: 0.875rem;\n min-width: 0;\n flex: 1 1 auto;\n}\n\n.topBarBrand {\n display: inline-flex;\n align-items: center;\n gap: 0.625rem;\n min-width: 0;\n color: var(--ts-topbar-brand-fg, var(--foreground));\n text-decoration: none;\n}\n\n.topBarBrandContent {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.topBarCenter {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 0 1 auto;\n min-width: 0;\n}\n\n.topBarCenterGroup {\n display: inline-flex;\n align-items: center;\n gap: 1rem;\n min-width: 0;\n}\n\n.topBarActions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 0.75rem;\n min-width: 0;\n flex: 1 1 auto;\n}\n\n@media (max-width: 768px) {\n .topBarInner {\n min-height: 4rem;\n gap: 0.75rem;\n padding-left: max(0.75rem, env(safe-area-inset-left));\n padding-right: max(0.75rem, env(safe-area-inset-right));\n }\n\n .topBarStart {\n gap: 0.75rem;\n }\n\n .topBarActions {\n gap: 0.5rem;\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"index36.cjs","names":[],"sources":["../src/components/theme-toggle-button/theme-toggle-button.module.css"],"sourcesContent":[".withLabel {\n padding-left: 12px;\n padding-right: 12px;\n}\n"],"mappings":""}
package/dist/index36.js CHANGED
@@ -1,55 +1,66 @@
1
1
  "use client";
2
2
  import { cx } from "./index3.js";
3
- import { ThemeToggleButton } from "./index34.js";
4
- import top_bar_module_default from "./index35.js";
3
+ import { Button } from "./index5.js";
4
+ import { useTheme } from "./index34.js";
5
+ import theme_toggle_button_module_default from "./index35.js";
5
6
  import { jsx, jsxs } from "react/jsx-runtime";
6
- //#region src/components/top-bar/TopBar.tsx
7
- function TopBar({ leading, brand, brandHref, brandingLocation = "left", start, center, actions, showThemeToggle = false, themeToggleProps, className, innerClassName, isSticky, sticky = true, children, ...rest }) {
8
- const shouldStick = isSticky ?? sticky;
9
- const brandNode = !brand ? null : brandHref ? /* @__PURE__ */ jsx("a", {
10
- href: brandHref,
11
- className: top_bar_module_default.topBarBrand,
12
- children: /* @__PURE__ */ jsx("span", {
13
- className: top_bar_module_default.topBarBrandContent,
14
- children: brand
15
- })
16
- }) : /* @__PURE__ */ jsx("div", {
17
- className: top_bar_module_default.topBarBrand,
18
- children: /* @__PURE__ */ jsx("span", {
19
- className: top_bar_module_default.topBarBrandContent,
20
- children: brand
7
+ //#region src/components/theme-toggle-button/ThemeToggleButton.tsx
8
+ function MoonIcon() {
9
+ return /* @__PURE__ */ jsx("svg", {
10
+ viewBox: "0 0 24 24",
11
+ "aria-hidden": "true",
12
+ width: "16",
13
+ height: "16",
14
+ fill: "none",
15
+ children: /* @__PURE__ */ jsx("path", {
16
+ d: "M20 15.2A8.5 8.5 0 0 1 8.8 4 9 9 0 1 0 20 15.2Z",
17
+ stroke: "currentColor",
18
+ strokeWidth: "1.8",
19
+ strokeLinecap: "round",
20
+ strokeLinejoin: "round"
21
21
  })
22
22
  });
23
- return /* @__PURE__ */ jsx("header", {
24
- className: cx(top_bar_module_default.topBar, !shouldStick && top_bar_module_default.topBarStatic, className),
23
+ }
24
+ function SunIcon() {
25
+ return /* @__PURE__ */ jsxs("svg", {
26
+ viewBox: "0 0 24 24",
27
+ "aria-hidden": "true",
28
+ width: "16",
29
+ height: "16",
30
+ fill: "none",
31
+ children: [/* @__PURE__ */ jsx("circle", {
32
+ cx: "12",
33
+ cy: "12",
34
+ r: "4",
35
+ stroke: "currentColor",
36
+ strokeWidth: "1.8"
37
+ }), /* @__PURE__ */ jsx("path", {
38
+ d: "M12 2.75v2.5M12 18.75v2.5M21.25 12h-2.5M5.25 12h-2.5M18.54 5.46l-1.77 1.77M7.23 16.77l-1.77 1.77M18.54 18.54l-1.77-1.77M7.23 7.23 5.46 5.46",
39
+ stroke: "currentColor",
40
+ strokeWidth: "1.8",
41
+ strokeLinecap: "round"
42
+ })]
43
+ });
44
+ }
45
+ function ThemeToggleButton({ showLabel = false, lightLabel = "Light mode", darkLabel = "Dark mode", className, onClick, ...rest }) {
46
+ const { resolvedTheme, toggleTheme } = useTheme();
47
+ const nextThemeLabel = resolvedTheme === "dark" ? lightLabel : darkLabel;
48
+ return /* @__PURE__ */ jsxs(Button, {
49
+ type: "button",
50
+ variant: "ghost",
51
+ size: showLabel ? "sm" : "icon",
52
+ className: cx(showLabel && theme_toggle_button_module_default.withLabel, className),
53
+ "aria-label": `Switch to ${nextThemeLabel.toLowerCase()}`,
54
+ title: `Switch to ${nextThemeLabel.toLowerCase()}`,
55
+ onClick: (event) => {
56
+ onClick?.(event);
57
+ if (!event.defaultPrevented) toggleTheme();
58
+ },
25
59
  ...rest,
26
- children: /* @__PURE__ */ jsxs("div", {
27
- className: cx(top_bar_module_default.topBarInner, innerClassName),
28
- children: [
29
- /* @__PURE__ */ jsxs("div", {
30
- className: top_bar_module_default.topBarStart,
31
- children: [
32
- leading,
33
- brandingLocation === "left" && brandNode,
34
- start
35
- ]
36
- }),
37
- brandNode && brandingLocation === "center" || center || children ? /* @__PURE__ */ jsx("div", {
38
- className: top_bar_module_default.topBarCenter,
39
- children: /* @__PURE__ */ jsxs("div", {
40
- className: top_bar_module_default.topBarCenterGroup,
41
- children: [brandingLocation === "center" && brandNode, center ?? children]
42
- })
43
- }) : null,
44
- /* @__PURE__ */ jsxs("div", {
45
- className: top_bar_module_default.topBarActions,
46
- children: [showThemeToggle && /* @__PURE__ */ jsx(ThemeToggleButton, { ...themeToggleProps }), actions]
47
- })
48
- ]
49
- })
60
+ children: [resolvedTheme === "dark" ? /* @__PURE__ */ jsx(SunIcon, {}) : /* @__PURE__ */ jsx(MoonIcon, {}), showLabel && /* @__PURE__ */ jsx("span", { children: nextThemeLabel })]
50
61
  });
51
62
  }
52
63
  //#endregion
53
- export { TopBar };
64
+ export { ThemeToggleButton };
54
65
 
55
66
  //# sourceMappingURL=index36.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index36.js","names":[],"sources":["../src/components/top-bar/TopBar.tsx"],"sourcesContent":["\"use client\";\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport {\n ThemeToggleButton,\n type ThemeToggleButtonProps,\n} from \"../theme-toggle-button/ThemeToggleButton\";\nimport styles from \"./top-bar.module.css\";\n\nexport type TopBarProps = HTMLAttributes<HTMLElement> & {\n leading?: ReactNode;\n brand?: ReactNode;\n brandHref?: string;\n brandingLocation?: \"left\" | \"center\";\n /** Content rendered after the brand in the left region (e.g. breadcrumbs, search). */\n start?: ReactNode;\n /** Content rendered in the center region. */\n center?: ReactNode;\n actions?: ReactNode;\n showThemeToggle?: boolean;\n themeToggleProps?: ThemeToggleButtonProps;\n innerClassName?: string;\n isSticky?: boolean;\n sticky?: boolean;\n};\n\nexport function TopBar({\n leading,\n brand,\n brandHref,\n brandingLocation = \"left\",\n start,\n center,\n actions,\n showThemeToggle = false,\n themeToggleProps,\n className,\n innerClassName,\n isSticky,\n sticky = true,\n children,\n ...rest\n}: TopBarProps) {\n const shouldStick = isSticky ?? sticky;\n const brandNode = !brand ? null : brandHref ? (\n <a href={brandHref} className={styles.topBarBrand}>\n <span className={styles.topBarBrandContent}>{brand}</span>\n </a>\n ) : (\n <div className={styles.topBarBrand}>\n <span className={styles.topBarBrandContent}>{brand}</span>\n </div>\n );\n\n return (\n <header\n className={cx(styles.topBar, !shouldStick && styles.topBarStatic, className)}\n {...rest}\n >\n <div className={cx(styles.topBarInner, innerClassName)}>\n <div className={styles.topBarStart}>\n {leading}\n {brandingLocation === \"left\" && brandNode}\n {start}\n </div>\n {(brandNode && brandingLocation === \"center\") || center || children ? (\n <div className={styles.topBarCenter}>\n <div className={styles.topBarCenterGroup}>\n {brandingLocation === \"center\" && brandNode}\n {center ?? children}\n </div>\n </div>\n ) : null}\n <div className={styles.topBarActions}>\n {showThemeToggle && <ThemeToggleButton {...themeToggleProps} />}\n {actions}\n </div>\n </div>\n </header>\n );\n}\n"],"mappings":";;;;;;AA2BA,SAAgB,OAAO,EACrB,SACA,OACA,WACA,mBAAmB,QACnB,OACA,QACA,SACA,kBAAkB,OAClB,kBACA,WACA,gBACA,UACA,SAAS,MACT,UACA,GAAG,QACW;CACd,MAAM,cAAc,YAAY;CAChC,MAAM,YAAY,CAAC,QAAQ,OAAO,YAChC,oBAAC,KAAD;EAAG,MAAM;EAAW,WAAW,uBAAO;YACpC,oBAAC,QAAD;GAAM,WAAW,uBAAO;aAAqB;EAAY,CAAA;CACxD,CAAA,IAEH,oBAAC,OAAD;EAAK,WAAW,uBAAO;YACrB,oBAAC,QAAD;GAAM,WAAW,uBAAO;aAAqB;EAAY,CAAA;CACtD,CAAA;CAGP,OACE,oBAAC,UAAD;EACE,WAAW,GAAG,uBAAO,QAAQ,CAAC,eAAe,uBAAO,cAAc,SAAS;EAC3E,GAAI;YAEJ,qBAAC,OAAD;GAAK,WAAW,GAAG,uBAAO,aAAa,cAAc;aAArD;IACE,qBAAC,OAAD;KAAK,WAAW,uBAAO;eAAvB;MACG;MACA,qBAAqB,UAAU;MAC/B;KACE;;IACH,aAAa,qBAAqB,YAAa,UAAU,WACzD,oBAAC,OAAD;KAAK,WAAW,uBAAO;eACrB,qBAAC,OAAD;MAAK,WAAW,uBAAO;gBAAvB,CACG,qBAAqB,YAAY,WACjC,UAAU,QACR;;IACF,CAAA,IACH;IACJ,qBAAC,OAAD;KAAK,WAAW,uBAAO;eAAvB,CACG,mBAAmB,oBAAC,mBAAD,EAAmB,GAAI,iBAAmB,CAAA,GAC7D,OACE;;GACF;;CACC,CAAA;AAEZ"}
1
+ {"version":3,"file":"index36.js","names":[],"sources":["../src/components/theme-toggle-button/ThemeToggleButton.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ButtonHTMLAttributes } from \"react\";\nimport { Button } from \"../button/Button\";\nimport { useTheme } from \"../../theme/ThemeProvider\";\nimport { cx } from \"../../utils/cx\";\nimport styles from \"./theme-toggle-button.module.css\";\n\nexport type ThemeToggleButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\"\n> & {\n showLabel?: boolean;\n lightLabel?: string;\n darkLabel?: string;\n};\n\nfunction MoonIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" width=\"16\" height=\"16\" fill=\"none\">\n <path\n d=\"M20 15.2A8.5 8.5 0 0 1 8.8 4 9 9 0 1 0 20 15.2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction SunIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" width=\"16\" height=\"16\" fill=\"none\">\n <circle cx=\"12\" cy=\"12\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <path\n d=\"M12 2.75v2.5M12 18.75v2.5M21.25 12h-2.5M5.25 12h-2.5M18.54 5.46l-1.77 1.77M7.23 16.77l-1.77 1.77M18.54 18.54l-1.77-1.77M7.23 7.23 5.46 5.46\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function ThemeToggleButton({\n showLabel = false,\n lightLabel = \"Light mode\",\n darkLabel = \"Dark mode\",\n className,\n onClick,\n ...rest\n}: ThemeToggleButtonProps) {\n const { resolvedTheme, toggleTheme } = useTheme();\n const nextThemeLabel = resolvedTheme === \"dark\" ? lightLabel : darkLabel;\n\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size={showLabel ? \"sm\" : \"icon\"}\n className={cx(showLabel && styles.withLabel, className)}\n aria-label={`Switch to ${nextThemeLabel.toLowerCase()}`}\n title={`Switch to ${nextThemeLabel.toLowerCase()}`}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) toggleTheme();\n }}\n {...rest}\n >\n {resolvedTheme === \"dark\" ? <SunIcon /> : <MoonIcon />}\n {showLabel && <span>{nextThemeLabel}</span>}\n </Button>\n );\n}\n"],"mappings":";;;;;;;AAiBA,SAAS,WAAW;CAClB,OACE,oBAAC,OAAD;EAAK,SAAQ;EAAY,eAAY;EAAO,OAAM;EAAK,QAAO;EAAK,MAAK;YACtE,oBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;EAChB,CAAA;CACE,CAAA;AAET;AAEA,SAAS,UAAU;CACjB,OACE,qBAAC,OAAD;EAAK,SAAQ;EAAY,eAAY;EAAO,OAAM;EAAK,QAAO;EAAK,MAAK;YAAxE,CACE,oBAAC,UAAD;GAAQ,IAAG;GAAK,IAAG;GAAK,GAAE;GAAI,QAAO;GAAe,aAAY;EAAO,CAAA,GACvE,oBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;EACf,CAAA,CACE;;AAET;AAEA,SAAgB,kBAAkB,EAChC,YAAY,OACZ,aAAa,cACb,YAAY,aACZ,WACA,SACA,GAAG,QACsB;CACzB,MAAM,EAAE,eAAe,gBAAgB,SAAS;CAChD,MAAM,iBAAiB,kBAAkB,SAAS,aAAa;CAE/D,OACE,qBAAC,QAAD;EACE,MAAK;EACL,SAAQ;EACR,MAAM,YAAY,OAAO;EACzB,WAAW,GAAG,aAAa,mCAAO,WAAW,SAAS;EACtD,cAAY,aAAa,eAAe,YAAY;EACpD,OAAO,aAAa,eAAe,YAAY;EAC/C,UAAU,UAAU;GAClB,UAAU,KAAK;GACf,IAAI,CAAC,MAAM,kBAAkB,YAAY;EAC3C;EACA,GAAI;YAXN,CAaG,kBAAkB,SAAS,oBAAC,SAAD,CAAU,CAAA,IAAI,oBAAC,UAAD,CAAW,CAAA,GACpD,aAAa,oBAAC,QAAD,EAAA,UAAO,eAAqB,CAAA,CACpC;;AAEZ"}
package/dist/index37.cjs CHANGED
@@ -1,55 +1,66 @@
1
1
  "use client";
2
2
  const require_cx = require("./index4.cjs");
3
- const require_ThemeToggleButton = require("./index35.cjs");
4
- const require_top_bar_module = require("./index36.cjs");
3
+ const require_Button = require("./index6.cjs");
4
+ const require_ThemeProvider = require("./index35.cjs");
5
+ const require_theme_toggle_button_module = require("./index36.cjs");
5
6
  let react_jsx_runtime = require("react/jsx-runtime");
6
- //#region src/components/top-bar/TopBar.tsx
7
- function TopBar({ leading, brand, brandHref, brandingLocation = "left", start, center, actions, showThemeToggle = false, themeToggleProps, className, innerClassName, isSticky, sticky = true, children, ...rest }) {
8
- const shouldStick = isSticky ?? sticky;
9
- const brandNode = !brand ? null : brandHref ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
10
- href: brandHref,
11
- className: require_top_bar_module.default.topBarBrand,
12
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
13
- className: require_top_bar_module.default.topBarBrandContent,
14
- children: brand
15
- })
16
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
17
- className: require_top_bar_module.default.topBarBrand,
18
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
19
- className: require_top_bar_module.default.topBarBrandContent,
20
- children: brand
7
+ //#region src/components/theme-toggle-button/ThemeToggleButton.tsx
8
+ function MoonIcon() {
9
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
10
+ viewBox: "0 0 24 24",
11
+ "aria-hidden": "true",
12
+ width: "16",
13
+ height: "16",
14
+ fill: "none",
15
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
16
+ d: "M20 15.2A8.5 8.5 0 0 1 8.8 4 9 9 0 1 0 20 15.2Z",
17
+ stroke: "currentColor",
18
+ strokeWidth: "1.8",
19
+ strokeLinecap: "round",
20
+ strokeLinejoin: "round"
21
21
  })
22
22
  });
23
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("header", {
24
- className: require_cx.cx(require_top_bar_module.default.topBar, !shouldStick && require_top_bar_module.default.topBarStatic, className),
23
+ }
24
+ function SunIcon() {
25
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
26
+ viewBox: "0 0 24 24",
27
+ "aria-hidden": "true",
28
+ width: "16",
29
+ height: "16",
30
+ fill: "none",
31
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
32
+ cx: "12",
33
+ cy: "12",
34
+ r: "4",
35
+ stroke: "currentColor",
36
+ strokeWidth: "1.8"
37
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
38
+ d: "M12 2.75v2.5M12 18.75v2.5M21.25 12h-2.5M5.25 12h-2.5M18.54 5.46l-1.77 1.77M7.23 16.77l-1.77 1.77M18.54 18.54l-1.77-1.77M7.23 7.23 5.46 5.46",
39
+ stroke: "currentColor",
40
+ strokeWidth: "1.8",
41
+ strokeLinecap: "round"
42
+ })]
43
+ });
44
+ }
45
+ function ThemeToggleButton({ showLabel = false, lightLabel = "Light mode", darkLabel = "Dark mode", className, onClick, ...rest }) {
46
+ const { resolvedTheme, toggleTheme } = require_ThemeProvider.useTheme();
47
+ const nextThemeLabel = resolvedTheme === "dark" ? lightLabel : darkLabel;
48
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_Button.Button, {
49
+ type: "button",
50
+ variant: "ghost",
51
+ size: showLabel ? "sm" : "icon",
52
+ className: require_cx.cx(showLabel && require_theme_toggle_button_module.default.withLabel, className),
53
+ "aria-label": `Switch to ${nextThemeLabel.toLowerCase()}`,
54
+ title: `Switch to ${nextThemeLabel.toLowerCase()}`,
55
+ onClick: (event) => {
56
+ onClick?.(event);
57
+ if (!event.defaultPrevented) toggleTheme();
58
+ },
25
59
  ...rest,
26
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
27
- className: require_cx.cx(require_top_bar_module.default.topBarInner, innerClassName),
28
- children: [
29
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
30
- className: require_top_bar_module.default.topBarStart,
31
- children: [
32
- leading,
33
- brandingLocation === "left" && brandNode,
34
- start
35
- ]
36
- }),
37
- brandNode && brandingLocation === "center" || center || children ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
38
- className: require_top_bar_module.default.topBarCenter,
39
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
40
- className: require_top_bar_module.default.topBarCenterGroup,
41
- children: [brandingLocation === "center" && brandNode, center ?? children]
42
- })
43
- }) : null,
44
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
45
- className: require_top_bar_module.default.topBarActions,
46
- children: [showThemeToggle && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_ThemeToggleButton.ThemeToggleButton, { ...themeToggleProps }), actions]
47
- })
48
- ]
49
- })
60
+ children: [resolvedTheme === "dark" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SunIcon, {}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MoonIcon, {}), showLabel && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: nextThemeLabel })]
50
61
  });
51
62
  }
52
63
  //#endregion
53
- exports.TopBar = TopBar;
64
+ exports.ThemeToggleButton = ThemeToggleButton;
54
65
 
55
66
  //# sourceMappingURL=index37.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index37.cjs","names":[],"sources":["../src/components/top-bar/TopBar.tsx"],"sourcesContent":["\"use client\";\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport {\n ThemeToggleButton,\n type ThemeToggleButtonProps,\n} from \"../theme-toggle-button/ThemeToggleButton\";\nimport styles from \"./top-bar.module.css\";\n\nexport type TopBarProps = HTMLAttributes<HTMLElement> & {\n leading?: ReactNode;\n brand?: ReactNode;\n brandHref?: string;\n brandingLocation?: \"left\" | \"center\";\n /** Content rendered after the brand in the left region (e.g. breadcrumbs, search). */\n start?: ReactNode;\n /** Content rendered in the center region. */\n center?: ReactNode;\n actions?: ReactNode;\n showThemeToggle?: boolean;\n themeToggleProps?: ThemeToggleButtonProps;\n innerClassName?: string;\n isSticky?: boolean;\n sticky?: boolean;\n};\n\nexport function TopBar({\n leading,\n brand,\n brandHref,\n brandingLocation = \"left\",\n start,\n center,\n actions,\n showThemeToggle = false,\n themeToggleProps,\n className,\n innerClassName,\n isSticky,\n sticky = true,\n children,\n ...rest\n}: TopBarProps) {\n const shouldStick = isSticky ?? sticky;\n const brandNode = !brand ? null : brandHref ? (\n <a href={brandHref} className={styles.topBarBrand}>\n <span className={styles.topBarBrandContent}>{brand}</span>\n </a>\n ) : (\n <div className={styles.topBarBrand}>\n <span className={styles.topBarBrandContent}>{brand}</span>\n </div>\n );\n\n return (\n <header\n className={cx(styles.topBar, !shouldStick && styles.topBarStatic, className)}\n {...rest}\n >\n <div className={cx(styles.topBarInner, innerClassName)}>\n <div className={styles.topBarStart}>\n {leading}\n {brandingLocation === \"left\" && brandNode}\n {start}\n </div>\n {(brandNode && brandingLocation === \"center\") || center || children ? (\n <div className={styles.topBarCenter}>\n <div className={styles.topBarCenterGroup}>\n {brandingLocation === \"center\" && brandNode}\n {center ?? children}\n </div>\n </div>\n ) : null}\n <div className={styles.topBarActions}>\n {showThemeToggle && <ThemeToggleButton {...themeToggleProps} />}\n {actions}\n </div>\n </div>\n </header>\n );\n}\n"],"mappings":";;;;;;AA2BA,SAAgB,OAAO,EACrB,SACA,OACA,WACA,mBAAmB,QACnB,OACA,QACA,SACA,kBAAkB,OAClB,kBACA,WACA,gBACA,UACA,SAAS,MACT,UACA,GAAG,QACW;CACd,MAAM,cAAc,YAAY;CAChC,MAAM,YAAY,CAAC,QAAQ,OAAO,YAChC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;EAAG,MAAM;EAAW,WAAW,uBAAA,QAAO;YACpC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAM,WAAW,uBAAA,QAAO;aAAqB;EAAY,CAAA;CACxD,CAAA,IAEH,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EAAK,WAAW,uBAAA,QAAO;YACrB,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAM,WAAW,uBAAA,QAAO;aAAqB;EAAY,CAAA;CACtD,CAAA;CAGP,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;EACE,WAAW,WAAA,GAAG,uBAAA,QAAO,QAAQ,CAAC,eAAe,uBAAA,QAAO,cAAc,SAAS;EAC3E,GAAI;YAEJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;GAAK,WAAW,WAAA,GAAG,uBAAA,QAAO,aAAa,cAAc;aAArD;IACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAW,uBAAA,QAAO;eAAvB;MACG;MACA,qBAAqB,UAAU;MAC/B;KACE;;IACH,aAAa,qBAAqB,YAAa,UAAU,WACzD,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,WAAW,uBAAA,QAAO;eACrB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAW,uBAAA,QAAO;gBAAvB,CACG,qBAAqB,YAAY,WACjC,UAAU,QACR;;IACF,CAAA,IACH;IACJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAW,uBAAA,QAAO;eAAvB,CACG,mBAAmB,iBAAA,GAAA,kBAAA,IAAA,CAAC,0BAAA,mBAAD,EAAmB,GAAI,iBAAmB,CAAA,GAC7D,OACE;;GACF;;CACC,CAAA;AAEZ"}
1
+ {"version":3,"file":"index37.cjs","names":[],"sources":["../src/components/theme-toggle-button/ThemeToggleButton.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ButtonHTMLAttributes } from \"react\";\nimport { Button } from \"../button/Button\";\nimport { useTheme } from \"../../theme/ThemeProvider\";\nimport { cx } from \"../../utils/cx\";\nimport styles from \"./theme-toggle-button.module.css\";\n\nexport type ThemeToggleButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\"\n> & {\n showLabel?: boolean;\n lightLabel?: string;\n darkLabel?: string;\n};\n\nfunction MoonIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" width=\"16\" height=\"16\" fill=\"none\">\n <path\n d=\"M20 15.2A8.5 8.5 0 0 1 8.8 4 9 9 0 1 0 20 15.2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction SunIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" width=\"16\" height=\"16\" fill=\"none\">\n <circle cx=\"12\" cy=\"12\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <path\n d=\"M12 2.75v2.5M12 18.75v2.5M21.25 12h-2.5M5.25 12h-2.5M18.54 5.46l-1.77 1.77M7.23 16.77l-1.77 1.77M18.54 18.54l-1.77-1.77M7.23 7.23 5.46 5.46\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function ThemeToggleButton({\n showLabel = false,\n lightLabel = \"Light mode\",\n darkLabel = \"Dark mode\",\n className,\n onClick,\n ...rest\n}: ThemeToggleButtonProps) {\n const { resolvedTheme, toggleTheme } = useTheme();\n const nextThemeLabel = resolvedTheme === \"dark\" ? lightLabel : darkLabel;\n\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size={showLabel ? \"sm\" : \"icon\"}\n className={cx(showLabel && styles.withLabel, className)}\n aria-label={`Switch to ${nextThemeLabel.toLowerCase()}`}\n title={`Switch to ${nextThemeLabel.toLowerCase()}`}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) toggleTheme();\n }}\n {...rest}\n >\n {resolvedTheme === \"dark\" ? <SunIcon /> : <MoonIcon />}\n {showLabel && <span>{nextThemeLabel}</span>}\n </Button>\n );\n}\n"],"mappings":";;;;;;;AAiBA,SAAS,WAAW;CAClB,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EAAK,SAAQ;EAAY,eAAY;EAAO,OAAM;EAAK,QAAO;EAAK,MAAK;YACtE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;EAChB,CAAA;CACE,CAAA;AAET;AAEA,SAAS,UAAU;CACjB,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EAAK,SAAQ;EAAY,eAAY;EAAO,OAAM;EAAK,QAAO;EAAK,MAAK;YAAxE,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;GAAQ,IAAG;GAAK,IAAG;GAAK,GAAE;GAAI,QAAO;GAAe,aAAY;EAAO,CAAA,GACvE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;EACf,CAAA,CACE;;AAET;AAEA,SAAgB,kBAAkB,EAChC,YAAY,OACZ,aAAa,cACb,YAAY,aACZ,WACA,SACA,GAAG,QACsB;CACzB,MAAM,EAAE,eAAe,gBAAgB,sBAAA,SAAS;CAChD,MAAM,iBAAiB,kBAAkB,SAAS,aAAa;CAE/D,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,eAAA,QAAD;EACE,MAAK;EACL,SAAQ;EACR,MAAM,YAAY,OAAO;EACzB,WAAW,WAAA,GAAG,aAAa,mCAAA,QAAO,WAAW,SAAS;EACtD,cAAY,aAAa,eAAe,YAAY;EACpD,OAAO,aAAa,eAAe,YAAY;EAC/C,UAAU,UAAU;GAClB,UAAU,KAAK;GACf,IAAI,CAAC,MAAM,kBAAkB,YAAY;EAC3C;EACA,GAAI;YAXN,CAaG,kBAAkB,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,CAAU,CAAA,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,CAAW,CAAA,GACpD,aAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,eAAqB,CAAA,CACpC;;AAEZ"}