@mdigital_ui/ui 0.4.4 → 0.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/README.md +258 -662
  2. package/dist/anchor/index.js +4 -0
  3. package/dist/anchor/index.js.map +1 -0
  4. package/dist/autocomplete/index.js +6 -0
  5. package/dist/autocomplete/index.js.map +1 -0
  6. package/dist/breadcrumbs/index.js +3 -3
  7. package/dist/calendar/index.js +4 -0
  8. package/dist/calendar/index.js.map +1 -0
  9. package/dist/chunk-3Z7RLVWD.js +258 -0
  10. package/dist/chunk-3Z7RLVWD.js.map +1 -0
  11. package/dist/chunk-5YEC6FDN.js +263 -0
  12. package/dist/chunk-5YEC6FDN.js.map +1 -0
  13. package/dist/{chunk-GOBUFGGJ.js → chunk-6NXZWLSM.js} +3 -3
  14. package/dist/{chunk-GOBUFGGJ.js.map → chunk-6NXZWLSM.js.map} +1 -1
  15. package/dist/{chunk-FU5Q4WVX.js → chunk-6ROGWFQ2.js} +3 -3
  16. package/dist/{chunk-FU5Q4WVX.js.map → chunk-6ROGWFQ2.js.map} +1 -1
  17. package/dist/{chunk-LJOQ2C5W.js → chunk-6RZEJRTC.js} +3 -3
  18. package/dist/{chunk-LJOQ2C5W.js.map → chunk-6RZEJRTC.js.map} +1 -1
  19. package/dist/chunk-74AF6PO2.js +374 -0
  20. package/dist/chunk-74AF6PO2.js.map +1 -0
  21. package/dist/chunk-75N6T3IS.js +77 -0
  22. package/dist/chunk-75N6T3IS.js.map +1 -0
  23. package/dist/{chunk-BKLJDEUX.js → chunk-DBPLQZJ2.js} +38 -14
  24. package/dist/chunk-DBPLQZJ2.js.map +1 -0
  25. package/dist/chunk-ED4CQZ72.js +343 -0
  26. package/dist/chunk-ED4CQZ72.js.map +1 -0
  27. package/dist/{chunk-4ZXHLPRS.js → chunk-FY2TZ2NT.js} +4 -4
  28. package/dist/{chunk-4ZXHLPRS.js.map → chunk-FY2TZ2NT.js.map} +1 -1
  29. package/dist/{chunk-I5AD247M.js → chunk-HKQOAEFY.js} +13 -3
  30. package/dist/chunk-HKQOAEFY.js.map +1 -0
  31. package/dist/chunk-JWYBDNC6.js +307 -0
  32. package/dist/chunk-JWYBDNC6.js.map +1 -0
  33. package/dist/{chunk-W5VLFE4U.js → chunk-LHZJ2GJU.js} +32 -6
  34. package/dist/chunk-LHZJ2GJU.js.map +1 -0
  35. package/dist/{chunk-253JZOYG.js → chunk-NB66D6A5.js} +3 -2
  36. package/dist/chunk-NB66D6A5.js.map +1 -0
  37. package/dist/{chunk-BGMYX7L5.js → chunk-NF6JUJBE.js} +9 -7
  38. package/dist/chunk-NF6JUJBE.js.map +1 -0
  39. package/dist/chunk-NPK4ESMA.js +281 -0
  40. package/dist/chunk-NPK4ESMA.js.map +1 -0
  41. package/dist/{chunk-X7MF3TIF.js → chunk-PD3O6ZH4.js} +12 -5
  42. package/dist/chunk-PD3O6ZH4.js.map +1 -0
  43. package/dist/{chunk-XOEEAMMY.js → chunk-Q46WXJVW.js} +21 -21
  44. package/dist/chunk-Q46WXJVW.js.map +1 -0
  45. package/dist/chunk-QEYNOLRC.js +157 -0
  46. package/dist/chunk-QEYNOLRC.js.map +1 -0
  47. package/dist/chunk-RNG7HR6U.js +174 -0
  48. package/dist/chunk-RNG7HR6U.js.map +1 -0
  49. package/dist/{chunk-HJITFPBT.js → chunk-SZMIHNCZ.js} +13 -7
  50. package/dist/chunk-SZMIHNCZ.js.map +1 -0
  51. package/dist/chunk-TDPJYCNI.js +96 -0
  52. package/dist/chunk-TDPJYCNI.js.map +1 -0
  53. package/dist/chunk-UFYG3HKL.js +374 -0
  54. package/dist/chunk-UFYG3HKL.js.map +1 -0
  55. package/dist/chunk-VNH6R5EU.js +211 -0
  56. package/dist/chunk-VNH6R5EU.js.map +1 -0
  57. package/dist/{chunk-SFP77VS3.js → chunk-X7JN7WPF.js} +5 -2
  58. package/dist/chunk-X7JN7WPF.js.map +1 -0
  59. package/dist/chunk-YRSHBAUQ.js +201 -0
  60. package/dist/chunk-YRSHBAUQ.js.map +1 -0
  61. package/dist/chunk-YUACN5GJ.js +303 -0
  62. package/dist/chunk-YUACN5GJ.js.map +1 -0
  63. package/dist/{chunk-HVHQA34X.js → chunk-ZNGKUG2N.js} +11 -6
  64. package/dist/chunk-ZNGKUG2N.js.map +1 -0
  65. package/dist/color-picker/index.js +6 -0
  66. package/dist/color-picker/index.js.map +1 -0
  67. package/dist/date-picker/RangePicker.d.ts.map +1 -1
  68. package/dist/date-picker/index.d.ts.map +1 -1
  69. package/dist/date-picker/index.js +1 -1
  70. package/dist/date-picker/shared.d.ts +5 -0
  71. package/dist/date-picker/shared.d.ts.map +1 -1
  72. package/dist/dropdown/index.js +2 -2
  73. package/dist/float-button/index.js +5 -0
  74. package/dist/float-button/index.js.map +1 -0
  75. package/dist/index.js +51 -2996
  76. package/dist/index.js.map +1 -1
  77. package/dist/input/index.d.ts.map +1 -1
  78. package/dist/input/index.js +1 -1
  79. package/dist/input-password/index.js +2 -2
  80. package/dist/mentions/index.js +4 -0
  81. package/dist/mentions/index.js.map +1 -0
  82. package/dist/menubar/index.d.ts +3 -3
  83. package/dist/menubar/index.d.ts.map +1 -1
  84. package/dist/menubar/index.js +1 -1
  85. package/dist/multi-select/index.d.ts.map +1 -1
  86. package/dist/multi-select/index.js +3 -3
  87. package/dist/number-input/index.d.ts.map +1 -1
  88. package/dist/number-input/index.js +1 -1
  89. package/dist/qr-code/index.js +5 -0
  90. package/dist/qr-code/index.js.map +1 -0
  91. package/dist/resizable/index.js +4 -0
  92. package/dist/resizable/index.js.map +1 -0
  93. package/dist/result/index.js +4 -0
  94. package/dist/result/index.js.map +1 -0
  95. package/dist/select/index.d.ts.map +1 -1
  96. package/dist/select/index.js +3 -3
  97. package/dist/shared/useSelectBase.d.ts.map +1 -1
  98. package/dist/skeleton/index.d.ts.map +1 -1
  99. package/dist/skeleton/index.js +1 -1
  100. package/dist/table/index.js +4 -4
  101. package/dist/tabs/index.d.ts.map +1 -1
  102. package/dist/tabs/index.js +1 -1
  103. package/dist/tags-input/index.js +5 -0
  104. package/dist/tags-input/index.js.map +1 -0
  105. package/dist/toast/index.d.ts.map +1 -1
  106. package/dist/toast/index.js +1 -1
  107. package/dist/tooltip/index.d.ts.map +1 -1
  108. package/dist/tooltip/index.js +1 -1
  109. package/dist/tour/index.js +5 -0
  110. package/dist/tour/index.js.map +1 -0
  111. package/dist/typography/index.js +4 -0
  112. package/dist/typography/index.js.map +1 -0
  113. package/dist/watermark/index.js +4 -0
  114. package/dist/watermark/index.js.map +1 -0
  115. package/package.json +59 -11
  116. package/styles/global.css +498 -6016
  117. package/dist/chunk-253JZOYG.js.map +0 -1
  118. package/dist/chunk-BGMYX7L5.js.map +0 -1
  119. package/dist/chunk-BKLJDEUX.js.map +0 -1
  120. package/dist/chunk-BS4PZPY6.js +0 -322
  121. package/dist/chunk-BS4PZPY6.js.map +0 -1
  122. package/dist/chunk-HJITFPBT.js.map +0 -1
  123. package/dist/chunk-HVHQA34X.js.map +0 -1
  124. package/dist/chunk-I5AD247M.js.map +0 -1
  125. package/dist/chunk-SFP77VS3.js.map +0 -1
  126. package/dist/chunk-W5VLFE4U.js.map +0 -1
  127. package/dist/chunk-X7MF3TIF.js.map +0 -1
  128. package/dist/chunk-XOEEAMMY.js.map +0 -1
