@vritti/quantum-ui 0.2.7 → 0.2.9
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/README.md +7 -7
- package/dist/Alert.js +110 -0
- package/dist/Alert.js.map +1 -0
- package/dist/Avatar.js +219 -0
- package/dist/Avatar.js.map +1 -0
- package/dist/Badge.js +32 -0
- package/dist/Badge.js.map +1 -0
- package/dist/Button2.js +2 -2
- package/dist/Chart.js +19003 -0
- package/dist/Chart.js.map +1 -0
- package/dist/Checkbox.js +6 -26
- package/dist/Checkbox.js.map +1 -1
- package/dist/Combination.js +3856 -0
- package/dist/Combination.js.map +1 -0
- package/dist/DatePicker.js +15 -3886
- package/dist/DatePicker.js.map +1 -1
- package/dist/DropdownMenu.js +1522 -0
- package/dist/DropdownMenu.js.map +1 -0
- package/dist/Form.js +34 -23
- package/dist/Form.js.map +1 -1
- package/dist/Label.js +1 -1
- package/dist/OTPField.js +16 -5
- package/dist/OTPField.js.map +1 -1
- package/dist/PhoneField.js +14 -6
- package/dist/PhoneField.js.map +1 -1
- package/dist/Progress.js +116 -0
- package/dist/Progress.js.map +1 -0
- package/dist/SelectField.js +1351 -0
- package/dist/SelectField.js.map +1 -0
- package/dist/Separator.js +6 -0
- package/dist/Separator.js.map +1 -0
- package/dist/Sonner.js +3 -38
- package/dist/Sonner.js.map +1 -1
- package/dist/Spinner.js +1 -9
- package/dist/Spinner.js.map +1 -1
- package/dist/Switch.js +210 -0
- package/dist/Switch.js.map +1 -0
- package/dist/ThemeContext.js +57 -0
- package/dist/ThemeContext.js.map +1 -0
- package/dist/ThemeToggle.js +4 -15
- package/dist/ThemeToggle.js.map +1 -1
- package/dist/Toggle.js +69 -0
- package/dist/Toggle.js.map +1 -0
- package/dist/_commonjsHelpers.js +6 -0
- package/dist/_commonjsHelpers.js.map +1 -0
- package/dist/assets/quantum-ui.css +18 -0
- package/dist/axios.js.map +1 -1
- package/dist/check.js +15 -0
- package/dist/check.js.map +1 -0
- package/dist/chevron-down.js +15 -0
- package/dist/chevron-down.js.map +1 -0
- package/dist/chevron-right.js +15 -0
- package/dist/chevron-right.js.map +1 -0
- package/dist/components/Alert.js +2 -0
- package/dist/components/Alert.js.map +1 -0
- package/dist/components/Avatar.js +2 -0
- package/dist/components/Avatar.js.map +1 -0
- package/dist/components/Badge.js +2 -0
- package/dist/components/Badge.js.map +1 -0
- package/dist/components/Chart.js +2 -0
- package/dist/components/Chart.js.map +1 -0
- package/dist/components/DropdownMenu.js +2 -0
- package/dist/components/DropdownMenu.js.map +1 -0
- package/dist/components/Progress.js +1 -174
- package/dist/components/Progress.js.map +1 -1
- package/dist/components/SelectField.js +2 -0
- package/dist/components/SelectField.js.map +1 -0
- package/dist/components/Separator.js +2 -0
- package/dist/components/Separator.js.map +1 -0
- package/dist/components/Switch.js +2 -0
- package/dist/components/Switch.js.map +1 -0
- package/dist/components/Toggle.js +2 -0
- package/dist/components/Toggle.js.map +1 -0
- package/dist/context/index.js +2 -0
- package/dist/context/index.js.map +1 -0
- package/dist/field.js +2 -49
- package/dist/field.js.map +1 -1
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/index10.js +105 -0
- package/dist/index10.js.map +1 -0
- package/dist/index11.js +79 -0
- package/dist/index11.js.map +1 -0
- package/dist/index12.js +101 -0
- package/dist/index12.js.map +1 -0
- package/dist/index13.js +205 -0
- package/dist/index13.js.map +1 -0
- package/dist/index14.js +199 -0
- package/dist/index14.js.map +1 -0
- package/dist/index2.js +55 -130
- package/dist/index2.js.map +1 -1
- package/dist/index3.js +10 -42
- package/dist/index3.js.map +1 -1
- package/dist/index4.js +125 -35
- package/dist/index4.js.map +1 -1
- package/dist/index5.js +26 -414
- package/dist/index5.js.map +1 -1
- package/dist/index6.js +8 -0
- package/dist/index6.js.map +1 -0
- package/dist/index7.js +16 -0
- package/dist/index7.js.map +1 -0
- package/dist/index8.js +45 -0
- package/dist/index8.js.map +1 -0
- package/dist/index9.js +41 -0
- package/dist/index9.js.map +1 -0
- package/dist/lib/components/Alert/Alert.d.ts +10 -0
- package/dist/lib/components/Alert/Alert.d.ts.map +1 -0
- package/dist/lib/components/Alert/index.d.ts +2 -0
- package/dist/lib/components/Alert/index.d.ts.map +1 -0
- package/dist/lib/components/Avatar/Avatar.d.ts +8 -0
- package/dist/lib/components/Avatar/Avatar.d.ts.map +1 -0
- package/dist/lib/components/Avatar/index.d.ts +2 -0
- package/dist/lib/components/Avatar/index.d.ts.map +1 -0
- package/dist/lib/components/Badge/Badge.d.ts +5 -0
- package/dist/lib/components/Badge/Badge.d.ts.map +1 -0
- package/dist/lib/components/Badge/index.d.ts +3 -0
- package/dist/lib/components/Badge/index.d.ts.map +1 -0
- package/dist/lib/components/Button/index.d.ts +1 -1
- package/dist/lib/components/Button/index.d.ts.map +1 -1
- package/dist/lib/components/Chart/Chart.d.ts +13 -0
- package/dist/lib/components/Chart/Chart.d.ts.map +1 -0
- package/dist/lib/components/Chart/index.d.ts +3 -0
- package/dist/lib/components/Chart/index.d.ts.map +1 -0
- package/dist/lib/components/DropdownMenu/DropdownMenu.d.ts +28 -0
- package/dist/lib/components/DropdownMenu/DropdownMenu.d.ts.map +1 -0
- package/dist/lib/components/DropdownMenu/index.d.ts +3 -0
- package/dist/lib/components/DropdownMenu/index.d.ts.map +1 -0
- package/dist/lib/components/DropdownMenu/types.d.ts +72 -0
- package/dist/lib/components/DropdownMenu/types.d.ts.map +1 -0
- package/dist/lib/components/Form/Form.d.ts +1 -1
- package/dist/lib/components/Form/Form.d.ts.map +1 -1
- package/dist/lib/components/OTPField/OTPField.d.ts.map +1 -1
- package/dist/lib/components/PhoneField/PhoneField.d.ts.map +1 -1
- package/dist/lib/components/SelectField/SelectField.d.ts +24 -0
- package/dist/lib/components/SelectField/SelectField.d.ts.map +1 -0
- package/dist/lib/components/SelectField/index.d.ts +3 -0
- package/dist/lib/components/SelectField/index.d.ts.map +1 -0
- package/dist/lib/components/Separator/Separator.d.ts +3 -0
- package/dist/lib/components/Separator/Separator.d.ts.map +1 -0
- package/dist/lib/components/Separator/index.d.ts +2 -0
- package/dist/lib/components/Separator/index.d.ts.map +1 -0
- package/dist/lib/components/Switch/Switch.d.ts +9 -0
- package/dist/lib/components/Switch/Switch.d.ts.map +1 -0
- package/dist/lib/components/Switch/index.d.ts +3 -0
- package/dist/lib/components/Switch/index.d.ts.map +1 -0
- package/dist/lib/components/ThemeToggle/ThemeToggle.d.ts.map +1 -1
- package/dist/lib/components/Toggle/Toggle.d.ts +7 -0
- package/dist/lib/components/Toggle/Toggle.d.ts.map +1 -0
- package/dist/lib/components/Toggle/index.d.ts +2 -0
- package/dist/lib/components/Toggle/index.d.ts.map +1 -0
- package/dist/lib/components/index.d.ts +10 -0
- package/dist/lib/components/index.d.ts.map +1 -1
- package/dist/lib/context/ThemeContext.d.ts +18 -0
- package/dist/lib/context/ThemeContext.d.ts.map +1 -0
- package/dist/lib/context/index.d.ts +2 -0
- package/dist/lib/context/index.d.ts.map +1 -0
- package/dist/lib/hooks/index.d.ts +2 -0
- package/dist/lib/hooks/index.d.ts.map +1 -0
- package/dist/lib/hooks/useTheme.d.ts +8 -0
- package/dist/lib/hooks/useTheme.d.ts.map +1 -0
- package/dist/lib/index.d.ts +2 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/theme/index.d.ts +13 -0
- package/dist/lib/theme/index.d.ts.map +1 -0
- package/dist/lib/utils/axios.d.ts +1 -0
- package/dist/lib/utils/axios.d.ts.map +1 -1
- package/dist/lib/utils/formHelpers.d.ts +7 -3
- package/dist/lib/utils/formHelpers.d.ts.map +1 -1
- package/dist/separator2.js +53 -0
- package/dist/separator2.js.map +1 -0
- package/dist/shadcn/index.d.ts +1 -1
- package/dist/shadcn/index.d.ts.map +1 -1
- package/dist/shadcn/shadcnAlert/alert.d.ts +11 -0
- package/dist/shadcn/shadcnAlert/alert.d.ts.map +1 -0
- package/dist/shadcn/shadcnAlert/index.d.ts +2 -0
- package/dist/shadcn/shadcnAlert/index.d.ts.map +1 -0
- package/dist/shadcn/shadcnAvatar/Avatar.d.ts +12 -0
- package/dist/shadcn/shadcnAvatar/Avatar.d.ts.map +1 -0
- package/dist/shadcn/shadcnAvatar/index.d.ts +2 -0
- package/dist/shadcn/shadcnAvatar/index.d.ts.map +1 -0
- package/dist/shadcn/shadcnBadge/Badge.d.ts +11 -0
- package/dist/shadcn/shadcnBadge/Badge.d.ts.map +1 -0
- package/dist/shadcn/shadcnBadge/index.d.ts +3 -0
- package/dist/shadcn/shadcnBadge/index.d.ts.map +1 -0
- package/dist/shadcn/shadcnButton/Button.d.ts +2 -2
- package/dist/shadcn/shadcnChart/Chart.d.ts +58 -0
- package/dist/shadcn/shadcnChart/Chart.d.ts.map +1 -0
- package/dist/shadcn/shadcnChart/index.d.ts +3 -0
- package/dist/shadcn/shadcnChart/index.d.ts.map +1 -0
- package/dist/shadcn/shadcnSpinner/Spinner.d.ts.map +1 -1
- package/dist/shadcn/shadcnSwitch/Switch.d.ts +7 -0
- package/dist/shadcn/shadcnSwitch/Switch.d.ts.map +1 -0
- package/dist/shadcn/shadcnSwitch/index.d.ts +2 -0
- package/dist/shadcn/shadcnSwitch/index.d.ts.map +1 -0
- package/dist/shadcn/shadcnToggle/Toggle.d.ts +10 -0
- package/dist/shadcn/shadcnToggle/Toggle.d.ts.map +1 -0
- package/dist/shadcn/shadcnToggle/index.d.ts +2 -0
- package/dist/shadcn/shadcnToggle/index.d.ts.map +1 -0
- package/dist/theme/index.js +11 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/triangle-alert.js +40 -0
- package/dist/triangle-alert.js.map +1 -0
- package/dist/useTheme.js +15 -0
- package/dist/useTheme.js.map +1 -0
- package/package.json +59 -6
package/dist/Spinner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Spinner.js","sources":["../shadcn/shadcnSpinner/Spinner.tsx","../lib/components/Spinner/Spinner.tsx"],"sourcesContent":["import { Loader2Icon } from 'lucide-react';\n\nimport { cn } from '../utils';\n\nfunction Spinner({ className, ...props }: React.ComponentProps<'svg'>) {\n return
|
|
1
|
+
{"version":3,"file":"Spinner.js","sources":["../shadcn/shadcnSpinner/Spinner.tsx","../lib/components/Spinner/Spinner.tsx"],"sourcesContent":["import { Loader2Icon } from 'lucide-react';\n\nimport { cn } from '../utils';\n\nfunction Spinner({ className, ...props }: React.ComponentProps<'svg'>) {\n return <Loader2Icon role=\"status\" aria-label=\"Loading\" className={cn('size-4 animate-spin', className)} {...props} />;\n}\n\nexport { Spinner };\n","// Spinner molecule - wrapper around shadcn Spinner\nimport { Spinner as ShadcnSpinner } from '../../../shadcn/shadcnSpinner';\n\nexport const Spinner = ShadcnSpinner;\n"],"names":["Spinner","Loader2Icon","ShadcnSpinner"],"mappings":";;;;AAIA,SAASA,SAAA,CAAQ,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACrE,EAAA,uBAAO,GAAA,CAACC,YAAA,EAAA,EAAY,IAAA,EAAK,QAAA,EAAS,YAAA,EAAW,SAAA,EAAU,SAAA,EAAW,EAAA,CAAG,qBAAA,EAAuB,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO,CAAA;AACrH;;ACHO,MAAM,OAAA,GAAUC;;;;"}
|
package/dist/Switch.js
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import React__default from 'react';
|
|
4
|
+
import { F as Field, a as FieldContent, e as FieldLabel, b as FieldDescription, c as FieldError } from './field.js';
|
|
5
|
+
import { u as useControllableState, P as Primitive, a as composeEventHandlers } from './index13.js';
|
|
6
|
+
import { u as useComposedRefs } from './index5.js';
|
|
7
|
+
import { c as createContextScope, u as useSize } from './index12.js';
|
|
8
|
+
import { u as usePrevious } from './index7.js';
|
|
9
|
+
import { c as cn } from './utils.js';
|
|
10
|
+
|
|
11
|
+
var SWITCH_NAME = "Switch";
|
|
12
|
+
var [createSwitchContext] = createContextScope(SWITCH_NAME);
|
|
13
|
+
var [SwitchProvider, useSwitchContext] = createSwitchContext(SWITCH_NAME);
|
|
14
|
+
var Switch$2 = React.forwardRef(
|
|
15
|
+
(props, forwardedRef) => {
|
|
16
|
+
const {
|
|
17
|
+
__scopeSwitch,
|
|
18
|
+
name,
|
|
19
|
+
checked: checkedProp,
|
|
20
|
+
defaultChecked,
|
|
21
|
+
required,
|
|
22
|
+
disabled,
|
|
23
|
+
value = "on",
|
|
24
|
+
onCheckedChange,
|
|
25
|
+
form,
|
|
26
|
+
...switchProps
|
|
27
|
+
} = props;
|
|
28
|
+
const [button, setButton] = React.useState(null);
|
|
29
|
+
const composedRefs = useComposedRefs(forwardedRef, (node) => setButton(node));
|
|
30
|
+
const hasConsumerStoppedPropagationRef = React.useRef(false);
|
|
31
|
+
const isFormControl = button ? form || !!button.closest("form") : true;
|
|
32
|
+
const [checked, setChecked] = useControllableState({
|
|
33
|
+
prop: checkedProp,
|
|
34
|
+
defaultProp: defaultChecked ?? false,
|
|
35
|
+
onChange: onCheckedChange,
|
|
36
|
+
caller: SWITCH_NAME
|
|
37
|
+
});
|
|
38
|
+
return /* @__PURE__ */ jsxs(SwitchProvider, { scope: __scopeSwitch, checked, disabled, children: [
|
|
39
|
+
/* @__PURE__ */ jsx(
|
|
40
|
+
Primitive.button,
|
|
41
|
+
{
|
|
42
|
+
type: "button",
|
|
43
|
+
role: "switch",
|
|
44
|
+
"aria-checked": checked,
|
|
45
|
+
"aria-required": required,
|
|
46
|
+
"data-state": getState(checked),
|
|
47
|
+
"data-disabled": disabled ? "" : void 0,
|
|
48
|
+
disabled,
|
|
49
|
+
value,
|
|
50
|
+
...switchProps,
|
|
51
|
+
ref: composedRefs,
|
|
52
|
+
onClick: composeEventHandlers(props.onClick, (event) => {
|
|
53
|
+
setChecked((prevChecked) => !prevChecked);
|
|
54
|
+
if (isFormControl) {
|
|
55
|
+
hasConsumerStoppedPropagationRef.current = event.isPropagationStopped();
|
|
56
|
+
if (!hasConsumerStoppedPropagationRef.current) event.stopPropagation();
|
|
57
|
+
}
|
|
58
|
+
})
|
|
59
|
+
}
|
|
60
|
+
),
|
|
61
|
+
isFormControl && /* @__PURE__ */ jsx(
|
|
62
|
+
SwitchBubbleInput,
|
|
63
|
+
{
|
|
64
|
+
control: button,
|
|
65
|
+
bubbles: !hasConsumerStoppedPropagationRef.current,
|
|
66
|
+
name,
|
|
67
|
+
value,
|
|
68
|
+
checked,
|
|
69
|
+
required,
|
|
70
|
+
disabled,
|
|
71
|
+
form,
|
|
72
|
+
style: { transform: "translateX(-100%)" }
|
|
73
|
+
}
|
|
74
|
+
)
|
|
75
|
+
] });
|
|
76
|
+
}
|
|
77
|
+
);
|
|
78
|
+
Switch$2.displayName = SWITCH_NAME;
|
|
79
|
+
var THUMB_NAME = "SwitchThumb";
|
|
80
|
+
var SwitchThumb = React.forwardRef(
|
|
81
|
+
(props, forwardedRef) => {
|
|
82
|
+
const { __scopeSwitch, ...thumbProps } = props;
|
|
83
|
+
const context = useSwitchContext(THUMB_NAME, __scopeSwitch);
|
|
84
|
+
return /* @__PURE__ */ jsx(
|
|
85
|
+
Primitive.span,
|
|
86
|
+
{
|
|
87
|
+
"data-state": getState(context.checked),
|
|
88
|
+
"data-disabled": context.disabled ? "" : void 0,
|
|
89
|
+
...thumbProps,
|
|
90
|
+
ref: forwardedRef
|
|
91
|
+
}
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
);
|
|
95
|
+
SwitchThumb.displayName = THUMB_NAME;
|
|
96
|
+
var BUBBLE_INPUT_NAME = "SwitchBubbleInput";
|
|
97
|
+
var SwitchBubbleInput = React.forwardRef(
|
|
98
|
+
({
|
|
99
|
+
__scopeSwitch,
|
|
100
|
+
control,
|
|
101
|
+
checked,
|
|
102
|
+
bubbles = true,
|
|
103
|
+
...props
|
|
104
|
+
}, forwardedRef) => {
|
|
105
|
+
const ref = React.useRef(null);
|
|
106
|
+
const composedRefs = useComposedRefs(ref, forwardedRef);
|
|
107
|
+
const prevChecked = usePrevious(checked);
|
|
108
|
+
const controlSize = useSize(control);
|
|
109
|
+
React.useEffect(() => {
|
|
110
|
+
const input = ref.current;
|
|
111
|
+
if (!input) return;
|
|
112
|
+
const inputProto = window.HTMLInputElement.prototype;
|
|
113
|
+
const descriptor = Object.getOwnPropertyDescriptor(
|
|
114
|
+
inputProto,
|
|
115
|
+
"checked"
|
|
116
|
+
);
|
|
117
|
+
const setChecked = descriptor.set;
|
|
118
|
+
if (prevChecked !== checked && setChecked) {
|
|
119
|
+
const event = new Event("click", { bubbles });
|
|
120
|
+
setChecked.call(input, checked);
|
|
121
|
+
input.dispatchEvent(event);
|
|
122
|
+
}
|
|
123
|
+
}, [prevChecked, checked, bubbles]);
|
|
124
|
+
return /* @__PURE__ */ jsx(
|
|
125
|
+
"input",
|
|
126
|
+
{
|
|
127
|
+
type: "checkbox",
|
|
128
|
+
"aria-hidden": true,
|
|
129
|
+
defaultChecked: checked,
|
|
130
|
+
...props,
|
|
131
|
+
tabIndex: -1,
|
|
132
|
+
ref: composedRefs,
|
|
133
|
+
style: {
|
|
134
|
+
...props.style,
|
|
135
|
+
...controlSize,
|
|
136
|
+
position: "absolute",
|
|
137
|
+
pointerEvents: "none",
|
|
138
|
+
opacity: 0,
|
|
139
|
+
margin: 0
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
);
|
|
145
|
+
SwitchBubbleInput.displayName = BUBBLE_INPUT_NAME;
|
|
146
|
+
function getState(checked) {
|
|
147
|
+
return checked ? "checked" : "unchecked";
|
|
148
|
+
}
|
|
149
|
+
var Root = Switch$2;
|
|
150
|
+
var Thumb = SwitchThumb;
|
|
151
|
+
|
|
152
|
+
function Switch$1({
|
|
153
|
+
className,
|
|
154
|
+
size = "default",
|
|
155
|
+
...props
|
|
156
|
+
}) {
|
|
157
|
+
return /* @__PURE__ */ jsx(
|
|
158
|
+
Root,
|
|
159
|
+
{
|
|
160
|
+
"data-slot": "switch",
|
|
161
|
+
"data-size": size,
|
|
162
|
+
className: cn(
|
|
163
|
+
"peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 group/switch inline-flex shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-[1.15rem] data-[size=default]:w-8 data-[size=sm]:h-3.5 data-[size=sm]:w-6",
|
|
164
|
+
className
|
|
165
|
+
),
|
|
166
|
+
...props,
|
|
167
|
+
children: /* @__PURE__ */ jsx(
|
|
168
|
+
Thumb,
|
|
169
|
+
{
|
|
170
|
+
"data-slot": "switch-thumb",
|
|
171
|
+
className: cn(
|
|
172
|
+
"bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground pointer-events-none block rounded-full ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0"
|
|
173
|
+
)
|
|
174
|
+
}
|
|
175
|
+
)
|
|
176
|
+
}
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
const Switch = React__default.forwardRef(
|
|
181
|
+
({ label, description, error, id, ...props }, ref) => {
|
|
182
|
+
const generatedId = React__default.useId();
|
|
183
|
+
const fieldId = id || generatedId;
|
|
184
|
+
const hasError = !!error;
|
|
185
|
+
if (!label && !description && !error) {
|
|
186
|
+
return /* @__PURE__ */ jsx(Switch$1, { ...props, ref, id: fieldId });
|
|
187
|
+
}
|
|
188
|
+
return /* @__PURE__ */ jsxs(Field, { orientation: "horizontal", "data-disabled": props.disabled, "data-invalid": hasError, children: [
|
|
189
|
+
/* @__PURE__ */ jsx(
|
|
190
|
+
Switch$1,
|
|
191
|
+
{
|
|
192
|
+
...props,
|
|
193
|
+
ref,
|
|
194
|
+
id: fieldId,
|
|
195
|
+
"aria-describedby": description || error ? `${fieldId}-description ${fieldId}-error` : void 0,
|
|
196
|
+
"aria-invalid": hasError
|
|
197
|
+
}
|
|
198
|
+
),
|
|
199
|
+
/* @__PURE__ */ jsxs(FieldContent, { children: [
|
|
200
|
+
label && /* @__PURE__ */ jsx(FieldLabel, { htmlFor: fieldId, className: "font-normal cursor-pointer", children: label }),
|
|
201
|
+
description && /* @__PURE__ */ jsx(FieldDescription, { id: `${fieldId}-description`, children: description }),
|
|
202
|
+
error && /* @__PURE__ */ jsx(FieldError, { id: `${fieldId}-error`, children: error })
|
|
203
|
+
] })
|
|
204
|
+
] });
|
|
205
|
+
}
|
|
206
|
+
);
|
|
207
|
+
Switch.displayName = "Switch";
|
|
208
|
+
|
|
209
|
+
export { Switch as S };
|
|
210
|
+
//# sourceMappingURL=Switch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Switch.js","sources":["../node_modules/.pnpm/@radix-ui+react-switch@1.2.6_@types+react-dom@19.2.3_@types+react@19.2.9__@types+react@_1bb10c0b052fb9beb92b3363daed7bfd/node_modules/@radix-ui/react-switch/dist/index.mjs","../shadcn/shadcnSwitch/Switch.tsx","../lib/components/Switch/Switch.tsx"],"sourcesContent":["\"use client\";\n\n// src/switch.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { usePrevious } from \"@radix-ui/react-use-previous\";\nimport { useSize } from \"@radix-ui/react-use-size\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nvar SWITCH_NAME = \"Switch\";\nvar [createSwitchContext, createSwitchScope] = createContextScope(SWITCH_NAME);\nvar [SwitchProvider, useSwitchContext] = createSwitchContext(SWITCH_NAME);\nvar Switch = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeSwitch,\n name,\n checked: checkedProp,\n defaultChecked,\n required,\n disabled,\n value = \"on\",\n onCheckedChange,\n form,\n ...switchProps\n } = props;\n const [button, setButton] = React.useState(null);\n const composedRefs = useComposedRefs(forwardedRef, (node) => setButton(node));\n const hasConsumerStoppedPropagationRef = React.useRef(false);\n const isFormControl = button ? form || !!button.closest(\"form\") : true;\n const [checked, setChecked] = useControllableState({\n prop: checkedProp,\n defaultProp: defaultChecked ?? false,\n onChange: onCheckedChange,\n caller: SWITCH_NAME\n });\n return /* @__PURE__ */ jsxs(SwitchProvider, { scope: __scopeSwitch, checked, disabled, children: [\n /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n role: \"switch\",\n \"aria-checked\": checked,\n \"aria-required\": required,\n \"data-state\": getState(checked),\n \"data-disabled\": disabled ? \"\" : void 0,\n disabled,\n value,\n ...switchProps,\n ref: composedRefs,\n onClick: composeEventHandlers(props.onClick, (event) => {\n setChecked((prevChecked) => !prevChecked);\n if (isFormControl) {\n hasConsumerStoppedPropagationRef.current = event.isPropagationStopped();\n if (!hasConsumerStoppedPropagationRef.current) event.stopPropagation();\n }\n })\n }\n ),\n isFormControl && /* @__PURE__ */ jsx(\n SwitchBubbleInput,\n {\n control: button,\n bubbles: !hasConsumerStoppedPropagationRef.current,\n name,\n value,\n checked,\n required,\n disabled,\n form,\n style: { transform: \"translateX(-100%)\" }\n }\n )\n ] });\n }\n);\nSwitch.displayName = SWITCH_NAME;\nvar THUMB_NAME = \"SwitchThumb\";\nvar SwitchThumb = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeSwitch, ...thumbProps } = props;\n const context = useSwitchContext(THUMB_NAME, __scopeSwitch);\n return /* @__PURE__ */ jsx(\n Primitive.span,\n {\n \"data-state\": getState(context.checked),\n \"data-disabled\": context.disabled ? \"\" : void 0,\n ...thumbProps,\n ref: forwardedRef\n }\n );\n }\n);\nSwitchThumb.displayName = THUMB_NAME;\nvar BUBBLE_INPUT_NAME = \"SwitchBubbleInput\";\nvar SwitchBubbleInput = React.forwardRef(\n ({\n __scopeSwitch,\n control,\n checked,\n bubbles = true,\n ...props\n }, forwardedRef) => {\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(ref, forwardedRef);\n const prevChecked = usePrevious(checked);\n const controlSize = useSize(control);\n React.useEffect(() => {\n const input = ref.current;\n if (!input) return;\n const inputProto = window.HTMLInputElement.prototype;\n const descriptor = Object.getOwnPropertyDescriptor(\n inputProto,\n \"checked\"\n );\n const setChecked = descriptor.set;\n if (prevChecked !== checked && setChecked) {\n const event = new Event(\"click\", { bubbles });\n setChecked.call(input, checked);\n input.dispatchEvent(event);\n }\n }, [prevChecked, checked, bubbles]);\n return /* @__PURE__ */ jsx(\n \"input\",\n {\n type: \"checkbox\",\n \"aria-hidden\": true,\n defaultChecked: checked,\n ...props,\n tabIndex: -1,\n ref: composedRefs,\n style: {\n ...props.style,\n ...controlSize,\n position: \"absolute\",\n pointerEvents: \"none\",\n opacity: 0,\n margin: 0\n }\n }\n );\n }\n);\nSwitchBubbleInput.displayName = BUBBLE_INPUT_NAME;\nfunction getState(checked) {\n return checked ? \"checked\" : \"unchecked\";\n}\nvar Root = Switch;\nvar Thumb = SwitchThumb;\nexport {\n Root,\n Switch,\n SwitchThumb,\n Thumb,\n createSwitchScope\n};\n//# sourceMappingURL=index.mjs.map\n","'use client';\n\nimport * as SwitchPrimitive from '@radix-ui/react-switch';\nimport type * as React from 'react';\n\nimport { cn } from '../utils';\n\nfunction Switch({\n className,\n size = 'default',\n ...props\n}: React.ComponentProps<typeof SwitchPrimitive.Root> & {\n size?: 'sm' | 'default';\n}) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n data-size={size}\n className={cn(\n 'peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 group/switch inline-flex shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-[1.15rem] data-[size=default]:w-8 data-[size=sm]:h-3.5 data-[size=sm]:w-6',\n className,\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className={cn(\n 'bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground pointer-events-none block rounded-full ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0',\n )}\n />\n </SwitchPrimitive.Root>\n );\n}\n\nexport { Switch };\n","import React from 'react';\nimport { Field, FieldContent, FieldDescription, FieldError, FieldLabel } from '../../../shadcn/shadcnField';\nimport { Switch as ShadcnSwitch } from '../../../shadcn/shadcnSwitch';\n\nexport interface SwitchProps extends React.ComponentPropsWithoutRef<typeof ShadcnSwitch> {\n /**\n * Label for the switch\n */\n label?: React.ReactNode;\n\n /**\n * Helper text or description to display below the switch\n */\n description?: React.ReactNode;\n\n /**\n * Error message to display below the switch\n */\n error?: string;\n}\n\n/**\n * Switch component for toggling between two states (on/off).\n *\n * Can be used as a bare component or with label, description, and error support\n * for form integration.\n *\n * @example\n * ```tsx\n * // Bare usage\n * <Switch />\n * <Switch size=\"sm\" />\n * <Switch defaultChecked />\n * <Switch disabled />\n *\n * // With Field system (form usage)\n * <Switch\n * label=\"Enable notifications\"\n * description=\"Receive email updates\"\n * />\n *\n * // In a Form component\n * <Form form={form} onSubmit={handleSubmit}>\n * <Switch\n * name=\"marketing\"\n * label=\"Marketing emails\"\n * description=\"Receive promotional content\"\n * />\n * </Form>\n * ```\n */\nexport const Switch = React.forwardRef<React.ElementRef<typeof ShadcnSwitch>, SwitchProps>(\n ({ label, description, error, id, ...props }, ref) => {\n const generatedId = React.useId();\n const fieldId = id || generatedId;\n const hasError = !!error;\n\n // If no label or description, just return the base switch\n if (!label && !description && !error) {\n return <ShadcnSwitch {...props} ref={ref} id={fieldId} />;\n }\n\n return (\n <Field orientation=\"horizontal\" data-disabled={props.disabled} data-invalid={hasError}>\n <ShadcnSwitch\n {...props}\n ref={ref}\n id={fieldId}\n aria-describedby={description || error ? `${fieldId}-description ${fieldId}-error` : undefined}\n aria-invalid={hasError}\n />\n <FieldContent>\n {label && (\n <FieldLabel htmlFor={fieldId} className=\"font-normal cursor-pointer\">\n {label}\n </FieldLabel>\n )}\n\n {description && <FieldDescription id={`${fieldId}-description`}>{description}</FieldDescription>}\n\n {error && <FieldError id={`${fieldId}-error`}>{error}</FieldError>}\n </FieldContent>\n </Field>\n );\n },\n);\n\nSwitch.displayName = 'Switch';\n"],"names":["Switch","SwitchPrimitive.Root","SwitchPrimitive.Thumb","React","ShadcnSwitch"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { createContext, useState, useLayoutEffect, useCallback, useMemo } from 'react';
|
|
3
|
+
|
|
4
|
+
const THEME_STORAGE_KEY = "theme";
|
|
5
|
+
const ThemeContext = createContext(null);
|
|
6
|
+
ThemeContext.displayName = "ThemeContext";
|
|
7
|
+
function getInitialTheme(storageKey, defaultTheme) {
|
|
8
|
+
if (typeof window !== "undefined") {
|
|
9
|
+
const savedTheme = localStorage.getItem(storageKey);
|
|
10
|
+
if (savedTheme === "dark" || savedTheme === "light") {
|
|
11
|
+
return savedTheme;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
if (defaultTheme) {
|
|
15
|
+
return defaultTheme;
|
|
16
|
+
}
|
|
17
|
+
if (typeof window !== "undefined") {
|
|
18
|
+
const systemPrefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
19
|
+
return systemPrefersDark ? "dark" : "light";
|
|
20
|
+
}
|
|
21
|
+
return "light";
|
|
22
|
+
}
|
|
23
|
+
function ThemeProvider({
|
|
24
|
+
children,
|
|
25
|
+
defaultTheme,
|
|
26
|
+
storageKey = THEME_STORAGE_KEY
|
|
27
|
+
}) {
|
|
28
|
+
const [theme, setThemeState] = useState(
|
|
29
|
+
() => getInitialTheme(storageKey, defaultTheme)
|
|
30
|
+
);
|
|
31
|
+
useLayoutEffect(() => {
|
|
32
|
+
const isDark = theme === "dark";
|
|
33
|
+
document.documentElement.classList.toggle("dark", isDark);
|
|
34
|
+
}, [theme]);
|
|
35
|
+
useLayoutEffect(() => {
|
|
36
|
+
localStorage.setItem(storageKey, theme);
|
|
37
|
+
}, [theme, storageKey]);
|
|
38
|
+
const setTheme = useCallback((newTheme) => {
|
|
39
|
+
setThemeState(newTheme);
|
|
40
|
+
}, []);
|
|
41
|
+
const toggleTheme = useCallback(() => {
|
|
42
|
+
setThemeState((currentTheme) => currentTheme === "dark" ? "light" : "dark");
|
|
43
|
+
}, []);
|
|
44
|
+
const value = useMemo(
|
|
45
|
+
() => ({
|
|
46
|
+
theme,
|
|
47
|
+
toggleTheme,
|
|
48
|
+
setTheme
|
|
49
|
+
}),
|
|
50
|
+
[theme, toggleTheme, setTheme]
|
|
51
|
+
);
|
|
52
|
+
return /* @__PURE__ */ jsx(ThemeContext.Provider, { value, children });
|
|
53
|
+
}
|
|
54
|
+
ThemeProvider.displayName = "ThemeProvider";
|
|
55
|
+
|
|
56
|
+
export { ThemeContext as T, ThemeProvider as a };
|
|
57
|
+
//# sourceMappingURL=ThemeContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThemeContext.js","sources":["../lib/context/ThemeContext.tsx"],"sourcesContent":["import {\n createContext,\n useCallback,\n useLayoutEffect,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\n\n/**\n * Theme mode type - either 'light' or 'dark'\n */\nexport type ThemeMode = 'light' | 'dark';\n\n/**\n * Shape of the theme context value\n */\nexport interface ThemeContextValue {\n /** Current theme mode ('light' or 'dark') */\n theme: ThemeMode;\n /** Function to toggle between light and dark themes */\n toggleTheme: () => void;\n /** Function to set a specific theme */\n setTheme: (theme: ThemeMode) => void;\n}\n\n/**\n * Props for the ThemeProvider component\n */\nexport interface ThemeProviderProps {\n /** Child components that will have access to the theme context */\n children: ReactNode;\n /** Optional initial theme (defaults to system preference or localStorage) */\n defaultTheme?: ThemeMode;\n /** localStorage key for persisting theme preference */\n storageKey?: string;\n}\n\nconst THEME_STORAGE_KEY = 'theme';\n\n/**\n * Theme context for sharing theme state across components.\n * Use the useTheme hook to access this context.\n */\nexport const ThemeContext = createContext<ThemeContextValue | null>(null);\n\nThemeContext.displayName = 'ThemeContext';\n\n/**\n * Determines the initial theme based on localStorage and system preferences.\n * @param storageKey - The localStorage key to check for saved theme\n * @param defaultTheme - Optional default theme to use if no preference is found\n * @returns The determined initial theme\n */\nfunction getInitialTheme(storageKey: string, defaultTheme?: ThemeMode): ThemeMode {\n // Check for saved theme in localStorage\n if (typeof window !== 'undefined') {\n const savedTheme = localStorage.getItem(storageKey);\n if (savedTheme === 'dark' || savedTheme === 'light') {\n return savedTheme;\n }\n }\n\n // Use default theme if provided\n if (defaultTheme) {\n return defaultTheme;\n }\n\n // Fall back to system preference\n if (typeof window !== 'undefined') {\n const systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n return systemPrefersDark ? 'dark' : 'light';\n }\n\n // Ultimate fallback\n return 'light';\n}\n\n/**\n * ThemeProvider component that manages theme state and provides it to the component tree.\n *\n * Features:\n * - Single source of truth for theme state\n * - Persists theme preference to localStorage\n * - Detects system color scheme preference on initial load\n * - Toggles the 'dark' class on document.documentElement\n * - Avoids flash of incorrect theme using useLayoutEffect\n *\n * @example\n * ```tsx\n * // Wrap your app with ThemeProvider\n * function App() {\n * return (\n * <ThemeProvider>\n * <YourApp />\n * </ThemeProvider>\n * );\n * }\n *\n * // With default theme\n * <ThemeProvider defaultTheme=\"dark\">\n * <YourApp />\n * </ThemeProvider>\n *\n * // With custom storage key\n * <ThemeProvider storageKey=\"my-app-theme\">\n * <YourApp />\n * </ThemeProvider>\n * ```\n */\nexport function ThemeProvider({\n children,\n defaultTheme,\n storageKey = THEME_STORAGE_KEY,\n}: ThemeProviderProps) {\n const [theme, setThemeState] = useState<ThemeMode>(() =>\n getInitialTheme(storageKey, defaultTheme)\n );\n\n // Apply theme to document on initial mount and when theme changes\n useLayoutEffect(() => {\n const isDark = theme === 'dark';\n document.documentElement.classList.toggle('dark', isDark);\n }, [theme]);\n\n // Persist to localStorage whenever theme changes\n useLayoutEffect(() => {\n localStorage.setItem(storageKey, theme);\n }, [theme, storageKey]);\n\n const setTheme = useCallback((newTheme: ThemeMode) => {\n setThemeState(newTheme);\n }, []);\n\n const toggleTheme = useCallback(() => {\n setThemeState((currentTheme) => (currentTheme === 'dark' ? 'light' : 'dark'));\n }, []);\n\n const value = useMemo<ThemeContextValue>(\n () => ({\n theme,\n toggleTheme,\n setTheme,\n }),\n [theme, toggleTheme, setTheme]\n );\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n}\n\nThemeProvider.displayName = 'ThemeProvider';\n"],"names":[],"mappings":";;;AAsCA,MAAM,iBAAA,GAAoB,OAAA;AAMnB,MAAM,YAAA,GAAe,cAAwC,IAAI;AAExE,YAAA,CAAa,WAAA,GAAc,cAAA;AAQ3B,SAAS,eAAA,CAAgB,YAAoB,YAAA,EAAqC;AAEhF,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,CAAQ,UAAU,CAAA;AAClD,IAAA,IAAI,UAAA,KAAe,MAAA,IAAU,UAAA,KAAe,OAAA,EAAS;AACnD,MAAA,OAAO,UAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAO,YAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,MAAM,iBAAA,GAAoB,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,OAAA;AAC5E,IAAA,OAAO,oBAAoB,MAAA,GAAS,OAAA;AAAA,EACtC;AAGA,EAAA,OAAO,OAAA;AACT;AAkCO,SAAS,aAAA,CAAc;AAAA,EAC5B,QAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA,GAAa;AACf,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAC,KAAA,EAAO,aAAa,CAAA,GAAI,QAAA;AAAA,IAAoB,MACjD,eAAA,CAAgB,UAAA,EAAY,YAAY;AAAA,GAC1C;AAGA,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,MAAM,SAAS,KAAA,KAAU,MAAA;AACzB,IAAA,QAAA,CAAS,eAAA,CAAgB,SAAA,CAAU,MAAA,CAAO,MAAA,EAAQ,MAAM,CAAA;AAAA,EAC1D,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAGV,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,YAAA,CAAa,OAAA,CAAQ,YAAY,KAAK,CAAA;AAAA,EACxC,CAAA,EAAG,CAAC,KAAA,EAAO,UAAU,CAAC,CAAA;AAEtB,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAC,QAAA,KAAwB;AACpD,IAAA,aAAA,CAAc,QAAQ,CAAA;AAAA,EACxB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAc,YAAY,MAAM;AACpC,IAAA,aAAA,CAAc,CAAC,YAAA,KAAkB,YAAA,KAAiB,MAAA,GAAS,UAAU,MAAO,CAAA;AAAA,EAC9E,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,OAAO;AAAA,MACL,KAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,KAAA,EAAO,WAAA,EAAa,QAAQ;AAAA,GAC/B;AAEA,EAAA,uBAAO,GAAA,CAAC,YAAA,CAAa,QAAA,EAAb,EAAsB,OAAe,QAAA,EAAS,CAAA;AACxD;AAEA,aAAA,CAAc,WAAA,GAAc,eAAA;;;;"}
|
package/dist/ThemeToggle.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import {
|
|
2
|
+
import { u as useTheme } from './useTheme.js';
|
|
3
3
|
import { B as Button } from './Button.js';
|
|
4
4
|
import { c as createLucideIcon } from './createLucideIcon.js';
|
|
5
5
|
|
|
@@ -44,20 +44,8 @@ const __iconNode = [
|
|
|
44
44
|
const Sun = createLucideIcon("sun", __iconNode);
|
|
45
45
|
|
|
46
46
|
const ThemeToggle = ({ className, size = "md" }) => {
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
const savedTheme = localStorage.getItem("theme");
|
|
50
|
-
const systemPrefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
51
|
-
const shouldUseDark = savedTheme === "dark" || !savedTheme && systemPrefersDark;
|
|
52
|
-
setIsDarkMode(shouldUseDark);
|
|
53
|
-
document.documentElement.classList.toggle("dark", shouldUseDark);
|
|
54
|
-
}, []);
|
|
55
|
-
const toggleTheme = () => {
|
|
56
|
-
const newDarkMode = !isDarkMode;
|
|
57
|
-
setIsDarkMode(newDarkMode);
|
|
58
|
-
document.documentElement.classList.toggle("dark", newDarkMode);
|
|
59
|
-
localStorage.setItem("theme", newDarkMode ? "dark" : "light");
|
|
60
|
-
};
|
|
47
|
+
const { theme, toggleTheme } = useTheme();
|
|
48
|
+
const isDarkMode = theme === "dark";
|
|
61
49
|
return /* @__PURE__ */ jsxs(
|
|
62
50
|
Button,
|
|
63
51
|
{
|
|
@@ -85,6 +73,7 @@ const ThemeToggle = ({ className, size = "md" }) => {
|
|
|
85
73
|
}
|
|
86
74
|
);
|
|
87
75
|
};
|
|
76
|
+
ThemeToggle.displayName = "ThemeToggle";
|
|
88
77
|
|
|
89
78
|
export { ThemeToggle as T };
|
|
90
79
|
//# sourceMappingURL=ThemeToggle.js.map
|
package/dist/ThemeToggle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThemeToggle.js","sources":["../node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/moon.js","../node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/sun.js","../lib/components/ThemeToggle/ThemeToggle.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.562.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401\",\n key: \"kfwtm\"\n }\n ]\n];\nconst Moon = createLucideIcon(\"moon\", __iconNode);\n\nexport { __iconNode, Moon as default };\n//# sourceMappingURL=moon.js.map\n","/**\n * @license lucide-react v0.562.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"4\", key: \"4exip2\" }],\n [\"path\", { d: \"M12 2v2\", key: \"tus03m\" }],\n [\"path\", { d: \"M12 20v2\", key: \"1lh1kg\" }],\n [\"path\", { d: \"m4.93 4.93 1.41 1.41\", key: \"149t6j\" }],\n [\"path\", { d: \"m17.66 17.66 1.41 1.41\", key: \"ptbguv\" }],\n [\"path\", { d: \"M2 12h2\", key: \"1t8f8n\" }],\n [\"path\", { d: \"M20 12h2\", key: \"1q8mjw\" }],\n [\"path\", { d: \"m6.34 17.66-1.41 1.41\", key: \"1m8zz5\" }],\n [\"path\", { d: \"m19.07 4.93-1.41 1.41\", key: \"1shlcs\" }]\n];\nconst Sun = createLucideIcon(\"sun\", __iconNode);\n\nexport { __iconNode, Sun as default };\n//# sourceMappingURL=sun.js.map\n","import { Moon, Sun } from 'lucide-react';\nimport type React from 'react';\nimport {
|
|
1
|
+
{"version":3,"file":"ThemeToggle.js","sources":["../node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/moon.js","../node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/sun.js","../lib/components/ThemeToggle/ThemeToggle.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.562.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401\",\n key: \"kfwtm\"\n }\n ]\n];\nconst Moon = createLucideIcon(\"moon\", __iconNode);\n\nexport { __iconNode, Moon as default };\n//# sourceMappingURL=moon.js.map\n","/**\n * @license lucide-react v0.562.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"4\", key: \"4exip2\" }],\n [\"path\", { d: \"M12 2v2\", key: \"tus03m\" }],\n [\"path\", { d: \"M12 20v2\", key: \"1lh1kg\" }],\n [\"path\", { d: \"m4.93 4.93 1.41 1.41\", key: \"149t6j\" }],\n [\"path\", { d: \"m17.66 17.66 1.41 1.41\", key: \"ptbguv\" }],\n [\"path\", { d: \"M2 12h2\", key: \"1t8f8n\" }],\n [\"path\", { d: \"M20 12h2\", key: \"1q8mjw\" }],\n [\"path\", { d: \"m6.34 17.66-1.41 1.41\", key: \"1m8zz5\" }],\n [\"path\", { d: \"m19.07 4.93-1.41 1.41\", key: \"1shlcs\" }]\n];\nconst Sun = createLucideIcon(\"sun\", __iconNode);\n\nexport { __iconNode, Sun as default };\n//# sourceMappingURL=sun.js.map\n","import { Moon, Sun } from 'lucide-react';\nimport type React from 'react';\nimport { useTheme } from '../../hooks/useTheme';\nimport { Button } from '../Button/Button';\n\nexport interface ThemeToggleProps {\n /**\n * Custom className for the toggle button\n */\n className?: string;\n\n /**\n * Size of the toggle button\n */\n size?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * ThemeToggle component for switching between light and dark themes.\n *\n * Uses the useTheme hook internally for theme state management.\n *\n * @example\n * ```tsx\n * <ThemeToggle />\n * <ThemeToggle size=\"lg\" className=\"custom-class\" />\n * ```\n */\nexport const ThemeToggle: React.FC<ThemeToggleProps> = ({ className, size = 'md' }) => {\n const { theme, toggleTheme } = useTheme();\n const isDarkMode = theme === 'dark';\n\n return (\n <Button\n variant=\"ghost\"\n size={size === 'md' ? 'default' : size}\n onClick={toggleTheme}\n className={`text-foreground ${className}`}\n aria-label={`Switch to ${isDarkMode ? 'light' : 'dark'} theme`}\n >\n <Sun\n className={`h-4 w-4 transition-all ${isDarkMode ? 'scale-0 -rotate-90' : 'scale-100 rotate-0'}`}\n aria-hidden\n />\n <Moon\n className={`absolute h-4 w-4 transition-all ${isDarkMode ? 'scale-100 rotate-0' : 'scale-0 rotate-90'}`}\n aria-hidden\n />\n </Button>\n );\n};\n\nThemeToggle.displayName = 'ThemeToggle';\n"],"names":["__iconNode"],"mappings":";;;;;AAAA;AACA;AACA;AACA;AACA;AACA;;;AAIA,MAAMA,YAAU,GAAG;AACnB,EAAE;AACF,IAAI,MAAM;AACV,IAAI;AACJ,MAAM,CAAC,EAAE,gHAAgH;AACzH,MAAM,GAAG,EAAE;AACX;AACA;AACA,CAAC;AACD,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,EAAEA,YAAU,CAAC;;AClBjD;AACA;AACA;AACA;AACA;AACA;;;AAIA,MAAM,UAAU,GAAG;AACnB,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC3D,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC3C,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC5C,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,sBAAsB,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AACxD,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,wBAAwB,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC1D,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC3C,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC5C,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,uBAAuB,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AACzD,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,uBAAuB,EAAE,GAAG,EAAE,QAAQ,EAAE;AACxD,CAAC;AACD,MAAM,GAAG,GAAG,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC;;ACQxC,MAAM,cAA0C,CAAC,EAAE,SAAA,EAAW,IAAA,GAAO,MAAK,KAAM;AACrF,EAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAI,QAAA,EAAS;AACxC,EAAA,MAAM,aAAa,KAAA,KAAU,MAAA;AAE7B,EAAA,uBACE,IAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,IAAA,KAAS,IAAA,GAAO,SAAA,GAAY,IAAA;AAAA,MAClC,OAAA,EAAS,WAAA;AAAA,MACT,SAAA,EAAW,mBAAmB,SAAS,CAAA,CAAA;AAAA,MACvC,YAAA,EAAY,CAAA,UAAA,EAAa,UAAA,GAAa,OAAA,GAAU,MAAM,CAAA,MAAA,CAAA;AAAA,MAEtD,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA,uBAAA,EAA0B,UAAA,GAAa,oBAAA,GAAuB,oBAAoB,CAAA,CAAA;AAAA,YAC7F,aAAA,EAAW;AAAA;AAAA,SACb;AAAA,wBACA,GAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA,gCAAA,EAAmC,UAAA,GAAa,oBAAA,GAAuB,mBAAmB,CAAA,CAAA;AAAA,YACrG,aAAA,EAAW;AAAA;AAAA;AACb;AAAA;AAAA,GACF;AAEJ;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA;;;;","x_google_ignoreList":[0,1]}
|
package/dist/Toggle.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { u as useControllableState, P as Primitive, a as composeEventHandlers } from './index13.js';
|
|
4
|
+
import { c as cva } from './index8.js';
|
|
5
|
+
import { c as cn } from './utils.js';
|
|
6
|
+
|
|
7
|
+
var NAME = "Toggle";
|
|
8
|
+
var Toggle$2 = React.forwardRef((props, forwardedRef) => {
|
|
9
|
+
const { pressed: pressedProp, defaultPressed, onPressedChange, ...buttonProps } = props;
|
|
10
|
+
const [pressed, setPressed] = useControllableState({
|
|
11
|
+
prop: pressedProp,
|
|
12
|
+
onChange: onPressedChange,
|
|
13
|
+
defaultProp: defaultPressed ?? false,
|
|
14
|
+
caller: NAME
|
|
15
|
+
});
|
|
16
|
+
return /* @__PURE__ */ jsx(
|
|
17
|
+
Primitive.button,
|
|
18
|
+
{
|
|
19
|
+
type: "button",
|
|
20
|
+
"aria-pressed": pressed,
|
|
21
|
+
"data-state": pressed ? "on" : "off",
|
|
22
|
+
"data-disabled": props.disabled ? "" : void 0,
|
|
23
|
+
...buttonProps,
|
|
24
|
+
ref: forwardedRef,
|
|
25
|
+
onClick: composeEventHandlers(props.onClick, () => {
|
|
26
|
+
if (!props.disabled) {
|
|
27
|
+
setPressed(!pressed);
|
|
28
|
+
}
|
|
29
|
+
})
|
|
30
|
+
}
|
|
31
|
+
);
|
|
32
|
+
});
|
|
33
|
+
Toggle$2.displayName = NAME;
|
|
34
|
+
var Root = Toggle$2;
|
|
35
|
+
|
|
36
|
+
const toggleVariants$1 = cva(
|
|
37
|
+
"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium hover:bg-muted hover:text-muted-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] outline-none transition-[color,box-shadow] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive whitespace-nowrap",
|
|
38
|
+
{
|
|
39
|
+
variants: {
|
|
40
|
+
variant: {
|
|
41
|
+
default: "bg-transparent",
|
|
42
|
+
outline: "border border-input bg-transparent shadow-xs hover:bg-accent hover:text-accent-foreground"
|
|
43
|
+
},
|
|
44
|
+
size: {
|
|
45
|
+
default: "h-9 px-2 min-w-9",
|
|
46
|
+
sm: "h-8 px-1.5 min-w-8",
|
|
47
|
+
lg: "h-10 px-2.5 min-w-10"
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
defaultVariants: {
|
|
51
|
+
variant: "default",
|
|
52
|
+
size: "default"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
);
|
|
56
|
+
function Toggle$1({
|
|
57
|
+
className,
|
|
58
|
+
variant,
|
|
59
|
+
size,
|
|
60
|
+
...props
|
|
61
|
+
}) {
|
|
62
|
+
return /* @__PURE__ */ jsx(Root, { "data-slot": "toggle", className: cn(toggleVariants$1({ variant, size, className })), ...props });
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const Toggle = Toggle$1;
|
|
66
|
+
const toggleVariants = toggleVariants$1;
|
|
67
|
+
|
|
68
|
+
export { Toggle as T, toggleVariants as t };
|
|
69
|
+
//# sourceMappingURL=Toggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toggle.js","sources":["../node_modules/.pnpm/@radix-ui+react-toggle@1.1.10_@types+react-dom@19.2.3_@types+react@19.2.9__@types+react_5be2ba4619ea932b5b17927c79378d5f/node_modules/@radix-ui/react-toggle/dist/index.mjs","../shadcn/shadcnToggle/Toggle.tsx","../lib/components/Toggle/Toggle.tsx"],"sourcesContent":["\"use client\";\n\n// src/toggle.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { jsx } from \"react/jsx-runtime\";\nvar NAME = \"Toggle\";\nvar Toggle = React.forwardRef((props, forwardedRef) => {\n const { pressed: pressedProp, defaultPressed, onPressedChange, ...buttonProps } = props;\n const [pressed, setPressed] = useControllableState({\n prop: pressedProp,\n onChange: onPressedChange,\n defaultProp: defaultPressed ?? false,\n caller: NAME\n });\n return /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n \"aria-pressed\": pressed,\n \"data-state\": pressed ? \"on\" : \"off\",\n \"data-disabled\": props.disabled ? \"\" : void 0,\n ...buttonProps,\n ref: forwardedRef,\n onClick: composeEventHandlers(props.onClick, () => {\n if (!props.disabled) {\n setPressed(!pressed);\n }\n })\n }\n );\n});\nToggle.displayName = NAME;\nvar Root = Toggle;\nexport {\n Root,\n Toggle\n};\n//# sourceMappingURL=index.mjs.map\n","'use client';\n\nimport * as TogglePrimitive from '@radix-ui/react-toggle';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport type * as React from 'react';\n\nimport { cn } from '../utils';\n\nconst toggleVariants = cva(\n \"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium hover:bg-muted hover:text-muted-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] outline-none transition-[color,box-shadow] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive whitespace-nowrap\",\n {\n variants: {\n variant: {\n default: 'bg-transparent',\n outline: 'border border-input bg-transparent shadow-xs hover:bg-accent hover:text-accent-foreground',\n },\n size: {\n default: 'h-9 px-2 min-w-9',\n sm: 'h-8 px-1.5 min-w-8',\n lg: 'h-10 px-2.5 min-w-10',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\nfunction Toggle({\n className,\n variant,\n size,\n ...props\n}: React.ComponentProps<typeof TogglePrimitive.Root> & VariantProps<typeof toggleVariants>) {\n return (\n <TogglePrimitive.Root data-slot=\"toggle\" className={cn(toggleVariants({ variant, size, className }))} {...props} />\n );\n}\n\nexport { Toggle, toggleVariants };\n","import { Toggle as ShadcnToggle, toggleVariants as shadcnToggleVariants } from '../../../shadcn/shadcnToggle';\n\n/**\n * Toggle component - a two-state button for UI state changes (like toolbar buttons).\n *\n * **IMPORTANT: Toggle is NOT designed for form submission.**\n * - Toggle uses `pressed`/`onPressedChange` semantics (UI state, not form data)\n * - It doesn't provide `name`/`value` props required for form fields\n * - **For form-based on/off fields, use the `Switch` component instead**\n *\n * **Use Toggle for:**\n * - Toolbar buttons (bold, italic, underline in text editors)\n * - UI state toggles (show/hide panels, enable/disable features)\n * - Button-like interactions that don't need form submission\n *\n * **Use Switch for:**\n * - Form fields with on/off states\n * - Settings that need to be submitted with form data\n * - Fields that require validation and error display\n *\n * @example\n * ```tsx\n * // Toolbar button (Toggle) - CORRECT usage\n * <Toggle aria-label=\"Toggle italic\" onPressedChange={setItalic}>\n * <Italic className=\"h-4 w-4\" />\n * </Toggle>\n *\n * // Form field (Switch) - CORRECT usage\n * <Form form={form} onSubmit={handleSubmit}>\n * <Switch name=\"notifications\" label=\"Enable notifications\" />\n * </Form>\n *\n * // ❌ INCORRECT - Don't use Toggle in forms\n * <Form form={form} onSubmit={handleSubmit}>\n * <Toggle>Notifications</Toggle> // Won't work - use Switch instead\n * </Form>\n * ```\n */\nexport const Toggle = ShadcnToggle;\n\n/**\n * Toggle variants for custom styling.\n * Can be used with `cn()` to create custom toggle styles.\n */\nexport const toggleVariants = shadcnToggleVariants;\n"],"names":["Toggle","toggleVariants","TogglePrimitive.Root","ShadcnToggle","shadcnToggleVariants"],"mappings":";;;;;;AAQA,IAAI,IAAI,GAAG,QAAQ;AACnB,IAAIA,QAAM,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,YAAY,KAAK;AACvD,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,GAAG,WAAW,EAAE,GAAG,KAAK;AACzF,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,oBAAoB,CAAC;AACrD,IAAI,IAAI,EAAE,WAAW;AACrB,IAAI,QAAQ,EAAE,eAAe;AAC7B,IAAI,WAAW,EAAE,cAAc,IAAI,KAAK;AACxC,IAAI,MAAM,EAAE;AACZ,GAAG,CAAC;AACJ,EAAE,uBAAuB,GAAG;AAC5B,IAAI,SAAS,CAAC,MAAM;AACpB,IAAI;AACJ,MAAM,IAAI,EAAE,QAAQ;AACpB,MAAM,cAAc,EAAE,OAAO;AAC7B,MAAM,YAAY,EAAE,OAAO,GAAG,IAAI,GAAG,KAAK;AAC1C,MAAM,eAAe,EAAE,KAAK,CAAC,QAAQ,GAAG,EAAE,GAAG,MAAM;AACnD,MAAM,GAAG,WAAW;AACpB,MAAM,GAAG,EAAE,YAAY;AACvB,MAAM,OAAO,EAAE,oBAAoB,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM;AACzD,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AAC7B,UAAU,UAAU,CAAC,CAAC,OAAO,CAAC;AAC9B,QAAQ;AACR,MAAM,CAAC;AACP;AACA,GAAG;AACH,CAAC,CAAC;AACFA,QAAM,CAAC,WAAW,GAAG,IAAI;AACzB,IAAI,IAAI,GAAGA,QAAM;;AC3BjB,MAAMC,gBAAA,GAAiB,GAAA;AAAA,EACrB,+iBAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,gBAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACX;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,kBAAA;AAAA,QACT,EAAA,EAAI,oBAAA;AAAA,QACJ,EAAA,EAAI;AAAA;AACN,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM;AAAA;AACR;AAEJ,CAAA;AAEA,SAASD,QAAA,CAAO;AAAA,EACd,SAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA4F;AAC1F,EAAA,2BACGE,IAAgB,EAAhB,EAAqB,WAAA,EAAU,UAAS,SAAA,EAAW,EAAA,CAAGD,gBAAA,CAAe,EAAE,SAAS,IAAA,EAAM,SAAA,EAAW,CAAC,CAAA,EAAI,GAAG,KAAA,EAAO,CAAA;AAErH;;ACAO,MAAM,MAAA,GAASE;AAMf,MAAM,cAAA,GAAiBC;;;;","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_commonjsHelpers.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -381,3 +381,21 @@ body {
|
|
|
381
381
|
[data-sonner-toaster] [data-sonner-toast][data-type="loading"] {
|
|
382
382
|
border-left: 4px solid var(--primary);
|
|
383
383
|
}
|
|
384
|
+
/* Override browser autofill styles */
|
|
385
|
+
input:-webkit-autofill,
|
|
386
|
+
input:-webkit-autofill:hover,
|
|
387
|
+
input:-webkit-autofill:focus,
|
|
388
|
+
input:-webkit-autofill:active,
|
|
389
|
+
textarea:-webkit-autofill,
|
|
390
|
+
textarea:-webkit-autofill:hover,
|
|
391
|
+
textarea:-webkit-autofill:focus,
|
|
392
|
+
textarea:-webkit-autofill:active,
|
|
393
|
+
select:-webkit-autofill,
|
|
394
|
+
select:-webkit-autofill:hover,
|
|
395
|
+
select:-webkit-autofill:focus,
|
|
396
|
+
select:-webkit-autofill:active {
|
|
397
|
+
-webkit-box-shadow: 0 0 0 1000px var(--input) inset !important;
|
|
398
|
+
-webkit-text-fill-color: var(--foreground) !important;
|
|
399
|
+
caret-color: var(--foreground) !important;
|
|
400
|
+
transition: background-color 5000s ease-in-out 0s;
|
|
401
|
+
}
|