@olwiba/cn 0.1.25 → 0.1.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { clsx } from 'clsx';
2
2
  import { twMerge } from 'tailwind-merge';
3
3
  import * as React37 from 'react';
4
- import { useMemo, useRef, useState, useCallback, useEffect } from 'react';
4
+ import { useMemo, useCallback, useRef, useState, useEffect } from 'react';
5
5
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
6
6
  import * as AccordionPrimitive from '@radix-ui/react-accordion';
7
7
  import { ChevronDown, ArrowLeft, ArrowRight, Check, X, Search, ChevronRight, Circle, Dot, ChevronUp, PanelLeft, MoreHorizontal, ChevronLeftIcon, ChevronRightIcon, ChevronDownIcon, ChevronLeft, GripVertical, LoaderCircle, OctagonX, TriangleAlert, Info, CircleCheck, Loader2Icon } from 'lucide-react';
@@ -142,23 +142,26 @@ var alertVariants = cva(
142
142
  }
143
143
  }
144
144
  );
145
- var Alert = React37.forwardRef(({ className, variant, mode, size, disabled, ...props }, ref) => /* @__PURE__ */ jsx(
146
- "div",
147
- {
148
- ref,
149
- role: "alert",
150
- className: cn(
151
- alertVariants({ variant }),
152
- size === "sm" && "p-3 text-xs [&>svg]:top-3 [&>svg]:left-3",
153
- size === "lg" && "p-6 text-base [&>svg]:top-6 [&>svg]:left-6",
154
- mode === "smooth" && "rounded-2xl",
155
- mode === "playful" && "border-l-4",
156
- disabled && "opacity-50 pointer-events-none",
157
- className
158
- ),
159
- ...props
160
- }
161
- ));
145
+ var Alert = React37.forwardRef(({ className, variant, mode: modeProp, size, disabled, ...props }, ref) => {
146
+ const mode = modeProp ?? useUIVariant();
147
+ return /* @__PURE__ */ jsx(
148
+ "div",
149
+ {
150
+ ref,
151
+ role: "alert",
152
+ className: cn(
153
+ alertVariants({ variant }),
154
+ size === "sm" && "p-3 text-xs [&>svg]:top-3 [&>svg]:left-3",
155
+ size === "lg" && "p-6 text-base [&>svg]:top-6 [&>svg]:left-6",
156
+ mode === "smooth" && "rounded-2xl",
157
+ mode === "playful" && "border-l-4",
158
+ disabled && "opacity-50 pointer-events-none",
159
+ className
160
+ ),
161
+ ...props
162
+ }
163
+ );
164
+ });
162
165
  Alert.displayName = "Alert";
163
166
  var AlertTitle = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
164
167
  "h5",
