@raxrai/stylelab-ui 0.3.2 → 0.4.0

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.mjs CHANGED
@@ -18,13 +18,13 @@ import {
18
18
  // lib/theme-resolver.ts
19
19
  var themeMap = {
20
20
  minimal: {
21
- button: { primary: "bg-zinc-900 text-white border border-zinc-200 transition-colors duration-200 hover:bg-zinc-800 hover:border-zinc-300 hover:shadow-md", secondary: "bg-transparent border border-zinc-200 text-zinc-900 hover:bg-zinc-100", ghost: "text-zinc-700 hover:bg-zinc-100" },
21
+ button: { primary: "bg-zinc-900 text-white border border-zinc-200 transition-colors duration-200 hover:bg-zinc-800 hover:border-zinc-300 hover:shadow-md", secondary: "bg-transparent border border-zinc-200 text-zinc-900 hover:bg-zinc-100", ghost: "text-inherit hover:bg-zinc-100" },
22
22
  input: { default: "border border-zinc-200 text-zinc-900 placeholder:text-zinc-400 focus:ring-1 focus:ring-zinc-400 focus:border-zinc-400" },
23
23
  toggle: { default: "bg-zinc-200 data-[state=on]:bg-zinc-900" },
24
24
  badge: { default: "bg-zinc-100 text-zinc-700 border border-zinc-200" },
25
25
  slider: { default: "bg-zinc-200 [&_.slider-thumb]:bg-zinc-900" },
26
26
  tabs: { default: "border-b border-zinc-200", triggerActive: "border-zinc-900 font-semibold", triggerInactive: "opacity-70" },
27
- card: { default: "bg-white text-zinc-900 border border-zinc-200 shadow-none" },
27
+ card: { default: "bg-white border border-zinc-200 shadow-none" },
28
28
  bento: { default: "gap-4" },
29
29
  navbar: { default: "bg-white text-zinc-900 border-b border-zinc-200" },
30
30
  sidebar: { default: "bg-white text-zinc-900 border-r border-zinc-200" },
@@ -47,13 +47,13 @@ var themeMap = {
47
47
  timeline: { default: "border-l-2 border-zinc-200 text-zinc-900" }
48
48
  },
49
49
  night: {
50
- button: { primary: "bg-white text-zinc-950 border border-white/10 shadow-[inset_0_1px_0_0_rgba(255,255,255,0.1)] transition-colors duration-200 hover:bg-zinc-100 hover:shadow-md hover:border-white/20", secondary: "bg-zinc-900 border border-white/10 text-white hover:bg-zinc-800", ghost: "text-zinc-300 hover:bg-white/5" },
50
+ button: { primary: "bg-white text-zinc-950 border border-white/10 shadow-[inset_0_1px_0_0_rgba(255,255,255,0.1)] transition-colors duration-200 hover:bg-zinc-100 hover:shadow-md hover:border-white/20", secondary: "bg-zinc-900 border border-white/10 text-white hover:bg-zinc-800", ghost: "text-inherit hover:bg-white/5" },
51
51
  input: { default: "bg-zinc-900 text-zinc-100 border border-white/10 placeholder:text-zinc-500 focus:ring-1 focus:ring-white/20 shadow-[inset_0_2px_4px_rgba(0,0,0,0.3)]" },
52
52
  toggle: { default: "bg-zinc-800 data-[state=on]:bg-white shadow-[inset_0_2px_4px_rgba(0,0,0,0.3)]" },
53
53
  badge: { default: "bg-zinc-800 text-zinc-300 border border-white/10" },
54
54
  slider: { default: "bg-zinc-800 [&_.slider-thumb]:bg-white shadow-[inset_0_2px_4px_rgba(0,0,0,0.3)]" },
55
55
  tabs: { default: "border-b border-white/10", triggerActive: "border-white font-semibold", triggerInactive: "opacity-70" },
56
- card: { default: "bg-zinc-950 text-zinc-100 border border-white/10 shadow-[inset_0_2px_4px_rgba(0,0,0,0.3)]" },
56
+ card: { default: "bg-zinc-950 border border-white/10 shadow-[inset_0_2px_4px_rgba(0,0,0,0.3)]" },
57
57
  bento: { default: "gap-4" },
58
58
  navbar: { default: "bg-zinc-950 text-zinc-100 border-b border-white/10" },
59
59
  sidebar: { default: "bg-zinc-950 text-zinc-100 border-r border-white/10" },
@@ -76,13 +76,13 @@ var themeMap = {
76
76
  timeline: { default: "border-l-2 border-white/20 text-zinc-100" }
77
77
  },
78
78
  glass: {
79
- button: { primary: "rounded-xl bg-white/70 backdrop-blur-2xl border border-white/60 text-slate-800 shadow-glass-soft transition-all duration-200 ease-in-out hover:-translate-y-0.5 hover:bg-white/80 hover:border-white/80 hover:shadow-glass-button-hover active:translate-y-0 active:shadow-glass-soft", secondary: "rounded-xl bg-white/50 backdrop-blur-2xl border border-white/60 text-slate-800 shadow-glass-soft transition-all duration-200 ease-in-out hover:-translate-y-0.5 hover:bg-white/60 hover:border-white/80 hover:shadow-glass-button-hover active:translate-y-0 active:shadow-glass-soft", ghost: "rounded-xl text-slate-700 backdrop-blur-xl transition-all duration-200 ease-in-out hover:-translate-y-0.5 hover:bg-white/40 hover:shadow-glass-soft hover:border hover:border-white/60" },
79
+ button: { primary: "rounded-xl bg-white/70 backdrop-blur-2xl border border-white/60 text-slate-800 shadow-glass-soft transition-all duration-200 ease-in-out hover:-translate-y-0.5 hover:bg-white/80 hover:border-white/80 hover:shadow-glass-button-hover active:translate-y-0 active:shadow-glass-soft", secondary: "rounded-xl bg-white/50 backdrop-blur-2xl border border-white/60 text-slate-800 shadow-glass-soft transition-all duration-200 ease-in-out hover:-translate-y-0.5 hover:bg-white/60 hover:border-white/80 hover:shadow-glass-button-hover active:translate-y-0 active:shadow-glass-soft", ghost: "rounded-xl text-inherit backdrop-blur-xl transition-all duration-200 ease-in-out hover:-translate-y-0.5 hover:bg-white/40 hover:shadow-glass-soft hover:border hover:border-white/60" },
80
80
  input: { default: "rounded-xl bg-white/50 backdrop-blur-2xl border border-slate-200/80 text-slate-800 shadow-glass-soft placeholder:text-slate-500 focus:ring-2 focus:ring-slate-300/50 focus:border-slate-300" },
81
81
  toggle: { default: "rounded-full bg-white/50 data-[state=on]:bg-white/80 backdrop-blur-2xl border border-white/60 shadow-glass-soft" },
82
82
  badge: { default: "rounded-xl bg-white/60 backdrop-blur-2xl text-slate-700 border border-white/60 shadow-glass-soft" },
83
83
  slider: { default: "rounded-full bg-white/50 [&_.slider-thumb]:bg-white [&_.slider-thumb]:border-slate-200 [&_.slider-thumb]:shadow-glass-soft backdrop-blur-2xl border border-white/60 shadow-glass-soft" },
84
84
  tabs: { default: "border-b border-slate-200/60", triggerActive: "border-slate-700 font-semibold", triggerInactive: "opacity-70" },
85
- card: { default: "rounded-2xl bg-white/60 backdrop-blur-2xl border border-white/60 text-slate-800 shadow-glass-lift" },
85
+ card: { default: "rounded-2xl bg-white/60 backdrop-blur-2xl border border-white/60 shadow-glass-lift" },
86
86
  bento: { default: "gap-4" },
87
87
  navbar: { default: "rounded-none bg-white/50 backdrop-blur-2xl border-b border-white/60 text-slate-800 shadow-glass-soft" },
88
88
  sidebar: { default: "rounded-none bg-white/50 backdrop-blur-2xl border-r border-white/60 text-slate-800 shadow-glass-soft" },
@@ -105,13 +105,13 @@ var themeMap = {
105
105
  timeline: { default: "border-l-2 border-slate-200/60 text-slate-800" }
106
106
  },
107
107
  neubrutal: {
108
- button: { primary: "rounded-none bg-[#FFD600] text-black border-4 border-black shadow-neubrutal hover:translate-x-1 hover:translate-y-1 hover:shadow-[4px_4px_0px_0px_rgba(0,0,0,1)]", secondary: "rounded-none bg-[#FF5733] text-black border-4 border-black shadow-neubrutal hover:translate-x-1 hover:translate-y-1", ghost: "rounded-none border-4 border-transparent hover:border-black hover:bg-zinc-100 text-black" },
108
+ button: { primary: "rounded-none bg-[#FFD600] text-black border-4 border-black shadow-neubrutal hover:translate-x-1 hover:translate-y-1 hover:shadow-[4px_4px_0px_0px_rgba(0,0,0,1)]", secondary: "rounded-none bg-[#FF5733] text-black border-4 border-black shadow-neubrutal hover:translate-x-1 hover:translate-y-1", ghost: "rounded-none text-inherit border-4 border-transparent hover:border-black hover:bg-zinc-100" },
109
109
  input: { default: "rounded-none border-4 border-black text-black placeholder:text-zinc-600 focus:ring-4 focus:ring-black/20 bg-white" },
110
110
  toggle: { default: "rounded-none border-4 border-black bg-white data-[state=on]:bg-[#FFD600] shadow-neubrutal" },
111
111
  badge: { default: "rounded-none bg-[#FFD600] text-black border-4 border-black" },
112
112
  slider: { default: "rounded-none border-4 border-black bg-white [&_.slider-thumb]:bg-[#FF5733] [&_.slider-thumb]:border-4 [&_.slider-thumb]:border-black" },
113
113
  tabs: { default: "border-b-4 border-black", triggerActive: "bg-[#FFD600] border-b-4 border-black font-bold -mb-[3px] pb-[5px] shadow-neubrutal", triggerInactive: "opacity-80" },
114
- card: { default: "rounded-none bg-white text-black border-4 border-black shadow-neubrutal" },
114
+ card: { default: "rounded-none bg-white border-4 border-black shadow-neubrutal" },
115
115
  bento: { default: "gap-4" },
116
116
  navbar: { default: "rounded-none bg-[#FFD600] text-black border-b-4 border-black shadow-neubrutal" },
117
117
  sidebar: { default: "rounded-none bg-[#FFD600]/30 border-r-4 border-black shadow-neubrutal text-black" },
@@ -134,13 +134,13 @@ var themeMap = {
134
134
  timeline: { default: "border-l-4 border-black text-black" }
135
135
  },
136
136
  clay: {
137
- button: { primary: "rounded-[40px] bg-rose-200 text-rose-900 border border-rose-300 shadow-clay-outer hover:shadow-[10px_10px_20px_rgba(0,0,0,0.08),inset_-8px_-8px_15px_rgba(0,0,0,0.2),inset_8px_8px_15px_rgba(255,255,255,0.4)]", secondary: "rounded-[40px] bg-sky-100 text-sky-900 shadow-clay-outer", ghost: "rounded-[40px] hover:bg-zinc-100 text-zinc-800" },
137
+ button: { primary: "rounded-[40px] bg-rose-200 text-rose-900 border border-rose-300 shadow-clay-outer hover:shadow-[10px_10px_20px_rgba(0,0,0,0.08),inset_-8px_-8px_15px_rgba(0,0,0,0.2),inset_8px_8px_15px_rgba(255,255,255,0.4)]", secondary: "rounded-[40px] bg-sky-100 text-sky-900 shadow-clay-outer", ghost: "rounded-[40px] text-inherit hover:bg-zinc-100" },
138
138
  input: { default: "rounded-[40px] border border-zinc-200 bg-zinc-50 text-zinc-900 placeholder:text-zinc-500 focus:ring-2 focus:ring-sky-300" },
139
139
  toggle: { default: "rounded-full bg-sky-100 data-[state=on]:bg-sky-300 data-[state=on]:shadow-clay-outer" },
140
140
  badge: { default: "rounded-[40px] bg-amber-100 text-amber-900" },
141
141
  slider: { default: "rounded-full bg-sky-100 [&_.slider-thumb]:rounded-full [&_.slider-thumb]:bg-rose-300" },
142
142
  tabs: { default: "border-b-2 border-zinc-200/80", triggerActive: "border-rose-600 font-semibold", triggerInactive: "opacity-70" },
143
- card: { default: "rounded-[40px] bg-rose-50 text-zinc-900 shadow-clay-outer border border-rose-100" },
143
+ card: { default: "rounded-[40px] bg-rose-50 shadow-clay-outer border border-rose-100" },
144
144
  bento: { default: "gap-4" },
145
145
  navbar: { default: "rounded-b-3xl bg-white/80 text-zinc-900 backdrop-blur-md shadow-clay-outer border-b border-zinc-200" },
146
146
  sidebar: { default: "rounded-r-3xl bg-sky-50 text-zinc-900 shadow-clay-outer border-r border-sky-100" },
@@ -163,13 +163,13 @@ var themeMap = {
163
163
  timeline: { default: "border-l-2 border-rose-200 text-zinc-900" }
164
164
  },
165
165
  cyberpunk: {
166
- button: { primary: "bg-transparent border-2 border-[#22d3ee] text-[#22d3ee] font-mono shadow-neon-glow hover:animate-glitch-anim", secondary: "bg-transparent border-2 border-[#ec4899] text-[#ec4899] font-mono hover:animate-glitch-anim", ghost: "text-[#22d3ee] font-mono hover:bg-[#22d3ee]/10" },
166
+ button: { primary: "bg-transparent border-2 border-[#22d3ee] text-[#22d3ee] font-mono shadow-neon-glow hover:animate-glitch-anim", secondary: "bg-transparent border-2 border-[#ec4899] text-[#ec4899] font-mono hover:animate-glitch-anim", ghost: "text-inherit font-mono hover:bg-[#22d3ee]/10" },
167
167
  input: { default: "bg-black border-2 border-[#22d3ee] text-[#22d3ee] placeholder:text-[#22d3ee]/50 font-mono focus:shadow-neon-glow" },
168
168
  toggle: { default: "bg-zinc-900 border-2 border-[#22d3ee] data-[state=on]:bg-[#22d3ee] data-[state=on]:shadow-neon-glow" },
169
169
  badge: { default: "bg-black border-2 border-[#ec4899] text-[#ec4899] font-mono" },
170
170
  slider: { default: "bg-zinc-900 [&_.slider-thumb]:border-2 [&_.slider-thumb]:border-[#22d3ee] [&_.slider-thumb]:bg-[#22d3ee] [&_.slider-thumb]:shadow-neon-glow" },
171
171
  tabs: { default: "border-b-2 border-[#22d3ee]", triggerActive: "text-[#22d3ee] border-[#22d3ee] font-bold shadow-neon-glow", triggerInactive: "opacity-50 text-[#22d3ee]/70" },
172
- card: { default: "bg-black text-[#22d3ee] border-2 border-[#22d3ee] shadow-neon-glow font-mono" },
172
+ card: { default: "bg-black border-2 border-[#22d3ee] shadow-neon-glow font-mono" },
173
173
  bento: { default: "gap-4" },
174
174
  navbar: { default: "bg-black text-[#22d3ee] border-b-2 border-[#22d3ee] font-mono" },
175
175
  sidebar: { default: "bg-black text-[#22d3ee] border-r-2 border-[#22d3ee] font-mono" },
@@ -192,13 +192,13 @@ var themeMap = {
192
192
  timeline: { default: "border-l-2 border-[#22d3ee] text-[#22d3ee] font-mono" }
193
193
  },
194
194
  retro: {
195
- button: { primary: "rounded-none bg-lime-500 text-black border-2 border-black font-mono shadow-[4px_4px_0_0_rgba(0,0,0,1)] hover:bg-lime-400 active:shadow-[2px_2px_0_0_rgba(0,0,0,1)]", secondary: "rounded-none bg-white text-black border-2 border-black font-mono shadow-[4px_4px_0_0_rgba(0,0,0,1)] hover:bg-zinc-100 active:shadow-[2px_2px_0_0_rgba(0,0,0,1)]", ghost: "rounded-none font-mono text-black border-2 border-transparent hover:border-black hover:bg-zinc-100" },
195
+ button: { primary: "rounded-none bg-lime-500 text-black border-2 border-black font-mono shadow-[4px_4px_0_0_rgba(0,0,0,1)] hover:bg-lime-400 active:shadow-[2px_2px_0_0_rgba(0,0,0,1)]", secondary: "rounded-none bg-white text-black border-2 border-black font-mono shadow-[4px_4px_0_0_rgba(0,0,0,1)] hover:bg-zinc-100 active:shadow-[2px_2px_0_0_rgba(0,0,0,1)]", ghost: "rounded-none font-mono text-inherit border-2 border-transparent hover:border-black hover:bg-zinc-100" },
196
196
  input: { default: "rounded-none border-2 border-black text-black placeholder:text-zinc-500 font-mono focus:ring-2 focus:ring-black focus:ring-offset-0 bg-white" },
197
197
  toggle: { default: "rounded-none border-2 border-black bg-zinc-200 data-[state=on]:bg-lime-500 shadow-[3px_3px_0_0_rgba(0,0,0,1)]" },
198
198
  badge: { default: "rounded-none bg-lime-500 text-black border-2 border-black font-mono" },
199
199
  slider: { default: "rounded-none border-2 border-black bg-zinc-200 [&_.slider-thumb]:rounded-none [&_.slider-thumb]:border-2 [&_.slider-thumb]:border-black [&_.slider-thumb]:bg-lime-500 [&_.slider-thumb]:shadow-[2px_2px_0_0_rgba(0,0,0,1)]" },
200
200
  tabs: { default: "border-b-2 border-black font-mono", triggerActive: "border-b-2 border-black font-bold bg-lime-500/20 text-black -mb-[2px] pb-[6px]", triggerInactive: "opacity-70 text-black" },
201
- card: { default: "rounded-none bg-white text-black border-2 border-black shadow-[6px_6px_0_0_rgba(0,0,0,1)] font-mono" },
201
+ card: { default: "rounded-none bg-white border-2 border-black shadow-[6px_6px_0_0_rgba(0,0,0,1)] font-mono" },
202
202
  bento: { default: "gap-4" },
203
203
  navbar: { default: "rounded-none bg-zinc-100 text-black border-b-2 border-black font-mono shadow-[0_4px_0_0_rgba(0,0,0,1)]" },
204
204
  sidebar: { default: "rounded-none bg-zinc-100 text-black border-r-2 border-black font-mono" },
@@ -221,13 +221,13 @@ var themeMap = {
221
221
  timeline: { default: "border-l-2 border-black text-black font-mono" }
222
222
  },
223
223
  motion: {
224
- button: { primary: "rounded-xl bg-indigo-500 text-white border-0 shadow-lg transition-all duration-300 ease-out hover:scale-105 hover:-translate-y-0.5 hover:shadow-xl hover:bg-indigo-600 active:scale-100 active:translate-y-0 focus:ring-2 focus:ring-indigo-400 focus:ring-offset-2", secondary: "rounded-xl bg-white text-indigo-600 border-2 border-indigo-200 shadow-md transition-all duration-300 ease-out hover:scale-105 hover:-translate-y-0.5 hover:border-indigo-300 hover:shadow-lg active:scale-100 active:translate-y-0 focus:ring-2 focus:ring-indigo-300 focus:ring-offset-2", ghost: "rounded-xl text-indigo-600 transition-all duration-300 ease-out hover:scale-105 hover:bg-indigo-50 hover:-translate-y-0.5 active:scale-100 active:translate-y-0" },
224
+ button: { primary: "rounded-xl bg-indigo-500 text-white border-0 shadow-lg transition-all duration-300 ease-out hover:scale-105 hover:-translate-y-0.5 hover:shadow-xl hover:bg-indigo-600 active:scale-100 active:translate-y-0 focus:ring-2 focus:ring-indigo-400 focus:ring-offset-2", secondary: "rounded-xl bg-white text-indigo-600 border-2 border-indigo-200 shadow-md transition-all duration-300 ease-out hover:scale-105 hover:-translate-y-0.5 hover:border-indigo-300 hover:shadow-lg active:scale-100 active:translate-y-0 focus:ring-2 focus:ring-indigo-300 focus:ring-offset-2", ghost: "rounded-xl text-inherit transition-all duration-300 ease-out hover:scale-105 hover:bg-indigo-50 hover:-translate-y-0.5 active:scale-100 active:translate-y-0" },
225
225
  input: { default: "rounded-xl border-2 border-indigo-200 bg-white text-zinc-900 transition-all duration-300 ease-out placeholder:text-zinc-400 focus:scale-[1.01] focus:border-indigo-500 focus:ring-2 focus:ring-indigo-200 focus:ring-offset-0" },
226
226
  toggle: { default: "rounded-full bg-zinc-200 transition-all duration-300 ease-out data-[state=on]:bg-indigo-500 [&_.slider-thumb]:transition-transform [&_.slider-thumb]:duration-300 [&_.slider-thumb]:data-[state=on]:scale-110" },
227
227
  badge: { default: "rounded-full bg-indigo-100 text-indigo-700 border border-indigo-200 transition-all duration-300 ease-out hover:scale-110 hover:bg-indigo-200" },
228
228
  slider: { default: "rounded-full bg-zinc-200 transition-all duration-300 [&_.slider-thumb]:rounded-full [&_.slider-thumb]:bg-indigo-500 [&_.slider-thumb]:transition-transform [&_.slider-thumb]:duration-300 [&_.slider-thumb]:hover:scale-125 [&_.slider-thumb]:active:scale-110" },
229
229
  tabs: { default: "border-b-2 border-indigo-200 transition-colors duration-300", triggerActive: "border-indigo-500 font-semibold text-indigo-600 transition-all duration-300", triggerInactive: "opacity-70 transition-opacity duration-300 hover:opacity-100" },
230
- card: { default: "rounded-2xl bg-white text-zinc-900 border-2 border-indigo-100 shadow-lg transition-all duration-300 ease-out hover:scale-[1.02] hover:shadow-xl hover:border-indigo-200 hover:-translate-y-1" },
230
+ card: { default: "rounded-2xl bg-white border-2 border-indigo-100 shadow-lg transition-all duration-300 ease-out hover:scale-[1.02] hover:shadow-xl hover:border-indigo-200 hover:-translate-y-1" },
231
231
  bento: { default: "gap-4" },
232
232
  navbar: { default: "rounded-none bg-white/95 backdrop-blur-md text-zinc-900 border-b-2 border-indigo-100 shadow-sm transition-all duration-300" },
233
233
  sidebar: { default: "rounded-none bg-white/95 backdrop-blur-md text-zinc-900 border-r-2 border-indigo-100 transition-all duration-300" },
@@ -3526,6 +3526,14 @@ var twMerge = /* @__PURE__ */ createTailwindMerge(getDefaultConfig);
3526
3526
  function cn(...inputs) {
3527
3527
  return twMerge(clsx(inputs));
3528
3528
  }
3529
+ function mergeRefs(...refs) {
3530
+ return (node) => {
3531
+ refs.forEach((ref) => {
3532
+ if (typeof ref === "function") ref(node);
3533
+ else if (ref != null) ref.current = node;
3534
+ });
3535
+ };
3536
+ }
3529
3537
 
3530
3538
  // node_modules/lucide-react/dist/esm/createLucideIcon.js
3531
3539
  import { forwardRef as forwardRef2, createElement as createElement2 } from "react";
@@ -3675,6 +3683,7 @@ var X = createLucideIcon("x", __iconNode9);
3675
3683
 
3676
3684
  // components/Accordion.tsx
3677
3685
  import {
3686
+ forwardRef as forwardRef3,
3678
3687
  useCallback as useCallback2,
3679
3688
  useEffect as useEffect2,
3680
3689
  useRef,
@@ -3740,14 +3749,14 @@ function AccordionPanel({
3740
3749
  )
3741
3750
  ] });
3742
3751
  }
3743
- function Accordion({
3752
+ var Accordion = forwardRef3(function Accordion2({
3744
3753
  items,
3745
3754
  allowMultiple = false,
3746
3755
  defaultOpenIds,
3747
3756
  className,
3748
3757
  style,
3749
3758
  theme: themeProp
3750
- }) {
3759
+ }, ref) {
3751
3760
  const [open, setOpen] = useState2(
3752
3761
  () => new Set(defaultOpenIds ?? [])
3753
3762
  );
@@ -3768,7 +3777,7 @@ function Accordion({
3768
3777
  },
3769
3778
  [allowMultiple]
3770
3779
  );
3771
- return /* @__PURE__ */ jsx2("div", { className: cn(themeClass, className), style, children: items.map((item) => /* @__PURE__ */ jsx2(
3780
+ return /* @__PURE__ */ jsx2("div", { ref, className: cn(themeClass, className), style, children: items.map((item) => /* @__PURE__ */ jsx2(
3772
3781
  AccordionPanel,
3773
3782
  {
3774
3783
  item,
@@ -3778,12 +3787,12 @@ function Accordion({
3778
3787
  },
3779
3788
  item.id
3780
3789
  )) });
3781
- }
3790
+ });
3782
3791
 
3783
3792
  // components/Alert.tsx
3784
- import { forwardRef as forwardRef3 } from "react";
3793
+ import { forwardRef as forwardRef4 } from "react";
3785
3794
  import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
3786
- var Alert = forwardRef3(function Alert2({
3795
+ var Alert = forwardRef4(function Alert2({
3787
3796
  intent = "default",
3788
3797
  title,
3789
3798
  children,
@@ -3811,12 +3820,12 @@ var Alert = forwardRef3(function Alert2({
3811
3820
  });
3812
3821
 
3813
3822
  // components/Avatar.tsx
3814
- import { forwardRef as forwardRef4 } from "react";
3823
+ import { forwardRef as forwardRef5 } from "react";
3815
3824
  import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
3816
3825
  function getInitials(name) {
3817
3826
  return name.trim().split(/\s+/).map((s) => s[0]).join("").toUpperCase().slice(0, 2);
3818
3827
  }
3819
- var Avatar = forwardRef4(function Avatar2({
3828
+ var Avatar = forwardRef5(function Avatar2({
3820
3829
  src,
3821
3830
  alt = "",
3822
3831
  fallback,
@@ -3960,7 +3969,7 @@ var cva = (base, config) => (props) => {
3960
3969
  };
3961
3970
 
3962
3971
  // components/Badge.tsx
3963
- import { forwardRef as forwardRef5 } from "react";
3972
+ import { forwardRef as forwardRef6 } from "react";
3964
3973
  import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
3965
3974
  var badgeVariants = cva(
3966
3975
  "inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium",
@@ -3978,7 +3987,7 @@ var badgeVariants = cva(
3978
3987
  }
3979
3988
  }
3980
3989
  );
3981
- var Badge = forwardRef5(function Badge2({
3990
+ var Badge = forwardRef6(function Badge2({
3982
3991
  children,
3983
3992
  variant = "default",
3984
3993
  dot = false,
@@ -4023,17 +4032,15 @@ var Badge = forwardRef5(function Badge2({
4023
4032
  });
4024
4033
 
4025
4034
  // components/BentoGrid.tsx
4035
+ import { forwardRef as forwardRef7 } from "react";
4026
4036
  import { jsx as jsx6 } from "react/jsx-runtime";
4027
- function BentoGrid({
4028
- children,
4029
- className,
4030
- style
4031
- }) {
4037
+ var BentoGrid = forwardRef7(function BentoGrid2({ children, className, style }, ref) {
4032
4038
  const { theme } = useTheme();
4033
4039
  const themeClass = getThemeClass(theme, "bento", "default");
4034
4040
  return /* @__PURE__ */ jsx6(
4035
4041
  "div",
4036
4042
  {
4043
+ ref,
4037
4044
  className: cn(
4038
4045
  "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",
4039
4046
  themeClass,
@@ -4043,9 +4050,10 @@ function BentoGrid({
4043
4050
  children
4044
4051
  }
4045
4052
  );
4046
- }
4053
+ });
4047
4054
 
4048
4055
  // components/Breadcrumbs.tsx
4056
+ import { forwardRef as forwardRef8 } from "react";
4049
4057
  import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
4050
4058
  var defaultSeparators = {
4051
4059
  minimal: "/",
@@ -4057,25 +4065,20 @@ var defaultSeparators = {
4057
4065
  retro: ">",
4058
4066
  motion: "\u203A"
4059
4067
  };
4060
- function Breadcrumbs({
4061
- items,
4062
- separator,
4063
- className,
4064
- theme: themeProp
4065
- }) {
4068
+ var Breadcrumbs = forwardRef8(function Breadcrumbs2({ items, separator, className, style, theme: themeProp }, ref) {
4066
4069
  const { theme: contextTheme } = useTheme();
4067
4070
  const theme = themeProp ?? contextTheme;
4068
4071
  const themeClass = getThemeClass(theme, "breadcrumbs", "default");
4069
4072
  const sep = separator ?? defaultSeparators[theme] ?? "/";
4070
- return /* @__PURE__ */ jsx7("nav", { "aria-label": "Breadcrumb", className: cn("flex flex-wrap items-center gap-1.5 text-sm", themeClass, className), children: items.map((item, i) => /* @__PURE__ */ jsxs5("span", { className: "inline-flex items-center gap-1.5", children: [
4073
+ return /* @__PURE__ */ jsx7("nav", { ref, "aria-label": "Breadcrumb", className: cn("flex flex-wrap items-center gap-1.5 text-sm", themeClass, className), style, children: items.map((item, i) => /* @__PURE__ */ jsxs5("span", { className: "inline-flex items-center gap-1.5", children: [
4071
4074
  i > 0 && /* @__PURE__ */ jsx7("span", { "data-sep": true, className: "shrink-0 opacity-70", "aria-hidden": true, children: sep }),
4072
4075
  item.href != null ? /* @__PURE__ */ jsx7("a", { href: item.href, className: "hover:underline", children: item.label }) : /* @__PURE__ */ jsx7("span", { className: "font-medium", "aria-current": i === items.length - 1 ? "page" : void 0, children: item.label })
4073
4076
  ] }, i)) });
4074
- }
4077
+ });
4075
4078
 
4076
4079
  // components/Button.tsx
4077
4080
  import {
4078
- forwardRef as forwardRef6
4081
+ forwardRef as forwardRef9
4079
4082
  } from "react";
4080
4083
  import { jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
4081
4084
  var buttonVariants = cva(
@@ -4157,10 +4160,10 @@ function ButtonInner(props, ref) {
4157
4160
  }
4158
4161
  );
4159
4162
  }
4160
- var Button = forwardRef6(ButtonInner);
4163
+ var Button = forwardRef9(ButtonInner);
4161
4164
 
4162
4165
  // components/Calendar.tsx
4163
- import { useMemo as useMemo2, useState as useState3 } from "react";
4166
+ import { forwardRef as forwardRef10, useMemo as useMemo2, useState as useState3 } from "react";
4164
4167
  import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
4165
4168
  function getDaysInMonth(year, month) {
4166
4169
  return new Date(year, month + 1, 0).getDate();
@@ -4191,15 +4194,16 @@ var MONTHS = [
4191
4194
  "November",
4192
4195
  "December"
4193
4196
  ];
4194
- function Calendar({
4197
+ var Calendar = forwardRef10(function Calendar2({
4195
4198
  value: controlledValue,
4196
4199
  defaultValue,
4197
4200
  onSelect,
4198
4201
  min,
4199
4202
  max,
4200
4203
  className,
4204
+ style,
4201
4205
  theme: themeProp
4202
- }) {
4206
+ }, ref) {
4203
4207
  const [uncontrolled, setUncontrolled] = useState3(
4204
4208
  () => defaultValue ?? null
4205
4209
  );
@@ -4247,7 +4251,9 @@ function Calendar({
4247
4251
  return /* @__PURE__ */ jsxs7(
4248
4252
  "div",
4249
4253
  {
4254
+ ref,
4250
4255
  className: cn("inline-block max-w-full min-w-0 border p-3 sm:p-4 rounded-xl", themeClass, className),
4256
+ style,
4251
4257
  children: [
4252
4258
  /* @__PURE__ */ jsxs7("div", { className: "flex items-center justify-between mb-3", children: [
4253
4259
  /* @__PURE__ */ jsx9(
@@ -4300,10 +4306,10 @@ function Calendar({
4300
4306
  ]
4301
4307
  }
4302
4308
  );
4303
- }
4309
+ });
4304
4310
 
4305
4311
  // components/Card.tsx
4306
- import { forwardRef as forwardRef7 } from "react";
4312
+ import { forwardRef as forwardRef11 } from "react";
4307
4313
  import { jsx as jsx10, jsxs as jsxs8 } from "react/jsx-runtime";
4308
4314
  var cardVariants = cva("rounded-xl", {
4309
4315
  variants: {
@@ -4322,7 +4328,7 @@ var cardVariants = cva("rounded-xl", {
4322
4328
  isHoverable: false
4323
4329
  }
4324
4330
  });
4325
- var Card = forwardRef7(function Card2({
4331
+ var Card = forwardRef11(function Card2({
4326
4332
  header,
4327
4333
  footer,
4328
4334
  padding = "md",
@@ -4343,8 +4349,8 @@ var Card = forwardRef7(function Card2({
4343
4349
  className: cn(
4344
4350
  cardVariants({ padding, isHoverable }),
4345
4351
  themeClass,
4346
- className,
4347
- classNames.root
4352
+ classNames.root,
4353
+ className
4348
4354
  ),
4349
4355
  ...props,
4350
4356
  children: [
@@ -4380,9 +4386,160 @@ var Card = forwardRef7(function Card2({
4380
4386
  );
4381
4387
  });
4382
4388
 
4389
+ // components/CommandPalette.tsx
4390
+ import { forwardRef as forwardRef12, useCallback as useCallback3, useEffect as useEffect3, useMemo as useMemo3, useRef as useRef2, useState as useState4 } from "react";
4391
+ import { jsx as jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
4392
+ var CommandPalette = forwardRef12(function CommandPalette2({
4393
+ open,
4394
+ onClose,
4395
+ commands,
4396
+ placeholder = "Type a command...",
4397
+ className,
4398
+ style,
4399
+ theme: themeProp
4400
+ }, ref) {
4401
+ const [query, setQuery] = useState4("");
4402
+ const [selected, setSelected] = useState4(0);
4403
+ const listRef = useRef2(null);
4404
+ const { theme: contextTheme } = useTheme();
4405
+ const theme = themeProp ?? contextTheme;
4406
+ const themeClass = getThemeClass(theme, "commandPalette", "default");
4407
+ const filtered = useMemo3(() => {
4408
+ if (!query.trim()) return commands;
4409
+ const q = query.toLowerCase();
4410
+ return commands.filter((c) => c.label.toLowerCase().includes(q));
4411
+ }, [commands, query]);
4412
+ const safeSelected = Math.min(selected, Math.max(0, filtered.length - 1));
4413
+ useEffect3(() => {
4414
+ if (open) {
4415
+ setQuery("");
4416
+ setSelected(0);
4417
+ }
4418
+ }, [open]);
4419
+ useEffect3(() => {
4420
+ setSelected((s) => Math.min(s, Math.max(0, filtered.length - 1)));
4421
+ }, [filtered.length]);
4422
+ const runSelected = useCallback3(() => {
4423
+ const item = filtered[safeSelected];
4424
+ if (item) {
4425
+ item.onSelect();
4426
+ onClose();
4427
+ }
4428
+ }, [filtered, safeSelected, onClose]);
4429
+ useEffect3(() => {
4430
+ if (!open) return;
4431
+ const handler = (e) => {
4432
+ if (e.key === "Escape") {
4433
+ e.preventDefault();
4434
+ onClose();
4435
+ return;
4436
+ }
4437
+ if (e.key === "ArrowDown") {
4438
+ e.preventDefault();
4439
+ setSelected((s) => (s + 1) % Math.max(1, filtered.length));
4440
+ return;
4441
+ }
4442
+ if (e.key === "ArrowUp") {
4443
+ e.preventDefault();
4444
+ setSelected(
4445
+ (s) => (s - 1 + filtered.length) % Math.max(1, filtered.length)
4446
+ );
4447
+ return;
4448
+ }
4449
+ if (e.key === "Enter") {
4450
+ e.preventDefault();
4451
+ runSelected();
4452
+ }
4453
+ };
4454
+ document.addEventListener("keydown", handler, true);
4455
+ return () => document.removeEventListener("keydown", handler, true);
4456
+ }, [open, onClose, filtered.length, runSelected]);
4457
+ useEffect3(() => {
4458
+ const el = listRef.current;
4459
+ if (!el) return;
4460
+ const item = el.querySelector(`[data-index="${safeSelected}"]`);
4461
+ if (item && typeof item.scrollIntoView === "function") {
4462
+ item.scrollIntoView({ block: "nearest", behavior: "smooth" });
4463
+ }
4464
+ }, [safeSelected]);
4465
+ if (!open) return null;
4466
+ return /* @__PURE__ */ jsxs9(
4467
+ "div",
4468
+ {
4469
+ ref,
4470
+ className: "fixed inset-0 z-50 flex items-start justify-center pt-[20vh] p-4",
4471
+ role: "dialog",
4472
+ "aria-modal": "true",
4473
+ "aria-label": "Command palette",
4474
+ children: [
4475
+ /* @__PURE__ */ jsx11(
4476
+ "div",
4477
+ {
4478
+ className: "absolute inset-0 bg-black/50 backdrop-blur-sm",
4479
+ onClick: onClose,
4480
+ "aria-hidden": true
4481
+ }
4482
+ ),
4483
+ /* @__PURE__ */ jsxs9(
4484
+ "div",
4485
+ {
4486
+ className: cn("relative z-10 w-full max-w-[calc(100vw-2rem)] sm:max-w-xl overflow-hidden rounded-xl mx-2 sm:mx-0", themeClass, className),
4487
+ style,
4488
+ children: [
4489
+ /* @__PURE__ */ jsxs9("div", { className: "flex items-center gap-2 border-b border-inherit px-3 py-2", children: [
4490
+ /* @__PURE__ */ jsx11(Search, { className: "size-4 shrink-0 opacity-60", "aria-hidden": true }),
4491
+ /* @__PURE__ */ jsx11(
4492
+ "input",
4493
+ {
4494
+ type: "text",
4495
+ value: query,
4496
+ onChange: (e) => setQuery(e.target.value),
4497
+ placeholder,
4498
+ className: "flex-1 bg-transparent outline-none placeholder:opacity-60",
4499
+ autoFocus: true,
4500
+ "aria-autocomplete": "list",
4501
+ "aria-controls": "command-palette-list",
4502
+ "aria-expanded": "true"
4503
+ }
4504
+ ),
4505
+ /* @__PURE__ */ jsx11("kbd", { className: "rounded border border-inherit px-1.5 py-0.5 text-xs opacity-60", children: "ESC" })
4506
+ ] }),
4507
+ /* @__PURE__ */ jsx11(
4508
+ "ul",
4509
+ {
4510
+ ref: listRef,
4511
+ id: "command-palette-list",
4512
+ role: "listbox",
4513
+ className: "max-h-72 overflow-auto py-2",
4514
+ children: filtered.length === 0 ? /* @__PURE__ */ jsx11("li", { className: "px-4 py-3 text-sm opacity-60", children: "No results." }) : filtered.map((cmd, i) => /* @__PURE__ */ jsx11("li", { role: "option", "aria-selected": i === safeSelected, "data-index": i, children: /* @__PURE__ */ jsxs9(
4515
+ "button",
4516
+ {
4517
+ type: "button",
4518
+ onClick: () => {
4519
+ cmd.onSelect();
4520
+ onClose();
4521
+ },
4522
+ onMouseEnter: () => setSelected(i),
4523
+ className: `flex w-full items-center justify-between px-4 py-2 text-left text-sm ${i === safeSelected ? "bg-current/10" : ""}`,
4524
+ children: [
4525
+ cmd.label,
4526
+ cmd.shortcut ? /* @__PURE__ */ jsx11("kbd", { className: "rounded border border-inherit px-1.5 py-0.5 text-xs opacity-60", children: cmd.shortcut }) : null
4527
+ ]
4528
+ }
4529
+ ) }, cmd.id))
4530
+ }
4531
+ )
4532
+ ]
4533
+ }
4534
+ )
4535
+ ]
4536
+ }
4537
+ );
4538
+ });
4539
+
4383
4540
  // components/DashboardShell.tsx
4384
- import { useState as useState4 } from "react";
4385
- import { Fragment, jsx as jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
4541
+ import { forwardRef as forwardRef13, useState as useState5 } from "react";
4542
+ import { Fragment, jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
4386
4543
  var SHELL_BG_BY_THEME = {
4387
4544
  minimal: "bg-gradient-to-br from-slate-50 via-zinc-50 to-slate-100",
4388
4545
  night: "bg-zinc-950 text-zinc-100",
@@ -4414,7 +4571,7 @@ function mobileNavLinkStateClasses(theme, active) {
4414
4571
  }
4415
4572
  return active ? "bg-black/5 text-zinc-900" : "text-zinc-600 hover:bg-black/5 hover:text-zinc-900";
4416
4573
  }
4417
- function DashboardShell({
4574
+ var DashboardShell = forwardRef13(function DashboardShell2({
4418
4575
  children,
4419
4576
  navItems,
4420
4577
  adminNavItems,
@@ -4423,19 +4580,20 @@ function DashboardShell({
4423
4580
  userRole,
4424
4581
  onLogout,
4425
4582
  logo,
4426
- className
4427
- }) {
4428
- const [mobileOpen, setMobileOpen] = useState4(false);
4583
+ className,
4584
+ style
4585
+ }, ref) {
4586
+ const [mobileOpen, setMobileOpen] = useState5(false);
4429
4587
  const isAdmin = userRole === "ADMIN";
4430
4588
  const { theme } = useTheme();
4431
4589
  const shellBg = SHELL_BG_BY_THEME[theme];
4432
4590
  const isDarkHeader = darkHeaderThemes.includes(theme);
4433
4591
  const isActive = (href) => currentPath ? currentPath === href || currentPath.startsWith(href) : false;
4434
- return /* @__PURE__ */ jsxs9("div", { className: cn("min-h-screen", shellBg, className), children: [
4435
- /* @__PURE__ */ jsxs9("header", { className: cn("sticky top-0 z-40", headerClasses(theme)), children: [
4436
- /* @__PURE__ */ jsxs9("div", { className: "mx-auto flex h-14 max-w-7xl items-center justify-between px-4 sm:px-6 lg:px-8", children: [
4437
- /* @__PURE__ */ jsxs9("div", { className: "flex items-center gap-2", children: [
4438
- /* @__PURE__ */ jsx11(
4592
+ return /* @__PURE__ */ jsxs10("div", { ref, className: cn("min-h-screen", shellBg, className), style, children: [
4593
+ /* @__PURE__ */ jsxs10("header", { className: cn("sticky top-0 z-40", headerClasses(theme)), children: [
4594
+ /* @__PURE__ */ jsxs10("div", { className: "mx-auto flex h-14 max-w-7xl items-center justify-between px-4 sm:px-6 lg:px-8", children: [
4595
+ /* @__PURE__ */ jsxs10("div", { className: "flex items-center gap-2", children: [
4596
+ /* @__PURE__ */ jsx12(
4439
4597
  "button",
4440
4598
  {
4441
4599
  type: "button",
@@ -4446,10 +4604,10 @@ function DashboardShell({
4446
4604
  ),
4447
4605
  "aria-label": "Toggle navigation",
4448
4606
  "aria-expanded": mobileOpen,
4449
- children: mobileOpen ? /* @__PURE__ */ jsx11("span", { className: "text-lg leading-none", children: "\xD7" }) : /* @__PURE__ */ jsx11("span", { className: "text-xl leading-none", children: "\u2630" })
4607
+ children: mobileOpen ? /* @__PURE__ */ jsx12("span", { className: "text-lg leading-none", children: "\xD7" }) : /* @__PURE__ */ jsx12("span", { className: "text-xl leading-none", children: "\u2630" })
4450
4608
  }
4451
4609
  ),
4452
- /* @__PURE__ */ jsx11("div", { className: "flex items-center gap-2", children: logo ?? /* @__PURE__ */ jsx11(
4610
+ /* @__PURE__ */ jsx12("div", { className: "flex items-center gap-2", children: logo ?? /* @__PURE__ */ jsx12(
4453
4611
  "span",
4454
4612
  {
4455
4613
  className: cn(
@@ -4459,8 +4617,8 @@ function DashboardShell({
4459
4617
  children: "Dashboard"
4460
4618
  }
4461
4619
  ) }),
4462
- /* @__PURE__ */ jsxs9("nav", { className: "ml-6 hidden items-center gap-1 text-sm sm:flex", children: [
4463
- navItems.map((item) => /* @__PURE__ */ jsx11(
4620
+ /* @__PURE__ */ jsxs10("nav", { className: "ml-6 hidden items-center gap-1 text-sm sm:flex", children: [
4621
+ navItems.map((item) => /* @__PURE__ */ jsx12(
4464
4622
  "a",
4465
4623
  {
4466
4624
  href: item.href,
@@ -4469,8 +4627,8 @@ function DashboardShell({
4469
4627
  },
4470
4628
  item.href
4471
4629
  )),
4472
- isAdmin && adminNavItems && adminNavItems.length > 0 && /* @__PURE__ */ jsxs9(Fragment, { children: [
4473
- /* @__PURE__ */ jsx11(
4630
+ isAdmin && adminNavItems && adminNavItems.length > 0 && /* @__PURE__ */ jsxs10(Fragment, { children: [
4631
+ /* @__PURE__ */ jsx12(
4474
4632
  "span",
4475
4633
  {
4476
4634
  className: cn(
@@ -4479,7 +4637,7 @@ function DashboardShell({
4479
4637
  )
4480
4638
  }
4481
4639
  ),
4482
- adminNavItems.map((item) => /* @__PURE__ */ jsx11(
4640
+ adminNavItems.map((item) => /* @__PURE__ */ jsx12(
4483
4641
  "a",
4484
4642
  {
4485
4643
  href: item.href,
@@ -4494,8 +4652,8 @@ function DashboardShell({
4494
4652
  ] })
4495
4653
  ] })
4496
4654
  ] }),
4497
- /* @__PURE__ */ jsxs9("div", { className: "flex items-center gap-2 text-sm", children: [
4498
- userEmail && /* @__PURE__ */ jsx11(
4655
+ /* @__PURE__ */ jsxs10("div", { className: "flex items-center gap-2 text-sm", children: [
4656
+ userEmail && /* @__PURE__ */ jsx12(
4499
4657
  "span",
4500
4658
  {
4501
4659
  className: cn(
@@ -4505,7 +4663,7 @@ function DashboardShell({
4505
4663
  children: userEmail
4506
4664
  }
4507
4665
  ),
4508
- onLogout && /* @__PURE__ */ jsx11(
4666
+ onLogout && /* @__PURE__ */ jsx12(
4509
4667
  "button",
4510
4668
  {
4511
4669
  type: "button",
@@ -4519,8 +4677,8 @@ function DashboardShell({
4519
4677
  )
4520
4678
  ] })
4521
4679
  ] }),
4522
- mobileOpen && /* @__PURE__ */ jsxs9("div", { className: mobilePanelClasses(theme), children: [
4523
- /* @__PURE__ */ jsx11("div", { className: "space-y-1", children: navItems.map((item) => /* @__PURE__ */ jsx11(
4680
+ mobileOpen && /* @__PURE__ */ jsxs10("div", { className: mobilePanelClasses(theme), children: [
4681
+ /* @__PURE__ */ jsx12("div", { className: "space-y-1", children: navItems.map((item) => /* @__PURE__ */ jsx12(
4524
4682
  "a",
4525
4683
  {
4526
4684
  href: item.href,
@@ -4532,8 +4690,8 @@ function DashboardShell({
4532
4690
  },
4533
4691
  item.href
4534
4692
  )) }),
4535
- isAdmin && adminNavItems && adminNavItems.length > 0 && /* @__PURE__ */ jsxs9(Fragment, { children: [
4536
- /* @__PURE__ */ jsx11(
4693
+ isAdmin && adminNavItems && adminNavItems.length > 0 && /* @__PURE__ */ jsxs10(Fragment, { children: [
4694
+ /* @__PURE__ */ jsx12(
4537
4695
  "div",
4538
4696
  {
4539
4697
  className: cn(
@@ -4542,7 +4700,7 @@ function DashboardShell({
4542
4700
  )
4543
4701
  }
4544
4702
  ),
4545
- /* @__PURE__ */ jsx11("div", { className: "space-y-1", children: adminNavItems.map((item) => /* @__PURE__ */ jsx11(
4703
+ /* @__PURE__ */ jsx12("div", { className: "space-y-1", children: adminNavItems.map((item) => /* @__PURE__ */ jsx12(
4546
4704
  "a",
4547
4705
  {
4548
4706
  href: item.href,
@@ -4555,7 +4713,7 @@ function DashboardShell({
4555
4713
  item.href
4556
4714
  )) })
4557
4715
  ] }),
4558
- userEmail && /* @__PURE__ */ jsx11(
4716
+ userEmail && /* @__PURE__ */ jsx12(
4559
4717
  "div",
4560
4718
  {
4561
4719
  className: cn(
@@ -4565,7 +4723,7 @@ function DashboardShell({
4565
4723
  children: userEmail
4566
4724
  }
4567
4725
  ),
4568
- onLogout && /* @__PURE__ */ jsx11(
4726
+ onLogout && /* @__PURE__ */ jsx12(
4569
4727
  "button",
4570
4728
  {
4571
4729
  type: "button",
@@ -4579,157 +4737,51 @@ function DashboardShell({
4579
4737
  )
4580
4738
  ] })
4581
4739
  ] }),
4582
- /* @__PURE__ */ jsx11("main", { className: "mx-auto max-w-7xl px-4 py-8 sm:px-6 lg:px-8", children })
4740
+ /* @__PURE__ */ jsx12("main", { className: "mx-auto max-w-7xl px-4 py-8 sm:px-6 lg:px-8", children })
4583
4741
  ] });
4584
- }
4742
+ });
4585
4743
 
4586
- // components/CommandPalette.tsx
4587
- import { useCallback as useCallback3, useEffect as useEffect3, useMemo as useMemo3, useRef as useRef2, useState as useState5 } from "react";
4588
- import { jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
4589
- function CommandPalette({
4590
- open,
4591
- onClose,
4592
- commands,
4593
- placeholder = "Type a command...",
4594
- theme: themeProp
4595
- }) {
4596
- const [query, setQuery] = useState5("");
4597
- const [selected, setSelected] = useState5(0);
4598
- const listRef = useRef2(null);
4599
- const { theme: contextTheme } = useTheme();
4600
- const theme = themeProp ?? contextTheme;
4601
- const themeClass = getThemeClass(theme, "commandPalette", "default");
4602
- const filtered = useMemo3(() => {
4603
- if (!query.trim()) return commands;
4604
- const q = query.toLowerCase();
4605
- return commands.filter((c) => c.label.toLowerCase().includes(q));
4606
- }, [commands, query]);
4607
- const safeSelected = Math.min(selected, Math.max(0, filtered.length - 1));
4608
- useEffect3(() => {
4609
- if (open) {
4610
- setQuery("");
4611
- setSelected(0);
4612
- }
4613
- }, [open]);
4614
- useEffect3(() => {
4615
- setSelected((s) => Math.min(s, Math.max(0, filtered.length - 1)));
4616
- }, [filtered.length]);
4617
- const runSelected = useCallback3(() => {
4618
- const item = filtered[safeSelected];
4619
- if (item) {
4620
- item.onSelect();
4621
- onClose();
4622
- }
4623
- }, [filtered, safeSelected, onClose]);
4624
- useEffect3(() => {
4625
- if (!open) return;
4626
- const handler = (e) => {
4627
- if (e.key === "Escape") {
4628
- e.preventDefault();
4629
- onClose();
4630
- return;
4631
- }
4632
- if (e.key === "ArrowDown") {
4633
- e.preventDefault();
4634
- setSelected((s) => (s + 1) % Math.max(1, filtered.length));
4635
- return;
4636
- }
4637
- if (e.key === "ArrowUp") {
4638
- e.preventDefault();
4639
- setSelected(
4640
- (s) => (s - 1 + filtered.length) % Math.max(1, filtered.length)
4641
- );
4642
- return;
4643
- }
4644
- if (e.key === "Enter") {
4645
- e.preventDefault();
4646
- runSelected();
4647
- }
4648
- };
4649
- document.addEventListener("keydown", handler, true);
4650
- return () => document.removeEventListener("keydown", handler, true);
4651
- }, [open, onClose, filtered.length, runSelected]);
4652
- useEffect3(() => {
4653
- const el = listRef.current;
4654
- if (!el) return;
4655
- const item = el.querySelector(`[data-index="${safeSelected}"]`);
4656
- item?.scrollIntoView({ block: "nearest", behavior: "smooth" });
4657
- }, [safeSelected]);
4658
- if (!open) return null;
4659
- return /* @__PURE__ */ jsxs10(
4744
+ // components/DataTable.tsx
4745
+ import { forwardRef as forwardRef14 } from "react";
4746
+ import { jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
4747
+ function DataTableInner({ columns, data, getRowKey, className, style }, ref) {
4748
+ const { theme } = useTheme();
4749
+ const themeClass = getThemeClass(theme, "dataTable", "default");
4750
+ return /* @__PURE__ */ jsx13(
4660
4751
  "div",
4661
4752
  {
4662
- className: "fixed inset-0 z-50 flex items-start justify-center pt-[20vh] p-4",
4663
- role: "dialog",
4664
- "aria-modal": "true",
4665
- "aria-label": "Command palette",
4666
- children: [
4667
- /* @__PURE__ */ jsx12(
4668
- "div",
4753
+ ref,
4754
+ className: cn(
4755
+ "overflow-x-auto rounded-lg -mx-1 px-1 sm:mx-0 sm:px-0",
4756
+ themeClass,
4757
+ className
4758
+ ),
4759
+ style,
4760
+ children: /* @__PURE__ */ jsxs11("table", { className: "w-full min-w-[480px] text-left text-sm", children: [
4761
+ /* @__PURE__ */ jsx13("thead", { children: /* @__PURE__ */ jsx13("tr", { className: "border-b border-inherit", children: columns.map((col) => /* @__PURE__ */ jsx13(
4762
+ "th",
4669
4763
  {
4670
- className: "absolute inset-0 bg-black/50 backdrop-blur-sm",
4671
- onClick: onClose,
4672
- "aria-hidden": true
4673
- }
4674
- ),
4675
- /* @__PURE__ */ jsxs10(
4676
- "div",
4764
+ className: "px-4 py-3 font-medium",
4765
+ children: col.header
4766
+ },
4767
+ String(col.key)
4768
+ )) }) }),
4769
+ /* @__PURE__ */ jsx13("tbody", { children: data.map((row, i) => /* @__PURE__ */ jsx13(
4770
+ "tr",
4677
4771
  {
4678
- className: `relative z-10 w-full max-w-[calc(100vw-2rem)] sm:max-w-xl overflow-hidden rounded-xl mx-2 sm:mx-0 ${themeClass}`,
4679
- children: [
4680
- /* @__PURE__ */ jsxs10("div", { className: "flex items-center gap-2 border-b border-inherit px-3 py-2", children: [
4681
- /* @__PURE__ */ jsx12(Search, { className: "size-4 shrink-0 opacity-60", "aria-hidden": true }),
4682
- /* @__PURE__ */ jsx12(
4683
- "input",
4684
- {
4685
- type: "text",
4686
- value: query,
4687
- onChange: (e) => setQuery(e.target.value),
4688
- placeholder,
4689
- className: "flex-1 bg-transparent outline-none placeholder:opacity-60",
4690
- autoFocus: true,
4691
- "aria-autocomplete": "list",
4692
- "aria-controls": "command-palette-list",
4693
- "aria-expanded": "true"
4694
- }
4695
- ),
4696
- /* @__PURE__ */ jsx12("kbd", { className: "rounded border border-inherit px-1.5 py-0.5 text-xs opacity-60", children: "ESC" })
4697
- ] }),
4698
- /* @__PURE__ */ jsx12(
4699
- "ul",
4700
- {
4701
- ref: listRef,
4702
- id: "command-palette-list",
4703
- role: "listbox",
4704
- className: "max-h-72 overflow-auto py-2",
4705
- children: filtered.length === 0 ? /* @__PURE__ */ jsx12("li", { className: "px-4 py-3 text-sm opacity-60", children: "No results." }) : filtered.map((cmd, i) => /* @__PURE__ */ jsx12("li", { role: "option", "data-index": i, children: /* @__PURE__ */ jsxs10(
4706
- "button",
4707
- {
4708
- type: "button",
4709
- onClick: () => {
4710
- cmd.onSelect();
4711
- onClose();
4712
- },
4713
- onMouseEnter: () => setSelected(i),
4714
- className: `flex w-full items-center justify-between px-4 py-2 text-left text-sm ${i === safeSelected ? "bg-current/10" : ""}`,
4715
- children: [
4716
- cmd.label,
4717
- cmd.shortcut ? /* @__PURE__ */ jsx12("kbd", { className: "rounded border border-inherit px-1.5 py-0.5 text-xs opacity-60", children: cmd.shortcut }) : null
4718
- ]
4719
- }
4720
- ) }, cmd.id))
4721
- }
4722
- )
4723
- ]
4724
- }
4725
- )
4726
- ]
4772
+ className: "border-b border-inherit last:border-0",
4773
+ children: columns.map((col) => /* @__PURE__ */ jsx13("td", { className: "px-4 py-3", children: col.render ? col.render(row) : String(row[col.key] ?? "") }, String(col.key)))
4774
+ },
4775
+ getRowKey ? getRowKey(row, i) : i
4776
+ )) })
4777
+ ] })
4727
4778
  }
4728
4779
  );
4729
4780
  }
4781
+ var DataTable = forwardRef14(DataTableInner);
4730
4782
 
4731
4783
  // components/DocumentAccordion.tsx
4732
- import { jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
4784
+ import { jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
4733
4785
  function DocumentAccordion({
4734
4786
  title,
4735
4787
  content,
@@ -4744,15 +4796,15 @@ function DocumentAccordion({
4744
4796
  {
4745
4797
  id: "document",
4746
4798
  title,
4747
- content: /* @__PURE__ */ jsx13(
4799
+ content: /* @__PURE__ */ jsx14(
4748
4800
  "div",
4749
4801
  {
4750
4802
  className: cn(
4751
4803
  "rounded-xl border p-0 shadow-sm backdrop-blur-md",
4752
4804
  theme === "night" || theme === "cyberpunk" ? "border-white/10 bg-zinc-950/80" : "border-black/5 bg-white/60"
4753
4805
  ),
4754
- children: pdfUrl ? /* @__PURE__ */ jsxs11("div", { className: "flex flex-col gap-3", children: [
4755
- /* @__PURE__ */ jsx13("div", { className: "flex justify-end px-4 pt-4", children: /* @__PURE__ */ jsxs11(
4806
+ children: pdfUrl ? /* @__PURE__ */ jsxs12("div", { className: "flex flex-col gap-3", children: [
4807
+ /* @__PURE__ */ jsx14("div", { className: "flex justify-end px-4 pt-4", children: /* @__PURE__ */ jsxs12(
4756
4808
  "a",
4757
4809
  {
4758
4810
  href: pdfUrl,
@@ -4763,19 +4815,19 @@ function DocumentAccordion({
4763
4815
  theme === "night" || theme === "cyberpunk" ? "border-white/20 bg-zinc-900/80 text-sky-300 hover:bg-zinc-800/80" : "border-black/5 bg-white/70 text-blue-700 hover:bg-white"
4764
4816
  ),
4765
4817
  children: [
4766
- /* @__PURE__ */ jsx13("span", { children: "Open PDF" }),
4767
- /* @__PURE__ */ jsx13("span", { "aria-hidden": true, children: "\u2197" })
4818
+ /* @__PURE__ */ jsx14("span", { children: "Open PDF" }),
4819
+ /* @__PURE__ */ jsx14("span", { "aria-hidden": true, children: "\u2197" })
4768
4820
  ]
4769
4821
  }
4770
4822
  ) }),
4771
- /* @__PURE__ */ jsx13(
4823
+ /* @__PURE__ */ jsx14(
4772
4824
  "div",
4773
4825
  {
4774
4826
  className: cn(
4775
4827
  "h-[60vh] w-full border-t",
4776
4828
  theme === "night" || theme === "cyberpunk" ? "border-white/10" : "border-black/5"
4777
4829
  ),
4778
- children: /* @__PURE__ */ jsx13(
4830
+ children: /* @__PURE__ */ jsx14(
4779
4831
  "iframe",
4780
4832
  {
4781
4833
  src: `https://docs.google.com/viewer?url=${encodeURIComponent(
@@ -4787,7 +4839,7 @@ function DocumentAccordion({
4787
4839
  )
4788
4840
  }
4789
4841
  )
4790
- ] }) : content ? /* @__PURE__ */ jsx13(
4842
+ ] }) : content ? /* @__PURE__ */ jsx14(
4791
4843
  "div",
4792
4844
  {
4793
4845
  className: cn(
@@ -4801,7 +4853,7 @@ function DocumentAccordion({
4801
4853
  )
4802
4854
  }
4803
4855
  ];
4804
- return /* @__PURE__ */ jsx13(
4856
+ return /* @__PURE__ */ jsx14(
4805
4857
  Accordion,
4806
4858
  {
4807
4859
  items,
@@ -4813,48 +4865,6 @@ function DocumentAccordion({
4813
4865
  );
4814
4866
  }
4815
4867
 
4816
- // components/DataTable.tsx
4817
- import { jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
4818
- function DataTable({
4819
- columns,
4820
- data,
4821
- getRowKey,
4822
- className,
4823
- style
4824
- }) {
4825
- const { theme } = useTheme();
4826
- const themeClass = getThemeClass(theme, "dataTable", "default");
4827
- return /* @__PURE__ */ jsx14(
4828
- "div",
4829
- {
4830
- className: cn(
4831
- "overflow-x-auto rounded-lg -mx-1 px-1 sm:mx-0 sm:px-0",
4832
- themeClass,
4833
- className
4834
- ),
4835
- style,
4836
- children: /* @__PURE__ */ jsxs12("table", { className: "w-full min-w-[480px] text-left text-sm", children: [
4837
- /* @__PURE__ */ jsx14("thead", { children: /* @__PURE__ */ jsx14("tr", { className: "border-b border-inherit", children: columns.map((col) => /* @__PURE__ */ jsx14(
4838
- "th",
4839
- {
4840
- className: "px-4 py-3 font-medium",
4841
- children: col.header
4842
- },
4843
- String(col.key)
4844
- )) }) }),
4845
- /* @__PURE__ */ jsx14("tbody", { children: data.map((row, i) => /* @__PURE__ */ jsx14(
4846
- "tr",
4847
- {
4848
- className: "border-b border-inherit last:border-0",
4849
- children: columns.map((col) => /* @__PURE__ */ jsx14("td", { className: "px-4 py-3", children: col.render ? col.render(row) : String(row[col.key] ?? "") }, String(col.key)))
4850
- },
4851
- getRowKey ? getRowKey(row, i) : i
4852
- )) })
4853
- ] })
4854
- }
4855
- );
4856
- }
4857
-
4858
4868
  // src/hooks/useKeyboardNavigation.ts
4859
4869
  import { useCallback as useCallback4, useEffect as useEffect4 } from "react";
4860
4870
  function useKeyboardNavigation(options) {
@@ -4933,6 +4943,7 @@ function useClickOutside(ref, handler, options) {
4933
4943
 
4934
4944
  // components/Dropdown.tsx
4935
4945
  import {
4946
+ forwardRef as forwardRef15,
4936
4947
  useCallback as useCallback6,
4937
4948
  useEffect as useEffect6,
4938
4949
  useLayoutEffect,
@@ -4945,7 +4956,7 @@ function dropdownItemHighlightClass(theme) {
4945
4956
  const darkThemes = ["night", "cyberpunk"];
4946
4957
  return darkThemes.includes(theme) ? "hover:bg-white/10 focus:bg-white/10" : "hover:bg-black/5 focus:bg-black/5";
4947
4958
  }
4948
- function Dropdown({
4959
+ var Dropdown = forwardRef15(function Dropdown2({
4949
4960
  trigger: triggerProp,
4950
4961
  placeholder = "Select\u2026",
4951
4962
  items,
@@ -4957,7 +4968,7 @@ function Dropdown({
4957
4968
  style,
4958
4969
  theme: themeProp,
4959
4970
  classNames = {}
4960
- }) {
4971
+ }, ref) {
4961
4972
  const [open, setOpen] = useState6(false);
4962
4973
  const [uncontrolledValue, setUncontrolledValue] = useState6(defaultValue ?? "");
4963
4974
  const isControlled = controlledValue !== void 0;
@@ -4967,6 +4978,7 @@ function Dropdown({
4967
4978
  const listRef = useRef3(null);
4968
4979
  const containerRef = useRef3(null);
4969
4980
  const triggerRef = useRef3(null);
4981
+ const mergedContainerRef = mergeRefs(ref, containerRef);
4970
4982
  const { theme: contextTheme } = useTheme();
4971
4983
  const theme = themeProp ?? contextTheme;
4972
4984
  const themeClass = getThemeClass(theme, "card", "default");
@@ -5126,7 +5138,7 @@ function Dropdown({
5126
5138
  return /* @__PURE__ */ jsxs13(
5127
5139
  "div",
5128
5140
  {
5129
- ref: containerRef,
5141
+ ref: mergedContainerRef,
5130
5142
  className: cn("relative inline-block", className),
5131
5143
  style,
5132
5144
  onKeyDown: handleKeyDown,
@@ -5150,7 +5162,7 @@ function Dropdown({
5150
5162
  ]
5151
5163
  }
5152
5164
  );
5153
- }
5165
+ });
5154
5166
 
5155
5167
  // components/Flashcard.tsx
5156
5168
  import { useState as useState7 } from "react";
@@ -5534,7 +5546,7 @@ function createDOMMotionComponentProxy(componentFactory) {
5534
5546
 
5535
5547
  // node_modules/framer-motion/dist/es/motion/index.mjs
5536
5548
  import { jsxs as jsxs14, jsx as jsx16 } from "react/jsx-runtime";
5537
- import { forwardRef as forwardRef8, useContext as useContext5 } from "react";
5549
+ import { forwardRef as forwardRef16, useContext as useContext5 } from "react";
5538
5550
 
5539
5551
  // node_modules/framer-motion/dist/es/context/MotionContext/index.mjs
5540
5552
  import { createContext as createContext6 } from "react";
@@ -5762,7 +5774,7 @@ function createRendererMotionComponent({ preloadedFeatures, createVisualElement,
5762
5774
  return jsxs14(MotionContext.Provider, { value: context, children: [MeasureLayout2 && context.visualElement ? jsx16(MeasureLayout2, { visualElement: context.visualElement, ...configAndProps }) : null, useRender(Component2, props, useMotionRef(visualState, context.visualElement, externalRef), visualState, isStatic, context.visualElement)] });
5763
5775
  }
5764
5776
  MotionComponent.displayName = `motion.${typeof Component2 === "string" ? Component2 : `create(${(_b = (_a = Component2.displayName) !== null && _a !== void 0 ? _a : Component2.name) !== null && _b !== void 0 ? _b : ""})`}`;
5765
- const ForwardRefMotionComponent = forwardRef8(MotionComponent);
5777
+ const ForwardRefMotionComponent = forwardRef16(MotionComponent);
5766
5778
  ForwardRefMotionComponent[motionComponentSymbol] = Component2;
5767
5779
  return ForwardRefMotionComponent;
5768
5780
  }
@@ -12847,6 +12859,7 @@ var createMotionComponent = /* @__PURE__ */ createMotionComponentFactory({
12847
12859
  var motion = /* @__PURE__ */ createDOMMotionComponentProxy(createMotionComponent);
12848
12860
 
12849
12861
  // components/Flashcard.tsx
12862
+ import { forwardRef as forwardRef17 } from "react";
12850
12863
  import { jsx as jsx18, jsxs as jsxs15 } from "react/jsx-runtime";
12851
12864
  var FRONT_BY_THEME = {
12852
12865
  minimal: "border-black/5 bg-gradient-to-br from-white to-zinc-50 text-zinc-900 shadow-[0_4px_20px_-4px_rgba(0,0,0,0.1)]",
@@ -12868,17 +12881,13 @@ var BACK_BY_THEME = {
12868
12881
  retro: "from-zinc-800 to-black text-lime-400 font-mono",
12869
12882
  motion: "from-indigo-600 via-purple-600 to-indigo-700 text-white transition-all duration-500"
12870
12883
  };
12871
- function Flashcard({
12872
- question,
12873
- answer,
12874
- className,
12875
- ...props
12876
- }) {
12884
+ var Flashcard = forwardRef17(function Flashcard2({ question, answer, className, ...props }, ref) {
12877
12885
  const [isFlipped, setIsFlipped] = useState7(false);
12878
12886
  const { theme } = useTheme();
12879
12887
  return /* @__PURE__ */ jsx18(
12880
12888
  "div",
12881
12889
  {
12890
+ ref,
12882
12891
  className: cn(
12883
12892
  "group relative h-64 w-full cursor-pointer [perspective:1000px]",
12884
12893
  className
@@ -12934,9 +12943,10 @@ function Flashcard({
12934
12943
  )
12935
12944
  }
12936
12945
  );
12937
- }
12946
+ });
12938
12947
 
12939
12948
  // components/GraphicCard.tsx
12949
+ import { forwardRef as forwardRef18 } from "react";
12940
12950
  import { jsx as jsx19, jsxs as jsxs16 } from "react/jsx-runtime";
12941
12951
  var SURFACE_BY_THEME = {
12942
12952
  minimal: "bg-gradient-to-br from-white to-zinc-50 border-black/5 shadow-[0_4px_20px_-4px_rgba(0,0,0,0.08)] hover:shadow-[0_10px_40px_-6px_rgba(0,0,0,0.18)]",
@@ -12948,11 +12958,7 @@ var SURFACE_BY_THEME = {
12948
12958
  retro: "bg-white border-2 border-black font-mono shadow-[4px_4px_0_0_rgba(0,0,0,1)]",
12949
12959
  motion: "bg-white border-2 border-indigo-200 shadow-lg transition-all duration-300 hover:scale-[1.02] hover:shadow-xl hover:border-indigo-300 hover:-translate-y-0.5"
12950
12960
  };
12951
- function GraphicCard({
12952
- children,
12953
- className,
12954
- ...props
12955
- }) {
12961
+ var GraphicCard = forwardRef18(function GraphicCard2({ children, className, ...props }, ref) {
12956
12962
  const { theme } = useTheme();
12957
12963
  const surface = SURFACE_BY_THEME[theme];
12958
12964
  const isDark = theme === "night" || theme === "cyberpunk";
@@ -12961,6 +12967,7 @@ function GraphicCard({
12961
12967
  return /* @__PURE__ */ jsxs16(
12962
12968
  "div",
12963
12969
  {
12970
+ ref,
12964
12971
  className: cn(
12965
12972
  "group relative w-full overflow-hidden rounded-2xl p-6 transition-all duration-300",
12966
12973
  surface,
@@ -12974,10 +12981,10 @@ function GraphicCard({
12974
12981
  ]
12975
12982
  }
12976
12983
  );
12977
- }
12984
+ });
12978
12985
 
12979
12986
  // components/Input.tsx
12980
- import { forwardRef as forwardRef9 } from "react";
12987
+ import { forwardRef as forwardRef19 } from "react";
12981
12988
  import { jsx as jsx20, jsxs as jsxs17 } from "react/jsx-runtime";
12982
12989
  var inputVariants = cva(
12983
12990
  "w-full rounded-lg px-3 py-2 text-sm outline-none transition-shadow",
@@ -12994,7 +13001,7 @@ var inputVariants = cva(
12994
13001
  }
12995
13002
  }
12996
13003
  );
12997
- var Input = forwardRef9(function Input2({
13004
+ var Input = forwardRef19(function Input2({
12998
13005
  label,
12999
13006
  error,
13000
13007
  helperText,
@@ -13002,6 +13009,7 @@ var Input = forwardRef9(function Input2({
13002
13009
  suffix,
13003
13010
  size = "md",
13004
13011
  className,
13012
+ style,
13005
13013
  id: idProp,
13006
13014
  disabled,
13007
13015
  theme: themeProp,
@@ -13030,13 +13038,12 @@ var Input = forwardRef9(function Input2({
13030
13038
  themeClass,
13031
13039
  error && "border-red-500 focus:ring-red-500 focus:border-red-500",
13032
13040
  hasAddon && "rounded-none first:rounded-l-lg last:rounded-r-lg",
13033
- !hasAddon && "rounded-lg",
13034
- className
13041
+ !hasAddon && "rounded-lg"
13035
13042
  ),
13036
13043
  ...props
13037
13044
  }
13038
13045
  );
13039
- return /* @__PURE__ */ jsxs17("div", { className: "w-full", children: [
13046
+ return /* @__PURE__ */ jsxs17("div", { className: cn("w-full", className), style, children: [
13040
13047
  label && /* @__PURE__ */ jsx20(
13041
13048
  "label",
13042
13049
  {
@@ -13125,7 +13132,7 @@ function useFocusTrap(active, options) {
13125
13132
  }
13126
13133
 
13127
13134
  // components/Modal.tsx
13128
- import { useCallback as useCallback10, useEffect as useEffect11 } from "react";
13135
+ import { forwardRef as forwardRef20, useCallback as useCallback10, useEffect as useEffect11 } from "react";
13129
13136
  import { jsx as jsx21, jsxs as jsxs18 } from "react/jsx-runtime";
13130
13137
  var modalVariants = cva(
13131
13138
  "relative z-10 max-h-[90vh] w-full max-w-[calc(100vw-2rem)] overflow-auto rounded-xl p-4 sm:p-6",
@@ -13142,7 +13149,7 @@ var modalVariants = cva(
13142
13149
  }
13143
13150
  }
13144
13151
  );
13145
- function Modal({
13152
+ var Modal = forwardRef20(function Modal2({
13146
13153
  open,
13147
13154
  onClose,
13148
13155
  title,
@@ -13151,11 +13158,12 @@ function Modal({
13151
13158
  style,
13152
13159
  children,
13153
13160
  theme: themeProp
13154
- }) {
13161
+ }, ref) {
13155
13162
  const { theme: contextTheme } = useTheme();
13156
13163
  const theme = themeProp ?? contextTheme;
13157
13164
  const themeClass = getThemeClass(theme, "modal", "default");
13158
13165
  const focusTrapRef = useFocusTrap(open, { returnFocus: true });
13166
+ const mergedRef = mergeRefs(ref, focusTrapRef);
13159
13167
  const handleEscape = useCallback10(
13160
13168
  (e) => {
13161
13169
  if (e.key === "Escape") onClose();
@@ -13192,7 +13200,7 @@ function Modal({
13192
13200
  /* @__PURE__ */ jsxs18(
13193
13201
  "div",
13194
13202
  {
13195
- ref: focusTrapRef,
13203
+ ref: mergedRef,
13196
13204
  className: cn(modalVariants({ size }), themeClass, className),
13197
13205
  style,
13198
13206
  children: [
@@ -13225,21 +13233,15 @@ function Modal({
13225
13233
  ]
13226
13234
  }
13227
13235
  );
13228
- }
13236
+ });
13229
13237
 
13230
13238
  // components/Navbar.tsx
13231
- import { useCallback as useCallback11, useRef as useRef7, useState as useState8 } from "react";
13239
+ import { forwardRef as forwardRef21, useCallback as useCallback11, useRef as useRef7, useState as useState8 } from "react";
13232
13240
  import { jsx as jsx22, jsxs as jsxs19 } from "react/jsx-runtime";
13233
- function Navbar({
13234
- children,
13235
- logo,
13236
- items,
13237
- right,
13238
- className,
13239
- style
13240
- }) {
13241
+ var Navbar = forwardRef21(function Navbar2({ children, logo, items, right, className, style }, ref) {
13241
13242
  const [mobileOpen, setMobileOpen] = useState8(false);
13242
13243
  const navRef = useRef7(null);
13244
+ const mergedNavRef = mergeRefs(ref, navRef);
13243
13245
  const { theme } = useTheme();
13244
13246
  const themeClass = getThemeClass(theme, "navbar", "default");
13245
13247
  const mobilePanelBgOverride = theme === "glass" ? "bg-white/95 backdrop-blur-xl" : theme === "clay" ? "bg-white/95" : null;
@@ -13253,7 +13255,7 @@ function Navbar({
13253
13255
  return /* @__PURE__ */ jsxs19(
13254
13256
  "nav",
13255
13257
  {
13256
- ref: navRef,
13258
+ ref: mergedNavRef,
13257
13259
  className: cn(
13258
13260
  "relative sticky top-0 z-50 flex h-14 w-full flex-col px-3 sm:px-4",
13259
13261
  themeClass,
@@ -13319,6 +13321,7 @@ function Navbar({
13319
13321
  return /* @__PURE__ */ jsx22(
13320
13322
  "nav",
13321
13323
  {
13324
+ ref: mergedNavRef,
13322
13325
  className: cn(
13323
13326
  "sticky top-0 z-50 flex h-14 w-full flex-wrap items-center gap-2 px-3 sm:px-4",
13324
13327
  themeClass,
@@ -13328,21 +13331,18 @@ function Navbar({
13328
13331
  children
13329
13332
  }
13330
13333
  );
13331
- }
13334
+ });
13332
13335
 
13333
13336
  // components/PricingCard.tsx
13337
+ import { forwardRef as forwardRef22 } from "react";
13334
13338
  import { jsx as jsx23, jsxs as jsxs20 } from "react/jsx-runtime";
13335
- function PricingCard({
13336
- tier,
13337
- onSelect,
13338
- className,
13339
- style
13340
- }) {
13339
+ var PricingCard = forwardRef22(function PricingCard2({ tier, onSelect, className, style }, ref) {
13341
13340
  const { theme } = useTheme();
13342
13341
  const themeClass = getThemeClass(theme, "pricingCard", "default");
13343
13342
  return /* @__PURE__ */ jsxs20(
13344
13343
  "div",
13345
13344
  {
13345
+ ref,
13346
13346
  className: cn(
13347
13347
  "flex flex-col rounded-xl p-4 sm:p-6",
13348
13348
  themeClass,
@@ -13370,36 +13370,47 @@ function PricingCard({
13370
13370
  ]
13371
13371
  }
13372
13372
  );
13373
- }
13373
+ });
13374
13374
 
13375
13375
  // components/ProgressBar.tsx
13376
+ import { forwardRef as forwardRef23 } from "react";
13376
13377
  import { jsx as jsx24 } from "react/jsx-runtime";
13377
- function ProgressBar({
13378
+ var ProgressBar = forwardRef23(function ProgressBar2({
13378
13379
  value,
13379
13380
  max = 100,
13380
13381
  segmented = false,
13381
13382
  className,
13382
13383
  style,
13384
+ "aria-label": ariaLabel,
13383
13385
  trackColor,
13384
13386
  activeColor
13385
- }) {
13387
+ }, ref) {
13386
13388
  const { theme } = useTheme();
13387
13389
  const themeClass = getThemeClass(theme, "progress", "default");
13388
13390
  const pct = Math.min(100, Math.max(0, value / max * 100));
13389
13391
  const trackStyle = trackColor ? { backgroundColor: trackColor } : void 0;
13390
13392
  const fillStyle = activeColor ? { width: `${pct}%`, backgroundColor: activeColor } : { width: `${pct}%` };
13393
+ const progressRole = {
13394
+ role: "progressbar",
13395
+ "aria-valuenow": value,
13396
+ "aria-valuemin": 0,
13397
+ "aria-valuemax": max,
13398
+ ...ariaLabel && { "aria-label": ariaLabel }
13399
+ };
13391
13400
  if (segmented) {
13392
13401
  const segments = 10;
13393
13402
  const filled = Math.round(pct / 100 * segments);
13394
13403
  return /* @__PURE__ */ jsx24(
13395
13404
  "div",
13396
13405
  {
13406
+ ref,
13397
13407
  className: cn(
13398
13408
  "flex h-3 w-full gap-0.5 overflow-hidden rounded-full",
13399
13409
  themeClass,
13400
13410
  className
13401
13411
  ),
13402
13412
  style: { ...style, ...trackStyle },
13413
+ ...progressRole,
13403
13414
  children: Array.from({ length: segments }).map((_, i) => /* @__PURE__ */ jsx24(
13404
13415
  "div",
13405
13416
  {
@@ -13417,12 +13428,14 @@ function ProgressBar({
13417
13428
  return /* @__PURE__ */ jsx24(
13418
13429
  "div",
13419
13430
  {
13431
+ ref,
13420
13432
  className: cn(
13421
13433
  "relative h-3 w-full overflow-hidden rounded-full",
13422
13434
  themeClass,
13423
13435
  className
13424
13436
  ),
13425
13437
  style: { ...style, ...trackStyle },
13438
+ ...progressRole,
13426
13439
  children: /* @__PURE__ */ jsx24(
13427
13440
  "span",
13428
13441
  {
@@ -13432,33 +13445,25 @@ function ProgressBar({
13432
13445
  )
13433
13446
  }
13434
13447
  );
13435
- }
13448
+ });
13436
13449
 
13437
13450
  // components/SectionHeader.tsx
13451
+ import { forwardRef as forwardRef24 } from "react";
13438
13452
  import { jsx as jsx25, jsxs as jsxs21 } from "react/jsx-runtime";
13439
- function SectionHeader({
13440
- title,
13441
- subtitle,
13442
- className,
13443
- style
13444
- }) {
13453
+ var SectionHeader = forwardRef24(function SectionHeader2({ title, subtitle, className, style }, ref) {
13445
13454
  const { theme } = useTheme();
13446
13455
  const themeClass = getThemeClass(theme, "sectionHeader", "default");
13447
- return /* @__PURE__ */ jsxs21("header", { className: cn("pb-4", themeClass, className), style, children: [
13456
+ return /* @__PURE__ */ jsxs21("header", { ref, className: cn("pb-4", themeClass, className), style, children: [
13448
13457
  /* @__PURE__ */ jsx25("h2", { className: "text-lg font-semibold sm:text-xl", children: title }),
13449
13458
  subtitle ? /* @__PURE__ */ jsx25("p", { className: "mt-1 text-sm opacity-80", children: subtitle }) : null,
13450
13459
  /* @__PURE__ */ jsx25("div", { className: "mt-3 border-b border-inherit" })
13451
13460
  ] });
13452
- }
13461
+ });
13453
13462
 
13454
13463
  // components/Sidebar.tsx
13455
- import { useCallback as useCallback12, useState as useState9 } from "react";
13464
+ import { forwardRef as forwardRef25, useCallback as useCallback12, useState as useState9 } from "react";
13456
13465
  import { jsx as jsx26, jsxs as jsxs22 } from "react/jsx-runtime";
13457
- function Sidebar({
13458
- children,
13459
- className,
13460
- style
13461
- }) {
13466
+ var Sidebar = forwardRef25(function Sidebar2({ children, className, style }, ref) {
13462
13467
  const [collapsed, setCollapsed] = useState9(false);
13463
13468
  const { theme } = useTheme();
13464
13469
  const themeClass = getThemeClass(theme, "sidebar", "default");
@@ -13466,6 +13471,7 @@ function Sidebar({
13466
13471
  return /* @__PURE__ */ jsxs22(
13467
13472
  "aside",
13468
13473
  {
13474
+ ref,
13469
13475
  className: cn(
13470
13476
  "flex h-full flex-col transition-[width] duration-200",
13471
13477
  collapsed ? "w-12 sm:w-14" : "w-48 max-w-[85vw] sm:w-56 sm:max-w-none",
@@ -13488,10 +13494,10 @@ function Sidebar({
13488
13494
  ]
13489
13495
  }
13490
13496
  );
13491
- }
13497
+ });
13492
13498
 
13493
13499
  // components/Skeleton.tsx
13494
- import { forwardRef as forwardRef10 } from "react";
13500
+ import { forwardRef as forwardRef26 } from "react";
13495
13501
  import { jsx as jsx27 } from "react/jsx-runtime";
13496
13502
  var skeletonVariants = cva("", {
13497
13503
  variants: {
@@ -13505,7 +13511,7 @@ var skeletonVariants = cva("", {
13505
13511
  variant: "rectangle"
13506
13512
  }
13507
13513
  });
13508
- var Skeleton = forwardRef10(
13514
+ var Skeleton = forwardRef26(
13509
13515
  function Skeleton2({ variant = "rectangle", className, theme: themeProp, style, ...props }, ref) {
13510
13516
  const { theme: contextTheme } = useTheme();
13511
13517
  const theme = themeProp ?? contextTheme;
@@ -13532,7 +13538,7 @@ var Skeleton = forwardRef10(
13532
13538
 
13533
13539
  // components/Slider.tsx
13534
13540
  import {
13535
- forwardRef as forwardRef11,
13541
+ forwardRef as forwardRef27,
13536
13542
  useCallback as useCallback13,
13537
13543
  useState as useState10
13538
13544
  } from "react";
@@ -13556,7 +13562,7 @@ var trackVariants = cva(
13556
13562
  "relative h-3 w-full rounded-full overflow-visible",
13557
13563
  { variants: {}, defaultVariants: {} }
13558
13564
  );
13559
- var Slider = forwardRef11(function Slider2({
13565
+ var Slider = forwardRef27(function Slider2({
13560
13566
  min = 0,
13561
13567
  max = 100,
13562
13568
  step = 1,
@@ -13565,6 +13571,7 @@ var Slider = forwardRef11(function Slider2({
13565
13571
  onValueChange,
13566
13572
  size = "md",
13567
13573
  className,
13574
+ style,
13568
13575
  theme: themeProp,
13569
13576
  ...props
13570
13577
  }, ref) {
@@ -13583,7 +13590,7 @@ var Slider = forwardRef11(function Slider2({
13583
13590
  },
13584
13591
  [isControlled, onValueChange]
13585
13592
  );
13586
- return /* @__PURE__ */ jsxs23("div", { className: cn(sliderVariants({ size }), className), children: [
13593
+ return /* @__PURE__ */ jsxs23("div", { className: cn(sliderVariants({ size }), className), style, children: [
13587
13594
  /* @__PURE__ */ jsxs23("div", { className: cn(trackVariants(), themeClass), children: [
13588
13595
  /* @__PURE__ */ jsx28(
13589
13596
  "span",
@@ -13621,20 +13628,15 @@ var Slider = forwardRef11(function Slider2({
13621
13628
  });
13622
13629
 
13623
13630
  // components/StatsCard.tsx
13631
+ import { forwardRef as forwardRef28 } from "react";
13624
13632
  import { jsx as jsx29, jsxs as jsxs24 } from "react/jsx-runtime";
13625
- function StatsCard({
13626
- label,
13627
- value,
13628
- trend,
13629
- className,
13630
- style
13631
- }) {
13633
+ var StatsCard = forwardRef28(function StatsCard2({ label, value, trend, className, style }, ref) {
13632
13634
  const { theme } = useTheme();
13633
13635
  const themeClass = getThemeClass(theme, "statsCard", "default");
13634
13636
  const isDark = theme === "night" || theme === "cyberpunk";
13635
13637
  const trendUpClass = trend?.direction === "up" ? isDark ? "text-emerald-400" : "text-emerald-600" : null;
13636
13638
  const trendDownClass = trend?.direction === "down" ? isDark ? "text-rose-400" : "text-rose-600" : null;
13637
- return /* @__PURE__ */ jsxs24("div", { className: cn("rounded-xl p-6", themeClass, className), style, children: [
13639
+ return /* @__PURE__ */ jsxs24("div", { ref, className: cn("rounded-xl p-6", themeClass, className), style, children: [
13638
13640
  /* @__PURE__ */ jsx29("p", { className: "text-sm font-medium opacity-80", children: label }),
13639
13641
  /* @__PURE__ */ jsx29("p", { className: "mt-2 text-2xl font-bold tracking-tight", children: value }),
13640
13642
  trend ? /* @__PURE__ */ jsxs24(
@@ -13651,10 +13653,11 @@ function StatsCard({
13651
13653
  }
13652
13654
  ) : null
13653
13655
  ] });
13654
- }
13656
+ });
13655
13657
 
13656
13658
  // components/Tabs.tsx
13657
13659
  import {
13660
+ forwardRef as forwardRef29,
13658
13661
  useCallback as useCallback14,
13659
13662
  useEffect as useEffect12,
13660
13663
  useRef as useRef8,
@@ -13682,7 +13685,7 @@ var tabTriggerVariants = cva(
13682
13685
  }
13683
13686
  }
13684
13687
  );
13685
- function Tabs({
13688
+ var Tabs = forwardRef29(function Tabs2({
13686
13689
  items,
13687
13690
  defaultValue,
13688
13691
  value: controlledValue,
@@ -13690,7 +13693,7 @@ function Tabs({
13690
13693
  className,
13691
13694
  style,
13692
13695
  theme: themeProp
13693
- }) {
13696
+ }, ref) {
13694
13697
  const [uncontrolled, setUncontrolled] = useState11(
13695
13698
  () => defaultValue ?? items[0]?.value ?? ""
13696
13699
  );
@@ -13732,7 +13735,7 @@ function Tabs({
13732
13735
  );
13733
13736
  const activeItem = items[safeIndex];
13734
13737
  const content = activeItem?.content ?? null;
13735
- return /* @__PURE__ */ jsxs25("div", { className: cn("w-full min-w-0", className), style, children: [
13738
+ return /* @__PURE__ */ jsxs25("div", { ref, className: cn("w-full min-w-0", className), style, children: [
13736
13739
  /* @__PURE__ */ jsx30(
13737
13740
  "div",
13738
13741
  {
@@ -13776,22 +13779,19 @@ function Tabs({
13776
13779
  }
13777
13780
  )
13778
13781
  ] });
13779
- }
13782
+ });
13780
13783
 
13781
13784
  // components/Terminal.tsx
13785
+ import { forwardRef as forwardRef30 } from "react";
13782
13786
  import { jsx as jsx31, jsxs as jsxs26 } from "react/jsx-runtime";
13783
- function Terminal({
13784
- title = "terminal",
13785
- children,
13786
- className,
13787
- style
13788
- }) {
13787
+ var Terminal = forwardRef30(function Terminal2({ title = "terminal", children, className, style }, ref) {
13789
13788
  const { theme } = useTheme();
13790
13789
  const themeClass = getThemeClass(theme, "terminal", "default");
13791
13790
  const isCyberpunk = theme === "cyberpunk";
13792
13791
  return /* @__PURE__ */ jsxs26(
13793
13792
  "div",
13794
13793
  {
13794
+ ref,
13795
13795
  className: cn("overflow-hidden rounded-xl font-mono text-sm", themeClass, className),
13796
13796
  style,
13797
13797
  children: [
@@ -13817,22 +13817,21 @@ function Terminal({
13817
13817
  ]
13818
13818
  }
13819
13819
  );
13820
- }
13820
+ });
13821
13821
 
13822
13822
  // components/Timeline.tsx
13823
+ import { forwardRef as forwardRef31 } from "react";
13823
13824
  import { jsx as jsx32, jsxs as jsxs27 } from "react/jsx-runtime";
13824
- function Timeline({
13825
- items,
13826
- className,
13827
- theme: themeProp
13828
- }) {
13825
+ var Timeline = forwardRef31(function Timeline2({ items, className, style, theme: themeProp }, ref) {
13829
13826
  const { theme: contextTheme } = useTheme();
13830
13827
  const theme = themeProp ?? contextTheme;
13831
13828
  const themeClass = getThemeClass(theme, "timeline", "default");
13832
13829
  return /* @__PURE__ */ jsx32(
13833
13830
  "div",
13834
13831
  {
13832
+ ref,
13835
13833
  className: cn("relative pl-4", themeClass, className),
13834
+ style,
13836
13835
  role: "list",
13837
13836
  "aria-label": "Timeline",
13838
13837
  children: items.map((item, i) => /* @__PURE__ */ jsxs27(
@@ -13859,21 +13858,25 @@ function Timeline({
13859
13858
  ))
13860
13859
  }
13861
13860
  );
13862
- }
13861
+ });
13863
13862
 
13864
13863
  // components/Toast.tsx
13864
+ import { forwardRef as forwardRef32, useEffect as useEffect13 } from "react";
13865
13865
  import { jsx as jsx33, jsxs as jsxs28 } from "react/jsx-runtime";
13866
- function Toast({
13867
- message,
13868
- onDismiss,
13869
- className,
13870
- style
13871
- }) {
13866
+ var Toast = forwardRef32(function Toast2({ message, onDismiss, className, style }, ref) {
13872
13867
  const { theme } = useTheme();
13873
13868
  const themeClass = getThemeClass(theme, "toast", "default");
13869
+ useEffect13(() => {
13870
+ const handler = (e) => {
13871
+ if (e.key === "Escape") onDismiss();
13872
+ };
13873
+ document.addEventListener("keydown", handler);
13874
+ return () => document.removeEventListener("keydown", handler);
13875
+ }, [onDismiss]);
13874
13876
  return /* @__PURE__ */ jsxs28(
13875
13877
  "div",
13876
13878
  {
13879
+ ref,
13877
13880
  role: "alert",
13878
13881
  className: cn(
13879
13882
  "flex items-center justify-between gap-4 rounded-lg px-4 py-3 shadow-lg",
@@ -13896,11 +13899,11 @@ function Toast({
13896
13899
  ]
13897
13900
  }
13898
13901
  );
13899
- }
13902
+ });
13900
13903
 
13901
13904
  // components/Toggle.tsx
13902
13905
  import {
13903
- forwardRef as forwardRef12,
13906
+ forwardRef as forwardRef33,
13904
13907
  useCallback as useCallback15,
13905
13908
  useId as useId2,
13906
13909
  useState as useState12
@@ -13913,11 +13916,12 @@ var toggleVariants = cva(
13913
13916
  defaultVariants: {}
13914
13917
  }
13915
13918
  );
13916
- var Toggle = forwardRef12(function Toggle2({
13919
+ var Toggle = forwardRef33(function Toggle2({
13917
13920
  checked: controlledChecked,
13918
13921
  defaultChecked = false,
13919
13922
  onCheckedChange,
13920
13923
  className,
13924
+ style,
13921
13925
  "aria-label": ariaLabel = "Toggle",
13922
13926
  theme: themeProp,
13923
13927
  disabled,
@@ -13945,6 +13949,7 @@ var Toggle = forwardRef12(function Toggle2({
13945
13949
  {
13946
13950
  htmlFor: id3,
13947
13951
  className: cn(toggleVariants(), themeClass, className),
13952
+ style,
13948
13953
  "data-state": checked ? "on" : "off",
13949
13954
  children: [
13950
13955
  /* @__PURE__ */ jsx34(
@@ -13978,7 +13983,7 @@ var Toggle = forwardRef12(function Toggle2({
13978
13983
  });
13979
13984
 
13980
13985
  // components/Tooltip.tsx
13981
- import { useCallback as useCallback16, useState as useState13 } from "react";
13986
+ import { forwardRef as forwardRef34, useCallback as useCallback16, useId as useId3, useState as useState13 } from "react";
13982
13987
  import { jsx as jsx35, jsxs as jsxs30 } from "react/jsx-runtime";
13983
13988
  var placementClasses = {
13984
13989
  top: "bottom-full left-1/2 -translate-x-1/2 mb-2",
@@ -13990,15 +13995,9 @@ var tooltipVariants = cva(
13990
13995
  "absolute z-50 whitespace-nowrap rounded-lg px-2 py-1 text-xs shadow-lg",
13991
13996
  { variants: {}, defaultVariants: {} }
13992
13997
  );
13993
- function Tooltip({
13994
- content,
13995
- children,
13996
- placement = "top",
13997
- className,
13998
- style,
13999
- theme: themeProp
14000
- }) {
13998
+ var Tooltip = forwardRef34(function Tooltip2({ content, children, placement = "top", className, style, theme: themeProp }, ref) {
14001
13999
  const [visible, setVisible] = useState13(false);
14000
+ const tooltipId = useId3();
14002
14001
  const { theme: contextTheme } = useTheme();
14003
14002
  const theme = themeProp ?? contextTheme;
14004
14003
  const themeClass = getThemeClass(theme, "tooltip", "default");
@@ -14007,17 +14006,20 @@ function Tooltip({
14007
14006
  return /* @__PURE__ */ jsxs30(
14008
14007
  "span",
14009
14008
  {
14009
+ ref,
14010
14010
  className: cn("relative inline-block", className),
14011
14011
  style,
14012
14012
  onMouseEnter: show,
14013
14013
  onMouseLeave: hide,
14014
14014
  onFocus: show,
14015
14015
  onBlur: hide,
14016
+ "aria-describedby": visible ? tooltipId : void 0,
14016
14017
  children: [
14017
14018
  children,
14018
14019
  visible ? /* @__PURE__ */ jsx35(
14019
14020
  "span",
14020
14021
  {
14022
+ id: tooltipId,
14021
14023
  role: "tooltip",
14022
14024
  className: cn(
14023
14025
  tooltipVariants(),
@@ -14030,7 +14032,7 @@ function Tooltip({
14030
14032
  ]
14031
14033
  }
14032
14034
  );
14033
- }
14035
+ });
14034
14036
 
14035
14037
  // lib/theme-recommendations.ts
14036
14038
  var THEME_BACKGROUNDS = {
@@ -14161,6 +14163,7 @@ export {
14161
14163
  cn,
14162
14164
  getNextListIndex,
14163
14165
  getThemeClass,
14166
+ mergeRefs,
14164
14167
  useClickOutside,
14165
14168
  useFocusTrap,
14166
14169
  useKeyboardNavigation,