@pos-360/horizon 0.1.0 → 0.2.1

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.
@@ -0,0 +1,995 @@
1
+ 'use strict';
2
+
3
+ var chunkTMZLQK74_js = require('./chunk-TMZLQK74.js');
4
+ var framerMotion = require('framer-motion');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+ var React = require('react');
7
+ var lucideReact = require('lucide-react');
8
+
9
+ function _interopNamespace(e) {
10
+ if (e && e.__esModule) return e;
11
+ var n = Object.create(null);
12
+ if (e) {
13
+ Object.keys(e).forEach(function (k) {
14
+ if (k !== 'default') {
15
+ var d = Object.getOwnPropertyDescriptor(e, k);
16
+ Object.defineProperty(n, k, d.get ? d : {
17
+ enumerable: true,
18
+ get: function () { return e[k]; }
19
+ });
20
+ }
21
+ });
22
+ }
23
+ n.default = e;
24
+ return Object.freeze(n);
25
+ }
26
+
27
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
28
+
29
+ var AnimatedButton = ({
30
+ label,
31
+ variant = "primary",
32
+ buttonContainerClassName,
33
+ buttonTextClassName,
34
+ onClick
35
+ }) => {
36
+ const handleOnClick = () => {
37
+ onClick?.();
38
+ };
39
+ const baseButtonClass = "text-xs tracking-wider font-medium";
40
+ const variantButtonClass = `${variant === "outlined" ? "border border-1 bg-white" : "bg-[#0F62FE]"}`;
41
+ return /* @__PURE__ */ jsxRuntime.jsx(
42
+ framerMotion.motion.button,
43
+ {
44
+ whileHover: {
45
+ scale: variant === "primary" ? 1.025 : 1,
46
+ boxShadow: variant === "primary" ? "0 0 4px rgba(15, 96, 254, 0.4), 0 0 16px rgba(15, 96, 254, 0.2)" : ""
47
+ },
48
+ whileTap: { scale: variant === "primary" ? 0.98 : 1 },
49
+ onClick: handleOnClick,
50
+ className: `w-fit p-2 px-4 ${variantButtonClass} ${buttonContainerClassName}`,
51
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${baseButtonClass} ${buttonTextClassName}`, children: label.toUpperCase() })
52
+ }
53
+ );
54
+ };
55
+ var Input = React.forwardRef(
56
+ ({
57
+ label,
58
+ placeholder,
59
+ value,
60
+ onChange,
61
+ onNumberChange,
62
+ onSelectChange,
63
+ onFocus,
64
+ onBlur,
65
+ type = "text",
66
+ disabled = false,
67
+ required = false,
68
+ error,
69
+ helperText,
70
+ leadingIcon,
71
+ trailingIcon,
72
+ leadingDecorator,
73
+ trailingDecorator,
74
+ onLeadingClick,
75
+ onTrailingClick,
76
+ size = "md",
77
+ variant = "default",
78
+ className = "",
79
+ min,
80
+ max,
81
+ step = 1,
82
+ precision = 0,
83
+ allowNegative = true,
84
+ showControls = false,
85
+ options = [],
86
+ autoComplete,
87
+ readOnly = false,
88
+ tabIndex = 0,
89
+ tooltip,
90
+ ...props
91
+ }, ref) => {
92
+ const [showTooltip, setShowTooltip] = React.useState(false);
93
+ const isNumberType = type === "number";
94
+ const isSelectType = type === "select";
95
+ const isMobileType = type === "mobile";
96
+ const [inputValue, setInputValue] = React.useState(
97
+ value !== void 0 ? value.toString() : ""
98
+ );
99
+ React.useEffect(() => {
100
+ if (value !== void 0) {
101
+ setInputValue(value.toString());
102
+ }
103
+ }, [value]);
104
+ const formatNumber = (num) => {
105
+ if (precision > 0) {
106
+ return parseFloat(num.toFixed(precision));
107
+ }
108
+ return Math.round(num);
109
+ };
110
+ const isValidNumber = (str) => {
111
+ if (str === "" || str === "-") return true;
112
+ const num = parseFloat(str);
113
+ if (isNaN(num)) return false;
114
+ if (!allowNegative && num < 0) return false;
115
+ if (min !== void 0 && num < min) return false;
116
+ if (max !== void 0 && num > max) return false;
117
+ return true;
118
+ };
119
+ const handleInputChange = (e) => {
120
+ if (isMobileType) {
121
+ const digits = (e.target.value || "").replace(/\D/g, "").slice(0, 10);
122
+ onChange?.({
123
+ target: { value: digits }
124
+ });
125
+ return;
126
+ }
127
+ if (isNumberType && onNumberChange) {
128
+ const newValue = e.target.value;
129
+ if (newValue === "" || allowNegative && newValue === "-") {
130
+ setInputValue(newValue);
131
+ return;
132
+ }
133
+ if (isValidNumber(newValue)) {
134
+ setInputValue(newValue);
135
+ const numValue = parseFloat(newValue);
136
+ if (!isNaN(numValue)) {
137
+ onNumberChange(formatNumber(numValue));
138
+ }
139
+ }
140
+ } else {
141
+ onChange?.(e);
142
+ }
143
+ };
144
+ const handleSelectChange = (e) => {
145
+ onSelectChange?.(e.target.value);
146
+ };
147
+ const handleIncrement = () => {
148
+ if (disabled || !isNumberType) return;
149
+ const currentNum = parseFloat(inputValue) || 0;
150
+ const newValue = currentNum + step;
151
+ const constrainedValue = max !== void 0 ? Math.min(newValue, max) : newValue;
152
+ const finalValue = formatNumber(constrainedValue);
153
+ setInputValue(finalValue.toString());
154
+ onNumberChange?.(finalValue);
155
+ };
156
+ const handleDecrement = () => {
157
+ if (disabled || !isNumberType) return;
158
+ const currentNum = parseFloat(inputValue) || 0;
159
+ const newValue = currentNum - step;
160
+ const constrainedValue = min !== void 0 ? Math.max(newValue, min) : newValue;
161
+ const finalValue = formatNumber(constrainedValue);
162
+ setInputValue(finalValue.toString());
163
+ onNumberChange?.(finalValue);
164
+ };
165
+ const handleBlur = (e) => {
166
+ if (isNumberType && onNumberChange) {
167
+ if (inputValue !== "" && inputValue !== "-") {
168
+ const numValue = parseFloat(inputValue);
169
+ if (!isNaN(numValue)) {
170
+ const cleanValue = formatNumber(numValue);
171
+ setInputValue(cleanValue.toString());
172
+ onNumberChange(cleanValue);
173
+ }
174
+ } else if (inputValue === "" || inputValue === "-") {
175
+ setInputValue("");
176
+ }
177
+ }
178
+ onBlur?.(e);
179
+ };
180
+ const baseInputStyles = "w-full transition-colors focus:outline-none min-h-[52px]";
181
+ const sizeStyles = {
182
+ sm: "px-3 py-2 text-sm",
183
+ md: "px-4 py-3 text-base",
184
+ lg: "px-5 py-4 text-lg"
185
+ };
186
+ const controlSizeStyles = {
187
+ sm: "w-6 h-5",
188
+ md: "w-8 h-6",
189
+ lg: "w-10 h-8"
190
+ };
191
+ const iconSizeStyles = {
192
+ sm: 12,
193
+ md: 16,
194
+ lg: 20
195
+ };
196
+ const variantStyles = {
197
+ default: "border bg-white/60 dark:bg-neutral-800/60 backdrop-blur-sm transition-colors duration-300 rounded-lg",
198
+ filled: "border-0 bg-neutral-50/60 dark:bg-neutral-700/60 backdrop-blur-sm transition-colors duration-300 rounded-lg"
199
+ };
200
+ const stateStyles = error ? "border-rose-500/50 dark:border-rose-400/50 focus:border-rose-600/70 dark:focus:border-rose-500/70 focus:ring-1 focus:ring-rose-500/50 dark:focus:ring-rose-400/50" : "border-neutral-300/50 dark:border-neutral-600/50 focus:border-blue-500/70 dark:focus:border-blue-400/70 focus:ring-1 focus:ring-blue-500/50 dark:focus:ring-blue-400/50";
201
+ const disabledStyles = disabled ? "bg-neutral-100/60 dark:bg-neutral-700/60 text-neutral-500 dark:text-neutral-400 cursor-not-allowed" : "text-neutral-900 dark:text-neutral-100";
202
+ const hasControls = isNumberType && showControls;
203
+ const hasLeadingContent = leadingIcon || leadingDecorator;
204
+ const hasTrailingContent = trailingIcon || trailingDecorator || hasControls;
205
+ const inputClasses = `
206
+ ${baseInputStyles}
207
+ ${sizeStyles[size]}
208
+ ${variantStyles[variant]}
209
+ ${stateStyles}
210
+ ${disabledStyles}
211
+ ${hasLeadingContent || isMobileType ? "pl-10" : ""}
212
+ ${hasTrailingContent ? hasControls ? "pr-20" : "pr-10" : ""}
213
+ ${className}
214
+ `.trim().replace(/\s+/g, " ");
215
+ const selectClasses = `
216
+ ${baseInputStyles}
217
+ ${sizeStyles[size]}
218
+ ${variantStyles[variant]}
219
+ ${stateStyles}
220
+ ${disabledStyles}
221
+ ${hasLeadingContent ? "pl-10" : ""}
222
+ ${hasTrailingContent ? "pr-10" : ""}
223
+ ${className}
224
+ appearance-none cursor-pointer
225
+ `.trim().replace(/\s+/g, " ");
226
+ const canDecrement = !disabled && (min === void 0 || (parseFloat(inputValue) || 0) > min);
227
+ const canIncrement = !disabled && (max === void 0 || (parseFloat(inputValue) || 0) < max);
228
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full", children: [
229
+ label && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative mb-2", children: [
230
+ /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "text-sm font-medium text-neutral-700 dark:text-neutral-300 transition-colors duration-300 flex items-center", children: [
231
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs sm:text-sm", children: label }),
232
+ required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-rose-500 ml-1", children: "*" }),
233
+ tooltip && /* @__PURE__ */ jsxRuntime.jsx(
234
+ "button",
235
+ {
236
+ type: "button",
237
+ className: "ml-2 text-neutral-400 dark:text-neutral-500 hover:text-neutral-600 dark:hover:text-neutral-300 transition-colors duration-300",
238
+ onMouseEnter: () => setShowTooltip(true),
239
+ onMouseLeave: () => setShowTooltip(false),
240
+ onFocus: () => setShowTooltip(true),
241
+ onBlur: () => setShowTooltip(false),
242
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Info, { className: "w-4 h-4" })
243
+ }
244
+ )
245
+ ] }),
246
+ tooltip && showTooltip && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute z-[9999] pointer-events-none left-0 bottom-full mt-2", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "bg-neutral-900/80 dark:bg-neutral-100/80 backdrop-blur-md text-white dark:text-neutral-900 text-sm rounded-xl p-3 shadow-lg w-80 transition-colors duration-300", children: tooltip.content }) })
247
+ ] }),
248
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
249
+ hasLeadingContent && /* @__PURE__ */ jsxRuntime.jsx(
250
+ "div",
251
+ {
252
+ className: `absolute inset-y-0 left-0 pl-3 flex items-center ${onLeadingClick ? "cursor-pointer" : "pointer-events-none"}`,
253
+ onClick: onLeadingClick,
254
+ children: leadingDecorator ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-neutral-400", children: leadingDecorator }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-neutral-400", children: leadingIcon })
255
+ }
256
+ ),
257
+ isMobileType && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-y-0 left-0 pl-3 flex items-center z-10 pointer-events-none border-r pr-3 border-neutral-300/50 dark:border-neutral-600/50", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-neutral-500 dark:text-neutral-300", children: "+1" }) }),
258
+ isSelectType ? /* @__PURE__ */ jsxRuntime.jsxs(
259
+ "select",
260
+ {
261
+ ref,
262
+ value,
263
+ onChange: handleSelectChange,
264
+ onFocus,
265
+ onBlur,
266
+ disabled,
267
+ required,
268
+ className: selectClasses,
269
+ ...props,
270
+ children: [
271
+ placeholder && /* @__PURE__ */ jsxRuntime.jsx("option", { value: "", disabled: true, children: placeholder }),
272
+ options.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
273
+ "option",
274
+ {
275
+ value: option.value,
276
+ disabled: option.disabled,
277
+ children: option.label
278
+ },
279
+ option.value
280
+ ))
281
+ ]
282
+ }
283
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
284
+ "input",
285
+ {
286
+ ref,
287
+ type: isMobileType ? "tel" : isNumberType ? "text" : type,
288
+ inputMode: isMobileType ? "numeric" : isNumberType ? "numeric" : void 0,
289
+ value: isNumberType && onNumberChange ? inputValue : value,
290
+ onChange: handleInputChange,
291
+ onFocus,
292
+ onBlur: isNumberType && onNumberChange ? handleBlur : onBlur,
293
+ placeholder,
294
+ disabled,
295
+ required,
296
+ autoComplete: isMobileType ? autoComplete ?? "tel" : autoComplete,
297
+ className: inputClasses,
298
+ readOnly,
299
+ tabIndex,
300
+ ...props
301
+ }
302
+ ),
303
+ hasControls && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-y-0 right-0 flex items-center pr-1", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex", children: [
304
+ /* @__PURE__ */ jsxRuntime.jsx(
305
+ "button",
306
+ {
307
+ type: "button",
308
+ onClick: handleDecrement,
309
+ disabled: !canDecrement,
310
+ className: `
311
+ ${controlSizeStyles[size]}
312
+ flex items-center justify-center
313
+ text-neutral-500 hover:text-neutral-700 hover:bg-neutral-100
314
+ disabled:text-neutral-300 disabled:cursor-not-allowed
315
+ transition-colors
316
+ border-r border-neutral-300
317
+ `,
318
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { size: iconSizeStyles[size] })
319
+ }
320
+ ),
321
+ /* @__PURE__ */ jsxRuntime.jsx(
322
+ "button",
323
+ {
324
+ type: "button",
325
+ onClick: handleIncrement,
326
+ disabled: !canIncrement,
327
+ className: `
328
+ ${controlSizeStyles[size]}
329
+ flex items-center justify-center
330
+ text-neutral-500 hover:text-neutral-700 hover:bg-neutral-100
331
+ disabled:text-neutral-300 disabled:cursor-not-allowed
332
+ transition-colors
333
+ `,
334
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUp, { size: iconSizeStyles[size] })
335
+ }
336
+ )
337
+ ] }) }),
338
+ isSelectType && !trailingIcon && !trailingDecorator && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-y-0 right-0 pr-3 flex items-center pointer-events-none", children: /* @__PURE__ */ jsxRuntime.jsx(
339
+ lucideReact.ChevronDown,
340
+ {
341
+ size: iconSizeStyles[size],
342
+ className: "text-neutral-400"
343
+ }
344
+ ) }),
345
+ (trailingIcon || trailingDecorator) && !hasControls && /* @__PURE__ */ jsxRuntime.jsx(
346
+ "div",
347
+ {
348
+ className: `absolute top-1/2 -translate-y-1/3 right-0 pr-3 flex items-center ${onTrailingClick ? "cursor-pointer" : ""}`,
349
+ onClick: onTrailingClick,
350
+ onMouseEnter: tooltip ? () => setShowTooltip(true) : void 0,
351
+ onMouseLeave: tooltip ? () => setShowTooltip(false) : void 0,
352
+ onFocus: tooltip ? () => setShowTooltip(true) : void 0,
353
+ onBlur: tooltip ? () => setShowTooltip(false) : void 0,
354
+ children: trailingDecorator ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-neutral-400", children: trailingDecorator }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-neutral-400", children: trailingIcon })
355
+ }
356
+ )
357
+ ] }),
358
+ (error || helperText) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2", children: [
359
+ error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-rose-600 dark:text-rose-400 transition-colors duration-300", children: error }),
360
+ helperText && !error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-neutral-500 dark:text-neutral-400 transition-colors duration-300", children: helperText })
361
+ ] })
362
+ ] });
363
+ }
364
+ );
365
+ Input.displayName = "Input";
366
+ var accentColors = {
367
+ blue: {
368
+ selected: "bg-blue-100/80 dark:bg-blue-900/30",
369
+ selectedBorder: "border-blue-500 dark:border-blue-400",
370
+ selectedGlow: "shadow-lg shadow-blue-500/20 dark:shadow-blue-400/20",
371
+ hoverBg: "group-hover:bg-blue-50/60 dark:group-hover:bg-blue-900/20",
372
+ hoverBgDark: "hover:bg-blue-50 dark:hover:bg-blue-900/30",
373
+ iconSelected: "text-blue-600 dark:text-blue-400",
374
+ iconHover: "group-hover:text-blue-500 dark:group-hover:text-blue-400",
375
+ checkBg: "bg-blue-500 border-blue-500 dark:bg-blue-400 dark:border-blue-400",
376
+ inputBorder: "border-blue-500 dark:border-blue-400",
377
+ inputRing: "focus:ring-blue-500/20",
378
+ textHover: "hover:text-blue-600 dark:hover:text-blue-400",
379
+ toggleActive: "text-blue-600 dark:text-blue-400"
380
+ },
381
+ violet: {
382
+ selected: "bg-violet-100/80 dark:bg-violet-900/30",
383
+ selectedBorder: "border-violet-500 dark:border-violet-400",
384
+ selectedGlow: "shadow-lg shadow-violet-500/20 dark:shadow-violet-400/20",
385
+ hoverBg: "group-hover:bg-violet-50/60 dark:group-hover:bg-violet-900/20",
386
+ hoverBgDark: "hover:bg-violet-50 dark:hover:bg-violet-900/30",
387
+ iconSelected: "text-violet-600 dark:text-violet-400",
388
+ iconHover: "group-hover:text-violet-500 dark:group-hover:text-violet-400",
389
+ checkBg: "bg-violet-500 border-violet-500 dark:bg-violet-400 dark:border-violet-400",
390
+ inputBorder: "border-violet-500 dark:border-violet-400",
391
+ inputRing: "focus:ring-violet-500/20",
392
+ textHover: "hover:text-violet-600 dark:hover:text-violet-400",
393
+ toggleActive: "text-violet-600 dark:text-violet-400"
394
+ },
395
+ emerald: {
396
+ selected: "bg-emerald-100/80 dark:bg-emerald-900/30",
397
+ selectedBorder: "border-emerald-500 dark:border-emerald-400",
398
+ selectedGlow: "shadow-lg shadow-emerald-500/20 dark:shadow-emerald-400/20",
399
+ hoverBg: "group-hover:bg-emerald-50/60 dark:group-hover:bg-emerald-900/20",
400
+ hoverBgDark: "hover:bg-emerald-50 dark:hover:bg-emerald-900/30",
401
+ iconSelected: "text-emerald-600 dark:text-emerald-400",
402
+ iconHover: "group-hover:text-emerald-500 dark:group-hover:text-emerald-400",
403
+ checkBg: "bg-emerald-500 border-emerald-500 dark:bg-emerald-400 dark:border-emerald-400",
404
+ inputBorder: "border-emerald-500 dark:border-emerald-400",
405
+ inputRing: "focus:ring-emerald-500/20",
406
+ textHover: "hover:text-emerald-600 dark:hover:text-emerald-400",
407
+ toggleActive: "text-emerald-600 dark:text-emerald-400"
408
+ },
409
+ rose: {
410
+ selected: "bg-rose-100/80 dark:bg-rose-900/30",
411
+ selectedBorder: "border-rose-500 dark:border-rose-400",
412
+ selectedGlow: "shadow-lg shadow-rose-500/20 dark:shadow-rose-400/20",
413
+ hoverBg: "group-hover:bg-rose-50/60 dark:group-hover:bg-rose-900/20",
414
+ hoverBgDark: "hover:bg-rose-50 dark:hover:bg-rose-900/30",
415
+ iconSelected: "text-rose-600 dark:text-rose-400",
416
+ iconHover: "group-hover:text-rose-500 dark:group-hover:text-rose-400",
417
+ checkBg: "bg-rose-500 border-rose-500 dark:bg-rose-400 dark:border-rose-400",
418
+ inputBorder: "border-rose-500 dark:border-rose-400",
419
+ inputRing: "focus:ring-rose-500/20",
420
+ textHover: "hover:text-rose-600 dark:hover:text-rose-400",
421
+ toggleActive: "text-rose-600 dark:text-rose-400"
422
+ },
423
+ amber: {
424
+ selected: "bg-amber-100/80 dark:bg-amber-900/30",
425
+ selectedBorder: "border-amber-500 dark:border-amber-400",
426
+ selectedGlow: "shadow-lg shadow-amber-500/20 dark:shadow-amber-400/20",
427
+ hoverBg: "group-hover:bg-amber-50/60 dark:group-hover:bg-amber-900/20",
428
+ hoverBgDark: "hover:bg-amber-50 dark:hover:bg-amber-900/30",
429
+ iconSelected: "text-amber-600 dark:text-amber-400",
430
+ iconHover: "group-hover:text-amber-500 dark:group-hover:text-amber-400",
431
+ checkBg: "bg-amber-500 border-amber-500 dark:bg-amber-400 dark:border-amber-400",
432
+ inputBorder: "border-amber-500 dark:border-amber-400",
433
+ inputRing: "focus:ring-amber-500/20",
434
+ textHover: "hover:text-amber-600 dark:hover:text-amber-400",
435
+ toggleActive: "text-amber-600 dark:text-amber-400"
436
+ }
437
+ };
438
+ var defaultIconMap = {
439
+ nebula: lucideReact.Sparkles,
440
+ andromeda: lucideReact.Orbit,
441
+ cosmos: lucideReact.Globe,
442
+ stellar: lucideReact.Star,
443
+ voyager: lucideReact.Rocket,
444
+ eclipse: lucideReact.Moon
445
+ };
446
+ var getTemplateIcon = (template) => {
447
+ if (template.icon) return template.icon;
448
+ const key = template.title.toLowerCase();
449
+ return defaultIconMap[key] || lucideReact.Star;
450
+ };
451
+ var TemplateSelector = ({
452
+ templates,
453
+ value,
454
+ onChange,
455
+ onNameChange,
456
+ defaultView = "card",
457
+ showViewToggle = true,
458
+ editable = false,
459
+ className,
460
+ cardClassName,
461
+ columns = 3,
462
+ accentColor = "blue"
463
+ }) => {
464
+ const colors = accentColors[accentColor];
465
+ const [view, setView] = React.useState(defaultView);
466
+ const [selectedId, setSelectedId] = React.useState(value);
467
+ React__namespace.useEffect(() => {
468
+ setSelectedId(value);
469
+ }, [value]);
470
+ const handleSelect = (templateId) => {
471
+ setSelectedId(templateId);
472
+ onChange?.(templateId);
473
+ };
474
+ const handlePreviewClick = (e, previewUrl) => {
475
+ e.stopPropagation();
476
+ window.open(previewUrl, "_blank", "noopener,noreferrer");
477
+ };
478
+ const handleNameChange = (templateId, newName) => {
479
+ onNameChange?.(templateId, newName);
480
+ };
481
+ const columnClasses = {
482
+ 2: "grid-cols-1 sm:grid-cols-2",
483
+ 3: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3",
484
+ 4: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4"
485
+ };
486
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunkTMZLQK74_js.cn("w-full", className), children: [
487
+ showViewToggle && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-end mb-4", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "inline-flex rounded-lg border border-neutral-200 dark:border-neutral-700 p-1 bg-neutral-100 dark:bg-neutral-800", children: [
488
+ /* @__PURE__ */ jsxRuntime.jsx(
489
+ "button",
490
+ {
491
+ type: "button",
492
+ onClick: () => setView("card"),
493
+ className: chunkTMZLQK74_js.cn(
494
+ "p-2 rounded-md text-sm font-medium transition-all duration-200",
495
+ view === "card" ? `bg-white dark:bg-neutral-700 shadow-sm ${colors.toggleActive}` : "text-neutral-500 dark:text-neutral-400 hover:text-neutral-700 dark:hover:text-neutral-300"
496
+ ),
497
+ "aria-label": "Card view",
498
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.LayoutGrid, { size: 16 })
499
+ }
500
+ ),
501
+ /* @__PURE__ */ jsxRuntime.jsx(
502
+ "button",
503
+ {
504
+ type: "button",
505
+ onClick: () => setView("list"),
506
+ className: chunkTMZLQK74_js.cn(
507
+ "p-2 rounded-md text-sm font-medium transition-all duration-200",
508
+ view === "list" ? `bg-white dark:bg-neutral-700 shadow-sm ${colors.toggleActive}` : "text-neutral-500 dark:text-neutral-400 hover:text-neutral-700 dark:hover:text-neutral-300"
509
+ ),
510
+ "aria-label": "List view",
511
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.List, { size: 16 })
512
+ }
513
+ )
514
+ ] }) }),
515
+ /* @__PURE__ */ jsxRuntime.jsx(framerMotion.AnimatePresence, { mode: "wait", children: view === "card" ? /* @__PURE__ */ jsxRuntime.jsx(
516
+ framerMotion.motion.div,
517
+ {
518
+ initial: { opacity: 0, y: 10 },
519
+ animate: { opacity: 1, y: 0 },
520
+ exit: { opacity: 0, y: -10 },
521
+ transition: { duration: 0.2 },
522
+ className: chunkTMZLQK74_js.cn("grid gap-4", columnClasses[columns]),
523
+ children: templates.map((template) => /* @__PURE__ */ jsxRuntime.jsx(
524
+ TemplateCard,
525
+ {
526
+ template,
527
+ isSelected: selectedId === template.id,
528
+ onSelect: handleSelect,
529
+ onPreviewClick: handlePreviewClick,
530
+ onNameChange: handleNameChange,
531
+ editable,
532
+ className: cardClassName,
533
+ colors
534
+ },
535
+ template.id
536
+ ))
537
+ },
538
+ "card-view"
539
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
540
+ framerMotion.motion.div,
541
+ {
542
+ initial: { opacity: 0, y: 10 },
543
+ animate: { opacity: 1, y: 0 },
544
+ exit: { opacity: 0, y: -10 },
545
+ transition: { duration: 0.2 },
546
+ className: "flex flex-col gap-2",
547
+ children: templates.map((template) => /* @__PURE__ */ jsxRuntime.jsx(
548
+ TemplateListItem,
549
+ {
550
+ template,
551
+ isSelected: selectedId === template.id,
552
+ onSelect: handleSelect,
553
+ onPreviewClick: handlePreviewClick,
554
+ onNameChange: handleNameChange,
555
+ editable,
556
+ colors
557
+ },
558
+ template.id
559
+ ))
560
+ },
561
+ "list-view"
562
+ ) })
563
+ ] });
564
+ };
565
+ var TemplateCard = ({
566
+ template,
567
+ isSelected,
568
+ onSelect,
569
+ onPreviewClick,
570
+ onNameChange,
571
+ editable,
572
+ className,
573
+ colors
574
+ }) => {
575
+ const [isEditing, setIsEditing] = React.useState(false);
576
+ const [editValue, setEditValue] = React.useState(template.name || template.title);
577
+ const inputRef = React__namespace.useRef(null);
578
+ const displayName = template.name || template.title;
579
+ const IconComponent = getTemplateIcon(template);
580
+ const handleDoubleClick = (e) => {
581
+ if (editable) {
582
+ e.stopPropagation();
583
+ setIsEditing(true);
584
+ setEditValue(displayName);
585
+ }
586
+ };
587
+ const handleBlur = () => {
588
+ setIsEditing(false);
589
+ if (editValue.trim() && editValue !== displayName) {
590
+ onNameChange(template.id, editValue.trim());
591
+ }
592
+ };
593
+ const handleKeyDown = (e) => {
594
+ if (e.key === "Enter") {
595
+ handleBlur();
596
+ } else if (e.key === "Escape") {
597
+ setIsEditing(false);
598
+ setEditValue(displayName);
599
+ }
600
+ };
601
+ React__namespace.useEffect(() => {
602
+ if (isEditing && inputRef.current) {
603
+ inputRef.current.focus();
604
+ inputRef.current.select();
605
+ }
606
+ }, [isEditing]);
607
+ return /* @__PURE__ */ jsxRuntime.jsxs(
608
+ framerMotion.motion.div,
609
+ {
610
+ whileHover: { y: -4, scale: 1.02 },
611
+ whileTap: { scale: 0.98 },
612
+ transition: { type: "spring", stiffness: 400, damping: 25 },
613
+ onClick: () => onSelect(template.id),
614
+ className: chunkTMZLQK74_js.cn(
615
+ "group relative cursor-pointer rounded-xl overflow-hidden border-2 transition-all duration-300",
616
+ "bg-white dark:bg-neutral-800",
617
+ isSelected ? `${colors.selectedBorder} ${colors.selectedGlow}` : "border-neutral-200 dark:border-neutral-700 hover:border-neutral-300 dark:hover:border-neutral-600 hover:shadow-md",
618
+ className
619
+ ),
620
+ children: [
621
+ /* @__PURE__ */ jsxRuntime.jsx(
622
+ "div",
623
+ {
624
+ className: chunkTMZLQK74_js.cn(
625
+ "absolute top-3 left-3 z-10 w-5 h-5 rounded-full border-2 flex items-center justify-center transition-all duration-200",
626
+ isSelected ? colors.checkBg : "bg-white dark:bg-neutral-800 border-neutral-300 dark:border-neutral-600"
627
+ ),
628
+ children: isSelected && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { size: 12, className: "text-white", strokeWidth: 3 })
629
+ }
630
+ ),
631
+ /* @__PURE__ */ jsxRuntime.jsx(
632
+ "button",
633
+ {
634
+ type: "button",
635
+ onClick: (e) => onPreviewClick(e, template.previewUrl),
636
+ className: chunkTMZLQK74_js.cn(
637
+ "absolute top-3 right-3 z-10 p-1.5 rounded-lg transition-all duration-200",
638
+ "bg-white dark:bg-neutral-700",
639
+ "border border-neutral-200 dark:border-neutral-600",
640
+ "text-neutral-500 dark:text-neutral-400",
641
+ "opacity-0 group-hover:opacity-100",
642
+ "hover:bg-blue-50 dark:hover:bg-blue-900/30 hover:text-blue-600 dark:hover:text-blue-400 hover:border-blue-300 dark:hover:border-blue-600"
643
+ ),
644
+ "aria-label": `Preview ${displayName}`,
645
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ExternalLink, { size: 14 })
646
+ }
647
+ ),
648
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "aspect-[4/3] overflow-hidden bg-neutral-50 dark:bg-neutral-800/80 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
649
+ framerMotion.motion.div,
650
+ {
651
+ initial: { scale: 0.9, opacity: 0.5 },
652
+ animate: { scale: 1, opacity: 1 },
653
+ className: chunkTMZLQK74_js.cn(
654
+ "p-6 rounded-full transition-all duration-300",
655
+ isSelected ? colors.selected : `bg-neutral-100 dark:bg-neutral-700/50 ${colors.hoverBg}`
656
+ ),
657
+ children: /* @__PURE__ */ jsxRuntime.jsx(
658
+ IconComponent,
659
+ {
660
+ size: 48,
661
+ strokeWidth: 1.5,
662
+ className: chunkTMZLQK74_js.cn(
663
+ "transition-colors duration-300",
664
+ isSelected ? colors.iconSelected : `text-neutral-400 dark:text-neutral-500 ${colors.iconHover}`
665
+ )
666
+ }
667
+ )
668
+ }
669
+ ) }),
670
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "p-3 border-t border-neutral-100 dark:border-neutral-700", children: isEditing ? /* @__PURE__ */ jsxRuntime.jsx(
671
+ "input",
672
+ {
673
+ ref: inputRef,
674
+ type: "text",
675
+ value: editValue,
676
+ onChange: (e) => setEditValue(e.target.value),
677
+ onBlur: handleBlur,
678
+ onKeyDown: handleKeyDown,
679
+ onClick: (e) => e.stopPropagation(),
680
+ className: chunkTMZLQK74_js.cn(
681
+ "w-full px-2 py-1 text-sm font-medium rounded",
682
+ "bg-neutral-100 dark:bg-neutral-700",
683
+ `border ${colors.inputBorder}`,
684
+ "text-neutral-900 dark:text-neutral-100",
685
+ `focus:outline-none focus:ring-2 ${colors.inputRing}`
686
+ )
687
+ }
688
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
689
+ "h3",
690
+ {
691
+ onDoubleClick: handleDoubleClick,
692
+ className: chunkTMZLQK74_js.cn(
693
+ "text-sm font-medium text-neutral-900 dark:text-neutral-100 truncate",
694
+ editable && `cursor-text ${colors.textHover}`
695
+ ),
696
+ title: editable ? "Double-click to rename" : displayName,
697
+ children: displayName
698
+ }
699
+ ) })
700
+ ]
701
+ }
702
+ );
703
+ };
704
+ var TemplateListItem = ({
705
+ template,
706
+ isSelected,
707
+ onSelect,
708
+ onPreviewClick,
709
+ onNameChange,
710
+ editable,
711
+ colors
712
+ }) => {
713
+ const [isEditing, setIsEditing] = React.useState(false);
714
+ const [editValue, setEditValue] = React.useState(template.name || template.title);
715
+ const inputRef = React__namespace.useRef(null);
716
+ const displayName = template.name || template.title;
717
+ const IconComponent = getTemplateIcon(template);
718
+ const handleDoubleClick = (e) => {
719
+ if (editable) {
720
+ e.stopPropagation();
721
+ setIsEditing(true);
722
+ setEditValue(displayName);
723
+ }
724
+ };
725
+ const handleBlur = () => {
726
+ setIsEditing(false);
727
+ if (editValue.trim() && editValue !== displayName) {
728
+ onNameChange(template.id, editValue.trim());
729
+ }
730
+ };
731
+ const handleKeyDown = (e) => {
732
+ if (e.key === "Enter") {
733
+ handleBlur();
734
+ } else if (e.key === "Escape") {
735
+ setIsEditing(false);
736
+ setEditValue(displayName);
737
+ }
738
+ };
739
+ React__namespace.useEffect(() => {
740
+ if (isEditing && inputRef.current) {
741
+ inputRef.current.focus();
742
+ inputRef.current.select();
743
+ }
744
+ }, [isEditing]);
745
+ return /* @__PURE__ */ jsxRuntime.jsxs(
746
+ framerMotion.motion.div,
747
+ {
748
+ whileHover: { x: 4, scale: 1.01 },
749
+ whileTap: { scale: 0.995 },
750
+ transition: { type: "spring", stiffness: 400, damping: 25 },
751
+ onClick: () => onSelect(template.id),
752
+ className: chunkTMZLQK74_js.cn(
753
+ "group flex items-center gap-4 p-3 cursor-pointer rounded-xl border-2 transition-all duration-300",
754
+ "bg-white dark:bg-neutral-800",
755
+ isSelected ? `${colors.selectedBorder} shadow-md ${colors.selectedGlow}` : "border-neutral-200 dark:border-neutral-700 hover:border-neutral-300 dark:hover:border-neutral-600"
756
+ ),
757
+ children: [
758
+ /* @__PURE__ */ jsxRuntime.jsx(
759
+ "div",
760
+ {
761
+ className: chunkTMZLQK74_js.cn(
762
+ "w-5 h-5 rounded-full border-2 flex items-center justify-center flex-shrink-0 transition-all duration-200",
763
+ isSelected ? colors.checkBg : "bg-white dark:bg-neutral-800 border-neutral-300 dark:border-neutral-600"
764
+ ),
765
+ children: isSelected && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { size: 12, className: "text-white", strokeWidth: 3 })
766
+ }
767
+ ),
768
+ /* @__PURE__ */ jsxRuntime.jsx(
769
+ "div",
770
+ {
771
+ className: chunkTMZLQK74_js.cn(
772
+ "w-12 h-12 rounded-lg flex items-center justify-center flex-shrink-0 transition-colors duration-300",
773
+ isSelected ? colors.selected : `bg-neutral-100 dark:bg-neutral-700/50 ${colors.hoverBg}`
774
+ ),
775
+ children: /* @__PURE__ */ jsxRuntime.jsx(
776
+ IconComponent,
777
+ {
778
+ size: 24,
779
+ strokeWidth: 1.5,
780
+ className: chunkTMZLQK74_js.cn(
781
+ "transition-colors duration-300",
782
+ isSelected ? colors.iconSelected : `text-neutral-400 dark:text-neutral-500 ${colors.iconHover}`
783
+ )
784
+ }
785
+ )
786
+ }
787
+ ),
788
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 min-w-0", children: isEditing ? /* @__PURE__ */ jsxRuntime.jsx(
789
+ "input",
790
+ {
791
+ ref: inputRef,
792
+ type: "text",
793
+ value: editValue,
794
+ onChange: (e) => setEditValue(e.target.value),
795
+ onBlur: handleBlur,
796
+ onKeyDown: handleKeyDown,
797
+ onClick: (e) => e.stopPropagation(),
798
+ className: chunkTMZLQK74_js.cn(
799
+ "w-full px-2 py-1 text-sm font-medium rounded",
800
+ "bg-neutral-100 dark:bg-neutral-700",
801
+ `border ${colors.inputBorder}`,
802
+ "text-neutral-900 dark:text-neutral-100",
803
+ `focus:outline-none focus:ring-2 ${colors.inputRing}`
804
+ )
805
+ }
806
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
807
+ "h3",
808
+ {
809
+ onDoubleClick: handleDoubleClick,
810
+ className: chunkTMZLQK74_js.cn(
811
+ "text-sm font-medium text-neutral-900 dark:text-neutral-100 truncate",
812
+ editable && `cursor-text ${colors.textHover}`
813
+ ),
814
+ title: editable ? "Double-click to rename" : displayName,
815
+ children: displayName
816
+ }
817
+ ) }),
818
+ /* @__PURE__ */ jsxRuntime.jsx(
819
+ "button",
820
+ {
821
+ type: "button",
822
+ onClick: (e) => onPreviewClick(e, template.previewUrl),
823
+ className: chunkTMZLQK74_js.cn(
824
+ "p-2 rounded-lg transition-all duration-200 flex-shrink-0",
825
+ "text-neutral-400 dark:text-neutral-500",
826
+ "opacity-0 group-hover:opacity-100",
827
+ colors.hoverBgDark,
828
+ colors.textHover
829
+ ),
830
+ "aria-label": `Preview ${displayName}`,
831
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ExternalLink, { size: 16 })
832
+ }
833
+ )
834
+ ]
835
+ }
836
+ );
837
+ };
838
+ TemplateSelector.displayName = "TemplateSelector";
839
+ var TextButton = ({
840
+ children,
841
+ onClick,
842
+ disabled = false,
843
+ leadingDecorator,
844
+ trailingDecorator,
845
+ variant = "primary",
846
+ size = "md",
847
+ className = "",
848
+ type = "button",
849
+ ...buttonProps
850
+ }) => {
851
+ const baseStyles = `group inline-flex justify-center items-center gap-2 font-medium uppercase tracking-wide transition-all duration-200 ${disabled ? "cursor-not-allowed" : "cursor-pointer"}`;
852
+ const variantStyles = {
853
+ primary: "text-blue-600 hover:text-blue-700 focus:ring-blue-500",
854
+ secondary: "text-neutral-600 hover:text-neutral-700 focus:ring-neutral-500",
855
+ danger: "text-rose-600 hover:text-rose-700 focus:ring-rose-500",
856
+ success: "text-green-600 hover:text-green-700 focus:ring-green-500",
857
+ disabled: "text-neutral-400 cursor-not-allowed"
858
+ };
859
+ const sizeStyles = {
860
+ sm: "text-xs px-2 py-1",
861
+ md: "text-sm px-3 py-2",
862
+ lg: "text-base px-4 py-3"
863
+ };
864
+ const disabledStyles = disabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer";
865
+ return /* @__PURE__ */ jsxRuntime.jsxs(
866
+ "button",
867
+ {
868
+ type,
869
+ className: `${baseStyles} ${variantStyles[variant]} ${sizeStyles[size]} ${disabledStyles} ${className}`,
870
+ onClick,
871
+ disabled,
872
+ ...buttonProps,
873
+ children: [
874
+ leadingDecorator && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "animate-in slide-in-from-left-1 duration-200", children: leadingDecorator }),
875
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children }),
876
+ trailingDecorator && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "animate-in slide-in-from-right-1 duration-200 group-hover:translate-x-1", children: trailingDecorator })
877
+ ]
878
+ }
879
+ );
880
+ };
881
+ var Toast = ({
882
+ message,
883
+ type,
884
+ duration = 5e3,
885
+ onDismiss,
886
+ isVisible
887
+ }) => {
888
+ const [isDismissing, setIsDismissing] = React.useState(false);
889
+ const [progressWidth, setProgressWidth] = React.useState(100);
890
+ React.useEffect(() => {
891
+ if (isVisible && !isDismissing) {
892
+ const timer = setTimeout(() => {
893
+ setIsDismissing(true);
894
+ setTimeout(() => {
895
+ onDismiss?.();
896
+ }, 300);
897
+ }, duration);
898
+ return () => clearTimeout(timer);
899
+ }
900
+ }, [isVisible, isDismissing, duration, onDismiss]);
901
+ React.useEffect(() => {
902
+ if (isVisible) {
903
+ setIsDismissing(false);
904
+ setProgressWidth(0);
905
+ }
906
+ }, [isVisible]);
907
+ React.useEffect(() => {
908
+ if (isVisible && !isDismissing) {
909
+ const progressTimer = setInterval(() => {
910
+ setProgressWidth((prev) => {
911
+ if (prev >= 100) return 100;
912
+ return prev + 100 / (duration / 100);
913
+ });
914
+ }, 100);
915
+ return () => clearInterval(progressTimer);
916
+ }
917
+ }, [isVisible, isDismissing, duration]);
918
+ if (!isVisible) return null;
919
+ return /* @__PURE__ */ jsxRuntime.jsx(
920
+ "div",
921
+ {
922
+ className: `fixed top-4 right-4 z-50 max-w-sm w-[calc(100vw-2rem)] sm:w-auto transition-all duration-300 ${isDismissing ? "translate-x-full opacity-0" : "translate-x-0 opacity-100"}`,
923
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
924
+ "div",
925
+ {
926
+ className: `p-3 sm:p-4 shadow-lg border transition-all duration-300 ${type === "success" ? "bg-green-50 dark:bg-green-900/70 border-green-200 dark:border-green-700 text-green-800 dark:text-green-200" : "bg-rose-50 dark:bg-rose-900/70 border-rose-200 dark:border-rose-700 text-rose-800 dark:text-rose-200"}`,
927
+ children: [
928
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3", children: [
929
+ /* @__PURE__ */ jsxRuntime.jsx(
930
+ "div",
931
+ {
932
+ className: `w-5 h-5 mt-0.5 flex-shrink-0 ${type === "success" ? "text-green-600 dark:text-green-400" : "text-rose-600 dark:text-rose-400"}`,
933
+ children: type === "success" ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "w-5 h-5" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertTriangle, { className: "w-5 h-5" })
934
+ }
935
+ ),
936
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm", children: message }) }),
937
+ /* @__PURE__ */ jsxRuntime.jsx(
938
+ "button",
939
+ {
940
+ onClick: () => {
941
+ setIsDismissing(true);
942
+ setTimeout(() => {
943
+ onDismiss?.();
944
+ }, 300);
945
+ },
946
+ className: "text-neutral-400 hover:text-neutral-600 dark:text-neutral-500 dark:hover:text-neutral-300 transition-colors duration-300",
947
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "w-4 h-4" })
948
+ }
949
+ )
950
+ ] }),
951
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3 w-full bg-neutral-200 dark:bg-neutral-600 h-1 transition-all duration-300", children: /* @__PURE__ */ jsxRuntime.jsx(
952
+ "div",
953
+ {
954
+ className: `h-full transition-all duration-100 ease-linear ${type === "success" ? "bg-green-500 dark:bg-green-400" : "bg-rose-500 dark:bg-rose-400"}`,
955
+ style: { width: `${progressWidth}%` }
956
+ }
957
+ ) })
958
+ ]
959
+ }
960
+ )
961
+ }
962
+ );
963
+ };
964
+
965
+ Object.defineProperty(exports, "Globe", {
966
+ enumerable: true,
967
+ get: function () { return lucideReact.Globe; }
968
+ });
969
+ Object.defineProperty(exports, "Moon", {
970
+ enumerable: true,
971
+ get: function () { return lucideReact.Moon; }
972
+ });
973
+ Object.defineProperty(exports, "Orbit", {
974
+ enumerable: true,
975
+ get: function () { return lucideReact.Orbit; }
976
+ });
977
+ Object.defineProperty(exports, "Rocket", {
978
+ enumerable: true,
979
+ get: function () { return lucideReact.Rocket; }
980
+ });
981
+ Object.defineProperty(exports, "Sparkles", {
982
+ enumerable: true,
983
+ get: function () { return lucideReact.Sparkles; }
984
+ });
985
+ Object.defineProperty(exports, "Star", {
986
+ enumerable: true,
987
+ get: function () { return lucideReact.Star; }
988
+ });
989
+ exports.AnimatedButton = AnimatedButton;
990
+ exports.Input = Input;
991
+ exports.TemplateSelector = TemplateSelector;
992
+ exports.TextButton = TextButton;
993
+ exports.Toast = Toast;
994
+ //# sourceMappingURL=chunk-BWR6DSQJ.js.map
995
+ //# sourceMappingURL=chunk-BWR6DSQJ.js.map