@@ -178,6 +181,12 @@ var AlertDescription = React37.forwardRef(({ className, ...props }, ref) => /* @
178
181
  }
179
182
  ));
180
183
  AlertDescription.displayName = "AlertDescription";
184
+
185
+ // src/components/ui/glass.ts
186
+ var glassBlur = "backdrop-blur-xl backdrop-saturate-150";
187
+ var glassSurface = "border border-white/20 bg-background/60 backdrop-blur-xl backdrop-saturate-150 shadow-lg shadow-black/10 dark:border-white/10 dark:bg-background/40";
188
+ var glassPanel = "border border-white/20 bg-popover/70 backdrop-blur-lg backdrop-saturate-150 shadow-lg shadow-black/10 dark:border-white/10 dark:bg-popover/50";
189
+ var glassControl = "border border-white/25 bg-background/50 backdrop-blur-md backdrop-saturate-150 shadow-sm shadow-black/10 dark:border-white/10 dark:bg-background/30";
181
190
  var buttonVariants = cva(
182
191
  "inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-semibold transition-all duration-200 focus-visible:outline-none focus-visible:ring-[3px] focus-visible:ring-ring/20 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
183
192
  {
@@ -203,6 +212,12 @@ var buttonVariants = cva(
203
212
  }
204
213
  }
205
214
  );
215
+ var glassButtonBg = {
216
+ default: "bg-primary/75 hover:bg-primary/60",
217
+ destructive: "bg-destructive/75 hover:bg-destructive/60",
218
+ outline: "bg-background/40 hover:bg-background/60",
219
+ secondary: "bg-secondary/50 hover:bg-secondary/40"
220
+ };
206
221
  var Button = React37.forwardRef(
207
222
  ({ className, variant, size, asChild = false, mode: modeProp, ...props }, ref) => {
208
223
  const mode = modeProp ?? useUIVariant();
@@ -236,12 +251,18 @@ var Button = React37.forwardRef(
236
251
  )
237
252
  ] });
238
253
  }
254
+ const isGlass = mode === "glass" && variant !== "ghost" && variant !== "link";
239
255
  return /* @__PURE__ */ jsx(
240
256
  Comp,
241
257
  {
242
258
  className: cn(
243
259
  buttonVariants({ variant, size, className }),
244
- mode === "smooth" && "rounded-full shadow-none"
260
+ mode === "smooth" && "rounded-full shadow-none",
261
+ isGlass && cn(
262
+ glassBlur,
263
+ "border border-white/25 shadow-sm shadow-black/10 dark:border-white/15",
264
+ glassButtonBg[variant ?? "default"]
265
+ )
245
266
  ),
246
267
  ref,
247
268
  ...props
@@ -265,24 +286,27 @@ var AlertDialogOverlay = React37.forwardRef(({ className, ...props }, ref) => /*
265
286
  }
266
287
  ));
267
288
  AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;
268
- var AlertDialogContent = React37.forwardRef(({ className, mode, children, ...props }, ref) => /* @__PURE__ */ jsxs(AlertDialogPortal, { children: [
269
- /* @__PURE__ */ jsx(AlertDialogOverlay, {}),
270
- /* @__PURE__ */ jsx(
271
- AlertDialogPrimitive.Content,
272
- {
273
- ref,
274
- className: cn(
275
- "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-top-[48%]",
276
- !mode && "shadow-lg sm:rounded-lg",
277
- mode === "smooth" && "rounded-2xl shadow-xl",
278
- mode === "playful" && "rounded-xl border-2 shadow-lg shadow-primary/10",
279
- className
280
- ),
281
- ...props,
282
- children: /* @__PURE__ */ jsx(UIVariantProvider, { mode, children })
283
- }
284
- )
285
- ] }));
289
+ var AlertDialogContent = React37.forwardRef(({ className, mode: modeProp, children, ...props }, ref) => {
290
+ const mode = modeProp ?? useUIVariant();
291
+ return /* @__PURE__ */ jsxs(AlertDialogPortal, { children: [
292
+ /* @__PURE__ */ jsx(AlertDialogOverlay, {}),
293
+ /* @__PURE__ */ jsx(
294
+ AlertDialogPrimitive.Content,
295
+ {
296
+ ref,
297
+ className: cn(
298
+ "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-top-[48%]",
299
+ !mode && "shadow-lg sm:rounded-lg",
300
+ mode === "smooth" && "rounded-2xl shadow-xl",
301
+ mode === "playful" && "rounded-xl border-2 shadow-lg shadow-primary/10",
302
+ className
303
+ ),
304
+ ...props,
305
+ children: /* @__PURE__ */ jsx(UIVariantProvider, { mode, children })
306
+ }
307
+ )
308
+ ] });
309
+ });
286
310
  AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;
287
311
  var AlertDialogHeader = ({
288
312
  className,
@@ -475,16 +499,50 @@ var badgeVariants = cva(
475
499
  }
476
500
  }
477
501
  );
502
+ var playfulBackdrop = {
503
+ default: "bg-primary/30 dark:bg-primary/20",
504
+ destructive: "bg-destructive/30 dark:bg-destructive/20",
505
+ secondary: "bg-foreground/10 dark:bg-foreground/10",
506
+ outline: "bg-foreground/10 dark:bg-foreground/10"
507
+ };
478
508
  function Badge({ className, variant, size, disabled = false, mode: modeProp, ...props }) {
479
509
  const mode = modeProp ?? useUIVariant();
510
+ if (mode === "playful") {
511
+ return /* @__PURE__ */ jsxs(
512
+ "span",
513
+ {
514
+ className: cn(
515
+ "group/playful relative inline-flex",
516
+ disabled && "opacity-50 pointer-events-none"
517
+ ),
518
+ children: [
519
+ /* @__PURE__ */ jsx(
520
+ "span",
521
+ {
522
+ "aria-hidden": "true",
523
+ className: cn(
524
+ "absolute inset-0 rounded-full transition-transform duration-200 translate-x-[3px] translate-y-[3px] -rotate-[0.5deg] group-hover/playful:-rotate-[1.5deg] group-hover/playful:scale-[1.01]",
525
+ playfulBackdrop[variant ?? "default"]
526
+ )
527
+ }
528
+ ),
529
+ /* @__PURE__ */ jsx(
530
+ "div",
531
+ {
532
+ className: cn(badgeVariants({ variant, size }), "relative rotate-[0.3deg]", className),
533
+ ...props
534
+ }
535
+ )
536
+ ]
537
+ }
538
+ );
539
+ }
480
540
  return /* @__PURE__ */ jsx(
481
541
  "div",
482
542
  {
483
543
  className: cn(
484
544
  badgeVariants({ variant, size }),
485
545
  disabled && "opacity-50 pointer-events-none",
486
- mode === "smooth" && "shadow-sm",
487
- mode === "playful" && "rotate-[0.5deg] [box-shadow:2px_2px_0px_0px_color-mix(in_srgb,currentColor_15%,transparent)]",
488
546
  className
489
547
  ),
490
548
  ...props
@@ -906,6 +964,7 @@ var Card = React37.forwardRef(
906
964
  className: cn(
907
965
  "rounded-lg border bg-card text-card-foreground shadow-sm",
908
966
  mode === "smooth" && "rounded-3xl",
967
+ mode === "glass" && cn(glassSurface, "rounded-xl"),
909
968
  className
910
969
  ),
911
970
  ...props
@@ -1493,30 +1552,34 @@ var DialogOverlay = React37.forwardRef(({ className, ...props }, ref) => /* @__P
1493
1552
  }
1494
1553
  ));
1495
1554
  DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
1496
- var DialogContent = React37.forwardRef(({ className, mode, children, ...props }, ref) => /* @__PURE__ */ jsxs(DialogPortal, { children: [
1497
- /* @__PURE__ */ jsx(DialogOverlay, {}),
1498
- /* @__PURE__ */ jsx(
1499
- DialogPrimitive.Content,
1500
- {
1501
- ref,
1502
- className: cn(
1503
- "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:slide-out-to-top-full data-[state=open]:slide-in-from-top-full",
1504
- !mode && "shadow-lg sm:rounded-lg",
1505
- mode === "smooth" && "rounded-2xl shadow-xl",
1506
- mode === "playful" && "rounded-xl border-2 shadow-lg shadow-primary/10",
1507
- className
1508
- ),
1509
- ...props,
1510
- children: /* @__PURE__ */ jsxs(UIVariantProvider, { mode, children: [
1511
- children,
1512
- /* @__PURE__ */ jsxs(DialogPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground", children: [
1513
- /* @__PURE__ */ jsx(X, { className: "h-4 w-4" }),
1514
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
1555
+ var DialogContent = React37.forwardRef(({ className, mode: modeProp, children, ...props }, ref) => {
1556
+ const mode = modeProp ?? useUIVariant();
1557
+ return /* @__PURE__ */ jsxs(DialogPortal, { children: [
1558
+ /* @__PURE__ */ jsx(DialogOverlay, { className: mode === "glass" ? "bg-black/40" : void 0 }),
1559
+ /* @__PURE__ */ jsx(
1560
+ DialogPrimitive.Content,
1561
+ {
1562
+ ref,
1563
+ className: cn(
1564
+ "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:slide-out-to-top-full data-[state=open]:slide-in-from-top-full",
1565
+ !mode && "shadow-lg sm:rounded-lg",
1566
+ mode === "smooth" && "rounded-2xl shadow-xl",
1567
+ mode === "playful" && "rounded-xl border-2 shadow-lg shadow-primary/10",
1568
+ mode === "glass" && cn(glassSurface, "rounded-2xl"),
1569
+ className
1570
+ ),
1571
+ ...props,
1572
+ children: /* @__PURE__ */ jsxs(UIVariantProvider, { mode, children: [
1573
+ children,
1574
+ /* @__PURE__ */ jsxs(DialogPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground", children: [
1575
+ /* @__PURE__ */ jsx(X, { className: "h-4 w-4" }),
1576
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
1577
+ ] })
1515
1578
  ] })
1516
- ] })
1517
- }
1518
- )
1519
- ] }));
1579
+ }
1580
+ )
1581
+ ] });
1582
+ });
1520
1583
  DialogContent.displayName = DialogPrimitive.Content.displayName;
1521
1584
  var DialogHeader = ({
1522
1585
  className,
@@ -1610,20 +1673,45 @@ function useIsMac() {
1610
1673
  return isMac;
1611
1674
  }
1612
1675
  var Hotkey = React37.forwardRef(
1613
- ({ shortcut, asKbd = false, className, ...props }, ref) => {
1676
+ ({ shortcut, asKbd = false, mode: modeProp, className, ...props }, ref) => {
1614
1677
  const isMac = useIsMac();
1615
1678
  const content = formatShortcut(shortcut, isMac);
1679
+ const mode = modeProp ?? useUIVariant();
1616
1680
  if (asKbd) {
1681
+ const kbdClasses = cn(
1682
+ "bg-muted text-muted-foreground pointer-events-none inline-flex h-5 w-fit min-w-5 select-none items-center justify-center gap-1 px-1 font-sans text-xs font-medium",
1683
+ "[&_svg:not([class*='size-'])]:size-3",
1684
+ !mode && "rounded-sm",
1685
+ mode === "smooth" && "rounded-md",
1686
+ mode === "playful" && "rounded-sm"
1687
+ );
1688
+ if (mode === "playful") {
1689
+ return /* @__PURE__ */ jsxs("span", { className: "group/playful relative inline-flex", children: [
1690
+ /* @__PURE__ */ jsx(
1691
+ "span",
1692
+ {
1693
+ "aria-hidden": "true",
1694
+ className: "absolute inset-0 rounded-sm bg-primary/30 dark:bg-primary/20 transition-transform duration-200 translate-x-[2px] translate-y-[2px] -rotate-[3deg] group-hover/playful:-rotate-[5deg]"
1695
+ }
1696
+ ),
1697
+ /* @__PURE__ */ jsx(
1698
+ "kbd",
1699
+ {
1700
+ ref,
1701
+ "data-slot": "hotkey",
1702
+ className: cn(kbdClasses, "relative rotate-[1.5deg]", className),
1703
+ ...props,
1704
+ children: content
1705
+ }
1706
+ )
1707
+ ] });
1708
+ }
1617
1709
  return /* @__PURE__ */ jsx(
1618
1710
  "kbd",
1619
1711
  {
1620
1712
  ref,
1621
1713
  "data-slot": "hotkey",
1622
- className: cn(
1623
- "bg-muted text-muted-foreground pointer-events-none inline-flex h-5 w-fit min-w-5 select-none items-center justify-center gap-1 rounded-sm px-1 font-sans text-xs font-medium",
1624
- "[&_svg:not([class*='size-'])]:size-3",
1625
- className
1626
- ),
1714
+ className: cn(kbdClasses, className),
1627
1715
  ...props,
1628
1716
  children: content
1629
1717
  }
@@ -1764,92 +1852,132 @@ var ContextMenuGroup = ContextMenuPrimitive.Group;
1764
1852
  var ContextMenuPortal = ContextMenuPrimitive.Portal;
1765
1853
  var ContextMenuSub = ContextMenuPrimitive.Sub;
1766
1854
  var ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup;
1767
- var ContextMenuSubTrigger = React37.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs(
1768
- ContextMenuPrimitive.SubTrigger,
1769
- {
1770
- ref,
1771
- className: cn(
1772
- "flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground",
1773
- inset && "pl-8",
1774
- className
1775
- ),
1776
- ...props,
1777
- children: [
1778
- children,
1779
- /* @__PURE__ */ jsx(ChevronRight, { className: "ml-auto h-4 w-4" })
1780
- ]
1781
- }
1782
- ));
1855
+ var ContextMenuSubTrigger = React37.forwardRef(({ className, inset, children, ...props }, ref) => {
1856
+ const mode = useUIVariant();
1857
+ return /* @__PURE__ */ jsxs(
1858
+ ContextMenuPrimitive.SubTrigger,
1859
+ {
1860
+ ref,
1861
+ className: cn(
1862
+ "flex cursor-default select-none items-center px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground",
1863
+ !mode && "rounded-sm",
1864
+ mode === "smooth" && "rounded-lg",
1865
+ mode === "playful" && "rounded-lg",
1866
+ inset && "pl-8",
1867
+ className
1868
+ ),
1869
+ ...props,
1870
+ children: [
1871
+ children,
1872
+ /* @__PURE__ */ jsx(ChevronRight, { className: "ml-auto h-4 w-4" })
1873
+ ]
1874
+ }
1875
+ );
1876
+ });
1783
1877
  ContextMenuSubTrigger.displayName = ContextMenuPrimitive.SubTrigger.displayName;
1784
- var ContextMenuSubContent = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1785
- ContextMenuPrimitive.SubContent,
1786
- {
1787
- ref,
1788
- className: cn(
1789
- "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-context-menu-content-transform-origin]",
1790
- className
1791
- ),
1792
- ...props
1793
- }
1794
- ));
1878
+ var ContextMenuSubContent = React37.forwardRef(({ className, mode: modeProp, children, ...props }, ref) => {
1879
+ const inheritedMode = useUIVariant();
1880
+ const mode = modeProp ?? inheritedMode;
1881
+ return /* @__PURE__ */ jsx(
1882
+ ContextMenuPrimitive.SubContent,
1883
+ {
1884
+ ref,
1885
+ className: cn(
1886
+ "z-50 min-w-[8rem] overflow-hidden border bg-popover p-1 text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-context-menu-content-transform-origin]",
1887
+ !mode && "rounded-md shadow-md",
1888
+ mode === "smooth" && "rounded-2xl shadow-xl",
1889
+ mode === "playful" && "rounded-xl border-2 shadow-lg shadow-primary/10",
1890
+ className
1891
+ ),
1892
+ ...props,
1893
+ children: /* @__PURE__ */ jsx(UIVariantProvider, { mode, children })
1894
+ }
1895
+ );
1896
+ });
1795
1897
  ContextMenuSubContent.displayName = ContextMenuPrimitive.SubContent.displayName;
1796
- var ContextMenuContent = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(ContextMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(
1797
- ContextMenuPrimitive.Content,
1798
- {
1799
- ref,
1800
- className: cn(
1801
- "z-50 max-h-[--radix-context-menu-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md animate-in fade-in-80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-context-menu-content-transform-origin]",
1802
- className
1803
- ),
1804
- ...props
1805
- }
1806
- ) }));
1898
+ var ContextMenuContent = React37.forwardRef(({ className, mode: modeProp, children, ...props }, ref) => {
1899
+ const inheritedMode = useUIVariant();
1900
+ const mode = modeProp ?? inheritedMode;
1901
+ return /* @__PURE__ */ jsx(ContextMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(
1902
+ ContextMenuPrimitive.Content,
1903
+ {
1904
+ ref,
1905
+ className: cn(
1906
+ "z-50 max-h-[--radix-context-menu-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-hidden border bg-popover p-1 text-popover-foreground animate-in fade-in-80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-context-menu-content-transform-origin]",
1907
+ !mode && "rounded-md shadow-md",
1908
+ mode === "smooth" && "rounded-2xl shadow-xl",
1909
+ mode === "playful" && "rounded-xl border-2 shadow-lg shadow-primary/10",
1910
+ className
1911
+ ),
1912
+ ...props,
1913
+ children: /* @__PURE__ */ jsx(UIVariantProvider, { mode, children })
1914
+ }
1915
+ ) });
1916
+ });
1807
1917
  ContextMenuContent.displayName = ContextMenuPrimitive.Content.displayName;
1808
- var ContextMenuItem = React37.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(
1809
- ContextMenuPrimitive.Item,
1810
- {
1811
- ref,
1812
- className: cn(
1813
- "relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
1814
- inset && "pl-8",
1815
- className
1816
- ),
1817
- ...props
1818
- }
1819
- ));
1918
+ var ContextMenuItem = React37.forwardRef(({ className, inset, ...props }, ref) => {
1919
+ const mode = useUIVariant();
1920
+ return /* @__PURE__ */ jsx(
1921
+ ContextMenuPrimitive.Item,
1922
+ {
1923
+ ref,
1924
+ className: cn(
1925
+ "relative flex cursor-default select-none items-center px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
1926
+ !mode && "rounded-sm",
1927
+ mode === "smooth" && "rounded-lg",
1928
+ mode === "playful" && "rounded-lg",
1929
+ inset && "pl-8",
1930
+ className
1931
+ ),
1932
+ ...props
1933
+ }
1934
+ );
1935
+ });
1820
1936
  ContextMenuItem.displayName = ContextMenuPrimitive.Item.displayName;
1821
- var ContextMenuCheckboxItem = React37.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs(
1822
- ContextMenuPrimitive.CheckboxItem,
1823
- {
1824
- ref,
1825
- className: cn(
1826
- "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
1827
- className
1828
- ),
1829
- checked,
1830
- ...props,
1831
- children: [
1832
- /* @__PURE__ */ jsx("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(ContextMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(Check, { className: "h-4 w-4" }) }) }),
1833
- children
1834
- ]
1835
- }
1836
- ));
1937
+ var ContextMenuCheckboxItem = React37.forwardRef(({ className, children, checked, ...props }, ref) => {
1938
+ const mode = useUIVariant();
1939
+ return /* @__PURE__ */ jsxs(
1940
+ ContextMenuPrimitive.CheckboxItem,
1941
+ {
1942
+ ref,
1943
+ className: cn(
1944
+ "relative flex cursor-default select-none items-center py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
1945
+ !mode && "rounded-sm",
1946
+ mode === "smooth" && "rounded-lg",
1947
+ mode === "playful" && "rounded-lg",
1948
+ className
1949
+ ),
1950
+ checked,
1951
+ ...props,
1952
+ children: [
1953
+ /* @__PURE__ */ jsx("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(ContextMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(Check, { className: "h-4 w-4" }) }) }),
1954
+ children
1955
+ ]
1956
+ }
1957
+ );
1958
+ });
1837
1959
  ContextMenuCheckboxItem.displayName = ContextMenuPrimitive.CheckboxItem.displayName;
1838
- var ContextMenuRadioItem = React37.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
1839
- ContextMenuPrimitive.RadioItem,
1840
- {
1841
- ref,
1842
- className: cn(
1843
- "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
1844
- className
1845
- ),
1846
- ...props,
1847
- children: [
1848
- /* @__PURE__ */ jsx("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(ContextMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(Circle, { className: "h-2 w-2 fill-current" }) }) }),
1849
- children
1850
- ]
1851
- }
1852
- ));
1960
+ var ContextMenuRadioItem = React37.forwardRef(({ className, children, ...props }, ref) => {
1961
+ const mode = useUIVariant();
1962
+ return /* @__PURE__ */ jsxs(
1963
+ ContextMenuPrimitive.RadioItem,
1964
+ {
1965
+ ref,
1966
+ className: cn(
1967
+ "relative flex cursor-default select-none items-center py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
1968
+ !mode && "rounded-sm",
1969
+ mode === "smooth" && "rounded-lg",
1970
+ mode === "playful" && "rounded-lg",
1971
+ className
1972
+ ),
1973
+ ...props,
1974
+ children: [
1975
+ /* @__PURE__ */ jsx("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(ContextMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(Circle, { className: "h-2 w-2 fill-current" }) }) }),
1976
+ children
1977
+ ]
1978
+ }
1979
+ );
1980
+ });
1853
1981
  ContextMenuRadioItem.displayName = ContextMenuPrimitive.RadioItem.displayName;
1854
1982
  var ContextMenuLabel = React37.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(
1855
1983
  ContextMenuPrimitive.Label,
@@ -1915,27 +2043,30 @@ var DrawerOverlay = React37.forwardRef(({ className, ...props }, ref) => /* @__P
1915
2043
  }
1916
2044
  ));
1917
2045
  DrawerOverlay.displayName = Drawer$1.Overlay.displayName;
1918
- var DrawerContent = React37.forwardRef(({ className, mode, children, ...props }, ref) => /* @__PURE__ */ jsxs(DrawerPortal, { children: [
1919
- /* @__PURE__ */ jsx(DrawerOverlay, {}),
1920
- /* @__PURE__ */ jsx(
1921
- Drawer$1.Content,
1922
- {
1923
- ref,
1924
- className: cn(
1925
- "fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col border bg-background",
1926
- !mode && "rounded-t-[10px]",
1927
- mode === "smooth" && "rounded-t-2xl shadow-xl",
1928
- mode === "playful" && "rounded-t-xl border-2 shadow-lg shadow-primary/10",
1929
- className
1930
- ),
1931
- ...props,
1932
- children: /* @__PURE__ */ jsxs(UIVariantProvider, { mode, children: [
1933
- /* @__PURE__ */ jsx("div", { className: "mx-auto mt-4 h-2 w-[100px] rounded-full bg-muted" }),
1934
- children
1935
- ] })
1936
- }
1937
- )
1938
- ] }));
2046
+ var DrawerContent = React37.forwardRef(({ className, mode: modeProp, children, ...props }, ref) => {
2047
+ const mode = modeProp ?? useUIVariant();
2048
+ return /* @__PURE__ */ jsxs(DrawerPortal, { children: [
2049
+ /* @__PURE__ */ jsx(DrawerOverlay, {}),
2050
+ /* @__PURE__ */ jsx(
2051
+ Drawer$1.Content,
2052
+ {
2053
+ ref,
2054
+ className: cn(
2055
+ "fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col border bg-background",
2056
+ !mode && "rounded-t-[10px]",
2057
+ mode === "smooth" && "rounded-t-2xl shadow-xl",
2058
+ mode === "playful" && "rounded-t-xl border-2 shadow-lg shadow-primary/10",
2059
+ className
2060
+ ),
2061
+ ...props,
2062
+ children: /* @__PURE__ */ jsxs(UIVariantProvider, { mode, children: [
2063
+ /* @__PURE__ */ jsx("div", { className: "mx-auto mt-4 h-2 w-[100px] rounded-full bg-muted" }),
2064
+ children
2065
+ ] })
2066
+ }
2067
+ )
2068
+ ] });
2069
+ });
1939
2070
  DrawerContent.displayName = "DrawerContent";
1940
2071
  var DrawerHeader = ({
1941
2072
  className,
@@ -2603,20 +2734,34 @@ HoverCardContent.displayName = HoverCardPrimitive.Content.displayName;
2603
2734
  var Input = React37.forwardRef(
2604
2735
  ({ className, type, mode: modeProp, ...props }, ref) => {
2605
2736
  const mode = modeProp ?? useUIVariant();
2606
- return /* @__PURE__ */ jsx(
2737
+ const input = /* @__PURE__ */ jsx(
2607
2738
  "input",
2608
2739
  {
2609
2740
  type,
2610
2741
  className: cn(
2611
2742
  "flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm aria-invalid:border-destructive aria-invalid:focus-visible:ring-destructive/20",
2612
2743
  mode === "smooth" && "rounded-full",
2613
- mode === "playful" && "rotate-[0.3deg] [box-shadow:3px_3px_0px_0px_color-mix(in_srgb,currentColor_12%,transparent)]",
2744
+ mode === "playful" && "relative z-10",
2745
+ mode === "glass" && glassControl,
2614
2746
  className
2615
2747
  ),
2616
2748
  ref,
2617
2749
  ...props
2618
2750
  }
2619
2751
  );
2752
+ if (mode === "playful") {
2753
+ return /* @__PURE__ */ jsxs("span", { className: "group/playful relative inline-flex w-full", children: [
2754
+ /* @__PURE__ */ jsx(
2755
+ "span",
2756
+ {
2757
+ "aria-hidden": "true",
2758
+ className: "absolute inset-0 z-0 translate-x-[3px] translate-y-[3px] -rotate-[0.4deg] rounded-md bg-foreground/8 transition-transform duration-200 group-hover/playful:-rotate-[1deg] group-focus-within/playful:-rotate-[1deg] dark:bg-foreground/10"
2759
+ }
2760
+ ),
2761
+ input
2762
+ ] });
2763
+ }
2764
+ return input;
2620
2765
  }
2621
2766
  );
2622
2767
  Input.displayName = "Input";
@@ -2660,10 +2805,11 @@ var Textarea = React37.forwardRef(
2660
2805
  Textarea.displayName = "Textarea";
2661
2806
  function InputGroup({
2662
2807
  className,
2663
- mode,
2808
+ mode: modeProp,
2664
2809
  disabled,
2665
2810
  ...props
2666
2811
  }) {
2812
+ const mode = modeProp ?? useUIVariant();
2667
2813
  return /* @__PURE__ */ jsx(UIVariantProvider, { mode, children: /* @__PURE__ */ jsx(
2668
2814
  "div",
2669
2815
  {
@@ -3078,20 +3224,36 @@ function ItemFooter({ className, ...props }) {
3078
3224
  }
3079
3225
  );
3080
3226
  }
3081
- function Kbd({ className, ...props }) {
3082
- return /* @__PURE__ */ jsx(
3083
- "kbd",
3084
- {
3085
- "data-slot": "kbd",
3086
- className: cn(
3087
- "bg-muted text-muted-foreground pointer-events-none inline-flex h-5 w-fit min-w-5 select-none items-center justify-center gap-1 rounded-sm px-1 font-sans text-xs font-medium",
3088
- "[&_svg:not([class*='size-'])]:size-3",
3089
- "[[data-slot=tooltip-content]_&]:bg-background/20 [[data-slot=tooltip-content]_&]:text-background dark:[[data-slot=tooltip-content]_&]:bg-background/10",
3090
- className
3091
- ),
3092
- ...props
3093
- }
3227
+ function Kbd({ className, mode: modeProp, ...props }) {
3228
+ const mode = modeProp ?? useUIVariant();
3229
+ const baseClasses = cn(
3230
+ "bg-muted text-muted-foreground pointer-events-none inline-flex h-5 w-fit min-w-5 select-none items-center justify-center gap-1 px-1 font-sans text-xs font-medium",
3231
+ "[&_svg:not([class*='size-'])]:size-3",
3232
+ "[[data-slot=tooltip-content]_&]:bg-background/20 [[data-slot=tooltip-content]_&]:text-background dark:[[data-slot=tooltip-content]_&]:bg-background/10",
3233
+ !mode && "rounded-sm",
3234
+ mode === "smooth" && "rounded-md",
3235
+ mode === "playful" && "rounded-sm"
3094
3236
  );
3237
+ if (mode === "playful") {
3238
+ return /* @__PURE__ */ jsxs("span", { className: "group/playful relative inline-flex", children: [
3239
+ /* @__PURE__ */ jsx(
3240
+ "span",
3241
+ {
3242
+ "aria-hidden": "true",
3243
+ className: "absolute inset-0 rounded-sm bg-primary/30 dark:bg-primary/20 transition-transform duration-200 translate-x-[2px] translate-y-[2px] -rotate-[3deg] group-hover/playful:-rotate-[5deg]"
3244
+ }
3245
+ ),
3246
+ /* @__PURE__ */ jsx(
3247
+ "kbd",
3248
+ {
3249
+ "data-slot": "kbd",
3250
+ className: cn(baseClasses, "relative rotate-[1.5deg]", className),
3251
+ ...props
3252
+ }
3253
+ )
3254
+ ] });
3255
+ }
3256
+ return /* @__PURE__ */ jsx("kbd", { "data-slot": "kbd", className: cn(baseClasses, className), ...props });
3095
3257
  }
3096
3258
  function KbdGroup({ className, ...props }) {
3097
3259
  return /* @__PURE__ */ jsx(
@@ -3653,6 +3815,7 @@ var PopoverContent = React37.forwardRef(({ className, align = "center", sideOffs
3653
3815
  !mode && "rounded-md shadow-md",
3654
3816
  mode === "smooth" && "rounded-2xl shadow-xl",
3655
3817
  mode === "playful" && "rounded-xl border-2 shadow-lg shadow-primary/10",
3818
+ mode === "glass" && cn(glassPanel, "rounded-xl"),
3656
3819
  className
3657
3820
  ),
3658
3821
  ...props,
@@ -3661,27 +3824,43 @@ var PopoverContent = React37.forwardRef(({ className, align = "center", sideOffs
3661
3824
  ) });
3662
3825
  });
3663
3826
  PopoverContent.displayName = PopoverPrimitive.Content.displayName;
3664
- var Progress = React37.forwardRef(({ className, value, disabled = false, ...props }, ref) => /* @__PURE__ */ jsx(
3665
- ProgressPrimitive.Root,
3666
- {
3667
- ref,
3668
- "aria-disabled": disabled || void 0,
3669
- "data-disabled": disabled ? "" : void 0,
3670
- className: cn(
3671
- "relative h-4 w-full overflow-hidden rounded-full bg-secondary",
3672
- disabled && "opacity-50",
3673
- className
3674
- ),
3675
- ...props,
3676
- children: /* @__PURE__ */ jsx(
3677
- ProgressPrimitive.Indicator,
3678
- {
3679
- className: "h-full w-full flex-1 bg-primary transition-all",
3680
- style: { transform: `translateX(-${100 - (value || 0)}%)` }
3681
- }
3682
- )
3827
+ var Progress = React37.forwardRef(({ className, value, disabled = false, mode: modeProp, ...props }, ref) => {
3828
+ const mode = modeProp ?? useUIVariant();
3829
+ const bar = /* @__PURE__ */ jsx(
3830
+ ProgressPrimitive.Root,
3831
+ {
3832
+ ref,
3833
+ "aria-disabled": disabled || void 0,
3834
+ "data-disabled": disabled ? "" : void 0,
3835
+ className: cn(
3836
+ "relative h-4 w-full overflow-hidden rounded-full bg-secondary",
3837
+ disabled && "opacity-50",
3838
+ className
3839
+ ),
3840
+ ...props,
3841
+ children: /* @__PURE__ */ jsx(
3842
+ ProgressPrimitive.Indicator,
3843
+ {
3844
+ className: "h-full w-full flex-1 bg-primary transition-all",
3845
+ style: { transform: `translateX(-${100 - (value || 0)}%)` }
3846
+ }
3847
+ )
3848
+ }
3849
+ );
3850
+ if (mode === "playful") {
3851
+ return /* @__PURE__ */ jsxs("div", { className: "group/playful relative", children: [
3852
+ /* @__PURE__ */ jsx(
3853
+ "div",
3854
+ {
3855
+ "aria-hidden": "true",
3856
+ className: "absolute inset-0 rounded-full bg-border transition-transform duration-200 translate-x-[3px] translate-y-[3px] -rotate-[0.5deg] group-hover/playful:-rotate-[1.5deg]"
3857
+ }
3858
+ ),
3859
+ /* @__PURE__ */ jsx("div", { className: "relative", children: bar })
3860
+ ] });
3683
3861
  }
3684
- ));
3862
+ return bar;
3863
+ });
3685
3864
  Progress.displayName = ProgressPrimitive.Root.displayName;
3686
3865
  var RadioGroup4 = React37.forwardRef(({ className, ...props }, ref) => {
3687
3866
  return /* @__PURE__ */ jsx(
@@ -3694,7 +3873,31 @@ var RadioGroup4 = React37.forwardRef(({ className, ...props }, ref) => {
3694
3873
  );
3695
3874
  });
3696
3875
  RadioGroup4.displayName = RadioGroupPrimitive.Root.displayName;
3697
- var RadioGroupItem = React37.forwardRef(({ className, ...props }, ref) => {
3876
+ var RadioGroupItem = React37.forwardRef(({ className, mode: modeProp, ...props }, ref) => {
3877
+ const mode = modeProp ?? useUIVariant();
3878
+ if (mode === "playful") {
3879
+ return /* @__PURE__ */ jsxs("span", { className: "group/playful relative inline-flex", children: [
3880
+ /* @__PURE__ */ jsx(
3881
+ "span",
3882
+ {
3883
+ "aria-hidden": "true",
3884
+ className: "absolute inset-0 rounded-full bg-primary/30 dark:bg-primary/20 transition-transform duration-200 translate-x-[2px] translate-y-[2px] -rotate-[3deg] group-hover/playful:-rotate-[5deg]"
3885
+ }
3886
+ ),
3887
+ /* @__PURE__ */ jsx(
3888
+ RadioGroupPrimitive.Item,
3889
+ {
3890
+ ref,
3891
+ className: cn(
3892
+ "relative aspect-square h-4 w-4 rounded-full border border-primary text-primary ring-offset-background focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
3893
+ className
3894
+ ),
3895
+ ...props,
3896
+ children: /* @__PURE__ */ jsx(RadioGroupPrimitive.Indicator, { className: "flex items-center justify-center", children: /* @__PURE__ */ jsx(Circle, { className: "h-2.5 w-2.5 fill-current text-current" }) })
3897
+ }
3898
+ )
3899
+ ] });
3900
+ }
3698
3901
  return /* @__PURE__ */ jsx(
3699
3902
  RadioGroupPrimitive.Item,
3700
3903
  {
@@ -3940,29 +4143,32 @@ var sideRoundingPlayful = {
3940
4143
  top: "rounded-b-xl",
3941
4144
  bottom: "rounded-t-xl"
3942
4145
  };
3943
- var SheetContent = React37.forwardRef(({ side = "right", className, children, container, mode, ...props }, ref) => /* @__PURE__ */ jsxs(SheetPortal, { container: container ?? void 0, children: [
3944
- /* @__PURE__ */ jsx(SheetOverlay, {}),
3945
- /* @__PURE__ */ jsx(
3946
- DialogPrimitive.Content,
3947
- {
3948
- ref,
3949
- className: cn(
3950
- sheetVariants({ side }),
3951
- mode === "smooth" && `${sideRoundingSmooth[side ?? "right"]} shadow-xl`,
3952
- mode === "playful" && `${sideRoundingPlayful[side ?? "right"]} border-2 shadow-lg shadow-primary/10`,
3953
- className
3954
- ),
3955
- ...props,
3956
- children: /* @__PURE__ */ jsxs(UIVariantProvider, { mode, children: [
3957
- children,
3958
- /* @__PURE__ */ jsxs(DialogPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary", children: [
3959
- /* @__PURE__ */ jsx(X, { className: "h-4 w-4" }),
3960
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
4146
+ var SheetContent = React37.forwardRef(({ side = "right", className, children, container, mode: modeProp, ...props }, ref) => {
4147
+ const mode = modeProp ?? useUIVariant();
4148
+ return /* @__PURE__ */ jsxs(SheetPortal, { container: container ?? void 0, children: [
4149
+ /* @__PURE__ */ jsx(SheetOverlay, {}),
4150
+ /* @__PURE__ */ jsx(
4151
+ DialogPrimitive.Content,
4152
+ {
4153
+ ref,
4154
+ className: cn(
4155
+ sheetVariants({ side }),
4156
+ mode === "smooth" && `${sideRoundingSmooth[side ?? "right"]} shadow-xl`,
4157
+ mode === "playful" && `${sideRoundingPlayful[side ?? "right"]} border-2 shadow-lg shadow-primary/10`,
4158
+ className
4159
+ ),
4160
+ ...props,
4161
+ children: /* @__PURE__ */ jsxs(UIVariantProvider, { mode, children: [
4162
+ children,
4163
+ /* @__PURE__ */ jsxs(DialogPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary", children: [
4164
+ /* @__PURE__ */ jsx(X, { className: "h-4 w-4" }),
4165
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
4166
+ ] })
3961
4167
  ] })
3962
- ] })
3963
- }
3964
- )
3965
- ] }));
4168
+ }
4169
+ )
4170
+ ] });
4171
+ });
3966
4172
  SheetContent.displayName = DialogPrimitive.Content.displayName;
3967
4173
  var SheetHeader = ({
3968
4174
  className,
@@ -4039,21 +4245,25 @@ function Skeleton({
4039
4245
  var TooltipProvider = TooltipPrimitive.Provider;
4040
4246
  var Tooltip2 = TooltipPrimitive.Root;
4041
4247
  var TooltipTrigger = TooltipPrimitive.Trigger;
4042
- var TooltipContent = React37.forwardRef(({ className, sideOffset = 4, mode, children, ...props }, ref) => /* @__PURE__ */ jsx(
4043
- TooltipPrimitive.Content,
4044
- {
4045
- ref,
4046
- sideOffset,
4047
- className: cn(
4048
- "z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]",
4049
- mode === "smooth" && "rounded-xl shadow-xl",
4050
- mode === "playful" && "rounded-lg border-2 shadow-md shadow-primary/10",
4051
- className
4052
- ),
4053
- ...props,
4054
- children: /* @__PURE__ */ jsx(UIVariantProvider, { mode, children })
4055
- }
4056
- ));
4248
+ var TooltipContent = React37.forwardRef(({ className, sideOffset = 4, mode: modeProp, children, ...props }, ref) => {
4249
+ const mode = modeProp ?? useUIVariant();
4250
+ return /* @__PURE__ */ jsx(
4251
+ TooltipPrimitive.Content,
4252
+ {
4253
+ ref,
4254
+ sideOffset,
4255
+ className: cn(
4256
+ "z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]",
4257
+ mode === "smooth" && "rounded-xl shadow-xl",
4258
+ mode === "playful" && "rounded-lg border-2 shadow-md shadow-primary/10",
4259
+ mode === "glass" && cn(glassPanel, "rounded-lg"),
4260
+ className
4261
+ ),
4262
+ ...props,
4263
+ children: /* @__PURE__ */ jsx(UIVariantProvider, { mode, children })
4264
+ }
4265
+ );
4266
+ });
4057
4267
  TooltipContent.displayName = TooltipPrimitive.Content.displayName;
4058
4268
  var SIDEBAR_COOKIE_NAME = "sidebar_state";
4059
4269
  var SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
@@ -4779,8 +4989,9 @@ var Slider = React37.forwardRef(({ className, size = "default", ...props }, ref)
4779
4989
  }
4780
4990
  ));
4781
4991
  Slider.displayName = SliderPrimitive.Root.displayName;
4782
- var Toaster = ({ mode, className, style, ...props }) => {
4992
+ var Toaster = ({ mode: modeProp, className, style, ...props }) => {
4783
4993
  const { theme = "system" } = useTheme();
4994
+ const mode = modeProp ?? useUIVariant();
4784
4995
  return /* @__PURE__ */ jsxs(Fragment, { children: [
4785
4996
  mode === "smooth" && /* @__PURE__ */ jsx("style", { children: `[data-sonner-toaster].toaster-smooth { --border-radius: 1.5rem; }` }),
4786
4997
  mode === "playful" && /* @__PURE__ */ jsx("style", { children: `
@@ -4907,8 +5118,41 @@ var switchSizes = {
4907
5118
  thumb: "size-6 data-[state=checked]:translate-x-7"
4908
5119
  }
4909
5120
  };
4910
- var Switch = React37.forwardRef(({ className, size = "default", ...props }, ref) => {
5121
+ var Switch = React37.forwardRef(({ className, size = "default", mode: modeProp, ...props }, ref) => {
5122
+ const mode = modeProp ?? useUIVariant();
4911
5123
  const sizes = switchSizes[size];
5124
+ if (mode === "playful") {
5125
+ return /* @__PURE__ */ jsxs("span", { className: "group/playful relative inline-flex", children: [
5126
+ /* @__PURE__ */ jsx(
5127
+ "span",
5128
+ {
5129
+ "aria-hidden": "true",
5130
+ className: "absolute inset-0 rounded-full bg-primary/30 dark:bg-primary/20 transition-transform duration-200 translate-x-[2px] translate-y-[2px] -rotate-[3deg] group-hover/playful:-rotate-[5deg]"
5131
+ }
5132
+ ),
5133
+ /* @__PURE__ */ jsx(
5134
+ SwitchPrimitives.Root,
5135
+ {
5136
+ className: cn(
5137
+ "relative peer inline-flex shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input rotate-[1.5deg]",
5138
+ sizes.root,
5139
+ className
5140
+ ),
5141
+ ...props,
5142
+ ref,
5143
+ children: /* @__PURE__ */ jsx(
5144
+ SwitchPrimitives.Thumb,
5145
+ {
5146
+ className: cn(
5147
+ "pointer-events-none block rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=unchecked]:translate-x-0",
5148
+ sizes.thumb
5149
+ )
5150
+ }
5151
+ )
5152
+ }
5153
+ )
5154
+ ] });
5155
+ }
4912
5156
  return /* @__PURE__ */ jsx(
4913
5157
  SwitchPrimitives.Root,
4914
5158
  {
@@ -5260,16 +5504,30 @@ function composeAsciiText(font, text) {
5260
5504
  function getAsciiAccentColumns(font, text, accent) {
5261
5505
  if (!accent) return /* @__PURE__ */ new Set();
5262
5506
  const columns = /* @__PURE__ */ new Set();
5507
+ const accentRanges = [];
5508
+ let searchFrom = 0;
5509
+ while (true) {
5510
+ const idx = text.indexOf(accent, searchFrom);
5511
+ if (idx === -1) break;
5512
+ accentRanges.push({ start: idx, end: idx + accent.length });
5513
+ searchFrom = idx + 1;
5514
+ }
5515
+ if (accentRanges.length === 0) return columns;
5263
5516
  let offsetX = 0;
5517
+ let charIndex = 0;
5264
5518
  for (const ch of text) {
5265
5519
  const code = ch.charCodeAt(0);
5266
5520
  const glyph = font.chars.get(code) ?? font.chars.get(32);
5267
- if (!glyph) continue;
5521
+ if (!glyph) {
5522
+ charIndex++;
5523
+ continue;
5524
+ }
5268
5525
  const width = Math.max(...glyph.map((line) => line.length));
5269
- if (accent.includes(ch)) {
5526
+ if (accentRanges.some((r) => charIndex >= r.start && charIndex < r.end)) {
5270
5527
  for (let col = 0; col < width; col++) columns.add(offsetX + col);
5271
5528
  }
5272
5529
  offsetX += width;
5530
+ charIndex++;
5273
5531
  }
5274
5532
  return columns;
5275
5533
  }
@@ -6526,6 +6784,9 @@ $$$@@
6526
6784
  function AsciiText({
6527
6785
  text = "olwibaCN",
6528
6786
  accent = "",
6787
+ accents,
6788
+ shine = "",
6789
+ shineColor = "rgba(255,255,255,0.92)",
6529
6790
  color,
6530
6791
  accentColor
6531
6792
  }) {
@@ -6534,6 +6795,26 @@ function AsciiText({
6534
6795
  const accentCols = useMemo(() => {
6535
6796
  return getAsciiAccentColumns(font, text, accent);
6536
6797
  }, [font, text, accent]);
6798
+ const multiAccentCols = useMemo(() => {
6799
+ if (!accents?.length) return null;
6800
+ const map = /* @__PURE__ */ new Map();
6801
+ for (const item of accents) {
6802
+ const cols2 = getAsciiAccentColumns(font, text, item.text);
6803
+ for (const col of cols2) map.set(col, item.color);
6804
+ }
6805
+ return map;
6806
+ }, [accents, font, text]);
6807
+ const getCellColor = useCallback((col, baseColor, highlightColor) => {
6808
+ return multiAccentCols?.get(col) ?? (accentCols.has(col) ? highlightColor : baseColor);
6809
+ }, [accentCols, multiAccentCols]);
6810
+ const shineCols = useMemo(() => {
6811
+ return getAsciiAccentColumns(font, text, shine);
6812
+ }, [font, shine, text]);
6813
+ const shineBounds = useMemo(() => {
6814
+ if (!shineCols.size) return null;
6815
+ const cols2 = Array.from(shineCols);
6816
+ return { min: Math.min(...cols2), max: Math.max(...cols2) };
6817
+ }, [shineCols]);
6537
6818
  const canvasRef = useRef(null);
6538
6819
  const animRef = useRef(0);
6539
6820
  const timeRef = useRef(0);
@@ -6584,24 +6865,46 @@ function AsciiText({
6584
6865
  const time = timeRef.current;
6585
6866
  ctx.clearRect(0, 0, canvas.width, canvas.height);
6586
6867
  const { base: baseColor, accent: highlightColor } = colorsRef.current;
6587
- renderAsciiFrameToContext(ctx, { cells, cols, rows }, {
6588
- accentColumns: accentCols,
6589
- color: baseColor,
6590
- accentColor: highlightColor,
6591
- time,
6592
- pointer: mouseRef.current,
6593
- waves: wavesRef.current
6594
- });
6868
+ if (multiAccentCols || shineCols.size) {
6869
+ for (const cell of cells) {
6870
+ const intensity = getAsciiCellIntensity(cell, {
6871
+ time,
6872
+ pointer: mouseRef.current,
6873
+ waves: wavesRef.current
6874
+ });
6875
+ ctx.globalAlpha = intensity;
6876
+ ctx.fillStyle = getCellColor(cell.col, baseColor, highlightColor);
6877
+ ctx.fillRect(cell.col * ASCII_CHAR_WIDTH, cell.row * ASCII_CHAR_HEIGHT, ASCII_CHAR_WIDTH, ASCII_CHAR_HEIGHT);
6878
+ if (shineBounds && shineCols.has(cell.col)) {
6879
+ const alpha = getShineAlpha(cell.col, cell.row, time, shineBounds) * (cell.ch === "\u2591" ? 0.55 : 1);
6880
+ if (alpha > 0) {
6881
+ ctx.globalAlpha = intensity * alpha;
6882
+ ctx.fillStyle = shineColor;
6883
+ ctx.fillRect(cell.col * ASCII_CHAR_WIDTH, cell.row * ASCII_CHAR_HEIGHT, ASCII_CHAR_WIDTH, ASCII_CHAR_HEIGHT);
6884
+ }
6885
+ }
6886
+ }
6887
+ ctx.globalAlpha = 1;
6888
+ } else {
6889
+ renderAsciiFrameToContext(ctx, { cells, cols, rows }, {
6890
+ accentColumns: accentCols,
6891
+ color: baseColor,
6892
+ accentColor: highlightColor,
6893
+ time,
6894
+ pointer: mouseRef.current,
6895
+ waves: wavesRef.current
6896
+ });
6897
+ }
6595
6898
  if (!hasPaintedRef.current) {
6596
6899
  hasPaintedRef.current = true;
6597
6900
  setIsCanvasReady(true);
6598
6901
  }
6599
6902
  wavesRef.current = wavesRef.current.filter((w) => time - w.t < 3);
6600
- }, [cells, accentCols, cols, rows]);
6903
+ }, [accentCols, cells, cols, getCellColor, multiAccentCols, rows, shineBounds, shineColor, shineCols]);
6601
6904
  useEffect(() => {
6602
6905
  hasPaintedRef.current = false;
6603
6906
  setIsCanvasReady(false);
6604
- }, [text, accent, color, accentColor]);
6907
+ }, [text, accent, accents, shine, shineColor, color, accentColor]);
6605
6908
  useEffect(() => {
6606
6909
  let running = true;
6607
6910
  const loop = () => {
@@ -6666,18 +6969,32 @@ function AsciiText({
6666
6969
  preserveAspectRatio: "xMidYMid meet",
6667
6970
  children: cells.map((cell) => {
6668
6971
  const isAccent = accentCols.has(cell.col);
6669
- return /* @__PURE__ */ jsx(
6670
- "rect",
6671
- {
6672
- x: cell.col * ASCII_CHAR_WIDTH,
6673
- y: cell.row * ASCII_CHAR_HEIGHT,
6674
- width: ASCII_CHAR_WIDTH,
6675
- height: ASCII_CHAR_HEIGHT,
6676
- fill: isAccent ? fallbackAccentColor : "currentColor",
6677
- opacity: cell.ch === "\u2591" ? 0.15 : 0.78
6678
- },
6679
- `${cell.col}-${cell.row}`
6680
- );
6972
+ const multiAccentColor = multiAccentCols?.get(cell.col);
6973
+ const shineAlpha = shineBounds && shineCols.has(cell.col) ? getShineAlpha(cell.col, cell.row, 0.2, shineBounds) * (cell.ch === "\u2591" ? 0.55 : 1) : 0;
6974
+ return /* @__PURE__ */ jsxs(React37.Fragment, { children: [
6975
+ /* @__PURE__ */ jsx(
6976
+ "rect",
6977
+ {
6978
+ x: cell.col * ASCII_CHAR_WIDTH,
6979
+ y: cell.row * ASCII_CHAR_HEIGHT,
6980
+ width: ASCII_CHAR_WIDTH,
6981
+ height: ASCII_CHAR_HEIGHT,
6982
+ fill: multiAccentColor ?? (isAccent ? fallbackAccentColor : "currentColor"),
6983
+ opacity: cell.ch === "\u2591" ? 0.15 : 0.78
6984
+ }
6985
+ ),
6986
+ shineAlpha > 0 && /* @__PURE__ */ jsx(
6987
+ "rect",
6988
+ {
6989
+ x: cell.col * ASCII_CHAR_WIDTH,
6990
+ y: cell.row * ASCII_CHAR_HEIGHT,
6991
+ width: ASCII_CHAR_WIDTH,
6992
+ height: ASCII_CHAR_HEIGHT,
6993
+ fill: shineColor,
6994
+ opacity: shineAlpha
6995
+ }
6996
+ )
6997
+ ] }, `${cell.col}-${cell.row}`);
6681
6998
  })
6682
6999
  }
6683
7000
  ),
@@ -6698,6 +7015,21 @@ function AsciiText({
6698
7015
  }
6699
7016
  ) });
6700
7017
  }
7018
+ var SHINE_SPEED = 1.0125;
7019
+ function getShineAlpha(col, row, time, bounds) {
7020
+ const span = bounds.max - bounds.min + 1;
7021
+ const travel = span + 6;
7022
+ const diagonalCol = col + row * 0.62;
7023
+ const primarySweep = bounds.max + 3 - time * SHINE_SPEED % 1 * travel;
7024
+ const secondarySweep = bounds.max + 3 - (time * SHINE_SPEED + 0.5) % 1 * travel;
7025
+ const primary = getShineBandAlpha(diagonalCol, primarySweep);
7026
+ const secondary = getShineBandAlpha(diagonalCol, secondarySweep);
7027
+ return Math.min(0.86, primary + secondary * 0.82);
7028
+ }
7029
+ function getShineBandAlpha(diagonalCol, sweep) {
7030
+ const distance = Math.abs(diagonalCol - sweep);
7031
+ return Math.max(0, 1 - distance / 2.7) ** 2 * 0.78;
7032
+ }
6701
7033
  function useCopyToClipboard(timeout = 2e3) {
6702
7034
  const [isCopied, setIsCopied] = useState(false);
6703
7035
  const copyToClipboard = useCallback(
@@ -6812,25 +7144,33 @@ function ThemeScript() {
6812
7144
  }
6813
7145
  var GLINTS = [
6814
7146
  // perimeter
6815
- { top: "-7px", left: "10%", size: 7, delay: "0s", duration: "2.1s" },
6816
- { top: "2px", right: "-7px", size: 6, delay: "0.3s", duration: "3.4s" },
6817
- { bottom: "-6px", right: "15%", size: 6, delay: "1.1s", duration: "1.7s" },
6818
- { top: "3px", left: "-6px", size: 5, delay: "0.7s", duration: "2.9s" },
7147
+ { top: "-8px", left: "10%", size: 9, delay: "0s", duration: "2.1s" },
7148
+ { top: "2px", right: "-8px", size: 8, delay: "0.3s", duration: "3.4s" },
7149
+ { bottom: "-7px", right: "15%", size: 8, delay: "1.1s", duration: "1.7s" },
7150
+ { top: "3px", left: "-7px", size: 7, delay: "0.7s", duration: "2.9s" },
7151
+ { bottom: "-6px", left: "40%", size: 6, delay: "2.2s", duration: "2.6s" },
7152
+ { top: "-6px", right: "35%", size: 6, delay: "1.4s", duration: "2.2s" },
6819
7153
  // inside / overlapping the child
6820
- { top: "20%", left: "38%", size: 5, delay: "1.5s", duration: "2.3s" },
6821
- { top: "15%", right: "22%", size: 4, delay: "0.5s", duration: "3.1s" },
6822
- { bottom: "15%", left: "22%", size: 4, delay: "1.9s", duration: "1.8s" }
7154
+ { top: "20%", left: "38%", size: 6, delay: "1.5s", duration: "2.3s" },
7155
+ { top: "15%", right: "22%", size: 5, delay: "0.5s", duration: "3.1s" },
7156
+ { bottom: "15%", left: "22%", size: 5, delay: "1.9s", duration: "1.8s" }
6823
7157
  ];
6824
7158
  function GlintIcon({ size }) {
6825
7159
  return /* @__PURE__ */ jsx("svg", { width: size, height: size, viewBox: "0 0 8 8", fill: "currentColor", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { d: "M4 0.5 L4.6 3.4 L7.5 4 L4.6 4.6 L4 7.5 L3.4 4.6 L0.5 4 L3.4 3.4 Z" }) });
6826
7160
  }
6827
- function Enchanted({ children, className, ...props }) {
6828
- return /* @__PURE__ */ jsxs("div", { className: cn("relative", className), ...props, children: [
7161
+ function Enchanted({ children, className, hoverOnly = false, glintClassName, ...props }) {
7162
+ return /* @__PURE__ */ jsxs("div", { className: cn("relative", hoverOnly && "group/enchanted", className), ...props, children: [
6829
7163
  children,
6830
7164
  GLINTS.map((g, i) => /* @__PURE__ */ jsx(
6831
7165
  "span",
6832
7166
  {
6833
- className: "pointer-events-none absolute z-10 text-primary animate-enchanted",
7167
+ className: cn(
7168
+ "pointer-events-none absolute z-10 animate-enchanted drop-shadow-[0_0_3px_currentColor]",
7169
+ glintClassName ?? "text-primary",
7170
+ // Display toggle (not opacity) - the keyframes own opacity, and
7171
+ // re-mounting restarts the glint timeline on each hover.
7172
+ hoverOnly && "hidden group-hover/enchanted:block"
7173
+ ),
6834
7174
  style: { top: g.top, bottom: g.bottom, left: g.left, right: g.right, animationDelay: g.delay, animationDuration: g.duration },
6835
7175
  children: /* @__PURE__ */ jsx(GlintIcon, { size: g.size })
6836
7176
  },