@zentauri-ui/zentauri-components 0.0.7 → 0.0.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.
Files changed (132) hide show
  1. package/README.md +134 -0
  2. package/dist/ui/accordion.cjs +311 -0
  3. package/dist/ui/accordion.cjs.map +1 -0
  4. package/dist/ui/accordion.d.cts +70 -0
  5. package/dist/ui/accordion.d.ts +70 -0
  6. package/dist/ui/accordion.js +286 -0
  7. package/dist/ui/accordion.js.map +1 -0
  8. package/dist/ui/alert.cjs +257 -0
  9. package/dist/ui/alert.cjs.map +1 -0
  10. package/dist/ui/alert.d.cts +66 -0
  11. package/dist/ui/alert.d.ts +66 -0
  12. package/dist/ui/alert.js +224 -0
  13. package/dist/ui/alert.js.map +1 -0
  14. package/dist/ui/badge.cjs +192 -0
  15. package/dist/ui/badge.cjs.map +1 -0
  16. package/dist/ui/badge.d.cts +37 -0
  17. package/dist/ui/badge.d.ts +37 -0
  18. package/dist/ui/badge.js +165 -0
  19. package/dist/ui/badge.js.map +1 -0
  20. package/dist/ui/buttons.cjs +202 -0
  21. package/dist/ui/buttons.cjs.map +1 -0
  22. package/dist/ui/buttons.d.cts +27 -0
  23. package/dist/ui/buttons.d.ts +27 -0
  24. package/dist/ui/buttons.js +176 -0
  25. package/dist/ui/buttons.js.map +1 -0
  26. package/dist/ui/card.cjs +293 -0
  27. package/dist/ui/card.cjs.map +1 -0
  28. package/dist/ui/card.d.cts +77 -0
  29. package/dist/ui/card.d.ts +77 -0
  30. package/dist/ui/card.js +258 -0
  31. package/dist/ui/card.js.map +1 -0
  32. package/dist/ui/divider.cjs +229 -0
  33. package/dist/ui/divider.cjs.map +1 -0
  34. package/dist/ui/divider.d.cts +39 -0
  35. package/dist/ui/divider.d.ts +39 -0
  36. package/dist/ui/divider.js +200 -0
  37. package/dist/ui/divider.js.map +1 -0
  38. package/dist/ui/drawer.cjs +408 -0
  39. package/dist/ui/drawer.cjs.map +1 -0
  40. package/dist/ui/drawer.d.cts +81 -0
  41. package/dist/ui/drawer.d.ts +81 -0
  42. package/dist/ui/drawer.js +383 -0
  43. package/dist/ui/drawer.js.map +1 -0
  44. package/dist/ui/dropdown.cjs +302 -0
  45. package/dist/ui/dropdown.cjs.map +1 -0
  46. package/dist/ui/dropdown.d.cts +50 -0
  47. package/dist/ui/dropdown.d.ts +50 -0
  48. package/dist/ui/dropdown.js +278 -0
  49. package/dist/ui/dropdown.js.map +1 -0
  50. package/dist/ui/empty-state.cjs +186 -0
  51. package/dist/ui/empty-state.cjs.map +1 -0
  52. package/dist/ui/empty-state.d.cts +55 -0
  53. package/dist/ui/empty-state.d.ts +55 -0
  54. package/dist/ui/empty-state.js +154 -0
  55. package/dist/ui/empty-state.js.map +1 -0
  56. package/dist/ui/index.d.cts +27 -1164
  57. package/dist/ui/index.d.ts +27 -1164
  58. package/dist/ui/inputs.cjs +458 -0
  59. package/dist/ui/inputs.cjs.map +1 -0
  60. package/dist/ui/inputs.d.cts +35 -0
  61. package/dist/ui/inputs.d.ts +35 -0
  62. package/dist/ui/inputs.js +432 -0
  63. package/dist/ui/inputs.js.map +1 -0
  64. package/dist/ui/modal.cjs +406 -0
  65. package/dist/ui/modal.cjs.map +1 -0
  66. package/dist/ui/modal.d.cts +84 -0
  67. package/dist/ui/modal.d.ts +84 -0
  68. package/dist/ui/modal.js +384 -0
  69. package/dist/ui/modal.js.map +1 -0
  70. package/dist/ui/pagination.cjs +523 -0
  71. package/dist/ui/pagination.cjs.map +1 -0
  72. package/dist/ui/pagination.d.cts +114 -0
  73. package/dist/ui/pagination.d.ts +114 -0
  74. package/dist/ui/pagination.js +494 -0
  75. package/dist/ui/pagination.js.map +1 -0
  76. package/dist/ui/progress.cjs +268 -0
  77. package/dist/ui/progress.cjs.map +1 -0
  78. package/dist/ui/progress.d.cts +61 -0
  79. package/dist/ui/progress.d.ts +61 -0
  80. package/dist/ui/progress.js +237 -0
  81. package/dist/ui/progress.js.map +1 -0
  82. package/dist/ui/select.cjs +360 -0
  83. package/dist/ui/select.cjs.map +1 -0
  84. package/dist/ui/select.d.cts +73 -0
  85. package/dist/ui/select.d.ts +73 -0
  86. package/dist/ui/select.js +327 -0
  87. package/dist/ui/select.js.map +1 -0
  88. package/dist/ui/skeleton.cjs +576 -0
  89. package/dist/ui/skeleton.cjs.map +1 -0
  90. package/dist/ui/skeleton.d.cts +90 -0
  91. package/dist/ui/skeleton.d.ts +90 -0
  92. package/dist/ui/skeleton.js +544 -0
  93. package/dist/ui/skeleton.js.map +1 -0
  94. package/dist/ui/spinner.cjs +219 -0
  95. package/dist/ui/spinner.cjs.map +1 -0
  96. package/dist/ui/spinner.d.cts +27 -0
  97. package/dist/ui/spinner.d.ts +27 -0
  98. package/dist/ui/spinner.js +193 -0
  99. package/dist/ui/spinner.js.map +1 -0
  100. package/dist/ui/table.cjs +328 -0
  101. package/dist/ui/table.cjs.map +1 -0
  102. package/dist/ui/table.d.cts +81 -0
  103. package/dist/ui/table.d.ts +81 -0
  104. package/dist/ui/table.js +293 -0
  105. package/dist/ui/table.js.map +1 -0
  106. package/dist/ui/tabs.cjs +300 -0
  107. package/dist/ui/tabs.cjs.map +1 -0
  108. package/dist/ui/tabs.d.cts +58 -0
  109. package/dist/ui/tabs.d.ts +58 -0
  110. package/dist/ui/tabs.js +274 -0
  111. package/dist/ui/tabs.js.map +1 -0
  112. package/dist/ui/toast.cjs +285 -0
  113. package/dist/ui/toast.cjs.map +1 -0
  114. package/dist/ui/toast.d.cts +86 -0
  115. package/dist/ui/toast.d.ts +86 -0
  116. package/dist/ui/toast.js +258 -0
  117. package/dist/ui/toast.js.map +1 -0
  118. package/dist/ui/toggle.cjs +185 -0
  119. package/dist/ui/toggle.cjs.map +1 -0
  120. package/dist/ui/toggle.d.cts +37 -0
  121. package/dist/ui/toggle.d.ts +37 -0
  122. package/dist/ui/toggle.js +158 -0
  123. package/dist/ui/toggle.js.map +1 -0
  124. package/dist/ui/tooltip.cjs +242 -0
  125. package/dist/ui/tooltip.cjs.map +1 -0
  126. package/dist/ui/tooltip.d.cts +46 -0
  127. package/dist/ui/tooltip.d.ts +46 -0
  128. package/dist/ui/tooltip.js +214 -0
  129. package/dist/ui/tooltip.js.map +1 -0
  130. package/dist/variants-1Bx3BEeS.d.cts +8 -0
  131. package/dist/variants-1Bx3BEeS.d.ts +8 -0
  132. package/package.json +7 -3
