@dirstack/ui 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +67 -0
- package/dist/components/animated-number.d.ts +18 -0
- package/dist/components/animated-number.d.ts.map +1 -0
- package/dist/components/animated-number.js +29 -0
- package/dist/components/animated-number.js.map +1 -0
- package/dist/components/avatar.d.ts +8 -0
- package/dist/components/avatar.d.ts.map +1 -0
- package/dist/components/avatar.js +27 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/badge.d.ts +58 -0
- package/dist/components/badge.d.ts.map +1 -0
- package/dist/components/badge.js +51 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/button.d.ts +63 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/button.js +66 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/callout.d.ts +41 -0
- package/dist/components/callout.d.ts.map +1 -0
- package/dist/components/callout.js +49 -0
- package/dist/components/callout.js.map +1 -0
- package/dist/components/card.d.ts +61 -0
- package/dist/components/card.d.ts.map +1 -0
- package/dist/components/card.js +67 -0
- package/dist/components/card.js.map +1 -0
- package/dist/components/chart.d.ts +32 -0
- package/dist/components/chart.d.ts.map +1 -0
- package/dist/components/chart.js +121 -0
- package/dist/components/chart.js.map +1 -0
- package/dist/components/copy-button.d.ts +22 -0
- package/dist/components/copy-button.d.ts.map +1 -0
- package/dist/components/copy-button.js +50 -0
- package/dist/components/copy-button.js.map +1 -0
- package/dist/components/copy-input.d.ts +13 -0
- package/dist/components/copy-input.d.ts.map +1 -0
- package/dist/components/copy-input.js +28 -0
- package/dist/components/copy-input.js.map +1 -0
- package/dist/components/detail-row.d.ts +93 -0
- package/dist/components/detail-row.d.ts.map +1 -0
- package/dist/components/detail-row.js +69 -0
- package/dist/components/detail-row.js.map +1 -0
- package/dist/components/dialog.d.ts +173 -0
- package/dist/components/dialog.d.ts.map +1 -0
- package/dist/components/dialog.js +139 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/empty-state.d.ts +96 -0
- package/dist/components/empty-state.d.ts.map +1 -0
- package/dist/components/empty-state.js +69 -0
- package/dist/components/empty-state.js.map +1 -0
- package/dist/components/entity-avatar.d.ts +77 -0
- package/dist/components/entity-avatar.d.ts.map +1 -0
- package/dist/components/entity-avatar.js +48 -0
- package/dist/components/entity-avatar.js.map +1 -0
- package/dist/components/form-row.d.ts +35 -0
- package/dist/components/form-row.d.ts.map +1 -0
- package/dist/components/form-row.js +46 -0
- package/dist/components/form-row.js.map +1 -0
- package/dist/components/form-section.d.ts +24 -0
- package/dist/components/form-section.d.ts.map +1 -0
- package/dist/components/form-section.js +39 -0
- package/dist/components/form-section.js.map +1 -0
- package/dist/components/form.d.ts +28 -0
- package/dist/components/form.d.ts.map +1 -0
- package/dist/components/form.js +88 -0
- package/dist/components/form.js.map +1 -0
- package/dist/components/heading.d.ts +44 -0
- package/dist/components/heading.d.ts.map +1 -0
- package/dist/components/heading.js +45 -0
- package/dist/components/heading.js.map +1 -0
- package/dist/components/input.d.ts +55 -0
- package/dist/components/input.d.ts.map +1 -0
- package/dist/components/input.js +33 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/kbd.d.ts +28 -0
- package/dist/components/kbd.d.ts.map +1 -0
- package/dist/components/kbd.js +31 -0
- package/dist/components/kbd.js.map +1 -0
- package/dist/components/label.d.ts +21 -0
- package/dist/components/label.d.ts.map +1 -0
- package/dist/components/label.js +21 -0
- package/dist/components/label.js.map +1 -0
- package/dist/components/menu.d.ts +22 -0
- package/dist/components/menu.d.ts.map +1 -0
- package/dist/components/menu.js +73 -0
- package/dist/components/menu.js.map +1 -0
- package/dist/components/nav-button.d.ts +34 -0
- package/dist/components/nav-button.d.ts.map +1 -0
- package/dist/components/nav-button.js +70 -0
- package/dist/components/nav-button.js.map +1 -0
- package/dist/components/nav.d.ts +44 -0
- package/dist/components/nav.d.ts.map +1 -0
- package/dist/components/nav.js +53 -0
- package/dist/components/nav.js.map +1 -0
- package/dist/components/number-input.d.ts +18 -0
- package/dist/components/number-input.d.ts.map +1 -0
- package/dist/components/number-input.js +25 -0
- package/dist/components/number-input.js.map +1 -0
- package/dist/components/page.d.ts +24 -0
- package/dist/components/page.d.ts.map +1 -0
- package/dist/components/page.js +24 -0
- package/dist/components/page.js.map +1 -0
- package/dist/components/pagination.d.ts +17 -0
- package/dist/components/pagination.d.ts.map +1 -0
- package/dist/components/pagination.js +63 -0
- package/dist/components/pagination.js.map +1 -0
- package/dist/components/popover.d.ts +8 -0
- package/dist/components/popover.d.ts.map +1 -0
- package/dist/components/popover.js +24 -0
- package/dist/components/popover.js.map +1 -0
- package/dist/components/search-input.d.ts +14 -0
- package/dist/components/search-input.d.ts.map +1 -0
- package/dist/components/search-input.js +36 -0
- package/dist/components/search-input.js.map +1 -0
- package/dist/components/section-header.d.ts +107 -0
- package/dist/components/section-header.d.ts.map +1 -0
- package/dist/components/section-header.js +147 -0
- package/dist/components/section-header.js.map +1 -0
- package/dist/components/select.d.ts +17 -0
- package/dist/components/select.d.ts.map +1 -0
- package/dist/components/select.js +94 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/skeleton.d.ts +5 -0
- package/dist/components/skeleton.d.ts.map +1 -0
- package/dist/components/skeleton.js +13 -0
- package/dist/components/skeleton.js.map +1 -0
- package/dist/components/stack.d.ts +54 -0
- package/dist/components/stack.d.ts.map +1 -0
- package/dist/components/stack.js +46 -0
- package/dist/components/stack.js.map +1 -0
- package/dist/components/stat-strip.d.ts +38 -0
- package/dist/components/stat-strip.d.ts.map +1 -0
- package/dist/components/stat-strip.js +57 -0
- package/dist/components/stat-strip.js.map +1 -0
- package/dist/components/steps.d.ts +19 -0
- package/dist/components/steps.d.ts.map +1 -0
- package/dist/components/steps.js +29 -0
- package/dist/components/steps.js.map +1 -0
- package/dist/components/switch.d.ts +6 -0
- package/dist/components/switch.d.ts.map +1 -0
- package/dist/components/switch.js +17 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/tabs.d.ts +62 -0
- package/dist/components/tabs.d.ts.map +1 -0
- package/dist/components/tabs.js +64 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/textarea.d.ts +9 -0
- package/dist/components/textarea.d.ts.map +1 -0
- package/dist/components/textarea.js +18 -0
- package/dist/components/textarea.js.map +1 -0
- package/dist/components/toaster.d.ts +6 -0
- package/dist/components/toaster.d.ts.map +1 -0
- package/dist/components/toaster.js +37 -0
- package/dist/components/toaster.js.map +1 -0
- package/dist/components/tooltip.d.ts +15 -0
- package/dist/components/tooltip.d.ts.map +1 -0
- package/dist/components/tooltip.js +41 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/lib/animation.d.ts +12 -0
- package/dist/lib/animation.d.ts.map +1 -0
- package/dist/lib/animation.js +14 -0
- package/dist/lib/animation.js.map +1 -0
- package/dist/lib/classes.d.ts +29 -0
- package/dist/lib/classes.d.ts.map +1 -0
- package/dist/lib/classes.js +39 -0
- package/dist/lib/classes.js.map +1 -0
- package/dist/lib/icons.d.ts +21 -0
- package/dist/lib/icons.d.ts.map +1 -0
- package/dist/lib/icons.js +43 -0
- package/dist/lib/icons.js.map +1 -0
- package/dist/lib/interactive.d.ts +41 -0
- package/dist/lib/interactive.d.ts.map +1 -0
- package/dist/lib/interactive.js +30 -0
- package/dist/lib/interactive.js.map +1 -0
- package/dist/lib/slot.d.ts +12 -0
- package/dist/lib/slot.d.ts.map +1 -0
- package/dist/lib/slot.js +19 -0
- package/dist/lib/slot.js.map +1 -0
- package/dist/lib/variants.d.ts +3 -0
- package/dist/lib/variants.js +3 -0
- package/dist/styles.css +169 -0
- package/package.json +112 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { AnimatedNumber } from "./animated-number.js";
|
|
2
|
+
import { cn, variants } from "../lib/variants.js";
|
|
3
|
+
import { cardSurfaceClasses } from "./card.js";
|
|
4
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { useRender } from "@base-ui/react/use-render";
|
|
6
|
+
//#region src/components/stat-strip.tsx
|
|
7
|
+
const stripVariants = variants({
|
|
8
|
+
base: "group/strip grid grid-cols-2 gap-y-1 max-sm:[&>*:last-child:nth-child(odd)]:col-span-2 sm:flex sm:flex-wrap sm:gap-y-0",
|
|
9
|
+
variants: { variant: {
|
|
10
|
+
plain: cardSurfaceClasses,
|
|
11
|
+
track: "rounded-xl bg-background p-1.5 sm:gap-x-[13px]"
|
|
12
|
+
} },
|
|
13
|
+
defaultVariants: { variant: "plain" }
|
|
14
|
+
});
|
|
15
|
+
function StatStrip({ className, variant, ...props }) {
|
|
16
|
+
return /* @__PURE__ */ jsx("div", {
|
|
17
|
+
"data-variant": variant ?? "plain",
|
|
18
|
+
className: cn(stripVariants({
|
|
19
|
+
variant,
|
|
20
|
+
className
|
|
21
|
+
})),
|
|
22
|
+
...props
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
function StatStripItem({ label, value, format, hint, selected, render, className, ...props }) {
|
|
26
|
+
return useRender({
|
|
27
|
+
render,
|
|
28
|
+
defaultTagName: "div",
|
|
29
|
+
props: {
|
|
30
|
+
"data-selected": selected || void 0,
|
|
31
|
+
className: cn("relative min-w-0 flex-1 rounded-lg border border-transparent px-4 py-3 text-start", "before:absolute before:inset-y-2 before:-left-px before:w-px before:bg-border first:before:hidden max-sm:before:hidden", "group-data-[variant=plain]/strip:data-selected:before:hidden group-data-[variant=plain]/strip:[[data-selected]+&]:before:hidden", "group-data-[variant=track]/strip:before:-left-[8px]", "[&:is(button)]:hover:bg-foreground/3", "group-data-[variant=plain]/strip:rounded-none group-data-[variant=plain]/strip:px-5 group-data-[variant=plain]/strip:py-4 group-data-[variant=plain]/strip:before:inset-y-0 group-data-[variant=plain]/strip:before:left-0", "group-data-[variant=plain]/strip:data-selected:bg-muted", "group-data-[variant=track]/strip:data-selected:border-border group-data-[variant=track]/strip:data-selected:bg-card group-data-[variant=track]/strip:data-selected:shadow-xs", "group-data-[variant=track]/strip:not-data-selected:[&_[data-value]]:text-muted-foreground", "group-data-[variant=track]/strip:[&:is(button)]:hover:not-data-selected:bg-card/60", className),
|
|
32
|
+
children: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
33
|
+
/* @__PURE__ */ jsx("p", {
|
|
34
|
+
className: "truncate text-muted-foreground text-sm",
|
|
35
|
+
children: label
|
|
36
|
+
}),
|
|
37
|
+
/* @__PURE__ */ jsx("p", {
|
|
38
|
+
"data-value": true,
|
|
39
|
+
className: "mt-0.5 truncate font-display font-semibold text-2xl tabular-nums",
|
|
40
|
+
children: /* @__PURE__ */ jsx(AnimatedNumber, {
|
|
41
|
+
value,
|
|
42
|
+
format
|
|
43
|
+
})
|
|
44
|
+
}),
|
|
45
|
+
hint && /* @__PURE__ */ jsx("p", {
|
|
46
|
+
className: "truncate text-muted-foreground text-xs",
|
|
47
|
+
children: hint
|
|
48
|
+
})
|
|
49
|
+
] }),
|
|
50
|
+
...props
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//#endregion
|
|
55
|
+
export { StatStrip, StatStripItem };
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=stat-strip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stat-strip.js","names":[],"sources":["../../src/components/stat-strip.tsx"],"sourcesContent":["import { useRender } from \"@base-ui/react/use-render\"\nimport type { Format } from \"@number-flow/react\"\nimport type { ComponentProps } from \"react\"\nimport { AnimatedNumber } from \"~/components/animated-number\"\nimport { cardSurfaceClasses } from \"~/components/card\"\nimport { cn, variants, type VariantProps } from \"~/lib/variants\"\n\nconst stripVariants = variants({\n base: \"group/strip grid grid-cols-2 gap-y-1 max-sm:[&>*:last-child:nth-child(odd)]:col-span-2 sm:flex sm:flex-wrap sm:gap-y-0\",\n\n variants: {\n variant: {\n // A white card of figures, divided by full-height hairlines.\n plain: cardSurfaceClasses,\n // A canvas-toned track where the selected figure sits on a raised card, like a\n // segmented control; for strips that drive the panel beside them.\n // 13px gap: a 1px divider then sits 6px from the card on either side, matching the 6px inset.\n track: \"rounded-xl bg-background p-1.5 sm:gap-x-[13px]\",\n },\n },\n\n defaultVariants: {\n variant: \"plain\",\n },\n})\n\ntype StatStripProps = ComponentProps<\"div\"> & VariantProps<typeof stripVariants>\n\nfunction StatStrip({ className, variant, ...props }: StatStripProps) {\n return (\n <div\n data-variant={variant ?? \"plain\"}\n className={cn(stripVariants({ variant, className }))}\n {...props}\n />\n )\n}\n\ntype StatStripItemProps = Omit<useRender.ComponentProps<\"div\">, \"children\"> & {\n label: string\n value: string | number\n format?: Format\n hint?: string\n /**\n * Marks the item as the one driving the panel beside it. Pass `render={<button ... />}`\n * to make it selectable.\n */\n selected?: boolean\n}\n\nfunction StatStripItem({\n label,\n value,\n format,\n hint,\n selected,\n render,\n className,\n ...props\n}: StatStripItemProps) {\n return useRender({\n render,\n defaultTagName: \"div\",\n props: {\n \"data-selected\": selected || undefined,\n className: cn(\n // The border is always laid out and only colored when selected, so toggling\n // never shifts the row.\n \"relative min-w-0 flex-1 rounded-lg border border-transparent px-4 py-3 text-start\",\n // Hairline divider between neighbours. The plain strip hides it around the\n // selected fill; the track keeps it, centered in the gap between cards.\n \"before:absolute before:inset-y-2 before:-left-px before:w-px before:bg-border first:before:hidden max-sm:before:hidden\",\n \"group-data-[variant=plain]/strip:data-selected:before:hidden group-data-[variant=plain]/strip:[[data-selected]+&]:before:hidden\",\n // Offsets are measured from the padding box, so the 1px border is added to land\n // exactly halfway across the 13px gap.\n \"group-data-[variant=track]/strip:before:-left-[8px]\",\n \"[&:is(button)]:hover:bg-foreground/3\",\n // Plain card: roomier cells, full-height dividers, selected item on a soft fill.\n \"group-data-[variant=plain]/strip:rounded-none group-data-[variant=plain]/strip:px-5 group-data-[variant=plain]/strip:py-4 group-data-[variant=plain]/strip:before:inset-y-0 group-data-[variant=plain]/strip:before:left-0\",\n \"group-data-[variant=plain]/strip:data-selected:bg-muted\",\n // Track: the selected item is a raised card; unselected figures recede.\n \"group-data-[variant=track]/strip:data-selected:border-border group-data-[variant=track]/strip:data-selected:bg-card group-data-[variant=track]/strip:data-selected:shadow-xs\",\n \"group-data-[variant=track]/strip:not-data-selected:[&_[data-value]]:text-muted-foreground\",\n \"group-data-[variant=track]/strip:[&:is(button)]:hover:not-data-selected:bg-card/60\",\n className,\n ),\n children: (\n <>\n <p className=\"truncate text-muted-foreground text-sm\">{label}</p>\n\n <p\n data-value\n className=\"mt-0.5 truncate font-display font-semibold text-2xl tabular-nums\"\n >\n <AnimatedNumber value={value} format={format} />\n </p>\n\n {hint && <p className=\"truncate text-muted-foreground text-xs\">{hint}</p>}\n </>\n ),\n ...props,\n },\n })\n}\n\nexport { StatStrip, StatStripItem }\n"],"mappings":";;;;;;AAOA,MAAM,gBAAgB,SAAS;CAC7B,MAAM;CAEN,UAAU,EACR,SAAS;EAEP,OAAO;EAIP,OAAO;CACT,EACF;CAEA,iBAAiB,EACf,SAAS,QACX;AACF,CAAC;AAID,SAAS,UAAU,EAAE,WAAW,SAAS,GAAG,SAAyB;CACnE,OACE,oBAAC,OAAD;EACE,gBAAc,WAAW;EACzB,WAAW,GAAG,cAAc;GAAE;GAAS;EAAU,CAAC,CAAC;EACnD,GAAI;CACL,CAAA;AAEL;AAcA,SAAS,cAAc,EACrB,OACA,OACA,QACA,MACA,UACA,QACA,WACA,GAAG,SACkB;CACrB,OAAO,UAAU;EACf;EACA,gBAAgB;EAChB,OAAO;GACL,iBAAiB,YAAY,KAAA;GAC7B,WAAW,GAGT,qFAGA,0HACA,mIAGA,uDACA,wCAEA,8NACA,2DAEA,gLACA,6FACA,sFACA,SACF;GACA,UACE,qBAAA,UAAA,EAAA,UAAA;IACE,oBAAC,KAAD;KAAG,WAAU;KAA0C,UAAA;IAAS,CAAA;IAEhE,oBAAC,KAAD;KACE,cAAA;KACA,WAAU;KAEV,UAAA,oBAAC,gBAAD;MAAuB;MAAe;KAAS,CAAA;IAC9C,CAAA;IAEF,QAAQ,oBAAC,KAAD;KAAG,WAAU;KAA0C,UAAA;IAAQ,CAAA;GACxE,EAAA,CAAA;GAEJ,GAAG;EACL;CACF,CAAC;AACH"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/components/steps.d.ts
|
|
3
|
+
type StepsProps = ComponentProps<"div"> & {
|
|
4
|
+
/**
|
|
5
|
+
* The current step, 1-based.
|
|
6
|
+
*/
|
|
7
|
+
current: number;
|
|
8
|
+
/**
|
|
9
|
+
* The total number of steps.
|
|
10
|
+
*/
|
|
11
|
+
total: number;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Segmented progress bars for multi-step flows. Completed and current steps
|
|
15
|
+
* are filled; the current one animates in. Screen readers get "Step n of m".
|
|
16
|
+
*/
|
|
17
|
+
export declare function Steps({ className, current, total, ...props }: StepsProps): import("react").JSX.Element;
|
|
18
|
+
//#endregion
|
|
19
|
+
//# sourceMappingURL=steps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"steps.d.ts","names":[],"sources":["../../src/components/steps.tsx"],"mappings":";;KAGK,aAAa;;;;EAIhB;;;;EAKA;;;;;;wBAOc,QAAQ,WAAW,SAAS,UAAU,SAAS,6BAAU,IAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { cn } from "../lib/variants.js";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
//#region src/components/steps.tsx
|
|
4
|
+
/**
|
|
5
|
+
* Segmented progress bars for multi-step flows. Completed and current steps
|
|
6
|
+
* are filled; the current one animates in. Screen readers get "Step n of m".
|
|
7
|
+
*/
|
|
8
|
+
function Steps({ className, current, total, ...props }) {
|
|
9
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
10
|
+
className: cn("flex gap-1.5", className),
|
|
11
|
+
...props,
|
|
12
|
+
children: [/* @__PURE__ */ jsxs("p", {
|
|
13
|
+
className: "sr-only",
|
|
14
|
+
children: [
|
|
15
|
+
"Step ",
|
|
16
|
+
current,
|
|
17
|
+
" of ",
|
|
18
|
+
total
|
|
19
|
+
]
|
|
20
|
+
}), Array.from({ length: total }, (_, index) => /* @__PURE__ */ jsx("div", {
|
|
21
|
+
"aria-hidden": true,
|
|
22
|
+
className: cn("h-1 flex-1 rounded-full", index < current - 1 && "bg-foreground", index === current - 1 && "origin-left animate-fill-bar bg-foreground", index > current - 1 && "bg-border")
|
|
23
|
+
}, index))]
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
export { Steps };
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=steps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"steps.js","names":[],"sources":["../../src/components/steps.tsx"],"sourcesContent":["import type { ComponentProps } from \"react\"\nimport { cn } from \"~/lib/variants\"\n\ntype StepsProps = ComponentProps<\"div\"> & {\n /**\n * The current step, 1-based.\n */\n current: number\n\n /**\n * The total number of steps.\n */\n total: number\n}\n\n/**\n * Segmented progress bars for multi-step flows. Completed and current steps\n * are filled; the current one animates in. Screen readers get \"Step n of m\".\n */\nexport function Steps({ className, current, total, ...props }: StepsProps) {\n return (\n <div className={cn(\"flex gap-1.5\", className)} {...props}>\n <p className=\"sr-only\">\n Step {current} of {total}\n </p>\n\n {Array.from({ length: total }, (_, index) => (\n <div\n key={index}\n aria-hidden\n className={cn(\n \"h-1 flex-1 rounded-full\",\n index < current - 1 && \"bg-foreground\",\n index === current - 1 && \"origin-left animate-fill-bar bg-foreground\",\n index > current - 1 && \"bg-border\",\n )}\n />\n ))}\n </div>\n )\n}\n"],"mappings":";;;;;;;AAmBA,SAAgB,MAAM,EAAE,WAAW,SAAS,OAAO,GAAG,SAAqB;CACzE,OACE,qBAAC,OAAD;EAAK,WAAW,GAAG,gBAAgB,SAAS;EAAG,GAAI;EAAnD,UAAA,CACE,qBAAC,KAAD;GAAG,WAAU;GAAb,UAAA;IAAuB;IACf;IAAQ;IAAK;GAClB;EAEF,CAAA,GAAA,MAAM,KAAK,EAAE,QAAQ,MAAM,IAAI,GAAG,UACjC,oBAAC,OAAD;GAEE,eAAA;GACA,WAAW,GACT,2BACA,QAAQ,UAAU,KAAK,iBACvB,UAAU,UAAU,KAAK,8CACzB,QAAQ,UAAU,KAAK,WACzB;EACD,GARM,KAQN,CACF,CACE;;AAET"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Switch as Switch$1 } from "@base-ui/react/switch";
|
|
2
|
+
//#region src/components/switch.d.ts
|
|
3
|
+
declare function Switch({ className, ...props }: Switch$1.Root.Props): import("react").JSX.Element;
|
|
4
|
+
//#endregion
|
|
5
|
+
export { Switch };
|
|
6
|
+
//# sourceMappingURL=switch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switch.d.ts","names":[],"sources":["../../src/components/switch.tsx"],"mappings":";;iBAMS,SAAS,cAAc,SAAS,SAAgB,KAAK,wBAAK,IAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/variants.js";
|
|
3
|
+
import { interactiveVariants } from "../lib/interactive.js";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
import { Switch as Switch$1 } from "@base-ui/react/switch";
|
|
6
|
+
//#region src/components/switch.tsx
|
|
7
|
+
function Switch({ className, ...props }) {
|
|
8
|
+
return /* @__PURE__ */ jsx(Switch$1.Root, {
|
|
9
|
+
className: cn(interactiveVariants({ focus: true }), "inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full p-px data-checked:bg-primary data-unchecked:bg-input disabled:cursor-not-allowed disabled:opacity-50", className),
|
|
10
|
+
...props,
|
|
11
|
+
children: /* @__PURE__ */ jsx(Switch$1.Thumb, { className: "pointer-events-none block size-4 rounded-full bg-background shadow-sm transition-transform duration-200 ease-out-expo data-checked:translate-x-4" })
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
//#endregion
|
|
15
|
+
export { Switch };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=switch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switch.js","names":["SwitchPrimitive"],"sources":["../../src/components/switch.tsx"],"sourcesContent":["\"use client\"\n\nimport { Switch as SwitchPrimitive } from \"@base-ui/react/switch\"\nimport { interactiveVariants } from \"~/lib/interactive\"\nimport { cn } from \"~/lib/variants\"\n\nfunction Switch({ className, ...props }: SwitchPrimitive.Root.Props) {\n return (\n <SwitchPrimitive.Root\n className={cn(\n interactiveVariants({ focus: true }),\n \"inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full p-px data-checked:bg-primary data-unchecked:bg-input disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb className=\"pointer-events-none block size-4 rounded-full bg-background shadow-sm transition-transform duration-200 ease-out-expo data-checked:translate-x-4\" />\n </SwitchPrimitive.Root>\n )\n}\n\nexport { Switch }\n"],"mappings":";;;;;;AAMA,SAAS,OAAO,EAAE,WAAW,GAAG,SAAqC;CACnE,OACE,oBAACA,SAAgB,MAAjB;EACE,WAAW,GACT,oBAAoB,EAAE,OAAO,KAAK,CAAC,GACnC,8KACA,SACF;EACA,GAAI;EAEJ,UAAA,oBAACA,SAAgB,OAAjB,EAAuB,WAAU,mJAAoJ,CAAA;CACjK,CAAA;AAE1B"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { VariantProps } from "../lib/variants.js";
|
|
2
|
+
import { Tabs as Tabs$1 } from "@base-ui/react/tabs";
|
|
3
|
+
//#region src/components/tabs.d.ts
|
|
4
|
+
declare const Tabs: import("react").ForwardRefExoticComponent<Omit<import("@base-ui/react").TabsRootProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
5
|
+
declare const tabsListVariants: import("tailwind-variants").TVReturnType<{
|
|
6
|
+
variant: {
|
|
7
|
+
segmented: {
|
|
8
|
+
list: string;
|
|
9
|
+
indicator: string;
|
|
10
|
+
trigger: string;
|
|
11
|
+
};
|
|
12
|
+
plain: {
|
|
13
|
+
list: string;
|
|
14
|
+
indicator: string;
|
|
15
|
+
trigger: string;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
}, {
|
|
19
|
+
list: string;
|
|
20
|
+
indicator: string;
|
|
21
|
+
trigger: string;
|
|
22
|
+
}, undefined, {
|
|
23
|
+
variant: {
|
|
24
|
+
segmented: {
|
|
25
|
+
list: string;
|
|
26
|
+
indicator: string;
|
|
27
|
+
trigger: string;
|
|
28
|
+
};
|
|
29
|
+
plain: {
|
|
30
|
+
list: string;
|
|
31
|
+
indicator: string;
|
|
32
|
+
trigger: string;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
}, {
|
|
36
|
+
list: string;
|
|
37
|
+
indicator: string;
|
|
38
|
+
trigger: string;
|
|
39
|
+
}, import("tailwind-variants").TVReturnTypeLike<{
|
|
40
|
+
variant: {
|
|
41
|
+
segmented: {
|
|
42
|
+
list: string;
|
|
43
|
+
indicator: string;
|
|
44
|
+
trigger: string;
|
|
45
|
+
};
|
|
46
|
+
plain: {
|
|
47
|
+
list: string;
|
|
48
|
+
indicator: string;
|
|
49
|
+
trigger: string;
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
}, {
|
|
53
|
+
list: string;
|
|
54
|
+
indicator: string;
|
|
55
|
+
trigger: string;
|
|
56
|
+
}>>;
|
|
57
|
+
type TabsListProps = Tabs$1.List.Props & VariantProps<typeof tabsListVariants>;
|
|
58
|
+
declare function TabsList({ className, children, variant, ...props }: TabsListProps): import("react").JSX.Element;
|
|
59
|
+
declare function TabsTrigger({ className, ...props }: Tabs$1.Tab.Props): import("react").JSX.Element;
|
|
60
|
+
//#endregion
|
|
61
|
+
export { Tabs, TabsList, TabsTrigger };
|
|
62
|
+
//# sourceMappingURL=tabs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs.d.ts","names":[],"sources":["../../src/components/tabs.tsx"],"mappings":";;;cAOM,sBAAI,0BAAA,8BAAA,wCAAA,cAAA;cAEJ,8CAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAyDjB,gBAAgB,OAAc,KAAK,QAAQ,oBAAoB;iBAE3D,WAAW,WAAW,UAAU,YAA0B,SAAS,gCAAa,IAAA;iBAchF,cAAc,cAAc,SAAS,OAAc,IAAI,wBAAK,IAAA"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn, variants } from "../lib/variants.js";
|
|
3
|
+
import { interactiveVariants } from "../lib/interactive.js";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { createContext, useContext } from "react";
|
|
6
|
+
import { Tabs as Tabs$1 } from "@base-ui/react/tabs";
|
|
7
|
+
//#region src/components/tabs.tsx
|
|
8
|
+
const Tabs = Tabs$1.Root;
|
|
9
|
+
const tabsListVariants = variants({
|
|
10
|
+
slots: {
|
|
11
|
+
list: "relative inline-flex items-center text-muted-foreground",
|
|
12
|
+
indicator: "absolute top-1/2 left-0 z-0 h-[var(--active-tab-height)] w-[var(--active-tab-width)] -translate-y-1/2 translate-x-[var(--active-tab-left)] rounded-md transition-[translate,width] duration-500 ease-out-expo",
|
|
13
|
+
trigger: cn(interactiveVariants({ focus: true }), "relative z-10 inline-flex items-center justify-center whitespace-nowrap rounded-md font-medium disabled:pointer-events-none disabled:opacity-50 hover:text-foreground data-active:text-foreground")
|
|
14
|
+
},
|
|
15
|
+
variants: { variant: {
|
|
16
|
+
segmented: {
|
|
17
|
+
list: "h-control justify-center rounded-md border bg-card p-[3px]",
|
|
18
|
+
indicator: "rounded-[3px] bg-muted",
|
|
19
|
+
trigger: "rounded-[3px] px-2.5 py-[5px] text-control"
|
|
20
|
+
},
|
|
21
|
+
plain: {
|
|
22
|
+
list: "gap-0.5",
|
|
23
|
+
indicator: "bg-muted",
|
|
24
|
+
trigger: "px-2.5 py-1.5 text-sm"
|
|
25
|
+
}
|
|
26
|
+
} },
|
|
27
|
+
defaultVariants: { variant: "segmented" }
|
|
28
|
+
});
|
|
29
|
+
const TabsVariantContext = createContext("segmented");
|
|
30
|
+
/**
|
|
31
|
+
* Sliding highlight that tracks the active tab via Base UI's --active-tab-*
|
|
32
|
+
* CSS variables. Rendered automatically by TabsList, so every tab group shares
|
|
33
|
+
* one pill. Duration/easing mirror the library's one motion curve — the
|
|
34
|
+
* `--ease-out-expo` token, duplicated for JS in `~/lib/animation` — so the pill
|
|
35
|
+
* glides in sync with the number spins and chart draws it sits beside.
|
|
36
|
+
*/
|
|
37
|
+
function TabsIndicator({ className, ...props }) {
|
|
38
|
+
const variant = useContext(TabsVariantContext);
|
|
39
|
+
return /* @__PURE__ */ jsx(Tabs$1.Indicator, {
|
|
40
|
+
className: cn(tabsListVariants({ variant }).indicator(), className),
|
|
41
|
+
...props
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
function TabsList({ className, children, variant = "segmented", ...props }) {
|
|
45
|
+
return /* @__PURE__ */ jsx(TabsVariantContext, {
|
|
46
|
+
value: variant,
|
|
47
|
+
children: /* @__PURE__ */ jsxs(Tabs$1.List, {
|
|
48
|
+
className: cn(tabsListVariants({ variant }).list(), className),
|
|
49
|
+
...props,
|
|
50
|
+
children: [/* @__PURE__ */ jsx(TabsIndicator, {}), children]
|
|
51
|
+
})
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
function TabsTrigger({ className, ...props }) {
|
|
55
|
+
const variant = useContext(TabsVariantContext);
|
|
56
|
+
return /* @__PURE__ */ jsx(Tabs$1.Tab, {
|
|
57
|
+
className: cn(tabsListVariants({ variant }).trigger(), className),
|
|
58
|
+
...props
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
//#endregion
|
|
62
|
+
export { Tabs, TabsList, TabsTrigger };
|
|
63
|
+
|
|
64
|
+
//# sourceMappingURL=tabs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs.js","names":["TabsPrimitive"],"sources":["../../src/components/tabs.tsx"],"sourcesContent":["\"use client\"\n\nimport { Tabs as TabsPrimitive } from \"@base-ui/react/tabs\"\nimport { createContext, useContext } from \"react\"\nimport { interactiveVariants } from \"~/lib/interactive\"\nimport { cn, variants, type VariantProps } from \"~/lib/variants\"\n\nconst Tabs = TabsPrimitive.Root\n\nconst tabsListVariants = variants({\n slots: {\n list: \"relative inline-flex items-center text-muted-foreground\",\n indicator:\n \"absolute top-1/2 left-0 z-0 h-[var(--active-tab-height)] w-[var(--active-tab-width)] -translate-y-1/2 translate-x-[var(--active-tab-left)] rounded-md transition-[translate,width] duration-500 ease-out-expo\",\n trigger: cn(\n interactiveVariants({ focus: true }),\n \"relative z-10 inline-flex items-center justify-center whitespace-nowrap rounded-md font-medium disabled:pointer-events-none disabled:opacity-50 hover:text-foreground data-active:text-foreground\",\n ),\n },\n\n variants: {\n variant: {\n // Segmented control, sized like an `md` Button so it sits flush beside one in a header:\n // the same 13px text, the same `--spacing-control` height, and a 6px outer radius over a\n // 3px inset (so the inner pill radius is 3px).\n segmented: {\n list: \"h-control justify-center rounded-md border bg-card p-[3px]\",\n indicator: \"rounded-[3px] bg-muted\",\n trigger: \"rounded-[3px] px-2.5 py-[5px] text-control\",\n },\n // Plain pills: no track, the active tab sits on a soft pill. For in-card view switchers.\n plain: {\n list: \"gap-0.5\",\n indicator: \"bg-muted\",\n trigger: \"px-2.5 py-1.5 text-sm\",\n },\n },\n },\n\n defaultVariants: {\n variant: \"segmented\",\n },\n})\n\ntype TabsVariant = NonNullable<VariantProps<typeof tabsListVariants>[\"variant\"]>\n\nconst TabsVariantContext = createContext<TabsVariant>(\"segmented\")\n\n/**\n * Sliding highlight that tracks the active tab via Base UI's --active-tab-*\n * CSS variables. Rendered automatically by TabsList, so every tab group shares\n * one pill. Duration/easing mirror the library's one motion curve — the\n * `--ease-out-expo` token, duplicated for JS in `~/lib/animation` — so the pill\n * glides in sync with the number spins and chart draws it sits beside.\n */\nfunction TabsIndicator({ className, ...props }: TabsPrimitive.Indicator.Props) {\n const variant = useContext(TabsVariantContext)\n\n return (\n <TabsPrimitive.Indicator\n className={cn(tabsListVariants({ variant }).indicator(), className)}\n {...props}\n />\n )\n}\n\ntype TabsListProps = TabsPrimitive.List.Props & VariantProps<typeof tabsListVariants>\n\nfunction TabsList({ className, children, variant = \"segmented\", ...props }: TabsListProps) {\n return (\n <TabsVariantContext value={variant}>\n <TabsPrimitive.List\n className={cn(tabsListVariants({ variant }).list(), className)}\n {...props}\n >\n <TabsIndicator />\n {children}\n </TabsPrimitive.List>\n </TabsVariantContext>\n )\n}\n\nfunction TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props) {\n const variant = useContext(TabsVariantContext)\n\n return (\n <TabsPrimitive.Tab\n className={cn(tabsListVariants({ variant }).trigger(), className)}\n {...props}\n />\n )\n}\n\nexport { Tabs, TabsList, TabsTrigger }\n"],"mappings":";;;;;;;AAOA,MAAM,OAAOA,OAAc;AAE3B,MAAM,mBAAmB,SAAS;CAChC,OAAO;EACL,MAAM;EACN,WACE;EACF,SAAS,GACP,oBAAoB,EAAE,OAAO,KAAK,CAAC,GACnC,mMACF;CACF;CAEA,UAAU,EACR,SAAS;EAIP,WAAW;GACT,MAAM;GACN,WAAW;GACX,SAAS;EACX;EAEA,OAAO;GACL,MAAM;GACN,WAAW;GACX,SAAS;EACX;CACF,EACF;CAEA,iBAAiB,EACf,SAAS,YACX;AACF,CAAC;AAID,MAAM,qBAAqB,cAA2B,WAAW;;;;;;;;AASjE,SAAS,cAAc,EAAE,WAAW,GAAG,SAAwC;CAC7E,MAAM,UAAU,WAAW,kBAAkB;CAE7C,OACE,oBAACA,OAAc,WAAf;EACE,WAAW,GAAG,iBAAiB,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,GAAG,SAAS;EAClE,GAAI;CACL,CAAA;AAEL;AAIA,SAAS,SAAS,EAAE,WAAW,UAAU,UAAU,aAAa,GAAG,SAAwB;CACzF,OACE,oBAAC,oBAAD;EAAoB,OAAO;EACzB,UAAA,qBAACA,OAAc,MAAf;GACE,WAAW,GAAG,iBAAiB,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,SAAS;GAC7D,GAAI;GAFN,UAAA,CAIE,oBAAC,eAAD,CAAgB,CAAA,GACf,QACiB;;CACF,CAAA;AAExB;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAAkC;CACrE,MAAM,UAAU,WAAW,kBAAkB;CAE7C,OACE,oBAACA,OAAc,KAAf;EACE,WAAW,GAAG,iBAAiB,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,GAAG,SAAS;EAChE,GAAI;CACL,CAAA;AAEL"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { VariantProps } from "../lib/variants.js";
|
|
2
|
+
import { inputVariants } from "./input.js";
|
|
3
|
+
import { ComponentProps } from "react";
|
|
4
|
+
//#region src/components/textarea.d.ts
|
|
5
|
+
type TextareaProps = Omit<ComponentProps<"textarea">, "size"> & VariantProps<typeof inputVariants>;
|
|
6
|
+
declare function Textarea({ className, hover, focus, size, ...props }: TextareaProps): import("react").JSX.Element;
|
|
7
|
+
//#endregion
|
|
8
|
+
export { Textarea };
|
|
9
|
+
//# sourceMappingURL=textarea.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textarea.d.ts","names":[],"sources":["../../src/components/textarea.tsx"],"mappings":";;;;KAIK,gBAAgB,KAAK,sCAAsC,oBAAoB;iBAE3E,WAAW,WAAW,OAAO,OAAO,SAAS,SAAS,gCAAa,IAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { cn } from "../lib/variants.js";
|
|
2
|
+
import { inputVariants } from "./input.js";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
//#region src/components/textarea.tsx
|
|
5
|
+
function Textarea({ className, hover, focus, size, ...props }) {
|
|
6
|
+
return /* @__PURE__ */ jsx("textarea", {
|
|
7
|
+
className: cn(inputVariants({
|
|
8
|
+
hover,
|
|
9
|
+
focus,
|
|
10
|
+
size
|
|
11
|
+
}), "leading-normal resize-none field-sizing-content", className),
|
|
12
|
+
...props
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
//#endregion
|
|
16
|
+
export { Textarea };
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=textarea.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textarea.js","names":[],"sources":["../../src/components/textarea.tsx"],"sourcesContent":["import type { ComponentProps } from \"react\"\nimport { inputVariants } from \"~/components/input\"\nimport { cn, type VariantProps } from \"~/lib/variants\"\n\ntype TextareaProps = Omit<ComponentProps<\"textarea\">, \"size\"> & VariantProps<typeof inputVariants>\n\nfunction Textarea({ className, hover, focus, size, ...props }: TextareaProps) {\n return (\n <textarea\n className={cn(\n inputVariants({ hover, focus, size }),\n \"leading-normal resize-none field-sizing-content\",\n className,\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n"],"mappings":";;;;AAMA,SAAS,SAAS,EAAE,WAAW,OAAO,OAAO,MAAM,GAAG,SAAwB;CAC5E,OACE,oBAAC,YAAD;EACE,WAAW,GACT,cAAc;GAAE;GAAO;GAAO;EAAK,CAAC,GACpC,mDACA,SACF;EACA,GAAI;CACL,CAAA;AAEL"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
import { Toaster as Toaster$1 } from "sonner";
|
|
3
|
+
//#region src/components/toaster.d.ts
|
|
4
|
+
export declare function Toaster({ className, ...props }: ComponentProps<typeof Toaster$1>): import("react").JSX.Element;
|
|
5
|
+
//#endregion
|
|
6
|
+
//# sourceMappingURL=toaster.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toaster.d.ts","names":[],"sources":["../../src/components/toaster.tsx"],"mappings":";;;wBAQgB,UAAU,cAAc,SAAS,sBAAsB,6BAAO,IAAA"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { cn } from "../lib/variants.js";
|
|
2
|
+
import { CircleCheckIcon, CircleHelpIcon, CircleXIcon, LoaderIcon } from "../lib/icons.js";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
import { Toaster as Toaster$1 } from "sonner";
|
|
5
|
+
//#region src/components/toaster.tsx
|
|
6
|
+
/** The halo that lifts a solid-colored toast off whatever it floats over. */
|
|
7
|
+
const toastRingClasses = "ring ring-background/50";
|
|
8
|
+
function Toaster({ className, ...props }) {
|
|
9
|
+
return /* @__PURE__ */ jsx(Toaster$1, {
|
|
10
|
+
className: "pointer-events-auto",
|
|
11
|
+
offset: 16,
|
|
12
|
+
toastOptions: {
|
|
13
|
+
unstyled: true,
|
|
14
|
+
classNames: {
|
|
15
|
+
toast: cn("flex items-start gap-2 p-4 text-control font-medium rounded-lg shadow-sm", className),
|
|
16
|
+
default: "bg-background border border-border text-foreground",
|
|
17
|
+
info: cn("bg-foreground text-background", toastRingClasses),
|
|
18
|
+
success: cn("bg-success text-white", toastRingClasses),
|
|
19
|
+
error: cn("bg-danger text-white", toastRingClasses),
|
|
20
|
+
content: "w-full",
|
|
21
|
+
description: "font-normal opacity-80",
|
|
22
|
+
icon: "mt-0.5"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
icons: {
|
|
26
|
+
info: /* @__PURE__ */ jsx(CircleHelpIcon, { className: "size-4" }),
|
|
27
|
+
success: /* @__PURE__ */ jsx(CircleCheckIcon, { className: "size-4" }),
|
|
28
|
+
error: /* @__PURE__ */ jsx(CircleXIcon, { className: "size-4" }),
|
|
29
|
+
loading: /* @__PURE__ */ jsx(LoaderIcon, { className: "size-4 animate-spin" })
|
|
30
|
+
},
|
|
31
|
+
...props
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//#endregion
|
|
35
|
+
export { Toaster };
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=toaster.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toaster.js","names":["Sonner"],"sources":["../../src/components/toaster.tsx"],"sourcesContent":["import type { ComponentProps } from \"react\"\nimport { Toaster as Sonner } from \"sonner\"\nimport { CircleCheckIcon, CircleHelpIcon, CircleXIcon, LoaderIcon } from \"~/lib/icons\"\nimport { cn } from \"~/lib/variants\"\n\n/** The halo that lifts a solid-colored toast off whatever it floats over. */\nconst toastRingClasses = \"ring ring-background/50\"\n\nexport function Toaster({ className, ...props }: ComponentProps<typeof Sonner>) {\n return (\n <Sonner\n className=\"pointer-events-auto\"\n offset={16}\n toastOptions={{\n unstyled: true,\n classNames: {\n /*\n * Sonner joins `toast` with exactly one type key per toast (`default` for untyped\n * ones) as a plain string, so tailwind-merge never sees the pair. Anything that\n * differs per type — background, text, halo — therefore lives on the type keys\n * only, and never gets cancelled here.\n */\n toast: cn(\n \"flex items-start gap-2 p-4 text-control font-medium rounded-lg shadow-sm\",\n className,\n ),\n default: \"bg-background border border-border text-foreground\",\n info: cn(\"bg-foreground text-background\", toastRingClasses),\n success: cn(\"bg-success text-white\", toastRingClasses),\n error: cn(\"bg-danger text-white\", toastRingClasses),\n content: \"w-full\",\n description: \"font-normal opacity-80\",\n icon: \"mt-0.5\",\n },\n }}\n icons={{\n info: <CircleHelpIcon className=\"size-4\" />,\n success: <CircleCheckIcon className=\"size-4\" />,\n error: <CircleXIcon className=\"size-4\" />,\n loading: <LoaderIcon className=\"size-4 animate-spin\" />,\n }}\n {...props}\n />\n )\n}\n"],"mappings":";;;;;;AAMA,MAAM,mBAAmB;AAEzB,SAAgB,QAAQ,EAAE,WAAW,GAAG,SAAwC;CAC9E,OACE,oBAACA,WAAD;EACE,WAAU;EACV,QAAQ;EACR,cAAc;GACZ,UAAU;GACV,YAAY;IAOV,OAAO,GACL,4EACA,SACF;IACA,SAAS;IACT,MAAM,GAAG,iCAAiC,gBAAgB;IAC1D,SAAS,GAAG,yBAAyB,gBAAgB;IACrD,OAAO,GAAG,wBAAwB,gBAAgB;IAClD,SAAS;IACT,aAAa;IACb,MAAM;GACR;EACF;EACA,OAAO;GACL,MAAM,oBAAC,gBAAD,EAAgB,WAAU,SAAU,CAAA;GAC1C,SAAS,oBAAC,iBAAD,EAAiB,WAAU,SAAU,CAAA;GAC9C,OAAO,oBAAC,aAAD,EAAa,WAAU,SAAU,CAAA;GACxC,SAAS,oBAAC,YAAD,EAAY,WAAU,sBAAuB,CAAA;EACxD;EACA,GAAI;CACL,CAAA;AAEL"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ReactElement, ReactNode } from "react";
|
|
2
|
+
import { Tooltip as Tooltip$1 } from "@base-ui/react/tooltip";
|
|
3
|
+
//#region src/components/tooltip.d.ts
|
|
4
|
+
declare const TooltipProvider: import("react").FC<import("@base-ui/react").TooltipProviderProps>;
|
|
5
|
+
declare const TooltipRoot: <Payload>(props: Tooltip$1.Root.Props<Payload>) => import("react").JSX.Element;
|
|
6
|
+
declare const TooltipTrigger: Tooltip$1.Trigger;
|
|
7
|
+
declare function TooltipContent({ className, sideOffset, side, align, ...props }: Tooltip$1.Popup.Props & Pick<Tooltip$1.Positioner.Props, "sideOffset" | "side" | "align">): import("react").JSX.Element;
|
|
8
|
+
type TooltipProps = Omit<Tooltip$1.Root.Props, "children"> & Pick<Tooltip$1.Positioner.Props, "side" | "align"> & {
|
|
9
|
+
children: ReactElement;
|
|
10
|
+
tooltip: ReactNode;
|
|
11
|
+
};
|
|
12
|
+
declare function Tooltip({ children, tooltip, side, align, open, defaultOpen, onOpenChange, ...rest }: TooltipProps): import("react").JSX.Element;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { Tooltip, TooltipContent, TooltipProvider, TooltipRoot, TooltipTrigger };
|
|
15
|
+
//# sourceMappingURL=tooltip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tooltip.d.ts","names":[],"sources":["../../src/components/tooltip.tsx"],"mappings":";;;cAOM,iCAAe,4BAAA;cACf,cAAW,SAAA,OAAA,UAAA,KAAA,MAAA,6BAAA,IAAA;cACX,gBAAc,UAAA;iBAIX,iBACP,WACA,YACA,MACA,UACG,SACF,UAAiB,MAAM,QACxB,KAAK,UAAiB,WAAW,0DAAuC,IAAA;KAsBrE,eAAe,KAAK,UAAiB,KAAK,qBAC7C,KAAK,UAAiB,WAAW;EAC/B,UAAU;EACV,SAAS;;iBAGJ,UACP,UACA,SACA,MACA,OACA,MACA,aACA,iBACG,QACF,+BAAY,IAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/variants.js";
|
|
3
|
+
import { popoverAnimationClasses } from "../lib/classes.js";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { Tooltip as Tooltip$1 } from "@base-ui/react/tooltip";
|
|
6
|
+
//#region src/components/tooltip.tsx
|
|
7
|
+
const TooltipProvider = Tooltip$1.Provider;
|
|
8
|
+
const TooltipRoot = Tooltip$1.Root;
|
|
9
|
+
const TooltipTrigger = Tooltip$1.Trigger;
|
|
10
|
+
const TooltipPortal = Tooltip$1.Portal;
|
|
11
|
+
const TooltipArrow = Tooltip$1.Arrow;
|
|
12
|
+
function TooltipContent({ className, sideOffset = 4, side, align, ...props }) {
|
|
13
|
+
return /* @__PURE__ */ jsx(Tooltip$1.Portal, { children: /* @__PURE__ */ jsx(Tooltip$1.Positioner, {
|
|
14
|
+
sideOffset,
|
|
15
|
+
side,
|
|
16
|
+
align,
|
|
17
|
+
className: "isolate z-50",
|
|
18
|
+
children: /* @__PURE__ */ jsx(Tooltip$1.Popup, {
|
|
19
|
+
className: cn("z-50 max-w-60 inline-flex items-center gap-2 px-3 py-1.5 bg-foreground text-xs text-background text-center text-pretty rounded-md will-change-[transform,opacity]", popoverAnimationClasses, className),
|
|
20
|
+
...props
|
|
21
|
+
})
|
|
22
|
+
}) });
|
|
23
|
+
}
|
|
24
|
+
function Tooltip({ children, tooltip, side, align, open, defaultOpen, onOpenChange, ...rest }) {
|
|
25
|
+
if (!tooltip) return children;
|
|
26
|
+
return /* @__PURE__ */ jsxs(TooltipRoot, {
|
|
27
|
+
open,
|
|
28
|
+
defaultOpen,
|
|
29
|
+
onOpenChange,
|
|
30
|
+
...rest,
|
|
31
|
+
children: [/* @__PURE__ */ jsx(TooltipTrigger, { render: children }), /* @__PURE__ */ jsx(TooltipPortal, { children: /* @__PURE__ */ jsxs(TooltipContent, {
|
|
32
|
+
side,
|
|
33
|
+
align,
|
|
34
|
+
children: [tooltip, /* @__PURE__ */ jsx(TooltipArrow, { className: cn("z-50 size-2.5 rotate-45 rounded-xs bg-foreground fill-foreground", "data-[side=top]:bottom-0 data-[side=top]:translate-y-[calc(50%-2px)]", "data-[side=bottom]:top-0 data-[side=bottom]:-translate-y-[calc(50%-2px)]", "data-[side=left]:right-0 data-[side=left]:translate-x-[calc(50%-2px)]", "data-[side=right]:left-0 data-[side=right]:-translate-x-[calc(50%-2px)]") })]
|
|
35
|
+
}) })]
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
//#endregion
|
|
39
|
+
export { Tooltip, TooltipContent, TooltipProvider, TooltipRoot, TooltipTrigger };
|
|
40
|
+
|
|
41
|
+
//# sourceMappingURL=tooltip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tooltip.js","names":["TooltipPrimitive"],"sources":["../../src/components/tooltip.tsx"],"sourcesContent":["\"use client\"\n\nimport { Tooltip as TooltipPrimitive } from \"@base-ui/react/tooltip\"\nimport type { ReactElement, ReactNode } from \"react\"\nimport { popoverAnimationClasses } from \"~/lib/classes\"\nimport { cn } from \"~/lib/variants\"\n\nconst TooltipProvider = TooltipPrimitive.Provider\nconst TooltipRoot = TooltipPrimitive.Root\nconst TooltipTrigger = TooltipPrimitive.Trigger\nconst TooltipPortal = TooltipPrimitive.Portal\nconst TooltipArrow = TooltipPrimitive.Arrow\n\nfunction TooltipContent({\n className,\n sideOffset = 4,\n side,\n align,\n ...props\n}: TooltipPrimitive.Popup.Props &\n Pick<TooltipPrimitive.Positioner.Props, \"sideOffset\" | \"side\" | \"align\">) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Positioner\n sideOffset={sideOffset}\n side={side}\n align={align}\n className=\"isolate z-50\"\n >\n <TooltipPrimitive.Popup\n className={cn(\n \"z-50 max-w-60 inline-flex items-center gap-2 px-3 py-1.5 bg-foreground text-xs text-background text-center text-pretty rounded-md will-change-[transform,opacity]\",\n popoverAnimationClasses,\n className,\n )}\n {...props}\n />\n </TooltipPrimitive.Positioner>\n </TooltipPrimitive.Portal>\n )\n}\n\ntype TooltipProps = Omit<TooltipPrimitive.Root.Props, \"children\"> &\n Pick<TooltipPrimitive.Positioner.Props, \"side\" | \"align\"> & {\n children: ReactElement\n tooltip: ReactNode\n }\n\nfunction Tooltip({\n children,\n tooltip,\n side,\n align,\n open,\n defaultOpen,\n onOpenChange,\n ...rest\n}: TooltipProps) {\n if (!tooltip) {\n return children\n }\n\n return (\n <TooltipRoot open={open} defaultOpen={defaultOpen} onOpenChange={onOpenChange} {...rest}>\n <TooltipTrigger render={children} />\n\n <TooltipPortal>\n <TooltipContent side={side} align={align}>\n {tooltip}\n <TooltipArrow\n className={cn(\n \"z-50 size-2.5 rotate-45 rounded-xs bg-foreground fill-foreground\",\n \"data-[side=top]:bottom-0 data-[side=top]:translate-y-[calc(50%-2px)]\",\n \"data-[side=bottom]:top-0 data-[side=bottom]:-translate-y-[calc(50%-2px)]\",\n \"data-[side=left]:right-0 data-[side=left]:translate-x-[calc(50%-2px)]\",\n \"data-[side=right]:left-0 data-[side=right]:-translate-x-[calc(50%-2px)]\",\n )}\n />\n </TooltipContent>\n </TooltipPortal>\n </TooltipRoot>\n )\n}\n\nexport { Tooltip, TooltipRoot, TooltipTrigger, TooltipContent, TooltipProvider }\n"],"mappings":";;;;;;AAOA,MAAM,kBAAkBA,UAAiB;AACzC,MAAM,cAAcA,UAAiB;AACrC,MAAM,iBAAiBA,UAAiB;AACxC,MAAM,gBAAgBA,UAAiB;AACvC,MAAM,eAAeA,UAAiB;AAEtC,SAAS,eAAe,EACtB,WACA,aAAa,GACb,MACA,OACA,GAAG,SAEuE;CAC1E,OACE,oBAACA,UAAiB,QAAlB,EAAA,UACE,oBAACA,UAAiB,YAAlB;EACc;EACN;EACC;EACP,WAAU;EAEV,UAAA,oBAACA,UAAiB,OAAlB;GACE,WAAW,GACT,qKACA,yBACA,SACF;GACA,GAAI;EACL,CAAA;CAC0B,CAAA,EACN,CAAA;AAE7B;AAQA,SAAS,QAAQ,EACf,UACA,SACA,MACA,OACA,MACA,aACA,cACA,GAAG,QACY;CACf,IAAI,CAAC,SACH,OAAO;CAGT,OACE,qBAAC,aAAD;EAAmB;EAAmB;EAA2B;EAAc,GAAI;EAAnF,UAAA,CACE,oBAAC,gBAAD,EAAgB,QAAQ,SAAW,CAAA,GAEnC,oBAAC,eAAD,EAAA,UACE,qBAAC,gBAAD;GAAsB;GAAa;GAAnC,UAAA,CACG,SACD,oBAAC,cAAD,EACE,WAAW,GACT,oEACA,wEACA,4EACA,yEACA,yEACF,EACD,CAAA,CACa;EACH,CAAA,EAAA,CAAA,CACJ;;AAEjB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//#region src/lib/animation.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Shared timing so number spins and chart draws feel like one coordinated motion.
|
|
4
|
+
* `ANIMATION_EASING` mirrors the `--ease-out-expo` CSS token — JS cannot read a Tailwind theme
|
|
5
|
+
* token, so the curve is duplicated here on purpose; change one and change the other. It stays
|
|
6
|
+
* space-free so it satisfies recharts' `cubic-bezier(n,n,n,n)` template type (NumberFlow takes
|
|
7
|
+
* any CSS easing).
|
|
8
|
+
*/
|
|
9
|
+
export declare const ANIMATION_DURATION = 500;
|
|
10
|
+
export declare const ANIMATION_EASING: "cubic-bezier(0.16,1,0.3,1)";
|
|
11
|
+
//#endregion
|
|
12
|
+
//# sourceMappingURL=animation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animation.d.ts","names":[],"sources":["../../src/lib/animation.ts"],"mappings":";;;;;;;;qBAOa;qBACA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
//#region src/lib/animation.ts
|
|
2
|
+
/**
|
|
3
|
+
* Shared timing so number spins and chart draws feel like one coordinated motion.
|
|
4
|
+
* `ANIMATION_EASING` mirrors the `--ease-out-expo` CSS token — JS cannot read a Tailwind theme
|
|
5
|
+
* token, so the curve is duplicated here on purpose; change one and change the other. It stays
|
|
6
|
+
* space-free so it satisfies recharts' `cubic-bezier(n,n,n,n)` template type (NumberFlow takes
|
|
7
|
+
* any CSS easing).
|
|
8
|
+
*/
|
|
9
|
+
const ANIMATION_DURATION = 500;
|
|
10
|
+
const ANIMATION_EASING = "cubic-bezier(0.16,1,0.3,1)";
|
|
11
|
+
//#endregion
|
|
12
|
+
export { ANIMATION_DURATION, ANIMATION_EASING };
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=animation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animation.js","names":[],"sources":["../../src/lib/animation.ts"],"sourcesContent":["/**\n * Shared timing so number spins and chart draws feel like one coordinated motion.\n * `ANIMATION_EASING` mirrors the `--ease-out-expo` CSS token — JS cannot read a Tailwind theme\n * token, so the curve is duplicated here on purpose; change one and change the other. It stays\n * space-free so it satisfies recharts' `cubic-bezier(n,n,n,n)` template type (NumberFlow takes\n * any CSS easing).\n */\nexport const ANIMATION_DURATION = 500\nexport const ANIMATION_EASING = \"cubic-bezier(0.16,1,0.3,1)\" as const\n"],"mappings":";;;;;;;;AAOA,MAAa,qBAAqB;AAClC,MAAa,mBAAmB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
//#region src/lib/classes.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Enter/exit animation classes for Base UI popups (Menu, Select, Popover, Tooltip, …).
|
|
4
|
+
* Keyed on Base UI's `data-open`/`data-closed` state attributes and the positioner's
|
|
5
|
+
* `data-[side=*]`, with the zoom anchored to the `--transform-origin` Base UI exposes on
|
|
6
|
+
* the popup. Animation utilities (and their `duration-*`/`ease-*` bindings) come from
|
|
7
|
+
* `tailwindcss-animate`.
|
|
8
|
+
*
|
|
9
|
+
* The `data-closed` animation is essential: Base UI keeps the popup mounted until the
|
|
10
|
+
* exit animation finishes, so without it there is no close animation at all.
|
|
11
|
+
*
|
|
12
|
+
* Feel: a snappy 100ms, a barely-there 98% zoom, and a 2px directional slide. Enter eases
|
|
13
|
+
* out (natural deceleration as it appears); exit eases in (accelerates away — it shouldn't
|
|
14
|
+
* fight for attention). `data-instant` collapses the duration to 0 so Base UI's instant
|
|
15
|
+
* transitions (keyboard nav between items, grouped tooltips) don't stutter.
|
|
16
|
+
*/
|
|
17
|
+
export declare const popoverAnimationClasses: string[];
|
|
18
|
+
/**
|
|
19
|
+
* Small muted label over a group of items: sidebar sections, menu groups. One place so every
|
|
20
|
+
* eyebrow in the app shares its size and weight.
|
|
21
|
+
*/
|
|
22
|
+
export declare const eyebrowClasses = "text-[0.6875rem]/tight font-medium text-muted-foreground";
|
|
23
|
+
/**
|
|
24
|
+
* Muted supporting copy under a heading, label, or control. Matches the description
|
|
25
|
+
* size the settings rows already use, so a form reads the same in either layout.
|
|
26
|
+
*/
|
|
27
|
+
export declare const descriptionClasses = "text-pretty text-muted-foreground text-sm";
|
|
28
|
+
//#endregion
|
|
29
|
+
//# sourceMappingURL=classes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classes.d.ts","names":[],"sources":["../../src/lib/classes.ts"],"mappings":";;;;;;;;;;;;;;;;qBAea;;;;;qBAcA;;;;;qBAMA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
//#region src/lib/classes.ts
|
|
2
|
+
/**
|
|
3
|
+
* Enter/exit animation classes for Base UI popups (Menu, Select, Popover, Tooltip, …).
|
|
4
|
+
* Keyed on Base UI's `data-open`/`data-closed` state attributes and the positioner's
|
|
5
|
+
* `data-[side=*]`, with the zoom anchored to the `--transform-origin` Base UI exposes on
|
|
6
|
+
* the popup. Animation utilities (and their `duration-*`/`ease-*` bindings) come from
|
|
7
|
+
* `tailwindcss-animate`.
|
|
8
|
+
*
|
|
9
|
+
* The `data-closed` animation is essential: Base UI keeps the popup mounted until the
|
|
10
|
+
* exit animation finishes, so without it there is no close animation at all.
|
|
11
|
+
*
|
|
12
|
+
* Feel: a snappy 100ms, a barely-there 98% zoom, and a 2px directional slide. Enter eases
|
|
13
|
+
* out (natural deceleration as it appears); exit eases in (accelerates away — it shouldn't
|
|
14
|
+
* fight for attention). `data-instant` collapses the duration to 0 so Base UI's instant
|
|
15
|
+
* transitions (keyboard nav between items, grouped tooltips) don't stutter.
|
|
16
|
+
*/
|
|
17
|
+
const popoverAnimationClasses = [
|
|
18
|
+
"origin-(--transform-origin) duration-100 data-instant:duration-0",
|
|
19
|
+
"data-open:animate-in data-open:ease-out data-open:fade-in-0 data-open:zoom-in-98",
|
|
20
|
+
"data-closed:animate-out data-closed:ease-in data-closed:fade-out-0 data-closed:zoom-out-98",
|
|
21
|
+
"data-[side=bottom]:slide-in-from-top-2 data-[side=bottom]:slide-out-to-top-2",
|
|
22
|
+
"data-[side=left]:slide-in-from-right-2 data-[side=left]:slide-out-to-right-2",
|
|
23
|
+
"data-[side=right]:slide-in-from-left-2 data-[side=right]:slide-out-to-left-2",
|
|
24
|
+
"data-[side=top]:slide-in-from-bottom-2 data-[side=top]:slide-out-to-bottom-2"
|
|
25
|
+
];
|
|
26
|
+
/**
|
|
27
|
+
* Small muted label over a group of items: sidebar sections, menu groups. One place so every
|
|
28
|
+
* eyebrow in the app shares its size and weight.
|
|
29
|
+
*/
|
|
30
|
+
const eyebrowClasses = "text-[0.6875rem]/tight font-medium text-muted-foreground";
|
|
31
|
+
/**
|
|
32
|
+
* Muted supporting copy under a heading, label, or control. Matches the description
|
|
33
|
+
* size the settings rows already use, so a form reads the same in either layout.
|
|
34
|
+
*/
|
|
35
|
+
const descriptionClasses = "text-pretty text-muted-foreground text-sm";
|
|
36
|
+
//#endregion
|
|
37
|
+
export { descriptionClasses, eyebrowClasses, popoverAnimationClasses };
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=classes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classes.js","names":[],"sources":["../../src/lib/classes.ts"],"sourcesContent":["/**\n * Enter/exit animation classes for Base UI popups (Menu, Select, Popover, Tooltip, …).\n * Keyed on Base UI's `data-open`/`data-closed` state attributes and the positioner's\n * `data-[side=*]`, with the zoom anchored to the `--transform-origin` Base UI exposes on\n * the popup. Animation utilities (and their `duration-*`/`ease-*` bindings) come from\n * `tailwindcss-animate`.\n *\n * The `data-closed` animation is essential: Base UI keeps the popup mounted until the\n * exit animation finishes, so without it there is no close animation at all.\n *\n * Feel: a snappy 100ms, a barely-there 98% zoom, and a 2px directional slide. Enter eases\n * out (natural deceleration as it appears); exit eases in (accelerates away — it shouldn't\n * fight for attention). `data-instant` collapses the duration to 0 so Base UI's instant\n * transitions (keyboard nav between items, grouped tooltips) don't stutter.\n */\nexport const popoverAnimationClasses = [\n \"origin-(--transform-origin) duration-100 data-instant:duration-0\",\n \"data-open:animate-in data-open:ease-out data-open:fade-in-0 data-open:zoom-in-98\",\n \"data-closed:animate-out data-closed:ease-in data-closed:fade-out-0 data-closed:zoom-out-98\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=bottom]:slide-out-to-top-2\",\n \"data-[side=left]:slide-in-from-right-2 data-[side=left]:slide-out-to-right-2\",\n \"data-[side=right]:slide-in-from-left-2 data-[side=right]:slide-out-to-left-2\",\n \"data-[side=top]:slide-in-from-bottom-2 data-[side=top]:slide-out-to-bottom-2\",\n]\n\n/**\n * Small muted label over a group of items: sidebar sections, menu groups. One place so every\n * eyebrow in the app shares its size and weight.\n */\nexport const eyebrowClasses = \"text-[0.6875rem]/tight font-medium text-muted-foreground\"\n\n/**\n * Muted supporting copy under a heading, label, or control. Matches the description\n * size the settings rows already use, so a form reads the same in either layout.\n */\nexport const descriptionClasses = \"text-pretty text-muted-foreground text-sm\"\n"],"mappings":";;;;;;;;;;;;;;;;AAeA,MAAa,0BAA0B;CACrC;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;;;;AAMA,MAAa,iBAAiB;;;;;AAM9B,MAAa,qBAAqB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ComponentType } from "react";
|
|
2
|
+
import { HugeiconsProps } from "@hugeicons/react";
|
|
3
|
+
//#region src/lib/icons.d.ts
|
|
4
|
+
export type IconProps = Omit<HugeiconsProps, "icon" | "altIcon" | "showAlt">;
|
|
5
|
+
export type IconComponent = ComponentType<IconProps>;
|
|
6
|
+
export declare const CheckIcon: IconComponent;
|
|
7
|
+
export declare const ChevronDownIcon: IconComponent;
|
|
8
|
+
export declare const ChevronLeftIcon: IconComponent;
|
|
9
|
+
export declare const ChevronRightIcon: IconComponent;
|
|
10
|
+
export declare const ChevronUpIcon: IconComponent;
|
|
11
|
+
export declare const ChevronsUpDownIcon: IconComponent;
|
|
12
|
+
export declare const CircleCheckIcon: IconComponent;
|
|
13
|
+
export declare const CircleHelpIcon: IconComponent;
|
|
14
|
+
export declare const CircleIcon: IconComponent;
|
|
15
|
+
export declare const CircleXIcon: IconComponent;
|
|
16
|
+
export declare const CopyIcon: IconComponent;
|
|
17
|
+
export declare const LoaderIcon: IconComponent;
|
|
18
|
+
export declare const SearchIcon: IconComponent;
|
|
19
|
+
export declare const XIcon: IconComponent;
|
|
20
|
+
//#endregion
|
|
21
|
+
//# sourceMappingURL=icons.d.ts.map
|