@@ -25,6 +25,9 @@ var Skeleton = React.memo(
25
25
  "div",
26
26
  {
27
27
  "data-slot": "root",
28
+ role: "status",
29
+ "aria-busy": "true",
30
+ "aria-label": "Loading",
28
31
  className: cn(
29
32
  "skeleton_root",
30
33
  skeletonVariants({ size, color }),
@@ -40,5 +43,5 @@ Skeleton.displayName = "Skeleton";
40
43
  var skeleton_default = Skeleton;
41
44
 
42
45
  export { skeleton_default };
43
- //# sourceMappingURL=chunk-SFP77VS3.js.map
44
- //# sourceMappingURL=chunk-SFP77VS3.js.map
46
+ //# sourceMappingURL=chunk-X7JN7WPF.js.map
47
+ //# sourceMappingURL=chunk-X7JN7WPF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/skeleton/index.tsx"],"names":[],"mappings":";;;;;;AASA,IAAM,gBAAA,GAAmB,IAAI,uBAAA,EAAyB;AAAA,EACpD,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,EAAA,EAAI,KAAA;AAAA,MACJ,EAAA,EAAI,KAAA;AAAA,MACJ,EAAA,EAAI,KAAA;AAAA,MACJ,EAAA,EAAI;AAAA,KACN;AAAA,IACA,KAAA,EAAO;AAAA,GACT;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,IAAA;AAAA,IACN,KAAA,EAAO;AAAA;AAEX,CAAC,CAAA;AAED,IAAM,WAAW,KAAA,CAAM,IAAA;AAAA,EACrB,CAAC,EAAE,KAAA,GAAQ,SAAA,EAAW,OAAO,IAAA,EAAM,SAAA,EAAW,MAAA,GAAS,KAAA,EAAM,KAAM;AACjE,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,MAAA;AAAA,QACV,IAAA,EAAK,QAAA;AAAA,QACL,WAAA,EAAU,MAAA;AAAA,QACV,YAAA,EAAW,SAAA;AAAA,QACX,SAAA,EAAW,EAAA;AAAA,UACT,eAAA;AAAA,UACA,gBAAA,CAAiB,EAAE,IAAA,EAAM,KAAA,EAAO,CAAA;AAAA,UAChC,YAAA;AAAA,UACA,MAAA,IAAU,4BAAA;AAAA,UACV;AAAA;AACF;AAAA,KACF;AAAA,EAEJ;AACF,CAAA;AAEA,QAAA,CAAS,WAAA,GAAc,UAAA;AAGvB,IAAO,gBAAA,GAAQ","file":"chunk-X7JN7WPF.js","sourcesContent":["'use client'\n\nimport { cva } from 'class-variance-authority'\nimport React from 'react'\n\nimport { cn } from '../utils'\nimport { colorVars } from '../variants'\nimport type { SkeletonProps } from './types'\n\nconst skeletonVariants = cva('animate-pulse rounded', {\n variants: {\n size: {\n xs: 'h-3',\n sm: 'h-4',\n md: 'h-5',\n lg: 'h-6',\n },\n color: colorVars,\n },\n defaultVariants: {\n size: 'md',\n color: 'default',\n },\n})\n\nconst Skeleton = React.memo<SkeletonProps>(\n ({ color = 'default', size = 'md', className, circle = false }) => {\n return (\n <div\n data-slot=\"root\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading\"\n className={cn(\n 'skeleton_root',\n skeletonVariants({ size, color }),\n 'bg-slot-50',\n circle && 'rounded-full aspect-square',\n className,\n )}\n />\n )\n },\n)\n\nSkeleton.displayName = 'Skeleton'\n\nexport type * from './types'\nexport default Skeleton\n"]}
@@ -0,0 +1,201 @@
1
+ import { colorVars } from './chunk-G6QIIWKU.js';
2
+ import { cn } from './chunk-RAS6HUEI.js';
3
+ import { cva } from 'class-variance-authority';
4
+ import React, { useState, useCallback, useEffect } from 'react';
5
+ import { ArrowUp, X, Plus } from 'lucide-react';
6
+ import { jsxs, jsx } from 'react/jsx-runtime';
7
+
8
+ var buttonVariants = cva(
9
+ "inline-flex items-center justify-center shadow-lg transition-all hover:scale-105 active:scale-95 disabled:opacity-50 disabled:pointer-events-none cursor-pointer",
10
+ {
11
+ variants: {
12
+ size: {
13
+ xs: "w-8 h-8 text-sm",
14
+ sm: "w-10 h-10 text-base",
15
+ md: "w-12 h-12 text-lg",
16
+ lg: "w-14 h-14 text-xl"
17
+ },
18
+ shape: {
19
+ circle: "rounded-full",
20
+ square: "rounded-lg"
21
+ },
22
+ variant: {
23
+ default: "bg-background border border-border text-text-primary hover:bg-surface",
24
+ colored: "bg-slot text-slot-fg hover:bg-slot-90"
25
+ }
26
+ },
27
+ defaultVariants: { size: "md", shape: "circle", variant: "default" }
28
+ }
29
+ );
30
+ var FloatButton = React.memo(
31
+ ({
32
+ icon,
33
+ label,
34
+ tooltip,
35
+ badge,
36
+ onClick,
37
+ href,
38
+ target,
39
+ color = "default",
40
+ size = "md",
41
+ shape = "circle",
42
+ disabled = false,
43
+ className,
44
+ classNames,
45
+ style
46
+ }) => {
47
+ const variant = color === "default" ? "default" : "colored";
48
+ const Component = href ? "a" : "button";
49
+ const content = /* @__PURE__ */ jsxs(
50
+ Component,
51
+ {
52
+ ...href ? { href, target } : { type: "button", onClick, disabled },
53
+ "data-slot": "button",
54
+ title: tooltip,
55
+ className: cn(
56
+ "floatButton_button",
57
+ buttonVariants({ size, shape, variant }),
58
+ color !== "default" && colorVars[color],
59
+ "relative",
60
+ classNames?.button,
61
+ className
62
+ ),
63
+ style,
64
+ children: [
65
+ icon,
66
+ label && !icon && /* @__PURE__ */ jsx("span", { className: "text-xs font-medium", children: label }),
67
+ badge !== void 0 && /* @__PURE__ */ jsx(
68
+ "span",
69
+ {
70
+ "data-slot": "badge",
71
+ className: cn(
72
+ "floatButton_badge",
73
+ "absolute -top-1 -right-1 min-w-[18px] h-[18px] px-1 rounded-full bg-error text-error-foreground text-[10px] font-medium flex items-center justify-center",
74
+ classNames?.badge
75
+ ),
76
+ children: badge
77
+ }
78
+ )
79
+ ]
80
+ }
81
+ );
82
+ return content;
83
+ }
84
+ );
85
+ FloatButton.displayName = "FloatButton";
86
+ var FloatButtonGroup = React.memo(
87
+ ({
88
+ children,
89
+ trigger = "click",
90
+ icon,
91
+ closeIcon,
92
+ open: controlledOpen,
93
+ onOpenChange,
94
+ shape = "circle",
95
+ color = "primary",
96
+ size = "md",
97
+ placement = "top",
98
+ className,
99
+ classNames,
100
+ style
101
+ }) => {
102
+ const [internalOpen, setInternalOpen] = useState(false);
103
+ const isOpen = controlledOpen !== void 0 ? controlledOpen : internalOpen;
104
+ const setOpen = useCallback(
105
+ (v) => {
106
+ if (controlledOpen === void 0) setInternalOpen(v);
107
+ onOpenChange?.(v);
108
+ },
109
+ [controlledOpen, onOpenChange]
110
+ );
111
+ const placementClasses = {
112
+ top: "flex-col-reverse gap-3 bottom-0",
113
+ bottom: "flex-col gap-3 top-0",
114
+ left: "flex-row-reverse gap-3 right-0",
115
+ right: "flex-row gap-3 left-0"
116
+ };
117
+ const openIcon = icon ?? /* @__PURE__ */ jsx(Plus, { className: "w-5 h-5" });
118
+ const closedIcon = closeIcon ?? /* @__PURE__ */ jsx(X, { className: "w-5 h-5" });
119
+ return /* @__PURE__ */ jsxs(
120
+ "div",
121
+ {
122
+ "data-slot": "group",
123
+ className: cn("floatButton_group", "relative inline-flex", classNames?.group, className),
124
+ style,
125
+ onMouseEnter: trigger === "hover" ? () => setOpen(true) : void 0,
126
+ onMouseLeave: trigger === "hover" ? () => setOpen(false) : void 0,
127
+ children: [
128
+ /* @__PURE__ */ jsx(
129
+ FloatButton,
130
+ {
131
+ icon: /* @__PURE__ */ jsx("span", { className: cn("transition-transform duration-200", isOpen && "rotate-45"), children: isOpen ? closedIcon : openIcon }),
132
+ color,
133
+ size,
134
+ shape,
135
+ onClick: trigger === "click" ? () => setOpen(!isOpen) : void 0
136
+ }
137
+ ),
138
+ isOpen && /* @__PURE__ */ jsx("div", { className: cn("absolute flex items-center", placementClasses[placement]), children: React.Children.map(children, (child, idx) => {
139
+ if (!React.isValidElement(child)) return child;
140
+ return /* @__PURE__ */ jsx(
141
+ "div",
142
+ {
143
+ className: "animate-in fade-in zoom-in-75",
144
+ style: { animationDelay: `${idx * 50}ms`, animationFillMode: "both", animationDuration: "150ms" },
145
+ children: React.cloneElement(child, {
146
+ size: child.props.size || size,
147
+ shape: child.props.shape || shape
148
+ })
149
+ },
150
+ idx
151
+ );
152
+ }) })
153
+ ]
154
+ }
155
+ );
156
+ }
157
+ );
158
+ FloatButtonGroup.displayName = "FloatButtonGroup";
159
+ var BackTop = React.memo(
160
+ ({
161
+ visibilityHeight = 400,
162
+ onClick,
163
+ icon,
164
+ size = "md",
165
+ shape = "circle",
166
+ color = "default",
167
+ ...props
168
+ }) => {
169
+ const [visible, setVisible] = useState(false);
170
+ useEffect(() => {
171
+ if (typeof window === "undefined") return;
172
+ const handleScroll = () => setVisible(window.scrollY >= visibilityHeight);
173
+ handleScroll();
174
+ window.addEventListener("scroll", handleScroll, { passive: true });
175
+ return () => window.removeEventListener("scroll", handleScroll);
176
+ }, [visibilityHeight]);
177
+ const handleClick = useCallback(() => {
178
+ window.scrollTo({ top: 0, behavior: "smooth" });
179
+ onClick?.();
180
+ }, [onClick]);
181
+ if (!visible) return null;
182
+ return /* @__PURE__ */ jsx(
183
+ FloatButton,
184
+ {
185
+ icon: icon ?? /* @__PURE__ */ jsx(ArrowUp, { className: "w-5 h-5" }),
186
+ tooltip: "Back to top",
187
+ onClick: handleClick,
188
+ size,
189
+ shape,
190
+ color,
191
+ ...props
192
+ }
193
+ );
194
+ }
195
+ );
196
+ BackTop.displayName = "BackTop";
197
+ var float_button_default = FloatButton;
198
+
199
+ export { BackTop, FloatButton, FloatButtonGroup, float_button_default };
200
+ //# sourceMappingURL=chunk-YRSHBAUQ.js.map
201
+ //# sourceMappingURL=chunk-YRSHBAUQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/float-button/index.tsx"],"names":[],"mappings":"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","file":"chunk-YRSHBAUQ.js","sourcesContent":["'use client'\n\nimport { cva } from 'class-variance-authority'\nimport React, { useState, useEffect, useCallback } from 'react'\n\nimport { ArrowUp, X, Plus } from 'lucide-react'\nimport { cn } from '../utils'\nimport { colorVars } from '../variants'\nimport type { FloatButtonProps, FloatButtonGroupProps, BackTopProps } from './types'\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center shadow-lg transition-all hover:scale-105 active:scale-95 disabled:opacity-50 disabled:pointer-events-none cursor-pointer',\n {\n variants: {\n size: {\n xs: 'w-8 h-8 text-sm',\n sm: 'w-10 h-10 text-base',\n md: 'w-12 h-12 text-lg',\n lg: 'w-14 h-14 text-xl',\n },\n shape: {\n circle: 'rounded-full',\n square: 'rounded-lg',\n },\n variant: {\n default: 'bg-background border border-border text-text-primary hover:bg-surface',\n colored: 'bg-slot text-slot-fg hover:bg-slot-90',\n },\n },\n defaultVariants: { size: 'md', shape: 'circle', variant: 'default' },\n },\n)\n\nconst FloatButton = React.memo<FloatButtonProps>(\n ({\n icon,\n label,\n tooltip,\n badge,\n onClick,\n href,\n target,\n color = 'default',\n size = 'md',\n shape = 'circle',\n disabled = false,\n className,\n classNames,\n style,\n }) => {\n const variant = color === 'default' ? 'default' : 'colored'\n const Component = href ? 'a' : 'button'\n\n const content = (\n <Component\n {...(href ? { href, target } : { type: 'button' as const, onClick, disabled })}\n data-slot=\"button\"\n title={tooltip}\n className={cn(\n 'floatButton_button',\n buttonVariants({ size, shape, variant }),\n color !== 'default' && colorVars[color],\n 'relative',\n classNames?.button,\n className,\n )}\n style={style}\n >\n {icon}\n {label && !icon && <span className=\"text-xs font-medium\">{label}</span>}\n {badge !== undefined && (\n <span\n data-slot=\"badge\"\n className={cn(\n 'floatButton_badge',\n 'absolute -top-1 -right-1 min-w-[18px] h-[18px] px-1 rounded-full bg-error text-error-foreground text-[10px] font-medium flex items-center justify-center',\n classNames?.badge,\n )}\n >\n {badge}\n </span>\n )}\n </Component>\n )\n\n return content\n },\n)\n\nFloatButton.displayName = 'FloatButton'\n\nconst FloatButtonGroup = React.memo<FloatButtonGroupProps>(\n ({\n children,\n trigger = 'click',\n icon,\n closeIcon,\n open: controlledOpen,\n onOpenChange,\n shape = 'circle',\n color = 'primary',\n size = 'md',\n placement = 'top',\n className,\n classNames,\n style,\n }) => {\n const [internalOpen, setInternalOpen] = useState(false)\n const isOpen = controlledOpen !== undefined ? controlledOpen : internalOpen\n\n const setOpen = useCallback(\n (v: boolean) => {\n if (controlledOpen === undefined) setInternalOpen(v)\n onOpenChange?.(v)\n },\n [controlledOpen, onOpenChange],\n )\n\n const placementClasses = {\n top: 'flex-col-reverse gap-3 bottom-0',\n bottom: 'flex-col gap-3 top-0',\n left: 'flex-row-reverse gap-3 right-0',\n right: 'flex-row gap-3 left-0',\n }\n\n const openIcon = icon ?? <Plus className=\"w-5 h-5\" />\n const closedIcon = closeIcon ?? <X className=\"w-5 h-5\" />\n\n return (\n <div\n data-slot=\"group\"\n className={cn('floatButton_group', 'relative inline-flex', classNames?.group, className)}\n style={style}\n onMouseEnter={trigger === 'hover' ? () => setOpen(true) : undefined}\n onMouseLeave={trigger === 'hover' ? () => setOpen(false) : undefined}\n >\n <FloatButton\n icon={\n <span className={cn('transition-transform duration-200', isOpen && 'rotate-45')}>\n {isOpen ? closedIcon : openIcon}\n </span>\n }\n color={color}\n size={size}\n shape={shape}\n onClick={trigger === 'click' ? () => setOpen(!isOpen) : undefined}\n />\n\n {isOpen && (\n <div className={cn('absolute flex items-center', placementClasses[placement])}>\n {React.Children.map(children, (child, idx) => {\n if (!React.isValidElement(child)) return child\n return (\n <div\n key={idx}\n className=\"animate-in fade-in zoom-in-75\"\n style={{ animationDelay: `${idx * 50}ms`, animationFillMode: 'both', animationDuration: '150ms' }}\n >\n {React.cloneElement(child as React.ReactElement<FloatButtonProps>, {\n size: (child as React.ReactElement<FloatButtonProps>).props.size || size,\n shape: (child as React.ReactElement<FloatButtonProps>).props.shape || shape,\n })}\n </div>\n )\n })}\n </div>\n )}\n </div>\n )\n },\n)\n\nFloatButtonGroup.displayName = 'FloatButtonGroup'\n\nconst BackTop = React.memo<BackTopProps>(\n ({\n visibilityHeight = 400,\n onClick,\n icon,\n size = 'md',\n shape = 'circle',\n color = 'default',\n ...props\n }) => {\n const [visible, setVisible] = useState(false)\n\n useEffect(() => {\n if (typeof window === 'undefined') return\n const handleScroll = () => setVisible(window.scrollY >= visibilityHeight)\n handleScroll()\n window.addEventListener('scroll', handleScroll, { passive: true })\n return () => window.removeEventListener('scroll', handleScroll)\n }, [visibilityHeight])\n\n const handleClick = useCallback(() => {\n window.scrollTo({ top: 0, behavior: 'smooth' })\n onClick?.()\n }, [onClick])\n\n if (!visible) return null\n\n return (\n <FloatButton\n icon={icon ?? <ArrowUp className=\"w-5 h-5\" />}\n tooltip=\"Back to top\"\n onClick={handleClick}\n size={size}\n shape={shape}\n color={color}\n {...props}\n />\n )\n },\n)\n\nBackTop.displayName = 'BackTop'\n\nexport type * from './types'\nexport { FloatButton, FloatButtonGroup, BackTop }\nexport default FloatButton\n"]}
@@ -0,0 +1,303 @@
1
+ import { colorVars } from './chunk-G6QIIWKU.js';
2
+ import { cn } from './chunk-RAS6HUEI.js';
3
+ import React, { useState, useRef, useCallback, useEffect } from 'react';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ function getTargetElement(target) {
7
+ if (typeof target === "function") return target();
8
+ return document.querySelector(target);
9
+ }
10
+ function getTargetBorderRadius(el) {
11
+ if (typeof window === "undefined") return "0px";
12
+ return getComputedStyle(el).borderRadius || "0px";
13
+ }
14
+ function computePopoverPosition(rect, placement, gap) {
15
+ const base = placement.split("-")[0];
16
+ const align = placement.split("-")[1];
17
+ let top = 0;
18
+ let left = 0;
19
+ const cx = rect.left + rect.width / 2;
20
+ const cy = rect.top + rect.height / 2;
21
+ if (base === "bottom") {
22
+ top = rect.bottom + gap;
23
+ left = align === "start" ? rect.left : align === "end" ? rect.right : cx;
24
+ } else if (base === "top") {
25
+ top = rect.top - gap;
26
+ left = align === "start" ? rect.left : align === "end" ? rect.right : cx;
27
+ } else if (base === "left") {
28
+ top = align === "start" ? rect.top : align === "end" ? rect.bottom : cy;
29
+ left = rect.left - gap;
30
+ } else {
31
+ top = align === "start" ? rect.top : align === "end" ? rect.bottom : cy;
32
+ left = rect.right + gap;
33
+ }
34
+ return { top, left };
35
+ }
36
+ function getPopoverStyle(rect, placement, gap) {
37
+ const base = placement.split("-")[0];
38
+ const align = placement.split("-")[1];
39
+ const pos = computePopoverPosition(rect, placement, gap);
40
+ const style = {
41
+ position: "fixed",
42
+ top: pos.top,
43
+ left: pos.left
44
+ };
45
+ if (base === "bottom") {
46
+ if (!align) style.transform = "translateX(-50%)";
47
+ else if (align === "end") style.transform = "translateX(-100%)";
48
+ } else if (base === "top") {
49
+ if (!align) style.transform = "translate(-50%, -100%)";
50
+ else if (align === "start") style.transform = "translateY(-100%)";
51
+ else style.transform = "translate(-100%, -100%)";
52
+ } else if (base === "left") {
53
+ if (!align) style.transform = "translate(-100%, -50%)";
54
+ else if (align === "start") style.transform = "translateX(-100%)";
55
+ else style.transform = "translate(-100%, -100%)";
56
+ } else {
57
+ if (!align) style.transform = "translateY(-50%)";
58
+ else if (align === "end") style.transform = "translateY(-100%)";
59
+ }
60
+ return style;
61
+ }
62
+ var sizeMap = {
63
+ xs: { padding: 4, gap: 8, popover: "p-3 max-w-[260px]", title: "text-sm font-semibold", desc: "text-xs", btn: "h-6 px-2.5 text-xs" },
64
+ sm: { padding: 6, gap: 10, popover: "p-3.5 max-w-[300px]", title: "text-sm font-semibold", desc: "text-sm", btn: "h-7 px-3 text-xs" },
65
+ md: { padding: 8, gap: 12, popover: "p-4 max-w-[340px]", title: "text-base font-semibold", desc: "text-sm", btn: "h-8 px-3 text-sm" },
66
+ lg: { padding: 10, gap: 14, popover: "p-5 max-w-[400px]", title: "text-lg font-semibold", desc: "text-base", btn: "h-9 px-4 text-sm" }
67
+ };
68
+ var EASE = "cubic-bezier(0.4, 0, 0.2, 1)";
69
+ var DURATION = "350ms";
70
+ var Tour = React.memo(
71
+ ({
72
+ steps,
73
+ open: controlledOpen,
74
+ onOpenChange,
75
+ current: controlledCurrent,
76
+ onCurrentChange,
77
+ color = "primary",
78
+ size = "md",
79
+ showProgress = true,
80
+ showSkip = true,
81
+ skipText = "Skip",
82
+ finishText = "Finish",
83
+ nextText = "Next",
84
+ prevText = "Back",
85
+ onFinish,
86
+ onSkip,
87
+ overlayClickable = false,
88
+ className,
89
+ classNames
90
+ }) => {
91
+ const [internalOpen, setInternalOpen] = useState(false);
92
+ const [internalCurrent, setInternalCurrent] = useState(0);
93
+ const isOpen = controlledOpen !== void 0 ? controlledOpen : internalOpen;
94
+ const current = controlledCurrent !== void 0 ? controlledCurrent : internalCurrent;
95
+ const [targetRect, setTargetRect] = useState(null);
96
+ const [targetRadius, setTargetRadius] = useState("0px");
97
+ const [entering, setEntering] = useState(false);
98
+ const [contentFading, setContentFading] = useState(false);
99
+ const popoverRef = useRef(null);
100
+ const setOpen = useCallback(
101
+ (v) => {
102
+ if (controlledOpen === void 0) setInternalOpen(v);
103
+ onOpenChange?.(v);
104
+ },
105
+ [controlledOpen, onOpenChange]
106
+ );
107
+ const setCurrent = useCallback(
108
+ (v) => {
109
+ setContentFading(true);
110
+ setTimeout(() => {
111
+ if (controlledCurrent === void 0) setInternalCurrent(v);
112
+ onCurrentChange?.(v);
113
+ setContentFading(false);
114
+ }, 150);
115
+ },
116
+ [controlledCurrent, onCurrentChange]
117
+ );
118
+ const step = steps[current];
119
+ const s = sizeMap[size];
120
+ useEffect(() => {
121
+ if (isOpen) {
122
+ setEntering(true);
123
+ const t = setTimeout(() => setEntering(false), 400);
124
+ return () => clearTimeout(t);
125
+ }
126
+ }, [isOpen]);
127
+ useEffect(() => {
128
+ if (!isOpen || !step) {
129
+ setTargetRect(null);
130
+ return;
131
+ }
132
+ const el = getTargetElement(step.target);
133
+ if (!el) {
134
+ setTargetRect(null);
135
+ return;
136
+ }
137
+ const updateRect = () => {
138
+ setTargetRect(el.getBoundingClientRect());
139
+ setTargetRadius(getTargetBorderRadius(el));
140
+ };
141
+ updateRect();
142
+ el.scrollIntoView({ behavior: "smooth", block: "center" });
143
+ const ro = new ResizeObserver(updateRect);
144
+ ro.observe(el);
145
+ window.addEventListener("scroll", updateRect, { passive: true });
146
+ window.addEventListener("resize", updateRect, { passive: true });
147
+ return () => {
148
+ ro.disconnect();
149
+ window.removeEventListener("scroll", updateRect);
150
+ window.removeEventListener("resize", updateRect);
151
+ };
152
+ }, [isOpen, current, step]);
153
+ const handleNext = () => {
154
+ step?.onNext?.();
155
+ if (current < steps.length - 1) setCurrent(current + 1);
156
+ else {
157
+ setOpen(false);
158
+ onFinish?.();
159
+ }
160
+ };
161
+ const handlePrev = () => {
162
+ step?.onPrev?.();
163
+ if (current > 0) setCurrent(current - 1);
164
+ };
165
+ const handleSkip = () => {
166
+ setOpen(false);
167
+ if (controlledCurrent === void 0) setInternalCurrent(0);
168
+ onSkip?.();
169
+ };
170
+ useEffect(() => {
171
+ if (!isOpen) return;
172
+ const handleEsc = (e) => {
173
+ if (e.key === "Escape") handleSkip();
174
+ };
175
+ document.addEventListener("keydown", handleEsc);
176
+ return () => document.removeEventListener("keydown", handleEsc);
177
+ }, [isOpen]);
178
+ if (!isOpen || !step) return null;
179
+ const placement = step.placement || "bottom";
180
+ const isLast = current === steps.length - 1;
181
+ const spotlightStyle = targetRect ? {
182
+ position: "fixed",
183
+ top: targetRect.top - s.padding,
184
+ left: targetRect.left - s.padding,
185
+ width: targetRect.width + s.padding * 2,
186
+ height: targetRect.height + s.padding * 2,
187
+ borderRadius: targetRadius,
188
+ boxShadow: "0 0 0 9999px rgba(0, 0, 0, 0.5)",
189
+ transition: entering ? "none" : `top ${DURATION} ${EASE}, left ${DURATION} ${EASE}, width ${DURATION} ${EASE}, height ${DURATION} ${EASE}, border-radius ${DURATION} ${EASE}`,
190
+ pointerEvents: "none",
191
+ opacity: entering ? 0 : 1,
192
+ animation: entering ? "none" : void 0
193
+ } : {
194
+ position: "fixed",
195
+ inset: 0,
196
+ background: "rgba(0,0,0,0.5)"
197
+ };
198
+ const popoverStyle = targetRect ? {
199
+ ...getPopoverStyle(targetRect, placement, s.gap),
200
+ transition: entering ? "none" : `top ${DURATION} ${EASE}, left ${DURATION} ${EASE}, bottom ${DURATION} ${EASE}, right ${DURATION} ${EASE}, opacity 150ms ease`,
201
+ opacity: contentFading ? 0 : 1
202
+ } : { position: "fixed", opacity: 0 };
203
+ return /* @__PURE__ */ jsxs(
204
+ "div",
205
+ {
206
+ "data-slot": "root",
207
+ className: cn("tour_root", colorVars[color], classNames?.root, className),
208
+ style: { opacity: entering ? 0 : 1, transition: `opacity 300ms ${EASE}` },
209
+ ref: (el) => {
210
+ if (el && entering) requestAnimationFrame(() => setEntering(false));
211
+ },
212
+ children: [
213
+ /* @__PURE__ */ jsx(
214
+ "div",
215
+ {
216
+ "data-slot": "overlay",
217
+ className: cn("tour_overlay", "z-[var(--z-overlay)]", classNames?.overlay),
218
+ onClick: overlayClickable ? handleSkip : void 0,
219
+ style: spotlightStyle
220
+ }
221
+ ),
222
+ targetRect && /* @__PURE__ */ jsx(
223
+ "div",
224
+ {
225
+ "data-slot": "highlight",
226
+ className: "fixed z-[var(--z-overlay)] pointer-events-none",
227
+ style: {
228
+ top: targetRect.top - s.padding,
229
+ left: targetRect.left - s.padding,
230
+ width: targetRect.width + s.padding * 2,
231
+ height: targetRect.height + s.padding * 2,
232
+ borderRadius: targetRadius,
233
+ boxShadow: "0 0 0 2px var(--color-slot, #3b82f6), 0 0 12px 2px color-mix(in srgb, var(--color-slot, #3b82f6) 30%, transparent)",
234
+ transition: `top ${DURATION} ${EASE}, left ${DURATION} ${EASE}, width ${DURATION} ${EASE}, height ${DURATION} ${EASE}, border-radius ${DURATION} ${EASE}`
235
+ }
236
+ }
237
+ ),
238
+ /* @__PURE__ */ jsxs(
239
+ "div",
240
+ {
241
+ ref: popoverRef,
242
+ "data-slot": "popover",
243
+ className: cn(
244
+ "tour_popover",
245
+ "z-[calc(var(--z-overlay)+1)] rounded-lg border border-border bg-background shadow-lg",
246
+ s.popover,
247
+ classNames?.popover
248
+ ),
249
+ style: popoverStyle,
250
+ children: [
251
+ step.cover && /* @__PURE__ */ jsx("div", { "data-slot": "cover", className: cn("tour_cover", "mb-3 rounded-md overflow-hidden", classNames?.cover), children: step.cover }),
252
+ /* @__PURE__ */ jsx("div", { "data-slot": "title", className: cn("tour_title", s.title, "text-text-primary", classNames?.title), children: step.title }),
253
+ step.description && /* @__PURE__ */ jsx("div", { "data-slot": "description", className: cn("tour_description", s.desc, "text-text-secondary mt-1", classNames?.description), children: step.description }),
254
+ /* @__PURE__ */ jsxs("div", { "data-slot": "footer", className: cn("tour_footer", "flex items-center justify-between mt-3 gap-2", classNames?.footer), children: [
255
+ /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2", children: showProgress && /* @__PURE__ */ jsxs("span", { "data-slot": "indicator", className: cn("tour_indicator", "text-xs text-text-secondary", classNames?.indicator), children: [
256
+ current + 1,
257
+ " / ",
258
+ steps.length
259
+ ] }) }),
260
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
261
+ showSkip && !isLast && /* @__PURE__ */ jsx(
262
+ "button",
263
+ {
264
+ type: "button",
265
+ onClick: handleSkip,
266
+ className: cn("inline-flex items-center justify-center rounded-md text-text-secondary hover:text-text-primary transition-colors font-medium cursor-pointer", s.btn),
267
+ children: skipText
268
+ }
269
+ ),
270
+ current > 0 && /* @__PURE__ */ jsx(
271
+ "button",
272
+ {
273
+ type: "button",
274
+ onClick: handlePrev,
275
+ className: cn("inline-flex items-center justify-center rounded-md border border-border bg-background text-text-primary hover:bg-surface transition-colors font-medium cursor-pointer", s.btn),
276
+ children: step.prevText || prevText
277
+ }
278
+ ),
279
+ /* @__PURE__ */ jsx(
280
+ "button",
281
+ {
282
+ type: "button",
283
+ onClick: handleNext,
284
+ className: cn("inline-flex items-center justify-center rounded-md bg-slot text-slot-fg hover:bg-slot-90 transition-colors font-medium cursor-pointer", s.btn),
285
+ children: isLast ? finishText : step.nextText || nextText
286
+ }
287
+ )
288
+ ] })
289
+ ] })
290
+ ]
291
+ }
292
+ )
293
+ ]
294
+ }
295
+ );
296
+ }
297
+ );
298
+ Tour.displayName = "Tour";
299
+ var tour_default = Tour;
300
+
301
+ export { tour_default };
302
+ //# sourceMappingURL=chunk-YUACN5GJ.js.map
303
+ //# sourceMappingURL=chunk-YUACN5GJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tour/index.tsx"],"names":[],"mappings":"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","file":"chunk-YUACN5GJ.js","sourcesContent":["'use client'\n\nimport React, { useState, useEffect, useCallback, useRef } from 'react'\n\nimport { cn } from '../utils'\nimport { colorVars } from '../variants'\nimport type { TourProps, TourPlacement } from './types'\n\nfunction getTargetElement(target: string | (() => HTMLElement | null)): HTMLElement | null {\n if (typeof target === 'function') return target()\n return document.querySelector(target)\n}\n\nfunction getTargetBorderRadius(el: HTMLElement): string {\n if (typeof window === 'undefined') return '0px'\n return getComputedStyle(el).borderRadius || '0px'\n}\n\n// ── Popover positioning ─────────────────────────────────────\nfunction computePopoverPosition(\n rect: DOMRect,\n placement: TourPlacement,\n gap: number,\n): { top: number; left: number } {\n const base = placement.split('-')[0] as 'top' | 'right' | 'bottom' | 'left'\n const align = placement.split('-')[1] as 'start' | 'end' | undefined\n\n let top = 0\n let left = 0\n\n const cx = rect.left + rect.width / 2\n const cy = rect.top + rect.height / 2\n\n if (base === 'bottom') {\n top = rect.bottom + gap\n left = align === 'start' ? rect.left : align === 'end' ? rect.right : cx\n } else if (base === 'top') {\n top = rect.top - gap\n left = align === 'start' ? rect.left : align === 'end' ? rect.right : cx\n } else if (base === 'left') {\n top = align === 'start' ? rect.top : align === 'end' ? rect.bottom : cy\n left = rect.left - gap\n } else {\n top = align === 'start' ? rect.top : align === 'end' ? rect.bottom : cy\n left = rect.right + gap\n }\n\n return { top, left }\n}\n\nfunction getPopoverStyle(\n rect: DOMRect,\n placement: TourPlacement,\n gap: number,\n): React.CSSProperties {\n const base = placement.split('-')[0] as 'top' | 'right' | 'bottom' | 'left'\n const align = placement.split('-')[1] as 'start' | 'end' | undefined\n\n const pos = computePopoverPosition(rect, placement, gap)\n const style: React.CSSProperties = {\n position: 'fixed',\n top: pos.top,\n left: pos.left,\n }\n\n // Transform for anchoring\n if (base === 'bottom') {\n if (!align) style.transform = 'translateX(-50%)'\n else if (align === 'end') style.transform = 'translateX(-100%)'\n } else if (base === 'top') {\n if (!align) style.transform = 'translate(-50%, -100%)'\n else if (align === 'start') style.transform = 'translateY(-100%)'\n else style.transform = 'translate(-100%, -100%)'\n } else if (base === 'left') {\n if (!align) style.transform = 'translate(-100%, -50%)'\n else if (align === 'start') style.transform = 'translateX(-100%)'\n else style.transform = 'translate(-100%, -100%)'\n } else {\n if (!align) style.transform = 'translateY(-50%)'\n else if (align === 'end') style.transform = 'translateY(-100%)'\n }\n\n return style\n}\n\nconst sizeMap = {\n xs: { padding: 4, gap: 8, popover: 'p-3 max-w-[260px]', title: 'text-sm font-semibold', desc: 'text-xs', btn: 'h-6 px-2.5 text-xs' },\n sm: { padding: 6, gap: 10, popover: 'p-3.5 max-w-[300px]', title: 'text-sm font-semibold', desc: 'text-sm', btn: 'h-7 px-3 text-xs' },\n md: { padding: 8, gap: 12, popover: 'p-4 max-w-[340px]', title: 'text-base font-semibold', desc: 'text-sm', btn: 'h-8 px-3 text-sm' },\n lg: { padding: 10, gap: 14, popover: 'p-5 max-w-[400px]', title: 'text-lg font-semibold', desc: 'text-base', btn: 'h-9 px-4 text-sm' },\n}\n\n// Transition easing\nconst EASE = 'cubic-bezier(0.4, 0, 0.2, 1)'\nconst DURATION = '350ms'\n\nconst Tour = React.memo<TourProps>(\n ({\n steps,\n open: controlledOpen,\n onOpenChange,\n current: controlledCurrent,\n onCurrentChange,\n color = 'primary',\n size = 'md',\n showProgress = true,\n showSkip = true,\n skipText = 'Skip',\n finishText = 'Finish',\n nextText = 'Next',\n prevText = 'Back',\n onFinish,\n onSkip,\n overlayClickable = false,\n className,\n classNames,\n }) => {\n const [internalOpen, setInternalOpen] = useState(false)\n const [internalCurrent, setInternalCurrent] = useState(0)\n const isOpen = controlledOpen !== undefined ? controlledOpen : internalOpen\n const current = controlledCurrent !== undefined ? controlledCurrent : internalCurrent\n\n const [targetRect, setTargetRect] = useState<DOMRect | null>(null)\n const [targetRadius, setTargetRadius] = useState('0px')\n const [entering, setEntering] = useState(false)\n const [contentFading, setContentFading] = useState(false)\n const popoverRef = useRef<HTMLDivElement>(null)\n\n const setOpen = useCallback(\n (v: boolean) => {\n if (controlledOpen === undefined) setInternalOpen(v)\n onOpenChange?.(v)\n },\n [controlledOpen, onOpenChange],\n )\n\n const setCurrent = useCallback(\n (v: number) => {\n // Trigger content crossfade\n setContentFading(true)\n setTimeout(() => {\n if (controlledCurrent === undefined) setInternalCurrent(v)\n onCurrentChange?.(v)\n setContentFading(false)\n }, 150) // half of transition duration — content fades out then in\n },\n [controlledCurrent, onCurrentChange],\n )\n\n const step = steps[current]\n const s = sizeMap[size]\n\n // Initial entrance animation\n useEffect(() => {\n if (isOpen) {\n setEntering(true)\n const t = setTimeout(() => setEntering(false), 400)\n return () => clearTimeout(t)\n }\n }, [isOpen])\n\n // Track target rect + border-radius\n useEffect(() => {\n if (!isOpen || !step) { setTargetRect(null); return }\n const el = getTargetElement(step.target)\n if (!el) { setTargetRect(null); return }\n\n const updateRect = () => {\n setTargetRect(el.getBoundingClientRect())\n setTargetRadius(getTargetBorderRadius(el))\n }\n updateRect()\n\n el.scrollIntoView({ behavior: 'smooth', block: 'center' })\n\n const ro = new ResizeObserver(updateRect)\n ro.observe(el)\n window.addEventListener('scroll', updateRect, { passive: true })\n window.addEventListener('resize', updateRect, { passive: true })\n\n return () => {\n ro.disconnect()\n window.removeEventListener('scroll', updateRect)\n window.removeEventListener('resize', updateRect)\n }\n }, [isOpen, current, step])\n\n const handleNext = () => {\n step?.onNext?.()\n if (current < steps.length - 1) setCurrent(current + 1)\n else { setOpen(false); onFinish?.() }\n }\n\n const handlePrev = () => {\n step?.onPrev?.()\n if (current > 0) setCurrent(current - 1)\n }\n\n const handleSkip = () => {\n setOpen(false)\n if (controlledCurrent === undefined) setInternalCurrent(0)\n onSkip?.()\n }\n\n useEffect(() => {\n if (!isOpen) return\n const handleEsc = (e: KeyboardEvent) => { if (e.key === 'Escape') handleSkip() }\n document.addEventListener('keydown', handleEsc)\n return () => document.removeEventListener('keydown', handleEsc)\n }, [isOpen])\n\n if (!isOpen || !step) return null\n\n const placement = step.placement || 'bottom'\n const isLast = current === steps.length - 1\n\n // The spotlight element — uses box-shadow to create the overlay\n // As this element transitions position/size/border-radius, the\n // entire overlay smoothly morphs to follow the target.\n const spotlightStyle: React.CSSProperties = targetRect\n ? {\n position: 'fixed',\n top: targetRect.top - s.padding,\n left: targetRect.left - s.padding,\n width: targetRect.width + s.padding * 2,\n height: targetRect.height + s.padding * 2,\n borderRadius: targetRadius,\n boxShadow: '0 0 0 9999px rgba(0, 0, 0, 0.5)',\n transition: entering\n ? 'none'\n : `top ${DURATION} ${EASE}, left ${DURATION} ${EASE}, width ${DURATION} ${EASE}, height ${DURATION} ${EASE}, border-radius ${DURATION} ${EASE}`,\n pointerEvents: 'none' as const,\n opacity: entering ? 0 : 1,\n animation: entering ? 'none' : undefined,\n }\n : {\n position: 'fixed' as const,\n inset: 0,\n background: 'rgba(0,0,0,0.5)',\n }\n\n // Popover transitions position smoothly (no remount)\n const popoverStyle: React.CSSProperties = targetRect\n ? {\n ...getPopoverStyle(targetRect, placement, s.gap),\n transition: entering\n ? 'none'\n : `top ${DURATION} ${EASE}, left ${DURATION} ${EASE}, bottom ${DURATION} ${EASE}, right ${DURATION} ${EASE}, opacity 150ms ease`,\n opacity: contentFading ? 0 : 1,\n }\n : { position: 'fixed', opacity: 0 }\n\n return (\n <div\n data-slot=\"root\"\n className={cn('tour_root', colorVars[color], classNames?.root, className)}\n style={{ opacity: entering ? 0 : 1, transition: `opacity 300ms ${EASE}` }}\n ref={(el) => {\n // Trigger entrance fade after mount\n if (el && entering) requestAnimationFrame(() => setEntering(false))\n }}\n >\n {/* Spotlight overlay — single div, box-shadow creates darkened backdrop */}\n <div\n data-slot=\"overlay\"\n className={cn('tour_overlay', 'z-[var(--z-overlay)]', classNames?.overlay)}\n onClick={overlayClickable ? handleSkip : undefined}\n style={spotlightStyle}\n />\n\n {/* Highlight ring — follows target shape */}\n {targetRect && (\n <div\n data-slot=\"highlight\"\n className=\"fixed z-[var(--z-overlay)] pointer-events-none\"\n style={{\n top: targetRect.top - s.padding,\n left: targetRect.left - s.padding,\n width: targetRect.width + s.padding * 2,\n height: targetRect.height + s.padding * 2,\n borderRadius: targetRadius,\n boxShadow: '0 0 0 2px var(--color-slot, #3b82f6), 0 0 12px 2px color-mix(in srgb, var(--color-slot, #3b82f6) 30%, transparent)',\n transition: `top ${DURATION} ${EASE}, left ${DURATION} ${EASE}, width ${DURATION} ${EASE}, height ${DURATION} ${EASE}, border-radius ${DURATION} ${EASE}`,\n }}\n />\n )}\n\n {/* Popover — position transitions, content crossfades */}\n <div\n ref={popoverRef}\n data-slot=\"popover\"\n className={cn(\n 'tour_popover',\n 'z-[calc(var(--z-overlay)+1)] rounded-lg border border-border bg-background shadow-lg',\n s.popover,\n classNames?.popover,\n )}\n style={popoverStyle}\n >\n {step.cover && (\n <div data-slot=\"cover\" className={cn('tour_cover', 'mb-3 rounded-md overflow-hidden', classNames?.cover)}>\n {step.cover}\n </div>\n )}\n\n <div data-slot=\"title\" className={cn('tour_title', s.title, 'text-text-primary', classNames?.title)}>\n {step.title}\n </div>\n\n {step.description && (\n <div data-slot=\"description\" className={cn('tour_description', s.desc, 'text-text-secondary mt-1', classNames?.description)}>\n {step.description}\n </div>\n )}\n\n <div data-slot=\"footer\" className={cn('tour_footer', 'flex items-center justify-between mt-3 gap-2', classNames?.footer)}>\n <div className=\"flex items-center gap-2\">\n {showProgress && (\n <span data-slot=\"indicator\" className={cn('tour_indicator', 'text-xs text-text-secondary', classNames?.indicator)}>\n {current + 1} / {steps.length}\n </span>\n )}\n </div>\n\n <div className=\"flex items-center gap-2\">\n {showSkip && !isLast && (\n <button\n type=\"button\"\n onClick={handleSkip}\n className={cn('inline-flex items-center justify-center rounded-md text-text-secondary hover:text-text-primary transition-colors font-medium cursor-pointer', s.btn)}\n >\n {skipText}\n </button>\n )}\n\n {current > 0 && (\n <button\n type=\"button\"\n onClick={handlePrev}\n className={cn('inline-flex items-center justify-center rounded-md border border-border bg-background text-text-primary hover:bg-surface transition-colors font-medium cursor-pointer', s.btn)}\n >\n {step.prevText || prevText}\n </button>\n )}\n\n <button\n type=\"button\"\n onClick={handleNext}\n className={cn('inline-flex items-center justify-center rounded-md bg-slot text-slot-fg hover:bg-slot-90 transition-colors font-medium cursor-pointer', s.btn)}\n >\n {isLast ? finishText : step.nextText || nextText}\n </button>\n </div>\n </div>\n </div>\n </div>\n )\n },\n)\n\nTour.displayName = 'Tour'\n\nexport type * from './types'\nexport default Tour\n"]}
@@ -1,7 +1,7 @@
1
- import { useSelectBase } from './chunk-HJITFPBT.js';
1
+ import { useSelectBase } from './chunk-SZMIHNCZ.js';
2
2
  import { useControllable } from './chunk-PQOIW5CM.js';