@@ -0,0 +1,258 @@
1
+ "use client";
2
+
3
+
4
+ // src/ui/toast/toast.tsx
5
+ import { AnimatePresence, motion } from "framer-motion";
6
+ import {
7
+ createContext,
8
+ useCallback,
9
+ useContext,
10
+ useEffect,
11
+ useMemo,
12
+ useRef,
13
+ useState
14
+ } from "react";
15
+ import { createPortal } from "react-dom";
16
+
17
+ // src/lib/utils.ts
18
+ import { clsx } from "clsx";
19
+ import { twMerge } from "tailwind-merge";
20
+ function cn(...inputs) {
21
+ return twMerge(clsx(inputs));
22
+ }
23
+
24
+ // src/ui/toast/animations.ts
25
+ var toastAnimationPresets = {
26
+ none: {},
27
+ slide: {
28
+ initial: { opacity: 0, x: 24 },
29
+ animate: { opacity: 1, x: 0 },
30
+ exit: { opacity: 0, x: 16 },
31
+ transition: { type: "spring", stiffness: 380, damping: 28 }
32
+ },
33
+ fade: {
34
+ initial: { opacity: 0 },
35
+ animate: { opacity: 1 },
36
+ exit: { opacity: 0 },
37
+ transition: { duration: 0.18 }
38
+ }
39
+ };
40
+
41
+ // src/ui/toast/variants.ts
42
+ import { cva } from "class-variance-authority";
43
+ var toastViewportVariants = cva("fixed z-[60] flex max-h-screen flex-col gap-2 p-4", {
44
+ variants: {
45
+ position: {
46
+ "top-left": "left-0 top-0 items-start",
47
+ "top-center": "left-1/2 top-0 -translate-x-1/2 items-center",
48
+ "top-right": "right-0 top-0 items-end",
49
+ "bottom-left": "bottom-0 left-0 items-start",
50
+ "bottom-center": "bottom-0 left-1/2 -translate-x-1/2 items-center",
51
+ "bottom-right": "bottom-0 right-0 items-end"
52
+ }
53
+ },
54
+ defaultVariants: {
55
+ position: "bottom-right"
56
+ }
57
+ });
58
+ var toastRootVariants = cva(
59
+ "pointer-events-auto w-[min(100vw-2rem,380px)] rounded-xl border border-white/10 bg-slate-950 p-4 text-slate-50 shadow-[0_18px_48px_rgba(15,23,42,0.45)]",
60
+ {
61
+ variants: {
62
+ appearance: {
63
+ default: "bg-slate-950",
64
+ success: "border-emerald-500/40 bg-emerald-950",
65
+ warning: "border-amber-500/40 bg-amber-950",
66
+ error: "border-rose-500/50 bg-rose-950",
67
+ info: "border-sky-500/40 bg-sky-950",
68
+ ghost: "border-transparent bg-transparent text-slate-200",
69
+ purple: "border-purple-600 bg-purple-950/70 backdrop-blur-xl",
70
+ pink: "border-pink-600 bg-pink-950/70 backdrop-blur-xl",
71
+ orange: "border-orange-600 bg-orange-950/70 backdrop-blur-xl",
72
+ yellow: "border-yellow-600 bg-yellow-950/70 backdrop-blur-xl",
73
+ teal: "border-teal-600 bg-teal-950/70 backdrop-blur-xl",
74
+ indigo: "border-indigo-600 bg-indigo-950/70 backdrop-blur-xl",
75
+ emerald: "border-emerald-600 bg-emerald-950/70 backdrop-blur-xl",
76
+ gray: "border-gray-600 bg-gray-950/70 backdrop-blur-xl",
77
+ amber: "border-amber-600 bg-amber-950/70 backdrop-blur-xl",
78
+ violet: "border-violet-600 bg-violet-950/70 backdrop-blur-xl",
79
+ "gradient-blue": "border-gradient-to-r from-blue-600 to-purple-600 bg-gradient-to-r from-blue-950/70 to-purple-950/70 backdrop-blur-xl",
80
+ "gradient-green": "border-gradient-to-r from-green-600 to-lime-600 bg-gradient-to-r from-green-950/70 to-lime-950/70 backdrop-blur-xl",
81
+ "gradient-red": "border-gradient-to-r from-red-600 to-pink-600 bg-gradient-to-r from-red-950/70 to-pink-950/70 backdrop-blur-xl",
82
+ "gradient-yellow": "border-gradient-to-r from-yellow-600 to-orange-600 bg-gradient-to-r from-yellow-950/70 to-orange-950/70 backdrop-blur-xl",
83
+ "gradient-purple": "border-gradient-to-r from-purple-600 to-pink-600 bg-gradient-to-r from-purple-950/70 to-pink-950/70 backdrop-blur-xl",
84
+ "gradient-teal": "border-gradient-to-r from-teal-600 to-cyan-600 bg-gradient-to-r from-teal-950/70 to-cyan-950/70 backdrop-blur-xl",
85
+ "gradient-indigo": "border-gradient-to-r from-indigo-600 to-purple-600 bg-gradient-to-r from-indigo-950/70 to-purple-950/70 backdrop-blur-xl",
86
+ "gradient-pink": "border-gradient-to-r from-pink-600 to-rose-600 bg-gradient-to-r from-pink-950/70 to-rose-950/70 backdrop-blur-xl",
87
+ "gradient-orange": "border-gradient-to-r from-orange-600 to-red-600 bg-gradient-to-r from-orange-950/70 to-red-950/70 backdrop-blur-xl"
88
+ },
89
+ size: {
90
+ sm: "p-3 text-xs",
91
+ md: "p-4 text-sm",
92
+ lg: "p-5 text-base"
93
+ }
94
+ },
95
+ defaultVariants: {
96
+ appearance: "default",
97
+ size: "md"
98
+ }
99
+ }
100
+ );
101
+
102
+ // src/ui/toast/toast.tsx
103
+ import { jsx, jsxs } from "react/jsx-runtime";
104
+ var ToastStoreContext = createContext(null);
105
+ var toastDispatcher = null;
106
+ function toast(input) {
107
+ if (!toastDispatcher) {
108
+ return "";
109
+ }
110
+ return toastDispatcher(input);
111
+ }
112
+ function useToast() {
113
+ const ctx = useContext(ToastStoreContext);
114
+ if (!ctx) {
115
+ throw new Error("useToast must be used within <ToastProvider>");
116
+ }
117
+ return { toast: ctx.push, dismiss: ctx.dismiss };
118
+ }
119
+ function ToastProvider({ children }) {
120
+ const [toasts, setToasts] = useState([]);
121
+ const timers = useRef(/* @__PURE__ */ new Map());
122
+ const dismiss = useCallback((id) => {
123
+ const timerId = timers.current.get(id);
124
+ if (timerId) {
125
+ window.clearTimeout(timerId);
126
+ timers.current.delete(id);
127
+ }
128
+ setToasts((prev) => prev.filter((toastItem) => toastItem.id !== id));
129
+ }, []);
130
+ const push = useCallback(
131
+ (input) => {
132
+ const id = input.id ?? `toast-${Math.random().toString(16).slice(2)}`;
133
+ const durationMs = input.durationMs ?? 4500;
134
+ const record = {
135
+ ...input,
136
+ id,
137
+ durationMs,
138
+ animation: input.animation ?? "slide"
139
+ };
140
+ setToasts((prev) => [...prev, record]);
141
+ const timerId = window.setTimeout(() => dismiss(id), durationMs);
142
+ timers.current.set(id, timerId);
143
+ return id;
144
+ },
145
+ [dismiss]
146
+ );
147
+ const ctx = useMemo(
148
+ () => ({
149
+ toasts,
150
+ push,
151
+ dismiss
152
+ }),
153
+ [dismiss, push, toasts]
154
+ );
155
+ useEffect(() => {
156
+ toastDispatcher = push;
157
+ return () => {
158
+ toastDispatcher = null;
159
+ };
160
+ }, [push]);
161
+ return /* @__PURE__ */ jsx(ToastStoreContext.Provider, { value: ctx, children });
162
+ }
163
+ ToastProvider.displayName = "ToastProvider";
164
+ function ToastViewport({ position = "bottom-right", className }) {
165
+ const ctx = useContext(ToastStoreContext);
166
+ if (!ctx) {
167
+ throw new Error("ToastViewport must be used within <ToastProvider>");
168
+ }
169
+ const portalTarget = typeof document !== "undefined" ? document.body : null;
170
+ if (!portalTarget) {
171
+ return null;
172
+ }
173
+ return createPortal(
174
+ /* @__PURE__ */ jsx("div", { className: cn(toastViewportVariants({ position }), className), "data-slot": "toast-viewport", children: /* @__PURE__ */ jsx(AnimatePresence, { children: ctx.toasts.map((item) => /* @__PURE__ */ jsxs(
175
+ Toast,
176
+ {
177
+ toastId: item.id,
178
+ appearance: item.appearance,
179
+ size: item.size,
180
+ animation: item.animation,
181
+ children: [
182
+ /* @__PURE__ */ jsx(ToastTitle, { children: item.title }),
183
+ item.description ? /* @__PURE__ */ jsx(ToastDescription, { children: item.description }) : null,
184
+ /* @__PURE__ */ jsx(ToastClose, { onClick: () => ctx.dismiss(item.id) })
185
+ ]
186
+ },
187
+ item.id
188
+ )) }) }),
189
+ portalTarget
190
+ );
191
+ }
192
+ ToastViewport.displayName = "ToastViewport";
193
+ function Toast({ toastId: _toastId, appearance, size, animation = "slide", className, children }) {
194
+ const motionProps = toastAnimationPresets[animation];
195
+ const live = appearance === "error" ? "assertive" : "polite";
196
+ return /* @__PURE__ */ jsx(
197
+ motion.div,
198
+ {
199
+ layout: true,
200
+ "data-slot": "toast",
201
+ role: appearance === "error" ? "alert" : "status",
202
+ "aria-live": live,
203
+ "aria-atomic": "true",
204
+ className: cn("relative", toastRootVariants({ appearance, size }), className),
205
+ initial: animation === "none" ? false : motionProps.initial,
206
+ animate: animation === "none" ? void 0 : motionProps.animate,
207
+ exit: animation === "none" ? void 0 : motionProps.exit,
208
+ transition: motionProps.transition,
209
+ children
210
+ }
211
+ );
212
+ }
213
+ Toast.displayName = "Toast";
214
+ function ToastTitle({ className, children }) {
215
+ return /* @__PURE__ */ jsx("div", { "data-slot": "toast-title", className: cn("font-semibold", className), children });
216
+ }
217
+ ToastTitle.displayName = "ToastTitle";
218
+ function ToastDescription({ className, children }) {
219
+ return /* @__PURE__ */ jsx("div", { "data-slot": "toast-description", className: cn("text-sm text-slate-300", className), children });
220
+ }
221
+ ToastDescription.displayName = "ToastDescription";
222
+ function ToastAction({ className, children }) {
223
+ return /* @__PURE__ */ jsx("div", { "data-slot": "toast-action", className: cn("mt-3", className), children });
224
+ }
225
+ ToastAction.displayName = "ToastAction";
226
+ function ToastClose({ className, children, onClick, ...rest }) {
227
+ return /* @__PURE__ */ jsx(
228
+ "button",
229
+ {
230
+ type: "button",
231
+ "data-slot": "toast-close",
232
+ "aria-label": "Dismiss notification",
233
+ className: cn(
234
+ "absolute right-3 top-3 inline-flex size-8 items-center justify-center rounded-md text-slate-200 transition hover:bg-white/10",
235
+ className
236
+ ),
237
+ onClick,
238
+ ...rest,
239
+ children: children ?? "\xD7"
240
+ }
241
+ );
242
+ }
243
+ ToastClose.displayName = "ToastClose";
244
+ export {
245
+ Toast,
246
+ ToastAction,
247
+ ToastClose,
248
+ ToastDescription,
249
+ ToastProvider,
250
+ ToastTitle,
251
+ ToastViewport,
252
+ toast,
253
+ toastAnimationPresets,
254
+ toastRootVariants,
255
+ toastViewportVariants,
256
+ useToast
257
+ };
258
+ //# sourceMappingURL=toast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/ui/toast/toast.tsx","../../src/lib/utils.ts","../../src/ui/toast/animations.ts","../../src/ui/toast/variants.ts"],"sourcesContent":["\"use client\";\n\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { cn } from \"../../lib/utils\";\n\nimport { toastAnimationPresets } from \"./animations\";\nimport type {\n ToastContextValue,\n ToastInput,\n ToastProps,\n ToastProviderProps,\n ToastSectionProps,\n ToastViewportProps,\n} from \"./types\";\nimport { toastRootVariants, toastViewportVariants } from \"./variants\";\n\ntype InternalToast = Required<Pick<ToastInput, \"id\">> &\n Omit<ToastInput, \"id\"> & {\n durationMs: number;\n animation: NonNullable<ToastInput[\"animation\"]>;\n };\n\ntype ToastStoreContextValue = {\n toasts: InternalToast[];\n push: (input: ToastInput) => string;\n dismiss: (id: string) => void;\n};\n\nconst ToastStoreContext = createContext<ToastStoreContextValue | null>(null);\n\nlet toastDispatcher: ToastStoreContextValue[\"push\"] | null = null;\n\nexport function toast(input: ToastInput) {\n if (!toastDispatcher) {\n return \"\";\n }\n return toastDispatcher(input);\n}\n\nexport function useToast(): ToastContextValue {\n const ctx = useContext(ToastStoreContext);\n if (!ctx) {\n throw new Error(\"useToast must be used within <ToastProvider>\");\n }\n return { toast: ctx.push, dismiss: ctx.dismiss };\n}\n\nexport function ToastProvider({ children }: ToastProviderProps) {\n const [toasts, setToasts] = useState<InternalToast[]>([]);\n const timers = useRef<Map<string, number>>(new Map());\n\n const dismiss = useCallback((id: string) => {\n const timerId = timers.current.get(id);\n if (timerId) {\n window.clearTimeout(timerId);\n timers.current.delete(id);\n }\n setToasts((prev) => prev.filter((toastItem) => toastItem.id !== id));\n }, []);\n\n const push = useCallback(\n (input: ToastInput) => {\n const id = input.id ?? `toast-${Math.random().toString(16).slice(2)}`;\n const durationMs = input.durationMs ?? 4500;\n const record: InternalToast = {\n ...input,\n id,\n durationMs,\n animation: input.animation ?? \"slide\",\n };\n setToasts((prev) => [...prev, record]);\n const timerId = window.setTimeout(() => dismiss(id), durationMs);\n timers.current.set(id, timerId);\n return id;\n },\n [dismiss],\n );\n\n const ctx = useMemo(\n () => ({\n toasts,\n push,\n dismiss,\n }),\n [dismiss, push, toasts],\n );\n\n useEffect(() => {\n toastDispatcher = push;\n return () => {\n toastDispatcher = null;\n };\n }, [push]);\n\n return <ToastStoreContext.Provider value={ctx}>{children}</ToastStoreContext.Provider>;\n}\n\nToastProvider.displayName = \"ToastProvider\";\n\nexport function ToastViewport({ position = \"bottom-right\", className }: ToastViewportProps) {\n const ctx = useContext(ToastStoreContext);\n if (!ctx) {\n throw new Error(\"ToastViewport must be used within <ToastProvider>\");\n }\n\n const portalTarget = typeof document !== \"undefined\" ? document.body : null;\n if (!portalTarget) {\n return null;\n }\n\n return createPortal(\n <div className={cn(toastViewportVariants({ position }), className)} data-slot=\"toast-viewport\">\n <AnimatePresence>\n {ctx.toasts.map((item) => (\n <Toast\n key={item.id}\n toastId={item.id}\n appearance={item.appearance}\n size={item.size}\n animation={item.animation}\n >\n <ToastTitle>{item.title}</ToastTitle>\n {item.description ? <ToastDescription>{item.description}</ToastDescription> : null}\n <ToastClose onClick={() => ctx.dismiss(item.id)} />\n </Toast>\n ))}\n </AnimatePresence>\n </div>,\n portalTarget,\n );\n}\n\nToastViewport.displayName = \"ToastViewport\";\n\nexport function Toast({ toastId: _toastId, appearance, size, animation = \"slide\", className, children }: ToastProps) {\n const motionProps = toastAnimationPresets[animation];\n const live = appearance === \"error\" ? \"assertive\" : \"polite\";\n\n return (\n <motion.div\n layout\n data-slot=\"toast\"\n role={appearance === \"error\" ? \"alert\" : \"status\"}\n aria-live={live}\n aria-atomic=\"true\"\n className={cn(\"relative\", toastRootVariants({ appearance, size }), className)}\n initial={animation === \"none\" ? false : motionProps.initial}\n animate={animation === \"none\" ? undefined : motionProps.animate}\n exit={animation === \"none\" ? undefined : motionProps.exit}\n transition={motionProps.transition}\n >\n {children}\n </motion.div>\n );\n}\n\nToast.displayName = \"Toast\";\n\nexport function ToastTitle({ className, children }: ToastSectionProps) {\n return <div data-slot=\"toast-title\" className={cn(\"font-semibold\", className)}>{children}</div>;\n}\n\nToastTitle.displayName = \"ToastTitle\";\n\nexport function ToastDescription({ className, children }: ToastSectionProps) {\n return (\n <div data-slot=\"toast-description\" className={cn(\"text-sm text-slate-300\", className)}>\n {children}\n </div>\n );\n}\n\nToastDescription.displayName = \"ToastDescription\";\n\nexport function ToastAction({ className, children }: ToastSectionProps) {\n return <div data-slot=\"toast-action\" className={cn(\"mt-3\", className)}>{children}</div>;\n}\n\nToastAction.displayName = \"ToastAction\";\n\nexport function ToastClose({ className, children, onClick, ...rest }: ToastSectionProps & { onClick?: () => void }) {\n return (\n <button\n type=\"button\"\n data-slot=\"toast-close\"\n aria-label=\"Dismiss notification\"\n className={cn(\n \"absolute right-3 top-3 inline-flex size-8 items-center justify-center rounded-md text-slate-200 transition hover:bg-white/10\",\n className,\n )}\n onClick={onClick}\n {...rest}\n >\n {children ?? \"×\"}\n </button>\n );\n}\n\nToastClose.displayName = \"ToastClose\";\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}","import type { HTMLMotionProps } from \"framer-motion\";\n\nexport type ToastAnimation = \"none\" | \"slide\" | \"fade\";\n\ntype ToastPresetMotionProps = Pick<\n HTMLMotionProps<\"div\">,\n \"initial\" | \"animate\" | \"exit\" | \"transition\"\n>;\n\nexport type ToastAnimationPresets = Record<ToastAnimation, ToastPresetMotionProps>;\n\nexport const toastAnimationPresets: ToastAnimationPresets = {\n none: {},\n slide: {\n initial: { opacity: 0, x: 24 },\n animate: { opacity: 1, x: 0 },\n exit: { opacity: 0, x: 16 },\n transition: { type: \"spring\", stiffness: 380, damping: 28 },\n },\n fade: {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n exit: { opacity: 0 },\n transition: { duration: 0.18 },\n },\n};\n","import { cva } from \"class-variance-authority\";\n\nexport const toastViewportVariants = cva(\"fixed z-[60] flex max-h-screen flex-col gap-2 p-4\", {\n variants: {\n position: {\n \"top-left\": \"left-0 top-0 items-start\",\n \"top-center\": \"left-1/2 top-0 -translate-x-1/2 items-center\",\n \"top-right\": \"right-0 top-0 items-end\",\n \"bottom-left\": \"bottom-0 left-0 items-start\",\n \"bottom-center\": \"bottom-0 left-1/2 -translate-x-1/2 items-center\",\n \"bottom-right\": \"bottom-0 right-0 items-end\",\n },\n },\n defaultVariants: {\n position: \"bottom-right\",\n },\n});\n\nexport const toastRootVariants = cva(\n \"pointer-events-auto w-[min(100vw-2rem,380px)] rounded-xl border border-white/10 bg-slate-950 p-4 text-slate-50 shadow-[0_18px_48px_rgba(15,23,42,0.45)]\",\n {\n variants: {\n appearance: {\n default: \"bg-slate-950\",\n success: \"border-emerald-500/40 bg-emerald-950\",\n warning: \"border-amber-500/40 bg-amber-950\",\n error: \"border-rose-500/50 bg-rose-950\",\n info: \"border-sky-500/40 bg-sky-950\",\n ghost: \"border-transparent bg-transparent text-slate-200\",\n purple: \"border-purple-600 bg-purple-950/70 backdrop-blur-xl\",\n pink: \"border-pink-600 bg-pink-950/70 backdrop-blur-xl\",\n orange: \"border-orange-600 bg-orange-950/70 backdrop-blur-xl\",\n yellow: \"border-yellow-600 bg-yellow-950/70 backdrop-blur-xl\",\n teal: \"border-teal-600 bg-teal-950/70 backdrop-blur-xl\",\n indigo: \"border-indigo-600 bg-indigo-950/70 backdrop-blur-xl\",\n emerald: \"border-emerald-600 bg-emerald-950/70 backdrop-blur-xl\",\n gray: \"border-gray-600 bg-gray-950/70 backdrop-blur-xl\",\n amber: \"border-amber-600 bg-amber-950/70 backdrop-blur-xl\",\n violet: \"border-violet-600 bg-violet-950/70 backdrop-blur-xl\",\n \"gradient-blue\": \"border-gradient-to-r from-blue-600 to-purple-600 bg-gradient-to-r from-blue-950/70 to-purple-950/70 backdrop-blur-xl\",\n \"gradient-green\": \"border-gradient-to-r from-green-600 to-lime-600 bg-gradient-to-r from-green-950/70 to-lime-950/70 backdrop-blur-xl\",\n \"gradient-red\": \"border-gradient-to-r from-red-600 to-pink-600 bg-gradient-to-r from-red-950/70 to-pink-950/70 backdrop-blur-xl\",\n \"gradient-yellow\": \"border-gradient-to-r from-yellow-600 to-orange-600 bg-gradient-to-r from-yellow-950/70 to-orange-950/70 backdrop-blur-xl\",\n \"gradient-purple\": \"border-gradient-to-r from-purple-600 to-pink-600 bg-gradient-to-r from-purple-950/70 to-pink-950/70 backdrop-blur-xl\",\n \"gradient-teal\": \"border-gradient-to-r from-teal-600 to-cyan-600 bg-gradient-to-r from-teal-950/70 to-cyan-950/70 backdrop-blur-xl\",\n \"gradient-indigo\": \"border-gradient-to-r from-indigo-600 to-purple-600 bg-gradient-to-r from-indigo-950/70 to-purple-950/70 backdrop-blur-xl\",\n \"gradient-pink\": \"border-gradient-to-r from-pink-600 to-rose-600 bg-gradient-to-r from-pink-950/70 to-rose-950/70 backdrop-blur-xl\",\n \"gradient-orange\": \"border-gradient-to-r from-orange-600 to-red-600 bg-gradient-to-r from-orange-950/70 to-red-950/70 backdrop-blur-xl\",\n },\n size: {\n sm: \"p-3 text-xs\",\n md: \"p-4 text-sm\",\n lg: \"p-5 text-base\",\n },\n },\n defaultVariants: {\n appearance: \"default\",\n size: \"md\",\n },\n },\n);\n"],"mappings":"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","names":[]}
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/ui/toggle/index.ts
21
+ var toggle_exports = {};
22
+ __export(toggle_exports, {
23
+ Toggle: () => Toggle,
24
+ toggleThumbAnimationPresets: () => toggleThumbAnimationPresets,
25
+ toggleThumbVariants: () => toggleThumbVariants,
26
+ toggleTrackVariants: () => toggleTrackVariants
27
+ });
28
+ module.exports = __toCommonJS(toggle_exports);
29
+
30
+ // src/ui/toggle/toggle.tsx
31
+ var import_framer_motion = require("framer-motion");
32
+ var import_react = require("react");
33
+
34
+ // src/lib/utils.ts
35
+ var import_clsx = require("clsx");
36
+ var import_tailwind_merge = require("tailwind-merge");
37
+ function cn(...inputs) {
38
+ return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
39
+ }
40
+
41
+ // src/ui/toggle/animations.ts
42
+ var toggleThumbAnimationPresets = {
43
+ none: {},
44
+ spring: {
45
+ layout: true,
46
+ transition: { type: "spring", stiffness: 520, damping: 32 }
47
+ }
48
+ };
49
+
50
+ // src/ui/toggle/variants.ts
51
+ var import_class_variance_authority = require("class-variance-authority");
52
+ var toggleTrackVariants = (0, import_class_variance_authority.cva)(
53
+ "relative inline-flex shrink-0 cursor-pointer rounded-full border border-white/10 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-slate-300 focus-visible:ring-offset-2 focus-visible:ring-offset-slate-950 data-[state=checked]:border-cyan-500/40 disabled:cursor-not-allowed disabled:opacity-50",
54
+ {
55
+ variants: {
56
+ size: {
57
+ sm: "h-5 w-9",
58
+ md: "h-6 w-11",
59
+ lg: "h-7 w-[3.25rem]"
60
+ },
61
+ appearance: {
62
+ default: "data-[state=checked]:bg-cyan-600/80",
63
+ success: "data-[state=checked]:border-emerald-500/40 data-[state=checked]:bg-emerald-600/80",
64
+ destructive: "data-[state=checked]:border-rose-500/40 data-[state=checked]:bg-rose-600/80",
65
+ neutral: "data-[state=checked]:border-slate-400/40 data-[state=checked]:bg-slate-600/90",
66
+ indigo: "data-[state=checked]:border-indigo-500/40 data-[state=checked]:bg-indigo-600/80",
67
+ purple: "data-[state=checked]:border-purple-500/40 data-[state=checked]:bg-purple-600/80",
68
+ pink: "data-[state=checked]:border-pink-500/40 data-[state=checked]:bg-pink-600/80",
69
+ orange: "data-[state=checked]:border-orange-500/40 data-[state=checked]:bg-orange-600/80",
70
+ yellow: "data-[state=checked]:border-yellow-500/40 data-[state=checked]:bg-yellow-600/80",
71
+ green: "data-[state=checked]:border-green-500/40 data-[state=checked]:bg-green-600/80",
72
+ teal: "data-[state=checked]:border-teal-500/40 data-[state=checked]:bg-teal-600/80",
73
+ cyan: "data-[state=checked]:border-cyan-500/40 data-[state=checked]:bg-cyan-600/80",
74
+ lime: "data-[state=checked]:border-lime-500/40 data-[state=checked]:bg-lime-600/80",
75
+ emerald: "data-[state=checked]:border-emerald-500/40 data-[state=checked]:bg-emerald-600/80",
76
+ rose: "data-[state=checked]:border-rose-500/40 data-[state=checked]:bg-rose-600/80",
77
+ slate: "data-[state=checked]:border-slate-400/40 data-[state=checked]:bg-slate-600/90",
78
+ zinc: "data-[state=checked]:border-zinc-400/40 data-[state=checked]:bg-zinc-600/90",
79
+ gray: "data-[state=checked]:border-gray-400/40 data-[state=checked]:bg-gray-600/90",
80
+ stone: "data-[state=checked]:border-stone-400/40 data-[state=checked]:bg-stone-600/90",
81
+ "gradient-blue": "data-[state=checked]:bg-linear-to-r from-blue-600 to-purple-600",
82
+ "gradient-green": "data-[state=checked]:bg-linear-to-r from-green-600 to-lime-600",
83
+ "gradient-red": "data-[state=checked]:bg-linear-to-r from-red-600 to-pink-600",
84
+ "gradient-yellow": "data-[state=checked]:bg-linear-to-r from-yellow-600 to-orange-600",
85
+ "gradient-purple": "data-[state=checked]:bg-linear-to-r from-purple-600 to-pink-600",
86
+ "gradient-teal": "data-[state=checked]:bg-linear-to-r from-teal-600 to-cyan-600",
87
+ "gradient-indigo": "data-[state=checked]:bg-linear-to-r from-indigo-600 to-purple-600",
88
+ "gradient-pink": "data-[state=checked]:bg-linear-to-r from-pink-600 to-rose-600",
89
+ "gradient-orange": "data-[state=checked]:bg-linear-to-r from-orange-600 to-red-600"
90
+ }
91
+ },
92
+ defaultVariants: {
93
+ size: "md",
94
+ appearance: "default"
95
+ }
96
+ }
97
+ );
98
+ var toggleThumbVariants = (0, import_class_variance_authority.cva)(
99
+ "pointer-events-none block rounded-full bg-white shadow-[0_1px_2px_rgba(15,23,42,0.35)] ring-0",
100
+ {
101
+ variants: {
102
+ size: {
103
+ sm: "size-4",
104
+ md: "size-5",
105
+ lg: "size-6"
106
+ }
107
+ },
108
+ defaultVariants: {
109
+ size: "md"
110
+ }
111
+ }
112
+ );
113
+
114
+ // src/ui/toggle/toggle.tsx
115
+ var import_jsx_runtime = require("react/jsx-runtime");
116
+ function Toggle(props) {
117
+ const {
118
+ className,
119
+ size,
120
+ appearance,
121
+ animation = "spring",
122
+ checked,
123
+ defaultChecked = false,
124
+ onCheckedChange,
125
+ disabled,
126
+ ref,
127
+ "aria-label": ariaLabel = "Toggle",
128
+ children,
129
+ ...rest
130
+ } = props;
131
+ const isControlled = checked !== void 0;
132
+ const [uncontrolled, setUncontrolled] = (0, import_react.useState)(defaultChecked);
133
+ const resolved = isControlled ? Boolean(checked) : uncontrolled;
134
+ const thumbMotion = toggleThumbAnimationPresets[animation];
135
+ const setChecked = (0, import_react.useCallback)(
136
+ (next) => {
137
+ if (!isControlled) {
138
+ setUncontrolled(next);
139
+ }
140
+ onCheckedChange?.(next);
141
+ },
142
+ [isControlled, onCheckedChange]
143
+ );
144
+ const thumbShiftPx = size === "sm" ? 14 : size === "lg" ? 26 : 20;
145
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
146
+ "button",
147
+ {
148
+ ref,
149
+ type: "button",
150
+ role: "switch",
151
+ "data-slot": "toggle",
152
+ "aria-checked": resolved,
153
+ "aria-label": ariaLabel,
154
+ "data-state": resolved ? "checked" : "unchecked",
155
+ disabled,
156
+ className: cn(toggleTrackVariants({ size, appearance }), className),
157
+ onClick: () => {
158
+ if (!disabled) {
159
+ setChecked(!resolved);
160
+ }
161
+ },
162
+ ...rest,
163
+ children: [
164
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "sr-only", children }),
165
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
166
+ import_framer_motion.motion.span,
167
+ {
168
+ className: cn(toggleThumbVariants({ size }), "absolute left-1 top-1/2 -translate-y-1/2"),
169
+ animate: { x: resolved ? thumbShiftPx : 0 },
170
+ transition: thumbMotion.transition
171
+ }
172
+ )
173
+ ]
174
+ }
175
+ );
176
+ }
177
+ Toggle.displayName = "Toggle";
178
+ // Annotate the CommonJS export names for ESM import in node:
179
+ 0 && (module.exports = {
180
+ Toggle,
181
+ toggleThumbAnimationPresets,
182
+ toggleThumbVariants,
183
+ toggleTrackVariants
184
+ });
185
+ //# sourceMappingURL=toggle.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/ui/toggle/index.ts","../../src/ui/toggle/toggle.tsx","../../src/lib/utils.ts","../../src/ui/toggle/animations.ts","../../src/ui/toggle/variants.ts"],"sourcesContent":["export { Toggle } from \"./toggle\";\nexport type { ToggleAnimation, ToggleProps } from \"./types\";\nexport { toggleThumbAnimationPresets } from \"./animations\";\nexport { toggleThumbVariants, toggleTrackVariants } from \"./variants\";\n","\"use client\";\n\nimport { motion } from \"framer-motion\";\nimport { useCallback, useState } from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nimport { toggleThumbAnimationPresets } from \"./animations\";\nimport type { ToggleProps } from \"./types\";\nimport { toggleThumbVariants, toggleTrackVariants } from \"./variants\";\n\nexport function Toggle(props: ToggleProps) {\n const {\n className,\n size,\n appearance,\n animation = \"spring\",\n checked,\n defaultChecked = false,\n onCheckedChange,\n disabled,\n ref,\n \"aria-label\": ariaLabel = \"Toggle\",\n children,\n ...rest\n } = props;\n const isControlled = checked !== undefined;\n const [uncontrolled, setUncontrolled] = useState(defaultChecked);\n const resolved = isControlled ? Boolean(checked) : uncontrolled;\n const thumbMotion = toggleThumbAnimationPresets[animation];\n\n const setChecked = useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setUncontrolled(next);\n }\n onCheckedChange?.(next);\n },\n [isControlled, onCheckedChange],\n );\n\n const thumbShiftPx = size === \"sm\" ? 14 : size === \"lg\" ? 26 : 20;\n\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"switch\"\n data-slot=\"toggle\"\n aria-checked={resolved}\n aria-label={ariaLabel}\n data-state={resolved ? \"checked\" : \"unchecked\"}\n disabled={disabled}\n className={cn(toggleTrackVariants({ size, appearance }), className)}\n onClick={() => {\n if (!disabled) {\n setChecked(!resolved);\n }\n }}\n {...rest}\n >\n <span className=\"sr-only\">{children}</span>\n <motion.span\n className={cn(toggleThumbVariants({ size }), \"absolute left-1 top-1/2 -translate-y-1/2\")}\n animate={{ x: resolved ? thumbShiftPx : 0 }}\n transition={thumbMotion.transition}\n />\n </button>\n );\n}\n\nToggle.displayName = \"Toggle\";\n\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}","import type { HTMLMotionProps } from \"framer-motion\";\n\nexport type ToggleAnimation = \"none\" | \"spring\";\n\ntype ToggleThumbPreset = Pick<HTMLMotionProps<\"span\">, \"transition\" | \"layout\">;\n\nexport type ToggleAnimationPresets = Record<ToggleAnimation, ToggleThumbPreset>;\n\nexport const toggleThumbAnimationPresets: ToggleAnimationPresets = {\n none: {},\n spring: {\n layout: true,\n transition: { type: \"spring\", stiffness: 520, damping: 32 },\n },\n};\n","import { cva } from \"class-variance-authority\";\n\nexport const toggleTrackVariants = cva(\n \"relative inline-flex shrink-0 cursor-pointer rounded-full border border-white/10 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-slate-300 focus-visible:ring-offset-2 focus-visible:ring-offset-slate-950 data-[state=checked]:border-cyan-500/40 disabled:cursor-not-allowed disabled:opacity-50\",\n {\n variants: {\n size: {\n sm: \"h-5 w-9\",\n md: \"h-6 w-11\",\n lg: \"h-7 w-[3.25rem]\",\n },\n appearance: {\n default: \"data-[state=checked]:bg-cyan-600/80\",\n success: \"data-[state=checked]:border-emerald-500/40 data-[state=checked]:bg-emerald-600/80\",\n destructive: \"data-[state=checked]:border-rose-500/40 data-[state=checked]:bg-rose-600/80\",\n neutral: \"data-[state=checked]:border-slate-400/40 data-[state=checked]:bg-slate-600/90\",\n indigo: \"data-[state=checked]:border-indigo-500/40 data-[state=checked]:bg-indigo-600/80\",\n purple: \"data-[state=checked]:border-purple-500/40 data-[state=checked]:bg-purple-600/80\",\n pink: \"data-[state=checked]:border-pink-500/40 data-[state=checked]:bg-pink-600/80\",\n orange: \"data-[state=checked]:border-orange-500/40 data-[state=checked]:bg-orange-600/80\",\n yellow: \"data-[state=checked]:border-yellow-500/40 data-[state=checked]:bg-yellow-600/80\",\n green: \"data-[state=checked]:border-green-500/40 data-[state=checked]:bg-green-600/80\",\n teal: \"data-[state=checked]:border-teal-500/40 data-[state=checked]:bg-teal-600/80\",\n cyan: \"data-[state=checked]:border-cyan-500/40 data-[state=checked]:bg-cyan-600/80\",\n lime: \"data-[state=checked]:border-lime-500/40 data-[state=checked]:bg-lime-600/80\",\n emerald: \"data-[state=checked]:border-emerald-500/40 data-[state=checked]:bg-emerald-600/80\",\n rose: \"data-[state=checked]:border-rose-500/40 data-[state=checked]:bg-rose-600/80\",\n slate: \"data-[state=checked]:border-slate-400/40 data-[state=checked]:bg-slate-600/90\",\n zinc: \"data-[state=checked]:border-zinc-400/40 data-[state=checked]:bg-zinc-600/90\",\n gray: \"data-[state=checked]:border-gray-400/40 data-[state=checked]:bg-gray-600/90\",\n stone: \"data-[state=checked]:border-stone-400/40 data-[state=checked]:bg-stone-600/90\",\n \"gradient-blue\": \"data-[state=checked]:bg-linear-to-r from-blue-600 to-purple-600\",\n \"gradient-green\": \"data-[state=checked]:bg-linear-to-r from-green-600 to-lime-600\",\n \"gradient-red\": \"data-[state=checked]:bg-linear-to-r from-red-600 to-pink-600\",\n \"gradient-yellow\": \"data-[state=checked]:bg-linear-to-r from-yellow-600 to-orange-600\",\n \"gradient-purple\": \"data-[state=checked]:bg-linear-to-r from-purple-600 to-pink-600\",\n \"gradient-teal\": \"data-[state=checked]:bg-linear-to-r from-teal-600 to-cyan-600\",\n \"gradient-indigo\": \"data-[state=checked]:bg-linear-to-r from-indigo-600 to-purple-600\",\n \"gradient-pink\": \"data-[state=checked]:bg-linear-to-r from-pink-600 to-rose-600\",\n \"gradient-orange\": \"data-[state=checked]:bg-linear-to-r from-orange-600 to-red-600\",\n },\n },\n defaultVariants: {\n size: \"md\",\n appearance: \"default\",\n },\n },\n);\n\nexport const toggleThumbVariants = cva(\n \"pointer-events-none block rounded-full bg-white shadow-[0_1px_2px_rgba(15,23,42,0.35)] ring-0\",\n {\n variants: {\n size: {\n sm: \"size-4\",\n md: \"size-5\",\n lg: \"size-6\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n },\n);\n"],"mappings":"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","names":[]}
@@ -0,0 +1,37 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { VariantProps } from 'class-variance-authority';
3
+ import { ButtonHTMLAttributes, ReactNode, Ref } from 'react';
4
+ import { HTMLMotionProps } from 'framer-motion';
5
+ import * as class_variance_authority_types from 'class-variance-authority/types';
6
+
7
+ type ToggleAnimation = "none" | "spring";
8
+ type ToggleThumbPreset = Pick<HTMLMotionProps<"span">, "transition" | "layout">;
9
+ type ToggleAnimationPresets = Record<ToggleAnimation, ToggleThumbPreset>;
10
+ declare const toggleThumbAnimationPresets: ToggleAnimationPresets;
11
+
12
+ declare const toggleTrackVariants: (props?: ({
13
+ size?: "sm" | "md" | "lg" | null | undefined;
14
+ appearance?: "default" | "rose" | "purple" | "pink" | "orange" | "yellow" | "teal" | "indigo" | "emerald" | "gradient-blue" | "gradient-green" | "gradient-red" | "gradient-yellow" | "gradient-purple" | "gradient-teal" | "gradient-indigo" | "gradient-pink" | "gradient-orange" | "success" | "gray" | "destructive" | "cyan" | "green" | "lime" | "neutral" | "slate" | "zinc" | "stone" | null | undefined;
15
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
16
+ declare const toggleThumbVariants: (props?: ({
17
+ size?: "sm" | "md" | "lg" | null | undefined;
18
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
19
+
20
+ type ToggleTrackVariantProps = VariantProps<typeof toggleTrackVariants>;
21
+ type ToggleThumbVariantProps = VariantProps<typeof toggleThumbVariants>;
22
+ type ToggleProps = ToggleTrackVariantProps & ToggleThumbVariantProps & Omit<ButtonHTMLAttributes<HTMLButtonElement>, "type" | "role" | "ref"> & {
23
+ animation?: ToggleAnimation;
24
+ checked?: boolean;
25
+ defaultChecked?: boolean;
26
+ onCheckedChange?: (checked: boolean) => void;
27
+ "aria-label"?: string;
28
+ children?: ReactNode;
29
+ ref?: Ref<HTMLButtonElement>;
30
+ };
31
+
32
+ declare function Toggle(props: ToggleProps): react_jsx_runtime.JSX.Element;
33
+ declare namespace Toggle {
34
+ var displayName: string;
35
+ }
36
+
37
+ export { Toggle, type ToggleAnimation, type ToggleProps, toggleThumbAnimationPresets, toggleThumbVariants, toggleTrackVariants };
@@ -0,0 +1,37 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { VariantProps } from 'class-variance-authority';
3
+ import { ButtonHTMLAttributes, ReactNode, Ref } from 'react';
4
+ import { HTMLMotionProps } from 'framer-motion';
5
+ import * as class_variance_authority_types from 'class-variance-authority/types';
6
+
7
+ type ToggleAnimation = "none" | "spring";
8
+ type ToggleThumbPreset = Pick<HTMLMotionProps<"span">, "transition" | "layout">;
9
+ type ToggleAnimationPresets = Record<ToggleAnimation, ToggleThumbPreset>;
10
+ declare const toggleThumbAnimationPresets: ToggleAnimationPresets;
11
+
12
+ declare const toggleTrackVariants: (props?: ({
13
+ size?: "sm" | "md" | "lg" | null | undefined;
14
+ appearance?: "default" | "rose" | "purple" | "pink" | "orange" | "yellow" | "teal" | "indigo" | "emerald" | "gradient-blue" | "gradient-green" | "gradient-red" | "gradient-yellow" | "gradient-purple" | "gradient-teal" | "gradient-indigo" | "gradient-pink" | "gradient-orange" | "success" | "gray" | "destructive" | "cyan" | "green" | "lime" | "neutral" | "slate" | "zinc" | "stone" | null | undefined;
15
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
16
+ declare const toggleThumbVariants: (props?: ({
17
+ size?: "sm" | "md" | "lg" | null | undefined;
18
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
19
+
20
+ type ToggleTrackVariantProps = VariantProps<typeof toggleTrackVariants>;
21
+ type ToggleThumbVariantProps = VariantProps<typeof toggleThumbVariants>;
22
+ type ToggleProps = ToggleTrackVariantProps & ToggleThumbVariantProps & Omit<ButtonHTMLAttributes<HTMLButtonElement>, "type" | "role" | "ref"> & {
23
+ animation?: ToggleAnimation;
24
+ checked?: boolean;
25
+ defaultChecked?: boolean;
26
+ onCheckedChange?: (checked: boolean) => void;
27
+ "aria-label"?: string;
28
+ children?: ReactNode;
29
+ ref?: Ref<HTMLButtonElement>;
30
+ };
31
+
32
+ declare function Toggle(props: ToggleProps): react_jsx_runtime.JSX.Element;
33
+ declare namespace Toggle {
34
+ var displayName: string;
35
+ }
36
+
37
+ export { Toggle, type ToggleAnimation, type ToggleProps, toggleThumbAnimationPresets, toggleThumbVariants, toggleTrackVariants };