@campfire-interactive/ui 0.3.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/index.d.ts +153 -53
  2. package/dist/index.js +825 -658
  3. package/package.json +55 -55
package/dist/index.js CHANGED
@@ -97,16 +97,506 @@ function ButtonGroup({ align = "end", className, ...rest }) {
97
97
  return /* @__PURE__ */ jsx("div", { "data-align": align, className: cn("cfi-ui", "cfi-ui-btn-group", className), ...rest });
98
98
  }
99
99
 
100
+ // src/SplitButton.tsx
101
+ import { forwardRef as forwardRef3 } from "react";
102
+ import { ChevronDown } from "lucide-react";
103
+
104
+ // src/Menu.tsx
105
+ import { Fragment, forwardRef as forwardRef2 } from "react";
106
+ import * as RadixMenu from "@radix-ui/react-dropdown-menu";
107
+ import { Check } from "lucide-react";
108
+
109
+ // src/Floating.css
110
+ styleInject("@layer components {\n .cfi-ui-floating {\n z-index: var(--cfi-ui-z-popover);\n background: var(--cfi-ui-surface-raised);\n color: var(--cfi-ui-content);\n border: 1px solid var(--cfi-ui-border);\n border-radius: var(--cfi-ui-radius-md);\n box-shadow: var(--cfi-ui-shadow-lg);\n font-family: var(--cfi-ui-font);\n font-size: var(--cfi-ui-text-sm);\n animation: cfi-ui-zoom-in var(--cfi-ui-transition-fast);\n max-height: var(--radix-popper-available-height, none);\n overflow: hidden auto;\n }\n .cfi-ui-floating__arrow {\n fill: var(--cfi-ui-surface-raised);\n filter: drop-shadow(0 -1px 0 var(--cfi-ui-border));\n }\n .cfi-ui-popover {\n padding: var(--cfi-ui-space-md);\n min-width: 12rem;\n }\n .cfi-ui-popover[data-flush] {\n padding: 0;\n }\n .cfi-ui-menu {\n z-index: var(--cfi-ui-z-dropdown);\n min-width: 11rem;\n padding: var(--cfi-ui-space-xs);\n }\n .cfi-ui-menu__item {\n display: flex;\n align-items: center;\n gap: var(--cfi-ui-space-sm);\n padding: 0.375rem 0.5rem;\n border-radius: var(--cfi-ui-radius-sm);\n font-size: var(--cfi-ui-text-sm);\n line-height: var(--cfi-ui-leading-normal);\n color: var(--cfi-ui-content);\n cursor: pointer;\n user-select: none;\n outline: none;\n }\n .cfi-ui-menu__item[data-highlighted] {\n background: var(--cfi-ui-surface-active);\n }\n .cfi-ui-menu__item[data-disabled] {\n color: var(--cfi-ui-content-disabled);\n cursor: not-allowed;\n }\n .cfi-ui-menu__item[data-variant=danger] {\n color: var(--cfi-ui-error-text);\n }\n .cfi-ui-menu__item[data-variant=danger][data-highlighted] {\n background: var(--cfi-ui-error-soft);\n }\n .cfi-ui-menu__item > svg,\n .cfi-ui-menu__item .cfi-ui-menu__icon > svg {\n width: 0.875rem;\n height: 0.875rem;\n flex: none;\n }\n .cfi-ui-menu__icon {\n display: inline-flex;\n flex: none;\n color: var(--cfi-ui-content-muted);\n }\n .cfi-ui-menu__item[data-variant=danger] .cfi-ui-menu__icon {\n color: inherit;\n }\n .cfi-ui-menu__shortcut {\n margin-left: auto;\n padding-left: var(--cfi-ui-space-md);\n font-family: var(--cfi-ui-font-mono);\n font-size: var(--cfi-ui-text-xs);\n color: var(--cfi-ui-content-subtle);\n }\n .cfi-ui-menu__label {\n padding: 0.375rem 0.5rem 0.25rem;\n font-size: var(--cfi-ui-text-xs);\n font-weight: var(--cfi-ui-weight-semibold);\n letter-spacing: var(--cfi-ui-tracking-caps);\n text-transform: uppercase;\n color: var(--cfi-ui-content-muted);\n }\n .cfi-ui-menu__separator {\n height: 1px;\n margin: var(--cfi-ui-space-xs) calc(-1 * var(--cfi-ui-space-xs));\n background: var(--cfi-ui-border);\n }\n .cfi-ui-select-content {\n z-index: var(--cfi-ui-z-dropdown);\n padding: var(--cfi-ui-space-xs);\n min-width: var(--radix-select-trigger-width, 11rem);\n }\n .cfi-ui-select-viewport {\n max-height: min(18rem, var(--radix-select-content-available-height, 18rem));\n }\n .cfi-ui-select-item {\n display: flex;\n align-items: center;\n gap: var(--cfi-ui-space-sm);\n padding: 0.375rem 0.5rem;\n border-radius: var(--cfi-ui-radius-sm);\n font-size: var(--cfi-ui-text-sm);\n color: var(--cfi-ui-content);\n cursor: pointer;\n user-select: none;\n outline: none;\n }\n .cfi-ui-select-item[data-highlighted] {\n background: var(--cfi-ui-surface-active);\n }\n .cfi-ui-select-item[data-state=checked] {\n font-weight: var(--cfi-ui-weight-medium);\n }\n .cfi-ui-select-item[data-disabled] {\n color: var(--cfi-ui-content-disabled);\n cursor: not-allowed;\n }\n .cfi-ui-select-item__indicator {\n display: inline-flex;\n flex: none;\n width: 0.875rem;\n color: var(--cfi-ui-accent);\n }\n .cfi-ui-select-item__indicator > svg {\n width: 0.875rem;\n height: 0.875rem;\n }\n .cfi-ui-select-empty {\n padding: var(--cfi-ui-space-sm);\n font-size: var(--cfi-ui-text-sm);\n color: var(--cfi-ui-content-muted);\n text-align: center;\n }\n .cfi-ui-tooltip {\n z-index: var(--cfi-ui-z-tooltip);\n max-width: 20rem;\n padding: 0.3125rem 0.5rem;\n border-radius: var(--cfi-ui-radius-sm);\n background: var(--cfi-ui-content);\n color: var(--cfi-ui-surface);\n font-family: var(--cfi-ui-font);\n font-size: var(--cfi-ui-text-xs);\n line-height: var(--cfi-ui-leading-normal);\n box-shadow: var(--cfi-ui-shadow-md);\n animation: cfi-ui-zoom-in var(--cfi-ui-transition-fast);\n }\n .cfi-ui-tooltip__arrow {\n fill: var(--cfi-ui-content);\n }\n}\n");
111
+
112
+ // src/Menu.tsx
113
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
114
+ var MenuRoot = RadixMenu.Root;
115
+ var MenuTrigger = RadixMenu.Trigger;
116
+ var MenuGroup = RadixMenu.Group;
117
+ var MenuSub = RadixMenu.Sub;
118
+ var MenuRadioGroup = RadixMenu.RadioGroup;
119
+ var MenuContent = forwardRef2(function MenuContent2({ className, sideOffset = 4, collisionPadding = 8, ...rest }, ref) {
120
+ return /* @__PURE__ */ jsx2(RadixMenu.Portal, { children: /* @__PURE__ */ jsx2(
121
+ RadixMenu.Content,
122
+ {
123
+ ref,
124
+ sideOffset,
125
+ collisionPadding,
126
+ "data-cfi-ui-portal": "",
127
+ className: cn("cfi-ui", "cfi-ui-floating", "cfi-ui-menu", className),
128
+ ...rest
129
+ }
130
+ ) });
131
+ });
132
+ var MenuItem = forwardRef2(
133
+ function MenuItem2({ icon, shortcut, variant = "default", className, children, ...rest }, ref) {
134
+ return /* @__PURE__ */ jsxs2(
135
+ RadixMenu.Item,
136
+ {
137
+ ref,
138
+ "data-variant": variant,
139
+ className: cn("cfi-ui-menu__item", className),
140
+ ...rest,
141
+ children: [
142
+ icon && /* @__PURE__ */ jsx2("span", { className: "cfi-ui-menu__icon", children: icon }),
143
+ /* @__PURE__ */ jsx2("span", { children }),
144
+ shortcut && /* @__PURE__ */ jsx2("span", { className: "cfi-ui-menu__shortcut", children: shortcut })
145
+ ]
146
+ }
147
+ );
148
+ }
149
+ );
150
+ var MenuCheckboxItem = forwardRef2(function MenuCheckboxItem2({ className, children, ...rest }, ref) {
151
+ return /* @__PURE__ */ jsxs2(RadixMenu.CheckboxItem, { ref, className: cn("cfi-ui-menu__item", className), ...rest, children: [
152
+ /* @__PURE__ */ jsx2("span", { className: "cfi-ui-select-item__indicator", children: /* @__PURE__ */ jsx2(RadixMenu.ItemIndicator, { children: /* @__PURE__ */ jsx2(Check, {}) }) }),
153
+ /* @__PURE__ */ jsx2("span", { children })
154
+ ] });
155
+ });
156
+ var MenuRadioItem = forwardRef2(function MenuRadioItem2({ className, children, ...rest }, ref) {
157
+ return /* @__PURE__ */ jsxs2(RadixMenu.RadioItem, { ref, className: cn("cfi-ui-menu__item", className), ...rest, children: [
158
+ /* @__PURE__ */ jsx2("span", { className: "cfi-ui-select-item__indicator", children: /* @__PURE__ */ jsx2(RadixMenu.ItemIndicator, { children: /* @__PURE__ */ jsx2(Check, {}) }) }),
159
+ /* @__PURE__ */ jsx2("span", { children })
160
+ ] });
161
+ });
162
+ function MenuLabel({ className, ...rest }) {
163
+ return /* @__PURE__ */ jsx2(RadixMenu.Label, { className: cn("cfi-ui-menu__label", className), ...rest });
164
+ }
165
+ function MenuSeparator({
166
+ className,
167
+ ...rest
168
+ }) {
169
+ return /* @__PURE__ */ jsx2(RadixMenu.Separator, { className: cn("cfi-ui-menu__separator", className), ...rest });
170
+ }
171
+ var MenuSubTrigger = forwardRef2(function MenuSubTrigger2({ className, ...rest }, ref) {
172
+ return /* @__PURE__ */ jsx2(RadixMenu.SubTrigger, { ref, className: cn("cfi-ui-menu__item", className), ...rest });
173
+ });
174
+ var MenuSubContent = forwardRef2(function MenuSubContent2({ className, ...rest }, ref) {
175
+ return /* @__PURE__ */ jsx2(RadixMenu.Portal, { children: /* @__PURE__ */ jsx2(
176
+ RadixMenu.SubContent,
177
+ {
178
+ ref,
179
+ "data-cfi-ui-portal": "",
180
+ className: cn("cfi-ui", "cfi-ui-floating", "cfi-ui-menu", className),
181
+ ...rest
182
+ }
183
+ ) });
184
+ });
185
+ function Menu({ trigger, items, align = "end", side = "bottom", className }) {
186
+ return /* @__PURE__ */ jsxs2(MenuRoot, { children: [
187
+ /* @__PURE__ */ jsx2(MenuTrigger, { asChild: true, children: trigger }),
188
+ /* @__PURE__ */ jsx2(MenuContent, { align, side, className, children: items.map((item) => /* @__PURE__ */ jsxs2(Fragment, { children: [
189
+ item.separatorBefore && /* @__PURE__ */ jsx2(MenuSeparator, {}),
190
+ /* @__PURE__ */ jsx2(
191
+ MenuItem,
192
+ {
193
+ icon: item.icon,
194
+ shortcut: item.shortcut,
195
+ variant: item.variant,
196
+ disabled: item.disabled,
197
+ onSelect: item.onSelect,
198
+ children: item.label
199
+ }
200
+ )
201
+ ] }, item.id)) })
202
+ ] });
203
+ }
204
+
205
+ // src/SplitButton.css
206
+ styleInject("@layer components {\n :where(.cfi-ui-splitbutton) {\n display: inline-flex;\n align-items: stretch;\n gap: 0;\n }\n .cfi-ui-splitbutton__main {\n border-start-end-radius: 0;\n border-end-end-radius: 0;\n }\n .cfi-ui-splitbutton__toggle {\n border-start-start-radius: 0;\n border-end-start-radius: 0;\n padding-inline: var(--cfi-ui-space-xs);\n margin-inline-start: -1px;\n }\n .cfi-ui-splitbutton__toggle--only {\n border-radius: var(--cfi-ui-radius-md);\n margin-inline-start: 0;\n padding-inline: var(--cfi-ui-space-sm);\n gap: var(--cfi-ui-space-xs);\n }\n .cfi-ui-splitbutton__main:focus-visible,\n .cfi-ui-splitbutton__toggle:focus-visible {\n position: relative;\n z-index: 1;\n }\n .cfi-ui-splitbutton__main:hover,\n .cfi-ui-splitbutton__toggle:hover {\n position: relative;\n z-index: 1;\n }\n}\n");
207
+
208
+ // src/SplitButton.tsx
209
+ import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
210
+ var SplitButton = forwardRef3(function SplitButton2({ children, onClick, items, variant = "secondary", size = "md", menuLabel, align = "end", className, disabled, ...rest }, ref) {
211
+ if (items.length === 0) {
212
+ return /* @__PURE__ */ jsx3(
213
+ Button,
214
+ {
215
+ ref,
216
+ variant,
217
+ size,
218
+ onClick,
219
+ disabled,
220
+ className,
221
+ ...rest,
222
+ children
223
+ }
224
+ );
225
+ }
226
+ return /* @__PURE__ */ jsxs3("span", { className: cn("cfi-ui", "cfi-ui-splitbutton", className), "data-variant": variant, children: [
227
+ onClick && /* @__PURE__ */ jsx3(
228
+ Button,
229
+ {
230
+ ref,
231
+ variant,
232
+ size,
233
+ onClick,
234
+ disabled,
235
+ className: "cfi-ui-splitbutton__main",
236
+ ...rest,
237
+ children
238
+ }
239
+ ),
240
+ /* @__PURE__ */ jsx3(
241
+ Menu,
242
+ {
243
+ items,
244
+ align,
245
+ trigger: /* @__PURE__ */ jsxs3(
246
+ Button,
247
+ {
248
+ variant,
249
+ size,
250
+ disabled,
251
+ "aria-label": menuLabel,
252
+ title: menuLabel,
253
+ className: cn(
254
+ "cfi-ui-splitbutton__toggle",
255
+ !onClick && "cfi-ui-splitbutton__toggle--only"
256
+ ),
257
+ children: [
258
+ !onClick && children,
259
+ /* @__PURE__ */ jsx3(ChevronDown, { size: 14, "aria-hidden": "true" })
260
+ ]
261
+ }
262
+ )
263
+ }
264
+ )
265
+ ] });
266
+ });
267
+
268
+ // src/FilterBar.tsx
269
+ import { useMemo, useState } from "react";
270
+ import { ListFilter, X } from "lucide-react";
271
+
272
+ // src/Badge.tsx
273
+ import { forwardRef as forwardRef4 } from "react";
274
+
275
+ // src/Badge.css
276
+ styleInject("@layer components {\n :where(.cfi-ui-badge) {\n display: inline-flex;\n align-items: center;\n gap: var(--cfi-ui-space-xs);\n padding: 0.125rem 0.5rem;\n border: 1px solid transparent;\n border-radius: var(--cfi-ui-radius-full);\n font-size: var(--cfi-ui-text-xs);\n font-weight: var(--cfi-ui-weight-medium);\n line-height: 1.4;\n white-space: nowrap;\n vertical-align: middle;\n }\n .cfi-ui-badge[data-size=sm] {\n padding: 0 0.375rem;\n font-size: 0.6875rem;\n }\n .cfi-ui-badge__dot {\n flex: none;\n width: 0.375rem;\n height: 0.375rem;\n border-radius: var(--cfi-ui-radius-full);\n background: currentColor;\n }\n .cfi-ui-badge__icon {\n display: inline-flex;\n flex: none;\n }\n .cfi-ui-badge__icon > svg {\n width: 0.75rem;\n height: 0.75rem;\n display: block;\n }\n .cfi-ui-badge--count {\n justify-content: center;\n min-width: 1.25rem;\n padding-inline: 0.375rem;\n font-variant-numeric: tabular-nums;\n }\n .cfi-ui-badge[data-variant=soft][data-tone=neutral] {\n background: var(--cfi-ui-neutral-soft);\n color: var(--cfi-ui-neutral-text);\n }\n .cfi-ui-badge[data-variant=soft][data-tone=success] {\n background: var(--cfi-ui-success-soft);\n color: var(--cfi-ui-success-text);\n }\n .cfi-ui-badge[data-variant=soft][data-tone=warning] {\n background: var(--cfi-ui-warning-soft);\n color: var(--cfi-ui-warning-text);\n }\n .cfi-ui-badge[data-variant=soft][data-tone=error] {\n background: var(--cfi-ui-error-soft);\n color: var(--cfi-ui-error-text);\n }\n .cfi-ui-badge[data-variant=soft][data-tone=info] {\n background: var(--cfi-ui-info-soft);\n color: var(--cfi-ui-info-text);\n }\n .cfi-ui-badge[data-variant=soft][data-tone=accent] {\n background: var(--cfi-ui-accent-soft);\n color: var(--cfi-ui-accent-hover);\n }\n .cfi-ui-badge[data-variant=solid] {\n color: var(--cfi-ui-content-inverse);\n }\n .cfi-ui-badge[data-variant=solid][data-tone=neutral] {\n background: var(--cfi-ui-content-muted);\n }\n .cfi-ui-badge[data-variant=solid][data-tone=success] {\n background: var(--cfi-ui-success-text);\n }\n .cfi-ui-badge[data-variant=solid][data-tone=warning] {\n background: var(--cfi-ui-warning-text);\n }\n .cfi-ui-badge[data-variant=solid][data-tone=error] {\n background: var(--cfi-ui-error-text);\n }\n .cfi-ui-badge[data-variant=solid][data-tone=info] {\n background: var(--cfi-ui-info-text);\n }\n .cfi-ui-badge[data-variant=solid][data-tone=accent] {\n background: var(--cfi-ui-accent);\n color: var(--cfi-ui-accent-fg);\n }\n .cfi-ui-badge[data-variant=outline] {\n background: transparent;\n }\n .cfi-ui-badge[data-variant=outline][data-tone=neutral] {\n border-color: var(--cfi-ui-neutral-border);\n color: var(--cfi-ui-neutral-text);\n }\n .cfi-ui-badge[data-variant=outline][data-tone=success] {\n border-color: var(--cfi-ui-success-border);\n color: var(--cfi-ui-success-text);\n }\n .cfi-ui-badge[data-variant=outline][data-tone=warning] {\n border-color: var(--cfi-ui-warning-border);\n color: var(--cfi-ui-warning-text);\n }\n .cfi-ui-badge[data-variant=outline][data-tone=error] {\n border-color: var(--cfi-ui-error-border);\n color: var(--cfi-ui-error-text);\n }\n .cfi-ui-badge[data-variant=outline][data-tone=info] {\n border-color: var(--cfi-ui-info-border);\n color: var(--cfi-ui-info-text);\n }\n .cfi-ui-badge[data-variant=outline][data-tone=accent] {\n border-color: var(--cfi-ui-accent);\n color: var(--cfi-ui-accent-hover);\n }\n}\n");
277
+
278
+ // src/Badge.tsx
279
+ import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
280
+ var Badge = forwardRef4(function Badge2({ tone = "neutral", variant = "soft", size = "md", dot = false, icon, className, children, ...rest }, ref) {
281
+ return /* @__PURE__ */ jsxs4(
282
+ "span",
283
+ {
284
+ ref,
285
+ "data-tone": tone,
286
+ "data-variant": variant,
287
+ "data-size": size,
288
+ className: cn("cfi-ui", "cfi-ui-badge", className),
289
+ ...rest,
290
+ children: [
291
+ icon ? /* @__PURE__ */ jsx4("span", { className: "cfi-ui-badge__icon", children: icon }) : dot && /* @__PURE__ */ jsx4("span", { className: "cfi-ui-badge__dot", "aria-hidden": "true" }),
292
+ children
293
+ ]
294
+ }
295
+ );
296
+ });
297
+ var CountBadge = forwardRef4(function CountBadge2({ count, max = 99, hideZero = true, className, ...rest }, ref) {
298
+ if (count === 0 && hideZero) return null;
299
+ return /* @__PURE__ */ jsx4(Badge, { ref, className: cn("cfi-ui-badge--count", className), ...rest, children: count > max ? `${max}+` : count });
300
+ });
301
+
302
+ // src/Popover.tsx
303
+ import { forwardRef as forwardRef5 } from "react";
304
+ import * as RadixPopover from "@radix-ui/react-popover";
305
+ import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
306
+ var PopoverRoot = RadixPopover.Root;
307
+ var PopoverTrigger = RadixPopover.Trigger;
308
+ var PopoverAnchor = RadixPopover.Anchor;
309
+ var PopoverClose = RadixPopover.Close;
310
+ var PopoverContent = forwardRef5(function PopoverContent2({ showArrow = false, flush = false, className, children, sideOffset = 6, collisionPadding = 8, ...rest }, ref) {
311
+ return /* @__PURE__ */ jsx5(RadixPopover.Portal, { children: /* @__PURE__ */ jsxs5(
312
+ RadixPopover.Content,
313
+ {
314
+ ref,
315
+ sideOffset,
316
+ collisionPadding,
317
+ "data-cfi-ui-portal": "",
318
+ "data-flush": flush || void 0,
319
+ className: cn("cfi-ui", "cfi-ui-floating", "cfi-ui-popover", className),
320
+ ...rest,
321
+ children: [
322
+ children,
323
+ showArrow && /* @__PURE__ */ jsx5(RadixPopover.Arrow, { className: "cfi-ui-floating__arrow", width: 11, height: 5 })
324
+ ]
325
+ }
326
+ ) });
327
+ });
328
+ function Popover({ trigger, open, onOpenChange, defaultOpen, modal, children, ...content }) {
329
+ return /* @__PURE__ */ jsxs5(PopoverRoot, { open, onOpenChange, defaultOpen, modal, children: [
330
+ /* @__PURE__ */ jsx5(PopoverTrigger, { asChild: true, children: trigger }),
331
+ /* @__PURE__ */ jsx5(PopoverContent, { ...content, children })
332
+ ] });
333
+ }
334
+
335
+ // src/Select.tsx
336
+ import { forwardRef as forwardRef6 } from "react";
337
+ import * as RadixSelect from "@radix-ui/react-select";
338
+ import { Check as Check2, ChevronDown as ChevronDown2, ChevronUp } from "lucide-react";
339
+
340
+ // src/Select.css
341
+ styleInject("@layer components {\n :where(.cfi-ui-select) {\n display: inline-flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--cfi-ui-space-sm);\n height: var(--cfi-ui-control-height-md);\n padding-inline: 0.625rem;\n background: var(--cfi-ui-surface);\n color: var(--cfi-ui-content);\n border: 1px solid var(--cfi-ui-border-strong);\n border-radius: var(--cfi-ui-radius-md);\n font-family: inherit;\n font-size: var(--cfi-ui-text-sm);\n line-height: normal;\n cursor: pointer;\n transition: border-color var(--cfi-ui-transition-fast);\n }\n .cfi-ui-select--full {\n width: 100%;\n }\n .cfi-ui-select:hover:not(:disabled) {\n border-color: var(--cfi-ui-content-subtle);\n }\n .cfi-ui-select:disabled {\n background: var(--cfi-ui-surface-disabled);\n color: var(--cfi-ui-content-disabled);\n cursor: not-allowed;\n }\n .cfi-ui-select[data-invalid] {\n border-color: var(--cfi-ui-error);\n }\n .cfi-ui-select[data-size=sm] {\n height: var(--cfi-ui-control-height-sm);\n padding-inline: 0.5rem;\n font-size: var(--cfi-ui-text-xs);\n }\n .cfi-ui-select[data-size=lg] {\n height: var(--cfi-ui-control-height-lg);\n padding-inline: 0.875rem;\n font-size: var(--cfi-ui-text-base);\n }\n .cfi-ui-select[data-placeholder] .cfi-ui-select__value {\n color: var(--cfi-ui-content-muted);\n }\n .cfi-ui-select__value {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-align: left;\n }\n .cfi-ui-select__chevron {\n display: inline-flex;\n flex: none;\n color: var(--cfi-ui-content-muted);\n }\n .cfi-ui-select__chevron > svg {\n width: 0.875rem;\n height: 0.875rem;\n display: block;\n }\n .cfi-ui-select-scroll {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 1.25rem;\n color: var(--cfi-ui-content-muted);\n cursor: default;\n }\n .cfi-ui-select-scroll > svg {\n width: 0.875rem;\n height: 0.875rem;\n }\n}\n");
342
+
343
+ // src/Select.tsx
344
+ import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
345
+ var SelectRoot = RadixSelect.Root;
346
+ var SelectValue = RadixSelect.Value;
347
+ var SelectGroup = RadixSelect.Group;
348
+ var SelectTrigger = forwardRef6(
349
+ function SelectTrigger2({ size = "md", invalid, className, children, ...rest }, ref) {
350
+ return /* @__PURE__ */ jsxs6(
351
+ RadixSelect.Trigger,
352
+ {
353
+ ref,
354
+ "data-size": size,
355
+ "data-invalid": invalid || void 0,
356
+ "aria-invalid": invalid || void 0,
357
+ className: cn("cfi-ui", "cfi-ui-select", className),
358
+ ...rest,
359
+ children: [
360
+ /* @__PURE__ */ jsx6("span", { className: "cfi-ui-select__value", children }),
361
+ /* @__PURE__ */ jsx6(RadixSelect.Icon, { className: "cfi-ui-select__chevron", children: /* @__PURE__ */ jsx6(ChevronDown2, {}) })
362
+ ]
363
+ }
364
+ );
365
+ }
366
+ );
367
+ var SelectContent = forwardRef6(function SelectContent2({ className, children, position = "popper", sideOffset = 4, ...rest }, ref) {
368
+ return /* @__PURE__ */ jsx6(RadixSelect.Portal, { children: /* @__PURE__ */ jsxs6(
369
+ RadixSelect.Content,
370
+ {
371
+ ref,
372
+ position,
373
+ sideOffset,
374
+ "data-cfi-ui-portal": "",
375
+ className: cn("cfi-ui", "cfi-ui-floating", "cfi-ui-select-content", className),
376
+ ...rest,
377
+ children: [
378
+ /* @__PURE__ */ jsx6(RadixSelect.ScrollUpButton, { className: "cfi-ui-select-scroll", children: /* @__PURE__ */ jsx6(ChevronUp, {}) }),
379
+ /* @__PURE__ */ jsx6(RadixSelect.Viewport, { className: "cfi-ui-select-viewport", children }),
380
+ /* @__PURE__ */ jsx6(RadixSelect.ScrollDownButton, { className: "cfi-ui-select-scroll", children: /* @__PURE__ */ jsx6(ChevronDown2, {}) })
381
+ ]
382
+ }
383
+ ) });
384
+ });
385
+ var SelectItem = forwardRef6(function SelectItem2({ className, children, ...rest }, ref) {
386
+ return /* @__PURE__ */ jsxs6(RadixSelect.Item, { ref, className: cn("cfi-ui-select-item", className), ...rest, children: [
387
+ /* @__PURE__ */ jsx6("span", { className: "cfi-ui-select-item__indicator", children: /* @__PURE__ */ jsx6(RadixSelect.ItemIndicator, { children: /* @__PURE__ */ jsx6(Check2, {}) }) }),
388
+ /* @__PURE__ */ jsx6(RadixSelect.ItemText, { children })
389
+ ] });
390
+ });
391
+ function SelectLabel({ className, ...rest }) {
392
+ return /* @__PURE__ */ jsx6(RadixSelect.Label, { className: cn("cfi-ui-menu__label", className), ...rest });
393
+ }
394
+ function SelectSeparator({
395
+ className,
396
+ ...rest
397
+ }) {
398
+ return /* @__PURE__ */ jsx6(RadixSelect.Separator, { className: cn("cfi-ui-menu__separator", className), ...rest });
399
+ }
400
+ function Select({
401
+ options,
402
+ value,
403
+ onValueChange,
404
+ defaultValue,
405
+ placeholder = "Select...",
406
+ size = "md",
407
+ invalid,
408
+ disabled,
409
+ required,
410
+ name,
411
+ id,
412
+ className,
413
+ fullWidth = true,
414
+ emptyLabel = "No options",
415
+ onOpenChange,
416
+ onBlur,
417
+ ...aria
418
+ }) {
419
+ const groups = [];
420
+ for (const option of options) {
421
+ const existing = groups.find((g) => g.name === option.group);
422
+ if (existing) existing.options.push(option);
423
+ else groups.push({ name: option.group, options: [option] });
424
+ }
425
+ return /* @__PURE__ */ jsxs6(
426
+ SelectRoot,
427
+ {
428
+ value,
429
+ onValueChange,
430
+ defaultValue,
431
+ disabled,
432
+ required,
433
+ name,
434
+ onOpenChange,
435
+ children: [
436
+ /* @__PURE__ */ jsx6(
437
+ SelectTrigger,
438
+ {
439
+ id,
440
+ size,
441
+ invalid,
442
+ className: cn(fullWidth && "cfi-ui-select--full", className),
443
+ onBlur,
444
+ ...aria,
445
+ children: /* @__PURE__ */ jsx6(SelectValue, { placeholder })
446
+ }
447
+ ),
448
+ /* @__PURE__ */ jsxs6(SelectContent, { children: [
449
+ groups.map(
450
+ (group, i) => group.name ? /* @__PURE__ */ jsxs6(SelectGroup, { children: [
451
+ i > 0 && /* @__PURE__ */ jsx6(SelectSeparator, {}),
452
+ /* @__PURE__ */ jsx6(SelectLabel, { children: group.name }),
453
+ group.options.map((o) => /* @__PURE__ */ jsx6(SelectItem, { value: o.value, disabled: o.disabled, children: o.label }, o.value))
454
+ ] }, group.name) : group.options.map((o) => /* @__PURE__ */ jsx6(SelectItem, { value: o.value, disabled: o.disabled, children: o.label }, o.value))
455
+ ),
456
+ options.length === 0 && /* @__PURE__ */ jsx6("p", { className: "cfi-ui-select-empty", children: emptyLabel })
457
+ ] })
458
+ ]
459
+ }
460
+ );
461
+ }
462
+
463
+ // src/Switch.tsx
464
+ import { forwardRef as forwardRef7 } from "react";
465
+ import * as RadixSwitch from "@radix-ui/react-switch";
466
+
467
+ // src/Switch.css
468
+ styleInject("@layer components {\n .cfi-ui-switch {\n flex: none;\n position: relative;\n display: inline-flex;\n align-items: center;\n width: 2rem;\n height: 1.125rem;\n padding: 0;\n border: 1px solid transparent;\n border-radius: var(--cfi-ui-radius-full);\n background: var(--cfi-ui-switch-bg);\n cursor: pointer;\n transition: background-color var(--cfi-ui-transition-base);\n }\n .cfi-ui-switch[data-state=checked] {\n background: var(--cfi-ui-accent);\n }\n .cfi-ui-switch:disabled {\n cursor: not-allowed;\n opacity: 0.55;\n }\n .cfi-ui-switch__thumb {\n display: block;\n width: 0.875rem;\n height: 0.875rem;\n border-radius: var(--cfi-ui-radius-full);\n background: #ffffff;\n box-shadow: var(--cfi-ui-shadow-sm);\n transform: translateX(0.125rem);\n transition: transform var(--cfi-ui-transition-base);\n will-change: transform;\n }\n .cfi-ui-switch__thumb[data-state=checked] {\n transform: translateX(1rem);\n }\n .cfi-ui-switch-row {\n display: flex;\n align-items: center;\n gap: var(--cfi-ui-space-md);\n }\n .cfi-ui-switch-row[data-label-position=end] .cfi-ui-switch-row__text {\n flex: 1 1 auto;\n }\n .cfi-ui-switch-row__text {\n display: grid;\n gap: var(--cfi-ui-space-3xs);\n min-width: 0;\n }\n .cfi-ui-switch-row__label {\n font-size: var(--cfi-ui-text-sm);\n font-weight: var(--cfi-ui-weight-medium);\n line-height: var(--cfi-ui-leading-normal);\n color: var(--cfi-ui-content);\n cursor: pointer;\n }\n .cfi-ui-switch-row__description {\n font-size: var(--cfi-ui-text-xs);\n line-height: var(--cfi-ui-leading-normal);\n color: var(--cfi-ui-content-muted);\n }\n}\n");
469
+
470
+ // src/Switch.tsx
471
+ import { jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
472
+ var Switch = forwardRef7(
473
+ function Switch2({ label, description, labelPosition = "end", className, id, ...rest }, ref) {
474
+ const control = /* @__PURE__ */ jsx7(
475
+ RadixSwitch.Root,
476
+ {
477
+ ref,
478
+ id,
479
+ className: cn("cfi-ui", "cfi-ui-switch", !label && className),
480
+ ...rest,
481
+ children: /* @__PURE__ */ jsx7(RadixSwitch.Thumb, { className: "cfi-ui-switch__thumb" })
482
+ }
483
+ );
484
+ if (!label) return control;
485
+ return /* @__PURE__ */ jsxs7("div", { "data-label-position": labelPosition, className: cn("cfi-ui", "cfi-ui-switch-row", className), children: [
486
+ labelPosition === "start" && control,
487
+ /* @__PURE__ */ jsxs7("div", { className: "cfi-ui-switch-row__text", children: [
488
+ /* @__PURE__ */ jsx7("label", { htmlFor: id, className: "cfi-ui-switch-row__label", children: label }),
489
+ description && /* @__PURE__ */ jsx7("span", { className: "cfi-ui-switch-row__description", children: description })
490
+ ] }),
491
+ labelPosition === "end" && control
492
+ ] });
493
+ }
494
+ );
495
+
496
+ // src/FilterBar.css
497
+ styleInject('@layer components {\n :where(.cfi-ui-filterbar) {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--cfi-ui-space-xs);\n min-width: 0;\n }\n .cfi-ui-filterbar__panel {\n display: flex;\n flex-direction: column;\n gap: var(--cfi-ui-space-sm);\n min-width: 15rem;\n }\n .cfi-ui-filterbar__field {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n .cfi-ui-filterbar__field-label {\n font-size: var(--cfi-ui-text-xs);\n color: var(--cfi-ui-content-muted);\n }\n .cfi-ui-filterbar__toggle {\n padding-block: 0.125rem;\n }\n .cfi-ui-filterbar__chip {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.125rem 0.25rem 0.125rem 0.5rem;\n border: 1px solid var(--cfi-ui-border);\n border-radius: var(--cfi-ui-radius-full);\n background: var(--cfi-ui-surface);\n font-size: var(--cfi-ui-text-xs);\n white-space: nowrap;\n }\n .cfi-ui-filterbar__chip-name {\n color: var(--cfi-ui-content-muted);\n }\n .cfi-ui-filterbar__chip-name::after {\n content: ":";\n }\n .cfi-ui-filterbar__chip-x {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1rem;\n height: 1rem;\n border: 0;\n border-radius: var(--cfi-ui-radius-full);\n background: none;\n color: var(--cfi-ui-content-muted);\n cursor: pointer;\n }\n .cfi-ui-filterbar__chip-x:hover {\n background: var(--cfi-ui-surface-hover);\n color: var(--cfi-ui-content);\n }\n}\n');
498
+
499
+ // src/FilterBar.tsx
500
+ import { jsx as jsx8, jsxs as jsxs8 } from "react/jsx-runtime";
501
+ function FilterBar({
502
+ selects = [],
503
+ toggles = [],
504
+ value,
505
+ onChange,
506
+ label = "Filters",
507
+ anyLabel = "Any",
508
+ clearLabel = "Clear filters",
509
+ removeLabel = (name) => `Remove the ${name} filter`,
510
+ className
511
+ }) {
512
+ const [open, setOpen] = useState(false);
513
+ const applied = useMemo(() => {
514
+ const out = [];
515
+ for (const s of selects) {
516
+ const v = value[s.id];
517
+ if (typeof v !== "string" || v === "") continue;
518
+ const opt = s.options.find((o) => o.value === v);
519
+ out.push({ id: s.id, name: s.label, display: opt ? opt.label : v });
520
+ }
521
+ for (const tg of toggles) {
522
+ if (value[tg.id] === true) out.push({ id: tg.id, name: tg.label, display: tg.label });
523
+ }
524
+ return out;
525
+ }, [selects, toggles, value]);
526
+ const set = (id, next) => onChange({ ...value, [id]: next });
527
+ const clearAll = () => {
528
+ const next = { ...value };
529
+ for (const s of selects) delete next[s.id];
530
+ for (const tg of toggles) delete next[tg.id];
531
+ onChange(next);
532
+ };
533
+ return /* @__PURE__ */ jsxs8("div", { className: cn("cfi-ui", "cfi-ui-filterbar", className), children: [
534
+ /* @__PURE__ */ jsx8(
535
+ Popover,
536
+ {
537
+ open,
538
+ onOpenChange: setOpen,
539
+ align: "start",
540
+ trigger: /* @__PURE__ */ jsxs8(Button, { leadingIcon: /* @__PURE__ */ jsx8(ListFilter, { size: 14 }), "aria-expanded": open, children: [
541
+ label,
542
+ applied.length > 0 && /* @__PURE__ */ jsx8(CountBadge, { count: applied.length, size: "sm" })
543
+ ] }),
544
+ children: /* @__PURE__ */ jsxs8("div", { className: "cfi-ui-filterbar__panel", children: [
545
+ selects.map((s) => /* @__PURE__ */ jsxs8("label", { className: "cfi-ui-filterbar__field", children: [
546
+ /* @__PURE__ */ jsx8("span", { className: "cfi-ui-filterbar__field-label", children: s.label }),
547
+ /* @__PURE__ */ jsx8(
548
+ Select,
549
+ {
550
+ size: "sm",
551
+ fullWidth: true,
552
+ "aria-label": s.label,
553
+ value: typeof value[s.id] === "string" ? value[s.id] : void 0,
554
+ placeholder: s.placeholder ?? anyLabel,
555
+ options: s.options,
556
+ onValueChange: (v) => set(s.id, v)
557
+ }
558
+ )
559
+ ] }, s.id)),
560
+ toggles.map((tg) => /* @__PURE__ */ jsx8("div", { className: "cfi-ui-filterbar__toggle", children: /* @__PURE__ */ jsx8(
561
+ Switch,
562
+ {
563
+ checked: value[tg.id] === true,
564
+ onCheckedChange: (on) => set(tg.id, on || void 0),
565
+ label: tg.label,
566
+ description: tg.hint
567
+ }
568
+ ) }, tg.id)),
569
+ applied.length > 0 && /* @__PURE__ */ jsx8(Button, { variant: "ghost", size: "sm", onClick: clearAll, children: clearLabel })
570
+ ] })
571
+ }
572
+ ),
573
+ applied.map((a) => /* @__PURE__ */ jsxs8("span", { className: "cfi-ui-filterbar__chip", children: [
574
+ /* @__PURE__ */ jsx8("span", { className: "cfi-ui-filterbar__chip-name", children: a.name }),
575
+ a.display,
576
+ /* @__PURE__ */ jsx8(
577
+ "button",
578
+ {
579
+ type: "button",
580
+ className: "cfi-ui-filterbar__chip-x",
581
+ "aria-label": removeLabel(a.name),
582
+ onClick: () => set(a.id, void 0),
583
+ children: /* @__PURE__ */ jsx8(X, { size: 12, "aria-hidden": "true" })
584
+ }
585
+ )
586
+ ] }, a.id))
587
+ ] });
588
+ }
589
+
100
590
  // src/Input.tsx
101
- import { forwardRef as forwardRef2 } from "react";
591
+ import { forwardRef as forwardRef8 } from "react";
102
592
 
103
593
  // src/Input.css
104
594
  styleInject("@layer components {\n :where(.cfi-ui-input, .cfi-ui-textarea) {\n display: block;\n width: 100%;\n min-width: 0;\n background: var(--cfi-ui-surface);\n color: var(--cfi-ui-content);\n border: 1px solid var(--cfi-ui-border-strong);\n border-radius: var(--cfi-ui-radius-md);\n font-family: inherit;\n font-size: var(--cfi-ui-text-sm);\n transition: border-color var(--cfi-ui-transition-fast), background-color var(--cfi-ui-transition-fast);\n }\n .cfi-ui-input {\n height: var(--cfi-ui-control-height-md);\n padding-inline: 0.625rem;\n }\n .cfi-ui-textarea {\n padding: 0.5rem 0.625rem;\n line-height: var(--cfi-ui-leading-normal);\n resize: vertical;\n min-height: calc(var(--cfi-ui-control-height-md) * 1.5);\n }\n .cfi-ui-input[data-size=sm] {\n height: var(--cfi-ui-control-height-sm);\n padding-inline: 0.5rem;\n font-size: var(--cfi-ui-text-xs);\n }\n .cfi-ui-input[data-size=lg] {\n height: var(--cfi-ui-control-height-lg);\n padding-inline: 0.875rem;\n font-size: var(--cfi-ui-text-base);\n }\n .cfi-ui-input::placeholder,\n .cfi-ui-textarea::placeholder {\n color: var(--cfi-ui-content-muted);\n }\n .cfi-ui-input:hover:not(:disabled),\n .cfi-ui-textarea:hover:not(:disabled) {\n border-color: var(--cfi-ui-content-subtle);\n }\n .cfi-ui-input:disabled,\n .cfi-ui-textarea:disabled {\n background: var(--cfi-ui-surface-disabled);\n color: var(--cfi-ui-content-disabled);\n cursor: not-allowed;\n }\n .cfi-ui-input:read-only:not(:disabled),\n .cfi-ui-textarea:read-only:not(:disabled) {\n background: var(--cfi-ui-surface-sunken);\n border-color: var(--cfi-ui-border);\n }\n .cfi-ui-input[data-invalid],\n .cfi-ui-textarea[data-invalid] {\n border-color: var(--cfi-ui-error);\n }\n .cfi-ui-input[type=number],\n .cfi-ui-input[inputmode=decimal],\n .cfi-ui-input[inputmode=numeric] {\n font-variant-numeric: tabular-nums;\n text-align: right;\n }\n .cfi-ui-input[type=number]::-webkit-outer-spin-button,\n .cfi-ui-input[type=number]::-webkit-inner-spin-button {\n appearance: none;\n margin: 0;\n }\n .cfi-ui-input[type=number] {\n appearance: textfield;\n }\n :where(.cfi-ui-input-wrap) {\n display: flex;\n align-items: center;\n width: 100%;\n background: var(--cfi-ui-surface);\n border: 1px solid var(--cfi-ui-border-strong);\n border-radius: var(--cfi-ui-radius-md);\n transition: border-color var(--cfi-ui-transition-fast);\n }\n .cfi-ui-input-wrap:hover:not([data-disabled]) {\n border-color: var(--cfi-ui-content-subtle);\n }\n .cfi-ui-input-wrap:focus-within {\n outline: var(--cfi-ui-focus-width) solid var(--cfi-ui-focus-color);\n outline-offset: var(--cfi-ui-focus-offset);\n }\n .cfi-ui-input-wrap[data-invalid] {\n border-color: var(--cfi-ui-error);\n }\n .cfi-ui-input-wrap[data-disabled] {\n background: var(--cfi-ui-surface-disabled);\n }\n .cfi-ui-input-wrap > .cfi-ui-input {\n border: 0;\n background: transparent;\n border-radius: 0;\n flex: 1 1 auto;\n }\n .cfi-ui-input-wrap > .cfi-ui-input:focus-visible {\n outline: none;\n }\n .cfi-ui-input-wrap__affix {\n display: inline-flex;\n align-items: center;\n flex: none;\n padding-inline: 0.625rem;\n color: var(--cfi-ui-content-muted);\n font-size: var(--cfi-ui-text-sm);\n white-space: nowrap;\n }\n .cfi-ui-input-wrap__affix > svg {\n width: 1em;\n height: 1em;\n display: block;\n }\n .cfi-ui-input-wrap__affix:first-child {\n padding-right: 0;\n }\n .cfi-ui-input-wrap__affix:last-child {\n padding-left: 0;\n }\n .cfi-ui-input-wrap[data-size=sm] {\n font-size: var(--cfi-ui-text-xs);\n }\n .cfi-ui-input-wrap[data-size=sm] > .cfi-ui-input {\n height: var(--cfi-ui-control-height-sm);\n }\n .cfi-ui-input-wrap[data-size=lg] > .cfi-ui-input {\n height: var(--cfi-ui-control-height-lg);\n }\n}\n");
105
595
 
106
596
  // src/Input.tsx
107
- import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
108
- var Input = forwardRef2(function Input2({ size = "md", invalid, prefix, suffix, className, disabled, ...rest }, ref) {
109
- const field = /* @__PURE__ */ jsx2(
597
+ import { jsx as jsx9, jsxs as jsxs9 } from "react/jsx-runtime";
598
+ var Input = forwardRef8(function Input2({ size = "md", invalid, prefix, suffix, className, disabled, ...rest }, ref) {
599
+ const field = /* @__PURE__ */ jsx9(
110
600
  "input",
111
601
  {
112
602
  ref,
@@ -119,7 +609,7 @@ var Input = forwardRef2(function Input2({ size = "md", invalid, prefix, suffix,
119
609
  }
120
610
  );
121
611
  if (!prefix && !suffix) return field;
122
- return /* @__PURE__ */ jsxs2(
612
+ return /* @__PURE__ */ jsxs9(
123
613
  "div",
124
614
  {
125
615
  "data-size": size,
@@ -127,15 +617,15 @@ var Input = forwardRef2(function Input2({ size = "md", invalid, prefix, suffix,
127
617
  "data-disabled": disabled || void 0,
128
618
  className: cn("cfi-ui", "cfi-ui-input-wrap"),
129
619
  children: [
130
- prefix && /* @__PURE__ */ jsx2("span", { className: "cfi-ui-input-wrap__affix", children: prefix }),
620
+ prefix && /* @__PURE__ */ jsx9("span", { className: "cfi-ui-input-wrap__affix", children: prefix }),
131
621
  field,
132
- suffix && /* @__PURE__ */ jsx2("span", { className: "cfi-ui-input-wrap__affix", children: suffix })
622
+ suffix && /* @__PURE__ */ jsx9("span", { className: "cfi-ui-input-wrap__affix", children: suffix })
133
623
  ]
134
624
  }
135
625
  );
136
626
  });
137
- var Textarea = forwardRef2(function Textarea2({ invalid, className, rows = 3, ...rest }, ref) {
138
- return /* @__PURE__ */ jsx2(
627
+ var Textarea = forwardRef8(function Textarea2({ invalid, className, rows = 3, ...rest }, ref) {
628
+ return /* @__PURE__ */ jsx9(
139
629
  "textarea",
140
630
  {
141
631
  ref,
@@ -155,11 +645,11 @@ import { Children, cloneElement, createContext, isValidElement, useContext, useI
155
645
  styleInject('@layer components {\n .cfi-ui-label {\n display: inline-flex;\n align-items: center;\n gap: var(--cfi-ui-space-3xs);\n font-size: var(--cfi-ui-text-sm);\n font-weight: var(--cfi-ui-weight-medium);\n color: var(--cfi-ui-content);\n line-height: var(--cfi-ui-leading-normal);\n }\n .cfi-ui-label__required {\n color: var(--cfi-ui-error);\n font-weight: var(--cfi-ui-weight-semibold);\n }\n .cfi-ui-field {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: var(--cfi-ui-space-xs);\n }\n .cfi-ui-field__label {\n justify-self: start;\n }\n .cfi-ui-field__body {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: var(--cfi-ui-space-xs);\n min-width: 0;\n }\n .cfi-ui-field__hint,\n .cfi-ui-field__error {\n margin: 0;\n font-size: var(--cfi-ui-text-xs);\n line-height: var(--cfi-ui-leading-normal);\n }\n .cfi-ui-field__hint {\n color: var(--cfi-ui-content-muted);\n }\n .cfi-ui-field__error {\n color: var(--cfi-ui-error-text);\n font-weight: var(--cfi-ui-weight-medium);\n }\n .cfi-ui-field[data-orientation=horizontal] {\n grid-template-columns: minmax(8rem, 12rem) 1fr;\n align-items: start;\n gap: var(--cfi-ui-space-md);\n }\n .cfi-ui-field[data-orientation=horizontal] .cfi-ui-field__label {\n padding-top: 0.4375rem;\n }\n @media (max-width: 640px) {\n .cfi-ui-field[data-orientation=horizontal] {\n grid-template-columns: 1fr;\n gap: var(--cfi-ui-space-xs);\n }\n .cfi-ui-field[data-orientation=horizontal] .cfi-ui-field__label {\n padding-top: 0;\n }\n }\n .cfi-ui-fieldset {\n min-width: 0;\n margin: 0;\n padding: 0;\n border: 0;\n }\n .cfi-ui-fieldset__legend {\n padding: 0 0 var(--cfi-ui-space-sm);\n font-size: var(--cfi-ui-text-xs);\n font-weight: var(--cfi-ui-weight-semibold);\n letter-spacing: var(--cfi-ui-tracking-caps);\n text-transform: uppercase;\n color: var(--cfi-ui-content-muted);\n }\n .cfi-ui-fieldset__body {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: var(--cfi-ui-space-md);\n }\n .cfi-ui-fieldset[data-columns="2"] .cfi-ui-fieldset__body {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n .cfi-ui-fieldset[data-columns="3"] .cfi-ui-fieldset__body {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n @media (max-width: 720px) {\n .cfi-ui-fieldset[data-columns="2"] .cfi-ui-fieldset__body,\n .cfi-ui-fieldset[data-columns="3"] .cfi-ui-fieldset__body {\n grid-template-columns: 1fr;\n }\n }\n}\n');
156
646
 
157
647
  // src/Field.tsx
158
- import { Fragment, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
159
- function Label({ required, className, children, ...rest }) {
160
- return /* @__PURE__ */ jsxs3("label", { className: cn("cfi-ui", "cfi-ui-label", className), ...rest, children: [
648
+ import { Fragment as Fragment2, jsx as jsx10, jsxs as jsxs10 } from "react/jsx-runtime";
649
+ function Label3({ required, className, children, ...rest }) {
650
+ return /* @__PURE__ */ jsxs10("label", { className: cn("cfi-ui", "cfi-ui-label", className), ...rest, children: [
161
651
  children,
162
- required && /* @__PURE__ */ jsx3("span", { className: "cfi-ui-label__required", "aria-hidden": "true", children: "*" })
652
+ required && /* @__PURE__ */ jsx10("span", { className: "cfi-ui-label__required", "aria-hidden": "true", children: "*" })
163
653
  ] });
164
654
  }
165
655
  var FieldContext = createContext(null);
@@ -182,19 +672,19 @@ function Field({
182
672
  const errorId = `${controlId}-error`;
183
673
  const invalid = error != null && error !== false && error !== "";
184
674
  const describedBy = invalid ? errorId : hint ? hintId : void 0;
185
- return /* @__PURE__ */ jsx3(FieldContext.Provider, { value: { controlId, describedBy, invalid, required }, children: /* @__PURE__ */ jsxs3("div", { "data-orientation": orientation, className: cn("cfi-ui", "cfi-ui-field", className), children: [
186
- /* @__PURE__ */ jsx3(Label, { htmlFor: controlId, required, className: "cfi-ui-field__label", children: label }),
187
- /* @__PURE__ */ jsxs3("div", { className: "cfi-ui-field__body", children: [
188
- /* @__PURE__ */ jsx3(FieldControl, { children }),
189
- invalid ? /* @__PURE__ */ jsx3("p", { id: errorId, className: "cfi-ui-field__error", role: "alert", children: error }) : hint && /* @__PURE__ */ jsx3("p", { id: hintId, className: "cfi-ui-field__hint", children: hint })
675
+ return /* @__PURE__ */ jsx10(FieldContext.Provider, { value: { controlId, describedBy, invalid, required }, children: /* @__PURE__ */ jsxs10("div", { "data-orientation": orientation, className: cn("cfi-ui", "cfi-ui-field", className), children: [
676
+ /* @__PURE__ */ jsx10(Label3, { htmlFor: controlId, required, className: "cfi-ui-field__label", children: label }),
677
+ /* @__PURE__ */ jsxs10("div", { className: "cfi-ui-field__body", children: [
678
+ /* @__PURE__ */ jsx10(FieldControl, { children }),
679
+ invalid ? /* @__PURE__ */ jsx10("p", { id: errorId, className: "cfi-ui-field__error", role: "alert", children: error }) : hint && /* @__PURE__ */ jsx10("p", { id: hintId, className: "cfi-ui-field__hint", children: hint })
190
680
  ] })
191
681
  ] }) });
192
682
  }
193
683
  function FieldControl({ children }) {
194
684
  const ctx = useContext(FieldContext);
195
- if (!ctx) return /* @__PURE__ */ jsx3(Fragment, { children });
685
+ if (!ctx) return /* @__PURE__ */ jsx10(Fragment2, { children });
196
686
  const only = Children.count(children) === 1 ? Children.toArray(children)[0] : null;
197
- if (!only || !isValidElement(only)) return /* @__PURE__ */ jsx3(Fragment, { children });
687
+ if (!only || !isValidElement(only)) return /* @__PURE__ */ jsx10(Fragment2, { children });
198
688
  const props = only.props;
199
689
  return cloneElement(only, {
200
690
  id: props.id ?? ctx.controlId,
@@ -207,25 +697,25 @@ function FieldControl({ children }) {
207
697
  });
208
698
  }
209
699
  function Fieldset({ legend, columns = 1, className, children, ...rest }) {
210
- return /* @__PURE__ */ jsxs3("fieldset", { "data-columns": columns, className: cn("cfi-ui", "cfi-ui-fieldset", className), ...rest, children: [
211
- /* @__PURE__ */ jsx3("legend", { className: "cfi-ui-fieldset__legend", children: legend }),
212
- /* @__PURE__ */ jsx3("div", { className: "cfi-ui-fieldset__body", children })
700
+ return /* @__PURE__ */ jsxs10("fieldset", { "data-columns": columns, className: cn("cfi-ui", "cfi-ui-fieldset", className), ...rest, children: [
701
+ /* @__PURE__ */ jsx10("legend", { className: "cfi-ui-fieldset__legend", children: legend }),
702
+ /* @__PURE__ */ jsx10("div", { className: "cfi-ui-fieldset__body", children })
213
703
  ] });
214
704
  }
215
705
 
216
706
  // src/Checkbox.tsx
217
- import { forwardRef as forwardRef3 } from "react";
707
+ import { forwardRef as forwardRef9 } from "react";
218
708
  import * as RadixCheckbox from "@radix-ui/react-checkbox";
219
- import { Check, Minus } from "lucide-react";
709
+ import { Check as Check3, Minus } from "lucide-react";
220
710
 
221
711
  // src/Checkbox.css
222
712
  styleInject("@layer components {\n .cfi-ui-checkbox {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1rem;\n height: 1rem;\n padding: 0;\n background: var(--cfi-ui-input-bg);\n border: 1px solid var(--cfi-ui-border-strong);\n border-radius: 4px;\n cursor: pointer;\n transition: background-color var(--cfi-ui-transition-fast), border-color var(--cfi-ui-transition-fast);\n }\n .cfi-ui-checkbox:hover:not(:disabled) {\n border-color: var(--cfi-ui-accent);\n }\n .cfi-ui-checkbox[data-state=checked],\n .cfi-ui-checkbox[data-state=indeterminate] {\n background: var(--cfi-ui-accent);\n border-color: var(--cfi-ui-accent);\n color: var(--cfi-ui-accent-fg);\n }\n .cfi-ui-checkbox[data-invalid] {\n border-color: var(--cfi-ui-error);\n }\n .cfi-ui-checkbox:disabled {\n cursor: not-allowed;\n background: var(--cfi-ui-surface-disabled);\n border-color: var(--cfi-ui-border);\n opacity: 0.65;\n }\n .cfi-ui-checkbox__indicator {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n .cfi-ui-checkbox__indicator > svg {\n width: 0.75rem;\n height: 0.75rem;\n stroke-width: 3;\n display: block;\n }\n .cfi-ui-checkbox-row {\n display: flex;\n align-items: flex-start;\n gap: var(--cfi-ui-space-sm);\n }\n .cfi-ui-checkbox-row > .cfi-ui-checkbox {\n margin-top: 0.1875rem;\n }\n .cfi-ui-checkbox-row__text {\n display: grid;\n gap: var(--cfi-ui-space-3xs);\n min-width: 0;\n }\n .cfi-ui-checkbox-row__label {\n font-size: var(--cfi-ui-text-sm);\n line-height: var(--cfi-ui-leading-normal);\n color: var(--cfi-ui-content);\n cursor: pointer;\n }\n .cfi-ui-checkbox-row__description {\n font-size: var(--cfi-ui-text-xs);\n line-height: var(--cfi-ui-leading-normal);\n color: var(--cfi-ui-content-muted);\n }\n}\n");
223
713
 
224
714
  // src/Checkbox.tsx
225
- import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
226
- var Checkbox = forwardRef3(
715
+ import { jsx as jsx11, jsxs as jsxs11 } from "react/jsx-runtime";
716
+ var Checkbox = forwardRef9(
227
717
  function Checkbox2({ label, description, invalid, className, id, ...rest }, ref) {
228
- const box = /* @__PURE__ */ jsx4(
718
+ const box = /* @__PURE__ */ jsx11(
229
719
  RadixCheckbox.Root,
230
720
  {
231
721
  ref,
@@ -234,96 +724,63 @@ var Checkbox = forwardRef3(
234
724
  "data-invalid": invalid || void 0,
235
725
  className: cn("cfi-ui", "cfi-ui-checkbox", !label && className),
236
726
  ...rest,
237
- children: /* @__PURE__ */ jsx4(RadixCheckbox.Indicator, { className: "cfi-ui-checkbox__indicator", children: rest.checked === "indeterminate" ? /* @__PURE__ */ jsx4(Minus, {}) : /* @__PURE__ */ jsx4(Check, {}) })
727
+ children: /* @__PURE__ */ jsx11(RadixCheckbox.Indicator, { className: "cfi-ui-checkbox__indicator", children: rest.checked === "indeterminate" ? /* @__PURE__ */ jsx11(Minus, {}) : /* @__PURE__ */ jsx11(Check3, {}) })
238
728
  }
239
729
  );
240
730
  if (!label) return box;
241
- return /* @__PURE__ */ jsxs4("div", { className: cn("cfi-ui", "cfi-ui-checkbox-row", className), children: [
731
+ return /* @__PURE__ */ jsxs11("div", { className: cn("cfi-ui", "cfi-ui-checkbox-row", className), children: [
242
732
  box,
243
- /* @__PURE__ */ jsxs4("div", { className: "cfi-ui-checkbox-row__text", children: [
244
- /* @__PURE__ */ jsx4("label", { htmlFor: id, className: "cfi-ui-checkbox-row__label", children: label }),
245
- description && /* @__PURE__ */ jsx4("span", { className: "cfi-ui-checkbox-row__description", children: description })
733
+ /* @__PURE__ */ jsxs11("div", { className: "cfi-ui-checkbox-row__text", children: [
734
+ /* @__PURE__ */ jsx11("label", { htmlFor: id, className: "cfi-ui-checkbox-row__label", children: label }),
735
+ description && /* @__PURE__ */ jsx11("span", { className: "cfi-ui-checkbox-row__description", children: description })
246
736
  ] })
247
737
  ] });
248
738
  }
249
739
  );
250
740
 
251
- // src/Switch.tsx
252
- import { forwardRef as forwardRef4 } from "react";
253
- import * as RadixSwitch from "@radix-ui/react-switch";
254
-
255
- // src/Switch.css
256
- styleInject("@layer components {\n .cfi-ui-switch {\n flex: none;\n position: relative;\n display: inline-flex;\n align-items: center;\n width: 2rem;\n height: 1.125rem;\n padding: 0;\n border: 1px solid transparent;\n border-radius: var(--cfi-ui-radius-full);\n background: var(--cfi-ui-switch-bg);\n cursor: pointer;\n transition: background-color var(--cfi-ui-transition-base);\n }\n .cfi-ui-switch[data-state=checked] {\n background: var(--cfi-ui-accent);\n }\n .cfi-ui-switch:disabled {\n cursor: not-allowed;\n opacity: 0.55;\n }\n .cfi-ui-switch__thumb {\n display: block;\n width: 0.875rem;\n height: 0.875rem;\n border-radius: var(--cfi-ui-radius-full);\n background: #ffffff;\n box-shadow: var(--cfi-ui-shadow-sm);\n transform: translateX(0.125rem);\n transition: transform var(--cfi-ui-transition-base);\n will-change: transform;\n }\n .cfi-ui-switch__thumb[data-state=checked] {\n transform: translateX(1rem);\n }\n .cfi-ui-switch-row {\n display: flex;\n align-items: center;\n gap: var(--cfi-ui-space-md);\n }\n .cfi-ui-switch-row[data-label-position=end] .cfi-ui-switch-row__text {\n flex: 1 1 auto;\n }\n .cfi-ui-switch-row__text {\n display: grid;\n gap: var(--cfi-ui-space-3xs);\n min-width: 0;\n }\n .cfi-ui-switch-row__label {\n font-size: var(--cfi-ui-text-sm);\n font-weight: var(--cfi-ui-weight-medium);\n line-height: var(--cfi-ui-leading-normal);\n color: var(--cfi-ui-content);\n cursor: pointer;\n }\n .cfi-ui-switch-row__description {\n font-size: var(--cfi-ui-text-xs);\n line-height: var(--cfi-ui-leading-normal);\n color: var(--cfi-ui-content-muted);\n }\n}\n");
257
-
258
- // src/Switch.tsx
259
- import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
260
- var Switch = forwardRef4(
261
- function Switch2({ label, description, labelPosition = "end", className, id, ...rest }, ref) {
262
- const control = /* @__PURE__ */ jsx5(
263
- RadixSwitch.Root,
264
- {
265
- ref,
266
- id,
267
- className: cn("cfi-ui", "cfi-ui-switch", !label && className),
268
- ...rest,
269
- children: /* @__PURE__ */ jsx5(RadixSwitch.Thumb, { className: "cfi-ui-switch__thumb" })
270
- }
271
- );
272
- if (!label) return control;
273
- return /* @__PURE__ */ jsxs5("div", { "data-label-position": labelPosition, className: cn("cfi-ui", "cfi-ui-switch-row", className), children: [
274
- labelPosition === "start" && control,
275
- /* @__PURE__ */ jsxs5("div", { className: "cfi-ui-switch-row__text", children: [
276
- /* @__PURE__ */ jsx5("label", { htmlFor: id, className: "cfi-ui-switch-row__label", children: label }),
277
- description && /* @__PURE__ */ jsx5("span", { className: "cfi-ui-switch-row__description", children: description })
278
- ] }),
279
- labelPosition === "end" && control
280
- ] });
281
- }
282
- );
283
-
284
741
  // src/Slider.tsx
285
- import { forwardRef as forwardRef5 } from "react";
742
+ import { forwardRef as forwardRef10 } from "react";
286
743
  import * as RadixSlider from "@radix-ui/react-slider";
287
744
 
288
745
  // src/Slider.css
289
746
  styleInject("@layer components {\n .cfi-ui-slider-wrap {\n display: flex;\n align-items: center;\n gap: var(--cfi-ui-space-md);\n width: 100%;\n }\n .cfi-ui-slider {\n position: relative;\n display: flex;\n align-items: center;\n flex: 1 1 auto;\n height: 1.25rem;\n touch-action: none;\n user-select: none;\n }\n .cfi-ui-slider[data-orientation=vertical] {\n flex-direction: column;\n width: 1.25rem;\n height: 8rem;\n }\n .cfi-ui-slider__track {\n position: relative;\n flex-grow: 1;\n height: 0.25rem;\n border-radius: var(--cfi-ui-radius-full);\n background: var(--cfi-ui-surface-active);\n }\n .cfi-ui-slider[data-orientation=vertical] .cfi-ui-slider__track {\n width: 0.25rem;\n height: auto;\n }\n .cfi-ui-slider__range {\n position: absolute;\n height: 100%;\n border-radius: var(--cfi-ui-radius-full);\n background: var(--cfi-ui-accent);\n }\n .cfi-ui-slider[data-orientation=vertical] .cfi-ui-slider__range {\n width: 100%;\n height: auto;\n }\n .cfi-ui-slider__thumb {\n display: block;\n width: 1rem;\n height: 1rem;\n border: 1px solid var(--cfi-ui-accent);\n border-radius: var(--cfi-ui-radius-full);\n background: var(--cfi-ui-surface);\n box-shadow: var(--cfi-ui-shadow-sm);\n cursor: grab;\n }\n .cfi-ui-slider__thumb:active {\n cursor: grabbing;\n }\n .cfi-ui-slider[data-disabled] {\n opacity: 0.55;\n }\n .cfi-ui-slider[data-disabled] .cfi-ui-slider__thumb {\n cursor: not-allowed;\n }\n .cfi-ui-slider__value {\n flex: none;\n min-width: 3.5ch;\n font-size: var(--cfi-ui-text-sm);\n font-variant-numeric: tabular-nums;\n color: var(--cfi-ui-content-muted);\n text-align: right;\n }\n}\n");
290
747
 
291
748
  // src/Slider.tsx
292
- import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
293
- var Slider = forwardRef5(
749
+ import { jsx as jsx12, jsxs as jsxs12 } from "react/jsx-runtime";
750
+ var Slider = forwardRef10(
294
751
  function Slider2({ showValue = false, formatValue, className, ...rest }, ref) {
295
752
  const values = rest.value ?? rest.defaultValue ?? [rest.min ?? 0];
296
753
  const format = formatValue ?? ((v) => String(v));
297
- return /* @__PURE__ */ jsxs6("div", { className: cn("cfi-ui", "cfi-ui-slider-wrap", className), children: [
298
- /* @__PURE__ */ jsxs6(RadixSlider.Root, { ref, className: "cfi-ui-slider", ...rest, children: [
299
- /* @__PURE__ */ jsx6(RadixSlider.Track, { className: "cfi-ui-slider__track", children: /* @__PURE__ */ jsx6(RadixSlider.Range, { className: "cfi-ui-slider__range" }) }),
300
- values.map((_, i) => /* @__PURE__ */ jsx6(RadixSlider.Thumb, { className: "cfi-ui-slider__thumb" }, i))
754
+ return /* @__PURE__ */ jsxs12("div", { className: cn("cfi-ui", "cfi-ui-slider-wrap", className), children: [
755
+ /* @__PURE__ */ jsxs12(RadixSlider.Root, { ref, className: "cfi-ui-slider", ...rest, children: [
756
+ /* @__PURE__ */ jsx12(RadixSlider.Track, { className: "cfi-ui-slider__track", children: /* @__PURE__ */ jsx12(RadixSlider.Range, { className: "cfi-ui-slider__range" }) }),
757
+ values.map((_, i) => /* @__PURE__ */ jsx12(RadixSlider.Thumb, { className: "cfi-ui-slider__thumb" }, i))
301
758
  ] }),
302
- showValue && /* @__PURE__ */ jsx6("output", { className: "cfi-ui-slider__value", children: values.map(format).join(" \u2013 ") })
759
+ showValue && /* @__PURE__ */ jsx12("output", { className: "cfi-ui-slider__value", children: values.map(format).join(" \u2013 ") })
303
760
  ] });
304
761
  }
305
762
  );
306
763
 
307
764
  // src/Dialog.tsx
308
- import { forwardRef as forwardRef6 } from "react";
765
+ import { forwardRef as forwardRef11 } from "react";
309
766
  import * as RadixDialog from "@radix-ui/react-dialog";
310
- import { X } from "lucide-react";
767
+ import { X as X2 } from "lucide-react";
311
768
 
312
769
  // src/Dialog.css
313
770
  styleInject("@layer components {\n .cfi-ui-dialog__overlay {\n position: fixed;\n inset: 0;\n z-index: var(--cfi-ui-z-overlay);\n background: var(--cfi-ui-overlay);\n animation: cfi-ui-fade-in var(--cfi-ui-transition-base);\n }\n .cfi-ui-dialog {\n position: fixed;\n z-index: var(--cfi-ui-z-modal);\n display: flex;\n flex-direction: column;\n background: var(--cfi-ui-surface);\n color: var(--cfi-ui-content);\n border: 1px solid var(--cfi-ui-border);\n box-shadow: var(--cfi-ui-shadow-lg);\n font-family: var(--cfi-ui-font);\n font-size: var(--cfi-ui-text-sm);\n }\n .cfi-ui-dialog[data-side=center] {\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: calc(100vw - 2 * var(--cfi-ui-space-md));\n max-height: calc(100vh - 2 * var(--cfi-ui-space-xl));\n border-radius: var(--cfi-ui-radius-lg);\n animation: cfi-ui-zoom-in var(--cfi-ui-transition-base);\n }\n .cfi-ui-dialog[data-side=center][data-size=sm] {\n max-width: 26rem;\n }\n .cfi-ui-dialog[data-side=center][data-size=md] {\n max-width: 34rem;\n }\n .cfi-ui-dialog[data-side=center][data-size=lg] {\n max-width: 48rem;\n }\n .cfi-ui-dialog[data-side=center][data-size=xl] {\n max-width: 64rem;\n }\n .cfi-ui-dialog[data-side=center][data-size=full] {\n max-width: none;\n width: calc(100vw - 2 * var(--cfi-ui-space-xl));\n height: calc(100vh - 2 * var(--cfi-ui-space-xl));\n max-height: none;\n }\n .cfi-ui-dialog[data-side=right],\n .cfi-ui-dialog[data-side=left] {\n top: 0;\n bottom: 0;\n height: 100vh;\n max-height: 100vh;\n width: calc(100vw - var(--cfi-ui-space-xl));\n border-radius: 0;\n border: 0;\n }\n .cfi-ui-dialog[data-side=right] {\n right: 0;\n border-right: 0;\n animation: cfi-ui-slide-in-right var(--cfi-ui-transition-base);\n }\n .cfi-ui-dialog[data-side=left] {\n left: 0;\n border-left: 0;\n animation: cfi-ui-slide-in-left var(--cfi-ui-transition-base);\n }\n .cfi-ui-dialog[data-side=right][data-size=sm],\n .cfi-ui-dialog[data-side=left][data-size=sm] {\n max-width: 22rem;\n }\n .cfi-ui-dialog[data-side=right][data-size=md],\n .cfi-ui-dialog[data-side=left][data-size=md] {\n max-width: 24rem;\n }\n .cfi-ui-dialog[data-side=right][data-size=lg],\n .cfi-ui-dialog[data-side=left][data-size=lg] {\n max-width: 42rem;\n }\n .cfi-ui-dialog[data-side=right][data-size=xl],\n .cfi-ui-dialog[data-side=left][data-size=xl] {\n max-width: 56rem;\n }\n .cfi-ui-dialog[data-side=right][data-size=full],\n .cfi-ui-dialog[data-side=left][data-size=full] {\n max-width: none;\n }\n .cfi-ui-dialog__header {\n flex: none;\n display: grid;\n gap: var(--cfi-ui-space-xs);\n padding: var(--cfi-ui-space-md) 3rem var(--cfi-ui-space-md) var(--cfi-ui-space-md);\n border-bottom: 1px solid var(--cfi-ui-border);\n }\n .cfi-ui-dialog__title {\n margin: 0;\n font-size: var(--cfi-ui-text-lg);\n font-weight: var(--cfi-ui-weight-semibold);\n line-height: var(--cfi-ui-leading-tight);\n letter-spacing: var(--cfi-letter-spacing-tight, -0.015em);\n color: var(--cfi-ui-content);\n text-wrap: balance;\n }\n .cfi-ui-sheet__title {\n font-size: var(--cfi-ui-text-base);\n }\n .cfi-ui-dialog__description {\n margin: 0;\n font-size: var(--cfi-ui-text-sm);\n line-height: var(--cfi-ui-leading-normal);\n color: var(--cfi-ui-content-muted);\n }\n :where(.cfi-ui-dialog__body) {\n flex: 1 1 auto;\n min-height: 0;\n overflow-y: auto;\n padding: var(--cfi-ui-space-md);\n }\n .cfi-ui-dialog__footer {\n flex: none;\n padding: var(--cfi-ui-space-md);\n border-top: 1px solid var(--cfi-ui-border);\n background: var(--cfi-ui-surface-sunken);\n }\n .cfi-ui-dialog[data-side=center] .cfi-ui-dialog__footer {\n border-bottom-left-radius: var(--cfi-ui-radius-lg);\n border-bottom-right-radius: var(--cfi-ui-radius-lg);\n }\n .cfi-ui-dialog__close {\n position: absolute;\n top: var(--cfi-ui-space-sm);\n right: var(--cfi-ui-space-sm);\n }\n .cfi-ui-dialog:not(:has(.cfi-ui-dialog__header)) .cfi-ui-dialog__body {\n padding-right: 3rem;\n }\n}\n");
314
771
 
315
772
  // src/Dialog.tsx
316
- import { jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
773
+ import { jsx as jsx13, jsxs as jsxs13 } from "react/jsx-runtime";
317
774
  var Dialog = RadixDialog.Root;
318
775
  var DialogRoot = RadixDialog.Root;
319
776
  var DialogTrigger = RadixDialog.Trigger;
320
777
  var DialogClose = RadixDialog.Close;
321
778
  var DialogPortal = RadixDialog.Portal;
322
- var DialogContent = forwardRef6(
779
+ var DialogContent = forwardRef11(
323
780
  function DialogContent2({ size = "md", side = "center", hideClose = false, closeLabel = "Close", className, children, ...rest }, ref) {
324
- return /* @__PURE__ */ jsxs7(RadixDialog.Portal, { children: [
325
- /* @__PURE__ */ jsx7(RadixDialog.Overlay, { className: "cfi-ui-dialog__overlay", "data-cfi-ui-portal": "" }),
326
- /* @__PURE__ */ jsxs7(
781
+ return /* @__PURE__ */ jsxs13(RadixDialog.Portal, { children: [
782
+ /* @__PURE__ */ jsx13(RadixDialog.Overlay, { className: "cfi-ui-dialog__overlay", "data-cfi-ui-portal": "" }),
783
+ /* @__PURE__ */ jsxs13(
327
784
  RadixDialog.Content,
328
785
  {
329
786
  ref,
@@ -334,12 +791,12 @@ var DialogContent = forwardRef6(
334
791
  ...rest,
335
792
  children: [
336
793
  children,
337
- !hideClose && /* @__PURE__ */ jsx7(RadixDialog.Close, { asChild: true, children: /* @__PURE__ */ jsx7(
794
+ !hideClose && /* @__PURE__ */ jsx13(RadixDialog.Close, { asChild: true, children: /* @__PURE__ */ jsx13(
338
795
  IconButton,
339
796
  {
340
797
  variant: "ghost",
341
798
  size: "sm",
342
- icon: /* @__PURE__ */ jsx7(X, {}),
799
+ icon: /* @__PURE__ */ jsx13(X2, {}),
343
800
  label: closeLabel,
344
801
  className: "cfi-ui-dialog__close"
345
802
  }
@@ -350,389 +807,127 @@ var DialogContent = forwardRef6(
350
807
  ] });
351
808
  }
352
809
  );
353
- function DialogHeader({ className, ...rest }) {
354
- return /* @__PURE__ */ jsx7("div", { className: cn("cfi-ui-dialog__header", className), ...rest });
355
- }
356
- var DialogTitle = forwardRef6(function DialogTitle2({ className, ...rest }, ref) {
357
- return /* @__PURE__ */ jsx7(RadixDialog.Title, { ref, className: cn("cfi-ui-dialog__title", className), ...rest });
358
- });
359
- var DialogDescription = forwardRef6(function DialogDescription2({ className, ...rest }, ref) {
360
- return /* @__PURE__ */ jsx7(RadixDialog.Description, { ref, className: cn("cfi-ui-dialog__description", className), ...rest });
361
- });
362
- function DialogBody({ className, ...rest }) {
363
- return /* @__PURE__ */ jsx7("div", { className: cn("cfi-ui-dialog__body", className), ...rest });
364
- }
365
- function DialogFooter({ className, ...rest }) {
366
- return /* @__PURE__ */ jsx7("div", { className: cn("cfi-ui-dialog__footer", className), ...rest });
367
- }
368
- function Modal({
369
- open,
370
- onOpenChange,
371
- title,
372
- description,
373
- size = "md",
374
- side = "center",
375
- footer,
376
- hideClose,
377
- dismissible = true,
378
- className,
379
- children
380
- }) {
381
- const block = dismissible ? void 0 : (e) => e.preventDefault();
382
- return /* @__PURE__ */ jsx7(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs7(
383
- DialogContent,
384
- {
385
- size,
386
- side,
387
- hideClose,
388
- className,
389
- onEscapeKeyDown: block,
390
- onPointerDownOutside: block,
391
- onInteractOutside: block,
392
- children: [
393
- /* @__PURE__ */ jsxs7(DialogHeader, { children: [
394
- /* @__PURE__ */ jsx7(DialogTitle, { children: title }),
395
- description && /* @__PURE__ */ jsx7(DialogDescription, { children: description })
396
- ] }),
397
- /* @__PURE__ */ jsx7(DialogBody, { children }),
398
- footer && /* @__PURE__ */ jsx7(DialogFooter, { children: footer })
399
- ]
400
- }
401
- ) });
402
- }
403
- function SideModal({ side = "right", size = "md", ...rest }) {
404
- return /* @__PURE__ */ jsx7(Modal, { side, size, ...rest });
405
- }
406
- var Sheet = RadixDialog.Root;
407
- var SheetTrigger = RadixDialog.Trigger;
408
- var SheetClose = RadixDialog.Close;
409
- var SheetPortal = RadixDialog.Portal;
410
- var SheetContent = forwardRef6(
411
- function SheetContent2({ side = "right", ...rest }, ref) {
412
- return /* @__PURE__ */ jsx7(DialogContent, { ref, side, ...rest });
413
- }
414
- );
415
- var SheetHeader = DialogHeader;
416
- var SheetTitle = forwardRef6(function SheetTitle2({ className, ...rest }, ref) {
417
- return /* @__PURE__ */ jsx7(DialogTitle, { ref, className: cn("cfi-ui-sheet__title", className), ...rest });
418
- });
419
- var SheetDescription = DialogDescription;
420
- var SheetBody = DialogBody;
421
- var SheetFooter = DialogFooter;
422
- function ConfirmDialog({
423
- open,
424
- onOpenChange,
425
- title,
426
- description,
427
- confirmLabel = "Confirm",
428
- cancelLabel = "Cancel",
429
- destructive = true,
430
- loading = false,
431
- onConfirm,
432
- children
433
- }) {
434
- return /* @__PURE__ */ jsx7(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs7(
435
- DialogContent,
436
- {
437
- size: "sm",
438
- role: "alertdialog",
439
- hideClose: true,
440
- onPointerDownOutside: (e) => e.preventDefault(),
441
- onInteractOutside: (e) => e.preventDefault(),
442
- children: [
443
- /* @__PURE__ */ jsxs7(DialogHeader, { children: [
444
- /* @__PURE__ */ jsx7(DialogTitle, { children: title }),
445
- description && /* @__PURE__ */ jsx7(DialogDescription, { children: description })
446
- ] }),
447
- children && /* @__PURE__ */ jsx7(DialogBody, { children }),
448
- /* @__PURE__ */ jsx7(DialogFooter, { children: /* @__PURE__ */ jsxs7(ButtonGroup, { children: [
449
- /* @__PURE__ */ jsx7(DialogClose, { asChild: true, children: /* @__PURE__ */ jsx7(Button, { autoFocus: true, disabled: loading, children: cancelLabel }) }),
450
- /* @__PURE__ */ jsx7(
451
- Button,
452
- {
453
- variant: destructive ? "danger" : "primary",
454
- loading,
455
- onClick: onConfirm,
456
- children: confirmLabel
457
- }
458
- )
459
- ] }) })
460
- ]
461
- }
462
- ) });
463
- }
464
-
465
- // src/Popover.tsx
466
- import { forwardRef as forwardRef7 } from "react";
467
- import * as RadixPopover from "@radix-ui/react-popover";
468
-
469
- // src/Floating.css
470
- styleInject("@layer components {\n .cfi-ui-floating {\n z-index: var(--cfi-ui-z-popover);\n background: var(--cfi-ui-surface-raised);\n color: var(--cfi-ui-content);\n border: 1px solid var(--cfi-ui-border);\n border-radius: var(--cfi-ui-radius-md);\n box-shadow: var(--cfi-ui-shadow-lg);\n font-family: var(--cfi-ui-font);\n font-size: var(--cfi-ui-text-sm);\n animation: cfi-ui-zoom-in var(--cfi-ui-transition-fast);\n max-height: var(--radix-popper-available-height, none);\n overflow: hidden auto;\n }\n .cfi-ui-floating__arrow {\n fill: var(--cfi-ui-surface-raised);\n filter: drop-shadow(0 -1px 0 var(--cfi-ui-border));\n }\n .cfi-ui-popover {\n padding: var(--cfi-ui-space-md);\n min-width: 12rem;\n }\n .cfi-ui-popover[data-flush] {\n padding: 0;\n }\n .cfi-ui-menu {\n z-index: var(--cfi-ui-z-dropdown);\n min-width: 11rem;\n padding: var(--cfi-ui-space-xs);\n }\n .cfi-ui-menu__item {\n display: flex;\n align-items: center;\n gap: var(--cfi-ui-space-sm);\n padding: 0.375rem 0.5rem;\n border-radius: var(--cfi-ui-radius-sm);\n font-size: var(--cfi-ui-text-sm);\n line-height: var(--cfi-ui-leading-normal);\n color: var(--cfi-ui-content);\n cursor: pointer;\n user-select: none;\n outline: none;\n }\n .cfi-ui-menu__item[data-highlighted] {\n background: var(--cfi-ui-surface-active);\n }\n .cfi-ui-menu__item[data-disabled] {\n color: var(--cfi-ui-content-disabled);\n cursor: not-allowed;\n }\n .cfi-ui-menu__item[data-variant=danger] {\n color: var(--cfi-ui-error-text);\n }\n .cfi-ui-menu__item[data-variant=danger][data-highlighted] {\n background: var(--cfi-ui-error-soft);\n }\n .cfi-ui-menu__item > svg,\n .cfi-ui-menu__item .cfi-ui-menu__icon > svg {\n width: 0.875rem;\n height: 0.875rem;\n flex: none;\n }\n .cfi-ui-menu__icon {\n display: inline-flex;\n flex: none;\n color: var(--cfi-ui-content-muted);\n }\n .cfi-ui-menu__item[data-variant=danger] .cfi-ui-menu__icon {\n color: inherit;\n }\n .cfi-ui-menu__shortcut {\n margin-left: auto;\n padding-left: var(--cfi-ui-space-md);\n font-family: var(--cfi-ui-font-mono);\n font-size: var(--cfi-ui-text-xs);\n color: var(--cfi-ui-content-subtle);\n }\n .cfi-ui-menu__label {\n padding: 0.375rem 0.5rem 0.25rem;\n font-size: var(--cfi-ui-text-xs);\n font-weight: var(--cfi-ui-weight-semibold);\n letter-spacing: var(--cfi-ui-tracking-caps);\n text-transform: uppercase;\n color: var(--cfi-ui-content-muted);\n }\n .cfi-ui-menu__separator {\n height: 1px;\n margin: var(--cfi-ui-space-xs) calc(-1 * var(--cfi-ui-space-xs));\n background: var(--cfi-ui-border);\n }\n .cfi-ui-select-content {\n z-index: var(--cfi-ui-z-dropdown);\n padding: var(--cfi-ui-space-xs);\n min-width: var(--radix-select-trigger-width, 11rem);\n }\n .cfi-ui-select-viewport {\n max-height: min(18rem, var(--radix-select-content-available-height, 18rem));\n }\n .cfi-ui-select-item {\n display: flex;\n align-items: center;\n gap: var(--cfi-ui-space-sm);\n padding: 0.375rem 0.5rem;\n border-radius: var(--cfi-ui-radius-sm);\n font-size: var(--cfi-ui-text-sm);\n color: var(--cfi-ui-content);\n cursor: pointer;\n user-select: none;\n outline: none;\n }\n .cfi-ui-select-item[data-highlighted] {\n background: var(--cfi-ui-surface-active);\n }\n .cfi-ui-select-item[data-state=checked] {\n font-weight: var(--cfi-ui-weight-medium);\n }\n .cfi-ui-select-item[data-disabled] {\n color: var(--cfi-ui-content-disabled);\n cursor: not-allowed;\n }\n .cfi-ui-select-item__indicator {\n display: inline-flex;\n flex: none;\n width: 0.875rem;\n color: var(--cfi-ui-accent);\n }\n .cfi-ui-select-item__indicator > svg {\n width: 0.875rem;\n height: 0.875rem;\n }\n .cfi-ui-select-empty {\n padding: var(--cfi-ui-space-sm);\n font-size: var(--cfi-ui-text-sm);\n color: var(--cfi-ui-content-muted);\n text-align: center;\n }\n .cfi-ui-tooltip {\n z-index: var(--cfi-ui-z-tooltip);\n max-width: 20rem;\n padding: 0.3125rem 0.5rem;\n border-radius: var(--cfi-ui-radius-sm);\n background: var(--cfi-ui-content);\n color: var(--cfi-ui-surface);\n font-family: var(--cfi-ui-font);\n font-size: var(--cfi-ui-text-xs);\n line-height: var(--cfi-ui-leading-normal);\n box-shadow: var(--cfi-ui-shadow-md);\n animation: cfi-ui-zoom-in var(--cfi-ui-transition-fast);\n }\n .cfi-ui-tooltip__arrow {\n fill: var(--cfi-ui-content);\n }\n}\n");
471
-
472
- // src/Popover.tsx
473
- import { jsx as jsx8, jsxs as jsxs8 } from "react/jsx-runtime";
474
- var PopoverRoot = RadixPopover.Root;
475
- var PopoverTrigger = RadixPopover.Trigger;
476
- var PopoverAnchor = RadixPopover.Anchor;
477
- var PopoverClose = RadixPopover.Close;
478
- var PopoverContent = forwardRef7(function PopoverContent2({ showArrow = false, flush = false, className, children, sideOffset = 6, collisionPadding = 8, ...rest }, ref) {
479
- return /* @__PURE__ */ jsx8(RadixPopover.Portal, { children: /* @__PURE__ */ jsxs8(
480
- RadixPopover.Content,
481
- {
482
- ref,
483
- sideOffset,
484
- collisionPadding,
485
- "data-cfi-ui-portal": "",
486
- "data-flush": flush || void 0,
487
- className: cn("cfi-ui", "cfi-ui-floating", "cfi-ui-popover", className),
488
- ...rest,
489
- children: [
490
- children,
491
- showArrow && /* @__PURE__ */ jsx8(RadixPopover.Arrow, { className: "cfi-ui-floating__arrow", width: 11, height: 5 })
492
- ]
493
- }
494
- ) });
495
- });
496
- function Popover({ trigger, open, onOpenChange, defaultOpen, modal, children, ...content }) {
497
- return /* @__PURE__ */ jsxs8(PopoverRoot, { open, onOpenChange, defaultOpen, modal, children: [
498
- /* @__PURE__ */ jsx8(PopoverTrigger, { asChild: true, children: trigger }),
499
- /* @__PURE__ */ jsx8(PopoverContent, { ...content, children })
500
- ] });
501
- }
502
-
503
- // src/Menu.tsx
504
- import { Fragment as Fragment2, forwardRef as forwardRef8 } from "react";
505
- import * as RadixMenu from "@radix-ui/react-dropdown-menu";
506
- import { Check as Check2 } from "lucide-react";
507
- import { jsx as jsx9, jsxs as jsxs9 } from "react/jsx-runtime";
508
- var MenuRoot = RadixMenu.Root;
509
- var MenuTrigger = RadixMenu.Trigger;
510
- var MenuGroup = RadixMenu.Group;
511
- var MenuSub = RadixMenu.Sub;
512
- var MenuRadioGroup = RadixMenu.RadioGroup;
513
- var MenuContent = forwardRef8(function MenuContent2({ className, sideOffset = 4, collisionPadding = 8, ...rest }, ref) {
514
- return /* @__PURE__ */ jsx9(RadixMenu.Portal, { children: /* @__PURE__ */ jsx9(
515
- RadixMenu.Content,
516
- {
517
- ref,
518
- sideOffset,
519
- collisionPadding,
520
- "data-cfi-ui-portal": "",
521
- className: cn("cfi-ui", "cfi-ui-floating", "cfi-ui-menu", className),
522
- ...rest
523
- }
524
- ) });
525
- });
526
- var MenuItem = forwardRef8(
527
- function MenuItem2({ icon, shortcut, variant = "default", className, children, ...rest }, ref) {
528
- return /* @__PURE__ */ jsxs9(
529
- RadixMenu.Item,
530
- {
531
- ref,
532
- "data-variant": variant,
533
- className: cn("cfi-ui-menu__item", className),
534
- ...rest,
535
- children: [
536
- icon && /* @__PURE__ */ jsx9("span", { className: "cfi-ui-menu__icon", children: icon }),
537
- /* @__PURE__ */ jsx9("span", { children }),
538
- shortcut && /* @__PURE__ */ jsx9("span", { className: "cfi-ui-menu__shortcut", children: shortcut })
539
- ]
540
- }
541
- );
542
- }
543
- );
544
- var MenuCheckboxItem = forwardRef8(function MenuCheckboxItem2({ className, children, ...rest }, ref) {
545
- return /* @__PURE__ */ jsxs9(RadixMenu.CheckboxItem, { ref, className: cn("cfi-ui-menu__item", className), ...rest, children: [
546
- /* @__PURE__ */ jsx9("span", { className: "cfi-ui-select-item__indicator", children: /* @__PURE__ */ jsx9(RadixMenu.ItemIndicator, { children: /* @__PURE__ */ jsx9(Check2, {}) }) }),
547
- /* @__PURE__ */ jsx9("span", { children })
548
- ] });
810
+ function DialogHeader({ className, ...rest }) {
811
+ return /* @__PURE__ */ jsx13("div", { className: cn("cfi-ui-dialog__header", className), ...rest });
812
+ }
813
+ var DialogTitle = forwardRef11(function DialogTitle2({ className, ...rest }, ref) {
814
+ return /* @__PURE__ */ jsx13(RadixDialog.Title, { ref, className: cn("cfi-ui-dialog__title", className), ...rest });
549
815
  });
550
- var MenuRadioItem = forwardRef8(function MenuRadioItem2({ className, children, ...rest }, ref) {
551
- return /* @__PURE__ */ jsxs9(RadixMenu.RadioItem, { ref, className: cn("cfi-ui-menu__item", className), ...rest, children: [
552
- /* @__PURE__ */ jsx9("span", { className: "cfi-ui-select-item__indicator", children: /* @__PURE__ */ jsx9(RadixMenu.ItemIndicator, { children: /* @__PURE__ */ jsx9(Check2, {}) }) }),
553
- /* @__PURE__ */ jsx9("span", { children })
554
- ] });
816
+ var DialogDescription = forwardRef11(function DialogDescription2({ className, ...rest }, ref) {
817
+ return /* @__PURE__ */ jsx13(RadixDialog.Description, { ref, className: cn("cfi-ui-dialog__description", className), ...rest });
555
818
  });
556
- function MenuLabel({ className, ...rest }) {
557
- return /* @__PURE__ */ jsx9(RadixMenu.Label, { className: cn("cfi-ui-menu__label", className), ...rest });
819
+ function DialogBody({ className, ...rest }) {
820
+ return /* @__PURE__ */ jsx13("div", { className: cn("cfi-ui-dialog__body", className), ...rest });
558
821
  }
559
- function MenuSeparator({
822
+ function DialogFooter({ className, ...rest }) {
823
+ return /* @__PURE__ */ jsx13("div", { className: cn("cfi-ui-dialog__footer", className), ...rest });
824
+ }
825
+ function Modal({
826
+ open,
827
+ onOpenChange,
828
+ title,
829
+ description,
830
+ size = "md",
831
+ side = "center",
832
+ footer,
833
+ hideClose,
834
+ dismissible = true,
560
835
  className,
561
- ...rest
836
+ children
562
837
  }) {
563
- return /* @__PURE__ */ jsx9(RadixMenu.Separator, { className: cn("cfi-ui-menu__separator", className), ...rest });
564
- }
565
- var MenuSubTrigger = forwardRef8(function MenuSubTrigger2({ className, ...rest }, ref) {
566
- return /* @__PURE__ */ jsx9(RadixMenu.SubTrigger, { ref, className: cn("cfi-ui-menu__item", className), ...rest });
567
- });
568
- var MenuSubContent = forwardRef8(function MenuSubContent2({ className, ...rest }, ref) {
569
- return /* @__PURE__ */ jsx9(RadixMenu.Portal, { children: /* @__PURE__ */ jsx9(
570
- RadixMenu.SubContent,
571
- {
572
- ref,
573
- "data-cfi-ui-portal": "",
574
- className: cn("cfi-ui", "cfi-ui-floating", "cfi-ui-menu", className),
575
- ...rest
576
- }
577
- ) });
578
- });
579
- function Menu({ trigger, items, align = "end", side = "bottom", className }) {
580
- return /* @__PURE__ */ jsxs9(MenuRoot, { children: [
581
- /* @__PURE__ */ jsx9(MenuTrigger, { asChild: true, children: trigger }),
582
- /* @__PURE__ */ jsx9(MenuContent, { align, side, className, children: items.map((item) => /* @__PURE__ */ jsxs9(Fragment2, { children: [
583
- item.separatorBefore && /* @__PURE__ */ jsx9(MenuSeparator, {}),
584
- /* @__PURE__ */ jsx9(
585
- MenuItem,
586
- {
587
- icon: item.icon,
588
- shortcut: item.shortcut,
589
- variant: item.variant,
590
- disabled: item.disabled,
591
- onSelect: item.onSelect,
592
- children: item.label
593
- }
594
- )
595
- ] }, item.id)) })
596
- ] });
597
- }
598
-
599
- // src/Select.tsx
600
- import { forwardRef as forwardRef9 } from "react";
601
- import * as RadixSelect from "@radix-ui/react-select";
602
- import { Check as Check3, ChevronDown, ChevronUp } from "lucide-react";
603
-
604
- // src/Select.css
605
- styleInject("@layer components {\n :where(.cfi-ui-select) {\n display: inline-flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--cfi-ui-space-sm);\n height: var(--cfi-ui-control-height-md);\n padding-inline: 0.625rem;\n background: var(--cfi-ui-surface);\n color: var(--cfi-ui-content);\n border: 1px solid var(--cfi-ui-border-strong);\n border-radius: var(--cfi-ui-radius-md);\n font-family: inherit;\n font-size: var(--cfi-ui-text-sm);\n line-height: normal;\n cursor: pointer;\n transition: border-color var(--cfi-ui-transition-fast);\n }\n .cfi-ui-select--full {\n width: 100%;\n }\n .cfi-ui-select:hover:not(:disabled) {\n border-color: var(--cfi-ui-content-subtle);\n }\n .cfi-ui-select:disabled {\n background: var(--cfi-ui-surface-disabled);\n color: var(--cfi-ui-content-disabled);\n cursor: not-allowed;\n }\n .cfi-ui-select[data-invalid] {\n border-color: var(--cfi-ui-error);\n }\n .cfi-ui-select[data-size=sm] {\n height: var(--cfi-ui-control-height-sm);\n padding-inline: 0.5rem;\n font-size: var(--cfi-ui-text-xs);\n }\n .cfi-ui-select[data-size=lg] {\n height: var(--cfi-ui-control-height-lg);\n padding-inline: 0.875rem;\n font-size: var(--cfi-ui-text-base);\n }\n .cfi-ui-select[data-placeholder] .cfi-ui-select__value {\n color: var(--cfi-ui-content-muted);\n }\n .cfi-ui-select__value {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-align: left;\n }\n .cfi-ui-select__chevron {\n display: inline-flex;\n flex: none;\n color: var(--cfi-ui-content-muted);\n }\n .cfi-ui-select__chevron > svg {\n width: 0.875rem;\n height: 0.875rem;\n display: block;\n }\n .cfi-ui-select-scroll {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 1.25rem;\n color: var(--cfi-ui-content-muted);\n cursor: default;\n }\n .cfi-ui-select-scroll > svg {\n width: 0.875rem;\n height: 0.875rem;\n }\n}\n");
606
-
607
- // src/Select.tsx
608
- import { jsx as jsx10, jsxs as jsxs10 } from "react/jsx-runtime";
609
- var SelectRoot = RadixSelect.Root;
610
- var SelectValue = RadixSelect.Value;
611
- var SelectGroup = RadixSelect.Group;
612
- var SelectTrigger = forwardRef9(
613
- function SelectTrigger2({ size = "md", invalid, className, children, ...rest }, ref) {
614
- return /* @__PURE__ */ jsxs10(
615
- RadixSelect.Trigger,
616
- {
617
- ref,
618
- "data-size": size,
619
- "data-invalid": invalid || void 0,
620
- "aria-invalid": invalid || void 0,
621
- className: cn("cfi-ui", "cfi-ui-select", className),
622
- ...rest,
623
- children: [
624
- /* @__PURE__ */ jsx10("span", { className: "cfi-ui-select__value", children }),
625
- /* @__PURE__ */ jsx10(RadixSelect.Icon, { className: "cfi-ui-select__chevron", children: /* @__PURE__ */ jsx10(ChevronDown, {}) })
626
- ]
627
- }
628
- );
629
- }
630
- );
631
- var SelectContent = forwardRef9(function SelectContent2({ className, children, position = "popper", sideOffset = 4, ...rest }, ref) {
632
- return /* @__PURE__ */ jsx10(RadixSelect.Portal, { children: /* @__PURE__ */ jsxs10(
633
- RadixSelect.Content,
838
+ const block = dismissible ? void 0 : (e) => e.preventDefault();
839
+ return /* @__PURE__ */ jsx13(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs13(
840
+ DialogContent,
634
841
  {
635
- ref,
636
- position,
637
- sideOffset,
638
- "data-cfi-ui-portal": "",
639
- className: cn("cfi-ui", "cfi-ui-floating", "cfi-ui-select-content", className),
640
- ...rest,
842
+ size,
843
+ side,
844
+ hideClose,
845
+ className,
846
+ onEscapeKeyDown: block,
847
+ onPointerDownOutside: block,
848
+ onInteractOutside: block,
641
849
  children: [
642
- /* @__PURE__ */ jsx10(RadixSelect.ScrollUpButton, { className: "cfi-ui-select-scroll", children: /* @__PURE__ */ jsx10(ChevronUp, {}) }),
643
- /* @__PURE__ */ jsx10(RadixSelect.Viewport, { className: "cfi-ui-select-viewport", children }),
644
- /* @__PURE__ */ jsx10(RadixSelect.ScrollDownButton, { className: "cfi-ui-select-scroll", children: /* @__PURE__ */ jsx10(ChevronDown, {}) })
850
+ /* @__PURE__ */ jsxs13(DialogHeader, { children: [
851
+ /* @__PURE__ */ jsx13(DialogTitle, { children: title }),
852
+ description && /* @__PURE__ */ jsx13(DialogDescription, { children: description })
853
+ ] }),
854
+ /* @__PURE__ */ jsx13(DialogBody, { children }),
855
+ footer && /* @__PURE__ */ jsx13(DialogFooter, { children: footer })
645
856
  ]
646
857
  }
647
858
  ) });
648
- });
649
- var SelectItem = forwardRef9(function SelectItem2({ className, children, ...rest }, ref) {
650
- return /* @__PURE__ */ jsxs10(RadixSelect.Item, { ref, className: cn("cfi-ui-select-item", className), ...rest, children: [
651
- /* @__PURE__ */ jsx10("span", { className: "cfi-ui-select-item__indicator", children: /* @__PURE__ */ jsx10(RadixSelect.ItemIndicator, { children: /* @__PURE__ */ jsx10(Check3, {}) }) }),
652
- /* @__PURE__ */ jsx10(RadixSelect.ItemText, { children })
653
- ] });
654
- });
655
- function SelectLabel({ className, ...rest }) {
656
- return /* @__PURE__ */ jsx10(RadixSelect.Label, { className: cn("cfi-ui-menu__label", className), ...rest });
657
859
  }
658
- function SelectSeparator({
659
- className,
660
- ...rest
661
- }) {
662
- return /* @__PURE__ */ jsx10(RadixSelect.Separator, { className: cn("cfi-ui-menu__separator", className), ...rest });
860
+ function SideModal({ side = "right", size = "md", ...rest }) {
861
+ return /* @__PURE__ */ jsx13(Modal, { side, size, ...rest });
663
862
  }
664
- function Select({
665
- options,
666
- value,
667
- onValueChange,
668
- defaultValue,
669
- placeholder = "Select...",
670
- size = "md",
671
- invalid,
672
- disabled,
673
- required,
674
- name,
675
- id,
676
- className,
677
- fullWidth = true,
678
- emptyLabel = "No options",
863
+ var Sheet = RadixDialog.Root;
864
+ var SheetTrigger = RadixDialog.Trigger;
865
+ var SheetClose = RadixDialog.Close;
866
+ var SheetPortal = RadixDialog.Portal;
867
+ var SheetContent = forwardRef11(
868
+ function SheetContent2({ side = "right", ...rest }, ref) {
869
+ return /* @__PURE__ */ jsx13(DialogContent, { ref, side, ...rest });
870
+ }
871
+ );
872
+ var SheetHeader = DialogHeader;
873
+ var SheetTitle = forwardRef11(function SheetTitle2({ className, ...rest }, ref) {
874
+ return /* @__PURE__ */ jsx13(DialogTitle, { ref, className: cn("cfi-ui-sheet__title", className), ...rest });
875
+ });
876
+ var SheetDescription = DialogDescription;
877
+ var SheetBody = DialogBody;
878
+ var SheetFooter = DialogFooter;
879
+ function ConfirmDialog({
880
+ open,
679
881
  onOpenChange,
680
- onBlur,
681
- ...aria
882
+ title,
883
+ description,
884
+ confirmLabel = "Confirm",
885
+ cancelLabel = "Cancel",
886
+ destructive = true,
887
+ loading = false,
888
+ onConfirm,
889
+ children
682
890
  }) {
683
- const groups = [];
684
- for (const option of options) {
685
- const existing = groups.find((g) => g.name === option.group);
686
- if (existing) existing.options.push(option);
687
- else groups.push({ name: option.group, options: [option] });
688
- }
689
- return /* @__PURE__ */ jsxs10(
690
- SelectRoot,
891
+ return /* @__PURE__ */ jsx13(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs13(
892
+ DialogContent,
691
893
  {
692
- value,
693
- onValueChange,
694
- defaultValue,
695
- disabled,
696
- required,
697
- name,
698
- onOpenChange,
894
+ size: "sm",
895
+ role: "alertdialog",
896
+ hideClose: true,
897
+ onPointerDownOutside: (e) => e.preventDefault(),
898
+ onInteractOutside: (e) => e.preventDefault(),
699
899
  children: [
700
- /* @__PURE__ */ jsx10(
701
- SelectTrigger,
702
- {
703
- id,
704
- size,
705
- invalid,
706
- className: cn(fullWidth && "cfi-ui-select--full", className),
707
- onBlur,
708
- ...aria,
709
- children: /* @__PURE__ */ jsx10(SelectValue, { placeholder })
710
- }
711
- ),
712
- /* @__PURE__ */ jsxs10(SelectContent, { children: [
713
- groups.map(
714
- (group, i) => group.name ? /* @__PURE__ */ jsxs10(SelectGroup, { children: [
715
- i > 0 && /* @__PURE__ */ jsx10(SelectSeparator, {}),
716
- /* @__PURE__ */ jsx10(SelectLabel, { children: group.name }),
717
- group.options.map((o) => /* @__PURE__ */ jsx10(SelectItem, { value: o.value, disabled: o.disabled, children: o.label }, o.value))
718
- ] }, group.name) : group.options.map((o) => /* @__PURE__ */ jsx10(SelectItem, { value: o.value, disabled: o.disabled, children: o.label }, o.value))
719
- ),
720
- options.length === 0 && /* @__PURE__ */ jsx10("p", { className: "cfi-ui-select-empty", children: emptyLabel })
721
- ] })
900
+ /* @__PURE__ */ jsxs13(DialogHeader, { children: [
901
+ /* @__PURE__ */ jsx13(DialogTitle, { children: title }),
902
+ description && /* @__PURE__ */ jsx13(DialogDescription, { children: description })
903
+ ] }),
904
+ children && /* @__PURE__ */ jsx13(DialogBody, { children }),
905
+ /* @__PURE__ */ jsx13(DialogFooter, { children: /* @__PURE__ */ jsxs13(ButtonGroup, { children: [
906
+ /* @__PURE__ */ jsx13(DialogClose, { asChild: true, children: /* @__PURE__ */ jsx13(Button, { autoFocus: true, disabled: loading, children: cancelLabel }) }),
907
+ /* @__PURE__ */ jsx13(
908
+ Button,
909
+ {
910
+ variant: destructive ? "danger" : "primary",
911
+ loading,
912
+ onClick: onConfirm,
913
+ children: confirmLabel
914
+ }
915
+ )
916
+ ] }) })
722
917
  ]
723
918
  }
724
- );
919
+ ) });
725
920
  }
726
921
 
727
922
  // src/CreatableSelect.tsx
728
- import { useMemo, useState } from "react";
923
+ import { useMemo as useMemo2, useState as useState2 } from "react";
729
924
  import { Plus } from "lucide-react";
730
925
 
731
926
  // src/CreatableSelect.css
732
927
  styleInject("@layer components {\n :where(.cfi-creatable) {\n display: flex;\n align-items: center;\n gap: var(--cfi-ui-space-sm);\n width: 100%;\n }\n :where(.cfi-creatable__select) {\n flex: 1 1 auto;\n min-width: 0;\n }\n :where(.cfi-creatable) > :where(button) {\n flex: 0 0 auto;\n }\n}\n");
733
928
 
734
929
  // src/CreatableSelect.tsx
735
- import { jsx as jsx11, jsxs as jsxs11 } from "react/jsx-runtime";
930
+ import { jsx as jsx14, jsxs as jsxs14 } from "react/jsx-runtime";
736
931
  function normalize(value) {
737
932
  return value.trim().toLowerCase();
738
933
  }
@@ -757,16 +952,16 @@ function CreatableSelect({
757
952
  disabled,
758
953
  ...select
759
954
  }) {
760
- const [open, setOpen] = useState(false);
761
- const [draft, setDraft] = useState("");
762
- const [pending, setPending] = useState(false);
763
- const [error, setError] = useState(null);
764
- const [created, setCreated] = useState([]);
765
- const merged = useMemo(() => {
955
+ const [open, setOpen] = useState2(false);
956
+ const [draft, setDraft] = useState2("");
957
+ const [pending, setPending] = useState2(false);
958
+ const [error, setError] = useState2(null);
959
+ const [created, setCreated] = useState2([]);
960
+ const merged = useMemo2(() => {
766
961
  const seen = new Set(options.map((o) => o.value));
767
962
  return [...options, ...created.filter((o) => !seen.has(o.value))];
768
963
  }, [options, created]);
769
- const match = useMemo(() => {
964
+ const match = useMemo2(() => {
770
965
  const wanted = normalize(draft);
771
966
  if (wanted === "") return null;
772
967
  return merged.find((o) => {
@@ -801,20 +996,20 @@ function CreatableSelect({
801
996
  setPending(false);
802
997
  }
803
998
  }
804
- return /* @__PURE__ */ jsxs11("div", { className: cn("cfi-creatable", className), children: [
805
- /* @__PURE__ */ jsx11("div", { className: "cfi-creatable__select", children: /* @__PURE__ */ jsx11(Select, { ...select, options: merged, onValueChange, disabled }) }),
806
- showAdd && /* @__PURE__ */ jsx11(
999
+ return /* @__PURE__ */ jsxs14("div", { className: cn("cfi-creatable", className), children: [
1000
+ /* @__PURE__ */ jsx14("div", { className: "cfi-creatable__select", children: /* @__PURE__ */ jsx14(Select, { ...select, options: merged, onValueChange, disabled }) }),
1001
+ showAdd && /* @__PURE__ */ jsx14(
807
1002
  IconButton,
808
1003
  {
809
1004
  type: "button",
810
1005
  variant: "secondary",
811
1006
  size: select.size ?? "md",
812
- icon: /* @__PURE__ */ jsx11(Plus, { "aria-hidden": "true" }),
1007
+ icon: /* @__PURE__ */ jsx14(Plus, { "aria-hidden": "true" }),
813
1008
  label: addLabel,
814
1009
  onClick: () => setOpen(true)
815
1010
  }
816
1011
  ),
817
- /* @__PURE__ */ jsx11(
1012
+ /* @__PURE__ */ jsx14(
818
1013
  Modal,
819
1014
  {
820
1015
  open,
@@ -822,9 +1017,9 @@ function CreatableSelect({
822
1017
  title: createTitle,
823
1018
  description: createDescription,
824
1019
  size: "sm",
825
- footer: /* @__PURE__ */ jsxs11(ButtonGroup, { children: [
826
- /* @__PURE__ */ jsx11(Button, { type: "button", variant: "secondary", onClick: close, disabled: pending, children: createCancelLabel }),
827
- /* @__PURE__ */ jsx11(
1020
+ footer: /* @__PURE__ */ jsxs14(ButtonGroup, { children: [
1021
+ /* @__PURE__ */ jsx14(Button, { type: "button", variant: "secondary", onClick: close, disabled: pending, children: createCancelLabel }),
1022
+ /* @__PURE__ */ jsx14(
828
1023
  Button,
829
1024
  {
830
1025
  type: "button",
@@ -835,7 +1030,7 @@ function CreatableSelect({
835
1030
  }
836
1031
  )
837
1032
  ] }),
838
- children: /* @__PURE__ */ jsxs11(
1033
+ children: /* @__PURE__ */ jsxs14(
839
1034
  "form",
840
1035
  {
841
1036
  onSubmit: (event) => {
@@ -843,14 +1038,14 @@ function CreatableSelect({
843
1038
  void submit();
844
1039
  },
845
1040
  children: [
846
- /* @__PURE__ */ jsx11(
1041
+ /* @__PURE__ */ jsx14(
847
1042
  Field,
848
1043
  {
849
1044
  label: createFieldLabel,
850
1045
  required: true,
851
1046
  error,
852
1047
  hint: match ? duplicateHint : void 0,
853
- children: /* @__PURE__ */ jsx11(
1048
+ children: /* @__PURE__ */ jsx14(
854
1049
  Input,
855
1050
  {
856
1051
  value: draft,
@@ -862,7 +1057,7 @@ function CreatableSelect({
862
1057
  )
863
1058
  }
864
1059
  ),
865
- /* @__PURE__ */ jsx11("button", { type: "submit", hidden: true, "aria-hidden": "true", tabIndex: -1 })
1060
+ /* @__PURE__ */ jsx14("button", { type: "submit", hidden: true, "aria-hidden": "true", tabIndex: -1 })
866
1061
  ]
867
1062
  }
868
1063
  )
@@ -872,14 +1067,14 @@ function CreatableSelect({
872
1067
  }
873
1068
 
874
1069
  // src/Combobox.tsx
875
- import { useEffect, useId as useId2, useMemo as useMemo2, useRef, useState as useState2 } from "react";
876
- import { Check as Check4, ChevronDown as ChevronDown2, Search, X as X2 } from "lucide-react";
1070
+ import { useEffect, useId as useId2, useMemo as useMemo3, useRef, useState as useState3 } from "react";
1071
+ import { Check as Check4, ChevronDown as ChevronDown3, Search, X as X3 } from "lucide-react";
877
1072
 
878
1073
  // src/Combobox.css
879
1074
  styleInject("@layer components {\n .cfi-ui-combobox {\n position: relative;\n display: inline-flex;\n align-items: center;\n }\n .cfi-ui-combobox--full {\n display: flex;\n width: 100%;\n }\n :where(.cfi-ui-combobox__trigger) {\n display: inline-flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--cfi-ui-space-sm);\n width: 100%;\n height: var(--cfi-ui-control-height-md);\n padding-inline: 0.625rem;\n background: var(--cfi-ui-surface);\n color: var(--cfi-ui-content);\n border: 1px solid var(--cfi-ui-border-strong);\n border-radius: var(--cfi-ui-radius-md);\n font-family: inherit;\n font-size: var(--cfi-ui-text-sm);\n line-height: normal;\n cursor: pointer;\n transition: border-color var(--cfi-ui-transition-fast);\n }\n .cfi-ui-combobox__trigger:hover:not(:disabled) {\n border-color: var(--cfi-ui-content-subtle);\n }\n .cfi-ui-combobox__trigger:disabled {\n background: var(--cfi-ui-surface-disabled);\n color: var(--cfi-ui-content-disabled);\n cursor: not-allowed;\n }\n .cfi-ui-combobox__trigger[data-invalid] {\n border-color: var(--cfi-ui-error);\n }\n .cfi-ui-combobox__trigger[data-size=sm] {\n height: var(--cfi-ui-control-height-sm);\n padding-inline: 0.5rem;\n font-size: var(--cfi-ui-text-xs);\n }\n .cfi-ui-combobox__trigger[data-size=lg] {\n height: var(--cfi-ui-control-height-lg);\n padding-inline: 0.875rem;\n font-size: var(--cfi-ui-text-base);\n }\n .cfi-ui-combobox__trigger[data-placeholder] .cfi-ui-combobox__value {\n color: var(--cfi-ui-content-muted);\n }\n .cfi-ui-combobox__value {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-align: left;\n }\n .cfi-ui-combobox__chevron {\n display: inline-flex;\n flex: none;\n color: var(--cfi-ui-content-muted);\n }\n .cfi-ui-combobox__chevron > svg,\n .cfi-ui-combobox__clear > svg {\n width: 0.875rem;\n height: 0.875rem;\n display: block;\n }\n .cfi-ui-combobox__clear {\n position: absolute;\n right: 1.75rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.25rem;\n height: 1.25rem;\n padding: 0;\n border: 0;\n border-radius: var(--cfi-ui-radius-sm);\n background: transparent;\n color: var(--cfi-ui-content-muted);\n cursor: pointer;\n }\n .cfi-ui-combobox__clear:hover {\n background: var(--cfi-ui-surface-active);\n color: var(--cfi-ui-content);\n }\n .cfi-ui-combobox__panel {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n max-height: min(22rem, var(--radix-popover-content-available-height, 22rem));\n }\n .cfi-ui-combobox__search {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--cfi-ui-space-sm);\n padding: var(--cfi-ui-space-sm);\n border-bottom: 1px solid var(--cfi-ui-border);\n color: var(--cfi-ui-content-muted);\n }\n .cfi-ui-combobox__search > svg {\n width: 0.875rem;\n height: 0.875rem;\n flex: none;\n }\n .cfi-ui-combobox__search input {\n flex: 1 1 auto;\n min-width: 0;\n border: 0;\n background: transparent;\n color: var(--cfi-ui-content);\n font-family: inherit;\n font-size: var(--cfi-ui-text-sm);\n outline: none;\n }\n .cfi-ui-combobox__search input::placeholder {\n color: var(--cfi-ui-content-muted);\n }\n .cfi-ui-combobox__list {\n flex: 1 1 auto;\n min-height: 0;\n overflow-y: auto;\n padding: var(--cfi-ui-space-xs);\n }\n .cfi-ui-combobox__option {\n align-items: flex-start;\n }\n .cfi-ui-combobox__option > .cfi-ui-select-item__indicator {\n padding-top: 0.125rem;\n }\n .cfi-ui-combobox__option-text {\n display: grid;\n gap: var(--cfi-ui-space-3xs);\n min-width: 0;\n }\n .cfi-ui-combobox__option-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .cfi-ui-combobox__option-hint {\n font-size: var(--cfi-ui-text-xs);\n color: var(--cfi-ui-content-muted);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n}\n");
880
1075
 
881
1076
  // src/Combobox.tsx
882
- import { jsx as jsx12, jsxs as jsxs12 } from "react/jsx-runtime";
1077
+ import { jsx as jsx15, jsxs as jsxs15 } from "react/jsx-runtime";
883
1078
  function Combobox({
884
1079
  options,
885
1080
  value,
@@ -901,13 +1096,13 @@ function Combobox({
901
1096
  fullWidth = true,
902
1097
  ...aria
903
1098
  }) {
904
- const [open, setOpen] = useState2(false);
905
- const [search, setSearch] = useState2("");
906
- const [highlighted, setHighlighted] = useState2(0);
1099
+ const [open, setOpen] = useState3(false);
1100
+ const [search, setSearch] = useState3("");
1101
+ const [highlighted, setHighlighted] = useState3(0);
907
1102
  const listId = useId2();
908
1103
  const searchRef = useRef(null);
909
1104
  const listRef = useRef(null);
910
- const filtered = useMemo2(() => {
1105
+ const filtered = useMemo3(() => {
911
1106
  if (onSearchChange) return options;
912
1107
  const q = search.trim().toLowerCase();
913
1108
  if (!q) return options;
@@ -961,14 +1156,14 @@ function Combobox({
961
1156
  setHighlighted(0);
962
1157
  onSearchChange?.(next);
963
1158
  }
964
- return /* @__PURE__ */ jsxs12(PopoverRoot, { open, onOpenChange: setOpen, children: [
965
- /* @__PURE__ */ jsx12(PopoverAnchor, { asChild: true, children: /* @__PURE__ */ jsxs12(
1159
+ return /* @__PURE__ */ jsxs15(PopoverRoot, { open, onOpenChange: setOpen, children: [
1160
+ /* @__PURE__ */ jsx15(PopoverAnchor, { asChild: true, children: /* @__PURE__ */ jsxs15(
966
1161
  "div",
967
1162
  {
968
1163
  style,
969
1164
  className: cn("cfi-ui", "cfi-ui-combobox", fullWidth && "cfi-ui-combobox--full", className),
970
1165
  children: [
971
- /* @__PURE__ */ jsxs12(
1166
+ /* @__PURE__ */ jsxs15(
972
1167
  "button",
973
1168
  {
974
1169
  type: "button",
@@ -985,12 +1180,12 @@ function Combobox({
985
1180
  onClick: () => setOpen((o) => !o),
986
1181
  ...aria,
987
1182
  children: [
988
- /* @__PURE__ */ jsx12("span", { className: "cfi-ui-combobox__value", children: selected ? selected.label : placeholder }),
989
- /* @__PURE__ */ jsx12("span", { className: "cfi-ui-combobox__chevron", "aria-hidden": "true", children: /* @__PURE__ */ jsx12(ChevronDown2, {}) })
1183
+ /* @__PURE__ */ jsx15("span", { className: "cfi-ui-combobox__value", children: selected ? selected.label : placeholder }),
1184
+ /* @__PURE__ */ jsx15("span", { className: "cfi-ui-combobox__chevron", "aria-hidden": "true", children: /* @__PURE__ */ jsx15(ChevronDown3, {}) })
990
1185
  ]
991
1186
  }
992
1187
  ),
993
- clearable && selected && !disabled && /* @__PURE__ */ jsx12(
1188
+ clearable && selected && !disabled && /* @__PURE__ */ jsx15(
994
1189
  "button",
995
1190
  {
996
1191
  type: "button",
@@ -998,14 +1193,14 @@ function Combobox({
998
1193
  "aria-label": `Clear ${selected.label}`,
999
1194
  title: "Clear",
1000
1195
  onClick: () => onValueChange(null),
1001
- children: /* @__PURE__ */ jsx12(X2, { "aria-hidden": "true" })
1196
+ children: /* @__PURE__ */ jsx15(X3, { "aria-hidden": "true" })
1002
1197
  }
1003
1198
  ),
1004
- name && /* @__PURE__ */ jsx12("input", { type: "hidden", name, value: value ?? "" })
1199
+ name && /* @__PURE__ */ jsx15("input", { type: "hidden", name, value: value ?? "" })
1005
1200
  ]
1006
1201
  }
1007
1202
  ) }),
1008
- /* @__PURE__ */ jsxs12(
1203
+ /* @__PURE__ */ jsxs15(
1009
1204
  PopoverContent,
1010
1205
  {
1011
1206
  flush: true,
@@ -1017,9 +1212,9 @@ function Combobox({
1017
1212
  },
1018
1213
  style: { width: "var(--radix-popover-trigger-width)" },
1019
1214
  children: [
1020
- /* @__PURE__ */ jsxs12("div", { className: "cfi-ui-combobox__search", children: [
1021
- /* @__PURE__ */ jsx12(Search, { "aria-hidden": "true" }),
1022
- /* @__PURE__ */ jsx12(
1215
+ /* @__PURE__ */ jsxs15("div", { className: "cfi-ui-combobox__search", children: [
1216
+ /* @__PURE__ */ jsx15(Search, { "aria-hidden": "true" }),
1217
+ /* @__PURE__ */ jsx15(
1023
1218
  "input",
1024
1219
  {
1025
1220
  ref: searchRef,
@@ -1035,7 +1230,7 @@ function Combobox({
1035
1230
  }
1036
1231
  )
1037
1232
  ] }),
1038
- /* @__PURE__ */ jsx12(
1233
+ /* @__PURE__ */ jsx15(
1039
1234
  "div",
1040
1235
  {
1041
1236
  ref: listRef,
@@ -1043,10 +1238,10 @@ function Combobox({
1043
1238
  role: "listbox",
1044
1239
  "aria-busy": loading || void 0,
1045
1240
  className: "cfi-ui-combobox__list",
1046
- children: loading ? /* @__PURE__ */ jsx12("p", { className: "cfi-ui-select-empty", children: loadingLabel }) : filtered.length === 0 ? /* @__PURE__ */ jsx12("p", { className: "cfi-ui-select-empty", children: emptyLabel }) : filtered.map((option) => {
1241
+ children: loading ? /* @__PURE__ */ jsx15("p", { className: "cfi-ui-select-empty", children: loadingLabel }) : filtered.length === 0 ? /* @__PURE__ */ jsx15("p", { className: "cfi-ui-select-empty", children: emptyLabel }) : filtered.map((option) => {
1047
1242
  const index = selectable.indexOf(option);
1048
1243
  const isHighlighted = index !== -1 && index === highlighted;
1049
- return /* @__PURE__ */ jsxs12(
1244
+ return /* @__PURE__ */ jsxs15(
1050
1245
  "div",
1051
1246
  {
1052
1247
  id: `${listId}-${option.value}`,
@@ -1059,10 +1254,10 @@ function Combobox({
1059
1254
  onClick: () => !option.disabled && commit(option),
1060
1255
  onPointerMove: () => index !== -1 && setHighlighted(index),
1061
1256
  children: [
1062
- /* @__PURE__ */ jsx12("span", { className: "cfi-ui-select-item__indicator", children: option.value === value && /* @__PURE__ */ jsx12(Check4, { "aria-hidden": "true" }) }),
1063
- /* @__PURE__ */ jsxs12("span", { className: "cfi-ui-combobox__option-text", children: [
1064
- /* @__PURE__ */ jsx12("span", { className: "cfi-ui-combobox__option-label", children: option.label }),
1065
- option.hint && /* @__PURE__ */ jsx12("span", { className: "cfi-ui-combobox__option-hint", children: option.hint })
1257
+ /* @__PURE__ */ jsx15("span", { className: "cfi-ui-select-item__indicator", children: option.value === value && /* @__PURE__ */ jsx15(Check4, { "aria-hidden": "true" }) }),
1258
+ /* @__PURE__ */ jsxs15("span", { className: "cfi-ui-combobox__option-text", children: [
1259
+ /* @__PURE__ */ jsx15("span", { className: "cfi-ui-combobox__option-label", children: option.label }),
1260
+ option.hint && /* @__PURE__ */ jsx15("span", { className: "cfi-ui-combobox__option-hint", children: option.hint })
1066
1261
  ] })
1067
1262
  ]
1068
1263
  },
@@ -1078,14 +1273,14 @@ function Combobox({
1078
1273
  }
1079
1274
 
1080
1275
  // src/Tooltip.tsx
1081
- import { forwardRef as forwardRef10 } from "react";
1276
+ import { forwardRef as forwardRef12 } from "react";
1082
1277
  import * as RadixTooltip from "@radix-ui/react-tooltip";
1083
- import { Fragment as Fragment3, jsx as jsx13, jsxs as jsxs13 } from "react/jsx-runtime";
1278
+ import { Fragment as Fragment3, jsx as jsx16, jsxs as jsxs16 } from "react/jsx-runtime";
1084
1279
  var TooltipProvider = RadixTooltip.Provider;
1085
1280
  var TooltipRoot = RadixTooltip.Root;
1086
1281
  var TooltipTrigger = RadixTooltip.Trigger;
1087
- var TooltipContent = forwardRef10(function TooltipContent2({ className, children, sideOffset = 5, ...rest }, ref) {
1088
- return /* @__PURE__ */ jsx13(RadixTooltip.Portal, { children: /* @__PURE__ */ jsxs13(
1282
+ var TooltipContent = forwardRef12(function TooltipContent2({ className, children, sideOffset = 5, ...rest }, ref) {
1283
+ return /* @__PURE__ */ jsx16(RadixTooltip.Portal, { children: /* @__PURE__ */ jsxs16(
1089
1284
  RadixTooltip.Content,
1090
1285
  {
1091
1286
  ref,
@@ -1096,28 +1291,28 @@ var TooltipContent = forwardRef10(function TooltipContent2({ className, children
1096
1291
  ...rest,
1097
1292
  children: [
1098
1293
  children,
1099
- /* @__PURE__ */ jsx13(RadixTooltip.Arrow, { className: "cfi-ui-tooltip__arrow", width: 10, height: 4 })
1294
+ /* @__PURE__ */ jsx16(RadixTooltip.Arrow, { className: "cfi-ui-tooltip__arrow", width: 10, height: 4 })
1100
1295
  ]
1101
1296
  }
1102
1297
  ) });
1103
1298
  });
1104
1299
  function Tooltip({ content, side = "top", align = "center", delay = 300, disabled, children }) {
1105
- if (disabled || content == null || content === "") return /* @__PURE__ */ jsx13(Fragment3, { children });
1106
- return /* @__PURE__ */ jsx13(RadixTooltip.Provider, { delayDuration: delay, children: /* @__PURE__ */ jsxs13(TooltipRoot, { children: [
1107
- /* @__PURE__ */ jsx13(TooltipTrigger, { asChild: true, children }),
1108
- /* @__PURE__ */ jsx13(TooltipContent, { side, align, children: content })
1300
+ if (disabled || content == null || content === "") return /* @__PURE__ */ jsx16(Fragment3, { children });
1301
+ return /* @__PURE__ */ jsx16(RadixTooltip.Provider, { delayDuration: delay, children: /* @__PURE__ */ jsxs16(TooltipRoot, { children: [
1302
+ /* @__PURE__ */ jsx16(TooltipTrigger, { asChild: true, children }),
1303
+ /* @__PURE__ */ jsx16(TooltipContent, { side, align, children: content })
1109
1304
  ] }) });
1110
1305
  }
1111
1306
 
1112
1307
  // src/Toast.tsx
1113
- import { createContext as createContext2, useCallback, useContext as useContext2, useEffect as useEffect2, useMemo as useMemo3, useRef as useRef2, useState as useState3 } from "react";
1114
- import { AlertTriangle, CheckCircle2, Info, X as X3, XCircle } from "lucide-react";
1308
+ import { createContext as createContext2, useCallback, useContext as useContext2, useEffect as useEffect2, useMemo as useMemo4, useRef as useRef2, useState as useState4 } from "react";
1309
+ import { AlertTriangle, CheckCircle2, Info, X as X4, XCircle } from "lucide-react";
1115
1310
 
1116
1311
  // src/Toast.css
1117
1312
  styleInject("@layer components {\n .cfi-ui-toast-viewport {\n position: fixed;\n z-index: var(--cfi-ui-z-toast);\n display: flex;\n flex-direction: column;\n gap: var(--cfi-ui-space-sm);\n width: min(24rem, calc(100vw - 2 * var(--cfi-ui-space-md)));\n pointer-events: none;\n }\n .cfi-ui-toast-viewport[data-position=bottom-right] {\n right: var(--cfi-ui-space-md);\n bottom: var(--cfi-ui-space-md);\n }\n .cfi-ui-toast-viewport[data-position=top-right] {\n right: var(--cfi-ui-space-md);\n top: calc(var(--cfi-shell-header-height, 48px) + var(--cfi-ui-space-md));\n flex-direction: column-reverse;\n }\n .cfi-ui-toast-viewport[data-position=bottom-center] {\n left: 50%;\n bottom: var(--cfi-ui-space-md);\n transform: translateX(-50%);\n }\n .cfi-ui-toast-viewport[data-position=top-center] {\n left: 50%;\n top: calc(var(--cfi-shell-header-height, 48px) + var(--cfi-ui-space-md));\n transform: translateX(-50%);\n flex-direction: column-reverse;\n }\n .cfi-ui-toast {\n pointer-events: auto;\n display: grid;\n grid-template-columns: auto 1fr auto;\n gap: var(--cfi-ui-space-sm);\n align-items: start;\n padding: var(--cfi-ui-space-sm) var(--cfi-ui-space-sm) var(--cfi-ui-space-sm) var(--cfi-ui-space-md);\n background: var(--cfi-ui-surface-raised);\n color: var(--cfi-ui-content);\n border: 1px solid var(--cfi-ui-border);\n border-left: 3px solid var(--cfi-ui-border-strong);\n border-radius: var(--cfi-ui-radius-md);\n box-shadow: var(--cfi-ui-shadow-lg);\n font-family: var(--cfi-ui-font);\n animation: cfi-ui-zoom-in var(--cfi-ui-transition-base);\n }\n .cfi-ui-toast[data-tone=success] {\n border-left-color: var(--cfi-ui-success);\n }\n .cfi-ui-toast[data-tone=warning] {\n border-left-color: var(--cfi-ui-warning);\n }\n .cfi-ui-toast[data-tone=error] {\n border-left-color: var(--cfi-ui-error);\n }\n .cfi-ui-toast[data-tone=info] {\n border-left-color: var(--cfi-ui-info);\n }\n .cfi-ui-toast__icon {\n display: inline-flex;\n flex: none;\n padding-top: 0.0625rem;\n color: var(--cfi-ui-content-muted);\n }\n .cfi-ui-toast[data-tone=success] .cfi-ui-toast__icon {\n color: var(--cfi-ui-success-text);\n }\n .cfi-ui-toast[data-tone=warning] .cfi-ui-toast__icon {\n color: var(--cfi-ui-warning-text);\n }\n .cfi-ui-toast[data-tone=error] .cfi-ui-toast__icon {\n color: var(--cfi-ui-error-text);\n }\n .cfi-ui-toast[data-tone=info] .cfi-ui-toast__icon {\n color: var(--cfi-ui-info-text);\n }\n .cfi-ui-toast__icon > svg {\n width: 1rem;\n height: 1rem;\n display: block;\n }\n .cfi-ui-toast__text {\n display: grid;\n gap: var(--cfi-ui-space-3xs);\n min-width: 0;\n }\n .cfi-ui-toast__title {\n margin: 0;\n font-size: var(--cfi-ui-text-sm);\n font-weight: var(--cfi-ui-weight-medium);\n line-height: var(--cfi-ui-leading-normal);\n }\n .cfi-ui-toast__description {\n margin: 0;\n font-size: var(--cfi-ui-text-xs);\n line-height: var(--cfi-ui-leading-normal);\n color: var(--cfi-ui-content-muted);\n overflow-wrap: anywhere;\n }\n .cfi-ui-toast__action {\n justify-self: start;\n margin-top: var(--cfi-ui-space-xs);\n padding: 0;\n border: 0;\n background: none;\n color: var(--cfi-ui-content-link);\n font-family: inherit;\n font-size: var(--cfi-ui-text-xs);\n font-weight: var(--cfi-ui-weight-medium);\n text-decoration: underline;\n text-underline-offset: 2px;\n cursor: pointer;\n }\n .cfi-ui-toast__close {\n flex: none;\n color: var(--cfi-ui-content-muted);\n }\n}\n");
1118
1313
 
1119
1314
  // src/Toast.tsx
1120
- import { jsx as jsx14, jsxs as jsxs14 } from "react/jsx-runtime";
1315
+ import { jsx as jsx17, jsxs as jsxs17 } from "react/jsx-runtime";
1121
1316
  var ToastContext = createContext2(null);
1122
1317
  function useToast() {
1123
1318
  const api = useContext2(ToastContext);
@@ -1130,7 +1325,7 @@ function ToastProvider({
1130
1325
  max = 4,
1131
1326
  position = "bottom-right"
1132
1327
  }) {
1133
- const [items, setItems] = useState3([]);
1328
+ const [items, setItems] = useState4([]);
1134
1329
  const nextId = useRef2(1);
1135
1330
  const timers = useRef2(/* @__PURE__ */ new Map());
1136
1331
  const dismiss = useCallback((id) => {
@@ -1164,7 +1359,7 @@ function ToastProvider({
1164
1359
  pending.clear();
1165
1360
  };
1166
1361
  }, []);
1167
- const api = useMemo3(
1362
+ const api = useMemo4(
1168
1363
  () => ({
1169
1364
  toast,
1170
1365
  dismiss,
@@ -1175,24 +1370,24 @@ function ToastProvider({
1175
1370
  }),
1176
1371
  [toast, dismiss]
1177
1372
  );
1178
- return /* @__PURE__ */ jsxs14(ToastContext.Provider, { value: api, children: [
1373
+ return /* @__PURE__ */ jsxs17(ToastContext.Provider, { value: api, children: [
1179
1374
  children,
1180
- /* @__PURE__ */ jsx14(ToastViewport, { items, onDismiss: dismiss, position })
1375
+ /* @__PURE__ */ jsx17(ToastViewport, { items, onDismiss: dismiss, position })
1181
1376
  ] });
1182
1377
  }
1183
1378
  var TONE_ICON = {
1184
- neutral: /* @__PURE__ */ jsx14(Info, {}),
1185
- info: /* @__PURE__ */ jsx14(Info, {}),
1186
- success: /* @__PURE__ */ jsx14(CheckCircle2, {}),
1187
- warning: /* @__PURE__ */ jsx14(AlertTriangle, {}),
1188
- error: /* @__PURE__ */ jsx14(XCircle, {})
1379
+ neutral: /* @__PURE__ */ jsx17(Info, {}),
1380
+ info: /* @__PURE__ */ jsx17(Info, {}),
1381
+ success: /* @__PURE__ */ jsx17(CheckCircle2, {}),
1382
+ warning: /* @__PURE__ */ jsx17(AlertTriangle, {}),
1383
+ error: /* @__PURE__ */ jsx17(XCircle, {})
1189
1384
  };
1190
1385
  function ToastViewport({
1191
1386
  items,
1192
1387
  onDismiss,
1193
1388
  position
1194
1389
  }) {
1195
- return /* @__PURE__ */ jsx14(
1390
+ return /* @__PURE__ */ jsx17(
1196
1391
  "div",
1197
1392
  {
1198
1393
  role: "region",
@@ -1201,12 +1396,12 @@ function ToastViewport({
1201
1396
  "data-position": position,
1202
1397
  "data-cfi-ui-portal": "",
1203
1398
  className: cn("cfi-ui", "cfi-ui-toast-viewport"),
1204
- children: items.map((item) => /* @__PURE__ */ jsxs14("div", { "data-tone": item.tone, className: "cfi-ui-toast", children: [
1205
- /* @__PURE__ */ jsx14("span", { className: "cfi-ui-toast__icon", "aria-hidden": "true", children: TONE_ICON[item.tone ?? "neutral"] }),
1206
- /* @__PURE__ */ jsxs14("div", { className: "cfi-ui-toast__text", children: [
1207
- /* @__PURE__ */ jsx14("p", { className: "cfi-ui-toast__title", children: item.title }),
1208
- item.description && /* @__PURE__ */ jsx14("p", { className: "cfi-ui-toast__description", children: item.description }),
1209
- item.action && /* @__PURE__ */ jsx14(
1399
+ children: items.map((item) => /* @__PURE__ */ jsxs17("div", { "data-tone": item.tone, className: "cfi-ui-toast", children: [
1400
+ /* @__PURE__ */ jsx17("span", { className: "cfi-ui-toast__icon", "aria-hidden": "true", children: TONE_ICON[item.tone ?? "neutral"] }),
1401
+ /* @__PURE__ */ jsxs17("div", { className: "cfi-ui-toast__text", children: [
1402
+ /* @__PURE__ */ jsx17("p", { className: "cfi-ui-toast__title", children: item.title }),
1403
+ item.description && /* @__PURE__ */ jsx17("p", { className: "cfi-ui-toast__description", children: item.description }),
1404
+ item.action && /* @__PURE__ */ jsx17(
1210
1405
  "button",
1211
1406
  {
1212
1407
  type: "button",
@@ -1219,12 +1414,12 @@ function ToastViewport({
1219
1414
  }
1220
1415
  )
1221
1416
  ] }),
1222
- /* @__PURE__ */ jsx14(
1417
+ /* @__PURE__ */ jsx17(
1223
1418
  IconButton,
1224
1419
  {
1225
1420
  variant: "ghost",
1226
1421
  size: "sm",
1227
- icon: /* @__PURE__ */ jsx14(X3, {}),
1422
+ icon: /* @__PURE__ */ jsx17(X4, {}),
1228
1423
  label: "Dismiss",
1229
1424
  className: "cfi-ui-toast__close",
1230
1425
  onClick: () => onDismiss(item.id)
@@ -1236,15 +1431,15 @@ function ToastViewport({
1236
1431
  }
1237
1432
 
1238
1433
  // src/Card.tsx
1239
- import { forwardRef as forwardRef11 } from "react";
1434
+ import { forwardRef as forwardRef13 } from "react";
1240
1435
 
1241
1436
  // src/Card.css
1242
1437
  styleInject("@layer components {\n :where(.cfi-ui-card) {\n display: flex;\n flex-direction: column;\n min-width: 0;\n background: var(--cfi-ui-surface);\n color: var(--cfi-ui-content);\n border: 1px solid var(--cfi-ui-border);\n border-radius: var(--cfi-ui-radius-xl);\n box-shadow: var(--cfi-ui-shadow-xs);\n font-size: var(--cfi-ui-text-sm);\n }\n .cfi-ui-card[data-variant=outline] {\n box-shadow: none;\n }\n .cfi-ui-card[data-variant=plain] {\n border-color: transparent;\n box-shadow: none;\n background: transparent;\n }\n .cfi-ui-card[data-interactive] {\n cursor: pointer;\n transition: border-color var(--cfi-ui-transition-fast), box-shadow var(--cfi-ui-transition-fast);\n }\n .cfi-ui-card[data-interactive]:hover {\n border-color: var(--cfi-ui-border-strong);\n box-shadow: var(--cfi-ui-shadow-md);\n }\n :where(.cfi-ui-card__header) {\n flex: none;\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: var(--cfi-ui-space-md);\n padding: var(--cfi-ui-space-md);\n border-bottom: 1px solid var(--cfi-ui-border);\n }\n .cfi-ui-card__heading {\n display: grid;\n gap: var(--cfi-ui-space-3xs);\n min-width: 0;\n }\n .cfi-ui-card__actions {\n display: flex;\n align-items: center;\n gap: var(--cfi-ui-space-xs);\n flex: none;\n }\n :where(.cfi-ui-card__title) {\n margin: 0;\n font-size: var(--cfi-ui-text-sm);\n font-weight: var(--cfi-ui-weight-semibold);\n line-height: var(--cfi-ui-leading-snug);\n color: var(--cfi-ui-content);\n text-wrap: balance;\n }\n .cfi-ui-card__description {\n flex-basis: 100%;\n margin: 0;\n font-size: var(--cfi-ui-text-xs);\n line-height: var(--cfi-ui-leading-normal);\n color: var(--cfi-ui-content-muted);\n }\n :where(.cfi-ui-card__body) {\n flex: 1 1 auto;\n min-width: 0;\n padding: var(--cfi-ui-space-md);\n }\n .cfi-ui-card[data-flush] > .cfi-ui-card__body {\n padding: 0;\n }\n .cfi-ui-card[data-flush] > .cfi-ui-card__body:last-child {\n overflow: hidden;\n border-bottom-left-radius: var(--cfi-ui-radius-lg);\n border-bottom-right-radius: var(--cfi-ui-radius-lg);\n }\n :where(.cfi-ui-card__footer) {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--cfi-ui-space-sm);\n padding: var(--cfi-ui-space-sm) var(--cfi-ui-space-md);\n border-top: 1px solid var(--cfi-ui-border);\n background: var(--cfi-ui-surface-sunken);\n border-bottom-left-radius: var(--cfi-ui-radius-lg);\n border-bottom-right-radius: var(--cfi-ui-radius-lg);\n font-size: var(--cfi-ui-text-xs);\n color: var(--cfi-ui-content-muted);\n }\n}\n");
1243
1438
 
1244
1439
  // src/Card.tsx
1245
- import { jsx as jsx15, jsxs as jsxs15 } from "react/jsx-runtime";
1246
- var Card = forwardRef11(function Card2({ variant = "default", flush = false, interactive = false, className, ...rest }, ref) {
1247
- return /* @__PURE__ */ jsx15(
1440
+ import { jsx as jsx18, jsxs as jsxs18 } from "react/jsx-runtime";
1441
+ var Card = forwardRef13(function Card2({ variant = "default", flush = false, interactive = false, className, ...rest }, ref) {
1442
+ return /* @__PURE__ */ jsx18(
1248
1443
  "div",
1249
1444
  {
1250
1445
  ref,
@@ -1257,65 +1452,35 @@ var Card = forwardRef11(function Card2({ variant = "default", flush = false, int
1257
1452
  );
1258
1453
  });
1259
1454
  function CardHeader({ actions, className, children, ...rest }) {
1260
- return /* @__PURE__ */ jsxs15("div", { className: cn("cfi-ui-card__header", className), ...rest, children: [
1261
- actions ? /* @__PURE__ */ jsx15("div", { className: "cfi-ui-card__heading", children }) : children,
1262
- actions && /* @__PURE__ */ jsx15("div", { className: "cfi-ui-card__actions", children: actions })
1455
+ return /* @__PURE__ */ jsxs18("div", { className: cn("cfi-ui-card__header", className), ...rest, children: [
1456
+ actions ? /* @__PURE__ */ jsx18("div", { className: "cfi-ui-card__heading", children }) : children,
1457
+ actions && /* @__PURE__ */ jsx18("div", { className: "cfi-ui-card__actions", children: actions })
1263
1458
  ] });
1264
1459
  }
1265
1460
  function CardTitle({ as: Tag = "h3", className, ...rest }) {
1266
- return /* @__PURE__ */ jsx15(Tag, { className: cn("cfi-ui-card__title", className), ...rest });
1461
+ return /* @__PURE__ */ jsx18(Tag, { className: cn("cfi-ui-card__title", className), ...rest });
1267
1462
  }
1268
1463
  function CardDescription({ className, ...rest }) {
1269
- return /* @__PURE__ */ jsx15("p", { className: cn("cfi-ui-card__description", className), ...rest });
1464
+ return /* @__PURE__ */ jsx18("p", { className: cn("cfi-ui-card__description", className), ...rest });
1270
1465
  }
1271
1466
  function CardBody({ className, ...rest }) {
1272
- return /* @__PURE__ */ jsx15("div", { className: cn("cfi-ui-card__body", className), ...rest });
1467
+ return /* @__PURE__ */ jsx18("div", { className: cn("cfi-ui-card__body", className), ...rest });
1273
1468
  }
1274
1469
  function CardFooter({ className, ...rest }) {
1275
- return /* @__PURE__ */ jsx15("div", { className: cn("cfi-ui-card__footer", className), ...rest });
1470
+ return /* @__PURE__ */ jsx18("div", { className: cn("cfi-ui-card__footer", className), ...rest });
1276
1471
  }
1277
1472
 
1278
- // src/Badge.tsx
1279
- import { forwardRef as forwardRef12 } from "react";
1280
-
1281
- // src/Badge.css
1282
- styleInject("@layer components {\n :where(.cfi-ui-badge) {\n display: inline-flex;\n align-items: center;\n gap: var(--cfi-ui-space-xs);\n padding: 0.125rem 0.5rem;\n border: 1px solid transparent;\n border-radius: var(--cfi-ui-radius-full);\n font-size: var(--cfi-ui-text-xs);\n font-weight: var(--cfi-ui-weight-medium);\n line-height: 1.4;\n white-space: nowrap;\n vertical-align: middle;\n }\n .cfi-ui-badge[data-size=sm] {\n padding: 0 0.375rem;\n font-size: 0.6875rem;\n }\n .cfi-ui-badge__dot {\n flex: none;\n width: 0.375rem;\n height: 0.375rem;\n border-radius: var(--cfi-ui-radius-full);\n background: currentColor;\n }\n .cfi-ui-badge__icon {\n display: inline-flex;\n flex: none;\n }\n .cfi-ui-badge__icon > svg {\n width: 0.75rem;\n height: 0.75rem;\n display: block;\n }\n .cfi-ui-badge--count {\n justify-content: center;\n min-width: 1.25rem;\n padding-inline: 0.375rem;\n font-variant-numeric: tabular-nums;\n }\n .cfi-ui-badge[data-variant=soft][data-tone=neutral] {\n background: var(--cfi-ui-neutral-soft);\n color: var(--cfi-ui-neutral-text);\n }\n .cfi-ui-badge[data-variant=soft][data-tone=success] {\n background: var(--cfi-ui-success-soft);\n color: var(--cfi-ui-success-text);\n }\n .cfi-ui-badge[data-variant=soft][data-tone=warning] {\n background: var(--cfi-ui-warning-soft);\n color: var(--cfi-ui-warning-text);\n }\n .cfi-ui-badge[data-variant=soft][data-tone=error] {\n background: var(--cfi-ui-error-soft);\n color: var(--cfi-ui-error-text);\n }\n .cfi-ui-badge[data-variant=soft][data-tone=info] {\n background: var(--cfi-ui-info-soft);\n color: var(--cfi-ui-info-text);\n }\n .cfi-ui-badge[data-variant=soft][data-tone=accent] {\n background: var(--cfi-ui-accent-soft);\n color: var(--cfi-ui-accent-hover);\n }\n .cfi-ui-badge[data-variant=solid] {\n color: var(--cfi-ui-content-inverse);\n }\n .cfi-ui-badge[data-variant=solid][data-tone=neutral] {\n background: var(--cfi-ui-content-muted);\n }\n .cfi-ui-badge[data-variant=solid][data-tone=success] {\n background: var(--cfi-ui-success-text);\n }\n .cfi-ui-badge[data-variant=solid][data-tone=warning] {\n background: var(--cfi-ui-warning-text);\n }\n .cfi-ui-badge[data-variant=solid][data-tone=error] {\n background: var(--cfi-ui-error-text);\n }\n .cfi-ui-badge[data-variant=solid][data-tone=info] {\n background: var(--cfi-ui-info-text);\n }\n .cfi-ui-badge[data-variant=solid][data-tone=accent] {\n background: var(--cfi-ui-accent);\n color: var(--cfi-ui-accent-fg);\n }\n .cfi-ui-badge[data-variant=outline] {\n background: transparent;\n }\n .cfi-ui-badge[data-variant=outline][data-tone=neutral] {\n border-color: var(--cfi-ui-neutral-border);\n color: var(--cfi-ui-neutral-text);\n }\n .cfi-ui-badge[data-variant=outline][data-tone=success] {\n border-color: var(--cfi-ui-success-border);\n color: var(--cfi-ui-success-text);\n }\n .cfi-ui-badge[data-variant=outline][data-tone=warning] {\n border-color: var(--cfi-ui-warning-border);\n color: var(--cfi-ui-warning-text);\n }\n .cfi-ui-badge[data-variant=outline][data-tone=error] {\n border-color: var(--cfi-ui-error-border);\n color: var(--cfi-ui-error-text);\n }\n .cfi-ui-badge[data-variant=outline][data-tone=info] {\n border-color: var(--cfi-ui-info-border);\n color: var(--cfi-ui-info-text);\n }\n .cfi-ui-badge[data-variant=outline][data-tone=accent] {\n border-color: var(--cfi-ui-accent);\n color: var(--cfi-ui-accent-hover);\n }\n}\n");
1283
-
1284
- // src/Badge.tsx
1285
- import { jsx as jsx16, jsxs as jsxs16 } from "react/jsx-runtime";
1286
- var Badge = forwardRef12(function Badge2({ tone = "neutral", variant = "soft", size = "md", dot = false, icon, className, children, ...rest }, ref) {
1287
- return /* @__PURE__ */ jsxs16(
1288
- "span",
1289
- {
1290
- ref,
1291
- "data-tone": tone,
1292
- "data-variant": variant,
1293
- "data-size": size,
1294
- className: cn("cfi-ui", "cfi-ui-badge", className),
1295
- ...rest,
1296
- children: [
1297
- icon ? /* @__PURE__ */ jsx16("span", { className: "cfi-ui-badge__icon", children: icon }) : dot && /* @__PURE__ */ jsx16("span", { className: "cfi-ui-badge__dot", "aria-hidden": "true" }),
1298
- children
1299
- ]
1300
- }
1301
- );
1302
- });
1303
- var CountBadge = forwardRef12(function CountBadge2({ count, max = 99, hideZero = true, className, ...rest }, ref) {
1304
- if (count === 0 && hideZero) return null;
1305
- return /* @__PURE__ */ jsx16(Badge, { ref, className: cn("cfi-ui-badge--count", className), ...rest, children: count > max ? `${max}+` : count });
1306
- });
1307
-
1308
1473
  // src/Table.tsx
1309
- import { forwardRef as forwardRef13 } from "react";
1474
+ import { forwardRef as forwardRef14 } from "react";
1310
1475
  import { ArrowDown, ArrowUp, ChevronsUpDown } from "lucide-react";
1311
1476
 
1312
1477
  // src/Table.css
1313
1478
  styleInject("@layer components {\n :where(.cfi-ui-table-scroller) {\n width: 100%;\n overflow-x: auto;\n position: relative;\n }\n :where(.cfi-ui-table) {\n width: 100%;\n border-collapse: separate;\n border-spacing: 0;\n font-family: var(--cfi-ui-font);\n font-size: var(--cfi-ui-text-sm);\n color: var(--cfi-ui-content);\n text-align: left;\n }\n :where(.cfi-ui-table__th) {\n height: 2.75rem;\n padding: 0.5rem 0.75rem;\n border-bottom: 1px solid var(--cfi-ui-border);\n background: transparent;\n font-size: var(--cfi-ui-text-sm);\n font-weight: var(--cfi-ui-weight-medium);\n color: var(--cfi-ui-content);\n white-space: nowrap;\n text-align: left;\n vertical-align: middle;\n }\n .cfi-ui-table[data-density=compact] .cfi-ui-table__th {\n background: var(--cfi-ui-surface-sunken);\n font-size: var(--cfi-ui-text-xs);\n font-weight: var(--cfi-ui-weight-semibold);\n color: var(--cfi-ui-content-muted);\n border-bottom-color: var(--cfi-ui-border-strong);\n }\n .cfi-ui-table[data-sticky] .cfi-ui-table__th {\n position: sticky;\n top: 0;\n z-index: var(--cfi-ui-z-raised, 10);\n }\n .cfi-ui-table[data-sticky-col] .cfi-ui-table__th:first-child,\n .cfi-ui-table[data-sticky-col] .cfi-ui-table__td:first-child {\n position: sticky;\n left: 0;\n background: var(--cfi-ui-surface);\n box-shadow: 1px 0 0 0 var(--cfi-ui-border-subtle);\n }\n .cfi-ui-table[data-sticky-col] .cfi-ui-table__td:first-child {\n z-index: 1;\n }\n .cfi-ui-table[data-sticky-col] .cfi-ui-table__th:first-child {\n z-index: calc(var(--cfi-ui-z-raised, 10) + 1);\n }\n .cfi-ui-table[data-sticky-col] .cfi-ui-table__row[data-interactive]:hover .cfi-ui-table__td:first-child {\n background: var(--cfi-ui-surface-hover);\n }\n .cfi-ui-table[data-sticky-col] .cfi-ui-table__row[data-selected] .cfi-ui-table__td:first-child {\n background: var(--cfi-ui-surface-selected);\n }\n .cfi-ui-table__sort {\n display: inline-flex;\n align-items: center;\n gap: var(--cfi-ui-space-xs);\n margin: -0.125rem -0.25rem;\n padding: 0.125rem 0.25rem;\n border: 0;\n border-radius: var(--cfi-ui-radius-sm);\n background: none;\n color: inherit;\n font: inherit;\n cursor: pointer;\n }\n .cfi-ui-table__sort:hover {\n color: var(--cfi-ui-content);\n background: var(--cfi-ui-surface-active);\n }\n .cfi-ui-table__sort-icon {\n display: inline-flex;\n flex: none;\n opacity: 0.55;\n }\n .cfi-ui-table__th[aria-sort=ascending] .cfi-ui-table__sort-icon,\n .cfi-ui-table__th[aria-sort=descending] .cfi-ui-table__sort-icon {\n opacity: 1;\n color: var(--cfi-ui-accent);\n }\n .cfi-ui-table__sort-icon > svg {\n width: 0.75rem;\n height: 0.75rem;\n display: block;\n }\n :where(.cfi-ui-table__td) {\n padding: 0.5rem 0.75rem;\n border-bottom: 1px solid var(--cfi-ui-border-subtle);\n vertical-align: middle;\n }\n .cfi-ui-table[data-density=compact] .cfi-ui-table__td,\n .cfi-ui-table[data-density=compact] .cfi-ui-table__th {\n padding: 0.3125rem 0.625rem;\n }\n .cfi-ui-table__row[data-interactive] {\n cursor: pointer;\n }\n .cfi-ui-table__row[data-interactive]:hover .cfi-ui-table__td {\n background: var(--cfi-ui-surface-hover);\n }\n .cfi-ui-table__row[data-selected] .cfi-ui-table__td {\n background: var(--cfi-ui-surface-selected);\n }\n .cfi-ui-table__body .cfi-ui-table__row:last-child .cfi-ui-table__td {\n border-bottom: 0;\n }\n .cfi-ui-table__th[data-numeric],\n .cfi-ui-table__td[data-numeric] {\n text-align: right;\n font-variant-numeric: tabular-nums;\n }\n .cfi-ui-table__td[data-truncate] {\n max-width: 18rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .cfi-ui-table__foot .cfi-ui-table__td {\n border-top: 1px solid var(--cfi-ui-border-strong);\n border-bottom: 0;\n background: var(--cfi-ui-surface-sunken);\n font-weight: var(--cfi-ui-weight-semibold);\n }\n .cfi-ui-table__empty {\n padding: var(--cfi-ui-space-xl) var(--cfi-ui-space-md);\n border-bottom: 0;\n color: var(--cfi-ui-content-muted);\n text-align: center;\n }\n .cfi-ui-table__caption {\n padding: var(--cfi-ui-space-sm) 0;\n caption-side: bottom;\n font-size: var(--cfi-ui-text-xs);\n color: var(--cfi-ui-content-muted);\n text-align: left;\n }\n}\n");
1314
1479
 
1315
1480
  // src/Table.tsx
1316
- import { jsx as jsx17, jsxs as jsxs17 } from "react/jsx-runtime";
1317
- var Table = forwardRef13(function Table2({ density = "comfortable", stickyHeader = false, stickyFirstColumn = false, className, ...rest }, ref) {
1318
- return /* @__PURE__ */ jsx17(
1481
+ import { jsx as jsx19, jsxs as jsxs19 } from "react/jsx-runtime";
1482
+ var Table = forwardRef14(function Table2({ density = "comfortable", stickyHeader = false, stickyFirstColumn = false, className, ...rest }, ref) {
1483
+ return /* @__PURE__ */ jsx19(
1319
1484
  "table",
1320
1485
  {
1321
1486
  ref,
@@ -1328,20 +1493,20 @@ var Table = forwardRef13(function Table2({ density = "comfortable", stickyHeader
1328
1493
  );
1329
1494
  });
1330
1495
  function TableScroller({ className, ...rest }) {
1331
- return /* @__PURE__ */ jsx17("div", { className: cn("cfi-ui", "cfi-ui-table-scroller", className), ...rest });
1496
+ return /* @__PURE__ */ jsx19("div", { className: cn("cfi-ui", "cfi-ui-table-scroller", className), ...rest });
1332
1497
  }
1333
1498
  function TableHeader({ className, ...rest }) {
1334
- return /* @__PURE__ */ jsx17("thead", { className: cn("cfi-ui-table__head", className), ...rest });
1499
+ return /* @__PURE__ */ jsx19("thead", { className: cn("cfi-ui-table__head", className), ...rest });
1335
1500
  }
1336
1501
  function TableBody({ className, ...rest }) {
1337
- return /* @__PURE__ */ jsx17("tbody", { className: cn("cfi-ui-table__body", className), ...rest });
1502
+ return /* @__PURE__ */ jsx19("tbody", { className: cn("cfi-ui-table__body", className), ...rest });
1338
1503
  }
1339
1504
  function TableFooter({ className, ...rest }) {
1340
- return /* @__PURE__ */ jsx17("tfoot", { className: cn("cfi-ui-table__foot", className), ...rest });
1505
+ return /* @__PURE__ */ jsx19("tfoot", { className: cn("cfi-ui-table__foot", className), ...rest });
1341
1506
  }
1342
1507
  var TableFoot = TableFooter;
1343
1508
  function TableRow({ selected, interactive, className, ...rest }) {
1344
- return /* @__PURE__ */ jsx17(
1509
+ return /* @__PURE__ */ jsx19(
1345
1510
  "tr",
1346
1511
  {
1347
1512
  "data-selected": selected || void 0,
@@ -1364,7 +1529,7 @@ function TableHead({
1364
1529
  ...rest
1365
1530
  }) {
1366
1531
  const ariaSort = sortable ? sortDirection === "asc" ? "ascending" : sortDirection === "desc" ? "descending" : "none" : void 0;
1367
- return /* @__PURE__ */ jsx17(
1532
+ return /* @__PURE__ */ jsx19(
1368
1533
  "th",
1369
1534
  {
1370
1535
  scope: "col",
@@ -1373,15 +1538,15 @@ function TableHead({
1373
1538
  style: { width, ...style },
1374
1539
  className: cn("cfi-ui-table__th", className),
1375
1540
  ...rest,
1376
- children: sortable ? /* @__PURE__ */ jsxs17("button", { type: "button", className: "cfi-ui-table__sort", onClick: onSort, children: [
1377
- /* @__PURE__ */ jsx17("span", { children }),
1378
- /* @__PURE__ */ jsx17("span", { className: "cfi-ui-table__sort-icon", "aria-hidden": "true", children: sortDirection === "asc" ? /* @__PURE__ */ jsx17(ArrowUp, {}) : sortDirection === "desc" ? /* @__PURE__ */ jsx17(ArrowDown, {}) : /* @__PURE__ */ jsx17(ChevronsUpDown, {}) })
1541
+ children: sortable ? /* @__PURE__ */ jsxs19("button", { type: "button", className: "cfi-ui-table__sort", onClick: onSort, children: [
1542
+ /* @__PURE__ */ jsx19("span", { children }),
1543
+ /* @__PURE__ */ jsx19("span", { className: "cfi-ui-table__sort-icon", "aria-hidden": "true", children: sortDirection === "asc" ? /* @__PURE__ */ jsx19(ArrowUp, {}) : sortDirection === "desc" ? /* @__PURE__ */ jsx19(ArrowDown, {}) : /* @__PURE__ */ jsx19(ChevronsUpDown, {}) })
1379
1544
  ] }) : children
1380
1545
  }
1381
1546
  );
1382
1547
  }
1383
1548
  function TableCell({ numeric, truncate, className, ...rest }) {
1384
- return /* @__PURE__ */ jsx17(
1549
+ return /* @__PURE__ */ jsx19(
1385
1550
  "td",
1386
1551
  {
1387
1552
  "data-numeric": numeric || void 0,
@@ -1392,26 +1557,26 @@ function TableCell({ numeric, truncate, className, ...rest }) {
1392
1557
  );
1393
1558
  }
1394
1559
  function TableEmpty({ colSpan, children }) {
1395
- return /* @__PURE__ */ jsx17("tr", { className: "cfi-ui-table__row", children: /* @__PURE__ */ jsx17("td", { colSpan, className: "cfi-ui-table__empty", children }) });
1560
+ return /* @__PURE__ */ jsx19("tr", { className: "cfi-ui-table__row", children: /* @__PURE__ */ jsx19("td", { colSpan, className: "cfi-ui-table__empty", children }) });
1396
1561
  }
1397
1562
  function TableCaption({ className, ...rest }) {
1398
- return /* @__PURE__ */ jsx17("caption", { className: cn("cfi-ui-table__caption", className), ...rest });
1563
+ return /* @__PURE__ */ jsx19("caption", { className: cn("cfi-ui-table__caption", className), ...rest });
1399
1564
  }
1400
1565
 
1401
1566
  // src/Tabs.tsx
1402
- import { forwardRef as forwardRef14 } from "react";
1567
+ import { forwardRef as forwardRef15 } from "react";
1403
1568
  import * as RadixTabs from "@radix-ui/react-tabs";
1404
1569
 
1405
1570
  // src/Tabs.css
1406
1571
  styleInject("@layer components {\n .cfi-ui-tabs {\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n :where(.cfi-ui-tabs__list) {\n display: flex;\n align-items: center;\n gap: var(--cfi-ui-space-xs);\n overflow-x: auto;\n scrollbar-width: none;\n }\n .cfi-ui-tabs__list::-webkit-scrollbar {\n display: none;\n }\n :where(.cfi-ui-tabs__trigger) {\n display: inline-flex;\n align-items: center;\n gap: var(--cfi-ui-space-xs);\n flex: none;\n border: 0;\n background: none;\n color: var(--cfi-ui-content-muted);\n font-family: var(--cfi-ui-font);\n font-size: var(--cfi-ui-text-sm);\n font-weight: var(--cfi-ui-weight-medium);\n cursor: pointer;\n transition:\n color var(--cfi-ui-transition-fast),\n background-color var(--cfi-ui-transition-fast),\n border-color var(--cfi-ui-transition-fast);\n }\n .cfi-ui-tabs__trigger:disabled {\n color: var(--cfi-ui-content-disabled);\n cursor: not-allowed;\n }\n .cfi-ui-tabs__icon {\n display: inline-flex;\n flex: none;\n }\n .cfi-ui-tabs__icon > svg {\n width: 0.875rem;\n height: 0.875rem;\n display: block;\n }\n .cfi-ui-tabs__list[data-variant=underline] {\n gap: var(--cfi-ui-space-md);\n border-bottom: 1px solid var(--cfi-ui-border);\n }\n .cfi-ui-tabs__list[data-variant=underline] .cfi-ui-tabs__trigger {\n padding: 0.5rem 0.125rem;\n border-bottom: 2px solid transparent;\n margin-bottom: -1px;\n }\n .cfi-ui-tabs__list[data-variant=underline] .cfi-ui-tabs__trigger:hover:not(:disabled) {\n color: var(--cfi-ui-content);\n }\n .cfi-ui-tabs__list[data-variant=underline] .cfi-ui-tabs__trigger[data-state=active] {\n color: var(--cfi-ui-content);\n border-bottom-color: var(--cfi-ui-accent);\n }\n .cfi-ui-tabs__list[data-variant=pill] {\n gap: 0;\n padding: 0.1875rem;\n background: var(--cfi-ui-surface-muted);\n border: 0;\n border-radius: 14px;\n align-self: flex-start;\n }\n .cfi-ui-tabs__list[data-variant=pill] .cfi-ui-tabs__trigger {\n padding: 0.25rem 0.75rem;\n border-radius: 14px;\n color: var(--cfi-ui-content);\n }\n .cfi-ui-tabs__list[data-variant=pill] .cfi-ui-tabs__trigger:hover:not(:disabled) {\n color: var(--cfi-ui-content);\n }\n .cfi-ui-tabs__list[data-variant=pill] .cfi-ui-tabs__trigger[data-state=active] {\n background: var(--cfi-ui-surface);\n color: var(--cfi-ui-content);\n box-shadow: var(--cfi-ui-shadow-xs);\n }\n :where(.cfi-ui-tabs__content) {\n min-width: 0;\n padding-top: var(--cfi-ui-space-md);\n }\n .cfi-ui-tabs__content:focus-visible {\n outline: none;\n }\n}\n");
1407
1572
 
1408
1573
  // src/Tabs.tsx
1409
- import { jsx as jsx18, jsxs as jsxs18 } from "react/jsx-runtime";
1574
+ import { jsx as jsx20, jsxs as jsxs20 } from "react/jsx-runtime";
1410
1575
  var Tabs = RadixTabs.Root;
1411
1576
  var TabsRoot = RadixTabs.Root;
1412
- var TabsList = forwardRef14(
1577
+ var TabsList = forwardRef15(
1413
1578
  function TabsList2({ variant = "pill", className, ...rest }, ref) {
1414
- return /* @__PURE__ */ jsx18(
1579
+ return /* @__PURE__ */ jsx20(
1415
1580
  RadixTabs.List,
1416
1581
  {
1417
1582
  ref,
@@ -1422,20 +1587,20 @@ var TabsList = forwardRef14(
1422
1587
  );
1423
1588
  }
1424
1589
  );
1425
- var TabsTrigger = forwardRef14(
1590
+ var TabsTrigger = forwardRef15(
1426
1591
  function TabsTrigger2({ icon, count, className, children, ...rest }, ref) {
1427
- return /* @__PURE__ */ jsxs18(RadixTabs.Trigger, { ref, className: cn("cfi-ui-tabs__trigger", className), ...rest, children: [
1428
- icon && /* @__PURE__ */ jsx18("span", { className: "cfi-ui-tabs__icon", children: icon }),
1429
- /* @__PURE__ */ jsx18("span", { children }),
1430
- count !== void 0 && /* @__PURE__ */ jsx18(CountBadge, { count, size: "sm" })
1592
+ return /* @__PURE__ */ jsxs20(RadixTabs.Trigger, { ref, className: cn("cfi-ui-tabs__trigger", className), ...rest, children: [
1593
+ icon && /* @__PURE__ */ jsx20("span", { className: "cfi-ui-tabs__icon", children: icon }),
1594
+ /* @__PURE__ */ jsx20("span", { children }),
1595
+ count !== void 0 && /* @__PURE__ */ jsx20(CountBadge, { count, size: "sm" })
1431
1596
  ] });
1432
1597
  }
1433
1598
  );
1434
- var TabsContent = forwardRef14(function TabsContent2({ className, ...rest }, ref) {
1435
- return /* @__PURE__ */ jsx18(RadixTabs.Content, { ref, className: cn("cfi-ui-tabs__content", className), ...rest });
1599
+ var TabsContent = forwardRef15(function TabsContent2({ className, ...rest }, ref) {
1600
+ return /* @__PURE__ */ jsx20(RadixTabs.Content, { ref, className: cn("cfi-ui-tabs__content", className), ...rest });
1436
1601
  });
1437
1602
  function TabSet({ tabs, value, onValueChange, defaultValue, variant, className }) {
1438
- return /* @__PURE__ */ jsxs18(
1603
+ return /* @__PURE__ */ jsxs20(
1439
1604
  Tabs,
1440
1605
  {
1441
1606
  value,
@@ -1443,7 +1608,7 @@ function TabSet({ tabs, value, onValueChange, defaultValue, variant, className }
1443
1608
  defaultValue: defaultValue ?? tabs[0]?.value,
1444
1609
  className: cn("cfi-ui", "cfi-ui-tabs", className),
1445
1610
  children: [
1446
- /* @__PURE__ */ jsx18(TabsList, { variant, children: tabs.map((tab) => /* @__PURE__ */ jsx18(
1611
+ /* @__PURE__ */ jsx20(TabsList, { variant, children: tabs.map((tab) => /* @__PURE__ */ jsx20(
1447
1612
  TabsTrigger,
1448
1613
  {
1449
1614
  value: tab.value,
@@ -1454,25 +1619,25 @@ function TabSet({ tabs, value, onValueChange, defaultValue, variant, className }
1454
1619
  },
1455
1620
  tab.value
1456
1621
  )) }),
1457
- tabs.map((tab) => /* @__PURE__ */ jsx18(TabsContent, { value: tab.value, children: tab.content }, tab.value))
1622
+ tabs.map((tab) => /* @__PURE__ */ jsx20(TabsContent, { value: tab.value, children: tab.content }, tab.value))
1458
1623
  ]
1459
1624
  }
1460
1625
  );
1461
1626
  }
1462
1627
 
1463
1628
  // src/Display.tsx
1464
- import { forwardRef as forwardRef15 } from "react";
1629
+ import { forwardRef as forwardRef16 } from "react";
1465
1630
 
1466
1631
  // src/Display.css
1467
1632
  styleInject('@layer components {\n :where(.cfi-ui-separator) {\n flex: none;\n background: var(--cfi-ui-border);\n }\n .cfi-ui-separator[data-orientation=horizontal] {\n width: 100%;\n height: 1px;\n }\n .cfi-ui-separator[data-orientation=vertical] {\n width: 1px;\n align-self: stretch;\n min-height: 1rem;\n }\n .cfi-ui-separator-labeled {\n display: flex;\n align-items: center;\n gap: var(--cfi-ui-space-sm);\n width: 100%;\n color: var(--cfi-ui-content-muted);\n font-size: var(--cfi-ui-text-xs);\n }\n .cfi-ui-separator-labeled::before,\n .cfi-ui-separator-labeled::after {\n content: "";\n flex: 1 1 auto;\n height: 1px;\n background: var(--cfi-ui-border);\n }\n .cfi-ui-separator-labeled__label {\n flex: none;\n white-space: nowrap;\n }\n .cfi-ui-progress-wrap {\n display: flex;\n align-items: center;\n gap: var(--cfi-ui-space-sm);\n width: 100%;\n }\n .cfi-ui-progress {\n position: relative;\n flex: 1 1 auto;\n height: 0.5rem;\n overflow: hidden;\n border-radius: var(--cfi-ui-radius-full);\n background: var(--cfi-ui-surface-active);\n }\n .cfi-ui-progress[data-size=sm] {\n height: 0.25rem;\n }\n .cfi-ui-progress__fill {\n height: 100%;\n border-radius: var(--cfi-ui-radius-full);\n background: var(--cfi-ui-accent);\n transition: width var(--cfi-ui-transition-base);\n }\n .cfi-ui-progress[data-tone=success] .cfi-ui-progress__fill {\n background: var(--cfi-ui-success);\n }\n .cfi-ui-progress[data-tone=warning] .cfi-ui-progress__fill {\n background: var(--cfi-ui-warning);\n }\n .cfi-ui-progress[data-tone=error] .cfi-ui-progress__fill {\n background: var(--cfi-ui-error);\n }\n .cfi-ui-progress[data-indeterminate] .cfi-ui-progress__fill {\n width: 35%;\n animation: cfi-ui-progress-slide 1.2s ease-in-out infinite;\n transition: none;\n }\n @keyframes cfi-ui-progress-slide {\n 0% {\n transform: translateX(-100%);\n }\n 100% {\n transform: translateX(300%);\n }\n }\n .cfi-ui-progress__value {\n flex: none;\n min-width: 3ch;\n font-size: var(--cfi-ui-text-xs);\n font-variant-numeric: tabular-nums;\n color: var(--cfi-ui-content-muted);\n text-align: right;\n }\n :where(.cfi-ui-skeleton) {\n background: var(--cfi-ui-surface-active);\n border-radius: var(--cfi-ui-radius-sm);\n animation: cfi-ui-pulse 1.6s ease-in-out infinite;\n }\n .cfi-ui-skeleton[data-shape=text] {\n height: 0.875em;\n margin-block: 0.25em;\n border-radius: var(--cfi-ui-radius-sm);\n }\n .cfi-ui-skeleton[data-shape=circle] {\n border-radius: var(--cfi-ui-radius-full);\n aspect-ratio: 1;\n }\n .cfi-ui-skeleton-stack {\n display: grid;\n gap: 0;\n }\n :where(.cfi-ui-avatar) {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n overflow: hidden;\n width: 2rem;\n height: 2rem;\n border-radius: var(--cfi-ui-radius-full);\n background: var(--cfi-ui-surface-active);\n color: var(--cfi-ui-content-muted);\n font-family: var(--cfi-ui-font);\n font-size: var(--cfi-ui-text-xs);\n font-weight: var(--cfi-ui-weight-semibold);\n letter-spacing: 0.02em;\n user-select: none;\n }\n .cfi-ui-avatar[data-size=xs] {\n width: 1.25rem;\n height: 1.25rem;\n font-size: 0.5625rem;\n }\n .cfi-ui-avatar[data-size=sm] {\n width: 1.5rem;\n height: 1.5rem;\n font-size: 0.625rem;\n }\n .cfi-ui-avatar[data-size=lg] {\n width: 2.5rem;\n height: 2.5rem;\n font-size: var(--cfi-ui-text-sm);\n }\n .cfi-ui-avatar__image {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n }\n .cfi-ui-avatar-group {\n display: inline-flex;\n align-items: center;\n }\n .cfi-ui-avatar-group > .cfi-ui-avatar {\n box-shadow: 0 0 0 2px var(--cfi-ui-surface);\n }\n .cfi-ui-avatar-group > .cfi-ui-avatar + .cfi-ui-avatar {\n margin-left: -0.5rem;\n }\n .cfi-ui-avatar--overflow {\n background: var(--cfi-ui-surface-sunken);\n color: var(--cfi-ui-content-muted);\n font-variant-numeric: tabular-nums;\n }\n :where(.cfi-ui-scroll-area) {\n min-width: 0;\n scrollbar-width: thin;\n scrollbar-color: var(--cfi-ui-border-strong) transparent;\n overscroll-behavior: contain;\n }\n .cfi-ui-scroll-area[data-orientation=vertical] {\n overflow-y: auto;\n overflow-x: hidden;\n }\n .cfi-ui-scroll-area[data-orientation=horizontal] {\n overflow-x: auto;\n overflow-y: hidden;\n }\n .cfi-ui-scroll-area[data-orientation=both] {\n overflow: auto;\n }\n .cfi-ui-scroll-area::-webkit-scrollbar {\n width: 10px;\n height: 10px;\n }\n .cfi-ui-scroll-area::-webkit-scrollbar-track {\n background: transparent;\n }\n .cfi-ui-scroll-area::-webkit-scrollbar-thumb {\n background: var(--cfi-ui-border-strong);\n border-radius: var(--cfi-ui-radius-full);\n border: 3px solid transparent;\n background-clip: content-box;\n }\n .cfi-ui-scroll-area::-webkit-scrollbar-thumb:hover {\n background: var(--cfi-ui-content-subtle);\n background-clip: content-box;\n }\n}\n');
1468
1633
 
1469
1634
  // src/Display.tsx
1470
- import { jsx as jsx19, jsxs as jsxs19 } from "react/jsx-runtime";
1635
+ import { jsx as jsx21, jsxs as jsxs21 } from "react/jsx-runtime";
1471
1636
  function Separator3({ orientation = "horizontal", label, className, ...rest }) {
1472
1637
  if (label) {
1473
- return /* @__PURE__ */ jsx19("div", { className: cn("cfi-ui", "cfi-ui-separator-labeled", className), ...rest, children: /* @__PURE__ */ jsx19("span", { className: "cfi-ui-separator-labeled__label", children: label }) });
1638
+ return /* @__PURE__ */ jsx21("div", { className: cn("cfi-ui", "cfi-ui-separator-labeled", className), ...rest, children: /* @__PURE__ */ jsx21("span", { className: "cfi-ui-separator-labeled__label", children: label }) });
1474
1639
  }
1475
- return /* @__PURE__ */ jsx19(
1640
+ return /* @__PURE__ */ jsx21(
1476
1641
  "div",
1477
1642
  {
1478
1643
  role: "separator",
@@ -1493,8 +1658,8 @@ function Progress({
1493
1658
  ...rest
1494
1659
  }) {
1495
1660
  const clamped = value == null ? null : Math.max(0, Math.min(100, value));
1496
- return /* @__PURE__ */ jsxs19("div", { className: cn("cfi-ui", "cfi-ui-progress-wrap", className), ...rest, children: [
1497
- /* @__PURE__ */ jsx19(
1661
+ return /* @__PURE__ */ jsxs21("div", { className: cn("cfi-ui", "cfi-ui-progress-wrap", className), ...rest, children: [
1662
+ /* @__PURE__ */ jsx21(
1498
1663
  "div",
1499
1664
  {
1500
1665
  role: "progressbar",
@@ -1506,7 +1671,7 @@ function Progress({
1506
1671
  "data-size": size,
1507
1672
  "data-indeterminate": clamped == null || void 0,
1508
1673
  className: "cfi-ui-progress",
1509
- children: /* @__PURE__ */ jsx19(
1674
+ children: /* @__PURE__ */ jsx21(
1510
1675
  "div",
1511
1676
  {
1512
1677
  className: "cfi-ui-progress__fill",
@@ -1515,7 +1680,7 @@ function Progress({
1515
1680
  )
1516
1681
  }
1517
1682
  ),
1518
- showValue && clamped != null && /* @__PURE__ */ jsxs19("span", { className: "cfi-ui-progress__value", children: [
1683
+ showValue && clamped != null && /* @__PURE__ */ jsxs21("span", { className: "cfi-ui-progress__value", children: [
1519
1684
  Math.round(clamped),
1520
1685
  "%"
1521
1686
  ] })
@@ -1523,7 +1688,7 @@ function Progress({
1523
1688
  }
1524
1689
  function Skeleton({ shape = "block", width, height, lines = 1, className, style, ...rest }) {
1525
1690
  if (shape === "text" && lines > 1) {
1526
- return /* @__PURE__ */ jsx19("div", { className: cn("cfi-ui", "cfi-ui-skeleton-stack", className), "aria-hidden": "true", ...rest, children: Array.from({ length: lines }, (_, i) => /* @__PURE__ */ jsx19(
1691
+ return /* @__PURE__ */ jsx21("div", { className: cn("cfi-ui", "cfi-ui-skeleton-stack", className), "aria-hidden": "true", ...rest, children: Array.from({ length: lines }, (_, i) => /* @__PURE__ */ jsx21(
1527
1692
  "div",
1528
1693
  {
1529
1694
  "data-shape": "text",
@@ -1533,7 +1698,7 @@ function Skeleton({ shape = "block", width, height, lines = 1, className, style,
1533
1698
  i
1534
1699
  )) });
1535
1700
  }
1536
- return /* @__PURE__ */ jsx19(
1701
+ return /* @__PURE__ */ jsx21(
1537
1702
  "div",
1538
1703
  {
1539
1704
  "aria-hidden": "true",
@@ -1544,21 +1709,21 @@ function Skeleton({ shape = "block", width, height, lines = 1, className, style,
1544
1709
  }
1545
1710
  );
1546
1711
  }
1547
- var Avatar = forwardRef15(function Avatar2({ name, src, size = "md", className, ...rest }, ref) {
1712
+ var Avatar = forwardRef16(function Avatar2({ name, src, size = "md", className, ...rest }, ref) {
1548
1713
  const parts = name.trim().split(/\s+/).filter(Boolean);
1549
1714
  const initials = parts.length === 0 ? "?" : parts.length === 1 ? parts[0].slice(0, 2).toUpperCase() : `${parts[0][0]}${parts[parts.length - 1][0]}`.toUpperCase();
1550
- return /* @__PURE__ */ jsxs19("span", { ref, "data-size": size, className: cn("cfi-ui", "cfi-ui-avatar", className), ...rest, children: [
1551
- src ? /* @__PURE__ */ jsx19("img", { src, alt: name, className: "cfi-ui-avatar__image" }) : /* @__PURE__ */ jsx19("span", { "aria-hidden": "true", children: initials }),
1552
- !src && /* @__PURE__ */ jsx19("span", { className: "cfi-ui-sr-only", children: name })
1715
+ return /* @__PURE__ */ jsxs21("span", { ref, "data-size": size, className: cn("cfi-ui", "cfi-ui-avatar", className), ...rest, children: [
1716
+ src ? /* @__PURE__ */ jsx21("img", { src, alt: name, className: "cfi-ui-avatar__image" }) : /* @__PURE__ */ jsx21("span", { "aria-hidden": "true", children: initials }),
1717
+ !src && /* @__PURE__ */ jsx21("span", { className: "cfi-ui-sr-only", children: name })
1553
1718
  ] });
1554
1719
  });
1555
1720
  function AvatarGroup({ max, className, children, ...rest }) {
1556
1721
  const items = Array.isArray(children) ? children : [children];
1557
1722
  const shown = max ? items.slice(0, max) : items;
1558
1723
  const hidden = items.length - shown.length;
1559
- return /* @__PURE__ */ jsxs19("div", { className: cn("cfi-ui", "cfi-ui-avatar-group", className), ...rest, children: [
1724
+ return /* @__PURE__ */ jsxs21("div", { className: cn("cfi-ui", "cfi-ui-avatar-group", className), ...rest, children: [
1560
1725
  shown,
1561
- hidden > 0 && /* @__PURE__ */ jsxs19("span", { className: "cfi-ui-avatar cfi-ui-avatar--overflow", children: [
1726
+ hidden > 0 && /* @__PURE__ */ jsxs21("span", { className: "cfi-ui-avatar cfi-ui-avatar--overflow", children: [
1562
1727
  "+",
1563
1728
  hidden
1564
1729
  ] })
@@ -1571,7 +1736,7 @@ function ScrollArea({
1571
1736
  style,
1572
1737
  ...rest
1573
1738
  }) {
1574
- return /* @__PURE__ */ jsx19(
1739
+ return /* @__PURE__ */ jsx21(
1575
1740
  "div",
1576
1741
  {
1577
1742
  "data-orientation": orientation,
@@ -1583,29 +1748,29 @@ function ScrollArea({
1583
1748
  }
1584
1749
 
1585
1750
  // src/Accordion.tsx
1586
- import { forwardRef as forwardRef16 } from "react";
1751
+ import { forwardRef as forwardRef17 } from "react";
1587
1752
  import * as RadixAccordion from "@radix-ui/react-accordion";
1588
1753
  import * as RadixToggleGroup from "@radix-ui/react-toggle-group";
1589
- import { ChevronDown as ChevronDown3 } from "lucide-react";
1754
+ import { ChevronDown as ChevronDown4 } from "lucide-react";
1590
1755
 
1591
1756
  // src/Accordion.css
1592
1757
  styleInject("@layer components {\n :where(.cfi-ui-accordion) {\n display: flex;\n flex-direction: column;\n min-width: 0;\n border: 1px solid var(--cfi-ui-border);\n border-radius: var(--cfi-ui-radius-lg);\n background: var(--cfi-ui-surface);\n overflow: hidden;\n }\n .cfi-ui-accordion__item + .cfi-ui-accordion__item {\n border-top: 1px solid var(--cfi-ui-border);\n }\n .cfi-ui-accordion__header {\n margin: 0;\n }\n .cfi-ui-accordion__trigger {\n display: flex;\n align-items: center;\n gap: var(--cfi-ui-space-sm);\n width: 100%;\n padding: 0.625rem var(--cfi-ui-space-md);\n border: 0;\n background: none;\n color: var(--cfi-ui-content);\n font-family: var(--cfi-ui-font);\n font-size: var(--cfi-ui-text-sm);\n font-weight: var(--cfi-ui-weight-medium);\n text-align: left;\n cursor: pointer;\n transition: background-color var(--cfi-ui-transition-fast);\n }\n .cfi-ui-accordion__trigger:hover:not(:disabled) {\n background: var(--cfi-ui-surface-hover);\n }\n .cfi-ui-accordion__trigger:disabled {\n color: var(--cfi-ui-content-disabled);\n cursor: not-allowed;\n }\n .cfi-ui-accordion__chevron {\n display: inline-flex;\n flex: none;\n color: var(--cfi-ui-content-muted);\n transition: transform var(--cfi-ui-transition-fast);\n }\n .cfi-ui-accordion__trigger[data-state=open] .cfi-ui-accordion__chevron {\n transform: rotate(180deg);\n }\n .cfi-ui-accordion__chevron > svg {\n width: 0.875rem;\n height: 0.875rem;\n display: block;\n }\n .cfi-ui-accordion__label {\n flex: 1 1 auto;\n min-width: 0;\n }\n .cfi-ui-accordion__meta {\n flex: none;\n font-size: var(--cfi-ui-text-xs);\n font-weight: var(--cfi-ui-weight-normal);\n font-variant-numeric: tabular-nums;\n color: var(--cfi-ui-content-muted);\n }\n .cfi-ui-accordion__content {\n overflow: hidden;\n }\n .cfi-ui-accordion__content[data-state=open] {\n animation: cfi-ui-accordion-open var(--cfi-ui-transition-base);\n }\n .cfi-ui-accordion__content[data-state=closed] {\n animation: cfi-ui-accordion-close var(--cfi-ui-transition-base);\n }\n @keyframes cfi-ui-accordion-open {\n from {\n height: 0;\n }\n to {\n height: var(--radix-accordion-content-height);\n }\n }\n @keyframes cfi-ui-accordion-close {\n from {\n height: var(--radix-accordion-content-height);\n }\n to {\n height: 0;\n }\n }\n .cfi-ui-accordion__inner {\n padding: 0 var(--cfi-ui-space-md) var(--cfi-ui-space-md);\n }\n :where(.cfi-ui-toggle-group) {\n display: inline-flex;\n align-items: center;\n gap: var(--cfi-ui-space-3xs);\n padding: var(--cfi-ui-space-3xs);\n background: var(--cfi-ui-surface-sunken);\n border: 1px solid var(--cfi-ui-border);\n border-radius: var(--cfi-ui-radius-md);\n }\n :where(.cfi-ui-toggle-group__item) {\n display: inline-flex;\n align-items: center;\n gap: var(--cfi-ui-space-xs);\n height: 1.625rem;\n padding-inline: 0.5rem;\n border: 0;\n border-radius: var(--cfi-ui-radius-sm);\n background: transparent;\n color: var(--cfi-ui-content-muted);\n font-family: var(--cfi-ui-font);\n font-size: var(--cfi-ui-text-xs);\n font-weight: var(--cfi-ui-weight-medium);\n white-space: nowrap;\n cursor: pointer;\n transition: background-color var(--cfi-ui-transition-fast), color var(--cfi-ui-transition-fast);\n }\n .cfi-ui-toggle-group[data-size=md] .cfi-ui-toggle-group__item {\n height: 1.875rem;\n padding-inline: 0.625rem;\n font-size: var(--cfi-ui-text-sm);\n }\n .cfi-ui-toggle-group__item:hover:not(:disabled) {\n color: var(--cfi-ui-content);\n }\n .cfi-ui-toggle-group__item[data-state=on] {\n background: var(--cfi-ui-surface);\n color: var(--cfi-ui-content);\n box-shadow: var(--cfi-ui-shadow-xs);\n }\n .cfi-ui-toggle-group__item:disabled {\n color: var(--cfi-ui-content-disabled);\n cursor: not-allowed;\n }\n .cfi-ui-toggle-group__icon {\n display: inline-flex;\n flex: none;\n }\n .cfi-ui-toggle-group__icon > svg {\n width: 0.875rem;\n height: 0.875rem;\n display: block;\n }\n}\n");
1593
1758
 
1594
1759
  // src/Accordion.tsx
1595
- import { jsx as jsx20, jsxs as jsxs20 } from "react/jsx-runtime";
1760
+ import { jsx as jsx22, jsxs as jsxs22 } from "react/jsx-runtime";
1596
1761
  var AccordionRoot = RadixAccordion.Root;
1597
- var AccordionItem = forwardRef16(function AccordionItem2({ className, ...rest }, ref) {
1598
- return /* @__PURE__ */ jsx20(RadixAccordion.Item, { ref, className: cn("cfi-ui-accordion__item", className), ...rest });
1762
+ var AccordionItem = forwardRef17(function AccordionItem2({ className, ...rest }, ref) {
1763
+ return /* @__PURE__ */ jsx22(RadixAccordion.Item, { ref, className: cn("cfi-ui-accordion__item", className), ...rest });
1599
1764
  });
1600
- var AccordionTrigger = forwardRef16(function AccordionTrigger2({ meta, className, children, ...rest }, ref) {
1601
- return /* @__PURE__ */ jsx20(RadixAccordion.Header, { className: "cfi-ui-accordion__header", children: /* @__PURE__ */ jsxs20(RadixAccordion.Trigger, { ref, className: cn("cfi-ui-accordion__trigger", className), ...rest, children: [
1602
- /* @__PURE__ */ jsx20("span", { className: "cfi-ui-accordion__chevron", "aria-hidden": "true", children: /* @__PURE__ */ jsx20(ChevronDown3, {}) }),
1603
- /* @__PURE__ */ jsx20("span", { className: "cfi-ui-accordion__label", children }),
1604
- meta && /* @__PURE__ */ jsx20("span", { className: "cfi-ui-accordion__meta", children: meta })
1765
+ var AccordionTrigger = forwardRef17(function AccordionTrigger2({ meta, className, children, ...rest }, ref) {
1766
+ return /* @__PURE__ */ jsx22(RadixAccordion.Header, { className: "cfi-ui-accordion__header", children: /* @__PURE__ */ jsxs22(RadixAccordion.Trigger, { ref, className: cn("cfi-ui-accordion__trigger", className), ...rest, children: [
1767
+ /* @__PURE__ */ jsx22("span", { className: "cfi-ui-accordion__chevron", "aria-hidden": "true", children: /* @__PURE__ */ jsx22(ChevronDown4, {}) }),
1768
+ /* @__PURE__ */ jsx22("span", { className: "cfi-ui-accordion__label", children }),
1769
+ meta && /* @__PURE__ */ jsx22("span", { className: "cfi-ui-accordion__meta", children: meta })
1605
1770
  ] }) });
1606
1771
  });
1607
- var AccordionContent = forwardRef16(function AccordionContent2({ className, children, ...rest }, ref) {
1608
- return /* @__PURE__ */ jsx20(RadixAccordion.Content, { ref, className: cn("cfi-ui-accordion__content", className), ...rest, children: /* @__PURE__ */ jsx20("div", { className: "cfi-ui-accordion__inner", children }) });
1772
+ var AccordionContent = forwardRef17(function AccordionContent2({ className, children, ...rest }, ref) {
1773
+ return /* @__PURE__ */ jsx22(RadixAccordion.Content, { ref, className: cn("cfi-ui-accordion__content", className), ...rest, children: /* @__PURE__ */ jsx22("div", { className: "cfi-ui-accordion__inner", children }) });
1609
1774
  });
1610
1775
  function Accordion({
1611
1776
  sections,
@@ -1622,9 +1787,9 @@ function Accordion({
1622
1787
  onValueChange,
1623
1788
  className: cn("cfi-ui", "cfi-ui-accordion", className)
1624
1789
  };
1625
- return /* @__PURE__ */ jsx20(AccordionRoot, { ...rootProps, children: sections.map((section) => /* @__PURE__ */ jsxs20(AccordionItem, { value: section.value, disabled: section.disabled, children: [
1626
- /* @__PURE__ */ jsx20(AccordionTrigger, { meta: section.meta, children: section.label }),
1627
- /* @__PURE__ */ jsx20(AccordionContent, { children: section.content })
1790
+ return /* @__PURE__ */ jsx22(AccordionRoot, { ...rootProps, children: sections.map((section) => /* @__PURE__ */ jsxs22(AccordionItem, { value: section.value, disabled: section.disabled, children: [
1791
+ /* @__PURE__ */ jsx22(AccordionTrigger, { meta: section.meta, children: section.label }),
1792
+ /* @__PURE__ */ jsx22(AccordionContent, { children: section.content })
1628
1793
  ] }, section.value)) });
1629
1794
  }
1630
1795
  function ToggleGroup({
@@ -1636,7 +1801,7 @@ function ToggleGroup({
1636
1801
  className,
1637
1802
  ...aria
1638
1803
  }) {
1639
- return /* @__PURE__ */ jsx20(
1804
+ return /* @__PURE__ */ jsx22(
1640
1805
  RadixToggleGroup.Root,
1641
1806
  {
1642
1807
  type: "single",
@@ -1648,7 +1813,7 @@ function ToggleGroup({
1648
1813
  "data-size": size,
1649
1814
  className: cn("cfi-ui", "cfi-ui-toggle-group", className),
1650
1815
  ...aria,
1651
- children: options.map((option) => /* @__PURE__ */ jsxs20(
1816
+ children: options.map((option) => /* @__PURE__ */ jsxs22(
1652
1817
  RadixToggleGroup.Item,
1653
1818
  {
1654
1819
  value: option.value,
@@ -1657,7 +1822,7 @@ function ToggleGroup({
1657
1822
  title: option.ariaLabel,
1658
1823
  className: "cfi-ui-toggle-group__item",
1659
1824
  children: [
1660
- option.icon && /* @__PURE__ */ jsx20("span", { className: "cfi-ui-toggle-group__icon", children: option.icon }),
1825
+ option.icon && /* @__PURE__ */ jsx22("span", { className: "cfi-ui-toggle-group__icon", children: option.icon }),
1661
1826
  option.label
1662
1827
  ]
1663
1828
  },
@@ -1674,9 +1839,9 @@ import { AlertCircle, Loader2 } from "lucide-react";
1674
1839
  styleInject("@layer components {\n :where(.cfi-ui-pagestate) {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--cfi-ui-space-sm);\n padding-block: var(--cfi-ui-space-2xl, 4rem);\n text-align: center;\n color: var(--cfi-ui-content);\n font-family: var(--cfi-ui-font);\n font-size: var(--cfi-ui-text-sm);\n }\n .cfi-ui-pagestate[data-size=inline] {\n padding-block: var(--cfi-ui-space-md);\n gap: var(--cfi-ui-space-xs);\n }\n .cfi-ui-pagestate:has(> .cfi-ui-pagestate__spinner) {\n flex-direction: row;\n }\n .cfi-ui-pagestate__spinner {\n width: 1rem;\n height: 1rem;\n flex: none;\n color: var(--cfi-ui-content-muted);\n animation: cfi-ui-pagestate-spin 1s linear infinite;\n }\n @media (prefers-reduced-motion: reduce) {\n .cfi-ui-pagestate__spinner {\n animation-duration: 2.4s;\n }\n }\n .cfi-ui-pagestate__icon {\n display: inline-flex;\n color: var(--cfi-ui-content-subtle);\n }\n .cfi-ui-pagestate__icon > svg {\n width: 1.5rem;\n height: 1.5rem;\n }\n .cfi-ui-pagestate__icon[data-tone=error] {\n width: 1.5rem;\n height: 1.5rem;\n color: var(--cfi-ui-error-strong);\n }\n .cfi-ui-pagestate__title {\n margin: 0;\n font-weight: var(--cfi-ui-weight-medium);\n color: var(--cfi-ui-content);\n }\n .cfi-ui-pagestate__muted {\n margin: 0;\n max-width: 34rem;\n color: var(--cfi-ui-content-muted);\n }\n .cfi-ui-pagestate__title + .cfi-ui-pagestate__muted {\n margin-top: var(--cfi-ui-space-3xs);\n }\n .cfi-ui-pagestate__action {\n margin-top: var(--cfi-ui-space-xs);\n }\n .cfi-ui-pagestate__retry {\n height: var(--cfi-ui-control-height-sm);\n padding-inline: var(--cfi-ui-space-sm);\n background: var(--cfi-ui-surface);\n color: var(--cfi-ui-content);\n border: 1px solid var(--cfi-ui-border-strong);\n border-radius: var(--cfi-ui-radius-md);\n font-family: inherit;\n font-size: var(--cfi-ui-text-sm);\n line-height: normal;\n cursor: pointer;\n }\n .cfi-ui-pagestate__retry:hover {\n background: var(--cfi-ui-surface-hover);\n }\n .cfi-ui-pagestate__retry:focus-visible {\n outline: var(--cfi-ui-focus-width) solid var(--cfi-ui-focus-color);\n outline-offset: var(--cfi-ui-focus-offset);\n }\n}\n@keyframes cfi-ui-pagestate-spin {\n to {\n transform: rotate(360deg);\n }\n}\n");
1675
1840
 
1676
1841
  // src/PageState.tsx
1677
- import { jsx as jsx21, jsxs as jsxs21 } from "react/jsx-runtime";
1842
+ import { jsx as jsx23, jsxs as jsxs23 } from "react/jsx-runtime";
1678
1843
  function LoadingState({ label = "Loading\u2026", size = "block", className }) {
1679
- return /* @__PURE__ */ jsxs21(
1844
+ return /* @__PURE__ */ jsxs23(
1680
1845
  "div",
1681
1846
  {
1682
1847
  className: cn("cfi-ui", "cfi-ui-pagestate", className),
@@ -1684,8 +1849,8 @@ function LoadingState({ label = "Loading\u2026", size = "block", className }) {
1684
1849
  role: "status",
1685
1850
  "aria-live": "polite",
1686
1851
  children: [
1687
- /* @__PURE__ */ jsx21(Loader2, { className: "cfi-ui-pagestate__spinner", "aria-hidden": "true" }),
1688
- /* @__PURE__ */ jsx21("span", { className: "cfi-ui-pagestate__muted", children: label })
1852
+ /* @__PURE__ */ jsx23(Loader2, { className: "cfi-ui-pagestate__spinner", "aria-hidden": "true" }),
1853
+ /* @__PURE__ */ jsx23("span", { className: "cfi-ui-pagestate__muted", children: label })
1689
1854
  ]
1690
1855
  }
1691
1856
  );
@@ -1699,13 +1864,13 @@ function ErrorState({
1699
1864
  className
1700
1865
  }) {
1701
1866
  const message = error instanceof Error ? error.message : error == null ? "" : String(error);
1702
- return /* @__PURE__ */ jsxs21("div", { className: cn("cfi-ui", "cfi-ui-pagestate", className), "data-size": size, role: "alert", children: [
1703
- /* @__PURE__ */ jsx21(AlertCircle, { className: "cfi-ui-pagestate__icon", "data-tone": "error", "aria-hidden": "true" }),
1704
- /* @__PURE__ */ jsxs21("div", { children: [
1705
- /* @__PURE__ */ jsx21("p", { className: "cfi-ui-pagestate__title", children: title }),
1706
- message && /* @__PURE__ */ jsx21("p", { className: "cfi-ui-pagestate__muted", children: message })
1867
+ return /* @__PURE__ */ jsxs23("div", { className: cn("cfi-ui", "cfi-ui-pagestate", className), "data-size": size, role: "alert", children: [
1868
+ /* @__PURE__ */ jsx23(AlertCircle, { className: "cfi-ui-pagestate__icon", "data-tone": "error", "aria-hidden": "true" }),
1869
+ /* @__PURE__ */ jsxs23("div", { children: [
1870
+ /* @__PURE__ */ jsx23("p", { className: "cfi-ui-pagestate__title", children: title }),
1871
+ message && /* @__PURE__ */ jsx23("p", { className: "cfi-ui-pagestate__muted", children: message })
1707
1872
  ] }),
1708
- onRetry && /* @__PURE__ */ jsx21("button", { type: "button", className: "cfi-ui-pagestate__retry", onClick: onRetry, children: retryLabel })
1873
+ onRetry && /* @__PURE__ */ jsx23("button", { type: "button", className: "cfi-ui-pagestate__retry", onClick: onRetry, children: retryLabel })
1709
1874
  ] });
1710
1875
  }
1711
1876
  function EmptyState({
@@ -1716,17 +1881,17 @@ function EmptyState({
1716
1881
  size = "block",
1717
1882
  className
1718
1883
  }) {
1719
- return /* @__PURE__ */ jsxs21("div", { className: cn("cfi-ui", "cfi-ui-pagestate", className), "data-size": size, children: [
1720
- icon && /* @__PURE__ */ jsx21("span", { className: "cfi-ui-pagestate__icon", children: icon }),
1721
- /* @__PURE__ */ jsxs21("div", { children: [
1722
- /* @__PURE__ */ jsx21("p", { className: "cfi-ui-pagestate__title", children: title }),
1723
- description && /* @__PURE__ */ jsx21("p", { className: "cfi-ui-pagestate__muted", children: description })
1884
+ return /* @__PURE__ */ jsxs23("div", { className: cn("cfi-ui", "cfi-ui-pagestate", className), "data-size": size, children: [
1885
+ icon && /* @__PURE__ */ jsx23("span", { className: "cfi-ui-pagestate__icon", children: icon }),
1886
+ /* @__PURE__ */ jsxs23("div", { children: [
1887
+ /* @__PURE__ */ jsx23("p", { className: "cfi-ui-pagestate__title", children: title }),
1888
+ description && /* @__PURE__ */ jsx23("p", { className: "cfi-ui-pagestate__muted", children: description })
1724
1889
  ] }),
1725
- action && /* @__PURE__ */ jsx21("div", { className: "cfi-ui-pagestate__action", children: action })
1890
+ action && /* @__PURE__ */ jsx23("div", { className: "cfi-ui-pagestate__action", children: action })
1726
1891
  ] });
1727
1892
  }
1728
1893
  function ComingSoon({ title, detail, className }) {
1729
- return /* @__PURE__ */ jsx21(
1894
+ return /* @__PURE__ */ jsx23(
1730
1895
  EmptyState,
1731
1896
  {
1732
1897
  title,
@@ -1737,9 +1902,9 @@ function ComingSoon({ title, detail, className }) {
1737
1902
  }
1738
1903
 
1739
1904
  // src/useSortState.ts
1740
- import { useCallback as useCallback2, useMemo as useMemo4, useState as useState4 } from "react";
1905
+ import { useCallback as useCallback2, useMemo as useMemo5, useState as useState5 } from "react";
1741
1906
  function useSortState(initialKey, initialDirection = "asc") {
1742
- const [sort, setSort] = useState4({ key: initialKey, direction: initialDirection });
1907
+ const [sort, setSort] = useState5({ key: initialKey, direction: initialDirection });
1743
1908
  const toggle = useCallback2((key) => {
1744
1909
  setSort(
1745
1910
  (current) => current.key === key ? { key, direction: current.direction === "asc" ? "desc" : "asc" } : { key, direction: "asc" }
@@ -1769,23 +1934,23 @@ function useSortState(initialKey, initialDirection = "asc") {
1769
1934
  },
1770
1935
  [sort]
1771
1936
  );
1772
- return useMemo4(
1937
+ return useMemo5(
1773
1938
  () => ({ sort, toggle, setSort, sortProps, sortBy }),
1774
1939
  [sort, toggle, sortProps, sortBy]
1775
1940
  );
1776
1941
  }
1777
1942
 
1778
1943
  // src/SearchInput.tsx
1779
- import { forwardRef as forwardRef17, useEffect as useEffect3, useRef as useRef3, useState as useState5 } from "react";
1780
- import { Search as Search2, X as X4 } from "lucide-react";
1944
+ import { forwardRef as forwardRef18, useEffect as useEffect3, useRef as useRef3, useState as useState6 } from "react";
1945
+ import { Search as Search2, X as X5 } from "lucide-react";
1781
1946
 
1782
1947
  // src/SearchInput.css
1783
1948
  styleInject("@layer components {\n .cfi-ui-search__clear {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n background: none;\n border: none;\n color: var(--cfi-ui-content-muted);\n cursor: pointer;\n border-radius: var(--cfi-ui-radius-sm);\n }\n .cfi-ui-search__clear > svg {\n width: 0.875rem;\n height: 0.875rem;\n }\n .cfi-ui-search__clear:hover {\n color: var(--cfi-ui-content);\n }\n .cfi-ui-search__clear:focus-visible {\n outline: var(--cfi-ui-focus-width) solid var(--cfi-ui-focus-color);\n outline-offset: 1px;\n }\n}\n");
1784
1949
 
1785
1950
  // src/SearchInput.tsx
1786
- import { jsx as jsx22 } from "react/jsx-runtime";
1787
- var SearchInput = forwardRef17(function SearchInput2({ value, onChange, delay = 250, placeholder = "Search\u2026", clearLabel = "Clear search", ...rest }, ref) {
1788
- const [local, setLocal] = useState5(value);
1951
+ import { jsx as jsx24 } from "react/jsx-runtime";
1952
+ var SearchInput = forwardRef18(function SearchInput2({ value, onChange, delay = 250, placeholder = "Search\u2026", clearLabel = "Clear search", ...rest }, ref) {
1953
+ const [local, setLocal] = useState6(value);
1789
1954
  const timer = useRef3(void 0);
1790
1955
  const latest = useRef3(onChange);
1791
1956
  latest.current = onChange;
@@ -1802,7 +1967,7 @@ var SearchInput = forwardRef17(function SearchInput2({ value, onChange, delay =
1802
1967
  setLocal("");
1803
1968
  latest.current("");
1804
1969
  };
1805
- return /* @__PURE__ */ jsx22(
1970
+ return /* @__PURE__ */ jsx24(
1806
1971
  Input,
1807
1972
  {
1808
1973
  ...rest,
@@ -1811,8 +1976,8 @@ var SearchInput = forwardRef17(function SearchInput2({ value, onChange, delay =
1811
1976
  value: local,
1812
1977
  placeholder,
1813
1978
  onChange: (e) => push(e.target.value),
1814
- prefix: /* @__PURE__ */ jsx22(Search2, { "aria-hidden": "true" }),
1815
- suffix: local ? /* @__PURE__ */ jsx22("button", { type: "button", className: "cfi-ui-search__clear", onClick: clear, "aria-label": clearLabel, children: /* @__PURE__ */ jsx22(X4, { "aria-hidden": "true" }) }) : void 0
1979
+ prefix: /* @__PURE__ */ jsx24(Search2, { "aria-hidden": "true" }),
1980
+ suffix: local ? /* @__PURE__ */ jsx24("button", { type: "button", className: "cfi-ui-search__clear", onClick: clear, "aria-label": clearLabel, children: /* @__PURE__ */ jsx24(X5, { "aria-hidden": "true" }) }) : void 0
1816
1981
  }
1817
1982
  );
1818
1983
  });
@@ -1824,7 +1989,7 @@ import { ChevronLeft, ChevronRight } from "lucide-react";
1824
1989
  styleInject("@layer components {\n :where(.cfi-ui-pagination) {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--cfi-ui-space-md);\n padding-block: var(--cfi-ui-space-sm);\n font-family: var(--cfi-ui-font);\n font-size: var(--cfi-ui-text-sm);\n color: var(--cfi-ui-content-muted);\n }\n .cfi-ui-pagination__controls {\n display: flex;\n align-items: center;\n gap: var(--cfi-ui-space-xs);\n margin-left: auto;\n }\n .cfi-ui-pagination__page {\n font-variant-numeric: tabular-nums;\n color: var(--cfi-ui-content);\n }\n .cfi-ui-pagination__range {\n font-variant-numeric: tabular-nums;\n }\n .cfi-ui-pagination__btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--cfi-ui-control-height-sm);\n height: var(--cfi-ui-control-height-sm);\n padding: 0;\n background: var(--cfi-ui-surface);\n color: var(--cfi-ui-content);\n border: 1px solid var(--cfi-ui-border-strong);\n border-radius: var(--cfi-ui-radius-md);\n cursor: pointer;\n }\n .cfi-ui-pagination__btn > svg {\n width: 1rem;\n height: 1rem;\n }\n .cfi-ui-pagination__btn:hover:not(:disabled) {\n background: var(--cfi-ui-surface-hover);\n }\n .cfi-ui-pagination__btn:disabled {\n color: var(--cfi-ui-content-disabled);\n cursor: default;\n }\n .cfi-ui-pagination__btn:focus-visible {\n outline: var(--cfi-ui-focus-width) solid var(--cfi-ui-focus-color);\n outline-offset: var(--cfi-ui-focus-offset);\n }\n}\n");
1825
1990
 
1826
1991
  // src/Pagination.tsx
1827
- import { jsx as jsx23, jsxs as jsxs22 } from "react/jsx-runtime";
1992
+ import { jsx as jsx25, jsxs as jsxs24 } from "react/jsx-runtime";
1828
1993
  function Pagination({
1829
1994
  page,
1830
1995
  pageSize,
@@ -1840,12 +2005,12 @@ function Pagination({
1840
2005
  const from = (current - 1) * pageSize + 1;
1841
2006
  const to = Math.min(current * pageSize, totalItems);
1842
2007
  const range = labels?.range?.(from, to, totalItems) ?? `${from}\u2013${to} of ${totalItems.toLocaleString()}`;
1843
- return /* @__PURE__ */ jsxs22("nav", { className: cn("cfi-ui", "cfi-ui-pagination", className), "aria-label": "Pagination", children: [
2008
+ return /* @__PURE__ */ jsxs24("nav", { className: cn("cfi-ui", "cfi-ui-pagination", className), "aria-label": "Pagination", children: [
1844
2009
  showRange && // aria-live so a screen-reader user hears where they landed; paging
1845
2010
  // otherwise moves focus nowhere and announces nothing.
1846
- /* @__PURE__ */ jsx23("span", { className: "cfi-ui-pagination__range", "aria-live": "polite", children: range }),
1847
- /* @__PURE__ */ jsxs22("div", { className: "cfi-ui-pagination__controls", children: [
1848
- /* @__PURE__ */ jsx23(
2011
+ /* @__PURE__ */ jsx25("span", { className: "cfi-ui-pagination__range", "aria-live": "polite", children: range }),
2012
+ /* @__PURE__ */ jsxs24("div", { className: "cfi-ui-pagination__controls", children: [
2013
+ /* @__PURE__ */ jsx25(
1849
2014
  "button",
1850
2015
  {
1851
2016
  type: "button",
@@ -1853,15 +2018,15 @@ function Pagination({
1853
2018
  onClick: () => onPageChange(current - 1),
1854
2019
  disabled: current <= 1,
1855
2020
  "aria-label": labels?.previous ?? "Previous page",
1856
- children: /* @__PURE__ */ jsx23(ChevronLeft, { "aria-hidden": "true" })
2021
+ children: /* @__PURE__ */ jsx25(ChevronLeft, { "aria-hidden": "true" })
1857
2022
  }
1858
2023
  ),
1859
- /* @__PURE__ */ jsxs22("span", { className: "cfi-ui-pagination__page", children: [
2024
+ /* @__PURE__ */ jsxs24("span", { className: "cfi-ui-pagination__page", children: [
1860
2025
  current,
1861
2026
  " / ",
1862
2027
  pageCount
1863
2028
  ] }),
1864
- /* @__PURE__ */ jsx23(
2029
+ /* @__PURE__ */ jsx25(
1865
2030
  "button",
1866
2031
  {
1867
2032
  type: "button",
@@ -1869,7 +2034,7 @@ function Pagination({
1869
2034
  onClick: () => onPageChange(current + 1),
1870
2035
  disabled: current >= pageCount,
1871
2036
  "aria-label": labels?.next ?? "Next page",
1872
- children: /* @__PURE__ */ jsx23(ChevronRight, { "aria-hidden": "true" })
2037
+ children: /* @__PURE__ */ jsx25(ChevronRight, { "aria-hidden": "true" })
1873
2038
  }
1874
2039
  )
1875
2040
  ] })
@@ -1953,9 +2118,10 @@ export {
1953
2118
  ErrorState,
1954
2119
  Field,
1955
2120
  Fieldset,
2121
+ FilterBar,
1956
2122
  IconButton,
1957
2123
  Input,
1958
- Label,
2124
+ Label3 as Label,
1959
2125
  LoadingState,
1960
2126
  Menu,
1961
2127
  MenuCheckboxItem,
@@ -2005,6 +2171,7 @@ export {
2005
2171
  SideModal,
2006
2172
  Skeleton,
2007
2173
  Slider,
2174
+ SplitButton,
2008
2175
  Switch,
2009
2176
  TabSet,
2010
2177
  Table,