@murumets-ee/ui 0.35.0 → 0.35.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.mts CHANGED
@@ -201,6 +201,38 @@ declare const FormMessage: import("react").ForwardRefExoticComponent<HTMLAttribu
201
201
  //#region src/icon.d.ts
202
202
  /** Override the icon endpoint base (default `/api/admin/icons`). Call once at app boot. */
203
203
  declare function setIconEndpoint(base: string): void;
204
+ /**
205
+ * Prewarm the shared cache for many icons in ONE request per {@link ICON_BATCH_MAX}
206
+ * chunk (one request for any set up to the cap).
207
+ *
208
+ * Callers that render many `<Icon>`s at once — the picker grid, the sidebar, the
209
+ * nav editor — MUST call this for their visible set *before those `<Icon>`s mount*,
210
+ * so the set is fetched with a single batched request instead of one request per
211
+ * cell. A grid of N cells each fetching its own SVG fires N same-IP requests in a
212
+ * burst, which WAFs like CrowdSec read as a scan and ban the IP for (and is a
213
+ * self-inflicted DoS). See the "No Unbounded Fan-Out" rule in CLAUDE.md.
214
+ *
215
+ * Only names not already cached are requested, so repeat opens/searches don't
216
+ * re-fetch. Each requested name is seeded with a shared in-flight promise
217
+ * synchronously (before the first `await`), so a concurrent per-name
218
+ * {@link fetchIconSvg} (e.g. an `<Icon>` that mounts before this resolves) dedupes
219
+ * onto the same batch request rather than firing its own — and a render-time caller
220
+ * wins the race against its own child `<Icon>` effects.
221
+ */
222
+ declare function prewarmIcons(names: readonly string[]): Promise<void>;
223
+ /**
224
+ * Seed the icon cache for `names` in one batched request DURING render — before the
225
+ * `<Icon>` cells that consume them mount — so those cells dedupe onto the single
226
+ * batch instead of each firing their own request (the fan-out {@link prewarmIcons}
227
+ * exists to prevent). An effect can't do this: child effects run before the
228
+ * parent's, losing the race.
229
+ *
230
+ * Shared by every site that renders many icons at once (picker grid, sidebar, nav
231
+ * editor). A prev-tracker ref fires the seed once per distinct set;
232
+ * {@link prewarmIcons} itself dedupes, no-ops when warm, and is browser-only. Pass
233
+ * `enabled=false` to skip while a set isn't visible yet (e.g. a closed dialog).
234
+ */
235
+ declare function usePrewarmIcons(names: readonly string[], enabled?: boolean): void;
204
236
  interface IconProps {
205
237
  /** Lucide kebab-case name (e.g. `panel-left`). Unknown/empty → renders nothing. */
206
238
  name?: string | null | undefined;
@@ -275,5 +307,5 @@ declare const TableCell: import("react").ForwardRefExoticComponent<TdHTMLAttribu
275
307
  //#region src/textarea.d.ts
276
308
  declare const Textarea: import("react").ForwardRefExoticComponent<TextareaHTMLAttributes<HTMLTextAreaElement> & import("react").RefAttributes<HTMLTextAreaElement>>;
277
309
  //#endregion
278
- export { Badge, type BadgeProps, Button, type ButtonProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, type ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, DataTable, DataTableColumnHeader, DataTableViewOptions, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuSeparator, DropdownMenuTrigger, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, Icon, IconPicker, type IconPickerProps, type IconProps, Input, Label, Select, Separator, Skeleton, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Textarea, Toaster, cn, setIconEndpoint, toast };
310
+ export { Badge, type BadgeProps, Button, type ButtonProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, type ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, DataTable, DataTableColumnHeader, DataTableViewOptions, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuSeparator, DropdownMenuTrigger, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, Icon, IconPicker, type IconPickerProps, type IconProps, Input, Label, Select, Separator, Skeleton, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Textarea, Toaster, cn, prewarmIcons, setIconEndpoint, toast, usePrewarmIcons };
279
311
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/badge.tsx","../src/button.tsx","../src/card.tsx","../src/chart.tsx","../src/checkbox.tsx","../src/collapsible.tsx","../src/data-table/data-table.tsx","../src/data-table/data-table-column-header.tsx","../src/data-table/data-table-view-options.tsx","../src/dialog.tsx","../src/dropdown-menu.tsx","../src/form.tsx","../src/icon.tsx","../src/icon-picker.tsx","../src/input.tsx","../src/label.tsx","../src/lib/cn.ts","../src/select.tsx","../src/separator.tsx","../src/skeleton.tsx","../src/sonner.tsx","../src/table.tsx","../src/textarea.tsx"],"mappings":";;;;;;;;;;;;;;;;;UAGiB,UAAA,SAAmB,cAAc,CAAC,cAAA;EACjD,OAAA;AAAA;AAAA,iBAUc,KAAA,CAAA;EAAQ,SAAA;EAAW,OAAA;EAAA,GAAwB;AAAA,GAAS,UAAA,+BAAU,GAAA,CAAA,OAAA;;;UCT7D,WAAA,SAAoB,oBAAoB,CAAC,iBAAA;EACxD,OAAA;EACA,IAAA;EACA,OAAA;EACA,OAAA;AAAA;AAAA,cAoBW,MAAA,kBAAM,yBAAA,CAAA,WAAA,mBAAA,aAAA,CAAA,iBAAA;;;cC1BN,IAAA,kBAAI,yBAAA,CAAA,cAAA,CAAA,cAAA,oBAAA,aAAA,CAAA,cAAA;AAAA,cAWJ,UAAA,kBAAU,yBAAA,CAAA,cAAA,CAAA,cAAA,oBAAA,aAAA,CAAA,cAAA;AAAA,cAOV,SAAA,kBAAS,yBAAA,CAAA,cAAA,CAAA,cAAA,oBAAA,aAAA,CAAA,cAAA;AAAA,cAWT,eAAA,kBAAe,yBAAA,CAAA,cAAA,CAAA,cAAA,oBAAA,aAAA,CAAA,cAAA;AAAA,cAOf,WAAA,kBAAW,yBAAA,CAAA,cAAA,CAAA,cAAA,oBAAA,aAAA,CAAA,cAAA;AAAA,cAOX,UAAA,kBAAU,yBAAA,CAAA,cAAA,CAAA,cAAA,oBAAA,aAAA,CAAA,cAAA;;;cCrBjB,MAAA;EAAA,SAA8C,KAAA;EAAA,SAAA,IAAA;AAAA;AAAA,KAG/C,eAAA;AAAA,KA4BO,WAAA,GAAc,MAAA;EAGtB,KAAA,GAAQ,OAAA,CAAM,SAAA;EACd,IAAA,GAAO,OAAA,CAAM,aAAA;AAAA;EAET,KAAA;EAAgB,KAAA;AAAA;EAChB,KAAA;EAAe,KAAA,EAAO,MAAA,cAAoB,MAAA;AAAA;AAAA,iBAkFzC,cAAA,CAAA;EACP,EAAA;EACA,SAAA;EACA,QAAA;EACA,MAAA;EACA,gBAAA;EACA,KAAA;EAAA,GACG;AAAA,GACF,OAAA,CAAM,cAAA;EACP,MAAA,EAAQ,WAAA;EACR,QAAA,EAAU,OAAA,CAAM,cAAA,QAAsB,iBAAA,CAAkB,mBAAA;EACxD,gBAAA;IACE,KAAA;IACA,MAAA;EAAA,GFzJsD;EE4JxD,KAAA;AAAA,gCACD,GAAA,CAAA,OAAA;AAAA,cA6CK,YAAA,SAAY,iBAAA,CAAA,OAA4B;AAAA,iBAErC,mBAAA,CAAA;EACP,MAAA;EACA,OAAA;EACA,SAAA;EACA,SAAA;EACA,SAAA;EACA,aAAA;EACA,KAAA;EACA,cAAA;EACA,cAAA;EACA,SAAA;EACA,KAAA;EACA,OAAA;EACA;AAAA,GACC,OAAA,CAAM,cAAA,QAAsB,iBAAA,CAAkB,OAAA,IAC/C,OAAA,CAAM,cAAA;EACJ,SAAA;EACA,aAAA;EACA,SAAA;EACA,OAAA;EACA,QAAA;AAAA,IACE,IAAA,CACF,iBAAA,CAAkB,0BAAA,CAA2B,gBAAA,EAAkB,eAAA,uDAEhE,GAAA,CAAA,OAAA;;;cCpOU,QAAA,kBAAQ,yBAAA,CAAA,IAAA,CAAA,iBAAA,CAAA,aAAA,mBAAA,aAAA,CAAA,iBAAA,4BAAA,aAAA,CAAA,iBAAA;;;;;;;;;;;;cCMR,WAAA,kBAAW,yBAAA,CAAA,oBAAA,CAAA,gBAAA,mBAAA,aAAA,CAAA,cAAA;AAAA,cACX,kBAAA,kBAAkB,yBAAA,CAAA,oBAAA,CAAA,uBAAA,mBAAA,aAAA,CAAA,iBAAA;AAAA,cAClB,kBAAA,kBAAkB,yBAAA,CAAA,oBAAA,CAAA,uBAAA,mBAAA,aAAA,CAAA,cAAA;;;UCOd,mBAAA;EACf,IAAA;EACA,OAAA;EACA,KAAA;EACA,UAAA;AAAA;AAAA,UAGe,cAAA;EACf,OAAA,EAAS,SAAA,CAAU,KAAA,EAAO,MAAA;EAC1B,IAAA,EAAM,KAAA;EACN,SAAA;EACA,iBAAA;EACA,QAAA;EACA,YAAA;EACA,UAAA,GAAa,mBAAA;AAAA;AAAA,iBAGC,SAAA,eAAA,CAAA;EACd,OAAA;EACA,IAAA;EACA,SAAA;EACA,iBAAA;EACA,QAAA;EACA,YAAA;EACA;AAAA,GACC,cAAA,CAAe,KAAA,EAAO,MAAA,gCAAO,GAAA,CAAA,OAAA;;;UCjCtB,0BAAA;EACR,MAAA,EAAQ,MAAA,CAAO,KAAA,EAAO,MAAA;EACtB,KAAA;EACA,SAAA;AAAA;AAAA,iBAGc,qBAAA,eAAA,CAAA;EACd,MAAA;EACA,KAAA;EACA;AAAA,GACC,0BAAA,CAA2B,KAAA,EAAO,MAAA,gCAAO,GAAA,CAAA,OAAA;;;UCVlC,yBAAA;EACR,KAAA,EAAO,OAAK,CAAC,KAAA;AAAA;AAAA,iBAGC,oBAAA,OAAA,CAAA;EAA8B;AAAA,GAAS,yBAAA,CAA0B,KAAA,gCAAM,GAAA,CAAA,OAAA;;;cCX1E,MAAA,kBAAM,EAAA,CAAA,eAAA,CAAA,WAAA;AAAA,cACN,aAAA,kBAAa,yBAAA,CAAA,eAAA,CAAA,kBAAA,mBAAA,aAAA,CAAA,iBAAA;AAAA,cACb,WAAA,kBAAW,yBAAA,CAAA,eAAA,CAAA,gBAAA,mBAAA,aAAA,CAAA,iBAAA;AAAA,cAoBX,aAAA,kBAAa,yBAAA,CAAA,IAAA,CAAA,eAAA,CAAA,kBAAA,mBAAA,aAAA,CAAA,cAAA,4BAAA,aAAA,CAAA,cAAA;AAAA,iBAqCV,YAAA,CAAA;EAAe,SAAA;EAAA,GAAc;AAAA,GAAS,cAAA,CAAe,cAAA,gCAAe,GAAA,CAAA,OAAA;AAAA,iBASpE,YAAA,CAAA;EAAe,SAAA;EAAA,GAAc;AAAA,GAAS,cAAA,CAAe,cAAA,gCAAe,GAAA,CAAA,OAAA;AAAA,cASvE,WAAA,kBAAW,yBAAA,CAAA,IAAA,CAAA,eAAA,CAAA,gBAAA,mBAAA,aAAA,CAAA,kBAAA,4BAAA,aAAA,CAAA,kBAAA;AAAA,cAYX,iBAAA,kBAAiB,yBAAA,CAAA,IAAA,CAAA,eAAA,CAAA,sBAAA,mBAAA,aAAA,CAAA,oBAAA,4BAAA,aAAA,CAAA,oBAAA;;;cCzFjB,YAAA,kBAAY,EAAA,CAAA,qBAAA,CAAA,iBAAA;AAAA,cACZ,mBAAA,kBAAmB,yBAAA,CAAA,qBAAA,CAAA,wBAAA,mBAAA,aAAA,CAAA,iBAAA;AAAA,cAEnB,kBAAA,kBAAkB,EAAA,CAAA,qBAAA,CAAA,uBAAA;AAAA,cAGlB,mBAAA,kBAAmB,yBAAA,CAAA,IAAA,CAAA,qBAAA,CAAA,wBAAA,mBAAA,aAAA,CAAA,cAAA,4BAAA,aAAA,CAAA,cAAA;AAAA,cAuBnB,gBAAA,kBAAgB,yBAAA,CAAA,IAAA,CAAA,qBAAA,CAAA,qBAAA,mBAAA,aAAA,CAAA,cAAA;;;cA4ChB,iBAAA,kBAAiB,yBAAA,CAAA,IAAA,CAAA,qBAAA,CAAA,sBAAA,mBAAA,aAAA,CAAA,cAAA;;;cAYjB,qBAAA,kBAAqB,yBAAA,CAAA,IAAA,CAAA,qBAAA,CAAA,0BAAA,mBAAA,aAAA,CAAA,cAAA,4BAAA,aAAA,CAAA,cAAA;;;cC5DrB,IAAA,SAAa,YAA2B;AAAA,iBAarC,SAAA,sBACO,WAAA,GAAc,WAAA,gBACrB,SAAA,CAAU,YAAA,IAAgB,SAAA,CAAU,YAAA,EAAA,CAClD,KAAA,EAAO,eAAA,CAAgB,YAAA,EAAc,KAAA,gCAAM,GAAA,CAAA,OAAA;AAAA,cAuChC,QAAA,kBAAQ,yBAAA,CAAA,cAAA,CAAA,cAAA,oBAAA,aAAA,CAAA,cAAA;AAAA,cAcR,SAAA,kBAAS,yBAAA,CAAA,IAAA,CAAA,cAAA,CAAA,UAAA,mBAAA,aAAA,CAAA,gBAAA,4BAAA,aAAA,CAAA,gBAAA;AAAA,cAkBT,WAAA,kBAAW,yBAAA,CAAA,IAAA,gCAAA,SAAA,mBAAA,aAAA,CAAA,WAAA,4BAAA,aAAA,CAAA,cAAA;AAAA,cAkBX,eAAA,kBAAe,yBAAA,CAAA,cAAA,CAAA,oBAAA,oBAAA,aAAA,CAAA,oBAAA;AAAA,cAkBf,WAAA,kBAAW,yBAAA,CAAA,cAAA,CAAA,oBAAA,oBAAA,aAAA,CAAA,oBAAA;;;;iBCnIR,eAAA,CAAgB,IAAY;AAAA,UAuD3B,SAAA;;EAEf,IAAA;;EAEA,SAAA;;EAEA,IAAA;AAAA;AAAA,iBAGc,IAAA,CAAA;EAAO,IAAA;EAAM,SAAA;EAAW;AAAA,GAAQ,SAAA,GAAY,KAAA,CAAM,YAAA;;;UC7DjD,eAAA;;EAEf,KAAA;;EAEA,QAAA,GAAW,IAAA;;EAEX,WAAA;;EAEA,SAAA;;EAEA,QAAA;;;;;EAKA,EAAA;EACA,kBAAA;EACA,cAAA,GAAiB,KAAA,CAAM,cAAc;AAAA;AAAA,cAG1B,UAAA,kBAAU,yBAAA,CAAA,eAAA,mBAAA,aAAA,CAAA,iBAAA;;;cC1CV,KAAA,kBAAK,yBAAA,CAAA,mBAAA,CAAA,gBAAA,oBAAA,aAAA,CAAA,gBAAA;;;cCCL,KAAA,kBAAK,yBAAA,CAAA,IAAA,CAAA,cAAA,CAAA,UAAA,mBAAA,aAAA,CAAA,gBAAA,4BAAA,aAAA,CAAA,gBAAA;;;iBCDF,EAAA,CAAA,GAAM,MAAA,EAAQ,UAAU;;;cCA3B,MAAA,kBAAM,yBAAA,CAAA,oBAAA,CAAA,iBAAA,oBAAA,aAAA,CAAA,iBAAA;;;cCCN,SAAA,kBAAS,yBAAA,CAAA,IAAA,CAAA,kBAAA,CAAA,cAAA,mBAAA,aAAA,CAAA,cAAA,4BAAA,aAAA,CAAA,cAAA;;;iBCDN,QAAA,CAAA;EAAW,SAAA;EAAA,GAAc;AAAA,GAAS,cAAA,CAAe,cAAA,gCAAe,GAAA,CAAA,OAAA;;;iBC8BvE,OAAA,CAAA;EAAU,YAAA;EAAA,GAAiB;AAAA,GAAS,cAAA,QAAsB,SAAA,gCAAc,GAAA,CAAA,OAAA;;;cCzBpE,KAAA,kBAAK,yBAAA,CAAA,cAAA,CAAA,gBAAA,oBAAA,aAAA,CAAA,gBAAA;AAAA,cASL,WAAA,kBAAW,yBAAA,CAAA,cAAA,CAAA,uBAAA,oBAAA,aAAA,CAAA,uBAAA;AAAA,cAQX,SAAA,kBAAS,yBAAA,CAAA,cAAA,CAAA,uBAAA,oBAAA,aAAA,CAAA,uBAAA;AAAA,cAoBT,QAAA,kBAAQ,yBAAA,CAAA,cAAA,CAAA,mBAAA,oBAAA,aAAA,CAAA,mBAAA;AAAA,cAcR,SAAA,kBAAS,yBAAA,CAAA,gBAAA,CAAA,oBAAA,oBAAA,aAAA,CAAA,oBAAA;AAAA,cAeT,SAAA,kBAAS,yBAAA,CAAA,gBAAA,CAAA,oBAAA,oBAAA,aAAA,CAAA,oBAAA;;;cCvET,QAAA,kBAAQ,yBAAA,CAAA,sBAAA,CAAA,mBAAA,oBAAA,aAAA,CAAA,mBAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/badge.tsx","../src/button.tsx","../src/card.tsx","../src/chart.tsx","../src/checkbox.tsx","../src/collapsible.tsx","../src/data-table/data-table.tsx","../src/data-table/data-table-column-header.tsx","../src/data-table/data-table-view-options.tsx","../src/dialog.tsx","../src/dropdown-menu.tsx","../src/form.tsx","../src/icon.tsx","../src/icon-picker.tsx","../src/input.tsx","../src/label.tsx","../src/lib/cn.ts","../src/select.tsx","../src/separator.tsx","../src/skeleton.tsx","../src/sonner.tsx","../src/table.tsx","../src/textarea.tsx"],"mappings":";;;;;;;;;;;;;;;;;UAGiB,UAAA,SAAmB,cAAc,CAAC,cAAA;EACjD,OAAA;AAAA;AAAA,iBAUc,KAAA,CAAA;EAAQ,SAAA;EAAW,OAAA;EAAA,GAAwB;AAAA,GAAS,UAAA,+BAAU,GAAA,CAAA,OAAA;;;UCT7D,WAAA,SAAoB,oBAAoB,CAAC,iBAAA;EACxD,OAAA;EACA,IAAA;EACA,OAAA;EACA,OAAA;AAAA;AAAA,cAoBW,MAAA,kBAAM,yBAAA,CAAA,WAAA,mBAAA,aAAA,CAAA,iBAAA;;;cC1BN,IAAA,kBAAI,yBAAA,CAAA,cAAA,CAAA,cAAA,oBAAA,aAAA,CAAA,cAAA;AAAA,cAWJ,UAAA,kBAAU,yBAAA,CAAA,cAAA,CAAA,cAAA,oBAAA,aAAA,CAAA,cAAA;AAAA,cAOV,SAAA,kBAAS,yBAAA,CAAA,cAAA,CAAA,cAAA,oBAAA,aAAA,CAAA,cAAA;AAAA,cAWT,eAAA,kBAAe,yBAAA,CAAA,cAAA,CAAA,cAAA,oBAAA,aAAA,CAAA,cAAA;AAAA,cAOf,WAAA,kBAAW,yBAAA,CAAA,cAAA,CAAA,cAAA,oBAAA,aAAA,CAAA,cAAA;AAAA,cAOX,UAAA,kBAAU,yBAAA,CAAA,cAAA,CAAA,cAAA,oBAAA,aAAA,CAAA,cAAA;;;cCrBjB,MAAA;EAAA,SAA8C,KAAA;EAAA,SAAA,IAAA;AAAA;AAAA,KAG/C,eAAA;AAAA,KA4BO,WAAA,GAAc,MAAA;EAGtB,KAAA,GAAQ,OAAA,CAAM,SAAA;EACd,IAAA,GAAO,OAAA,CAAM,aAAA;AAAA;EAET,KAAA;EAAgB,KAAA;AAAA;EAChB,KAAA;EAAe,KAAA,EAAO,MAAA,cAAoB,MAAA;AAAA;AAAA,iBAkFzC,cAAA,CAAA;EACP,EAAA;EACA,SAAA;EACA,QAAA;EACA,MAAA;EACA,gBAAA;EACA,KAAA;EAAA,GACG;AAAA,GACF,OAAA,CAAM,cAAA;EACP,MAAA,EAAQ,WAAA;EACR,QAAA,EAAU,OAAA,CAAM,cAAA,QAAsB,iBAAA,CAAkB,mBAAA;EACxD,gBAAA;IACE,KAAA;IACA,MAAA;EAAA,GFzJsD;EE4JxD,KAAA;AAAA,gCACD,GAAA,CAAA,OAAA;AAAA,cA6CK,YAAA,SAAY,iBAAA,CAAA,OAA4B;AAAA,iBAErC,mBAAA,CAAA;EACP,MAAA;EACA,OAAA;EACA,SAAA;EACA,SAAA;EACA,SAAA;EACA,aAAA;EACA,KAAA;EACA,cAAA;EACA,cAAA;EACA,SAAA;EACA,KAAA;EACA,OAAA;EACA;AAAA,GACC,OAAA,CAAM,cAAA,QAAsB,iBAAA,CAAkB,OAAA,IAC/C,OAAA,CAAM,cAAA;EACJ,SAAA;EACA,aAAA;EACA,SAAA;EACA,OAAA;EACA,QAAA;AAAA,IACE,IAAA,CACF,iBAAA,CAAkB,0BAAA,CAA2B,gBAAA,EAAkB,eAAA,uDAEhE,GAAA,CAAA,OAAA;;;cCpOU,QAAA,kBAAQ,yBAAA,CAAA,IAAA,CAAA,iBAAA,CAAA,aAAA,mBAAA,aAAA,CAAA,iBAAA,4BAAA,aAAA,CAAA,iBAAA;;;;;;;;;;;;cCMR,WAAA,kBAAW,yBAAA,CAAA,oBAAA,CAAA,gBAAA,mBAAA,aAAA,CAAA,cAAA;AAAA,cACX,kBAAA,kBAAkB,yBAAA,CAAA,oBAAA,CAAA,uBAAA,mBAAA,aAAA,CAAA,iBAAA;AAAA,cAClB,kBAAA,kBAAkB,yBAAA,CAAA,oBAAA,CAAA,uBAAA,mBAAA,aAAA,CAAA,cAAA;;;UCOd,mBAAA;EACf,IAAA;EACA,OAAA;EACA,KAAA;EACA,UAAA;AAAA;AAAA,UAGe,cAAA;EACf,OAAA,EAAS,SAAA,CAAU,KAAA,EAAO,MAAA;EAC1B,IAAA,EAAM,KAAA;EACN,SAAA;EACA,iBAAA;EACA,QAAA;EACA,YAAA;EACA,UAAA,GAAa,mBAAA;AAAA;AAAA,iBAGC,SAAA,eAAA,CAAA;EACd,OAAA;EACA,IAAA;EACA,SAAA;EACA,iBAAA;EACA,QAAA;EACA,YAAA;EACA;AAAA,GACC,cAAA,CAAe,KAAA,EAAO,MAAA,gCAAO,GAAA,CAAA,OAAA;;;UCjCtB,0BAAA;EACR,MAAA,EAAQ,MAAA,CAAO,KAAA,EAAO,MAAA;EACtB,KAAA;EACA,SAAA;AAAA;AAAA,iBAGc,qBAAA,eAAA,CAAA;EACd,MAAA;EACA,KAAA;EACA;AAAA,GACC,0BAAA,CAA2B,KAAA,EAAO,MAAA,gCAAO,GAAA,CAAA,OAAA;;;UCVlC,yBAAA;EACR,KAAA,EAAO,OAAK,CAAC,KAAA;AAAA;AAAA,iBAGC,oBAAA,OAAA,CAAA;EAA8B;AAAA,GAAS,yBAAA,CAA0B,KAAA,gCAAM,GAAA,CAAA,OAAA;;;cCX1E,MAAA,kBAAM,EAAA,CAAA,eAAA,CAAA,WAAA;AAAA,cACN,aAAA,kBAAa,yBAAA,CAAA,eAAA,CAAA,kBAAA,mBAAA,aAAA,CAAA,iBAAA;AAAA,cACb,WAAA,kBAAW,yBAAA,CAAA,eAAA,CAAA,gBAAA,mBAAA,aAAA,CAAA,iBAAA;AAAA,cAoBX,aAAA,kBAAa,yBAAA,CAAA,IAAA,CAAA,eAAA,CAAA,kBAAA,mBAAA,aAAA,CAAA,cAAA,4BAAA,aAAA,CAAA,cAAA;AAAA,iBAqCV,YAAA,CAAA;EAAe,SAAA;EAAA,GAAc;AAAA,GAAS,cAAA,CAAe,cAAA,gCAAe,GAAA,CAAA,OAAA;AAAA,iBASpE,YAAA,CAAA;EAAe,SAAA;EAAA,GAAc;AAAA,GAAS,cAAA,CAAe,cAAA,gCAAe,GAAA,CAAA,OAAA;AAAA,cASvE,WAAA,kBAAW,yBAAA,CAAA,IAAA,CAAA,eAAA,CAAA,gBAAA,mBAAA,aAAA,CAAA,kBAAA,4BAAA,aAAA,CAAA,kBAAA;AAAA,cAYX,iBAAA,kBAAiB,yBAAA,CAAA,IAAA,CAAA,eAAA,CAAA,sBAAA,mBAAA,aAAA,CAAA,oBAAA,4BAAA,aAAA,CAAA,oBAAA;;;cCzFjB,YAAA,kBAAY,EAAA,CAAA,qBAAA,CAAA,iBAAA;AAAA,cACZ,mBAAA,kBAAmB,yBAAA,CAAA,qBAAA,CAAA,wBAAA,mBAAA,aAAA,CAAA,iBAAA;AAAA,cAEnB,kBAAA,kBAAkB,EAAA,CAAA,qBAAA,CAAA,uBAAA;AAAA,cAGlB,mBAAA,kBAAmB,yBAAA,CAAA,IAAA,CAAA,qBAAA,CAAA,wBAAA,mBAAA,aAAA,CAAA,cAAA,4BAAA,aAAA,CAAA,cAAA;AAAA,cAuBnB,gBAAA,kBAAgB,yBAAA,CAAA,IAAA,CAAA,qBAAA,CAAA,qBAAA,mBAAA,aAAA,CAAA,cAAA;;;cA4ChB,iBAAA,kBAAiB,yBAAA,CAAA,IAAA,CAAA,qBAAA,CAAA,sBAAA,mBAAA,aAAA,CAAA,cAAA;;;cAYjB,qBAAA,kBAAqB,yBAAA,CAAA,IAAA,CAAA,qBAAA,CAAA,0BAAA,mBAAA,aAAA,CAAA,cAAA,4BAAA,aAAA,CAAA,cAAA;;;cC5DrB,IAAA,SAAa,YAA2B;AAAA,iBAarC,SAAA,sBACO,WAAA,GAAc,WAAA,gBACrB,SAAA,CAAU,YAAA,IAAgB,SAAA,CAAU,YAAA,EAAA,CAClD,KAAA,EAAO,eAAA,CAAgB,YAAA,EAAc,KAAA,gCAAM,GAAA,CAAA,OAAA;AAAA,cAuChC,QAAA,kBAAQ,yBAAA,CAAA,cAAA,CAAA,cAAA,oBAAA,aAAA,CAAA,cAAA;AAAA,cAcR,SAAA,kBAAS,yBAAA,CAAA,IAAA,CAAA,cAAA,CAAA,UAAA,mBAAA,aAAA,CAAA,gBAAA,4BAAA,aAAA,CAAA,gBAAA;AAAA,cAkBT,WAAA,kBAAW,yBAAA,CAAA,IAAA,gCAAA,SAAA,mBAAA,aAAA,CAAA,WAAA,4BAAA,aAAA,CAAA,cAAA;AAAA,cAkBX,eAAA,kBAAe,yBAAA,CAAA,cAAA,CAAA,oBAAA,oBAAA,aAAA,CAAA,oBAAA;AAAA,cAkBf,WAAA,kBAAW,yBAAA,CAAA,cAAA,CAAA,oBAAA,oBAAA,aAAA,CAAA,oBAAA;;;;iBCnIR,eAAA,CAAgB,IAAY;;;;;;;;;;;;;;;AZnB5C;;;;iBYoIsB,YAAA,CAAa,KAAA,sBAA2B,OAAO;;;;AZnI5D;AAUT;;;;;;;;iBY0JgB,eAAA,CAAgB,KAAA,qBAA0B,OAAc;AAAA,UAqBvD,SAAA;EZ/K0C;EYiLzD,IAAA;EZjL4E;EYmL5E,SAAA;EZnL4E;EYqL5E,IAAA;AAAA;AAAA,iBAGc,IAAA,CAAA;EAAO,IAAA;EAAM,SAAA;EAAW;AAAA,GAAQ,SAAA,GAAY,KAAA,CAAM,YAAA;;;UC7KjD,eAAA;;EAEf,KAAA;;EAEA,QAAA,GAAW,IAAA;;EAEX,WAAA;;EAEA,SAAA;;EAEA,QAAA;;;;;EAKA,EAAA;EACA,kBAAA;EACA,cAAA,GAAiB,KAAA,CAAM,cAAc;AAAA;AAAA,cAG1B,UAAA,kBAAU,yBAAA,CAAA,eAAA,mBAAA,aAAA,CAAA,iBAAA;;;cC1CV,KAAA,kBAAK,yBAAA,CAAA,mBAAA,CAAA,gBAAA,oBAAA,aAAA,CAAA,gBAAA;;;cCCL,KAAA,kBAAK,yBAAA,CAAA,IAAA,CAAA,cAAA,CAAA,UAAA,mBAAA,aAAA,CAAA,gBAAA,4BAAA,aAAA,CAAA,gBAAA;;;iBCDF,EAAA,CAAA,GAAM,MAAA,EAAQ,UAAU;;;cCA3B,MAAA,kBAAM,yBAAA,CAAA,oBAAA,CAAA,iBAAA,oBAAA,aAAA,CAAA,iBAAA;;;cCCN,SAAA,kBAAS,yBAAA,CAAA,IAAA,CAAA,kBAAA,CAAA,cAAA,mBAAA,aAAA,CAAA,cAAA,4BAAA,aAAA,CAAA,cAAA;;;iBCDN,QAAA,CAAA;EAAW,SAAA;EAAA,GAAc;AAAA,GAAS,cAAA,CAAe,cAAA,gCAAe,GAAA,CAAA,OAAA;;;iBC8BvE,OAAA,CAAA;EAAU,YAAA;EAAA,GAAiB;AAAA,GAAS,cAAA,QAAsB,SAAA,gCAAc,GAAA,CAAA,OAAA;;;cCzBpE,KAAA,kBAAK,yBAAA,CAAA,cAAA,CAAA,gBAAA,oBAAA,aAAA,CAAA,gBAAA;AAAA,cASL,WAAA,kBAAW,yBAAA,CAAA,cAAA,CAAA,uBAAA,oBAAA,aAAA,CAAA,uBAAA;AAAA,cAQX,SAAA,kBAAS,yBAAA,CAAA,cAAA,CAAA,uBAAA,oBAAA,aAAA,CAAA,uBAAA;AAAA,cAoBT,QAAA,kBAAQ,yBAAA,CAAA,cAAA,CAAA,mBAAA,oBAAA,aAAA,CAAA,mBAAA;AAAA,cAcR,SAAA,kBAAS,yBAAA,CAAA,gBAAA,CAAA,oBAAA,oBAAA,aAAA,CAAA,oBAAA;AAAA,cAeT,SAAA,kBAAS,yBAAA,CAAA,gBAAA,CAAA,oBAAA,oBAAA,aAAA,CAAA,oBAAA;;;cCvET,QAAA,kBAAQ,yBAAA,CAAA,sBAAA,CAAA,mBAAA,oBAAA,aAAA,CAAA,mBAAA"}
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import{clsx as e}from"clsx";import{twMerge as t}from"tailwind-merge";import{Fragment as n,jsx as r,jsxs as i}from"react/jsx-runtime";import{Slot as a}from"@radix-ui/react-slot";import{ArrowDown as o,ArrowUp as s,Check as c,ChevronLeft as l,ChevronRight as u,ChevronsLeft as d,ChevronsRight as f,ChevronsUpDown as p,EyeOff as m,Loader2 as h,Settings2 as g,X as _}from"lucide-react";import*as v from"react";import{createContext as y,forwardRef as b,useContext as x,useEffect as S,useId as ee,useMemo as C,useState as w}from"react";import*as te from"recharts";import*as ne from"@radix-ui/react-checkbox";import*as T from"@radix-ui/react-collapsible";import{flexRender as re,getCoreRowModel as ie,getFilteredRowModel as ae,getPaginationRowModel as oe,getSortedRowModel as se,useReactTable as ce}from"@tanstack/react-table";import*as E from"@radix-ui/react-dropdown-menu";import*as D from"@radix-ui/react-dialog";import{Controller as le,FormProvider as ue,useFormContext as de}from"react-hook-form";import*as fe from"@radix-ui/react-label";import*as pe from"@radix-ui/react-separator";import{Toaster as me,toast as he}from"sonner";function O(...n){return t(e(n))}const ge={default:`border-transparent bg-primary text-primary-foreground shadow-xs`,secondary:`border-transparent bg-secondary text-secondary-foreground`,destructive:`border-transparent bg-destructive text-destructive-foreground shadow-xs`,outline:`text-foreground`};function _e({className:e,variant:t=`default`,...n}){return r(`div`,{className:O(`inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold`,`transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2`,ge[t],e),...n})}const ve={default:`bg-primary text-primary-foreground shadow-xs hover:bg-primary/90`,destructive:`bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90`,outline:`border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground`,secondary:`bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80`,ghost:`hover:bg-accent hover:text-accent-foreground`,link:`text-primary underline-offset-4 hover:underline`},ye={default:`h-9 px-4 py-2`,sm:`h-8 rounded-md px-3 text-xs`,lg:`h-10 rounded-md px-8`,icon:`h-9 w-9`},k=b(({className:e,variant:t=`default`,size:n=`default`,loading:o=!1,asChild:s=!1,disabled:c,children:l,type:u=`button`,...d},f)=>{let p=O(`inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium`,`transition-colors cursor-pointer`,`focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`,`disabled:pointer-events-none disabled:opacity-50`,`[&_svg]:pointer-events-none [&_svg]:shrink-0`,ve[t],ye[n],e);return s?r(a,{ref:f,className:p,...d,children:l}):i(`button`,{ref:f,disabled:c||o,className:p,type:u,...d,children:[o&&r(h,{className:`h-4 w-4 animate-spin`}),l]})});k.displayName=`Button`;const be=b(({className:e,...t},n)=>r(`div`,{ref:n,className:O(`rounded-xl border bg-card text-card-foreground shadow-sm`,e),...t}));be.displayName=`Card`;const xe=b(({className:e,...t},n)=>r(`div`,{ref:n,className:O(`flex flex-col space-y-1.5 p-6`,e),...t}));xe.displayName=`CardHeader`;const Se=b(({className:e,...t},n)=>r(`div`,{ref:n,className:O(`font-semibold leading-none tracking-tight`,e),...t}));Se.displayName=`CardTitle`;const Ce=b(({className:e,...t},n)=>r(`div`,{ref:n,className:O(`text-sm text-muted-foreground`,e),...t}));Ce.displayName=`CardDescription`;const we=b(({className:e,...t},n)=>r(`div`,{ref:n,className:O(`p-6 pt-0`,e),...t}));we.displayName=`CardContent`;const A=b(({className:e,...t},n)=>r(`div`,{ref:n,className:O(`flex items-center p-6 pt-0`,e),...t}));A.displayName=`CardFooter`;const Te={light:``,dark:`.dark`},Ee={width:320,height:200},j=/^[a-zA-Z0-9_-]+$/,De=/^[#a-zA-Z0-9 ,.()/%-]+$/,Oe=/\burl\s*\(/i,ke=v.createContext(null);function Ae(){let e=v.useContext(ke);if(!e)throw Error(`useChart must be used within a <ChartContainer />`);return e}function je(e,t){if(!j.test(e))return null;let n=Object.entries(t).filter(([,e])=>e.theme??e.color);if(!n.length)return null;let r=Object.entries(Te).map(([t,r])=>{let i=n.map(([e,n])=>{if(!j.test(e))return null;let r=n.theme?.[t]??n.color;return!r||!De.test(r)||Oe.test(r)?null:` --color-${e}: ${r};`}).filter(e=>e!==null);return i.length?`${r} [data-chart=${e}] {\n${i.join(`
2
+ import{clsx as e}from"clsx";import{twMerge as t}from"tailwind-merge";import{Fragment as n,jsx as r,jsxs as i}from"react/jsx-runtime";import{Slot as a}from"@radix-ui/react-slot";import{ArrowDown as o,ArrowUp as s,Check as c,ChevronLeft as l,ChevronRight as u,ChevronsLeft as d,ChevronsRight as f,ChevronsUpDown as p,EyeOff as m,Loader2 as h,Settings2 as g,X as _}from"lucide-react";import*as v from"react";import{createContext as y,forwardRef as b,useContext as x,useEffect as ee,useId as te,useMemo as ne,useRef as re,useState as S}from"react";import*as ie from"recharts";import*as C from"@radix-ui/react-checkbox";import*as w from"@radix-ui/react-collapsible";import{flexRender as ae,getCoreRowModel as oe,getFilteredRowModel as se,getPaginationRowModel as ce,getSortedRowModel as le,useReactTable as ue}from"@tanstack/react-table";import*as T from"@radix-ui/react-dropdown-menu";import*as E from"@radix-ui/react-dialog";import{Controller as de,FormProvider as fe,useFormContext as pe}from"react-hook-form";import*as me from"@radix-ui/react-label";import*as he from"@radix-ui/react-separator";import{Toaster as ge,toast as _e}from"sonner";function D(...n){return t(e(n))}const ve={default:`border-transparent bg-primary text-primary-foreground shadow-xs`,secondary:`border-transparent bg-secondary text-secondary-foreground`,destructive:`border-transparent bg-destructive text-destructive-foreground shadow-xs`,outline:`text-foreground`};function ye({className:e,variant:t=`default`,...n}){return r(`div`,{className:D(`inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold`,`transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2`,ve[t],e),...n})}const be={default:`bg-primary text-primary-foreground shadow-xs hover:bg-primary/90`,destructive:`bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90`,outline:`border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground`,secondary:`bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80`,ghost:`hover:bg-accent hover:text-accent-foreground`,link:`text-primary underline-offset-4 hover:underline`},xe={default:`h-9 px-4 py-2`,sm:`h-8 rounded-md px-3 text-xs`,lg:`h-10 rounded-md px-8`,icon:`h-9 w-9`},O=b(({className:e,variant:t=`default`,size:n=`default`,loading:o=!1,asChild:s=!1,disabled:c,children:l,type:u=`button`,...d},f)=>{let p=D(`inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium`,`transition-colors cursor-pointer`,`focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`,`disabled:pointer-events-none disabled:opacity-50`,`[&_svg]:pointer-events-none [&_svg]:shrink-0`,be[t],xe[n],e);return s?r(a,{ref:f,className:p,...d,children:l}):i(`button`,{ref:f,disabled:c||o,className:p,type:u,...d,children:[o&&r(h,{className:`h-4 w-4 animate-spin`}),l]})});O.displayName=`Button`;const Se=b(({className:e,...t},n)=>r(`div`,{ref:n,className:D(`rounded-xl border bg-card text-card-foreground shadow-sm`,e),...t}));Se.displayName=`Card`;const Ce=b(({className:e,...t},n)=>r(`div`,{ref:n,className:D(`flex flex-col space-y-1.5 p-6`,e),...t}));Ce.displayName=`CardHeader`;const we=b(({className:e,...t},n)=>r(`div`,{ref:n,className:D(`font-semibold leading-none tracking-tight`,e),...t}));we.displayName=`CardTitle`;const k=b(({className:e,...t},n)=>r(`div`,{ref:n,className:D(`text-sm text-muted-foreground`,e),...t}));k.displayName=`CardDescription`;const A=b(({className:e,...t},n)=>r(`div`,{ref:n,className:D(`p-6 pt-0`,e),...t}));A.displayName=`CardContent`;const Te=b(({className:e,...t},n)=>r(`div`,{ref:n,className:D(`flex items-center p-6 pt-0`,e),...t}));Te.displayName=`CardFooter`;const Ee={light:``,dark:`.dark`},De={width:320,height:200},j=/^[a-zA-Z0-9_-]+$/,Oe=/^[#a-zA-Z0-9 ,.()/%-]+$/,ke=/\burl\s*\(/i,Ae=v.createContext(null);function je(){let e=v.useContext(Ae);if(!e)throw Error(`useChart must be used within a <ChartContainer />`);return e}function Me(e,t){if(!j.test(e))return null;let n=Object.entries(t).filter(([,e])=>e.theme??e.color);if(!n.length)return null;let r=Object.entries(Ee).map(([t,r])=>{let i=n.map(([e,n])=>{if(!j.test(e))return null;let r=n.theme?.[t]??n.color;return!r||!Oe.test(r)||ke.test(r)?null:` --color-${e}: ${r};`}).filter(e=>e!==null);return i.length?`${r} [data-chart=${e}] {\n${i.join(`
3
3
  `)}\n}`:null}).filter(e=>e!==null);return r.length?r.join(`
4
- `):null}function Me(e){if(e&&typeof e==`object`&&`fill`in e&&typeof e.fill==`string`)return e.fill}function Ne({id:e,className:t,children:n,config:a,initialDimension:o=Ee,nonce:s,...c}){let l=v.useId(),u=`chart-${(e&&j.test(e)?e:null)??l.replace(/:/g,``)}`;return r(ke.Provider,{value:{config:a},children:i(`div`,{"data-slot":`chart`,"data-chart":u,className:O(`flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden`,t),...c,children:[r(Pe,{id:u,config:a,nonce:s}),r(te.ResponsiveContainer,{initialDimension:o,children:n})]})})}const Pe=({id:e,config:t,nonce:n})=>{let i=je(e,t);return i?r(`style`,{nonce:n,dangerouslySetInnerHTML:{__html:i}}):null},Fe=te.Tooltip;function Ie({active:e,payload:t,className:a,indicator:o=`dot`,hideLabel:s=!1,hideIndicator:c=!1,label:l,labelFormatter:u,labelClassName:d,formatter:f,color:p,nameKey:m,labelKey:h}){let{config:g}=Ae(),_=v.useMemo(()=>{if(s||!t?.length)return null;let[e]=t,n=Le(g,e,`${h??e?.dataKey??e?.name??`value`}`),i=!h&&typeof l==`string`?g[l]?.label??l:n?.label;return u?r(`div`,{className:O(`font-medium`,d),children:u(i,t)}):i?r(`div`,{className:O(`font-medium`,d),children:i}):null},[l,u,t,s,d,g,h]);if(!e||!t?.length)return null;let y=t.length===1&&o!==`dot`;return i(`div`,{className:O(`grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl`,a),children:[y?null:_,r(`div`,{className:`grid gap-1.5`,children:t.filter(e=>e.type!==`none`).map((e,t)=>{let a=`${m??e.name??e.dataKey??`value`}`,s=Le(g,e,a),l=p??Me(e.payload)??e.color;return r(`div`,{className:O(`flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground`,o===`dot`&&`items-center`),children:f&&e?.value!==void 0&&e.name?f(e.value,e.name,e,t,e.payload):i(n,{children:[s?.icon?r(s.icon,{}):!c&&r(`div`,{className:O(`shrink-0 rounded-[2px] border-(--color-border) bg-(--color-bg)`,{"h-2.5 w-2.5":o===`dot`,"w-1":o===`line`,"w-0 border-[1.5px] border-dashed bg-transparent":o===`dashed`,"my-0.5":y&&o===`dashed`}),style:{"--color-bg":l,"--color-border":l}}),i(`div`,{className:O(`flex flex-1 justify-between leading-none`,y?`items-end`:`items-center`),children:[i(`div`,{className:`grid gap-1.5`,children:[y?_:null,r(`span`,{className:`text-muted-foreground`,children:s?.label??e.name})]}),e.value!=null&&r(`span`,{className:`font-mono font-medium text-foreground tabular-nums`,children:typeof e.value==`number`?e.value.toLocaleString():String(e.value)})]})]})},a)})})]})}function Le(e,t,n){if(typeof t!=`object`||!t)return;let r=`payload`in t&&typeof t.payload==`object`&&t.payload!==null?t.payload:void 0,i=n;return n in t&&typeof t[n]==`string`?i=t[n]:r&&n in r&&typeof r[n]==`string`&&(i=r[n]),i in e?e[i]:e[n]}const Re=b(({className:e,...t},n)=>r(ne.Root,{ref:n,className:O(`peer h-4 w-4 shrink-0 rounded-sm border border-primary shadow-xs`,`focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`,`disabled:cursor-not-allowed disabled:opacity-50`,`data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground`,e),...t,children:r(ne.Indicator,{className:`flex items-center justify-center text-current`,children:r(c,{className:`h-3.5 w-3.5`})})}));Re.displayName=`Checkbox`;const ze=T.Root,Be=T.CollapsibleTrigger,Ve=T.CollapsibleContent,M=b(({className:e,type:t,...n},i)=>r(`input`,{type:t,ref:i,className:O(`flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-xs`,`transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground`,`placeholder:text-muted-foreground`,`focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`,`disabled:cursor-not-allowed disabled:opacity-50`,e),...n}));M.displayName=`Input`;const N=b(({className:e,...t},n)=>r(`div`,{className:`relative w-full overflow-auto`,children:r(`table`,{ref:n,className:O(`w-full caption-bottom text-sm`,e),...t})}));N.displayName=`Table`;const P=b(({className:e,...t},n)=>r(`thead`,{ref:n,className:O(`[&_tr]:border-b`,e),...t}));P.displayName=`TableHeader`;const F=b(({className:e,...t},n)=>r(`tbody`,{ref:n,className:O(`[&_tr:last-child]:border-0`,e),...t}));F.displayName=`TableBody`;const He=b(({className:e,...t},n)=>r(`tfoot`,{ref:n,className:O(`border-t bg-muted/50 font-medium [&>tr]:last:border-b-0`,e),...t}));He.displayName=`TableFooter`;const I=b(({className:e,...t},n)=>r(`tr`,{ref:n,className:O(`border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted`,e),...t}));I.displayName=`TableRow`;const L=b(({className:e,...t},n)=>r(`th`,{ref:n,className:O(`h-10 px-2 text-left align-middle font-medium text-muted-foreground`,`[&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]`,e),...t}));L.displayName=`TableHead`;const R=b(({className:e,...t},n)=>r(`td`,{ref:n,className:O(`p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]`,e),...t}));R.displayName=`TableCell`;const Ue=b(({className:e,...t},n)=>r(`caption`,{ref:n,className:O(`mt-4 text-sm text-muted-foreground`,e),...t}));Ue.displayName=`TableCaption`;function We({table:e,className:t}){let n=e.getFilteredSelectedRowModel().rows.length,a=e.getFilteredRowModel().rows.length;return i(`div`,{className:O(`flex items-center justify-between px-2`,t),children:[r(`div`,{className:`flex-1 text-sm text-muted-foreground`,children:n>0&&i(`span`,{children:[n,` of `,a,` row(s) selected`]})}),i(`div`,{className:`flex items-center space-x-6 lg:space-x-8`,children:[r(`div`,{className:`flex items-center space-x-2`,children:i(`p`,{className:`text-sm font-medium`,children:[`Page `,e.getState().pagination.pageIndex+1,` of `,e.getPageCount()]})}),i(`div`,{className:`flex items-center space-x-2`,children:[i(k,{variant:`outline`,size:`icon`,className:`hidden h-8 w-8 lg:flex`,onClick:()=>e.setPageIndex(0),disabled:!e.getCanPreviousPage(),children:[r(`span`,{className:`sr-only`,children:`Go to first page`}),r(d,{className:`h-4 w-4`})]}),i(k,{variant:`outline`,size:`icon`,className:`h-8 w-8`,onClick:()=>e.previousPage(),disabled:!e.getCanPreviousPage(),children:[r(`span`,{className:`sr-only`,children:`Go to previous page`}),r(l,{className:`h-4 w-4`})]}),i(k,{variant:`outline`,size:`icon`,className:`h-8 w-8`,onClick:()=>e.nextPage(),disabled:!e.getCanNextPage(),children:[r(`span`,{className:`sr-only`,children:`Go to next page`}),r(u,{className:`h-4 w-4`})]}),i(k,{variant:`outline`,size:`icon`,className:`hidden h-8 w-8 lg:flex`,onClick:()=>e.setPageIndex(e.getPageCount()-1),disabled:!e.getCanNextPage(),children:[r(`span`,{className:`sr-only`,children:`Go to last page`}),r(f,{className:`h-4 w-4`})]})]})]})]})}const z=E.Root,B=E.Trigger,Ge=E.Portal,V=b(({className:e,sideOffset:t=4,...n},i)=>r(E.Portal,{children:r(E.Content,{ref:i,sideOffset:t,className:O(`z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md`,`data-[state=open]:animate-in data-[state=closed]:animate-out`,`data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0`,`data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95`,`data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2`,`data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2`,e),...n})}));V.displayName=`DropdownMenuContent`;const H=b(({className:e,inset:t,...n},i)=>r(E.Item,{ref:i,className:O(`relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none`,`transition-colors focus:bg-accent focus:text-accent-foreground`,`data-[disabled]:pointer-events-none data-[disabled]:opacity-50`,`[&_svg]:pointer-events-none [&_svg]:shrink-0`,t&&`pl-8`,e),...n}));H.displayName=`DropdownMenuItem`;const Ke=b(({className:e,children:t,checked:n,...a},o)=>i(E.CheckboxItem,{ref:o,className:O(`relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none`,`transition-colors focus:bg-accent focus:text-accent-foreground`,`data-[disabled]:pointer-events-none data-[disabled]:opacity-50`,e),...n!==void 0&&{checked:n},...a,children:[r(`span`,{className:`absolute left-2 flex h-3.5 w-3.5 items-center justify-center`,children:r(E.ItemIndicator,{children:r(c,{className:`h-4 w-4`})})}),t]}));Ke.displayName=`DropdownMenuCheckboxItem`;const U=b(({className:e,inset:t,...n},i)=>r(E.Label,{ref:i,className:O(`px-2 py-1.5 text-sm font-semibold`,t&&`pl-8`,e),...n}));U.displayName=`DropdownMenuLabel`;const W=b(({className:e,...t},n)=>r(E.Separator,{ref:n,className:O(`-mx-1 my-1 h-px bg-muted`,e),...t}));W.displayName=`DropdownMenuSeparator`;const qe=b(({className:e,inset:t,children:n,...a},o)=>i(E.SubTrigger,{ref:o,className:O(`flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none`,`focus:bg-accent data-[state=open]:bg-accent`,`[&_svg]:pointer-events-none [&_svg]:shrink-0`,t&&`pl-8`,e),...a,children:[n,r(u,{className:`ml-auto h-4 w-4`})]}));qe.displayName=`DropdownMenuSubTrigger`;const Je=b(({className:e,...t},n)=>r(E.SubContent,{ref:n,className:O(`z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg`,`data-[state=open]:animate-in data-[state=closed]:animate-out`,`data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0`,`data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95`,`data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2`,`data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2`,e),...t}));Je.displayName=`DropdownMenuSubContent`;function Ye({table:e}){return i(z,{children:[r(B,{asChild:!0,children:i(k,{variant:`outline`,size:`sm`,className:`ml-auto hidden h-8 lg:flex`,children:[r(g,{className:`mr-2 h-4 w-4`}),`View`]})}),i(V,{align:`end`,className:`w-[150px]`,children:[r(U,{children:`Toggle columns`}),r(W,{}),e.getAllColumns().filter(e=>e.accessorFn!==void 0&&e.getCanHide()).map(e=>r(Ke,{className:`capitalize`,checked:e.getIsVisible(),onCheckedChange:t=>e.toggleVisibility(!!t),children:e.id},e.id))]})]})}function Xe({columns:e,data:t,searchKey:n,searchPlaceholder:a=`Filter...`,pageSize:o=10,emptyMessage:s=`No results.`,classNames:c}){let[l,u]=w([]),[d,f]=w([]),[p,m]=w({}),[h,g]=w({}),_=ce({data:t,columns:e,state:{sorting:l,columnFilters:d,columnVisibility:p,rowSelection:h},onSortingChange:u,onColumnFiltersChange:f,onColumnVisibilityChange:m,onRowSelectionChange:g,getCoreRowModel:ie(),getSortedRowModel:se(),getFilteredRowModel:ae(),getPaginationRowModel:oe(),initialState:{pagination:{pageSize:o}}});return i(`div`,{className:O(`space-y-4`,c?.root),children:[i(`div`,{className:O(`flex items-center justify-between`,c?.toolbar),children:[r(`div`,{className:`flex flex-1 items-center space-x-2`,children:n&&r(M,{placeholder:a,value:_.getColumn(n)?.getFilterValue()??``,onChange:e=>_.getColumn(n)?.setFilterValue(e.target.value),className:`h-8 w-[150px] lg:w-[250px]`})}),r(Ye,{table:_})]}),r(`div`,{className:O(`rounded-md border`,c?.table),children:i(N,{children:[r(P,{children:_.getHeaderGroups().map(e=>r(I,{children:e.headers.map(e=>r(L,{colSpan:e.colSpan,children:e.isPlaceholder?null:re(e.column.columnDef.header,e.getContext())},e.id))},e.id))}),r(F,{children:_.getRowModel().rows.length>0?_.getRowModel().rows.map(e=>r(I,{"data-state":e.getIsSelected()&&`selected`,children:e.getVisibleCells().map(e=>r(R,{children:re(e.column.columnDef.cell,e.getContext())},e.id))},e.id)):r(I,{children:r(R,{colSpan:e.length,className:`h-24 text-center`,children:s})})})]})}),r(We,{table:_,className:c?.pagination})]})}function Ze({column:e,title:t,className:a}){return e.getCanSort()?r(`div`,{className:O(`flex items-center space-x-2`,a),children:i(z,{children:[r(B,{asChild:!0,children:i(k,{variant:`ghost`,size:`sm`,className:`-ml-3 h-8 data-[state=open]:bg-accent`,children:[r(`span`,{children:t}),e.getIsSorted()===`desc`?r(o,{className:`ml-2 h-4 w-4`}):e.getIsSorted()===`asc`?r(s,{className:`ml-2 h-4 w-4`}):r(p,{className:`ml-2 h-4 w-4`})]})}),i(V,{align:`start`,children:[i(H,{onClick:()=>e.toggleSorting(!1),children:[r(s,{className:`mr-2 h-3.5 w-3.5 text-muted-foreground/70`}),`Asc`]}),i(H,{onClick:()=>e.toggleSorting(!0),children:[r(o,{className:`mr-2 h-3.5 w-3.5 text-muted-foreground/70`}),`Desc`]}),e.getCanHide()&&i(n,{children:[r(W,{}),i(H,{onClick:()=>e.toggleVisibility(!1),children:[r(m,{className:`mr-2 h-3.5 w-3.5 text-muted-foreground/70`}),`Hide`]})]})]})]})}):r(`div`,{className:O(a),children:t})}const Qe=D.Root,$e=D.Trigger,et=D.Close,tt=D.Portal,nt=b(({className:e,...t},n)=>r(D.Overlay,{ref:n,className:O(`fixed inset-0 z-50 bg-black/80`,`data-[state=open]:animate-in data-[state=closed]:animate-out`,`data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0`,e),...t}));nt.displayName=`DialogOverlay`;const G=b(({className:e,children:t,...n},a)=>i(tt,{children:[r(nt,{}),i(D.Content,{ref:a,className:O(`fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%]`,`gap-4 border bg-background p-6 shadow-lg sm:rounded-lg`,`data-[state=open]:animate-in data-[state=closed]:animate-out`,`data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0`,`data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95`,`data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%]`,`data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]`,e),...n,children:[t,i(D.Close,{className:O(`absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity`,`hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2`,`disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground`,`cursor-pointer`),children:[r(_,{className:`h-4 w-4`}),r(`span`,{className:`sr-only`,children:`Close`})]})]})]}));G.displayName=`DialogContent`;function rt({className:e,...t}){return r(`div`,{className:O(`flex flex-col space-y-1.5 text-center sm:text-left`,e),...t})}function it({className:e,...t}){return r(`div`,{className:O(`flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2`,e),...t})}const K=b(({className:e,...t},n)=>r(D.Title,{ref:n,className:O(`text-lg font-semibold leading-none tracking-tight`,e),...t}));K.displayName=`DialogTitle`;const at=b(({className:e,...t},n)=>r(D.Description,{ref:n,className:O(`text-sm text-muted-foreground`,e),...t}));at.displayName=`DialogDescription`;const q=b(({className:e,...t},n)=>r(fe.Root,{ref:n,className:O(`text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70`,e),...t}));q.displayName=`Label`;const ot=ue,st=y({});function ct(e){return r(st.Provider,{value:{name:e.name},children:r(le,{...e})})}const lt=y({});function J(){let e=x(st),t=x(lt),{getFieldState:n,formState:r}=de(),i=n(e.name,r),{id:a}=t;return{id:a,name:e.name,formItemId:`${a}-form-item`,formDescriptionId:`${a}-form-item-description`,formMessageId:`${a}-form-item-message`,...i}}const ut=b(({className:e,...t},n)=>{let i=ee();return r(lt.Provider,{value:{id:i},children:r(`div`,{ref:n,className:O(`space-y-2`,e),...t})})});ut.displayName=`FormItem`;const dt=b(({className:e,...t},n)=>{let{error:i,formItemId:a}=J();return r(q,{ref:n,className:O(i&&`text-destructive`,e),htmlFor:a,...t})});dt.displayName=`FormLabel`;const Y=b(({...e},t)=>{let{error:n,formItemId:i,formDescriptionId:o,formMessageId:s}=J();return r(a,{ref:t,id:i,"aria-describedby":n?`${o} ${s}`:o,"aria-invalid":!!n,...e})});Y.displayName=`FormControl`;const ft=b(({className:e,...t},n)=>{let{formDescriptionId:i}=J();return r(`p`,{ref:n,id:i,className:O(`text-[0.8rem] text-muted-foreground`,e),...t})});ft.displayName=`FormDescription`;const pt=b(({className:e,children:t,...n},i)=>{let{error:a,formMessageId:o}=J(),s=a?String(a.message):t;return s?r(`p`,{ref:i,id:o,className:O(`text-[0.8rem] font-medium text-destructive`,e),...n,children:s}):null});pt.displayName=`FormMessage`;let X=`/api/admin/icons`;function mt(e){let t=e.replace(/\/+$/,``);t!==X&&(X=t,Z.clear(),Q=null)}const Z=new Map;function ht(e){let t=Z.get(e);if(t instanceof Promise)return t;if(t!==void 0)return Promise.resolve(t);let n=fetch(`${X}/${encodeURIComponent(e)}`).then(async t=>{if(t.ok){let n=await t.text();return Z.set(e,n),n}return t.status===404?Z.set(e,null):Z.delete(e),null}).catch(()=>(Z.delete(e),null));return Z.set(e,n),n}let Q=null;function gt(){return Q||=fetch(X).then(e=>e.ok?e.json():[]).catch(()=>[]),Q}function $({name:e,className:t,size:n}){let[i,a]=w(null);S(()=>{if(!e){a(null);return}let t=Z.get(e);if(typeof t==`string`||t===null){a(t);return}let n=!0;return ht(e).then(e=>{n&&a(e)}),()=>{n=!1}},[e]);let o=C(()=>i?{__html:i}:null,[i]);return o?r(`span`,{className:t,style:{display:`inline-flex`,lineHeight:0,...n==null?{}:{width:n,height:n}},dangerouslySetInnerHTML:o,"aria-hidden":`true`}):null}const _t=b(function({value:e,onChange:t,placeholder:a=`Pick icon`,className:o,disabled:s,id:c,...l},u){let[d,f]=w(!1),[p,m]=w(``),[h,g]=w([]),[_,v]=w(!1),y=ee();S(()=>{if(!d||h.length>0)return;let e=!0;return v(!0),gt().then(t=>{e&&(g(t),v(!1))}),()=>{e=!1}},[d,h.length]);let b=C(()=>{let e=p.trim().toLowerCase(),t=e?h.filter(t=>t.includes(e)):h;return{shown:t.slice(0,90),total:t.length}},[p,h]),x=e=>{t(e),f(!1),m(``)};return i(n,{children:[r(k,{ref:u,id:c,type:`button`,variant:`outline`,size:`icon`,disabled:s,onClick:()=>f(!0),title:e??a,"aria-label":e?`Icon: ${e}`:a,className:o,...l,children:e?r($,{name:e,size:16}):r(`span`,{"aria-hidden":!0,className:`text-base leading-none text-muted-foreground`,children:`+`})}),r(Qe,{open:d,onOpenChange:f,children:i(G,{className:`max-w-lg`,children:[r(rt,{children:r(K,{children:`Choose an icon`})}),r(`label`,{htmlFor:y,className:`sr-only`,children:`Search icons`}),r(M,{id:y,autoFocus:!0,value:p,onChange:e=>m(e.target.value),placeholder:`Search icons…`}),i(`div`,{className:`grid max-h-72 grid-cols-8 gap-1 overflow-auto p-0.5`,children:[r(`button`,{type:`button`,title:`No icon`,"aria-label":`No icon`,onClick:()=>x(void 0),className:O(`flex aspect-square items-center justify-center rounded-md border border-border text-[10px] text-muted-foreground hover:bg-accent`,!e&&`ring-2 ring-ring`),children:`none`}),b.shown.map(t=>r(`button`,{type:`button`,title:t,"aria-label":t,onClick:()=>x(t),className:O(`flex aspect-square items-center justify-center rounded-md border border-transparent hover:bg-accent hover:border-border`,t===e&&`ring-2 ring-ring`),children:r($,{name:t,size:18})},t))]}),r(`div`,{className:`text-xs text-muted-foreground`,children:_?`Loading icons…`:p?`${b.total} match${b.total===1?``:`es`}${b.total>90?` (showing 90)`:``}`:`${h.length} icons — type to search`})]})})]})}),vt=b(({className:e,children:t,...n},i)=>r(`select`,{ref:i,className:O(`flex h-9 w-full rounded-md border border-input bg-background text-foreground px-3 py-1 text-sm shadow-xs`,`transition-colors`,`focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`,`disabled:cursor-not-allowed disabled:opacity-50`,e),...n,children:t}));vt.displayName=`Select`;const yt=b(({className:e,orientation:t=`horizontal`,decorative:n=!0,...i},a)=>r(pe.Root,{ref:a,decorative:n,orientation:t,className:O(`shrink-0 bg-border`,t===`horizontal`?`h-[1px] w-full`:`h-full w-[1px]`,e),...i}));yt.displayName=`Separator`;function bt({className:e,...t}){return r(`div`,{className:O(`animate-pulse rounded-md bg-muted`,e),...t})}const xt={background:`var(--color-background)`,color:`var(--color-foreground)`,border:`1px solid var(--color-border)`},St={error:`sonner-error`,success:`sonner-success`};function Ct({toastOptions:e,...t}){return r(me,{position:`bottom-right`,...t,toastOptions:{...e,style:{...xt,...e?.style},classNames:{...St,...e?.classNames}}})}const wt=b(({className:e,...t},n)=>r(`textarea`,{ref:n,className:O(`flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-xs`,`placeholder:text-muted-foreground`,`focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`,`disabled:cursor-not-allowed disabled:opacity-50`,e),...t}));wt.displayName=`Textarea`;export{_e as Badge,k as Button,be as Card,we as CardContent,Ce as CardDescription,A as CardFooter,xe as CardHeader,Se as CardTitle,Ne as ChartContainer,Fe as ChartTooltip,Ie as ChartTooltipContent,Re as Checkbox,ze as Collapsible,Ve as CollapsibleContent,Be as CollapsibleTrigger,Xe as DataTable,Ze as DataTableColumnHeader,Ye as DataTableViewOptions,Qe as Dialog,et as DialogClose,G as DialogContent,at as DialogDescription,it as DialogFooter,rt as DialogHeader,K as DialogTitle,$e as DialogTrigger,z as DropdownMenu,V as DropdownMenuContent,H as DropdownMenuItem,U as DropdownMenuLabel,Ge as DropdownMenuPortal,W as DropdownMenuSeparator,B as DropdownMenuTrigger,ot as Form,Y as FormControl,ft as FormDescription,ct as FormField,ut as FormItem,dt as FormLabel,pt as FormMessage,$ as Icon,_t as IconPicker,M as Input,q as Label,vt as Select,yt as Separator,bt as Skeleton,N as Table,F as TableBody,R as TableCell,L as TableHead,P as TableHeader,I as TableRow,wt as Textarea,Ct as Toaster,O as cn,mt as setIconEndpoint,he as toast};
4
+ `):null}function Ne(e){if(e&&typeof e==`object`&&`fill`in e&&typeof e.fill==`string`)return e.fill}function Pe({id:e,className:t,children:n,config:a,initialDimension:o=De,nonce:s,...c}){let l=v.useId(),u=`chart-${(e&&j.test(e)?e:null)??l.replace(/:/g,``)}`;return r(Ae.Provider,{value:{config:a},children:i(`div`,{"data-slot":`chart`,"data-chart":u,className:D(`flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden`,t),...c,children:[r(Fe,{id:u,config:a,nonce:s}),r(ie.ResponsiveContainer,{initialDimension:o,children:n})]})})}const Fe=({id:e,config:t,nonce:n})=>{let i=Me(e,t);return i?r(`style`,{nonce:n,dangerouslySetInnerHTML:{__html:i}}):null},Ie=ie.Tooltip;function Le({active:e,payload:t,className:a,indicator:o=`dot`,hideLabel:s=!1,hideIndicator:c=!1,label:l,labelFormatter:u,labelClassName:d,formatter:f,color:p,nameKey:m,labelKey:h}){let{config:g}=je(),_=v.useMemo(()=>{if(s||!t?.length)return null;let[e]=t,n=Re(g,e,`${h??e?.dataKey??e?.name??`value`}`),i=!h&&typeof l==`string`?g[l]?.label??l:n?.label;return u?r(`div`,{className:D(`font-medium`,d),children:u(i,t)}):i?r(`div`,{className:D(`font-medium`,d),children:i}):null},[l,u,t,s,d,g,h]);if(!e||!t?.length)return null;let y=t.length===1&&o!==`dot`;return i(`div`,{className:D(`grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl`,a),children:[y?null:_,r(`div`,{className:`grid gap-1.5`,children:t.filter(e=>e.type!==`none`).map((e,t)=>{let a=`${m??e.name??e.dataKey??`value`}`,s=Re(g,e,a),l=p??Ne(e.payload)??e.color;return r(`div`,{className:D(`flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground`,o===`dot`&&`items-center`),children:f&&e?.value!==void 0&&e.name?f(e.value,e.name,e,t,e.payload):i(n,{children:[s?.icon?r(s.icon,{}):!c&&r(`div`,{className:D(`shrink-0 rounded-[2px] border-(--color-border) bg-(--color-bg)`,{"h-2.5 w-2.5":o===`dot`,"w-1":o===`line`,"w-0 border-[1.5px] border-dashed bg-transparent":o===`dashed`,"my-0.5":y&&o===`dashed`}),style:{"--color-bg":l,"--color-border":l}}),i(`div`,{className:D(`flex flex-1 justify-between leading-none`,y?`items-end`:`items-center`),children:[i(`div`,{className:`grid gap-1.5`,children:[y?_:null,r(`span`,{className:`text-muted-foreground`,children:s?.label??e.name})]}),e.value!=null&&r(`span`,{className:`font-mono font-medium text-foreground tabular-nums`,children:typeof e.value==`number`?e.value.toLocaleString():String(e.value)})]})]})},a)})})]})}function Re(e,t,n){if(typeof t!=`object`||!t)return;let r=`payload`in t&&typeof t.payload==`object`&&t.payload!==null?t.payload:void 0,i=n;return n in t&&typeof t[n]==`string`?i=t[n]:r&&n in r&&typeof r[n]==`string`&&(i=r[n]),i in e?e[i]:e[n]}const ze=b(({className:e,...t},n)=>r(C.Root,{ref:n,className:D(`peer h-4 w-4 shrink-0 rounded-sm border border-primary shadow-xs`,`focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`,`disabled:cursor-not-allowed disabled:opacity-50`,`data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground`,e),...t,children:r(C.Indicator,{className:`flex items-center justify-center text-current`,children:r(c,{className:`h-3.5 w-3.5`})})}));ze.displayName=`Checkbox`;const Be=w.Root,Ve=w.CollapsibleTrigger,He=w.CollapsibleContent,M=b(({className:e,type:t,...n},i)=>r(`input`,{type:t,ref:i,className:D(`flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-xs`,`transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground`,`placeholder:text-muted-foreground`,`focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`,`disabled:cursor-not-allowed disabled:opacity-50`,e),...n}));M.displayName=`Input`;const N=b(({className:e,...t},n)=>r(`div`,{className:`relative w-full overflow-auto`,children:r(`table`,{ref:n,className:D(`w-full caption-bottom text-sm`,e),...t})}));N.displayName=`Table`;const P=b(({className:e,...t},n)=>r(`thead`,{ref:n,className:D(`[&_tr]:border-b`,e),...t}));P.displayName=`TableHeader`;const F=b(({className:e,...t},n)=>r(`tbody`,{ref:n,className:D(`[&_tr:last-child]:border-0`,e),...t}));F.displayName=`TableBody`;const Ue=b(({className:e,...t},n)=>r(`tfoot`,{ref:n,className:D(`border-t bg-muted/50 font-medium [&>tr]:last:border-b-0`,e),...t}));Ue.displayName=`TableFooter`;const I=b(({className:e,...t},n)=>r(`tr`,{ref:n,className:D(`border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted`,e),...t}));I.displayName=`TableRow`;const L=b(({className:e,...t},n)=>r(`th`,{ref:n,className:D(`h-10 px-2 text-left align-middle font-medium text-muted-foreground`,`[&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]`,e),...t}));L.displayName=`TableHead`;const R=b(({className:e,...t},n)=>r(`td`,{ref:n,className:D(`p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]`,e),...t}));R.displayName=`TableCell`;const We=b(({className:e,...t},n)=>r(`caption`,{ref:n,className:D(`mt-4 text-sm text-muted-foreground`,e),...t}));We.displayName=`TableCaption`;function Ge({table:e,className:t}){let n=e.getFilteredSelectedRowModel().rows.length,a=e.getFilteredRowModel().rows.length;return i(`div`,{className:D(`flex items-center justify-between px-2`,t),children:[r(`div`,{className:`flex-1 text-sm text-muted-foreground`,children:n>0&&i(`span`,{children:[n,` of `,a,` row(s) selected`]})}),i(`div`,{className:`flex items-center space-x-6 lg:space-x-8`,children:[r(`div`,{className:`flex items-center space-x-2`,children:i(`p`,{className:`text-sm font-medium`,children:[`Page `,e.getState().pagination.pageIndex+1,` of `,e.getPageCount()]})}),i(`div`,{className:`flex items-center space-x-2`,children:[i(O,{variant:`outline`,size:`icon`,className:`hidden h-8 w-8 lg:flex`,onClick:()=>e.setPageIndex(0),disabled:!e.getCanPreviousPage(),children:[r(`span`,{className:`sr-only`,children:`Go to first page`}),r(d,{className:`h-4 w-4`})]}),i(O,{variant:`outline`,size:`icon`,className:`h-8 w-8`,onClick:()=>e.previousPage(),disabled:!e.getCanPreviousPage(),children:[r(`span`,{className:`sr-only`,children:`Go to previous page`}),r(l,{className:`h-4 w-4`})]}),i(O,{variant:`outline`,size:`icon`,className:`h-8 w-8`,onClick:()=>e.nextPage(),disabled:!e.getCanNextPage(),children:[r(`span`,{className:`sr-only`,children:`Go to next page`}),r(u,{className:`h-4 w-4`})]}),i(O,{variant:`outline`,size:`icon`,className:`hidden h-8 w-8 lg:flex`,onClick:()=>e.setPageIndex(e.getPageCount()-1),disabled:!e.getCanNextPage(),children:[r(`span`,{className:`sr-only`,children:`Go to last page`}),r(f,{className:`h-4 w-4`})]})]})]})]})}const z=T.Root,B=T.Trigger,Ke=T.Portal,V=b(({className:e,sideOffset:t=4,...n},i)=>r(T.Portal,{children:r(T.Content,{ref:i,sideOffset:t,className:D(`z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md`,`data-[state=open]:animate-in data-[state=closed]:animate-out`,`data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0`,`data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95`,`data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2`,`data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2`,e),...n})}));V.displayName=`DropdownMenuContent`;const H=b(({className:e,inset:t,...n},i)=>r(T.Item,{ref:i,className:D(`relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none`,`transition-colors focus:bg-accent focus:text-accent-foreground`,`data-[disabled]:pointer-events-none data-[disabled]:opacity-50`,`[&_svg]:pointer-events-none [&_svg]:shrink-0`,t&&`pl-8`,e),...n}));H.displayName=`DropdownMenuItem`;const qe=b(({className:e,children:t,checked:n,...a},o)=>i(T.CheckboxItem,{ref:o,className:D(`relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none`,`transition-colors focus:bg-accent focus:text-accent-foreground`,`data-[disabled]:pointer-events-none data-[disabled]:opacity-50`,e),...n!==void 0&&{checked:n},...a,children:[r(`span`,{className:`absolute left-2 flex h-3.5 w-3.5 items-center justify-center`,children:r(T.ItemIndicator,{children:r(c,{className:`h-4 w-4`})})}),t]}));qe.displayName=`DropdownMenuCheckboxItem`;const U=b(({className:e,inset:t,...n},i)=>r(T.Label,{ref:i,className:D(`px-2 py-1.5 text-sm font-semibold`,t&&`pl-8`,e),...n}));U.displayName=`DropdownMenuLabel`;const W=b(({className:e,...t},n)=>r(T.Separator,{ref:n,className:D(`-mx-1 my-1 h-px bg-muted`,e),...t}));W.displayName=`DropdownMenuSeparator`;const Je=b(({className:e,inset:t,children:n,...a},o)=>i(T.SubTrigger,{ref:o,className:D(`flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none`,`focus:bg-accent data-[state=open]:bg-accent`,`[&_svg]:pointer-events-none [&_svg]:shrink-0`,t&&`pl-8`,e),...a,children:[n,r(u,{className:`ml-auto h-4 w-4`})]}));Je.displayName=`DropdownMenuSubTrigger`;const Ye=b(({className:e,...t},n)=>r(T.SubContent,{ref:n,className:D(`z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg`,`data-[state=open]:animate-in data-[state=closed]:animate-out`,`data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0`,`data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95`,`data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2`,`data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2`,e),...t}));Ye.displayName=`DropdownMenuSubContent`;function Xe({table:e}){return i(z,{children:[r(B,{asChild:!0,children:i(O,{variant:`outline`,size:`sm`,className:`ml-auto hidden h-8 lg:flex`,children:[r(g,{className:`mr-2 h-4 w-4`}),`View`]})}),i(V,{align:`end`,className:`w-[150px]`,children:[r(U,{children:`Toggle columns`}),r(W,{}),e.getAllColumns().filter(e=>e.accessorFn!==void 0&&e.getCanHide()).map(e=>r(qe,{className:`capitalize`,checked:e.getIsVisible(),onCheckedChange:t=>e.toggleVisibility(!!t),children:e.id},e.id))]})]})}function Ze({columns:e,data:t,searchKey:n,searchPlaceholder:a=`Filter...`,pageSize:o=10,emptyMessage:s=`No results.`,classNames:c}){let[l,u]=S([]),[d,f]=S([]),[p,m]=S({}),[h,g]=S({}),_=ue({data:t,columns:e,state:{sorting:l,columnFilters:d,columnVisibility:p,rowSelection:h},onSortingChange:u,onColumnFiltersChange:f,onColumnVisibilityChange:m,onRowSelectionChange:g,getCoreRowModel:oe(),getSortedRowModel:le(),getFilteredRowModel:se(),getPaginationRowModel:ce(),initialState:{pagination:{pageSize:o}}});return i(`div`,{className:D(`space-y-4`,c?.root),children:[i(`div`,{className:D(`flex items-center justify-between`,c?.toolbar),children:[r(`div`,{className:`flex flex-1 items-center space-x-2`,children:n&&r(M,{placeholder:a,value:_.getColumn(n)?.getFilterValue()??``,onChange:e=>_.getColumn(n)?.setFilterValue(e.target.value),className:`h-8 w-[150px] lg:w-[250px]`})}),r(Xe,{table:_})]}),r(`div`,{className:D(`rounded-md border`,c?.table),children:i(N,{children:[r(P,{children:_.getHeaderGroups().map(e=>r(I,{children:e.headers.map(e=>r(L,{colSpan:e.colSpan,children:e.isPlaceholder?null:ae(e.column.columnDef.header,e.getContext())},e.id))},e.id))}),r(F,{children:_.getRowModel().rows.length>0?_.getRowModel().rows.map(e=>r(I,{"data-state":e.getIsSelected()&&`selected`,children:e.getVisibleCells().map(e=>r(R,{children:ae(e.column.columnDef.cell,e.getContext())},e.id))},e.id)):r(I,{children:r(R,{colSpan:e.length,className:`h-24 text-center`,children:s})})})]})}),r(Ge,{table:_,className:c?.pagination})]})}function Qe({column:e,title:t,className:a}){return e.getCanSort()?r(`div`,{className:D(`flex items-center space-x-2`,a),children:i(z,{children:[r(B,{asChild:!0,children:i(O,{variant:`ghost`,size:`sm`,className:`-ml-3 h-8 data-[state=open]:bg-accent`,children:[r(`span`,{children:t}),e.getIsSorted()===`desc`?r(o,{className:`ml-2 h-4 w-4`}):e.getIsSorted()===`asc`?r(s,{className:`ml-2 h-4 w-4`}):r(p,{className:`ml-2 h-4 w-4`})]})}),i(V,{align:`start`,children:[i(H,{onClick:()=>e.toggleSorting(!1),children:[r(s,{className:`mr-2 h-3.5 w-3.5 text-muted-foreground/70`}),`Asc`]}),i(H,{onClick:()=>e.toggleSorting(!0),children:[r(o,{className:`mr-2 h-3.5 w-3.5 text-muted-foreground/70`}),`Desc`]}),e.getCanHide()&&i(n,{children:[r(W,{}),i(H,{onClick:()=>e.toggleVisibility(!1),children:[r(m,{className:`mr-2 h-3.5 w-3.5 text-muted-foreground/70`}),`Hide`]})]})]})]})}):r(`div`,{className:D(a),children:t})}const $e=E.Root,et=E.Trigger,tt=E.Close,nt=E.Portal,rt=b(({className:e,...t},n)=>r(E.Overlay,{ref:n,className:D(`fixed inset-0 z-50 bg-black/80`,`data-[state=open]:animate-in data-[state=closed]:animate-out`,`data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0`,e),...t}));rt.displayName=`DialogOverlay`;const G=b(({className:e,children:t,...n},a)=>i(nt,{children:[r(rt,{}),i(E.Content,{ref:a,className:D(`fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%]`,`gap-4 border bg-background p-6 shadow-lg sm:rounded-lg`,`data-[state=open]:animate-in data-[state=closed]:animate-out`,`data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0`,`data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95`,`data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%]`,`data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]`,e),...n,children:[t,i(E.Close,{className:D(`absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity`,`hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2`,`disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground`,`cursor-pointer`),children:[r(_,{className:`h-4 w-4`}),r(`span`,{className:`sr-only`,children:`Close`})]})]})]}));G.displayName=`DialogContent`;function it({className:e,...t}){return r(`div`,{className:D(`flex flex-col space-y-1.5 text-center sm:text-left`,e),...t})}function at({className:e,...t}){return r(`div`,{className:D(`flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2`,e),...t})}const K=b(({className:e,...t},n)=>r(E.Title,{ref:n,className:D(`text-lg font-semibold leading-none tracking-tight`,e),...t}));K.displayName=`DialogTitle`;const ot=b(({className:e,...t},n)=>r(E.Description,{ref:n,className:D(`text-sm text-muted-foreground`,e),...t}));ot.displayName=`DialogDescription`;const q=b(({className:e,...t},n)=>r(me.Root,{ref:n,className:D(`text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70`,e),...t}));q.displayName=`Label`;const st=fe,ct=y({});function lt(e){return r(ct.Provider,{value:{name:e.name},children:r(de,{...e})})}const ut=y({});function J(){let e=x(ct),t=x(ut),{getFieldState:n,formState:r}=pe(),i=n(e.name,r),{id:a}=t;return{id:a,name:e.name,formItemId:`${a}-form-item`,formDescriptionId:`${a}-form-item-description`,formMessageId:`${a}-form-item-message`,...i}}const Y=b(({className:e,...t},n)=>{let i=te();return r(ut.Provider,{value:{id:i},children:r(`div`,{ref:n,className:D(`space-y-2`,e),...t})})});Y.displayName=`FormItem`;const dt=b(({className:e,...t},n)=>{let{error:i,formItemId:a}=J();return r(q,{ref:n,className:D(i&&`text-destructive`,e),htmlFor:a,...t})});dt.displayName=`FormLabel`;const ft=b(({...e},t)=>{let{error:n,formItemId:i,formDescriptionId:o,formMessageId:s}=J();return r(a,{ref:t,id:i,"aria-describedby":n?`${o} ${s}`:o,"aria-invalid":!!n,...e})});ft.displayName=`FormControl`;const pt=b(({className:e,...t},n)=>{let{formDescriptionId:i}=J();return r(`p`,{ref:n,id:i,className:D(`text-[0.8rem] text-muted-foreground`,e),...t})});pt.displayName=`FormDescription`;const mt=b(({className:e,children:t,...n},i)=>{let{error:a,formMessageId:o}=J(),s=a?String(a.message):t;return s?r(`p`,{ref:i,id:o,className:D(`text-[0.8rem] font-medium text-destructive`,e),...n,children:s}):null});mt.displayName=`FormMessage`;let X=`/api/admin/icons`;function ht(e){let t=e.replace(/\/+$/,``);t!==X&&(X=t,Z.clear(),Q=null)}const Z=new Map;function gt(e){let t=new AbortController,n=setTimeout(()=>t.abort(),1e4);return fetch(e,{signal:t.signal}).finally(()=>clearTimeout(n))}function _t(e){let t=Z.get(e);if(t instanceof Promise)return t;if(t!==void 0)return Promise.resolve(t);let n=gt(`${X}/${encodeURIComponent(e)}`).then(async t=>{if(t.ok){let n=await t.text();return Z.set(e,n),n}return t.status===404?Z.set(e,null):Z.delete(e),null}).catch(()=>(Z.delete(e),null));return Z.set(e,n),n}function vt(e){let t=gt(`${X}?names=${encodeURIComponent(e.join(`,`))}`).then(e=>e.ok?e.json():null).catch(()=>null);for(let n of e){let e=t.then(e=>{if(e===null)return Z.delete(n),null;let t=e[n],r=typeof t==`string`?t:null;return Z.set(n,r),r});Z.set(n,e)}return t.then(()=>void 0)}async function yt(e){if(typeof window>`u`)return;let t=e.filter(e=>Z.get(e)===void 0);if(t.length===0)return;let n=[];for(let e=0;e<t.length;e+=128)n.push(t.slice(e,e+128));await Promise.all(n.map(vt))}function bt(e,t=!0){let n=re(``),r=e.join(`,`);t&&r&&n.current!==r&&(n.current=r,yt(e))}let Q=null;function xt(){return Q||=fetch(X).then(e=>e.ok?e.json():[]).catch(()=>[]),Q}function $({name:e,className:t,size:n}){let[i,a]=S(null);ee(()=>{if(!e){a(null);return}let t=Z.get(e);if(typeof t==`string`||t===null){a(t);return}let n=!0;return _t(e).then(e=>{n&&a(e)}),()=>{n=!1}},[e]);let o=ne(()=>i?{__html:i}:null,[i]);return o?r(`span`,{className:t,style:{display:`inline-flex`,lineHeight:0,...n==null?{}:{width:n,height:n}},dangerouslySetInnerHTML:o,"aria-hidden":`true`}):null}const St=b(function({value:e,onChange:t,placeholder:a=`Pick icon`,className:o,disabled:s,id:c,...l},u){let[d,f]=S(!1),[p,m]=S(``),[h,g]=S([]),[_,v]=S(!1),y=te();ee(()=>{if(!d||h.length>0)return;let e=!0;return v(!0),xt().then(t=>{e&&(g(t),v(!1))}),()=>{e=!1}},[d,h.length]);let b=ne(()=>{let e=p.trim().toLowerCase(),t=e?h.filter(t=>t.includes(e)):h;return{shown:t.slice(0,90),total:t.length}},[p,h]);bt(b.shown,d);let x=e=>{t(e),f(!1),m(``)};return i(n,{children:[r(O,{ref:u,id:c,type:`button`,variant:`outline`,size:`icon`,disabled:s,onClick:()=>f(!0),title:e??a,"aria-label":e?`Icon: ${e}`:a,className:o,...l,children:e?r($,{name:e,size:16}):r(`span`,{"aria-hidden":!0,className:`text-base leading-none text-muted-foreground`,children:`+`})}),r($e,{open:d,onOpenChange:f,children:i(G,{className:`max-w-lg`,children:[r(it,{children:r(K,{children:`Choose an icon`})}),r(`label`,{htmlFor:y,className:`sr-only`,children:`Search icons`}),r(M,{id:y,autoFocus:!0,value:p,onChange:e=>m(e.target.value),placeholder:`Search icons…`}),i(`div`,{className:`grid max-h-72 grid-cols-8 gap-1 overflow-auto p-0.5`,children:[r(`button`,{type:`button`,title:`No icon`,"aria-label":`No icon`,onClick:()=>x(void 0),className:D(`flex aspect-square items-center justify-center rounded-md border border-border text-[10px] text-muted-foreground hover:bg-accent`,!e&&`ring-2 ring-ring`),children:`none`}),b.shown.map(t=>r(`button`,{type:`button`,title:t,"aria-label":t,onClick:()=>x(t),className:D(`flex aspect-square items-center justify-center rounded-md border border-transparent hover:bg-accent hover:border-border`,t===e&&`ring-2 ring-ring`),children:r($,{name:t,size:18})},t))]}),r(`div`,{className:`text-xs text-muted-foreground`,children:_?`Loading icons…`:p?`${b.total} match${b.total===1?``:`es`}${b.total>90?` (showing 90)`:``}`:`${h.length} icons — type to search`})]})})]})}),Ct=b(({className:e,children:t,...n},i)=>r(`select`,{ref:i,className:D(`flex h-9 w-full rounded-md border border-input bg-background text-foreground px-3 py-1 text-sm shadow-xs`,`transition-colors`,`focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`,`disabled:cursor-not-allowed disabled:opacity-50`,e),...n,children:t}));Ct.displayName=`Select`;const wt=b(({className:e,orientation:t=`horizontal`,decorative:n=!0,...i},a)=>r(he.Root,{ref:a,decorative:n,orientation:t,className:D(`shrink-0 bg-border`,t===`horizontal`?`h-[1px] w-full`:`h-full w-[1px]`,e),...i}));wt.displayName=`Separator`;function Tt({className:e,...t}){return r(`div`,{className:D(`animate-pulse rounded-md bg-muted`,e),...t})}const Et={background:`var(--color-background)`,color:`var(--color-foreground)`,border:`1px solid var(--color-border)`},Dt={error:`sonner-error`,success:`sonner-success`};function Ot({toastOptions:e,...t}){return r(ge,{position:`bottom-right`,...t,toastOptions:{...e,style:{...Et,...e?.style},classNames:{...Dt,...e?.classNames}}})}const kt=b(({className:e,...t},n)=>r(`textarea`,{ref:n,className:D(`flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-xs`,`placeholder:text-muted-foreground`,`focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`,`disabled:cursor-not-allowed disabled:opacity-50`,e),...t}));kt.displayName=`Textarea`;export{ye as Badge,O as Button,Se as Card,A as CardContent,k as CardDescription,Te as CardFooter,Ce as CardHeader,we as CardTitle,Pe as ChartContainer,Ie as ChartTooltip,Le as ChartTooltipContent,ze as Checkbox,Be as Collapsible,He as CollapsibleContent,Ve as CollapsibleTrigger,Ze as DataTable,Qe as DataTableColumnHeader,Xe as DataTableViewOptions,$e as Dialog,tt as DialogClose,G as DialogContent,ot as DialogDescription,at as DialogFooter,it as DialogHeader,K as DialogTitle,et as DialogTrigger,z as DropdownMenu,V as DropdownMenuContent,H as DropdownMenuItem,U as DropdownMenuLabel,Ke as DropdownMenuPortal,W as DropdownMenuSeparator,B as DropdownMenuTrigger,st as Form,ft as FormControl,pt as FormDescription,lt as FormField,Y as FormItem,dt as FormLabel,mt as FormMessage,$ as Icon,St as IconPicker,M as Input,q as Label,Ct as Select,wt as Separator,Tt as Skeleton,N as Table,F as TableBody,R as TableCell,L as TableHead,P as TableHeader,I as TableRow,kt as Textarea,Ot as Toaster,D as cn,yt as prewarmIcons,ht as setIconEndpoint,_e as toast,bt as usePrewarmIcons};
5
5
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["variantClasses","SonnerToaster"],"sources":["../src/lib/cn.ts","../src/badge.tsx","../src/button.tsx","../src/card.tsx","../src/chart.tsx","../src/checkbox.tsx","../src/collapsible.tsx","../src/input.tsx","../src/table.tsx","../src/data-table/data-table-pagination.tsx","../src/dropdown-menu.tsx","../src/data-table/data-table-view-options.tsx","../src/data-table/data-table.tsx","../src/data-table/data-table-column-header.tsx","../src/dialog.tsx","../src/label.tsx","../src/form.tsx","../src/icon.tsx","../src/icon-picker.tsx","../src/select.tsx","../src/separator.tsx","../src/skeleton.tsx","../src/sonner.tsx","../src/textarea.tsx"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import type { HTMLAttributes } from 'react'\nimport { cn } from './lib/cn'\n\nexport interface BadgeProps extends HTMLAttributes<HTMLDivElement> {\n variant?: 'default' | 'secondary' | 'destructive' | 'outline'\n}\n\nconst variantClasses: Record<NonNullable<BadgeProps['variant']>, string> = {\n default: 'border-transparent bg-primary text-primary-foreground shadow-xs',\n secondary: 'border-transparent bg-secondary text-secondary-foreground',\n destructive: 'border-transparent bg-destructive text-destructive-foreground shadow-xs',\n outline: 'text-foreground',\n}\n\nexport function Badge({ className, variant = 'default', ...props }: BadgeProps) {\n return (\n <div\n className={cn(\n 'inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold',\n 'transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n variantClasses[variant],\n className,\n )}\n {...props}\n />\n )\n}\n","import { Slot } from '@radix-ui/react-slot'\nimport { Loader2 } from 'lucide-react'\nimport { type ButtonHTMLAttributes, forwardRef } from 'react'\nimport { cn } from './lib/cn'\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link'\n size?: 'default' | 'sm' | 'lg' | 'icon'\n loading?: boolean\n asChild?: boolean\n}\n\nconst variantClasses: Record<NonNullable<ButtonProps['variant']>, string> = {\n default: 'bg-primary text-primary-foreground shadow-xs hover:bg-primary/90',\n destructive: 'bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90',\n outline:\n 'border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground',\n secondary: 'bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80',\n ghost: 'hover:bg-accent hover:text-accent-foreground',\n link: 'text-primary underline-offset-4 hover:underline',\n}\n\nconst sizeClasses: Record<NonNullable<ButtonProps['size']>, string> = {\n default: 'h-9 px-4 py-2',\n sm: 'h-8 rounded-md px-3 text-xs',\n lg: 'h-10 rounded-md px-8',\n icon: 'h-9 w-9',\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant = 'default',\n size = 'default',\n loading = false,\n asChild = false,\n disabled,\n children,\n type = 'button',\n ...props\n },\n ref,\n ) => {\n const classes = cn(\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium',\n 'transition-colors cursor-pointer',\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n 'disabled:pointer-events-none disabled:opacity-50',\n '[&_svg]:pointer-events-none [&_svg]:shrink-0',\n variantClasses[variant],\n sizeClasses[size],\n className,\n )\n\n if (asChild) {\n return (\n <Slot ref={ref} className={classes} {...props}>\n {children}\n </Slot>\n )\n }\n\n return (\n <button ref={ref} disabled={disabled || loading} className={classes} type={type} {...props}>\n {loading && <Loader2 className=\"h-4 w-4 animate-spin\" />}\n {children}\n </button>\n )\n },\n)\n\nButton.displayName = 'Button'\n","import { forwardRef, type HTMLAttributes } from 'react'\nimport { cn } from './lib/cn'\n\nexport const Card = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('rounded-xl border bg-card text-card-foreground shadow-sm', className)}\n {...props}\n />\n ),\n)\nCard.displayName = 'Card'\n\nexport const CardHeader = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('flex flex-col space-y-1.5 p-6', className)} {...props} />\n ),\n)\nCardHeader.displayName = 'CardHeader'\n\nexport const CardTitle = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n ),\n)\nCardTitle.displayName = 'CardTitle'\n\nexport const CardDescription = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n ),\n)\nCardDescription.displayName = 'CardDescription'\n\nexport const CardContent = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('p-6 pt-0', className)} {...props} />\n ),\n)\nCardContent.displayName = 'CardContent'\n\nexport const CardFooter = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('flex items-center p-6 pt-0', className)} {...props} />\n ),\n)\nCardFooter.displayName = 'CardFooter'\n","'use client'\n\n/**\n * Chart primitives for dashboard widgets.\n *\n * Vendored from shadcn/ui chart component (Recharts under the hood).\n * Provides ChartContainer (responsive wrapper), ChartTooltip, ChartTooltipContent.\n *\n * Usage: import Recharts components directly (Bar, BarChart, XAxis, etc.)\n * and wrap them in ChartContainer with a ChartConfig for theming.\n *\n * Security: ChartContainer's `id` prop and ChartConfig keys/colors are\n * inlined into a `<style dangerouslySetInnerHTML>` block to publish per-chart\n * CSS variables. Inputs that don't match the strict allowlists below are\n * silently dropped — DO NOT pass user-controllable strings as `id`, config\n * keys, or color values without validating upstream first.\n */\n\nimport * as React from 'react'\nimport type { TooltipValueType } from 'recharts'\nimport * as RechartsPrimitive from 'recharts'\n\nimport { cn } from './lib/cn'\n\n// Format: { THEME_NAME: CSS_SELECTOR }\nconst THEMES = { light: '', dark: '.dark' } as const\n\nconst INITIAL_DIMENSION = { width: 320, height: 200 } as const\ntype TooltipNameType = number | string\n\n/**\n * Allowlist for chart id prop and ChartConfig keys.\n * Inlined into both the [data-chart=...] attribute selector and the\n * --color-{key} CSS custom property name; deny anything that could break\n * out of the selector or property declaration.\n */\nconst SAFE_CHART_ID_OR_KEY = /^[a-zA-Z0-9_-]+$/\n\n/**\n * Allowlist for ChartConfig color values.\n * Permits hex/rgb/hsl/oklch/var()/keyword colors; denies `;`, `{`, `}`, `<`, `>`, `\"`, `\\`\n * and other characters that would let a value escape the rule body.\n */\nconst SAFE_CSS_COLOR_VALUE = /^[#a-zA-Z0-9 ,.()/%-]+$/\n\n/**\n * Bare `url(...)` values are also rejected — even though the per-chart custom\n * property is inert at the declaration site, it leaks into the cascade and is\n * fetched by any downstream rule that uses `var(--color-key)` in\n * `background-image` / `mask-image` / `cursor` / `border-image` / etc. That's\n * the fetch-on-attribute-selector exfil class the audit calls out, just laundered\n * through a custom property. `var()` is the consumer-intended escape hatch — it\n * doesn't trigger a network fetch on its own.\n */\nconst FORBIDDEN_COLOR_FUNCTION = /\\burl\\s*\\(/i\n\nexport type ChartConfig = Record<\n string,\n {\n label?: React.ReactNode\n icon?: React.ComponentType\n } & (\n | { color?: string; theme?: never }\n | { color?: never; theme: Record<keyof typeof THEMES, string> }\n )\n>\n\ntype ChartContextProps = {\n config: ChartConfig\n}\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null)\n\nfunction useChart() {\n const context = React.useContext(ChartContext)\n\n if (!context) {\n throw new Error('useChart must be used within a <ChartContainer />')\n }\n\n return context\n}\n\n/**\n * Build the per-chart CSS rules emitted by `<ChartStyle>`.\n *\n * Returns `null` if there is nothing to emit. Drops individual config\n * entries whose key fails {@link SAFE_CHART_ID_OR_KEY} or whose color\n * value fails {@link SAFE_CSS_COLOR_VALUE} — silently, since those values\n * being present means a consumer is forwarding untrusted input.\n *\n * Exported for unit tests; not part of the package public API.\n */\nexport function buildChartCss(id: string, config: ChartConfig): string | null {\n if (!SAFE_CHART_ID_OR_KEY.test(id)) {\n return null\n }\n\n const colorConfig = Object.entries(config).filter(([, value]) => value.theme ?? value.color)\n if (!colorConfig.length) {\n return null\n }\n\n const blocks = Object.entries(THEMES)\n .map(([theme, prefix]) => {\n const lines = colorConfig\n .map(([key, itemConfig]) => {\n if (!SAFE_CHART_ID_OR_KEY.test(key)) {\n return null\n }\n const color =\n itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ?? itemConfig.color\n if (!color || !SAFE_CSS_COLOR_VALUE.test(color) || FORBIDDEN_COLOR_FUNCTION.test(color)) {\n return null\n }\n return ` --color-${key}: ${color};`\n })\n .filter((line): line is string => line !== null)\n\n if (!lines.length) {\n return null\n }\n return `${prefix} [data-chart=${id}] {\\n${lines.join('\\n')}\\n}`\n })\n .filter((block): block is string => block !== null)\n\n return blocks.length ? blocks.join('\\n') : null\n}\n\n/**\n * Recharts' `Payload.payload` is typed `any`, which cascades through\n * the indicator color resolution. Narrow once here so callers stay typed.\n */\nfunction getPayloadFill(payload: unknown): string | undefined {\n if (\n payload &&\n typeof payload === 'object' &&\n 'fill' in payload &&\n typeof (payload as { fill: unknown }).fill === 'string'\n ) {\n return (payload as { fill: string }).fill\n }\n return undefined\n}\n\nfunction ChartContainer({\n id,\n className,\n children,\n config,\n initialDimension = INITIAL_DIMENSION,\n nonce,\n ...props\n}: React.ComponentProps<'div'> & {\n config: ChartConfig\n children: React.ComponentProps<typeof RechartsPrimitive.ResponsiveContainer>['children']\n initialDimension?: {\n width: number\n height: number\n }\n /** CSP nonce forwarded to the inline `<style>` element. */\n nonce?: string\n}) {\n const uniqueId = React.useId()\n const safeProvidedId = id && SAFE_CHART_ID_OR_KEY.test(id) ? id : null\n const chartId = `chart-${safeProvidedId ?? uniqueId.replace(/:/g, '')}`\n\n return (\n <ChartContext.Provider value={{ config }}>\n <div\n data-slot=\"chart\"\n data-chart={chartId}\n className={cn(\n \"flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden\",\n className,\n )}\n {...props}\n >\n <ChartStyle id={chartId} config={config} nonce={nonce} />\n <RechartsPrimitive.ResponsiveContainer initialDimension={initialDimension}>\n {children}\n </RechartsPrimitive.ResponsiveContainer>\n </div>\n </ChartContext.Provider>\n )\n}\n\nconst ChartStyle = ({\n id,\n config,\n nonce,\n}: {\n id: string\n config: ChartConfig\n nonce?: string | undefined\n}) => {\n const css = buildChartCss(id, config)\n if (!css) {\n return null\n }\n\n return (\n // biome-ignore lint/security/noDangerouslySetInnerHtml: id/keys/colors validated by buildChartCss against SAFE_CHART_ID_OR_KEY + SAFE_CSS_COLOR_VALUE allowlists.\n <style nonce={nonce} dangerouslySetInnerHTML={{ __html: css }} />\n )\n}\n\nconst ChartTooltip = RechartsPrimitive.Tooltip\n\nfunction ChartTooltipContent({\n active,\n payload,\n className,\n indicator = 'dot',\n hideLabel = false,\n hideIndicator = false,\n label,\n labelFormatter,\n labelClassName,\n formatter,\n color,\n nameKey,\n labelKey,\n}: React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n React.ComponentProps<'div'> & {\n hideLabel?: boolean\n hideIndicator?: boolean\n indicator?: 'line' | 'dot' | 'dashed'\n nameKey?: string\n labelKey?: string\n } & Omit<\n RechartsPrimitive.DefaultTooltipContentProps<TooltipValueType, TooltipNameType>,\n 'accessibilityLayer'\n >) {\n const { config } = useChart()\n\n const tooltipLabel = React.useMemo(() => {\n if (hideLabel || !payload?.length) {\n return null\n }\n\n const [item] = payload\n const key = `${labelKey ?? item?.dataKey ?? item?.name ?? 'value'}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n const value =\n !labelKey && typeof label === 'string' ? (config[label]?.label ?? label) : itemConfig?.label\n\n if (labelFormatter) {\n return (\n <div className={cn('font-medium', labelClassName)}>{labelFormatter(value, payload)}</div>\n )\n }\n\n if (!value) {\n return null\n }\n\n return <div className={cn('font-medium', labelClassName)}>{value}</div>\n }, [label, labelFormatter, payload, hideLabel, labelClassName, config, labelKey])\n\n if (!active || !payload?.length) {\n return null\n }\n\n const nestLabel = payload.length === 1 && indicator !== 'dot'\n\n return (\n <div\n className={cn(\n 'grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl',\n className,\n )}\n >\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload\n .filter((item) => item.type !== 'none')\n .map((item, index) => {\n const lookupKey = `${nameKey ?? item.name ?? item.dataKey ?? 'value'}`\n const itemConfig = getPayloadConfigFromPayload(config, item, lookupKey)\n const indicatorColor = color ?? getPayloadFill(item.payload) ?? item.color\n\n return (\n <div\n key={lookupKey}\n className={cn(\n 'flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground',\n indicator === 'dot' && 'items-center',\n )}\n >\n {formatter && item?.value !== undefined && item.name ? (\n formatter(item.value, item.name, item, index, item.payload)\n ) : (\n <>\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn(\n 'shrink-0 rounded-[2px] border-(--color-border) bg-(--color-bg)',\n {\n 'h-2.5 w-2.5': indicator === 'dot',\n 'w-1': indicator === 'line',\n 'w-0 border-[1.5px] border-dashed bg-transparent':\n indicator === 'dashed',\n 'my-0.5': nestLabel && indicator === 'dashed',\n },\n )}\n style={\n {\n '--color-bg': indicatorColor,\n '--color-border': indicatorColor,\n } as React.CSSProperties\n }\n />\n )\n )}\n <div\n className={cn(\n 'flex flex-1 justify-between leading-none',\n nestLabel ? 'items-end' : 'items-center',\n )}\n >\n <div className=\"grid gap-1.5\">\n {nestLabel ? tooltipLabel : null}\n <span className=\"text-muted-foreground\">\n {itemConfig?.label ?? item.name}\n </span>\n </div>\n {item.value != null && (\n <span className=\"font-mono font-medium text-foreground tabular-nums\">\n {typeof item.value === 'number'\n ? item.value.toLocaleString()\n : String(item.value)}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n\nfunction getPayloadConfigFromPayload(config: ChartConfig, payload: unknown, key: string) {\n if (typeof payload !== 'object' || payload === null) {\n return undefined\n }\n\n const payloadPayload =\n 'payload' in payload && typeof payload.payload === 'object' && payload.payload !== null\n ? payload.payload\n : undefined\n\n let configLabelKey: string = key\n\n if (key in payload && typeof payload[key as keyof typeof payload] === 'string') {\n configLabelKey = payload[key as keyof typeof payload] as string\n } else if (\n payloadPayload &&\n key in payloadPayload &&\n typeof payloadPayload[key as keyof typeof payloadPayload] === 'string'\n ) {\n configLabelKey = payloadPayload[key as keyof typeof payloadPayload] as string\n }\n\n return configLabelKey in config ? config[configLabelKey] : config[key]\n}\n\nexport { ChartContainer, ChartTooltip, ChartTooltipContent }\n","import * as CheckboxPrimitive from '@radix-ui/react-checkbox'\nimport { Check } from 'lucide-react'\nimport { type ComponentPropsWithoutRef, forwardRef } from 'react'\nimport { cn } from './lib/cn'\n\nexport const Checkbox = forwardRef<\n HTMLButtonElement,\n ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n 'peer h-4 w-4 shrink-0 rounded-sm border border-primary shadow-xs',\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground',\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator className=\"flex items-center justify-center text-current\">\n <Check className=\"h-3.5 w-3.5\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n))\n\nCheckbox.displayName = 'Checkbox'\n","import * as CollapsiblePrimitive from '@radix-ui/react-collapsible'\n\n/**\n * Collapsible primitive (Radix). Used by the admin sidebar to fold nav groups\n * away (plan/config phase 03 §9). Controlled via `open` / `onOpenChange`, or\n * uncontrolled via `defaultOpen`.\n *\n * Minimal re-export (shadcn convention) — the consumer styles the trigger and\n * content. `CollapsibleContent` exposes the `--radix-collapsible-content-height`\n * CSS var for height-animated reveals when the consumer opts in.\n */\nexport const Collapsible = CollapsiblePrimitive.Root\nexport const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger\nexport const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent\n","import { forwardRef, type InputHTMLAttributes } from 'react'\nimport { cn } from './lib/cn'\n\nexport const Input = forwardRef<HTMLInputElement, InputHTMLAttributes<HTMLInputElement>>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n ref={ref}\n className={cn(\n 'flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-xs',\n 'transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground',\n 'placeholder:text-muted-foreground',\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n )\n },\n)\n\nInput.displayName = 'Input'\n","import {\n forwardRef,\n type HTMLAttributes,\n type TdHTMLAttributes,\n type ThHTMLAttributes,\n} from 'react'\nimport { cn } from './lib/cn'\n\nexport const Table = forwardRef<HTMLTableElement, HTMLAttributes<HTMLTableElement>>(\n ({ className, ...props }, ref) => (\n <div className=\"relative w-full overflow-auto\">\n <table ref={ref} className={cn('w-full caption-bottom text-sm', className)} {...props} />\n </div>\n ),\n)\nTable.displayName = 'Table'\n\nexport const TableHeader = forwardRef<\n HTMLTableSectionElement,\n HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <thead ref={ref} className={cn('[&_tr]:border-b', className)} {...props} />\n))\nTableHeader.displayName = 'TableHeader'\n\nexport const TableBody = forwardRef<\n HTMLTableSectionElement,\n HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tbody ref={ref} className={cn('[&_tr:last-child]:border-0', className)} {...props} />\n))\nTableBody.displayName = 'TableBody'\n\nexport const TableFooter = forwardRef<\n HTMLTableSectionElement,\n HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn('border-t bg-muted/50 font-medium [&>tr]:last:border-b-0', className)}\n {...props}\n />\n))\nTableFooter.displayName = 'TableFooter'\n\nexport const TableRow = forwardRef<HTMLTableRowElement, HTMLAttributes<HTMLTableRowElement>>(\n ({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n 'border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted',\n className,\n )}\n {...props}\n />\n ),\n)\nTableRow.displayName = 'TableRow'\n\nexport const TableHead = forwardRef<HTMLTableCellElement, ThHTMLAttributes<HTMLTableCellElement>>(\n ({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n 'h-10 px-2 text-left align-middle font-medium text-muted-foreground',\n '[&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]',\n className,\n )}\n {...props}\n />\n ),\n)\nTableHead.displayName = 'TableHead'\n\nexport const TableCell = forwardRef<HTMLTableCellElement, TdHTMLAttributes<HTMLTableCellElement>>(\n ({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(\n 'p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]',\n className,\n )}\n {...props}\n />\n ),\n)\nTableCell.displayName = 'TableCell'\n\nexport const TableCaption = forwardRef<\n HTMLTableCaptionElement,\n HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption ref={ref} className={cn('mt-4 text-sm text-muted-foreground', className)} {...props} />\n))\nTableCaption.displayName = 'TableCaption'\n","import type { Table } from '@tanstack/react-table'\nimport { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from 'lucide-react'\nimport { Button } from '../button'\nimport { cn } from '../lib/cn'\n\ninterface DataTablePaginationProps<TData> {\n table: Table<TData>\n className?: string | undefined\n}\n\nexport function DataTablePagination<TData>({ table, className }: DataTablePaginationProps<TData>) {\n const selectedCount = table.getFilteredSelectedRowModel().rows.length\n const totalCount = table.getFilteredRowModel().rows.length\n\n return (\n <div className={cn('flex items-center justify-between px-2', className)}>\n <div className=\"flex-1 text-sm text-muted-foreground\">\n {selectedCount > 0 && (\n <span>\n {selectedCount} of {totalCount} row(s) selected\n </span>\n )}\n </div>\n <div className=\"flex items-center space-x-6 lg:space-x-8\">\n <div className=\"flex items-center space-x-2\">\n <p className=\"text-sm font-medium\">\n Page {table.getState().pagination.pageIndex + 1} of {table.getPageCount()}\n </p>\n </div>\n <div className=\"flex items-center space-x-2\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"hidden h-8 w-8 lg:flex\"\n onClick={() => table.setPageIndex(0)}\n disabled={!table.getCanPreviousPage()}\n >\n <span className=\"sr-only\">Go to first page</span>\n <ChevronsLeft className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n >\n <span className=\"sr-only\">Go to previous page</span>\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n >\n <span className=\"sr-only\">Go to next page</span>\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"hidden h-8 w-8 lg:flex\"\n onClick={() => table.setPageIndex(table.getPageCount() - 1)}\n disabled={!table.getCanNextPage()}\n >\n <span className=\"sr-only\">Go to last page</span>\n <ChevronsRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </div>\n )\n}\n","import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\nimport { Check, ChevronRight } from 'lucide-react'\nimport { type ComponentPropsWithoutRef, forwardRef, type HTMLAttributes } from 'react'\nimport { cn } from './lib/cn'\n\nexport const DropdownMenu = DropdownMenuPrimitive.Root\nexport const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\nexport const DropdownMenuGroup = DropdownMenuPrimitive.Group\nexport const DropdownMenuPortal = DropdownMenuPrimitive.Portal\nexport const DropdownMenuSub = DropdownMenuPrimitive.Sub\n\nexport const DropdownMenuContent = forwardRef<\n HTMLDivElement,\n ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n 'data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2',\n 'data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownMenuContent.displayName = 'DropdownMenuContent'\n\nexport const DropdownMenuItem = forwardRef<\n HTMLDivElement,\n ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & { inset?: boolean }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none',\n 'transition-colors focus:bg-accent focus:text-accent-foreground',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n '[&_svg]:pointer-events-none [&_svg]:shrink-0',\n inset && 'pl-8',\n className,\n )}\n {...props}\n />\n))\nDropdownMenuItem.displayName = 'DropdownMenuItem'\n\nexport const DropdownMenuCheckboxItem = forwardRef<\n HTMLDivElement,\n ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none',\n 'transition-colors focus:bg-accent focus:text-accent-foreground',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n {...(checked !== undefined && { checked })}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownMenuCheckboxItem.displayName = 'DropdownMenuCheckboxItem'\n\nexport const DropdownMenuLabel = forwardRef<\n HTMLDivElement,\n ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & { inset?: boolean }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn('px-2 py-1.5 text-sm font-semibold', inset && 'pl-8', className)}\n {...props}\n />\n))\nDropdownMenuLabel.displayName = 'DropdownMenuLabel'\n\nexport const DropdownMenuSeparator = forwardRef<\n HTMLDivElement,\n ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-muted', className)}\n {...props}\n />\n))\nDropdownMenuSeparator.displayName = 'DropdownMenuSeparator'\n\nexport const DropdownMenuSubTrigger = forwardRef<\n HTMLDivElement,\n ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & { inset?: boolean }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n 'flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none',\n 'focus:bg-accent data-[state=open]:bg-accent',\n '[&_svg]:pointer-events-none [&_svg]:shrink-0',\n inset && 'pl-8',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto h-4 w-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownMenuSubTrigger.displayName = 'DropdownMenuSubTrigger'\n\nexport const DropdownMenuSubContent = forwardRef<\n HTMLDivElement,\n ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n 'data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2',\n 'data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n))\nDropdownMenuSubContent.displayName = 'DropdownMenuSubContent'\n\nexport function DropdownMenuShortcut({ className, ...props }: HTMLAttributes<HTMLSpanElement>) {\n return <span className={cn('ml-auto text-xs tracking-widest opacity-60', className)} {...props} />\n}\n","import type { Table } from '@tanstack/react-table'\nimport { Settings2 } from 'lucide-react'\nimport { Button } from '../button'\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../dropdown-menu'\n\ninterface DataTableViewOptionsProps<TData> {\n table: Table<TData>\n}\n\nexport function DataTableViewOptions<TData>({ table }: DataTableViewOptionsProps<TData>) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"ml-auto hidden h-8 lg:flex\">\n <Settings2 className=\"mr-2 h-4 w-4\" />\n View\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-[150px]\">\n <DropdownMenuLabel>Toggle columns</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {table\n .getAllColumns()\n .filter((column) => typeof column.accessorFn !== 'undefined' && column.getCanHide())\n .map((column) => (\n <DropdownMenuCheckboxItem\n key={column.id}\n className=\"capitalize\"\n checked={column.getIsVisible()}\n onCheckedChange={(value) => column.toggleVisibility(!!value)}\n >\n {column.id}\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","import {\n type ColumnDef,\n type ColumnFiltersState,\n flexRender,\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n type RowSelectionState,\n type SortingState,\n useReactTable,\n type VisibilityState,\n} from '@tanstack/react-table'\nimport { useState } from 'react'\nimport { Input } from '../input'\nimport { cn } from '../lib/cn'\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../table'\nimport { DataTablePagination } from './data-table-pagination'\nimport { DataTableViewOptions } from './data-table-view-options'\n\nexport interface DataTableClassNames {\n root?: string\n toolbar?: string\n table?: string\n pagination?: string\n}\n\nexport interface DataTableProps<TData, TValue> {\n columns: ColumnDef<TData, TValue>[]\n data: TData[]\n searchKey?: string\n searchPlaceholder?: string\n pageSize?: number\n emptyMessage?: string\n classNames?: DataTableClassNames\n}\n\nexport function DataTable<TData, TValue>({\n columns,\n data,\n searchKey,\n searchPlaceholder = 'Filter...',\n pageSize = 10,\n emptyMessage = 'No results.',\n classNames,\n}: DataTableProps<TData, TValue>) {\n const [sorting, setSorting] = useState<SortingState>([])\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([])\n const [columnVisibility, setColumnVisibility] = useState<VisibilityState>({})\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({})\n\n const table = useReactTable({\n data,\n columns,\n state: { sorting, columnFilters, columnVisibility, rowSelection },\n onSortingChange: setSorting,\n onColumnFiltersChange: setColumnFilters,\n onColumnVisibilityChange: setColumnVisibility,\n onRowSelectionChange: setRowSelection,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n initialState: { pagination: { pageSize } },\n })\n\n return (\n <div className={cn('space-y-4', classNames?.root)}>\n {/* Toolbar */}\n <div className={cn('flex items-center justify-between', classNames?.toolbar)}>\n <div className=\"flex flex-1 items-center space-x-2\">\n {searchKey && (\n <Input\n placeholder={searchPlaceholder}\n value={(table.getColumn(searchKey)?.getFilterValue() as string) ?? ''}\n onChange={(event) => table.getColumn(searchKey)?.setFilterValue(event.target.value)}\n className=\"h-8 w-[150px] lg:w-[250px]\"\n />\n )}\n </div>\n <DataTableViewOptions table={table} />\n </div>\n\n {/* Table */}\n <div className={cn('rounded-md border', classNames?.table)}>\n <Table>\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <TableHead key={header.id} colSpan={header.colSpan}>\n {header.isPlaceholder\n ? null\n : flexRender(header.column.columnDef.header, header.getContext())}\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {table.getRowModel().rows.length > 0 ? (\n table.getRowModel().rows.map((row) => (\n <TableRow key={row.id} data-state={row.getIsSelected() && 'selected'}>\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : (\n <TableRow>\n <TableCell colSpan={columns.length} className=\"h-24 text-center\">\n {emptyMessage}\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </div>\n\n {/* Pagination */}\n <DataTablePagination table={table} className={classNames?.pagination} />\n </div>\n )\n}\n","import type { Column } from '@tanstack/react-table'\nimport { ArrowDown, ArrowUp, ChevronsUpDown, EyeOff } from 'lucide-react'\nimport { Button } from '../button'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../dropdown-menu'\nimport { cn } from '../lib/cn'\n\ninterface DataTableColumnHeaderProps<TData, TValue> {\n column: Column<TData, TValue>\n title: string\n className?: string\n}\n\nexport function DataTableColumnHeader<TData, TValue>({\n column,\n title,\n className,\n}: DataTableColumnHeaderProps<TData, TValue>) {\n if (!column.getCanSort()) {\n return <div className={cn(className)}>{title}</div>\n }\n\n return (\n <div className={cn('flex items-center space-x-2', className)}>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\" className=\"-ml-3 h-8 data-[state=open]:bg-accent\">\n <span>{title}</span>\n {column.getIsSorted() === 'desc' ? (\n <ArrowDown className=\"ml-2 h-4 w-4\" />\n ) : column.getIsSorted() === 'asc' ? (\n <ArrowUp className=\"ml-2 h-4 w-4\" />\n ) : (\n <ChevronsUpDown className=\"ml-2 h-4 w-4\" />\n )}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n <DropdownMenuItem onClick={() => column.toggleSorting(false)}>\n <ArrowUp className=\"mr-2 h-3.5 w-3.5 text-muted-foreground/70\" />\n Asc\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => column.toggleSorting(true)}>\n <ArrowDown className=\"mr-2 h-3.5 w-3.5 text-muted-foreground/70\" />\n Desc\n </DropdownMenuItem>\n {column.getCanHide() && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => column.toggleVisibility(false)}>\n <EyeOff className=\"mr-2 h-3.5 w-3.5 text-muted-foreground/70\" />\n Hide\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n )\n}\n","import * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { X } from 'lucide-react'\nimport { type ComponentPropsWithoutRef, forwardRef, type HTMLAttributes } from 'react'\nimport { cn } from './lib/cn'\n\nexport const Dialog = DialogPrimitive.Root\nexport const DialogTrigger = DialogPrimitive.Trigger\nexport const DialogClose = DialogPrimitive.Close\nexport const DialogPortal = DialogPrimitive.Portal\n\nexport const DialogOverlay = forwardRef<\n HTMLDivElement,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fixed inset-0 z-50 bg-black/80',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className,\n )}\n {...props}\n />\n))\nDialogOverlay.displayName = 'DialogOverlay'\n\nexport const DialogContent = forwardRef<\n HTMLDivElement,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%]',\n 'gap-4 border bg-background p-6 shadow-lg sm:rounded-lg',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n 'data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%]',\n 'data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]',\n className,\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close\n className={cn(\n 'absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity',\n 'hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n 'disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground',\n 'cursor-pointer',\n )}\n >\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n))\nDialogContent.displayName = 'DialogContent'\n\nexport function DialogHeader({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn('flex flex-col space-y-1.5 text-center sm:text-left', className)}\n {...props}\n />\n )\n}\n\nexport function DialogFooter({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className)}\n {...props}\n />\n )\n}\n\nexport const DialogTitle = forwardRef<\n HTMLHeadingElement,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn('text-lg font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n))\nDialogTitle.displayName = 'DialogTitle'\n\nexport const DialogDescription = forwardRef<\n HTMLParagraphElement,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n))\nDialogDescription.displayName = 'DialogDescription'\n","import * as LabelPrimitive from '@radix-ui/react-label'\nimport { type ComponentPropsWithoutRef, forwardRef } from 'react'\nimport { cn } from './lib/cn'\n\nexport const Label = forwardRef<\n HTMLLabelElement,\n ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(\n 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70',\n className,\n )}\n {...props}\n />\n))\n\nLabel.displayName = 'Label'\n","import type * as LabelPrimitive from '@radix-ui/react-label'\nimport { Slot } from '@radix-ui/react-slot'\nimport {\n type ComponentPropsWithoutRef,\n createContext,\n forwardRef,\n type HTMLAttributes,\n useContext,\n useId,\n} from 'react'\nimport {\n Controller,\n type ControllerProps,\n type FieldPath,\n type FieldValues,\n FormProvider,\n useFormContext,\n} from 'react-hook-form'\nimport { Label } from './label'\nimport { cn } from './lib/cn'\n\n/* ---------- Form (re-export of FormProvider) ---------- */\n\n// rolldown-plugin-dts 0.25.x (PR #243 \"Preserve external import types\")\n// flagged TS2742 on a bare `export const Form = FormProvider`: the inferred\n// type of `Form` indirectly references `@types/react` via react-hook-form's\n// generics, and the bundler can't construct a portable type alias without an\n// explicit annotation. Pinning the type to `typeof FormProvider` is the\n// react-hook-form-recommended fix (see hook-form examples) and identical at\n// the value level.\nexport const Form: typeof FormProvider = FormProvider\n\n/* ---------- FormField context ---------- */\n\ninterface FormFieldContextValue<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> {\n name: TName\n}\n\nconst FormFieldContext = createContext<FormFieldContextValue>({} as FormFieldContextValue)\n\nexport function FormField<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>(props: ControllerProps<TFieldValues, TName>) {\n return (\n <FormFieldContext.Provider value={{ name: props.name }}>\n <Controller {...props} />\n </FormFieldContext.Provider>\n )\n}\n\n/* ---------- FormItem context ---------- */\n\ninterface FormItemContextValue {\n id: string\n}\n\nconst FormItemContext = createContext<FormItemContextValue>({} as FormItemContextValue)\n\n/* ---------- useFormField hook ---------- */\n\nexport function useFormField() {\n const fieldContext = useContext(FormFieldContext)\n const itemContext = useContext(FormItemContext)\n const { getFieldState, formState } = useFormContext()\n\n const fieldState = getFieldState(fieldContext.name, formState)\n\n const { id } = itemContext\n\n return {\n id,\n name: fieldContext.name,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n ...fieldState,\n }\n}\n\n/* ---------- FormItem ---------- */\n\nexport const FormItem = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => {\n const id = useId()\n return (\n <FormItemContext.Provider value={{ id }}>\n <div ref={ref} className={cn('space-y-2', className)} {...props} />\n </FormItemContext.Provider>\n )\n },\n)\nFormItem.displayName = 'FormItem'\n\n/* ---------- FormLabel ---------- */\n\nexport const FormLabel = forwardRef<\n HTMLLabelElement,\n ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\n>(({ className, ...props }, ref) => {\n const { error, formItemId } = useFormField()\n return (\n <Label\n ref={ref}\n className={cn(error && 'text-destructive', className)}\n htmlFor={formItemId}\n {...props}\n />\n )\n})\nFormLabel.displayName = 'FormLabel'\n\n/* ---------- FormControl ---------- */\n\nexport const FormControl = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<typeof Slot>>(\n ({ ...props }, ref) => {\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField()\n return (\n <Slot\n ref={ref}\n id={formItemId}\n aria-describedby={!error ? formDescriptionId : `${formDescriptionId} ${formMessageId}`}\n aria-invalid={!!error}\n {...props}\n />\n )\n },\n)\nFormControl.displayName = 'FormControl'\n\n/* ---------- FormDescription ---------- */\n\nexport const FormDescription = forwardRef<\n HTMLParagraphElement,\n HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => {\n const { formDescriptionId } = useFormField()\n return (\n <p\n ref={ref}\n id={formDescriptionId}\n className={cn('text-[0.8rem] text-muted-foreground', className)}\n {...props}\n />\n )\n})\nFormDescription.displayName = 'FormDescription'\n\n/* ---------- FormMessage ---------- */\n\nexport const FormMessage = forwardRef<HTMLParagraphElement, HTMLAttributes<HTMLParagraphElement>>(\n ({ className, children, ...props }, ref) => {\n const { error, formMessageId } = useFormField()\n const body = error ? String(error.message) : children\n\n if (!body) return null\n\n return (\n <p\n ref={ref}\n id={formMessageId}\n className={cn('text-[0.8rem] font-medium text-destructive', className)}\n {...props}\n >\n {body}\n </p>\n )\n },\n)\nFormMessage.displayName = 'FormMessage'\n","'use client'\n\n/**\n * `<Icon name>` — render a Lucide icon by kebab-case name, fetched **on demand**\n * as SVG data from the toolkit's icon endpoint (plan/config SD003).\n *\n * The client ships **zero icon code**: each icon's `<svg>` is fetched once from\n * `GET {endpoint}/{name}`, cached in-memory (shared across all `<Icon>`s) and by\n * the browser (`immutable`), then inlined so it inherits `currentColor` for\n * theming. Unknown/empty names render nothing. This replaces the crash-prone\n * `lucide-react/dynamic` approach (1500 lazy chunks crawled the library under\n * Turbopack — lucide #1576).\n *\n * Endpoint defaults to `/api/admin/icons` (the toolkit's admin API base). Apps\n * that mount the admin API elsewhere call {@link setIconEndpoint} once at boot.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\n\nlet endpoint = '/api/admin/icons'\n\n/** Override the icon endpoint base (default `/api/admin/icons`). Call once at app boot. */\nexport function setIconEndpoint(base: string): void {\n const next = base.replace(/\\/+$/, '')\n if (next !== endpoint) {\n endpoint = next\n // Drop everything fetched from the previous backend — otherwise stale SVGs /\n // name lists from the old endpoint keep serving after the switch.\n cache.clear()\n namesPromise = null\n }\n}\n\n// Shared cache: name → svg string | null (known-missing) | in-flight Promise.\nconst cache = new Map<string, string | null | Promise<string | null>>()\n\n/** Fetch + cache one icon's SVG (dedupes concurrent requests for the same name). */\nfunction fetchIconSvg(name: string): Promise<string | null> {\n const hit = cache.get(name)\n if (hit instanceof Promise) return hit\n if (hit !== undefined) return Promise.resolve(hit)\n const p = fetch(`${endpoint}/${encodeURIComponent(name)}`)\n .then(async (r) => {\n if (r.ok) {\n const svg = await r.text()\n cache.set(name, svg)\n return svg\n }\n // 404 = the icon genuinely doesn't exist → cache the miss so we don't refetch.\n // A transient failure (e.g. the route's 503 when icon data is briefly\n // unavailable) must NOT be cached as a permanent miss — otherwise one outage\n // blanks the icon for the rest of the session. Drop it so the next render retries.\n if (r.status === 404) cache.set(name, null)\n else cache.delete(name)\n return null\n })\n .catch(() => {\n // Network error — transient. Clear the in-flight entry so a retry can happen.\n cache.delete(name)\n return null\n })\n cache.set(name, p)\n return p\n}\n\nlet namesPromise: Promise<readonly string[]> | null = null\n\n/** Fetch the full icon-name list (for pickers). Cached for the session. */\nexport function fetchIconNames(): Promise<readonly string[]> {\n if (!namesPromise) {\n namesPromise = fetch(endpoint)\n .then((r) => (r.ok ? (r.json() as Promise<readonly string[]>) : []))\n .catch(() => [])\n }\n return namesPromise\n}\n\nexport interface IconProps {\n /** Lucide kebab-case name (e.g. `panel-left`). Unknown/empty → renders nothing. */\n name?: string | null | undefined\n /** Sizing class applied to the wrapper (e.g. `h-4 w-4`). The SVG fills it. */\n className?: string | undefined\n /** Explicit pixel size (alternative to `className`). */\n size?: number | undefined\n}\n\nexport function Icon({ name, className, size }: IconProps): React.ReactElement | null {\n // Always start `null` so the server render and the client's FIRST render match\n // (the SVG is client-fetched data the server doesn't have — seeding from the\n // cache here causes a hydration mismatch). The effect populates it immediately\n // on a cache hit, or after the fetch.\n const [svg, setSvg] = useState<string | null>(null)\n\n // External-resource fetch (the sanctioned useEffect use): load the SVG on\n // demand, ignore the result if the name changed / unmounted before it lands.\n useEffect(() => {\n if (!name) {\n setSvg(null)\n return\n }\n const hit = cache.get(name)\n if (typeof hit === 'string' || hit === null) {\n setSvg(hit)\n return\n }\n let active = true\n fetchIconSvg(name).then((s) => {\n if (active) setSvg(s)\n })\n return () => {\n active = false\n }\n }, [name])\n\n // Memoize the dangerouslySetInnerHTML object — a fresh object identity on every\n // render makes React 19 re-apply innerHTML each time (PR #621 gotcha).\n const html = useMemo(() => (svg ? { __html: svg } : null), [svg])\n if (!html) return null\n\n return (\n <span\n className={className}\n style={{\n display: 'inline-flex',\n lineHeight: 0,\n ...(size != null ? { width: size, height: size } : {}),\n }}\n // biome-ignore lint/security/noDangerouslySetInnerHtml: SVG is from our own first-party icon endpoint (lucide data), not user input.\n dangerouslySetInnerHTML={html}\n aria-hidden=\"true\"\n />\n )\n}\n","'use client'\n\n/**\n * `<IconPicker>` — a searchable Lucide icon browser (plan/config SD003).\n *\n * On-demand by construction: the name list is fetched once when the dialog first\n * opens (not per mount — there can be many pickers on a page), search filters the\n * names client-side (just strings), and each visible cell renders `<Icon>`, which\n * fetches that one SVG on demand + caches it. No icon code/data ships in the\n * bundle; opening the picker never loads the whole set.\n *\n * Results are capped ({@link MAX_RESULTS}) so a broad query renders a bounded grid\n * — type to narrow. (Virtualized windowing is a future enhancement; the cap keeps\n * the request count + DOM bounded for v1.)\n */\n\nimport { forwardRef, useEffect, useId, useMemo, useState } from 'react'\nimport { Button } from './button'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from './dialog'\nimport { fetchIconNames, Icon } from './icon'\nimport { Input } from './input'\nimport { cn } from './lib/cn'\n\nconst MAX_RESULTS = 90\n\nexport interface IconPickerProps {\n /** Current Lucide icon name, or empty. */\n value?: string | null | undefined\n /** Called with the chosen name, or `undefined` when cleared. */\n onChange: (name: string | undefined) => void\n /** Trigger text when no icon is selected. Default \"Pick icon\". */\n placeholder?: string\n /** Extra classes for the trigger button. */\n className?: string\n /** Disable the trigger. */\n disabled?: boolean\n /**\n * a11y props a form wrapper (e.g. shadcn `FormControl`) injects into the\n * trigger so the field stays linked to its label + validation message.\n */\n id?: string\n 'aria-describedby'?: string\n 'aria-invalid'?: React.AriaAttributes['aria-invalid']\n}\n\nexport const IconPicker = forwardRef<HTMLButtonElement, IconPickerProps>(function IconPicker(\n { value, onChange, placeholder = 'Pick icon', className, disabled, id, ...aria },\n ref,\n) {\n const [open, setOpen] = useState(false)\n const [query, setQuery] = useState('')\n const [names, setNames] = useState<readonly string[]>([])\n const [loading, setLoading] = useState(false)\n const searchId = useId()\n\n // Load the name list the first time the dialog opens (cached module-wide, so\n // multiple pickers share one request). Fetch is the sanctioned useEffect use.\n useEffect(() => {\n if (!open || names.length > 0) return\n let active = true\n setLoading(true)\n fetchIconNames().then((list) => {\n if (active) {\n setNames(list)\n setLoading(false)\n }\n })\n return () => {\n active = false\n }\n }, [open, names.length])\n\n const results = useMemo(() => {\n const needle = query.trim().toLowerCase()\n const matches = needle ? names.filter((n) => n.includes(needle)) : names\n return { shown: matches.slice(0, MAX_RESULTS), total: matches.length }\n }, [query, names])\n\n const select = (name: string | undefined) => {\n onChange(name)\n setOpen(false)\n setQuery('')\n }\n\n return (\n <>\n {/* Fixed-width icon-only trigger: showing the variable-length icon NAME made\n rows ragged. The icon itself is the affordance; the name lives in the\n dialog + the tooltip. */}\n <Button\n ref={ref}\n id={id}\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n disabled={disabled}\n onClick={() => setOpen(true)}\n title={value ?? placeholder}\n aria-label={value ? `Icon: ${value}` : placeholder}\n className={className}\n {...aria}\n >\n {value ? (\n <Icon name={value} size={16} />\n ) : (\n <span aria-hidden className=\"text-base leading-none text-muted-foreground\">\n +\n </span>\n )}\n </Button>\n\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogContent className=\"max-w-lg\">\n <DialogHeader>\n <DialogTitle>Choose an icon</DialogTitle>\n </DialogHeader>\n {/* Placeholder text is not a reliable accessible name — give the\n search field a real label linked via `searchId`. */}\n <label htmlFor={searchId} className=\"sr-only\">\n Search icons\n </label>\n <Input\n id={searchId}\n autoFocus\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search icons…\"\n />\n <div className=\"grid max-h-72 grid-cols-8 gap-1 overflow-auto p-0.5\">\n <button\n type=\"button\"\n title=\"No icon\"\n aria-label=\"No icon\"\n onClick={() => select(undefined)}\n className={cn(\n 'flex aspect-square items-center justify-center rounded-md border border-border text-[10px] text-muted-foreground hover:bg-accent',\n !value && 'ring-2 ring-ring',\n )}\n >\n none\n </button>\n {results.shown.map((name) => (\n <button\n key={name}\n type=\"button\"\n title={name}\n aria-label={name}\n onClick={() => select(name)}\n className={cn(\n 'flex aspect-square items-center justify-center rounded-md border border-transparent hover:bg-accent hover:border-border',\n name === value && 'ring-2 ring-ring',\n )}\n >\n <Icon name={name} size={18} />\n </button>\n ))}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {loading\n ? 'Loading icons…'\n : query\n ? `${results.total} match${results.total === 1 ? '' : 'es'}${\n results.total > MAX_RESULTS ? ` (showing ${MAX_RESULTS})` : ''\n }`\n : `${names.length} icons — type to search`}\n </div>\n </DialogContent>\n </Dialog>\n </>\n )\n})\n","import { forwardRef, type SelectHTMLAttributes } from 'react'\nimport { cn } from './lib/cn'\n\nexport const Select = forwardRef<HTMLSelectElement, SelectHTMLAttributes<HTMLSelectElement>>(\n ({ className, children, ...props }, ref) => {\n return (\n <select\n ref={ref}\n className={cn(\n 'flex h-9 w-full rounded-md border border-input bg-background text-foreground px-3 py-1 text-sm shadow-xs',\n 'transition-colors',\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n >\n {children}\n </select>\n )\n },\n)\n\nSelect.displayName = 'Select'\n","import * as SeparatorPrimitive from '@radix-ui/react-separator'\nimport { type ComponentPropsWithoutRef, forwardRef } from 'react'\nimport { cn } from './lib/cn'\n\nexport const Separator = forwardRef<\n HTMLDivElement,\n ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(({ className, orientation = 'horizontal', decorative = true, ...props }, ref) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n 'shrink-0 bg-border',\n orientation === 'horizontal' ? 'h-[1px] w-full' : 'h-full w-[1px]',\n className,\n )}\n {...props}\n />\n))\n\nSeparator.displayName = 'Separator'\n","import type { HTMLAttributes } from 'react'\nimport { cn } from './lib/cn'\n\nexport function Skeleton({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('animate-pulse rounded-md bg-muted', className)} {...props} />\n}\n","/**\n * Toast notifications — wraps sonner with toolkit token styling.\n *\n * Usage:\n * import { Toaster, toast } from '@murumets-ee/ui'\n *\n * // In layout (once):\n * <Toaster />\n *\n * // Anywhere:\n * toast.success('Saved')\n * toast.error('Cannot delete: referenced by article')\n *\n * Consumer-provided `toastOptions.style` and `toastOptions.classNames` are\n * deep-merged with the toolkit defaults — overriding `error` doesn't drop\n * the `success` className, and overriding `background` doesn't drop the\n * border / color.\n */\n\nimport type { ComponentProps } from 'react'\nimport { Toaster as SonnerToaster, toast } from 'sonner'\n\nconst DEFAULT_STYLE = {\n background: 'var(--color-background)',\n color: 'var(--color-foreground)',\n border: '1px solid var(--color-border)',\n}\n\nconst DEFAULT_CLASS_NAMES = {\n error: 'sonner-error',\n success: 'sonner-success',\n}\n\nfunction Toaster({ toastOptions, ...props }: ComponentProps<typeof SonnerToaster>) {\n return (\n <SonnerToaster\n position=\"bottom-right\"\n {...props}\n toastOptions={{\n ...toastOptions,\n style: { ...DEFAULT_STYLE, ...toastOptions?.style },\n classNames: { ...DEFAULT_CLASS_NAMES, ...toastOptions?.classNames },\n }}\n />\n )\n}\n\nexport { Toaster, toast }\n","import { forwardRef, type TextareaHTMLAttributes } from 'react'\nimport { cn } from './lib/cn'\n\nexport const Textarea = forwardRef<\n HTMLTextAreaElement,\n TextareaHTMLAttributes<HTMLTextAreaElement>\n>(({ className, ...props }, ref) => {\n return (\n <textarea\n ref={ref}\n className={cn(\n 'flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-xs',\n 'placeholder:text-muted-foreground',\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n )\n})\n\nTextarea.displayName = 'Textarea'\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["variantClasses","SonnerToaster"],"sources":["../src/lib/cn.ts","../src/badge.tsx","../src/button.tsx","../src/card.tsx","../src/chart.tsx","../src/checkbox.tsx","../src/collapsible.tsx","../src/input.tsx","../src/table.tsx","../src/data-table/data-table-pagination.tsx","../src/dropdown-menu.tsx","../src/data-table/data-table-view-options.tsx","../src/data-table/data-table.tsx","../src/data-table/data-table-column-header.tsx","../src/dialog.tsx","../src/label.tsx","../src/form.tsx","../src/icon.tsx","../src/icon-picker.tsx","../src/select.tsx","../src/separator.tsx","../src/skeleton.tsx","../src/sonner.tsx","../src/textarea.tsx"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import type { HTMLAttributes } from 'react'\nimport { cn } from './lib/cn'\n\nexport interface BadgeProps extends HTMLAttributes<HTMLDivElement> {\n variant?: 'default' | 'secondary' | 'destructive' | 'outline'\n}\n\nconst variantClasses: Record<NonNullable<BadgeProps['variant']>, string> = {\n default: 'border-transparent bg-primary text-primary-foreground shadow-xs',\n secondary: 'border-transparent bg-secondary text-secondary-foreground',\n destructive: 'border-transparent bg-destructive text-destructive-foreground shadow-xs',\n outline: 'text-foreground',\n}\n\nexport function Badge({ className, variant = 'default', ...props }: BadgeProps) {\n return (\n <div\n className={cn(\n 'inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold',\n 'transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n variantClasses[variant],\n className,\n )}\n {...props}\n />\n )\n}\n","import { Slot } from '@radix-ui/react-slot'\nimport { Loader2 } from 'lucide-react'\nimport { type ButtonHTMLAttributes, forwardRef } from 'react'\nimport { cn } from './lib/cn'\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link'\n size?: 'default' | 'sm' | 'lg' | 'icon'\n loading?: boolean\n asChild?: boolean\n}\n\nconst variantClasses: Record<NonNullable<ButtonProps['variant']>, string> = {\n default: 'bg-primary text-primary-foreground shadow-xs hover:bg-primary/90',\n destructive: 'bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90',\n outline:\n 'border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground',\n secondary: 'bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80',\n ghost: 'hover:bg-accent hover:text-accent-foreground',\n link: 'text-primary underline-offset-4 hover:underline',\n}\n\nconst sizeClasses: Record<NonNullable<ButtonProps['size']>, string> = {\n default: 'h-9 px-4 py-2',\n sm: 'h-8 rounded-md px-3 text-xs',\n lg: 'h-10 rounded-md px-8',\n icon: 'h-9 w-9',\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant = 'default',\n size = 'default',\n loading = false,\n asChild = false,\n disabled,\n children,\n type = 'button',\n ...props\n },\n ref,\n ) => {\n const classes = cn(\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium',\n 'transition-colors cursor-pointer',\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n 'disabled:pointer-events-none disabled:opacity-50',\n '[&_svg]:pointer-events-none [&_svg]:shrink-0',\n variantClasses[variant],\n sizeClasses[size],\n className,\n )\n\n if (asChild) {\n return (\n <Slot ref={ref} className={classes} {...props}>\n {children}\n </Slot>\n )\n }\n\n return (\n <button ref={ref} disabled={disabled || loading} className={classes} type={type} {...props}>\n {loading && <Loader2 className=\"h-4 w-4 animate-spin\" />}\n {children}\n </button>\n )\n },\n)\n\nButton.displayName = 'Button'\n","import { forwardRef, type HTMLAttributes } from 'react'\nimport { cn } from './lib/cn'\n\nexport const Card = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('rounded-xl border bg-card text-card-foreground shadow-sm', className)}\n {...props}\n />\n ),\n)\nCard.displayName = 'Card'\n\nexport const CardHeader = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('flex flex-col space-y-1.5 p-6', className)} {...props} />\n ),\n)\nCardHeader.displayName = 'CardHeader'\n\nexport const CardTitle = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n ),\n)\nCardTitle.displayName = 'CardTitle'\n\nexport const CardDescription = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n ),\n)\nCardDescription.displayName = 'CardDescription'\n\nexport const CardContent = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('p-6 pt-0', className)} {...props} />\n ),\n)\nCardContent.displayName = 'CardContent'\n\nexport const CardFooter = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('flex items-center p-6 pt-0', className)} {...props} />\n ),\n)\nCardFooter.displayName = 'CardFooter'\n","'use client'\n\n/**\n * Chart primitives for dashboard widgets.\n *\n * Vendored from shadcn/ui chart component (Recharts under the hood).\n * Provides ChartContainer (responsive wrapper), ChartTooltip, ChartTooltipContent.\n *\n * Usage: import Recharts components directly (Bar, BarChart, XAxis, etc.)\n * and wrap them in ChartContainer with a ChartConfig for theming.\n *\n * Security: ChartContainer's `id` prop and ChartConfig keys/colors are\n * inlined into a `<style dangerouslySetInnerHTML>` block to publish per-chart\n * CSS variables. Inputs that don't match the strict allowlists below are\n * silently dropped — DO NOT pass user-controllable strings as `id`, config\n * keys, or color values without validating upstream first.\n */\n\nimport * as React from 'react'\nimport type { TooltipValueType } from 'recharts'\nimport * as RechartsPrimitive from 'recharts'\n\nimport { cn } from './lib/cn'\n\n// Format: { THEME_NAME: CSS_SELECTOR }\nconst THEMES = { light: '', dark: '.dark' } as const\n\nconst INITIAL_DIMENSION = { width: 320, height: 200 } as const\ntype TooltipNameType = number | string\n\n/**\n * Allowlist for chart id prop and ChartConfig keys.\n * Inlined into both the [data-chart=...] attribute selector and the\n * --color-{key} CSS custom property name; deny anything that could break\n * out of the selector or property declaration.\n */\nconst SAFE_CHART_ID_OR_KEY = /^[a-zA-Z0-9_-]+$/\n\n/**\n * Allowlist for ChartConfig color values.\n * Permits hex/rgb/hsl/oklch/var()/keyword colors; denies `;`, `{`, `}`, `<`, `>`, `\"`, `\\`\n * and other characters that would let a value escape the rule body.\n */\nconst SAFE_CSS_COLOR_VALUE = /^[#a-zA-Z0-9 ,.()/%-]+$/\n\n/**\n * Bare `url(...)` values are also rejected — even though the per-chart custom\n * property is inert at the declaration site, it leaks into the cascade and is\n * fetched by any downstream rule that uses `var(--color-key)` in\n * `background-image` / `mask-image` / `cursor` / `border-image` / etc. That's\n * the fetch-on-attribute-selector exfil class the audit calls out, just laundered\n * through a custom property. `var()` is the consumer-intended escape hatch — it\n * doesn't trigger a network fetch on its own.\n */\nconst FORBIDDEN_COLOR_FUNCTION = /\\burl\\s*\\(/i\n\nexport type ChartConfig = Record<\n string,\n {\n label?: React.ReactNode\n icon?: React.ComponentType\n } & (\n | { color?: string; theme?: never }\n | { color?: never; theme: Record<keyof typeof THEMES, string> }\n )\n>\n\ntype ChartContextProps = {\n config: ChartConfig\n}\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null)\n\nfunction useChart() {\n const context = React.useContext(ChartContext)\n\n if (!context) {\n throw new Error('useChart must be used within a <ChartContainer />')\n }\n\n return context\n}\n\n/**\n * Build the per-chart CSS rules emitted by `<ChartStyle>`.\n *\n * Returns `null` if there is nothing to emit. Drops individual config\n * entries whose key fails {@link SAFE_CHART_ID_OR_KEY} or whose color\n * value fails {@link SAFE_CSS_COLOR_VALUE} — silently, since those values\n * being present means a consumer is forwarding untrusted input.\n *\n * Exported for unit tests; not part of the package public API.\n */\nexport function buildChartCss(id: string, config: ChartConfig): string | null {\n if (!SAFE_CHART_ID_OR_KEY.test(id)) {\n return null\n }\n\n const colorConfig = Object.entries(config).filter(([, value]) => value.theme ?? value.color)\n if (!colorConfig.length) {\n return null\n }\n\n const blocks = Object.entries(THEMES)\n .map(([theme, prefix]) => {\n const lines = colorConfig\n .map(([key, itemConfig]) => {\n if (!SAFE_CHART_ID_OR_KEY.test(key)) {\n return null\n }\n const color =\n itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ?? itemConfig.color\n if (!color || !SAFE_CSS_COLOR_VALUE.test(color) || FORBIDDEN_COLOR_FUNCTION.test(color)) {\n return null\n }\n return ` --color-${key}: ${color};`\n })\n .filter((line): line is string => line !== null)\n\n if (!lines.length) {\n return null\n }\n return `${prefix} [data-chart=${id}] {\\n${lines.join('\\n')}\\n}`\n })\n .filter((block): block is string => block !== null)\n\n return blocks.length ? blocks.join('\\n') : null\n}\n\n/**\n * Recharts' `Payload.payload` is typed `any`, which cascades through\n * the indicator color resolution. Narrow once here so callers stay typed.\n */\nfunction getPayloadFill(payload: unknown): string | undefined {\n if (\n payload &&\n typeof payload === 'object' &&\n 'fill' in payload &&\n typeof (payload as { fill: unknown }).fill === 'string'\n ) {\n return (payload as { fill: string }).fill\n }\n return undefined\n}\n\nfunction ChartContainer({\n id,\n className,\n children,\n config,\n initialDimension = INITIAL_DIMENSION,\n nonce,\n ...props\n}: React.ComponentProps<'div'> & {\n config: ChartConfig\n children: React.ComponentProps<typeof RechartsPrimitive.ResponsiveContainer>['children']\n initialDimension?: {\n width: number\n height: number\n }\n /** CSP nonce forwarded to the inline `<style>` element. */\n nonce?: string\n}) {\n const uniqueId = React.useId()\n const safeProvidedId = id && SAFE_CHART_ID_OR_KEY.test(id) ? id : null\n const chartId = `chart-${safeProvidedId ?? uniqueId.replace(/:/g, '')}`\n\n return (\n <ChartContext.Provider value={{ config }}>\n <div\n data-slot=\"chart\"\n data-chart={chartId}\n className={cn(\n \"flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden\",\n className,\n )}\n {...props}\n >\n <ChartStyle id={chartId} config={config} nonce={nonce} />\n <RechartsPrimitive.ResponsiveContainer initialDimension={initialDimension}>\n {children}\n </RechartsPrimitive.ResponsiveContainer>\n </div>\n </ChartContext.Provider>\n )\n}\n\nconst ChartStyle = ({\n id,\n config,\n nonce,\n}: {\n id: string\n config: ChartConfig\n nonce?: string | undefined\n}) => {\n const css = buildChartCss(id, config)\n if (!css) {\n return null\n }\n\n return (\n // biome-ignore lint/security/noDangerouslySetInnerHtml: id/keys/colors validated by buildChartCss against SAFE_CHART_ID_OR_KEY + SAFE_CSS_COLOR_VALUE allowlists.\n <style nonce={nonce} dangerouslySetInnerHTML={{ __html: css }} />\n )\n}\n\nconst ChartTooltip = RechartsPrimitive.Tooltip\n\nfunction ChartTooltipContent({\n active,\n payload,\n className,\n indicator = 'dot',\n hideLabel = false,\n hideIndicator = false,\n label,\n labelFormatter,\n labelClassName,\n formatter,\n color,\n nameKey,\n labelKey,\n}: React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n React.ComponentProps<'div'> & {\n hideLabel?: boolean\n hideIndicator?: boolean\n indicator?: 'line' | 'dot' | 'dashed'\n nameKey?: string\n labelKey?: string\n } & Omit<\n RechartsPrimitive.DefaultTooltipContentProps<TooltipValueType, TooltipNameType>,\n 'accessibilityLayer'\n >) {\n const { config } = useChart()\n\n const tooltipLabel = React.useMemo(() => {\n if (hideLabel || !payload?.length) {\n return null\n }\n\n const [item] = payload\n const key = `${labelKey ?? item?.dataKey ?? item?.name ?? 'value'}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n const value =\n !labelKey && typeof label === 'string' ? (config[label]?.label ?? label) : itemConfig?.label\n\n if (labelFormatter) {\n return (\n <div className={cn('font-medium', labelClassName)}>{labelFormatter(value, payload)}</div>\n )\n }\n\n if (!value) {\n return null\n }\n\n return <div className={cn('font-medium', labelClassName)}>{value}</div>\n }, [label, labelFormatter, payload, hideLabel, labelClassName, config, labelKey])\n\n if (!active || !payload?.length) {\n return null\n }\n\n const nestLabel = payload.length === 1 && indicator !== 'dot'\n\n return (\n <div\n className={cn(\n 'grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl',\n className,\n )}\n >\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload\n .filter((item) => item.type !== 'none')\n .map((item, index) => {\n const lookupKey = `${nameKey ?? item.name ?? item.dataKey ?? 'value'}`\n const itemConfig = getPayloadConfigFromPayload(config, item, lookupKey)\n const indicatorColor = color ?? getPayloadFill(item.payload) ?? item.color\n\n return (\n <div\n key={lookupKey}\n className={cn(\n 'flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground',\n indicator === 'dot' && 'items-center',\n )}\n >\n {formatter && item?.value !== undefined && item.name ? (\n formatter(item.value, item.name, item, index, item.payload)\n ) : (\n <>\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn(\n 'shrink-0 rounded-[2px] border-(--color-border) bg-(--color-bg)',\n {\n 'h-2.5 w-2.5': indicator === 'dot',\n 'w-1': indicator === 'line',\n 'w-0 border-[1.5px] border-dashed bg-transparent':\n indicator === 'dashed',\n 'my-0.5': nestLabel && indicator === 'dashed',\n },\n )}\n style={\n {\n '--color-bg': indicatorColor,\n '--color-border': indicatorColor,\n } as React.CSSProperties\n }\n />\n )\n )}\n <div\n className={cn(\n 'flex flex-1 justify-between leading-none',\n nestLabel ? 'items-end' : 'items-center',\n )}\n >\n <div className=\"grid gap-1.5\">\n {nestLabel ? tooltipLabel : null}\n <span className=\"text-muted-foreground\">\n {itemConfig?.label ?? item.name}\n </span>\n </div>\n {item.value != null && (\n <span className=\"font-mono font-medium text-foreground tabular-nums\">\n {typeof item.value === 'number'\n ? item.value.toLocaleString()\n : String(item.value)}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n\nfunction getPayloadConfigFromPayload(config: ChartConfig, payload: unknown, key: string) {\n if (typeof payload !== 'object' || payload === null) {\n return undefined\n }\n\n const payloadPayload =\n 'payload' in payload && typeof payload.payload === 'object' && payload.payload !== null\n ? payload.payload\n : undefined\n\n let configLabelKey: string = key\n\n if (key in payload && typeof payload[key as keyof typeof payload] === 'string') {\n configLabelKey = payload[key as keyof typeof payload] as string\n } else if (\n payloadPayload &&\n key in payloadPayload &&\n typeof payloadPayload[key as keyof typeof payloadPayload] === 'string'\n ) {\n configLabelKey = payloadPayload[key as keyof typeof payloadPayload] as string\n }\n\n return configLabelKey in config ? config[configLabelKey] : config[key]\n}\n\nexport { ChartContainer, ChartTooltip, ChartTooltipContent }\n","import * as CheckboxPrimitive from '@radix-ui/react-checkbox'\nimport { Check } from 'lucide-react'\nimport { type ComponentPropsWithoutRef, forwardRef } from 'react'\nimport { cn } from './lib/cn'\n\nexport const Checkbox = forwardRef<\n HTMLButtonElement,\n ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n 'peer h-4 w-4 shrink-0 rounded-sm border border-primary shadow-xs',\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground',\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator className=\"flex items-center justify-center text-current\">\n <Check className=\"h-3.5 w-3.5\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n))\n\nCheckbox.displayName = 'Checkbox'\n","import * as CollapsiblePrimitive from '@radix-ui/react-collapsible'\n\n/**\n * Collapsible primitive (Radix). Used by the admin sidebar to fold nav groups\n * away (plan/config phase 03 §9). Controlled via `open` / `onOpenChange`, or\n * uncontrolled via `defaultOpen`.\n *\n * Minimal re-export (shadcn convention) — the consumer styles the trigger and\n * content. `CollapsibleContent` exposes the `--radix-collapsible-content-height`\n * CSS var for height-animated reveals when the consumer opts in.\n */\nexport const Collapsible = CollapsiblePrimitive.Root\nexport const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger\nexport const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent\n","import { forwardRef, type InputHTMLAttributes } from 'react'\nimport { cn } from './lib/cn'\n\nexport const Input = forwardRef<HTMLInputElement, InputHTMLAttributes<HTMLInputElement>>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n ref={ref}\n className={cn(\n 'flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-xs',\n 'transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground',\n 'placeholder:text-muted-foreground',\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n )\n },\n)\n\nInput.displayName = 'Input'\n","import {\n forwardRef,\n type HTMLAttributes,\n type TdHTMLAttributes,\n type ThHTMLAttributes,\n} from 'react'\nimport { cn } from './lib/cn'\n\nexport const Table = forwardRef<HTMLTableElement, HTMLAttributes<HTMLTableElement>>(\n ({ className, ...props }, ref) => (\n <div className=\"relative w-full overflow-auto\">\n <table ref={ref} className={cn('w-full caption-bottom text-sm', className)} {...props} />\n </div>\n ),\n)\nTable.displayName = 'Table'\n\nexport const TableHeader = forwardRef<\n HTMLTableSectionElement,\n HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <thead ref={ref} className={cn('[&_tr]:border-b', className)} {...props} />\n))\nTableHeader.displayName = 'TableHeader'\n\nexport const TableBody = forwardRef<\n HTMLTableSectionElement,\n HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tbody ref={ref} className={cn('[&_tr:last-child]:border-0', className)} {...props} />\n))\nTableBody.displayName = 'TableBody'\n\nexport const TableFooter = forwardRef<\n HTMLTableSectionElement,\n HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn('border-t bg-muted/50 font-medium [&>tr]:last:border-b-0', className)}\n {...props}\n />\n))\nTableFooter.displayName = 'TableFooter'\n\nexport const TableRow = forwardRef<HTMLTableRowElement, HTMLAttributes<HTMLTableRowElement>>(\n ({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n 'border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted',\n className,\n )}\n {...props}\n />\n ),\n)\nTableRow.displayName = 'TableRow'\n\nexport const TableHead = forwardRef<HTMLTableCellElement, ThHTMLAttributes<HTMLTableCellElement>>(\n ({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n 'h-10 px-2 text-left align-middle font-medium text-muted-foreground',\n '[&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]',\n className,\n )}\n {...props}\n />\n ),\n)\nTableHead.displayName = 'TableHead'\n\nexport const TableCell = forwardRef<HTMLTableCellElement, TdHTMLAttributes<HTMLTableCellElement>>(\n ({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(\n 'p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]',\n className,\n )}\n {...props}\n />\n ),\n)\nTableCell.displayName = 'TableCell'\n\nexport const TableCaption = forwardRef<\n HTMLTableCaptionElement,\n HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption ref={ref} className={cn('mt-4 text-sm text-muted-foreground', className)} {...props} />\n))\nTableCaption.displayName = 'TableCaption'\n","import type { Table } from '@tanstack/react-table'\nimport { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from 'lucide-react'\nimport { Button } from '../button'\nimport { cn } from '../lib/cn'\n\ninterface DataTablePaginationProps<TData> {\n table: Table<TData>\n className?: string | undefined\n}\n\nexport function DataTablePagination<TData>({ table, className }: DataTablePaginationProps<TData>) {\n const selectedCount = table.getFilteredSelectedRowModel().rows.length\n const totalCount = table.getFilteredRowModel().rows.length\n\n return (\n <div className={cn('flex items-center justify-between px-2', className)}>\n <div className=\"flex-1 text-sm text-muted-foreground\">\n {selectedCount > 0 && (\n <span>\n {selectedCount} of {totalCount} row(s) selected\n </span>\n )}\n </div>\n <div className=\"flex items-center space-x-6 lg:space-x-8\">\n <div className=\"flex items-center space-x-2\">\n <p className=\"text-sm font-medium\">\n Page {table.getState().pagination.pageIndex + 1} of {table.getPageCount()}\n </p>\n </div>\n <div className=\"flex items-center space-x-2\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"hidden h-8 w-8 lg:flex\"\n onClick={() => table.setPageIndex(0)}\n disabled={!table.getCanPreviousPage()}\n >\n <span className=\"sr-only\">Go to first page</span>\n <ChevronsLeft className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n >\n <span className=\"sr-only\">Go to previous page</span>\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n >\n <span className=\"sr-only\">Go to next page</span>\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"hidden h-8 w-8 lg:flex\"\n onClick={() => table.setPageIndex(table.getPageCount() - 1)}\n disabled={!table.getCanNextPage()}\n >\n <span className=\"sr-only\">Go to last page</span>\n <ChevronsRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </div>\n )\n}\n","import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\nimport { Check, ChevronRight } from 'lucide-react'\nimport { type ComponentPropsWithoutRef, forwardRef, type HTMLAttributes } from 'react'\nimport { cn } from './lib/cn'\n\nexport const DropdownMenu = DropdownMenuPrimitive.Root\nexport const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\nexport const DropdownMenuGroup = DropdownMenuPrimitive.Group\nexport const DropdownMenuPortal = DropdownMenuPrimitive.Portal\nexport const DropdownMenuSub = DropdownMenuPrimitive.Sub\n\nexport const DropdownMenuContent = forwardRef<\n HTMLDivElement,\n ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n 'data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2',\n 'data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownMenuContent.displayName = 'DropdownMenuContent'\n\nexport const DropdownMenuItem = forwardRef<\n HTMLDivElement,\n ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & { inset?: boolean }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none',\n 'transition-colors focus:bg-accent focus:text-accent-foreground',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n '[&_svg]:pointer-events-none [&_svg]:shrink-0',\n inset && 'pl-8',\n className,\n )}\n {...props}\n />\n))\nDropdownMenuItem.displayName = 'DropdownMenuItem'\n\nexport const DropdownMenuCheckboxItem = forwardRef<\n HTMLDivElement,\n ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none',\n 'transition-colors focus:bg-accent focus:text-accent-foreground',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n {...(checked !== undefined && { checked })}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownMenuCheckboxItem.displayName = 'DropdownMenuCheckboxItem'\n\nexport const DropdownMenuLabel = forwardRef<\n HTMLDivElement,\n ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & { inset?: boolean }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn('px-2 py-1.5 text-sm font-semibold', inset && 'pl-8', className)}\n {...props}\n />\n))\nDropdownMenuLabel.displayName = 'DropdownMenuLabel'\n\nexport const DropdownMenuSeparator = forwardRef<\n HTMLDivElement,\n ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-muted', className)}\n {...props}\n />\n))\nDropdownMenuSeparator.displayName = 'DropdownMenuSeparator'\n\nexport const DropdownMenuSubTrigger = forwardRef<\n HTMLDivElement,\n ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & { inset?: boolean }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n 'flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none',\n 'focus:bg-accent data-[state=open]:bg-accent',\n '[&_svg]:pointer-events-none [&_svg]:shrink-0',\n inset && 'pl-8',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto h-4 w-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownMenuSubTrigger.displayName = 'DropdownMenuSubTrigger'\n\nexport const DropdownMenuSubContent = forwardRef<\n HTMLDivElement,\n ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n 'data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2',\n 'data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n))\nDropdownMenuSubContent.displayName = 'DropdownMenuSubContent'\n\nexport function DropdownMenuShortcut({ className, ...props }: HTMLAttributes<HTMLSpanElement>) {\n return <span className={cn('ml-auto text-xs tracking-widest opacity-60', className)} {...props} />\n}\n","import type { Table } from '@tanstack/react-table'\nimport { Settings2 } from 'lucide-react'\nimport { Button } from '../button'\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../dropdown-menu'\n\ninterface DataTableViewOptionsProps<TData> {\n table: Table<TData>\n}\n\nexport function DataTableViewOptions<TData>({ table }: DataTableViewOptionsProps<TData>) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"ml-auto hidden h-8 lg:flex\">\n <Settings2 className=\"mr-2 h-4 w-4\" />\n View\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-[150px]\">\n <DropdownMenuLabel>Toggle columns</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {table\n .getAllColumns()\n .filter((column) => typeof column.accessorFn !== 'undefined' && column.getCanHide())\n .map((column) => (\n <DropdownMenuCheckboxItem\n key={column.id}\n className=\"capitalize\"\n checked={column.getIsVisible()}\n onCheckedChange={(value) => column.toggleVisibility(!!value)}\n >\n {column.id}\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","import {\n type ColumnDef,\n type ColumnFiltersState,\n flexRender,\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n type RowSelectionState,\n type SortingState,\n useReactTable,\n type VisibilityState,\n} from '@tanstack/react-table'\nimport { useState } from 'react'\nimport { Input } from '../input'\nimport { cn } from '../lib/cn'\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../table'\nimport { DataTablePagination } from './data-table-pagination'\nimport { DataTableViewOptions } from './data-table-view-options'\n\nexport interface DataTableClassNames {\n root?: string\n toolbar?: string\n table?: string\n pagination?: string\n}\n\nexport interface DataTableProps<TData, TValue> {\n columns: ColumnDef<TData, TValue>[]\n data: TData[]\n searchKey?: string\n searchPlaceholder?: string\n pageSize?: number\n emptyMessage?: string\n classNames?: DataTableClassNames\n}\n\nexport function DataTable<TData, TValue>({\n columns,\n data,\n searchKey,\n searchPlaceholder = 'Filter...',\n pageSize = 10,\n emptyMessage = 'No results.',\n classNames,\n}: DataTableProps<TData, TValue>) {\n const [sorting, setSorting] = useState<SortingState>([])\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([])\n const [columnVisibility, setColumnVisibility] = useState<VisibilityState>({})\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({})\n\n const table = useReactTable({\n data,\n columns,\n state: { sorting, columnFilters, columnVisibility, rowSelection },\n onSortingChange: setSorting,\n onColumnFiltersChange: setColumnFilters,\n onColumnVisibilityChange: setColumnVisibility,\n onRowSelectionChange: setRowSelection,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n initialState: { pagination: { pageSize } },\n })\n\n return (\n <div className={cn('space-y-4', classNames?.root)}>\n {/* Toolbar */}\n <div className={cn('flex items-center justify-between', classNames?.toolbar)}>\n <div className=\"flex flex-1 items-center space-x-2\">\n {searchKey && (\n <Input\n placeholder={searchPlaceholder}\n value={(table.getColumn(searchKey)?.getFilterValue() as string) ?? ''}\n onChange={(event) => table.getColumn(searchKey)?.setFilterValue(event.target.value)}\n className=\"h-8 w-[150px] lg:w-[250px]\"\n />\n )}\n </div>\n <DataTableViewOptions table={table} />\n </div>\n\n {/* Table */}\n <div className={cn('rounded-md border', classNames?.table)}>\n <Table>\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <TableHead key={header.id} colSpan={header.colSpan}>\n {header.isPlaceholder\n ? null\n : flexRender(header.column.columnDef.header, header.getContext())}\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {table.getRowModel().rows.length > 0 ? (\n table.getRowModel().rows.map((row) => (\n <TableRow key={row.id} data-state={row.getIsSelected() && 'selected'}>\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : (\n <TableRow>\n <TableCell colSpan={columns.length} className=\"h-24 text-center\">\n {emptyMessage}\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </div>\n\n {/* Pagination */}\n <DataTablePagination table={table} className={classNames?.pagination} />\n </div>\n )\n}\n","import type { Column } from '@tanstack/react-table'\nimport { ArrowDown, ArrowUp, ChevronsUpDown, EyeOff } from 'lucide-react'\nimport { Button } from '../button'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../dropdown-menu'\nimport { cn } from '../lib/cn'\n\ninterface DataTableColumnHeaderProps<TData, TValue> {\n column: Column<TData, TValue>\n title: string\n className?: string\n}\n\nexport function DataTableColumnHeader<TData, TValue>({\n column,\n title,\n className,\n}: DataTableColumnHeaderProps<TData, TValue>) {\n if (!column.getCanSort()) {\n return <div className={cn(className)}>{title}</div>\n }\n\n return (\n <div className={cn('flex items-center space-x-2', className)}>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\" className=\"-ml-3 h-8 data-[state=open]:bg-accent\">\n <span>{title}</span>\n {column.getIsSorted() === 'desc' ? (\n <ArrowDown className=\"ml-2 h-4 w-4\" />\n ) : column.getIsSorted() === 'asc' ? (\n <ArrowUp className=\"ml-2 h-4 w-4\" />\n ) : (\n <ChevronsUpDown className=\"ml-2 h-4 w-4\" />\n )}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n <DropdownMenuItem onClick={() => column.toggleSorting(false)}>\n <ArrowUp className=\"mr-2 h-3.5 w-3.5 text-muted-foreground/70\" />\n Asc\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => column.toggleSorting(true)}>\n <ArrowDown className=\"mr-2 h-3.5 w-3.5 text-muted-foreground/70\" />\n Desc\n </DropdownMenuItem>\n {column.getCanHide() && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => column.toggleVisibility(false)}>\n <EyeOff className=\"mr-2 h-3.5 w-3.5 text-muted-foreground/70\" />\n Hide\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n )\n}\n","import * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { X } from 'lucide-react'\nimport { type ComponentPropsWithoutRef, forwardRef, type HTMLAttributes } from 'react'\nimport { cn } from './lib/cn'\n\nexport const Dialog = DialogPrimitive.Root\nexport const DialogTrigger = DialogPrimitive.Trigger\nexport const DialogClose = DialogPrimitive.Close\nexport const DialogPortal = DialogPrimitive.Portal\n\nexport const DialogOverlay = forwardRef<\n HTMLDivElement,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fixed inset-0 z-50 bg-black/80',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className,\n )}\n {...props}\n />\n))\nDialogOverlay.displayName = 'DialogOverlay'\n\nexport const DialogContent = forwardRef<\n HTMLDivElement,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%]',\n 'gap-4 border bg-background p-6 shadow-lg sm:rounded-lg',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n 'data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%]',\n 'data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]',\n className,\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close\n className={cn(\n 'absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity',\n 'hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n 'disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground',\n 'cursor-pointer',\n )}\n >\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n))\nDialogContent.displayName = 'DialogContent'\n\nexport function DialogHeader({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn('flex flex-col space-y-1.5 text-center sm:text-left', className)}\n {...props}\n />\n )\n}\n\nexport function DialogFooter({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className)}\n {...props}\n />\n )\n}\n\nexport const DialogTitle = forwardRef<\n HTMLHeadingElement,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn('text-lg font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n))\nDialogTitle.displayName = 'DialogTitle'\n\nexport const DialogDescription = forwardRef<\n HTMLParagraphElement,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n))\nDialogDescription.displayName = 'DialogDescription'\n","import * as LabelPrimitive from '@radix-ui/react-label'\nimport { type ComponentPropsWithoutRef, forwardRef } from 'react'\nimport { cn } from './lib/cn'\n\nexport const Label = forwardRef<\n HTMLLabelElement,\n ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(\n 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70',\n className,\n )}\n {...props}\n />\n))\n\nLabel.displayName = 'Label'\n","import type * as LabelPrimitive from '@radix-ui/react-label'\nimport { Slot } from '@radix-ui/react-slot'\nimport {\n type ComponentPropsWithoutRef,\n createContext,\n forwardRef,\n type HTMLAttributes,\n useContext,\n useId,\n} from 'react'\nimport {\n Controller,\n type ControllerProps,\n type FieldPath,\n type FieldValues,\n FormProvider,\n useFormContext,\n} from 'react-hook-form'\nimport { Label } from './label'\nimport { cn } from './lib/cn'\n\n/* ---------- Form (re-export of FormProvider) ---------- */\n\n// rolldown-plugin-dts 0.25.x (PR #243 \"Preserve external import types\")\n// flagged TS2742 on a bare `export const Form = FormProvider`: the inferred\n// type of `Form` indirectly references `@types/react` via react-hook-form's\n// generics, and the bundler can't construct a portable type alias without an\n// explicit annotation. Pinning the type to `typeof FormProvider` is the\n// react-hook-form-recommended fix (see hook-form examples) and identical at\n// the value level.\nexport const Form: typeof FormProvider = FormProvider\n\n/* ---------- FormField context ---------- */\n\ninterface FormFieldContextValue<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> {\n name: TName\n}\n\nconst FormFieldContext = createContext<FormFieldContextValue>({} as FormFieldContextValue)\n\nexport function FormField<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>(props: ControllerProps<TFieldValues, TName>) {\n return (\n <FormFieldContext.Provider value={{ name: props.name }}>\n <Controller {...props} />\n </FormFieldContext.Provider>\n )\n}\n\n/* ---------- FormItem context ---------- */\n\ninterface FormItemContextValue {\n id: string\n}\n\nconst FormItemContext = createContext<FormItemContextValue>({} as FormItemContextValue)\n\n/* ---------- useFormField hook ---------- */\n\nexport function useFormField() {\n const fieldContext = useContext(FormFieldContext)\n const itemContext = useContext(FormItemContext)\n const { getFieldState, formState } = useFormContext()\n\n const fieldState = getFieldState(fieldContext.name, formState)\n\n const { id } = itemContext\n\n return {\n id,\n name: fieldContext.name,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n ...fieldState,\n }\n}\n\n/* ---------- FormItem ---------- */\n\nexport const FormItem = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => {\n const id = useId()\n return (\n <FormItemContext.Provider value={{ id }}>\n <div ref={ref} className={cn('space-y-2', className)} {...props} />\n </FormItemContext.Provider>\n )\n },\n)\nFormItem.displayName = 'FormItem'\n\n/* ---------- FormLabel ---------- */\n\nexport const FormLabel = forwardRef<\n HTMLLabelElement,\n ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\n>(({ className, ...props }, ref) => {\n const { error, formItemId } = useFormField()\n return (\n <Label\n ref={ref}\n className={cn(error && 'text-destructive', className)}\n htmlFor={formItemId}\n {...props}\n />\n )\n})\nFormLabel.displayName = 'FormLabel'\n\n/* ---------- FormControl ---------- */\n\nexport const FormControl = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<typeof Slot>>(\n ({ ...props }, ref) => {\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField()\n return (\n <Slot\n ref={ref}\n id={formItemId}\n aria-describedby={!error ? formDescriptionId : `${formDescriptionId} ${formMessageId}`}\n aria-invalid={!!error}\n {...props}\n />\n )\n },\n)\nFormControl.displayName = 'FormControl'\n\n/* ---------- FormDescription ---------- */\n\nexport const FormDescription = forwardRef<\n HTMLParagraphElement,\n HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => {\n const { formDescriptionId } = useFormField()\n return (\n <p\n ref={ref}\n id={formDescriptionId}\n className={cn('text-[0.8rem] text-muted-foreground', className)}\n {...props}\n />\n )\n})\nFormDescription.displayName = 'FormDescription'\n\n/* ---------- FormMessage ---------- */\n\nexport const FormMessage = forwardRef<HTMLParagraphElement, HTMLAttributes<HTMLParagraphElement>>(\n ({ className, children, ...props }, ref) => {\n const { error, formMessageId } = useFormField()\n const body = error ? String(error.message) : children\n\n if (!body) return null\n\n return (\n <p\n ref={ref}\n id={formMessageId}\n className={cn('text-[0.8rem] font-medium text-destructive', className)}\n {...props}\n >\n {body}\n </p>\n )\n },\n)\nFormMessage.displayName = 'FormMessage'\n","'use client'\n\n/**\n * `<Icon name>` — render a Lucide icon by kebab-case name, fetched **on demand**\n * as SVG data from the toolkit's icon endpoint (plan/config SD003).\n *\n * The client ships **zero icon code**: each icon's `<svg>` is fetched once from\n * `GET {endpoint}/{name}`, cached in-memory (shared across all `<Icon>`s) and by\n * the browser (`immutable`), then inlined so it inherits `currentColor` for\n * theming. Unknown/empty names render nothing. This replaces the crash-prone\n * `lucide-react/dynamic` approach (1500 lazy chunks crawled the library under\n * Turbopack — lucide #1576).\n *\n * Endpoint defaults to `/api/admin/icons` (the toolkit's admin API base). Apps\n * that mount the admin API elsewhere call {@link setIconEndpoint} once at boot.\n */\n\nimport { useEffect, useMemo, useRef, useState } from 'react'\n\nlet endpoint = '/api/admin/icons'\n\n/** Override the icon endpoint base (default `/api/admin/icons`). Call once at app boot. */\nexport function setIconEndpoint(base: string): void {\n const next = base.replace(/\\/+$/, '')\n if (next !== endpoint) {\n endpoint = next\n // Drop everything fetched from the previous backend — otherwise stale SVGs /\n // name lists from the old endpoint keep serving after the switch.\n cache.clear()\n namesPromise = null\n }\n}\n\n// Shared cache: name → svg string | null (known-missing) | in-flight Promise.\nconst cache = new Map<string, string | null | Promise<string | null>>()\n\n/**\n * Abort an icon request that stalls. Without this, a hung connection leaves the\n * in-flight `Promise` in the cache forever — the icon (or up to a whole batch of\n * them) never renders AND never retries. On abort the fetch rejects, so callers'\n * existing `.catch` clears the cache entry and the next render retries.\n */\nconst FETCH_TIMEOUT_MS = 10_000\nfunction fetchWithTimeout(url: string): Promise<Response> {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS)\n return fetch(url, { signal: controller.signal }).finally(() => clearTimeout(timer))\n}\n\n/** Fetch + cache one icon's SVG (dedupes concurrent requests for the same name). */\nfunction fetchIconSvg(name: string): Promise<string | null> {\n const hit = cache.get(name)\n if (hit instanceof Promise) return hit\n if (hit !== undefined) return Promise.resolve(hit)\n const p = fetchWithTimeout(`${endpoint}/${encodeURIComponent(name)}`)\n .then(async (r) => {\n if (r.ok) {\n const svg = await r.text()\n cache.set(name, svg)\n return svg\n }\n // 404 = the icon genuinely doesn't exist → cache the miss so we don't refetch.\n // A transient failure (e.g. the route's 503 when icon data is briefly\n // unavailable) must NOT be cached as a permanent miss — otherwise one outage\n // blanks the icon for the rest of the session. Drop it so the next render retries.\n if (r.status === 404) cache.set(name, null)\n else cache.delete(name)\n return null\n })\n .catch(() => {\n // Network error — transient. Clear the in-flight entry so a retry can happen.\n cache.delete(name)\n return null\n })\n cache.set(name, p)\n return p\n}\n\n/**\n * Max icon names per batch request. MUST stay `<=` the server's batch cap\n * (`MAX_BATCH` in `@murumets-ee/admin-ui`'s `icon-routes.ts`) — a request larger\n * than the server cap is truncated, so the dropped names would be absent from the\n * response and get cached as permanent misses (blank forever). Larger sets are\n * split across multiple requests instead.\n */\nconst ICON_BATCH_MAX = 128\n\n/** Fetch one chunk (`<= ICON_BATCH_MAX` names) in a single request + seed the cache. */\nfunction prewarmChunk(chunk: readonly string[]): Promise<void> {\n // `null` sentinel = a successful response we can read a name→svg map from;\n // a rejected/failed fetch resolves the outer promise to `null` so we DON'T\n // cache a permanent miss (mirrors fetchIconSvg's transient-vs-404 handling).\n const batch: Promise<Record<string, string> | null> = fetchWithTimeout(\n `${endpoint}?names=${encodeURIComponent(chunk.join(','))}`,\n )\n .then((r) => (r.ok ? (r.json() as Promise<Record<string, string>>) : null))\n .catch(() => null)\n for (const name of chunk) {\n const p = batch.then((map) => {\n if (map === null) {\n // Transient failure — drop the in-flight entry so a later render retries\n // instead of blanking the icon for the rest of the session.\n cache.delete(name)\n return null\n }\n const svg = map[name]\n // Present → cache the SVG. Absent from the batch → a genuine miss; cache\n // `null` so the icon renders nothing without firing its own follow-up fetch.\n const val = typeof svg === 'string' ? svg : null\n cache.set(name, val)\n return val\n })\n cache.set(name, p)\n }\n return batch.then(() => undefined)\n}\n\n/**\n * Prewarm the shared cache for many icons in ONE request per {@link ICON_BATCH_MAX}\n * chunk (one request for any set up to the cap).\n *\n * Callers that render many `<Icon>`s at once — the picker grid, the sidebar, the\n * nav editor — MUST call this for their visible set *before those `<Icon>`s mount*,\n * so the set is fetched with a single batched request instead of one request per\n * cell. A grid of N cells each fetching its own SVG fires N same-IP requests in a\n * burst, which WAFs like CrowdSec read as a scan and ban the IP for (and is a\n * self-inflicted DoS). See the \"No Unbounded Fan-Out\" rule in CLAUDE.md.\n *\n * Only names not already cached are requested, so repeat opens/searches don't\n * re-fetch. Each requested name is seeded with a shared in-flight promise\n * synchronously (before the first `await`), so a concurrent per-name\n * {@link fetchIconSvg} (e.g. an `<Icon>` that mounts before this resolves) dedupes\n * onto the same batch request rather than firing its own — and a render-time caller\n * wins the race against its own child `<Icon>` effects.\n */\nexport async function prewarmIcons(names: readonly string[]): Promise<void> {\n // Browser-only. Callers seed this during render, and these are `'use client'`\n // components that Next.js ALSO server-renders on the initial load — where a\n // relative-URL `fetch` has no origin and rejects (\"Failed to parse URL\"). The\n // server render can't use a client cache anyway (the client re-seeds on mount),\n // so skip the wasted, guaranteed-failing request entirely rather than relying on\n // the `.catch` to swallow it.\n if (typeof window === 'undefined') return\n const missing = names.filter((n) => cache.get(n) === undefined)\n if (missing.length === 0) return\n // Split into chunks no larger than the server cap so no request is truncated.\n // Each chunk is ONE request, so this stays bounded — e.g. 300 names → 3 requests,\n // not 300 (the fan-out this exists to prevent). All chunks install their in-flight\n // cache entries synchronously here (before the await), preserving the race-win.\n const chunks: string[][] = []\n for (let i = 0; i < missing.length; i += ICON_BATCH_MAX) {\n chunks.push(missing.slice(i, i + ICON_BATCH_MAX))\n }\n await Promise.all(chunks.map(prewarmChunk))\n}\n\n/**\n * Seed the icon cache for `names` in one batched request DURING render — before the\n * `<Icon>` cells that consume them mount — so those cells dedupe onto the single\n * batch instead of each firing their own request (the fan-out {@link prewarmIcons}\n * exists to prevent). An effect can't do this: child effects run before the\n * parent's, losing the race.\n *\n * Shared by every site that renders many icons at once (picker grid, sidebar, nav\n * editor). A prev-tracker ref fires the seed once per distinct set;\n * {@link prewarmIcons} itself dedupes, no-ops when warm, and is browser-only. Pass\n * `enabled=false` to skip while a set isn't visible yet (e.g. a closed dialog).\n */\nexport function usePrewarmIcons(names: readonly string[], enabled = true): void {\n const seededKeyRef = useRef('')\n const key = names.join(',')\n if (enabled && key && seededKeyRef.current !== key) {\n seededKeyRef.current = key\n void prewarmIcons(names)\n }\n}\n\nlet namesPromise: Promise<readonly string[]> | null = null\n\n/** Fetch the full icon-name list (for pickers). Cached for the session. */\nexport function fetchIconNames(): Promise<readonly string[]> {\n if (!namesPromise) {\n namesPromise = fetch(endpoint)\n .then((r) => (r.ok ? (r.json() as Promise<readonly string[]>) : []))\n .catch(() => [])\n }\n return namesPromise\n}\n\nexport interface IconProps {\n /** Lucide kebab-case name (e.g. `panel-left`). Unknown/empty → renders nothing. */\n name?: string | null | undefined\n /** Sizing class applied to the wrapper (e.g. `h-4 w-4`). The SVG fills it. */\n className?: string | undefined\n /** Explicit pixel size (alternative to `className`). */\n size?: number | undefined\n}\n\nexport function Icon({ name, className, size }: IconProps): React.ReactElement | null {\n // Always start `null` so the server render and the client's FIRST render match\n // (the SVG is client-fetched data the server doesn't have — seeding from the\n // cache here causes a hydration mismatch). The effect populates it immediately\n // on a cache hit, or after the fetch.\n const [svg, setSvg] = useState<string | null>(null)\n\n // External-resource fetch (the sanctioned useEffect use): load the SVG on\n // demand, ignore the result if the name changed / unmounted before it lands.\n useEffect(() => {\n if (!name) {\n setSvg(null)\n return\n }\n const hit = cache.get(name)\n if (typeof hit === 'string' || hit === null) {\n setSvg(hit)\n return\n }\n let active = true\n fetchIconSvg(name).then((s) => {\n if (active) setSvg(s)\n })\n return () => {\n active = false\n }\n }, [name])\n\n // Memoize the dangerouslySetInnerHTML object — a fresh object identity on every\n // render makes React 19 re-apply innerHTML each time (PR #621 gotcha).\n const html = useMemo(() => (svg ? { __html: svg } : null), [svg])\n if (!html) return null\n\n return (\n <span\n className={className}\n style={{\n display: 'inline-flex',\n lineHeight: 0,\n ...(size != null ? { width: size, height: size } : {}),\n }}\n // biome-ignore lint/security/noDangerouslySetInnerHtml: SVG is from our own first-party icon endpoint (lucide data), not user input.\n dangerouslySetInnerHTML={html}\n aria-hidden=\"true\"\n />\n )\n}\n","'use client'\n\n/**\n * `<IconPicker>` — a searchable Lucide icon browser (plan/config SD003).\n *\n * On-demand by construction: the name list is fetched once when the dialog first\n * opens (not per mount — there can be many pickers on a page), search filters the\n * names client-side (just strings), and each visible cell renders `<Icon>`, which\n * fetches that one SVG on demand + caches it. No icon code/data ships in the\n * bundle; opening the picker never loads the whole set.\n *\n * Results are capped ({@link MAX_RESULTS}) so a broad query renders a bounded grid\n * — type to narrow. (Virtualized windowing is a future enhancement; the cap keeps\n * the request count + DOM bounded for v1.)\n */\n\nimport { forwardRef, useEffect, useId, useMemo, useState } from 'react'\nimport { Button } from './button'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from './dialog'\nimport { fetchIconNames, Icon, usePrewarmIcons } from './icon'\nimport { Input } from './input'\nimport { cn } from './lib/cn'\n\nconst MAX_RESULTS = 90\n\nexport interface IconPickerProps {\n /** Current Lucide icon name, or empty. */\n value?: string | null | undefined\n /** Called with the chosen name, or `undefined` when cleared. */\n onChange: (name: string | undefined) => void\n /** Trigger text when no icon is selected. Default \"Pick icon\". */\n placeholder?: string\n /** Extra classes for the trigger button. */\n className?: string\n /** Disable the trigger. */\n disabled?: boolean\n /**\n * a11y props a form wrapper (e.g. shadcn `FormControl`) injects into the\n * trigger so the field stays linked to its label + validation message.\n */\n id?: string\n 'aria-describedby'?: string\n 'aria-invalid'?: React.AriaAttributes['aria-invalid']\n}\n\nexport const IconPicker = forwardRef<HTMLButtonElement, IconPickerProps>(function IconPicker(\n { value, onChange, placeholder = 'Pick icon', className, disabled, id, ...aria },\n ref,\n) {\n const [open, setOpen] = useState(false)\n const [query, setQuery] = useState('')\n const [names, setNames] = useState<readonly string[]>([])\n const [loading, setLoading] = useState(false)\n const searchId = useId()\n\n // Load the name list the first time the dialog opens (cached module-wide, so\n // multiple pickers share one request). Fetch is the sanctioned useEffect use.\n useEffect(() => {\n if (!open || names.length > 0) return\n let active = true\n setLoading(true)\n fetchIconNames().then((list) => {\n if (active) {\n setNames(list)\n setLoading(false)\n }\n })\n return () => {\n active = false\n }\n }, [open, names.length])\n\n const results = useMemo(() => {\n const needle = query.trim().toLowerCase()\n const matches = needle ? names.filter((n) => n.includes(needle)) : names\n return { shown: matches.slice(0, MAX_RESULTS), total: matches.length }\n }, [query, names])\n\n // Fetch the whole visible page in ONE batched request before the grid's `<Icon>`\n // cells mount, so they dedupe onto it instead of each firing their own — the\n // ≤90-cell burst that reads as a scan to WAFs like CrowdSec (the no-fan-out rule).\n // Only while the dialog is open (the grid isn't mounted otherwise).\n usePrewarmIcons(results.shown, open)\n\n const select = (name: string | undefined) => {\n onChange(name)\n setOpen(false)\n setQuery('')\n }\n\n return (\n <>\n {/* Fixed-width icon-only trigger: showing the variable-length icon NAME made\n rows ragged. The icon itself is the affordance; the name lives in the\n dialog + the tooltip. */}\n <Button\n ref={ref}\n id={id}\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n disabled={disabled}\n onClick={() => setOpen(true)}\n title={value ?? placeholder}\n aria-label={value ? `Icon: ${value}` : placeholder}\n className={className}\n {...aria}\n >\n {value ? (\n <Icon name={value} size={16} />\n ) : (\n <span aria-hidden className=\"text-base leading-none text-muted-foreground\">\n +\n </span>\n )}\n </Button>\n\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogContent className=\"max-w-lg\">\n <DialogHeader>\n <DialogTitle>Choose an icon</DialogTitle>\n </DialogHeader>\n {/* Placeholder text is not a reliable accessible name — give the\n search field a real label linked via `searchId`. */}\n <label htmlFor={searchId} className=\"sr-only\">\n Search icons\n </label>\n <Input\n id={searchId}\n autoFocus\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search icons…\"\n />\n <div className=\"grid max-h-72 grid-cols-8 gap-1 overflow-auto p-0.5\">\n <button\n type=\"button\"\n title=\"No icon\"\n aria-label=\"No icon\"\n onClick={() => select(undefined)}\n className={cn(\n 'flex aspect-square items-center justify-center rounded-md border border-border text-[10px] text-muted-foreground hover:bg-accent',\n !value && 'ring-2 ring-ring',\n )}\n >\n none\n </button>\n {results.shown.map((name) => (\n <button\n key={name}\n type=\"button\"\n title={name}\n aria-label={name}\n onClick={() => select(name)}\n className={cn(\n 'flex aspect-square items-center justify-center rounded-md border border-transparent hover:bg-accent hover:border-border',\n name === value && 'ring-2 ring-ring',\n )}\n >\n <Icon name={name} size={18} />\n </button>\n ))}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {loading\n ? 'Loading icons…'\n : query\n ? `${results.total} match${results.total === 1 ? '' : 'es'}${\n results.total > MAX_RESULTS ? ` (showing ${MAX_RESULTS})` : ''\n }`\n : `${names.length} icons — type to search`}\n </div>\n </DialogContent>\n </Dialog>\n </>\n )\n})\n","import { forwardRef, type SelectHTMLAttributes } from 'react'\nimport { cn } from './lib/cn'\n\nexport const Select = forwardRef<HTMLSelectElement, SelectHTMLAttributes<HTMLSelectElement>>(\n ({ className, children, ...props }, ref) => {\n return (\n <select\n ref={ref}\n className={cn(\n 'flex h-9 w-full rounded-md border border-input bg-background text-foreground px-3 py-1 text-sm shadow-xs',\n 'transition-colors',\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n >\n {children}\n </select>\n )\n },\n)\n\nSelect.displayName = 'Select'\n","import * as SeparatorPrimitive from '@radix-ui/react-separator'\nimport { type ComponentPropsWithoutRef, forwardRef } from 'react'\nimport { cn } from './lib/cn'\n\nexport const Separator = forwardRef<\n HTMLDivElement,\n ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(({ className, orientation = 'horizontal', decorative = true, ...props }, ref) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n 'shrink-0 bg-border',\n orientation === 'horizontal' ? 'h-[1px] w-full' : 'h-full w-[1px]',\n className,\n )}\n {...props}\n />\n))\n\nSeparator.displayName = 'Separator'\n","import type { HTMLAttributes } from 'react'\nimport { cn } from './lib/cn'\n\nexport function Skeleton({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('animate-pulse rounded-md bg-muted', className)} {...props} />\n}\n","/**\n * Toast notifications — wraps sonner with toolkit token styling.\n *\n * Usage:\n * import { Toaster, toast } from '@murumets-ee/ui'\n *\n * // In layout (once):\n * <Toaster />\n *\n * // Anywhere:\n * toast.success('Saved')\n * toast.error('Cannot delete: referenced by article')\n *\n * Consumer-provided `toastOptions.style` and `toastOptions.classNames` are\n * deep-merged with the toolkit defaults — overriding `error` doesn't drop\n * the `success` className, and overriding `background` doesn't drop the\n * border / color.\n */\n\nimport type { ComponentProps } from 'react'\nimport { Toaster as SonnerToaster, toast } from 'sonner'\n\nconst DEFAULT_STYLE = {\n background: 'var(--color-background)',\n color: 'var(--color-foreground)',\n border: '1px solid var(--color-border)',\n}\n\nconst DEFAULT_CLASS_NAMES = {\n error: 'sonner-error',\n success: 'sonner-success',\n}\n\nfunction Toaster({ toastOptions, ...props }: ComponentProps<typeof SonnerToaster>) {\n return (\n <SonnerToaster\n position=\"bottom-right\"\n {...props}\n toastOptions={{\n ...toastOptions,\n style: { ...DEFAULT_STYLE, ...toastOptions?.style },\n classNames: { ...DEFAULT_CLASS_NAMES, ...toastOptions?.classNames },\n }}\n />\n )\n}\n\nexport { Toaster, toast }\n","import { forwardRef, type TextareaHTMLAttributes } from 'react'\nimport { cn } from './lib/cn'\n\nexport const Textarea = forwardRef<\n HTMLTextAreaElement,\n TextareaHTMLAttributes<HTMLTextAreaElement>\n>(({ className, ...props }, ref) => {\n return (\n <textarea\n ref={ref}\n className={cn(\n 'flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-xs',\n 'placeholder:text-muted-foreground',\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n )\n})\n\nTextarea.displayName = 'Textarea'\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@murumets-ee/ui",
3
- "version": "0.35.0",
3
+ "version": "0.35.1",
4
4
  "license": "Elastic-2.0",
5
5
  "type": "module",
6
6
  "exports": {