asterui 0.12.62 → 0.12.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Anchor.d.ts +2 -0
- package/dist/components/Anchor.js +79 -75
- package/dist/components/Anchor.js.map +1 -1
- package/dist/components/Autocomplete.d.ts +1 -0
- package/dist/components/Autocomplete.js +115 -110
- package/dist/components/Autocomplete.js.map +1 -1
- package/dist/components/Breadcrumb.d.ts +4 -2
- package/dist/components/Breadcrumb.js +54 -29
- package/dist/components/Breadcrumb.js.map +1 -1
- package/dist/components/Button.d.ts +5 -1
- package/dist/components/Button.js +117 -107
- package/dist/components/Button.js.map +1 -1
- package/dist/components/Chart.d.ts +1 -0
- package/dist/components/Chart.js +31 -30
- package/dist/components/Chart.js.map +1 -1
- package/dist/components/Chat.d.ts +1 -0
- package/dist/components/Chat.js +32 -30
- package/dist/components/Chat.js.map +1 -1
- package/dist/components/Collapse.js +58 -56
- package/dist/components/Collapse.js.map +1 -1
- package/dist/components/Command.d.ts +5 -2
- package/dist/components/Command.js +262 -233
- package/dist/components/Command.js.map +1 -1
- package/dist/components/ContextMenu.d.ts +4 -0
- package/dist/components/ContextMenu.js +149 -130
- package/dist/components/ContextMenu.js.map +1 -1
- package/dist/components/DatePicker.d.ts +19 -1
- package/dist/components/DatePicker.js +266 -87
- package/dist/components/DatePicker.js.map +1 -1
- package/dist/components/Dock.d.ts +2 -0
- package/dist/components/Dock.js +70 -46
- package/dist/components/Dock.js.map +1 -1
- package/dist/components/FileInput.d.ts +1 -0
- package/dist/components/FileInput.js +26 -26
- package/dist/components/FileInput.js.map +1 -1
- package/dist/components/Filter.d.ts +1 -0
- package/dist/components/Filter.js +43 -40
- package/dist/components/Filter.js.map +1 -1
- package/dist/components/Flex.d.ts +1 -0
- package/dist/components/Flex.js +43 -42
- package/dist/components/Flex.js.map +1 -1
- package/dist/components/FloatButton.d.ts +3 -0
- package/dist/components/FloatButton.js +178 -127
- package/dist/components/FloatButton.js.map +1 -1
- package/dist/components/Input.d.ts +1 -0
- package/dist/components/Input.js +201 -184
- package/dist/components/Input.js.map +1 -1
- package/dist/components/Loading.d.ts +1 -0
- package/dist/components/Loading.js +40 -37
- package/dist/components/Loading.js.map +1 -1
- package/dist/components/Masonry.d.ts +1 -0
- package/dist/components/Masonry.js +45 -42
- package/dist/components/Masonry.js.map +1 -1
- package/dist/components/Mention.d.ts +1 -0
- package/dist/components/Mention.js +95 -91
- package/dist/components/Mention.js.map +1 -1
- package/dist/components/Menu.d.ts +1 -1
- package/dist/components/Menu.js +99 -93
- package/dist/components/Menu.js.map +1 -1
- package/dist/components/Modal.js +26 -17
- package/dist/components/Modal.js.map +1 -1
- package/dist/components/MonthCalendar.d.ts +1 -0
- package/dist/components/MonthCalendar.js +104 -97
- package/dist/components/MonthCalendar.js.map +1 -1
- package/dist/components/Notification.js +53 -45
- package/dist/components/Notification.js.map +1 -1
- package/dist/components/QRCode.d.ts +1 -0
- package/dist/components/QRCode.js +84 -55
- package/dist/components/QRCode.js.map +1 -1
- package/dist/components/RadialProgress.d.ts +1 -0
- package/dist/components/RadialProgress.js +19 -17
- package/dist/components/RadialProgress.js.map +1 -1
- package/dist/components/Range.d.ts +1 -0
- package/dist/components/Range.js +45 -43
- package/dist/components/Range.js.map +1 -1
- package/dist/components/Rating.d.ts +4 -2
- package/dist/components/Rating.js +83 -79
- package/dist/components/Rating.js.map +1 -1
- package/dist/components/Responsive.d.ts +4 -2
- package/dist/components/Responsive.js +10 -9
- package/dist/components/Responsive.js.map +1 -1
- package/dist/components/Result.d.ts +1 -0
- package/dist/components/Result.js +24 -22
- package/dist/components/Result.js.map +1 -1
- package/dist/components/Select.d.ts +1 -0
- package/dist/components/Select.js +72 -62
- package/dist/components/Select.js.map +1 -1
- package/dist/components/Splitter.d.ts +2 -0
- package/dist/components/Splitter.js +137 -131
- package/dist/components/Splitter.js.map +1 -1
- package/dist/components/Stat.d.ts +4 -2
- package/dist/components/Stat.js +19 -18
- package/dist/components/Stat.js.map +1 -1
- package/dist/components/Steps.d.ts +4 -2
- package/dist/components/Steps.js +56 -52
- package/dist/components/Steps.js.map +1 -1
- package/dist/components/Tabs.js +69 -57
- package/dist/components/Tabs.js.map +1 -1
- package/dist/components/TextRotate.d.ts +1 -0
- package/dist/components/TextRotate.js +14 -12
- package/dist/components/TextRotate.js.map +1 -1
- package/dist/components/Textarea.d.ts +1 -0
- package/dist/components/Textarea.js +31 -30
- package/dist/components/Textarea.js.map +1 -1
- package/dist/components/ThemeController.d.ts +6 -3
- package/dist/components/ThemeController.js +101 -92
- package/dist/components/ThemeController.js.map +1 -1
- package/dist/components/Tooltip.js +38 -35
- package/dist/components/Tooltip.js.map +1 -1
- package/dist/components/Transfer.js +130 -121
- package/dist/components/Transfer.js.map +1 -1
- package/dist/components/TreeSelect.js +49 -48
- package/dist/components/TreeSelect.js.map +1 -1
- package/dist/components/Typography.d.ts +10 -5
- package/dist/components/Typography.js +84 -81
- package/dist/components/Typography.js.map +1 -1
- package/dist/components/VirtualList.d.ts +2 -1
- package/dist/components/VirtualList.js +40 -36
- package/dist/components/VirtualList.js.map +1 -1
- package/dist/components/Watermark.d.ts +1 -0
- package/dist/components/Watermark.js +74 -71
- package/dist/components/Watermark.js.map +1 -1
- package/dist/components/WeekCalendar.d.ts +1 -0
- package/dist/components/WeekCalendar.js +91 -76
- package/dist/components/WeekCalendar.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1,44 +1,45 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { forwardRef as
|
|
3
|
-
import { useConfig as
|
|
4
|
-
const
|
|
1
|
+
import { jsx as T } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef as f } from "react";
|
|
3
|
+
import { useConfig as u } from "../providers/ConfigProvider.js";
|
|
4
|
+
const g = "textarea", p = "textarea-bordered", y = "textarea-ghost", S = "textarea-xs", w = "textarea-sm", C = "textarea-md", z = "textarea-lg", N = "textarea-xl", h = "textarea-neutral", j = "textarea-primary", B = "textarea-secondary", X = "textarea-accent", b = "textarea-info", v = "textarea-success", A = "textarea-warning", E = "textarea-error", G = f(
|
|
5
5
|
({
|
|
6
6
|
size: t,
|
|
7
7
|
color: e,
|
|
8
8
|
ghost: r = !1,
|
|
9
9
|
bordered: s = !0,
|
|
10
10
|
className: o = "",
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
11
|
+
"data-testid": n,
|
|
12
|
+
...x
|
|
13
|
+
}, c) => {
|
|
14
|
+
const { componentSize: d } = u(), a = t ?? d ?? "md", i = {
|
|
15
|
+
xs: S,
|
|
16
|
+
sm: w,
|
|
17
|
+
md: C,
|
|
18
|
+
lg: z,
|
|
19
|
+
xl: N
|
|
20
|
+
}, l = {
|
|
21
|
+
neutral: h,
|
|
22
|
+
primary: j,
|
|
23
|
+
secondary: B,
|
|
24
|
+
accent: X,
|
|
25
|
+
info: b,
|
|
26
|
+
success: v,
|
|
27
|
+
warning: A,
|
|
28
|
+
error: E
|
|
29
|
+
}, m = [
|
|
30
|
+
g,
|
|
30
31
|
"w-full",
|
|
31
|
-
s &&
|
|
32
|
-
r &&
|
|
33
|
-
a &&
|
|
34
|
-
e &&
|
|
32
|
+
s && p,
|
|
33
|
+
r && y,
|
|
34
|
+
a && i[a],
|
|
35
|
+
e && l[e],
|
|
35
36
|
o
|
|
36
37
|
].filter(Boolean).join(" ");
|
|
37
|
-
return /* @__PURE__ */
|
|
38
|
+
return /* @__PURE__ */ T("textarea", { ref: c, className: m, "data-testid": n, ...x });
|
|
38
39
|
}
|
|
39
40
|
);
|
|
40
|
-
|
|
41
|
+
G.displayName = "Textarea";
|
|
41
42
|
export {
|
|
42
|
-
|
|
43
|
+
G as Textarea
|
|
43
44
|
};
|
|
44
45
|
//# sourceMappingURL=Textarea.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Textarea.js","sources":["../../src/components/Textarea.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dTextarea = 'textarea'\nconst dTextareaBordered = 'textarea-bordered'\nconst dTextareaGhost = 'textarea-ghost'\nconst dTextareaXs = 'textarea-xs'\nconst dTextareaSm = 'textarea-sm'\nconst dTextareaMd = 'textarea-md'\nconst dTextareaLg = 'textarea-lg'\nconst dTextareaXl = 'textarea-xl'\nconst dTextareaNeutral = 'textarea-neutral'\nconst dTextareaPrimary = 'textarea-primary'\nconst dTextareaSecondary = 'textarea-secondary'\nconst dTextareaAccent = 'textarea-accent'\nconst dTextareaInfo = 'textarea-info'\nconst dTextareaSuccess = 'textarea-success'\nconst dTextareaWarning = 'textarea-warning'\nconst dTextareaError = 'textarea-error'\n\nexport interface TextareaProps extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> {\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n color?: 'neutral' | 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error'\n ghost?: boolean\n bordered?: boolean\n className?: string\n}\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n size,\n color,\n ghost = false,\n bordered = true,\n className = '',\n ...props\n },\n ref\n ) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n const sizeClasses = {\n xs: dTextareaXs,\n sm: dTextareaSm,\n md: dTextareaMd,\n lg: dTextareaLg,\n xl: dTextareaXl,\n }\n\n const colorClasses = {\n neutral: dTextareaNeutral,\n primary: dTextareaPrimary,\n secondary: dTextareaSecondary,\n accent: dTextareaAccent,\n info: dTextareaInfo,\n success: dTextareaSuccess,\n warning: dTextareaWarning,\n error: dTextareaError,\n }\n\n const textareaClasses = [\n dTextarea,\n 'w-full',\n bordered && dTextareaBordered,\n ghost && dTextareaGhost,\n effectiveSize && sizeClasses[effectiveSize],\n color && colorClasses[color],\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return <textarea ref={ref} className={textareaClasses} {...props} />\n }\n)\n\nTextarea.displayName = 'Textarea'\n"],"names":["dTextarea","dTextareaBordered","dTextareaGhost","dTextareaXs","dTextareaSm","dTextareaMd","dTextareaLg","dTextareaXl","dTextareaNeutral","dTextareaPrimary","dTextareaSecondary","dTextareaAccent","dTextareaInfo","dTextareaSuccess","dTextareaWarning","dTextareaError","Textarea","forwardRef","size","color","ghost","bordered","className","props","ref","componentSize","useConfig","effectiveSize","sizeClasses","colorClasses","textareaClasses"],"mappings":";;;AAIA,MAAMA,IAAY,YACZC,IAAoB,qBACpBC,IAAiB,kBACjBC,IAAc,eACdC,IAAc,eACdC,IAAc,eACdC,IAAc,eACdC,IAAc,eACdC,IAAmB,oBACnBC,IAAmB,oBACnBC,IAAqB,sBACrBC,IAAkB,mBAClBC,IAAgB,iBAChBC,IAAmB,oBACnBC,IAAmB,oBACnBC,IAAiB,
|
|
1
|
+
{"version":3,"file":"Textarea.js","sources":["../../src/components/Textarea.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dTextarea = 'textarea'\nconst dTextareaBordered = 'textarea-bordered'\nconst dTextareaGhost = 'textarea-ghost'\nconst dTextareaXs = 'textarea-xs'\nconst dTextareaSm = 'textarea-sm'\nconst dTextareaMd = 'textarea-md'\nconst dTextareaLg = 'textarea-lg'\nconst dTextareaXl = 'textarea-xl'\nconst dTextareaNeutral = 'textarea-neutral'\nconst dTextareaPrimary = 'textarea-primary'\nconst dTextareaSecondary = 'textarea-secondary'\nconst dTextareaAccent = 'textarea-accent'\nconst dTextareaInfo = 'textarea-info'\nconst dTextareaSuccess = 'textarea-success'\nconst dTextareaWarning = 'textarea-warning'\nconst dTextareaError = 'textarea-error'\n\nexport interface TextareaProps extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> {\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n color?: 'neutral' | 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error'\n ghost?: boolean\n bordered?: boolean\n className?: string\n 'data-testid'?: string\n}\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n size,\n color,\n ghost = false,\n bordered = true,\n className = '',\n 'data-testid': testId,\n ...props\n },\n ref\n ) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n const sizeClasses = {\n xs: dTextareaXs,\n sm: dTextareaSm,\n md: dTextareaMd,\n lg: dTextareaLg,\n xl: dTextareaXl,\n }\n\n const colorClasses = {\n neutral: dTextareaNeutral,\n primary: dTextareaPrimary,\n secondary: dTextareaSecondary,\n accent: dTextareaAccent,\n info: dTextareaInfo,\n success: dTextareaSuccess,\n warning: dTextareaWarning,\n error: dTextareaError,\n }\n\n const textareaClasses = [\n dTextarea,\n 'w-full',\n bordered && dTextareaBordered,\n ghost && dTextareaGhost,\n effectiveSize && sizeClasses[effectiveSize],\n color && colorClasses[color],\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return <textarea ref={ref} className={textareaClasses} data-testid={testId} {...props} />\n }\n)\n\nTextarea.displayName = 'Textarea'\n"],"names":["dTextarea","dTextareaBordered","dTextareaGhost","dTextareaXs","dTextareaSm","dTextareaMd","dTextareaLg","dTextareaXl","dTextareaNeutral","dTextareaPrimary","dTextareaSecondary","dTextareaAccent","dTextareaInfo","dTextareaSuccess","dTextareaWarning","dTextareaError","Textarea","forwardRef","size","color","ghost","bordered","className","testId","props","ref","componentSize","useConfig","effectiveSize","sizeClasses","colorClasses","textareaClasses","jsx"],"mappings":";;;AAIA,MAAMA,IAAY,YACZC,IAAoB,qBACpBC,IAAiB,kBACjBC,IAAc,eACdC,IAAc,eACdC,IAAc,eACdC,IAAc,eACdC,IAAc,eACdC,IAAmB,oBACnBC,IAAmB,oBACnBC,IAAqB,sBACrBC,IAAkB,mBAClBC,IAAgB,iBAChBC,IAAmB,oBACnBC,IAAmB,oBACnBC,IAAiB,kBAWVC,IAAWC;AAAA,EACtB,CACE;AAAA,IACE,MAAAC;AAAA,IACA,OAAAC;AAAA,IACA,OAAAC,IAAQ;AAAA,IACR,UAAAC,IAAW;AAAA,IACX,WAAAC,IAAY;AAAA,IACZ,eAAeC;AAAA,IACf,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAM,EAAE,eAAAC,EAAA,IAAkBC,EAAA,GACpBC,IAAgBV,KAAQQ,KAAiB,MAEzCG,IAAc;AAAA,MAClB,IAAI1B;AAAA,MACJ,IAAIC;AAAA,MACJ,IAAIC;AAAA,MACJ,IAAIC;AAAA,MACJ,IAAIC;AAAA,IAAA,GAGAuB,IAAe;AAAA,MACnB,SAAStB;AAAA,MACT,SAASC;AAAA,MACT,WAAWC;AAAA,MACX,QAAQC;AAAA,MACR,MAAMC;AAAA,MACN,SAASC;AAAA,MACT,SAASC;AAAA,MACT,OAAOC;AAAA,IAAA,GAGHgB,IAAkB;AAAA,MACtB/B;AAAA,MACA;AAAA,MACAqB,KAAYpB;AAAA,MACZmB,KAASlB;AAAA,MACT0B,KAAiBC,EAAYD,CAAa;AAAA,MAC1CT,KAASW,EAAaX,CAAK;AAAA,MAC3BG;AAAA,IAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,WAAO,gBAAAU,EAAC,cAAS,KAAAP,GAAU,WAAWM,GAAiB,eAAaR,GAAS,GAAGC,GAAO;AAAA,EACzF;AACF;AAEAR,EAAS,cAAc;"}
|
|
@@ -3,12 +3,14 @@ export interface ThemeControllerSwapProps {
|
|
|
3
3
|
darkTheme?: string;
|
|
4
4
|
onChange?: (theme: string) => void;
|
|
5
5
|
className?: string;
|
|
6
|
+
'data-testid'?: string;
|
|
6
7
|
}
|
|
7
8
|
export interface ThemeControllerDropdownProps {
|
|
8
9
|
themes: string[];
|
|
9
10
|
defaultTheme?: string;
|
|
10
11
|
onChange?: (theme: string) => void;
|
|
11
12
|
className?: string;
|
|
13
|
+
'data-testid'?: string;
|
|
12
14
|
}
|
|
13
15
|
export interface ThemeControllerToggleProps {
|
|
14
16
|
lightTheme?: string;
|
|
@@ -16,10 +18,11 @@ export interface ThemeControllerToggleProps {
|
|
|
16
18
|
onChange?: (theme: string) => void;
|
|
17
19
|
size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
18
20
|
className?: string;
|
|
21
|
+
'data-testid'?: string;
|
|
19
22
|
}
|
|
20
|
-
declare function ThemeControllerSwap({ lightTheme, darkTheme, onChange, className, }: ThemeControllerSwapProps): import("react/jsx-runtime").JSX.Element;
|
|
21
|
-
declare function ThemeControllerDropdown({ themes, defaultTheme, onChange, className, }: ThemeControllerDropdownProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
-
declare function ThemeControllerToggle({ lightTheme, darkTheme, onChange, size, className, }: ThemeControllerToggleProps): import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
declare function ThemeControllerSwap({ lightTheme, darkTheme, onChange, className, 'data-testid': testId, }: ThemeControllerSwapProps): import("react/jsx-runtime").JSX.Element;
|
|
24
|
+
declare function ThemeControllerDropdown({ themes, defaultTheme, onChange, className, 'data-testid': testId, }: ThemeControllerDropdownProps): import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
declare function ThemeControllerToggle({ lightTheme, darkTheme, onChange, size, className, 'data-testid': testId, }: ThemeControllerToggleProps): import("react/jsx-runtime").JSX.Element;
|
|
23
26
|
export declare const ThemeController: {
|
|
24
27
|
Swap: typeof ThemeControllerSwap;
|
|
25
28
|
Dropdown: typeof ThemeControllerDropdown;
|
|
@@ -1,49 +1,52 @@
|
|
|
1
|
-
import { jsx as r, jsxs as
|
|
2
|
-
import { useState as
|
|
3
|
-
import { useConfig as
|
|
4
|
-
import { useTheme as
|
|
5
|
-
const
|
|
6
|
-
function
|
|
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
|
|
10
|
-
document.documentElement.setAttribute("data-theme",
|
|
9
|
+
function T(o) {
|
|
10
|
+
document.documentElement.setAttribute("data-theme", o);
|
|
11
11
|
}
|
|
12
|
-
function
|
|
13
|
-
lightTheme:
|
|
14
|
-
darkTheme:
|
|
15
|
-
onChange:
|
|
16
|
-
className:
|
|
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:
|
|
19
|
+
const { setTheme: p, isDark: e } = x(), w = p ?? T, [d, u] = v(() => e !== void 0 ? e : g() === c);
|
|
19
20
|
f(() => {
|
|
20
|
-
if (
|
|
21
|
-
|
|
21
|
+
if (e !== void 0) {
|
|
22
|
+
u(e);
|
|
22
23
|
return;
|
|
23
24
|
}
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
|
|
25
|
+
const n = new MutationObserver(() => {
|
|
26
|
+
const t = g();
|
|
27
|
+
u(t === c);
|
|
27
28
|
});
|
|
28
|
-
return
|
|
29
|
-
}, [
|
|
30
|
-
const
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
};
|
|
34
|
-
return /* @__PURE__ */
|
|
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:
|
|
40
|
-
onChange:
|
|
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: `${
|
|
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: `${
|
|
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
|
|
64
|
-
themes:
|
|
65
|
-
defaultTheme:
|
|
66
|
-
onChange:
|
|
67
|
-
className:
|
|
67
|
+
function R({
|
|
68
|
+
themes: o,
|
|
69
|
+
defaultTheme: c,
|
|
70
|
+
onChange: m,
|
|
71
|
+
className: h = "",
|
|
72
|
+
"data-testid": a
|
|
68
73
|
}) {
|
|
69
|
-
const { setTheme:
|
|
70
|
-
if (
|
|
71
|
-
const
|
|
72
|
-
return
|
|
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 (
|
|
76
|
-
|
|
80
|
+
if (e && o.includes(e)) {
|
|
81
|
+
i(e);
|
|
77
82
|
return;
|
|
78
83
|
}
|
|
79
|
-
const
|
|
80
|
-
const
|
|
81
|
-
|
|
84
|
+
const t = new MutationObserver(() => {
|
|
85
|
+
const s = g();
|
|
86
|
+
s && o.includes(s) && i(s);
|
|
82
87
|
});
|
|
83
|
-
return
|
|
84
|
-
}, [
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
};
|
|
88
|
-
return /* @__PURE__ */
|
|
89
|
-
/* @__PURE__ */
|
|
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: `${
|
|
108
|
-
|
|
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:
|
|
113
|
-
className: `${A} ${
|
|
114
|
-
"aria-label":
|
|
115
|
-
value:
|
|
116
|
-
checked:
|
|
117
|
-
onChange: () =>
|
|
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
|
-
) },
|
|
126
|
+
) }, t))
|
|
120
127
|
}
|
|
121
128
|
)
|
|
122
129
|
] });
|
|
123
130
|
}
|
|
124
|
-
const
|
|
125
|
-
xs:
|
|
126
|
-
sm:
|
|
127
|
-
md:
|
|
128
|
-
lg:
|
|
129
|
-
xl:
|
|
131
|
+
const q = {
|
|
132
|
+
xs: F,
|
|
133
|
+
sm: H,
|
|
134
|
+
md: L,
|
|
135
|
+
lg: V,
|
|
136
|
+
xl: X
|
|
130
137
|
};
|
|
131
|
-
function
|
|
132
|
-
lightTheme:
|
|
133
|
-
darkTheme:
|
|
134
|
-
onChange:
|
|
135
|
-
size:
|
|
136
|
-
className:
|
|
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:
|
|
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 (
|
|
141
|
-
|
|
148
|
+
if (d !== void 0) {
|
|
149
|
+
n(d);
|
|
142
150
|
return;
|
|
143
151
|
}
|
|
144
|
-
const
|
|
145
|
-
const
|
|
146
|
-
|
|
152
|
+
const s = new MutationObserver(() => {
|
|
153
|
+
const $ = g();
|
|
154
|
+
n($ === c);
|
|
147
155
|
});
|
|
148
|
-
return
|
|
149
|
-
}, [
|
|
150
|
-
const
|
|
151
|
-
const k =
|
|
152
|
-
|
|
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: `${
|
|
159
|
-
checked:
|
|
160
|
-
onChange:
|
|
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
|
|
174
|
+
const W = Object.assign(
|
|
166
175
|
{},
|
|
167
176
|
{
|
|
168
|
-
Swap:
|
|
169
|
-
Dropdown:
|
|
170
|
-
Toggle:
|
|
177
|
+
Swap: G,
|
|
178
|
+
Dropdown: R,
|
|
179
|
+
Toggle: J
|
|
171
180
|
}
|
|
172
181
|
);
|
|
173
182
|
export {
|
|
174
|
-
|
|
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":";;;;AAKA,MAAMA,IAAQ,QACRC,IAAc,eACdC,IAAW,YACXC,IAAU,WACVC,IAAY,YACZC,IAAe,gBACfC,IAAmB,oBACnBC,IAAO,OACPC,IAAS,UACTC,IAAY,aACZC,IAAY,aACZC,IAAU,UACVC,IAAY,aACZC,IAAY,aACZC,IAAY,aACZC,IAAY,aACZC,IAAY;AAyBlB,SAASC,IAAiC;AACxC,SAAO,SAAS,gBAAgB,aAAa,YAAY;AAC3D;AAGA,SAASC,EAAiBC,GAAe;AACvC,WAAS,gBAAgB,aAAa,cAAcA,CAAK;AAC3D;AAEA,SAASC,EAAoB;AAAA,EAC3B,YAAAC,IAAa;AAAA,EACb,WAAAC,IAAY;AAAA,EACZ,UAAAC;AAAA,EACA,WAAAC,IAAY;AACd,GAA6B;AAC3B,QAAM,EAAE,UAAUC,GAAiB,QAAQC,EAAA,IAAkBC,EAAA,GACvDC,IAAWH,KAAmBP,GAE9B,CAACW,GAAQC,CAAS,IAAIC,EAAS,MAC/BL,MAAkB,SAAkBA,IACxBT,EAAA,MACGK,CACpB;AAGD,EAAAU,EAAU,MAAM;AACd,QAAIN,MAAkB,QAAW;AAC/B,MAAAI,EAAUJ,CAAa;AACvB;AAAA,IACF;AACA,UAAMO,IAAW,IAAI,iBAAiB,MAAM;AAC1C,YAAMC,IAAUjB,EAAA;AAChB,MAAAa,EAAUI,MAAYZ,CAAS;AAAA,IACjC,CAAC;AACD,WAAAW,EAAS,QAAQ,SAAS,iBAAiB,EAAE,YAAY,IAAM,iBAAiB,CAAC,YAAY,GAAG,GACzF,MAAMA,EAAS,WAAA;AAAA,EACxB,GAAG,CAACX,GAAWI,CAAa,CAAC;AAE7B,QAAMS,IAAe,CAACC,MAA2C;AAE/D,UAAMjB,IADUiB,EAAE,OAAO,UACDd,IAAYD;AACpC,IAAAO,EAAST,CAAK,GACdI,IAAWJ,CAAK;AAAA,EAClB;AAEA,SACE,gBAAAkB,EAAC,WAAM,WAAW,GAAGrC,CAAK,IAAIC,CAAW,IAAIuB,CAAS,IACpD,UAAA;AAAA,IAAA,gBAAAc;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAST;AAAA,QACT,UAAUM;AAAA,MAAA;AAAA,IAAA;AAAA,IAGZ,gBAAAG;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,GAAGpC,CAAQ;AAAA,QACtB,OAAM;AAAA,QACN,SAAQ;AAAA,QAER,UAAA,gBAAAoC,EAAC,QAAA,EAAK,GAAE,koBAAA,CAAkoB;AAAA,MAAA;AAAA,IAAA;AAAA,IAG5oB,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,GAAGnC,CAAO;AAAA,QACrB,OAAM;AAAA,QACN,SAAQ;AAAA,QAER,UAAA,gBAAAmC,EAAC,QAAA,EAAK,GAAE,kSAAA,CAAkS;AAAA,MAAA;AAAA,IAAA;AAAA,EAC5S,GACF;AAEJ;AAEA,SAASC,EAAwB;AAAA,EAC/B,QAAAC;AAAA,EACA,cAAAC;AAAA,EACA,UAAAlB;AAAA,EACA,WAAAC,IAAY;AACd,GAAiC;AAC/B,QAAM,EAAE,UAAUC,GAAiB,eAAAiB,EAAA,IAAkBf,EAAA,GAC/CC,IAAWH,KAAmBP,GAC9ByB,IAAYC,EAAA,GAEZ,CAACC,GAAeC,CAAgB,IAAIf,EAAS,MAAM;AACvD,QAAIW,KAAiBF,EAAO,SAASE,CAAa,EAAG,QAAOA;AAC5D,UAAMR,IAAUjB,EAAA;AAChB,WAAIiB,KAAWM,EAAO,SAASN,CAAO,IAAUA,IACzCO,KAAgBD,EAAO,CAAC,KAAK;AAAA,EACtC,CAAC;AAGD,EAAAR,EAAU,MAAM;AACd,QAAIU,KAAiBF,EAAO,SAASE,CAAa,GAAG;AACnD,MAAAI,EAAiBJ,CAAa;AAC9B;AAAA,IACF;AACA,UAAMT,IAAW,IAAI,iBAAiB,MAAM;AAC1C,YAAMC,IAAUjB,EAAA;AAChB,MAAIiB,KAAWM,EAAO,SAASN,CAAO,KACpCY,EAAiBZ,CAAO;AAAA,IAE5B,CAAC;AACD,WAAAD,EAAS,QAAQ,SAAS,iBAAiB,EAAE,YAAY,IAAM,iBAAiB,CAAC,YAAY,GAAG,GACzF,MAAMA,EAAS,WAAA;AAAA,EACxB,GAAG,CAACO,GAAQE,CAAa,CAAC;AAE1B,QAAMP,IAAe,CAAChB,MAAkB;AACtC,IAAA2B,EAAiB3B,CAAK,GACtBS,EAAST,CAAK,GACdI,IAAWJ,CAAK;AAAA,EAClB;AAEA,SACE,gBAAAkB,EAAC,SAAI,WAAW,GAAGjC,CAAS,IAAIC,CAAY,IAAImB,CAAS,IACvD,UAAA;AAAA,IAAA,gBAAAa,EAAC,SAAI,UAAU,GAAG,MAAK,UAAS,WAAW9B,GAAM,UAAA;AAAA,MAAA;AAAA,MAE/C,gBAAA+B;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,QAAO;AAAA,UACP,WAAU;AAAA,UACV,OAAM;AAAA,UACN,SAAQ;AAAA,UAER,UAAA,gBAAAA,EAAC,QAAA,EAAK,GAAE,6DAAA,CAA6D;AAAA,QAAA;AAAA,MAAA;AAAA,IACvE,GACF;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,UAAU;AAAA,QACV,WAAW,GAAGhC,CAAgB;AAAA,QAE7B,UAAAkC,EAAO,IAAI,CAACrB,wBACV,MAAA,EACC,UAAA,gBAAAmB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,MAAMK;AAAA,YACN,WAAW,GAAGpC,CAAI,IAAIC,CAAM,IAAIC,CAAS,IAAIC,CAAS;AAAA,YACtD,cAAYS;AAAA,YACZ,OAAOA;AAAA,YACP,SAAS0B,MAAkB1B;AAAA,YAC3B,UAAU,MAAMgB,EAAahB,CAAK;AAAA,UAAA;AAAA,QAAA,EACpC,GATOA,CAUT,CACD;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,GACF;AAEJ;AAEA,MAAM4B,IAAsC;AAAA,EAC1C,IAAInC;AAAA,EACJ,IAAIC;AAAA,EACJ,IAAIC;AAAA,EACJ,IAAIC;AAAA,EACJ,IAAIC;AACN;AAEA,SAASgC,EAAsB;AAAA,EAC7B,YAAA3B,IAAa;AAAA,EACb,WAAAC,IAAY;AAAA,EACZ,UAAAC;AAAA,EACA,MAAA0B;AAAA,EACA,WAAAzB,IAAY;AACd,GAA+B;AAC7B,QAAM,EAAE,eAAA0B,EAAA,IAAkBC,EAAA,GACpB,EAAE,UAAU1B,GAAiB,QAAQC,EAAA,IAAkBC,EAAA,GACvDC,IAAWH,KAAmBP,GAC9BkC,IAAgBH,KAAQC,KAAiB,MAEzC,CAACrB,GAAQC,CAAS,IAAIC,EAAS,MAC/BL,MAAkB,SAAkBA,IACxBT,EAAA,MACGK,CACpB;AAGD,EAAAU,EAAU,MAAM;AACd,QAAIN,MAAkB,QAAW;AAC/B,MAAAI,EAAUJ,CAAa;AACvB;AAAA,IACF;AACA,UAAMO,IAAW,IAAI,iBAAiB,MAAM;AAC1C,YAAMC,IAAUjB,EAAA;AAChB,MAAAa,EAAUI,MAAYZ,CAAS;AAAA,IACjC,CAAC;AACD,WAAAW,EAAS,QAAQ,SAAS,iBAAiB,EAAE,YAAY,IAAM,iBAAiB,CAAC,YAAY,GAAG,GACzF,MAAMA,EAAS,WAAA;AAAA,EACxB,GAAG,CAACX,GAAWI,CAAa,CAAC;AAE7B,QAAMS,IAAe,CAACC,MAA2C;AAE/D,UAAMjB,IADUiB,EAAE,OAAO,UACDd,IAAYD;AACpC,IAAAO,EAAST,CAAK,GACdI,IAAWJ,CAAK;AAAA,EAClB;AAEA,SACE,gBAAAmB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAW,GAAG3B,CAAO,IAAIoC,EAAYK,CAAa,CAAC,IAAI5B,CAAS;AAAA,MAChE,SAASK;AAAA,MACT,UAAUM;AAAA,MACV,cAAW;AAAA,IAAA;AAAA,EAAA;AAGjB;AAEO,MAAMkB,IAAkB,OAAO;AAAA,EACpC,CAAA;AAAA,EACA;AAAA,IACE,MAAMjC;AAAA,IACN,UAAUmB;AAAA,IACV,QAAQS;AAAA,EAAA;AAEZ;"}
|
|
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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"}
|
|
@@ -1,43 +1,46 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import
|
|
3
|
-
const
|
|
1
|
+
import { jsxs as f, jsx as u } from "react/jsx-runtime";
|
|
2
|
+
import e, { useId as b } from "react";
|
|
3
|
+
const g = "tooltip", h = "tooltip-top", x = "tooltip-bottom", B = "tooltip-left", j = "tooltip-right", E = "tooltip-neutral", I = "tooltip-primary", N = "tooltip-secondary", v = "tooltip-accent", w = "tooltip-info", A = "tooltip-success", C = "tooltip-warning", D = "tooltip-error", R = "tooltip-open", $ = ({
|
|
4
4
|
children: o,
|
|
5
|
-
tip:
|
|
6
|
-
className:
|
|
7
|
-
position:
|
|
8
|
-
color:
|
|
9
|
-
open:
|
|
10
|
-
...
|
|
5
|
+
tip: i,
|
|
6
|
+
className: c = "",
|
|
7
|
+
position: p = "top",
|
|
8
|
+
color: s,
|
|
9
|
+
open: l = !1,
|
|
10
|
+
...r
|
|
11
11
|
}) => {
|
|
12
|
-
const
|
|
13
|
-
top:
|
|
14
|
-
bottom:
|
|
15
|
-
left:
|
|
12
|
+
const t = b(), a = {
|
|
13
|
+
top: h,
|
|
14
|
+
bottom: x,
|
|
15
|
+
left: B,
|
|
16
16
|
right: j
|
|
17
|
-
},
|
|
18
|
-
neutral:
|
|
19
|
-
primary:
|
|
20
|
-
secondary:
|
|
21
|
-
accent:
|
|
22
|
-
info:
|
|
23
|
-
success:
|
|
24
|
-
warning:
|
|
25
|
-
error:
|
|
26
|
-
}[
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
].filter(Boolean).join(" "),
|
|
33
|
-
"aria-describedby":
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
17
|
+
}, d = s ? {
|
|
18
|
+
neutral: E,
|
|
19
|
+
primary: I,
|
|
20
|
+
secondary: N,
|
|
21
|
+
accent: v,
|
|
22
|
+
info: w,
|
|
23
|
+
success: A,
|
|
24
|
+
warning: C,
|
|
25
|
+
error: D
|
|
26
|
+
}[s] : void 0, T = [
|
|
27
|
+
g,
|
|
28
|
+
a[p],
|
|
29
|
+
d,
|
|
30
|
+
l && R,
|
|
31
|
+
c
|
|
32
|
+
].filter(Boolean).join(" "), m = e.isValidElement(o) ? (() => {
|
|
33
|
+
const n = o.props["aria-describedby"], y = n ? `${n} ${t}` : t;
|
|
34
|
+
return e.cloneElement(o, {
|
|
35
|
+
"aria-describedby": y
|
|
36
|
+
});
|
|
37
|
+
})() : o;
|
|
38
|
+
return /* @__PURE__ */ f("div", { className: T, "data-tip": i, "data-state": l ? "open" : "closed", ...r, children: [
|
|
39
|
+
m,
|
|
40
|
+
/* @__PURE__ */ u("span", { id: t, role: "tooltip", className: "sr-only", children: i })
|
|
38
41
|
] });
|
|
39
42
|
};
|
|
40
43
|
export {
|
|
41
|
-
|
|
44
|
+
$ as Tooltip
|
|
42
45
|
};
|
|
43
46
|
//# sourceMappingURL=Tooltip.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tooltip.js","sources":["../../src/components/Tooltip.tsx"],"sourcesContent":["import React, { useId } from 'react'\n\n// DaisyUI classes\nconst dTooltip = 'tooltip'\nconst dTooltipTop = 'tooltip-top'\nconst dTooltipBottom = 'tooltip-bottom'\nconst dTooltipLeft = 'tooltip-left'\nconst dTooltipRight = 'tooltip-right'\nconst dTooltipNeutral = 'tooltip-neutral'\nconst dTooltipPrimary = 'tooltip-primary'\nconst dTooltipSecondary = 'tooltip-secondary'\nconst dTooltipAccent = 'tooltip-accent'\nconst dTooltipInfo = 'tooltip-info'\nconst dTooltipSuccess = 'tooltip-success'\nconst dTooltipWarning = 'tooltip-warning'\nconst dTooltipError = 'tooltip-error'\nconst dTooltipOpen = 'tooltip-open'\n\nexport interface TooltipProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n tip: string\n position?: 'top' | 'bottom' | 'left' | 'right'\n color?: 'neutral' | 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error'\n open?: boolean\n /** Test ID for testing */\n 'data-testid'?: string\n}\n\nexport const Tooltip: React.FC<TooltipProps> = ({\n children,\n tip,\n className = '',\n position = 'top',\n color,\n open = false,\n ...rest\n}) => {\n const tooltipId = useId()\n\n const positionClasses = {\n top: dTooltipTop,\n bottom: dTooltipBottom,\n left: dTooltipLeft,\n right: dTooltipRight,\n }\n\n const colorClasses = color\n ? {\n neutral: dTooltipNeutral,\n primary: dTooltipPrimary,\n secondary: dTooltipSecondary,\n accent: dTooltipAccent,\n info: dTooltipInfo,\n success: dTooltipSuccess,\n warning: dTooltipWarning,\n error: dTooltipError,\n }[color]\n : undefined\n\n const classes = [\n dTooltip,\n positionClasses[position],\n colorClasses,\n open && dTooltipOpen,\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n // Clone children to add aria-describedby\n const childWithAria = React.isValidElement(children)\n ? React.cloneElement(children as React.ReactElement<{ 'aria-describedby'?: string }>, {\n
|
|
1
|
+
{"version":3,"file":"Tooltip.js","sources":["../../src/components/Tooltip.tsx"],"sourcesContent":["import React, { useId } from 'react'\n\n// DaisyUI classes\nconst dTooltip = 'tooltip'\nconst dTooltipTop = 'tooltip-top'\nconst dTooltipBottom = 'tooltip-bottom'\nconst dTooltipLeft = 'tooltip-left'\nconst dTooltipRight = 'tooltip-right'\nconst dTooltipNeutral = 'tooltip-neutral'\nconst dTooltipPrimary = 'tooltip-primary'\nconst dTooltipSecondary = 'tooltip-secondary'\nconst dTooltipAccent = 'tooltip-accent'\nconst dTooltipInfo = 'tooltip-info'\nconst dTooltipSuccess = 'tooltip-success'\nconst dTooltipWarning = 'tooltip-warning'\nconst dTooltipError = 'tooltip-error'\nconst dTooltipOpen = 'tooltip-open'\n\nexport interface TooltipProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n tip: string\n position?: 'top' | 'bottom' | 'left' | 'right'\n color?: 'neutral' | 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error'\n open?: boolean\n /** Test ID for testing */\n 'data-testid'?: string\n}\n\nexport const Tooltip: React.FC<TooltipProps> = ({\n children,\n tip,\n className = '',\n position = 'top',\n color,\n open = false,\n ...rest\n}) => {\n const tooltipId = useId()\n\n const positionClasses = {\n top: dTooltipTop,\n bottom: dTooltipBottom,\n left: dTooltipLeft,\n right: dTooltipRight,\n }\n\n const colorClasses = color\n ? {\n neutral: dTooltipNeutral,\n primary: dTooltipPrimary,\n secondary: dTooltipSecondary,\n accent: dTooltipAccent,\n info: dTooltipInfo,\n success: dTooltipSuccess,\n warning: dTooltipWarning,\n error: dTooltipError,\n }[color]\n : undefined\n\n const classes = [\n dTooltip,\n positionClasses[position],\n colorClasses,\n open && dTooltipOpen,\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n // Clone children to add aria-describedby without clobbering existing values\n const childWithAria = React.isValidElement(children)\n ? (() => {\n const existingDescribedBy = (children.props as { 'aria-describedby'?: string })['aria-describedby']\n const mergedDescribedBy = existingDescribedBy ? `${existingDescribedBy} ${tooltipId}` : tooltipId\n return React.cloneElement(children as React.ReactElement<{ 'aria-describedby'?: string }>, {\n 'aria-describedby': mergedDescribedBy,\n })\n })()\n : children\n\n return (\n <div className={classes} data-tip={tip} data-state={open ? 'open' : 'closed'} {...rest}>\n {childWithAria}\n {/* Screen reader accessible tooltip text */}\n <span id={tooltipId} role=\"tooltip\" className=\"sr-only\">\n {tip}\n </span>\n </div>\n )\n}\n"],"names":["dTooltip","dTooltipTop","dTooltipBottom","dTooltipLeft","dTooltipRight","dTooltipNeutral","dTooltipPrimary","dTooltipSecondary","dTooltipAccent","dTooltipInfo","dTooltipSuccess","dTooltipWarning","dTooltipError","dTooltipOpen","Tooltip","children","tip","className","position","color","open","rest","tooltipId","useId","positionClasses","colorClasses","classes","childWithAria","React","existingDescribedBy","mergedDescribedBy","jsxs","jsx"],"mappings":";;AAGA,MAAMA,IAAW,WACXC,IAAc,eACdC,IAAiB,kBACjBC,IAAe,gBACfC,IAAgB,iBAChBC,IAAkB,mBAClBC,IAAkB,mBAClBC,IAAoB,qBACpBC,IAAiB,kBACjBC,IAAe,gBACfC,IAAkB,mBAClBC,IAAkB,mBAClBC,IAAgB,iBAChBC,IAAe,gBAYRC,IAAkC,CAAC;AAAA,EAC9C,UAAAC;AAAA,EACA,KAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,UAAAC,IAAW;AAAA,EACX,OAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,GAAGC;AACL,MAAM;AACJ,QAAMC,IAAYC,EAAA,GAEZC,IAAkB;AAAA,IACtB,KAAKvB;AAAA,IACL,QAAQC;AAAA,IACR,MAAMC;AAAA,IACN,OAAOC;AAAA,EAAA,GAGHqB,IAAeN,IACjB;AAAA,IACE,SAASd;AAAA,IACT,SAASC;AAAA,IACT,WAAWC;AAAA,IACX,QAAQC;AAAA,IACR,MAAMC;AAAA,IACN,SAASC;AAAA,IACT,SAASC;AAAA,IACT,OAAOC;AAAA,EAAA,EACPO,CAAK,IACP,QAEEO,IAAU;AAAA,IACd1B;AAAA,IACAwB,EAAgBN,CAAQ;AAAA,IACxBO;AAAA,IACAL,KAAQP;AAAA,IACRI;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,GAGLU,IAAgBC,EAAM,eAAeb,CAAQ,KAC9C,MAAM;AACL,UAAMc,IAAuBd,EAAS,MAA0C,kBAAkB,GAC5Fe,IAAoBD,IAAsB,GAAGA,CAAmB,IAAIP,CAAS,KAAKA;AACxF,WAAOM,EAAM,aAAab,GAAiE;AAAA,MACzF,oBAAoBe;AAAA,IAAA,CACrB;AAAA,EACH,OACAf;AAEJ,SACE,gBAAAgB,EAAC,OAAA,EAAI,WAAWL,GAAS,YAAUV,GAAK,cAAYI,IAAO,SAAS,UAAW,GAAGC,GAC/E,UAAA;AAAA,IAAAM;AAAA,IAED,gBAAAK,EAAC,UAAK,IAAIV,GAAW,MAAK,WAAU,WAAU,WAC3C,UAAAN,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;"}
|