3
- import { Popover, PopoverTrigger, PopoverContent } from './chunk-ROQGBDET.js';
4
3
  import { spinner_default } from './chunk-RRPMZYVN.js';
4
+ import { Popover, PopoverTrigger, PopoverContent } from './chunk-ROQGBDET.js';
5
5
  import { colorVars } from './chunk-G6QIIWKU.js';
6
6
  import { cn, iconSizes, statusMessageVariants } from './chunk-RAS6HUEI.js';
7
7
  import { cva } from 'class-variance-authority';
@@ -86,7 +86,11 @@ var Select = React.memo(
86
86
  ref,
87
87
  ...props
88
88
  }) => {
89
- const [currentValue, setCurrentValue] = useControllable({ value, defaultValue: defaultValue ?? "", onChange });
89
+ const [currentValue, setCurrentValue] = useControllable({
90
+ value,
91
+ defaultValue: defaultValue ?? "",
92
+ onChange
93
+ });
90
94
  const {
91
95
  // State
92
96
  isOpen,
@@ -168,7 +172,7 @@ var Select = React.memo(
168
172
  "div",
169
173
  {
170
174
  ref: scrollContainerRef,
171
- className: "overflow-auto relative",
175
+ className: "overflow-auto relative p-1",
172
176
  style: { maxHeight: maxDropdownHeight },
173
177
  role: "listbox",
174
178
  id: listboxId,
@@ -327,6 +331,7 @@ var Select = React.memo(
327
331
  {
328
332
  "data-slot": "option",
329
333
  "data-value": option.value,
334
+ "data-option-index": index,
330
335
  className: cn(
331
336
  "select_option",
332
337
  selectOptionVariants({
@@ -530,5 +535,5 @@ Select.displayName = "Select";
530
535
  var select_default = Select;
531
536
 
532
537
  export { select_default };
533
- //# sourceMappingURL=chunk-HVHQA34X.js.map
534
- //# sourceMappingURL=chunk-HVHQA34X.js.map
538
+ //# sourceMappingURL=chunk-ZNGKUG2N.js.map
539
+ //# sourceMappingURL=chunk-ZNGKUG2N.js.map