asterui 0.12.62 → 0.12.63

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 (106) hide show
  1. package/dist/components/Anchor.d.ts +2 -0
  2. package/dist/components/Anchor.js +79 -75
  3. package/dist/components/Anchor.js.map +1 -1
  4. package/dist/components/Autocomplete.d.ts +1 -0
  5. package/dist/components/Autocomplete.js +115 -110
  6. package/dist/components/Autocomplete.js.map +1 -1
  7. package/dist/components/Breadcrumb.d.ts +4 -2
  8. package/dist/components/Breadcrumb.js +54 -29
  9. package/dist/components/Breadcrumb.js.map +1 -1
  10. package/dist/components/Button.d.ts +5 -1
  11. package/dist/components/Button.js +117 -107
  12. package/dist/components/Button.js.map +1 -1
  13. package/dist/components/Chart.d.ts +1 -0
  14. package/dist/components/Chart.js +31 -30
  15. package/dist/components/Chart.js.map +1 -1
  16. package/dist/components/Chat.d.ts +1 -0
  17. package/dist/components/Chat.js +32 -30
  18. package/dist/components/Chat.js.map +1 -1
  19. package/dist/components/Command.d.ts +5 -2
  20. package/dist/components/Command.js +262 -233
  21. package/dist/components/Command.js.map +1 -1
  22. package/dist/components/ContextMenu.d.ts +4 -0
  23. package/dist/components/ContextMenu.js +149 -130
  24. package/dist/components/ContextMenu.js.map +1 -1
  25. package/dist/components/Dock.d.ts +2 -0
  26. package/dist/components/Dock.js +70 -46
  27. package/dist/components/Dock.js.map +1 -1
  28. package/dist/components/FileInput.d.ts +1 -0
  29. package/dist/components/FileInput.js +26 -26
  30. package/dist/components/FileInput.js.map +1 -1
  31. package/dist/components/Filter.d.ts +1 -0
  32. package/dist/components/Filter.js +43 -40
  33. package/dist/components/Filter.js.map +1 -1
  34. package/dist/components/Flex.d.ts +1 -0
  35. package/dist/components/Flex.js +43 -42
  36. package/dist/components/Flex.js.map +1 -1
  37. package/dist/components/FloatButton.d.ts +3 -0
  38. package/dist/components/FloatButton.js +178 -127
  39. package/dist/components/FloatButton.js.map +1 -1
  40. package/dist/components/Input.d.ts +1 -0
  41. package/dist/components/Input.js +201 -184
  42. package/dist/components/Input.js.map +1 -1
  43. package/dist/components/Loading.d.ts +1 -0
  44. package/dist/components/Loading.js +40 -37
  45. package/dist/components/Loading.js.map +1 -1
  46. package/dist/components/Masonry.d.ts +1 -0
  47. package/dist/components/Masonry.js +45 -42
  48. package/dist/components/Masonry.js.map +1 -1
  49. package/dist/components/Mention.d.ts +1 -0
  50. package/dist/components/Mention.js +95 -91
  51. package/dist/components/Mention.js.map +1 -1
  52. package/dist/components/MonthCalendar.d.ts +1 -0
  53. package/dist/components/MonthCalendar.js +104 -97
  54. package/dist/components/MonthCalendar.js.map +1 -1
  55. package/dist/components/QRCode.d.ts +1 -0
  56. package/dist/components/QRCode.js +84 -55
  57. package/dist/components/QRCode.js.map +1 -1
  58. package/dist/components/RadialProgress.d.ts +1 -0
  59. package/dist/components/RadialProgress.js +19 -17
  60. package/dist/components/RadialProgress.js.map +1 -1
  61. package/dist/components/Range.d.ts +1 -0
  62. package/dist/components/Range.js +45 -43
  63. package/dist/components/Range.js.map +1 -1
  64. package/dist/components/Rating.d.ts +4 -2
  65. package/dist/components/Rating.js +83 -79
  66. package/dist/components/Rating.js.map +1 -1
  67. package/dist/components/Responsive.d.ts +4 -2
  68. package/dist/components/Responsive.js +10 -9
  69. package/dist/components/Responsive.js.map +1 -1
  70. package/dist/components/Result.d.ts +1 -0
  71. package/dist/components/Result.js +24 -22
  72. package/dist/components/Result.js.map +1 -1
  73. package/dist/components/Select.d.ts +1 -0
  74. package/dist/components/Select.js +72 -62
  75. package/dist/components/Select.js.map +1 -1
  76. package/dist/components/Splitter.d.ts +2 -0
  77. package/dist/components/Splitter.js +137 -131
  78. package/dist/components/Splitter.js.map +1 -1
  79. package/dist/components/Stat.d.ts +4 -2
  80. package/dist/components/Stat.js +19 -18
  81. package/dist/components/Stat.js.map +1 -1
  82. package/dist/components/Steps.d.ts +4 -2
  83. package/dist/components/Steps.js +56 -52
  84. package/dist/components/Steps.js.map +1 -1
  85. package/dist/components/TextRotate.d.ts +1 -0
  86. package/dist/components/TextRotate.js +14 -12
  87. package/dist/components/TextRotate.js.map +1 -1
  88. package/dist/components/Textarea.d.ts +1 -0
  89. package/dist/components/Textarea.js +31 -30
  90. package/dist/components/Textarea.js.map +1 -1
  91. package/dist/components/ThemeController.d.ts +6 -3
  92. package/dist/components/ThemeController.js +101 -92
  93. package/dist/components/ThemeController.js.map +1 -1
  94. package/dist/components/Typography.d.ts +10 -5
  95. package/dist/components/Typography.js +84 -81
  96. package/dist/components/Typography.js.map +1 -1
  97. package/dist/components/VirtualList.d.ts +2 -1
  98. package/dist/components/VirtualList.js +40 -36
  99. package/dist/components/VirtualList.js.map +1 -1
  100. package/dist/components/Watermark.d.ts +1 -0
  101. package/dist/components/Watermark.js +74 -71
  102. package/dist/components/Watermark.js.map +1 -1
  103. package/dist/components/WeekCalendar.d.ts +1 -0
  104. package/dist/components/WeekCalendar.js +91 -76
  105. package/dist/components/WeekCalendar.js.map +1 -1
  106. package/package.json +1 -1
