@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.
- package/dist/index.d.ts +153 -53
- package/dist/index.js +825 -658
- 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
|
|
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
|
|
108
|
-
var Input =
|
|
109
|
-
const field = /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
620
|
+
prefix && /* @__PURE__ */ jsx9("span", { className: "cfi-ui-input-wrap__affix", children: prefix }),
|
|
131
621
|
field,
|
|
132
|
-
suffix && /* @__PURE__ */
|
|
622
|
+
suffix && /* @__PURE__ */ jsx9("span", { className: "cfi-ui-input-wrap__affix", children: suffix })
|
|
133
623
|
]
|
|
134
624
|
}
|
|
135
625
|
);
|
|
136
626
|
});
|
|
137
|
-
var Textarea =
|
|
138
|
-
return /* @__PURE__ */
|
|
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
|
|
159
|
-
function
|
|
160
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
186
|
-
/* @__PURE__ */
|
|
187
|
-
/* @__PURE__ */
|
|
188
|
-
/* @__PURE__ */
|
|
189
|
-
invalid ? /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
211
|
-
/* @__PURE__ */
|
|
212
|
-
/* @__PURE__ */
|
|
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
|
|
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
|
|
226
|
-
var Checkbox =
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
731
|
+
return /* @__PURE__ */ jsxs11("div", { className: cn("cfi-ui", "cfi-ui-checkbox-row", className), children: [
|
|
242
732
|
box,
|
|
243
|
-
/* @__PURE__ */
|
|
244
|
-
/* @__PURE__ */
|
|
245
|
-
description && /* @__PURE__ */
|
|
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
|
|
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
|
|
293
|
-
var Slider =
|
|
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__ */
|
|
298
|
-
/* @__PURE__ */
|
|
299
|
-
/* @__PURE__ */
|
|
300
|
-
values.map((_, i) => /* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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
|
|
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 =
|
|
779
|
+
var DialogContent = forwardRef11(
|
|
323
780
|
function DialogContent2({ size = "md", side = "center", hideClose = false, closeLabel = "Close", className, children, ...rest }, ref) {
|
|
324
|
-
return /* @__PURE__ */
|
|
325
|
-
/* @__PURE__ */
|
|
326
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
355
|
-
}
|
|
356
|
-
var DialogTitle =
|
|
357
|
-
return /* @__PURE__ */
|
|
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
|
|
551
|
-
return /* @__PURE__ */
|
|
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
|
|
557
|
-
return /* @__PURE__ */
|
|
819
|
+
function DialogBody({ className, ...rest }) {
|
|
820
|
+
return /* @__PURE__ */ jsx13("div", { className: cn("cfi-ui-dialog__body", className), ...rest });
|
|
558
821
|
}
|
|
559
|
-
function
|
|
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
|
-
|
|
836
|
+
children
|
|
562
837
|
}) {
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
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
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
842
|
+
size,
|
|
843
|
+
side,
|
|
844
|
+
hideClose,
|
|
845
|
+
className,
|
|
846
|
+
onEscapeKeyDown: block,
|
|
847
|
+
onPointerDownOutside: block,
|
|
848
|
+
onInteractOutside: block,
|
|
641
849
|
children: [
|
|
642
|
-
/* @__PURE__ */
|
|
643
|
-
|
|
644
|
-
|
|
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
|
|
659
|
-
|
|
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
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
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
|
-
|
|
681
|
-
|
|
882
|
+
title,
|
|
883
|
+
description,
|
|
884
|
+
confirmLabel = "Confirm",
|
|
885
|
+
cancelLabel = "Cancel",
|
|
886
|
+
destructive = true,
|
|
887
|
+
loading = false,
|
|
888
|
+
onConfirm,
|
|
889
|
+
children
|
|
682
890
|
}) {
|
|
683
|
-
|
|
684
|
-
|
|
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
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
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__ */
|
|
701
|
-
|
|
702
|
-
{
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
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
|
|
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] =
|
|
761
|
-
const [draft, setDraft] =
|
|
762
|
-
const [pending, setPending] =
|
|
763
|
-
const [error, setError] =
|
|
764
|
-
const [created, setCreated] =
|
|
765
|
-
const merged =
|
|
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 =
|
|
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__ */
|
|
805
|
-
/* @__PURE__ */
|
|
806
|
-
showAdd && /* @__PURE__ */
|
|
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__ */
|
|
1007
|
+
icon: /* @__PURE__ */ jsx14(Plus, { "aria-hidden": "true" }),
|
|
813
1008
|
label: addLabel,
|
|
814
1009
|
onClick: () => setOpen(true)
|
|
815
1010
|
}
|
|
816
1011
|
),
|
|
817
|
-
/* @__PURE__ */
|
|
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__ */
|
|
826
|
-
/* @__PURE__ */
|
|
827
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
876
|
-
import { Check as Check4, ChevronDown as
|
|
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
|
|
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] =
|
|
905
|
-
const [search, setSearch] =
|
|
906
|
-
const [highlighted, setHighlighted] =
|
|
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 =
|
|
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__ */
|
|
965
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
989
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
1196
|
+
children: /* @__PURE__ */ jsx15(X3, { "aria-hidden": "true" })
|
|
1002
1197
|
}
|
|
1003
1198
|
),
|
|
1004
|
-
name && /* @__PURE__ */
|
|
1199
|
+
name && /* @__PURE__ */ jsx15("input", { type: "hidden", name, value: value ?? "" })
|
|
1005
1200
|
]
|
|
1006
1201
|
}
|
|
1007
1202
|
) }),
|
|
1008
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1021
|
-
/* @__PURE__ */
|
|
1022
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
1063
|
-
/* @__PURE__ */
|
|
1064
|
-
/* @__PURE__ */
|
|
1065
|
-
option.hint && /* @__PURE__ */
|
|
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
|
|
1276
|
+
import { forwardRef as forwardRef12 } from "react";
|
|
1082
1277
|
import * as RadixTooltip from "@radix-ui/react-tooltip";
|
|
1083
|
-
import { Fragment as Fragment3, jsx as
|
|
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 =
|
|
1088
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
1106
|
-
return /* @__PURE__ */
|
|
1107
|
-
/* @__PURE__ */
|
|
1108
|
-
/* @__PURE__ */
|
|
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
|
|
1114
|
-
import { AlertTriangle, CheckCircle2, Info, X as
|
|
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
|
|
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] =
|
|
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 =
|
|
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__ */
|
|
1373
|
+
return /* @__PURE__ */ jsxs17(ToastContext.Provider, { value: api, children: [
|
|
1179
1374
|
children,
|
|
1180
|
-
/* @__PURE__ */
|
|
1375
|
+
/* @__PURE__ */ jsx17(ToastViewport, { items, onDismiss: dismiss, position })
|
|
1181
1376
|
] });
|
|
1182
1377
|
}
|
|
1183
1378
|
var TONE_ICON = {
|
|
1184
|
-
neutral: /* @__PURE__ */
|
|
1185
|
-
info: /* @__PURE__ */
|
|
1186
|
-
success: /* @__PURE__ */
|
|
1187
|
-
warning: /* @__PURE__ */
|
|
1188
|
-
error: /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
1205
|
-
/* @__PURE__ */
|
|
1206
|
-
/* @__PURE__ */
|
|
1207
|
-
/* @__PURE__ */
|
|
1208
|
-
item.description && /* @__PURE__ */
|
|
1209
|
-
item.action && /* @__PURE__ */
|
|
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__ */
|
|
1417
|
+
/* @__PURE__ */ jsx17(
|
|
1223
1418
|
IconButton,
|
|
1224
1419
|
{
|
|
1225
1420
|
variant: "ghost",
|
|
1226
1421
|
size: "sm",
|
|
1227
|
-
icon: /* @__PURE__ */
|
|
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
|
|
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
|
|
1246
|
-
var Card =
|
|
1247
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
1261
|
-
actions ? /* @__PURE__ */
|
|
1262
|
-
actions && /* @__PURE__ */
|
|
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__ */
|
|
1461
|
+
return /* @__PURE__ */ jsx18(Tag, { className: cn("cfi-ui-card__title", className), ...rest });
|
|
1267
1462
|
}
|
|
1268
1463
|
function CardDescription({ className, ...rest }) {
|
|
1269
|
-
return /* @__PURE__ */
|
|
1464
|
+
return /* @__PURE__ */ jsx18("p", { className: cn("cfi-ui-card__description", className), ...rest });
|
|
1270
1465
|
}
|
|
1271
1466
|
function CardBody({ className, ...rest }) {
|
|
1272
|
-
return /* @__PURE__ */
|
|
1467
|
+
return /* @__PURE__ */ jsx18("div", { className: cn("cfi-ui-card__body", className), ...rest });
|
|
1273
1468
|
}
|
|
1274
1469
|
function CardFooter({ className, ...rest }) {
|
|
1275
|
-
return /* @__PURE__ */
|
|
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
|
|
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
|
|
1317
|
-
var Table =
|
|
1318
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
1499
|
+
return /* @__PURE__ */ jsx19("thead", { className: cn("cfi-ui-table__head", className), ...rest });
|
|
1335
1500
|
}
|
|
1336
1501
|
function TableBody({ className, ...rest }) {
|
|
1337
|
-
return /* @__PURE__ */
|
|
1502
|
+
return /* @__PURE__ */ jsx19("tbody", { className: cn("cfi-ui-table__body", className), ...rest });
|
|
1338
1503
|
}
|
|
1339
1504
|
function TableFooter({ className, ...rest }) {
|
|
1340
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
1377
|
-
/* @__PURE__ */
|
|
1378
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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
|
|
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 =
|
|
1577
|
+
var TabsList = forwardRef15(
|
|
1413
1578
|
function TabsList2({ variant = "pill", className, ...rest }, ref) {
|
|
1414
|
-
return /* @__PURE__ */
|
|
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 =
|
|
1590
|
+
var TabsTrigger = forwardRef15(
|
|
1426
1591
|
function TabsTrigger2({ icon, count, className, children, ...rest }, ref) {
|
|
1427
|
-
return /* @__PURE__ */
|
|
1428
|
-
icon && /* @__PURE__ */
|
|
1429
|
-
/* @__PURE__ */
|
|
1430
|
-
count !== void 0 && /* @__PURE__ */
|
|
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 =
|
|
1435
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
1497
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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 =
|
|
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__ */
|
|
1551
|
-
src ? /* @__PURE__ */
|
|
1552
|
-
!src && /* @__PURE__ */
|
|
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__ */
|
|
1724
|
+
return /* @__PURE__ */ jsxs21("div", { className: cn("cfi-ui", "cfi-ui-avatar-group", className), ...rest, children: [
|
|
1560
1725
|
shown,
|
|
1561
|
-
hidden > 0 && /* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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
|
|
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
|
|
1760
|
+
import { jsx as jsx22, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
1596
1761
|
var AccordionRoot = RadixAccordion.Root;
|
|
1597
|
-
var AccordionItem =
|
|
1598
|
-
return /* @__PURE__ */
|
|
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 =
|
|
1601
|
-
return /* @__PURE__ */
|
|
1602
|
-
/* @__PURE__ */
|
|
1603
|
-
/* @__PURE__ */
|
|
1604
|
-
meta && /* @__PURE__ */
|
|
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 =
|
|
1608
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
1626
|
-
/* @__PURE__ */
|
|
1627
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
1688
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1703
|
-
/* @__PURE__ */
|
|
1704
|
-
/* @__PURE__ */
|
|
1705
|
-
/* @__PURE__ */
|
|
1706
|
-
message && /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
1720
|
-
icon && /* @__PURE__ */
|
|
1721
|
-
/* @__PURE__ */
|
|
1722
|
-
/* @__PURE__ */
|
|
1723
|
-
description && /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
1905
|
+
import { useCallback as useCallback2, useMemo as useMemo5, useState as useState5 } from "react";
|
|
1741
1906
|
function useSortState(initialKey, initialDirection = "asc") {
|
|
1742
|
-
const [sort, setSort] =
|
|
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
|
|
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
|
|
1780
|
-
import { Search as Search2, X as
|
|
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
|
|
1787
|
-
var SearchInput =
|
|
1788
|
-
const [local, setLocal] =
|
|
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__ */
|
|
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__ */
|
|
1815
|
-
suffix: local ? /* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
1847
|
-
/* @__PURE__ */
|
|
1848
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2021
|
+
children: /* @__PURE__ */ jsx25(ChevronLeft, { "aria-hidden": "true" })
|
|
1857
2022
|
}
|
|
1858
2023
|
),
|
|
1859
|
-
/* @__PURE__ */
|
|
2024
|
+
/* @__PURE__ */ jsxs24("span", { className: "cfi-ui-pagination__page", children: [
|
|
1860
2025
|
current,
|
|
1861
2026
|
" / ",
|
|
1862
2027
|
pageCount
|
|
1863
2028
|
] }),
|
|
1864
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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,
|