@@ -1,49 +1,52 @@
1
- import { jsx as r, jsxs as p } from "react/jsx-runtime";
2
- import { useState as b, useEffect as f, useId as $ } from "react";
3
- import { useConfig as S } from "../providers/ConfigProvider.js";
4
- import { useTheme as v } from "../hooks/useTheme.js";
5
- const C = "swap", D = "swap-rotate", M = "swap-off", Z = "swap-on", N = "dropdown", B = "dropdown-end", y = "dropdown-content", A = "btn", E = "btn-sm", I = "btn-block", O = "btn-ghost", z = "toggle", j = "toggle-xs", F = "toggle-sm", H = "toggle-md", L = "toggle-lg", V = "toggle-xl";
6
- function i() {
1
+ import { jsx as r, jsxs as b } from "react/jsx-runtime";
2
+ import { useState as v, useEffect as f, useId as S } from "react";
3
+ import { useConfig as C } from "../providers/ConfigProvider.js";
4
+ import { useTheme as x } from "../hooks/useTheme.js";
5
+ const D = "swap", M = "swap-rotate", Z = "swap-off", N = "swap-on", B = "dropdown", y = "dropdown-end", E = "dropdown-content", A = "btn", O = "btn-sm", z = "btn-block", I = "btn-ghost", j = "toggle", F = "toggle-xs", H = "toggle-sm", L = "toggle-md", V = "toggle-lg", X = "toggle-xl";
6
+ function g() {
7
7
  return document.documentElement.getAttribute("data-theme");
8
8
  }
9
- function x(n) {
10
- document.documentElement.setAttribute("data-theme", n);
9
+ function T(o) {
10
+ document.documentElement.setAttribute("data-theme", o);
11
11
  }
12
- function X({
13
- lightTheme: n = "light",
14
- darkTheme: o = "dark",
15
- onChange: u,
16
- className: m = ""
12
+ function G({
13
+ lightTheme: o = "light",
14
+ darkTheme: c = "dark",
15
+ onChange: m,
16
+ className: h = "",
17
+ "data-testid": a
17
18
  }) {
18
- const { setTheme: g, isDark: t } = v(), h = g ?? x, [c, d] = b(() => t !== void 0 ? t : i() === o);
19
+ const { setTheme: p, isDark: e } = x(), w = p ?? T, [d, u] = v(() => e !== void 0 ? e : g() === c);
19
20
  f(() => {
20
- if (t !== void 0) {
21
- d(t);
21
+ if (e !== void 0) {
22
+ u(e);
22
23
  return;
23
24
  }
24
- const s = new MutationObserver(() => {
25
- const e = i();
26
- d(e === o);
25
+ const n = new MutationObserver(() => {
26
+ const t = g();
27
+ u(t === c);
27
28
  });
28
- return s.observe(document.documentElement, { attributes: !0, attributeFilter: ["data-theme"] }), () => s.disconnect();
29
- }, [o, t]);
30
- const l = (s) => {
31
- const a = s.target.checked ? o : n;
32
- h(a), u?.(a);
33
- };
34
- return /* @__PURE__ */ p("label", { className: `${C} ${D} ${m}`, children: [
29
+ return n.observe(document.documentElement, { attributes: !0, attributeFilter: ["data-theme"] }), () => n.disconnect();
30
+ }, [c, e]);
31
+ const i = (n) => {
32
+ const s = n.target.checked ? c : o;
33
+ w(s), m?.(s);
34
+ }, l = (n) => a ? `${a}-${n}` : void 0;
35
+ return /* @__PURE__ */ b("label", { className: `${D} ${M} ${h}`, "data-testid": a, children: [
35
36
  /* @__PURE__ */ r(
36
37
  "input",
37
38
  {
38
39
  type: "checkbox",
39
- checked: c,
40
- onChange: l
40
+ checked: d,
41
+ onChange: i,
42
+ "data-testid": l("input")
41
43
  }
42
44
  ),
43
45
  /* @__PURE__ */ r(
44
46
  "svg",
45
47
  {
46
- className: `${M} h-8 w-8 fill-current`,
48
+ className: `${Z} h-8 w-8 fill-current`,
49
+ "data-testid": l("icon-light"),
47
50
  xmlns: "http://www.w3.org/2000/svg",
48
51
  viewBox: "0 0 24 24",
49
52
  children: /* @__PURE__ */ r("path", { d: "M5.64,17l-.71.71a1,1,0,0,0,0,1.41,1,1,0,0,0,1.41,0l.71-.71A1,1,0,0,0,5.64,17ZM5,12a1,1,0,0,0-1-1H3a1,1,0,0,0,0,2H4A1,1,0,0,0,5,12Zm7-7a1,1,0,0,0,1-1V3a1,1,0,0,0-2,0V4A1,1,0,0,0,12,5ZM5.64,7.05a1,1,0,0,0,.7.29,1,1,0,0,0,.71-.29,1,1,0,0,0,0-1.41l-.71-.71A1,1,0,0,0,4.93,6.34Zm12,.29a1,1,0,0,0,.7-.29l.71-.71a1,1,0,1,0-1.41-1.41L17,5.64a1,1,0,0,0,0,1.41A1,1,0,0,0,17.66,7.34ZM21,11H20a1,1,0,0,0,0,2h1a1,1,0,0,0,0-2Zm-9,8a1,1,0,0,0-1,1v1a1,1,0,0,0,2,0V20A1,1,0,0,0,12,19ZM18.36,17A1,1,0,0,0,17,18.36l.71.71a1,1,0,0,0,1.41,0,1,1,0,0,0,0-1.41ZM12,6.5A5.5,5.5,0,1,0,17.5,12,5.51,5.51,0,0,0,12,6.5Zm0,9A3.5,3.5,0,1,1,15.5,12,3.5,3.5,0,0,1,12,15.5Z" })
@@ -52,7 +55,8 @@ function X({
52
55
  /* @__PURE__ */ r(
53
56
  "svg",
54
57
  {
55
- className: `${Z} h-8 w-8 fill-current`,
58
+ className: `${N} h-8 w-8 fill-current`,
59
+ "data-testid": l("icon-dark"),
56
60
  xmlns: "http://www.w3.org/2000/svg",
57
61
  viewBox: "0 0 24 24",
58
62
  children: /* @__PURE__ */ r("path", { d: "M21.64,13a1,1,0,0,0-1.05-.14,8.05,8.05,0,0,1-3.37.73A8.15,8.15,0,0,1,9.08,5.49a8.59,8.59,0,0,1,.25-2A1,1,0,0,0,8,2.36,10.14,10.14,0,1,0,22,14.05,1,1,0,0,0,21.64,13Zm-9.5,6.69A8.14,8.14,0,0,1,7.08,5.22v.27A10.15,10.15,0,0,0,17.22,15.63a9.79,9.79,0,0,0,2.1-.22A8.11,8.11,0,0,1,12.14,19.73Z" })
@@ -60,33 +64,34 @@ function X({
60
64
  )
61
65
  ] });
62
66
  }
63
- function G({
64
- themes: n,
65
- defaultTheme: o,
66
- onChange: u,
67
- className: m = ""
67
+ function R({
68
+ themes: o,
69
+ defaultTheme: c,
70
+ onChange: m,
71
+ className: h = "",
72
+ "data-testid": a
68
73
  }) {
69
- const { setTheme: g, resolvedTheme: t } = v(), h = g ?? x, c = $(), [d, l] = b(() => {
70
- if (t && n.includes(t)) return t;
71
- const e = i();
72
- return e && n.includes(e) ? e : o || n[0] || "light";
74
+ const { setTheme: p, resolvedTheme: e } = x(), w = p ?? T, d = S(), [u, i] = v(() => {
75
+ if (e && o.includes(e)) return e;
76
+ const t = g();
77
+ return t && o.includes(t) ? t : c || o[0] || "light";
73
78
  });
74
79
  f(() => {
75
- if (t && n.includes(t)) {
76
- l(t);
80
+ if (e && o.includes(e)) {
81
+ i(e);
77
82
  return;
78
83
  }
79
- const e = new MutationObserver(() => {
80
- const a = i();
81
- a && n.includes(a) && l(a);
84
+ const t = new MutationObserver(() => {
85
+ const s = g();
86
+ s && o.includes(s) && i(s);
82
87
  });
83
- return e.observe(document.documentElement, { attributes: !0, attributeFilter: ["data-theme"] }), () => e.disconnect();
84
- }, [n, t]);
85
- const s = (e) => {
86
- l(e), h(e), u?.(e);
87
- };
88
- return /* @__PURE__ */ p("div", { className: `${N} ${B} ${m}`, children: [
89
- /* @__PURE__ */ p("div", { tabIndex: 0, role: "button", className: A, children: [
88
+ return t.observe(document.documentElement, { attributes: !0, attributeFilter: ["data-theme"] }), () => t.disconnect();
89
+ }, [o, e]);
90
+ const l = (t) => {
91
+ i(t), w(t), m?.(t);
92
+ }, n = (t) => a ? `${a}-${t}` : void 0;
93
+ return /* @__PURE__ */ b("div", { className: `${B} ${y} ${h}`, "data-testid": a, children: [
94
+ /* @__PURE__ */ b("div", { tabIndex: 0, role: "button", className: A, "data-testid": n("trigger"), children: [
90
95
  "Theme",
91
96
  /* @__PURE__ */ r(
92
97
  "svg",
@@ -104,73 +109,77 @@ function G({
104
109
  "ul",
105
110
  {
106
111
  tabIndex: 0,
107
- className: `${y} bg-base-300 rounded-box z-[1] w-52 p-2 shadow-2xl max-h-96 overflow-y-auto`,
108
- children: n.map((e) => /* @__PURE__ */ r("li", { children: /* @__PURE__ */ r(
112
+ className: `${E} bg-base-300 rounded-box z-[1] w-52 p-2 shadow-2xl max-h-96 overflow-y-auto`,
113
+ "data-testid": n("menu"),
114
+ children: o.map((t) => /* @__PURE__ */ r("li", { children: /* @__PURE__ */ r(
109
115
  "input",
110
116
  {
111
117
  type: "radio",
112
- name: c,
113
- className: `${A} ${E} ${I} ${O} justify-start`,
114
- "aria-label": e,
115
- value: e,
116
- checked: d === e,
117
- onChange: () => s(e)
118
+ name: d,
119
+ className: `${A} ${O} ${z} ${I} justify-start`,
120
+ "aria-label": t,
121
+ value: t,
122
+ checked: u === t,
123
+ onChange: () => l(t),
124
+ "data-testid": n(`option-${t}`)
118
125
  }
119
- ) }, e))
126
+ ) }, t))
120
127
  }
121
128
  )
122
129
  ] });
123
130
  }
124
- const R = {
125
- xs: j,
126
- sm: F,
127
- md: H,
128
- lg: L,
129
- xl: V
131
+ const q = {
132
+ xs: F,
133
+ sm: H,
134
+ md: L,
135
+ lg: V,
136
+ xl: X
130
137
  };
131
- function q({
132
- lightTheme: n = "light",
133
- darkTheme: o = "dark",
134
- onChange: u,
135
- size: m,
136
- className: g = ""
138
+ function J({
139
+ lightTheme: o = "light",
140
+ darkTheme: c = "dark",
141
+ onChange: m,
142
+ size: h,
143
+ className: a = "",
144
+ "data-testid": p
137
145
  }) {
138
- const { componentSize: t } = S(), { setTheme: h, isDark: c } = v(), d = h ?? x, l = m ?? t ?? "md", [s, e] = b(() => c !== void 0 ? c : i() === o);
146
+ const { componentSize: e } = C(), { setTheme: w, isDark: d } = x(), u = w ?? T, i = h ?? e ?? "md", [l, n] = v(() => d !== void 0 ? d : g() === c);
139
147
  f(() => {
140
- if (c !== void 0) {
141
- e(c);
148
+ if (d !== void 0) {
149
+ n(d);
142
150
  return;
143
151
  }
144
- const w = new MutationObserver(() => {
145
- const T = i();
146
- e(T === o);
152
+ const s = new MutationObserver(() => {
153
+ const $ = g();
154
+ n($ === c);
147
155
  });
148
- return w.observe(document.documentElement, { attributes: !0, attributeFilter: ["data-theme"] }), () => w.disconnect();
149
- }, [o, c]);
150
- const a = (w) => {
151
- const k = w.target.checked ? o : n;
152
- d(k), u?.(k);
156
+ return s.observe(document.documentElement, { attributes: !0, attributeFilter: ["data-theme"] }), () => s.disconnect();
157
+ }, [c, d]);
158
+ const t = (s) => {
159
+ const k = s.target.checked ? c : o;
160
+ u(k), m?.(k);
153
161
  };
154
162
  return /* @__PURE__ */ r(
155
163
  "input",
156
164
  {
157
165
  type: "checkbox",
158
- className: `${z} ${R[l]} ${g}`,
159
- checked: s,
160
- onChange: a,
161
- "aria-label": "Toggle theme"
166
+ className: `${j} ${q[i]} ${a}`,
167
+ checked: l,
168
+ onChange: t,
169
+ "aria-label": "Toggle theme",
170
+ "data-testid": p
162
171
  }
163
172
  );
164
173
  }
165
- const U = Object.assign(
174
+ const W = Object.assign(
166
175
  {},
167
176
  {
168
- Swap: X,
169
- Dropdown: G,
170
- Toggle: q
177
+ Swap: G,
178
+ Dropdown: R,
179
+ Toggle: J
171
180
  }
172
181
  );
173
182
  export {
174
- U as ThemeController
183
+ W as ThemeController
175
184
  };
176
185
  //# sourceMappingURL=ThemeController.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ThemeController.js","sources":["../../src/components/ThemeController.tsx"],"sourcesContent":["import React, { useState, useEffect, useId } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\nimport { useTheme } from '../hooks/useTheme'\n\n// DaisyUI classes\nconst dSwap = 'swap'\nconst dSwapRotate = 'swap-rotate'\nconst dSwapOff = 'swap-off'\nconst dSwapOn = 'swap-on'\nconst dDropdown = 'dropdown'\nconst dDropdownEnd = 'dropdown-end'\nconst dDropdownContent = 'dropdown-content'\nconst dBtn = 'btn'\nconst dBtnSm = 'btn-sm'\nconst dBtnBlock = 'btn-block'\nconst dBtnGhost = 'btn-ghost'\nconst dToggle = 'toggle'\nconst dToggleXs = 'toggle-xs'\nconst dToggleSm = 'toggle-sm'\nconst dToggleMd = 'toggle-md'\nconst dToggleLg = 'toggle-lg'\nconst dToggleXl = 'toggle-xl'\n\nexport interface ThemeControllerSwapProps {\n lightTheme?: string\n darkTheme?: string\n onChange?: (theme: string) => void\n className?: string\n}\n\nexport interface ThemeControllerDropdownProps {\n themes: string[]\n defaultTheme?: string\n onChange?: (theme: string) => void\n className?: string\n}\n\nexport interface ThemeControllerToggleProps {\n lightTheme?: string\n darkTheme?: string\n onChange?: (theme: string) => void\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n className?: string\n}\n\n// Get current theme from document\nfunction getCurrentTheme(): string | null {\n return document.documentElement.getAttribute('data-theme')\n}\n\n// Set theme directly on document (fallback when no ThemeProvider)\nfunction setThemeDirectly(theme: string) {\n document.documentElement.setAttribute('data-theme', theme)\n}\n\nfunction ThemeControllerSwap({\n lightTheme = 'light',\n darkTheme = 'dark',\n onChange,\n className = '',\n}: ThemeControllerSwapProps) {\n const { setTheme: contextSetTheme, isDark: contextIsDark } = useTheme()\n const setTheme = contextSetTheme ?? setThemeDirectly\n\n const [isDark, setIsDark] = useState(() => {\n if (contextIsDark !== undefined) return contextIsDark\n const current = getCurrentTheme()\n return current === darkTheme\n })\n\n // Sync with context or external theme changes\n useEffect(() => {\n if (contextIsDark !== undefined) {\n setIsDark(contextIsDark)\n return\n }\n const observer = new MutationObserver(() => {\n const current = getCurrentTheme()\n setIsDark(current === darkTheme)\n })\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] })\n return () => observer.disconnect()\n }, [darkTheme, contextIsDark])\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const checked = e.target.checked\n const theme = checked ? darkTheme : lightTheme\n setTheme(theme)\n onChange?.(theme)\n }\n\n return (\n <label className={`${dSwap} ${dSwapRotate} ${className}`}>\n <input\n type=\"checkbox\"\n checked={isDark}\n onChange={handleChange}\n />\n {/* sun icon */}\n <svg\n className={`${dSwapOff} h-8 w-8 fill-current`}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M5.64,17l-.71.71a1,1,0,0,0,0,1.41,1,1,0,0,0,1.41,0l.71-.71A1,1,0,0,0,5.64,17ZM5,12a1,1,0,0,0-1-1H3a1,1,0,0,0,0,2H4A1,1,0,0,0,5,12Zm7-7a1,1,0,0,0,1-1V3a1,1,0,0,0-2,0V4A1,1,0,0,0,12,5ZM5.64,7.05a1,1,0,0,0,.7.29,1,1,0,0,0,.71-.29,1,1,0,0,0,0-1.41l-.71-.71A1,1,0,0,0,4.93,6.34Zm12,.29a1,1,0,0,0,.7-.29l.71-.71a1,1,0,1,0-1.41-1.41L17,5.64a1,1,0,0,0,0,1.41A1,1,0,0,0,17.66,7.34ZM21,11H20a1,1,0,0,0,0,2h1a1,1,0,0,0,0-2Zm-9,8a1,1,0,0,0-1,1v1a1,1,0,0,0,2,0V20A1,1,0,0,0,12,19ZM18.36,17A1,1,0,0,0,17,18.36l.71.71a1,1,0,0,0,1.41,0,1,1,0,0,0,0-1.41ZM12,6.5A5.5,5.5,0,1,0,17.5,12,5.51,5.51,0,0,0,12,6.5Zm0,9A3.5,3.5,0,1,1,15.5,12,3.5,3.5,0,0,1,12,15.5Z\" />\n </svg>\n {/* moon icon */}\n <svg\n className={`${dSwapOn} h-8 w-8 fill-current`}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M21.64,13a1,1,0,0,0-1.05-.14,8.05,8.05,0,0,1-3.37.73A8.15,8.15,0,0,1,9.08,5.49a8.59,8.59,0,0,1,.25-2A1,1,0,0,0,8,2.36,10.14,10.14,0,1,0,22,14.05,1,1,0,0,0,21.64,13Zm-9.5,6.69A8.14,8.14,0,0,1,7.08,5.22v.27A10.15,10.15,0,0,0,17.22,15.63a9.79,9.79,0,0,0,2.1-.22A8.11,8.11,0,0,1,12.14,19.73Z\" />\n </svg>\n </label>\n )\n}\n\nfunction ThemeControllerDropdown({\n themes,\n defaultTheme,\n onChange,\n className = '',\n}: ThemeControllerDropdownProps) {\n const { setTheme: contextSetTheme, resolvedTheme } = useTheme()\n const setTheme = contextSetTheme ?? setThemeDirectly\n const radioName = useId()\n\n const [selectedTheme, setSelectedTheme] = useState(() => {\n if (resolvedTheme && themes.includes(resolvedTheme)) return resolvedTheme\n const current = getCurrentTheme()\n if (current && themes.includes(current)) return current\n return defaultTheme || themes[0] || 'light'\n })\n\n // Sync with context or external theme changes\n useEffect(() => {\n if (resolvedTheme && themes.includes(resolvedTheme)) {\n setSelectedTheme(resolvedTheme)\n return\n }\n const observer = new MutationObserver(() => {\n const current = getCurrentTheme()\n if (current && themes.includes(current)) {\n setSelectedTheme(current)\n }\n })\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] })\n return () => observer.disconnect()\n }, [themes, resolvedTheme])\n\n const handleChange = (theme: string) => {\n setSelectedTheme(theme)\n setTheme(theme)\n onChange?.(theme)\n }\n\n return (\n <div className={`${dDropdown} ${dDropdownEnd} ${className}`}>\n <div tabIndex={0} role=\"button\" className={dBtn}>\n Theme\n <svg\n width=\"12px\"\n height=\"12px\"\n className=\"inline-block h-2 w-2 fill-current opacity-60\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 2048 2048\"\n >\n <path d=\"M1799 349l242 241-1017 1017L7 590l242-241 775 775 775-775z\"></path>\n </svg>\n </div>\n <ul\n tabIndex={0}\n className={`${dDropdownContent} bg-base-300 rounded-box z-[1] w-52 p-2 shadow-2xl max-h-96 overflow-y-auto`}\n >\n {themes.map((theme) => (\n <li key={theme}>\n <input\n type=\"radio\"\n name={radioName}\n className={`${dBtn} ${dBtnSm} ${dBtnBlock} ${dBtnGhost} justify-start`}\n aria-label={theme}\n value={theme}\n checked={selectedTheme === theme}\n onChange={() => handleChange(theme)}\n />\n </li>\n ))}\n </ul>\n </div>\n )\n}\n\nconst sizeClasses: Record<string, string> = {\n xs: dToggleXs,\n sm: dToggleSm,\n md: dToggleMd,\n lg: dToggleLg,\n xl: dToggleXl,\n}\n\nfunction ThemeControllerToggle({\n lightTheme = 'light',\n darkTheme = 'dark',\n onChange,\n size,\n className = '',\n}: ThemeControllerToggleProps) {\n const { componentSize } = useConfig()\n const { setTheme: contextSetTheme, isDark: contextIsDark } = useTheme()\n const setTheme = contextSetTheme ?? setThemeDirectly\n const effectiveSize = size ?? componentSize ?? 'md'\n\n const [isDark, setIsDark] = useState(() => {\n if (contextIsDark !== undefined) return contextIsDark\n const current = getCurrentTheme()\n return current === darkTheme\n })\n\n // Sync with context or external theme changes\n useEffect(() => {\n if (contextIsDark !== undefined) {\n setIsDark(contextIsDark)\n return\n }\n const observer = new MutationObserver(() => {\n const current = getCurrentTheme()\n setIsDark(current === darkTheme)\n })\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] })\n return () => observer.disconnect()\n }, [darkTheme, contextIsDark])\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const checked = e.target.checked\n const theme = checked ? darkTheme : lightTheme\n setTheme(theme)\n onChange?.(theme)\n }\n\n return (\n <input\n type=\"checkbox\"\n className={`${dToggle} ${sizeClasses[effectiveSize]} ${className}`}\n checked={isDark}\n onChange={handleChange}\n aria-label=\"Toggle theme\"\n />\n )\n}\n\nexport const ThemeController = Object.assign(\n {},\n {\n Swap: ThemeControllerSwap,\n Dropdown: ThemeControllerDropdown,\n Toggle: ThemeControllerToggle,\n }\n)\n"],"names":["dSwap","dSwapRotate","dSwapOff","dSwapOn","dDropdown","dDropdownEnd","dDropdownContent","dBtn","dBtnSm","dBtnBlock","dBtnGhost","dToggle","dToggleXs","dToggleSm","dToggleMd","dToggleLg","dToggleXl","getCurrentTheme","setThemeDirectly","theme","ThemeControllerSwap","lightTheme","darkTheme","onChange","className","contextSetTheme","contextIsDark","useTheme","setTheme","isDark","setIsDark","useState","useEffect","observer","current","handleChange","e","jsxs","jsx","ThemeControllerDropdown","themes","defaultTheme","resolvedTheme","radioName","useId","selectedTheme","setSelectedTheme","sizeClasses","ThemeControllerToggle","size","componentSize","useConfig","effectiveSize","ThemeController"],"mappings":"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"}
1
+ {"version":3,"file":"ThemeController.js","sources":["../../src/components/ThemeController.tsx"],"sourcesContent":["import React, { useState, useEffect, useId } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\nimport { useTheme } from '../hooks/useTheme'\n\n// DaisyUI classes\nconst dSwap = 'swap'\nconst dSwapRotate = 'swap-rotate'\nconst dSwapOff = 'swap-off'\nconst dSwapOn = 'swap-on'\nconst dDropdown = 'dropdown'\nconst dDropdownEnd = 'dropdown-end'\nconst dDropdownContent = 'dropdown-content'\nconst dBtn = 'btn'\nconst dBtnSm = 'btn-sm'\nconst dBtnBlock = 'btn-block'\nconst dBtnGhost = 'btn-ghost'\nconst dToggle = 'toggle'\nconst dToggleXs = 'toggle-xs'\nconst dToggleSm = 'toggle-sm'\nconst dToggleMd = 'toggle-md'\nconst dToggleLg = 'toggle-lg'\nconst dToggleXl = 'toggle-xl'\n\nexport interface ThemeControllerSwapProps {\n lightTheme?: string\n darkTheme?: string\n onChange?: (theme: string) => void\n className?: string\n 'data-testid'?: string\n}\n\nexport interface ThemeControllerDropdownProps {\n themes: string[]\n defaultTheme?: string\n onChange?: (theme: string) => void\n className?: string\n 'data-testid'?: string\n}\n\nexport interface ThemeControllerToggleProps {\n lightTheme?: string\n darkTheme?: string\n onChange?: (theme: string) => void\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n className?: string\n 'data-testid'?: string\n}\n\n// Get current theme from document\nfunction getCurrentTheme(): string | null {\n return document.documentElement.getAttribute('data-theme')\n}\n\n// Set theme directly on document (fallback when no ThemeProvider)\nfunction setThemeDirectly(theme: string) {\n document.documentElement.setAttribute('data-theme', theme)\n}\n\nfunction ThemeControllerSwap({\n lightTheme = 'light',\n darkTheme = 'dark',\n onChange,\n className = '',\n 'data-testid': testId,\n}: ThemeControllerSwapProps) {\n const { setTheme: contextSetTheme, isDark: contextIsDark } = useTheme()\n const setTheme = contextSetTheme ?? setThemeDirectly\n\n const [isDark, setIsDark] = useState(() => {\n if (contextIsDark !== undefined) return contextIsDark\n const current = getCurrentTheme()\n return current === darkTheme\n })\n\n // Sync with context or external theme changes\n useEffect(() => {\n if (contextIsDark !== undefined) {\n setIsDark(contextIsDark)\n return\n }\n const observer = new MutationObserver(() => {\n const current = getCurrentTheme()\n setIsDark(current === darkTheme)\n })\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] })\n return () => observer.disconnect()\n }, [darkTheme, contextIsDark])\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const checked = e.target.checked\n const theme = checked ? darkTheme : lightTheme\n setTheme(theme)\n onChange?.(theme)\n }\n\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n return (\n <label className={`${dSwap} ${dSwapRotate} ${className}`} data-testid={testId}>\n <input\n type=\"checkbox\"\n checked={isDark}\n onChange={handleChange}\n data-testid={getTestId('input')}\n />\n {/* sun icon */}\n <svg\n className={`${dSwapOff} h-8 w-8 fill-current`}\n data-testid={getTestId('icon-light')}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M5.64,17l-.71.71a1,1,0,0,0,0,1.41,1,1,0,0,0,1.41,0l.71-.71A1,1,0,0,0,5.64,17ZM5,12a1,1,0,0,0-1-1H3a1,1,0,0,0,0,2H4A1,1,0,0,0,5,12Zm7-7a1,1,0,0,0,1-1V3a1,1,0,0,0-2,0V4A1,1,0,0,0,12,5ZM5.64,7.05a1,1,0,0,0,.7.29,1,1,0,0,0,.71-.29,1,1,0,0,0,0-1.41l-.71-.71A1,1,0,0,0,4.93,6.34Zm12,.29a1,1,0,0,0,.7-.29l.71-.71a1,1,0,1,0-1.41-1.41L17,5.64a1,1,0,0,0,0,1.41A1,1,0,0,0,17.66,7.34ZM21,11H20a1,1,0,0,0,0,2h1a1,1,0,0,0,0-2Zm-9,8a1,1,0,0,0-1,1v1a1,1,0,0,0,2,0V20A1,1,0,0,0,12,19ZM18.36,17A1,1,0,0,0,17,18.36l.71.71a1,1,0,0,0,1.41,0,1,1,0,0,0,0-1.41ZM12,6.5A5.5,5.5,0,1,0,17.5,12,5.51,5.51,0,0,0,12,6.5Zm0,9A3.5,3.5,0,1,1,15.5,12,3.5,3.5,0,0,1,12,15.5Z\" />\n </svg>\n {/* moon icon */}\n <svg\n className={`${dSwapOn} h-8 w-8 fill-current`}\n data-testid={getTestId('icon-dark')}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M21.64,13a1,1,0,0,0-1.05-.14,8.05,8.05,0,0,1-3.37.73A8.15,8.15,0,0,1,9.08,5.49a8.59,8.59,0,0,1,.25-2A1,1,0,0,0,8,2.36,10.14,10.14,0,1,0,22,14.05,1,1,0,0,0,21.64,13Zm-9.5,6.69A8.14,8.14,0,0,1,7.08,5.22v.27A10.15,10.15,0,0,0,17.22,15.63a9.79,9.79,0,0,0,2.1-.22A8.11,8.11,0,0,1,12.14,19.73Z\" />\n </svg>\n </label>\n )\n}\n\nfunction ThemeControllerDropdown({\n themes,\n defaultTheme,\n onChange,\n className = '',\n 'data-testid': testId,\n}: ThemeControllerDropdownProps) {\n const { setTheme: contextSetTheme, resolvedTheme } = useTheme()\n const setTheme = contextSetTheme ?? setThemeDirectly\n const radioName = useId()\n\n const [selectedTheme, setSelectedTheme] = useState(() => {\n if (resolvedTheme && themes.includes(resolvedTheme)) return resolvedTheme\n const current = getCurrentTheme()\n if (current && themes.includes(current)) return current\n return defaultTheme || themes[0] || 'light'\n })\n\n // Sync with context or external theme changes\n useEffect(() => {\n if (resolvedTheme && themes.includes(resolvedTheme)) {\n setSelectedTheme(resolvedTheme)\n return\n }\n const observer = new MutationObserver(() => {\n const current = getCurrentTheme()\n if (current && themes.includes(current)) {\n setSelectedTheme(current)\n }\n })\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] })\n return () => observer.disconnect()\n }, [themes, resolvedTheme])\n\n const handleChange = (theme: string) => {\n setSelectedTheme(theme)\n setTheme(theme)\n onChange?.(theme)\n }\n\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n return (\n <div className={`${dDropdown} ${dDropdownEnd} ${className}`} data-testid={testId}>\n <div tabIndex={0} role=\"button\" className={dBtn} data-testid={getTestId('trigger')}>\n Theme\n <svg\n width=\"12px\"\n height=\"12px\"\n className=\"inline-block h-2 w-2 fill-current opacity-60\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 2048 2048\"\n >\n <path d=\"M1799 349l242 241-1017 1017L7 590l242-241 775 775 775-775z\"></path>\n </svg>\n </div>\n <ul\n tabIndex={0}\n className={`${dDropdownContent} bg-base-300 rounded-box z-[1] w-52 p-2 shadow-2xl max-h-96 overflow-y-auto`}\n data-testid={getTestId('menu')}\n >\n {themes.map((theme) => (\n <li key={theme}>\n <input\n type=\"radio\"\n name={radioName}\n className={`${dBtn} ${dBtnSm} ${dBtnBlock} ${dBtnGhost} justify-start`}\n aria-label={theme}\n value={theme}\n checked={selectedTheme === theme}\n onChange={() => handleChange(theme)}\n data-testid={getTestId(`option-${theme}`)}\n />\n </li>\n ))}\n </ul>\n </div>\n )\n}\n\nconst sizeClasses: Record<string, string> = {\n xs: dToggleXs,\n sm: dToggleSm,\n md: dToggleMd,\n lg: dToggleLg,\n xl: dToggleXl,\n}\n\nfunction ThemeControllerToggle({\n lightTheme = 'light',\n darkTheme = 'dark',\n onChange,\n size,\n className = '',\n 'data-testid': testId,\n}: ThemeControllerToggleProps) {\n const { componentSize } = useConfig()\n const { setTheme: contextSetTheme, isDark: contextIsDark } = useTheme()\n const setTheme = contextSetTheme ?? setThemeDirectly\n const effectiveSize = size ?? componentSize ?? 'md'\n\n const [isDark, setIsDark] = useState(() => {\n if (contextIsDark !== undefined) return contextIsDark\n const current = getCurrentTheme()\n return current === darkTheme\n })\n\n // Sync with context or external theme changes\n useEffect(() => {\n if (contextIsDark !== undefined) {\n setIsDark(contextIsDark)\n return\n }\n const observer = new MutationObserver(() => {\n const current = getCurrentTheme()\n setIsDark(current === darkTheme)\n })\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] })\n return () => observer.disconnect()\n }, [darkTheme, contextIsDark])\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const checked = e.target.checked\n const theme = checked ? darkTheme : lightTheme\n setTheme(theme)\n onChange?.(theme)\n }\n\n return (\n <input\n type=\"checkbox\"\n className={`${dToggle} ${sizeClasses[effectiveSize]} ${className}`}\n checked={isDark}\n onChange={handleChange}\n aria-label=\"Toggle theme\"\n data-testid={testId}\n />\n )\n}\n\nexport const ThemeController = Object.assign(\n {},\n {\n Swap: ThemeControllerSwap,\n Dropdown: ThemeControllerDropdown,\n Toggle: ThemeControllerToggle,\n }\n)\n"],"names":["dSwap","dSwapRotate","dSwapOff","dSwapOn","dDropdown","dDropdownEnd","dDropdownContent","dBtn","dBtnSm","dBtnBlock","dBtnGhost","dToggle","dToggleXs","dToggleSm","dToggleMd","dToggleLg","dToggleXl","getCurrentTheme","setThemeDirectly","theme","ThemeControllerSwap","lightTheme","darkTheme","onChange","className","testId","contextSetTheme","contextIsDark","useTheme","setTheme","isDark","setIsDark","useState","useEffect","observer","current","handleChange","e","getTestId","suffix","jsxs","jsx","ThemeControllerDropdown","themes","defaultTheme","resolvedTheme","radioName","useId","selectedTheme","setSelectedTheme","sizeClasses","ThemeControllerToggle","size","componentSize","useConfig","effectiveSize","ThemeController"],"mappings":"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"}
@@ -4,12 +4,14 @@ export type TitleLevel = 1 | 2 | 3 | 4 | 5;
4
4
  export interface TypographyProps extends React.HTMLAttributes<HTMLDivElement> {
5
5
  children: React.ReactNode;
6
6
  size?: TypographySize;
7
+ 'data-testid'?: string;
7
8
  }
8
9
  export interface TitleProps extends Omit<React.HTMLAttributes<HTMLHeadingElement>, 'title'> {
9
10
  level?: TitleLevel;
10
11
  children: React.ReactNode;
11
12
  copyable?: boolean;
12
13
  ellipsis?: boolean;
14
+ 'data-testid'?: string;
13
15
  }
14
16
  export interface ParagraphProps extends React.HTMLAttributes<HTMLDivElement> {
15
17
  children: React.ReactNode;
@@ -21,6 +23,7 @@ export interface ParagraphProps extends React.HTMLAttributes<HTMLDivElement> {
21
23
  copyable?: boolean;
22
24
  size?: TypographySize;
23
25
  align?: 'left' | 'center' | 'right';
26
+ 'data-testid'?: string;
24
27
  }
25
28
  export interface TextProps extends React.HTMLAttributes<HTMLSpanElement> {
26
29
  children: React.ReactNode;
@@ -32,18 +35,20 @@ export interface TextProps extends React.HTMLAttributes<HTMLSpanElement> {
32
35
  delete?: boolean;
33
36
  type?: 'default' | 'secondary' | 'success' | 'warning' | 'error';
34
37
  copyable?: boolean;
38
+ 'data-testid'?: string;
35
39
  }
36
40
  export interface TypographyLinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {
37
41
  href?: string;
38
42
  children: React.ReactNode;
39
43
  external?: boolean;
40
44
  size?: TypographySize;
45
+ 'data-testid'?: string;
41
46
  }
42
- declare function TypographyRoot({ children, size, className, ...rest }: TypographyProps): import("react/jsx-runtime").JSX.Element;
43
- declare function Title({ level, children, copyable, ellipsis, className, id, ...rest }: TitleProps): import("react/jsx-runtime").JSX.Element;
44
- declare function Paragraph({ children, ellipsis, copyable, size, align, className, ...rest }: ParagraphProps): import("react/jsx-runtime").JSX.Element;
45
- declare function Text({ children, code, mark, strong, italic, underline, delete: del, type, copyable, className, ...rest }: TextProps): import("react/jsx-runtime").JSX.Element;
46
- declare function Link({ href, children, target, external, size, className, ...rest }: TypographyLinkProps): import("react/jsx-runtime").JSX.Element;
47
+ declare function TypographyRoot({ children, size, className, 'data-testid': testId, ...rest }: TypographyProps): import("react/jsx-runtime").JSX.Element;
48
+ declare function Title({ level, children, copyable, ellipsis, className, id, 'data-testid': testId, ...rest }: TitleProps): import("react/jsx-runtime").JSX.Element;
49
+ declare function Paragraph({ children, ellipsis, copyable, size, align, className, 'data-testid': testId, ...rest }: ParagraphProps): import("react/jsx-runtime").JSX.Element;
50
+ declare function Text({ children, code, mark, strong, italic, underline, delete: del, type, copyable, className, 'data-testid': testId, ...rest }: TextProps): import("react/jsx-runtime").JSX.Element;
51
+ declare function Link({ href, children, target, external, size, className, 'data-testid': testId, ...rest }: TypographyLinkProps): import("react/jsx-runtime").JSX.Element;
47
52
  export declare const Typography: typeof TypographyRoot & {
48
53
  Title: typeof Title;
49
54
  Paragraph: typeof Paragraph;