@krizaka/ui 2.0.0-beta.0 → 2.0.0-beta.2
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/README.md +52 -3
- package/dist/alert.d.ts +95 -0
- package/dist/alert.js +38 -0
- package/dist/alert.js.map +1 -0
- package/dist/button-G5qY4qSY.d.ts +68 -0
- package/dist/card.d.ts +227 -0
- package/dist/card.js +108 -0
- package/dist/card.js.map +1 -0
- package/dist/checkbox.d.ts +52 -0
- package/dist/checkbox.js +42 -0
- package/dist/checkbox.js.map +1 -0
- package/dist/chip.d.ts +97 -0
- package/dist/chip.js +93 -0
- package/dist/chip.js.map +1 -0
- package/dist/chunk-5AXLA4LK.js +13 -0
- package/dist/chunk-5AXLA4LK.js.map +1 -0
- package/dist/chunk-5FRYKFTO.js +121 -0
- package/dist/chunk-5FRYKFTO.js.map +1 -0
- package/dist/{chunk-CPMZS4XA.js → chunk-FJDSLNXK.js} +1 -1
- package/dist/chunk-FJDSLNXK.js.map +1 -0
- package/dist/chunk-J3NC6ER4.js +9 -0
- package/dist/chunk-J3NC6ER4.js.map +1 -0
- package/dist/chunk-QRG5RYEI.js +49 -0
- package/dist/chunk-QRG5RYEI.js.map +1 -0
- package/dist/cn.d.ts +3 -0
- package/dist/cn.js +1 -1
- package/dist/command.d.ts +156 -0
- package/dist/command.js +111 -0
- package/dist/command.js.map +1 -0
- package/dist/confirm-button.d.ts +23 -0
- package/dist/confirm-button.js +85 -0
- package/dist/confirm-button.js.map +1 -0
- package/dist/dialog-DGBY2grk.d.ts +147 -0
- package/dist/dialog.d.ts +28 -0
- package/dist/dialog.js +93 -0
- package/dist/dialog.js.map +1 -0
- package/dist/dropdown-menu.d.ts +71 -0
- package/dist/dropdown-menu.js +66 -0
- package/dist/dropdown-menu.js.map +1 -0
- package/dist/field.js +1 -1
- package/dist/kbd.d.ts +24 -0
- package/dist/kbd.js +16 -0
- package/dist/kbd.js.map +1 -0
- package/dist/motion.css +7 -1
- package/dist/page-header.d.ts +77 -0
- package/dist/page-header.js +32 -0
- package/dist/page-header.js.map +1 -0
- package/dist/popover.d.ts +18 -0
- package/dist/popover.js +34 -0
- package/dist/popover.js.map +1 -0
- package/dist/progress.d.ts +87 -0
- package/dist/progress.js +85 -0
- package/dist/progress.js.map +1 -0
- package/dist/radio-group.d.ts +77 -0
- package/dist/radio-group.js +48 -0
- package/dist/radio-group.js.map +1 -0
- package/dist/separator.d.ts +24 -0
- package/dist/separator.js +17 -0
- package/dist/separator.js.map +1 -0
- package/dist/slider.d.ts +88 -0
- package/dist/slider.js +82 -0
- package/dist/slider.js.map +1 -0
- package/dist/stat.d.ts +75 -0
- package/dist/stat.js +42 -0
- package/dist/stat.js.map +1 -0
- package/dist/switch.d.ts +72 -0
- package/dist/switch.js +38 -0
- package/dist/switch.js.map +1 -0
- package/dist/tabs.d.ts +83 -0
- package/dist/tabs.js +60 -0
- package/dist/tabs.js.map +1 -0
- package/dist/theme.d.ts +2 -59
- package/dist/theme.js +13 -34
- package/dist/theme.js.map +1 -1
- package/dist/toast.d.ts +32 -0
- package/dist/toast.js +49 -0
- package/dist/toast.js.map +1 -0
- package/dist/tooltip.d.ts +21 -0
- package/dist/tooltip.js +44 -0
- package/dist/tooltip.js.map +1 -0
- package/package.json +291 -5
- package/dist/chunk-CPMZS4XA.js.map +0 -1
package/dist/progress.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// src/progress/progress.tsx
|
|
2
|
+
import { tv } from "tailwind-variants";
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
var progress = tv({
|
|
5
|
+
slots: {
|
|
6
|
+
root: "relative",
|
|
7
|
+
track: "",
|
|
8
|
+
indicator: "",
|
|
9
|
+
center: "absolute inset-0 flex flex-col items-center justify-center text-center"
|
|
10
|
+
},
|
|
11
|
+
variants: {
|
|
12
|
+
variant: {
|
|
13
|
+
bar: {
|
|
14
|
+
root: "w-full overflow-hidden rounded-full bg-surface-3",
|
|
15
|
+
indicator: "kz-progress h-full rounded-full bg-linear-to-r from-accent to-accent-2 transition-[width] duration-500 motion-reduce:transition-none data-[state=indeterminate]:w-2/5"
|
|
16
|
+
},
|
|
17
|
+
ring: {
|
|
18
|
+
root: "inline-flex shrink-0 items-center justify-center",
|
|
19
|
+
track: "stroke-border-default",
|
|
20
|
+
indicator: "stroke-accent transition-[stroke-dashoffset] duration-1000 motion-reduce:transition-none data-[state=indeterminate]:origin-center data-[state=indeterminate]:animate-spin motion-reduce:data-[state=indeterminate]:animate-none"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
size: { sm: {}, md: {}, lg: {} }
|
|
24
|
+
},
|
|
25
|
+
compoundVariants: [
|
|
26
|
+
{ variant: "bar", size: "sm", class: { root: "h-1" } },
|
|
27
|
+
{ variant: "bar", size: "md", class: { root: "h-2" } },
|
|
28
|
+
{ variant: "bar", size: "lg", class: { root: "h-3" } },
|
|
29
|
+
{ variant: "ring", size: "sm", class: { root: "h-10 w-10" } },
|
|
30
|
+
{ variant: "ring", size: "md", class: { root: "h-20 w-20" } },
|
|
31
|
+
{ variant: "ring", size: "lg", class: { root: "h-36 w-36" } }
|
|
32
|
+
],
|
|
33
|
+
defaultVariants: { variant: "bar", size: "md" }
|
|
34
|
+
});
|
|
35
|
+
var STROKE = { sm: 12, md: 9, lg: 7 };
|
|
36
|
+
function Progress({ variant = "bar", size = "md", value, max = 100, label, valueText, className, children, ...props }) {
|
|
37
|
+
const s = progress({ variant, size });
|
|
38
|
+
const known = typeof value === "number" && Number.isFinite(value);
|
|
39
|
+
const ratio = known ? Math.min(1, Math.max(0, value / (max || 1))) : 0;
|
|
40
|
+
const percent = Math.round(ratio * 100);
|
|
41
|
+
const state = !known ? "indeterminate" : ratio >= 1 ? "complete" : "loading";
|
|
42
|
+
const aria = {
|
|
43
|
+
role: "progressbar",
|
|
44
|
+
"aria-label": label,
|
|
45
|
+
"aria-valuemin": known ? 0 : void 0,
|
|
46
|
+
"aria-valuemax": known ? max : void 0,
|
|
47
|
+
"aria-valuenow": known ? Math.min(max, Math.max(0, value)) : void 0,
|
|
48
|
+
"aria-valuetext": known ? valueText ?? `${percent}%` : valueText,
|
|
49
|
+
"data-state": state,
|
|
50
|
+
"data-value": known ? value : void 0,
|
|
51
|
+
"data-variant": variant
|
|
52
|
+
};
|
|
53
|
+
if (variant === "ring") {
|
|
54
|
+
const stroke = STROKE[size];
|
|
55
|
+
const r = 50 - stroke / 2;
|
|
56
|
+
return /* @__PURE__ */ jsxs("div", { ...aria, className: s.root({ className }), ...props, children: [
|
|
57
|
+
/* @__PURE__ */ jsxs("svg", { viewBox: "0 0 100 100", className: "h-full w-full -rotate-90", "aria-hidden": true, children: [
|
|
58
|
+
/* @__PURE__ */ jsx("circle", { cx: "50", cy: "50", r, fill: "none", strokeWidth: stroke, className: s.track() }),
|
|
59
|
+
/* @__PURE__ */ jsx(
|
|
60
|
+
"circle",
|
|
61
|
+
{
|
|
62
|
+
cx: "50",
|
|
63
|
+
cy: "50",
|
|
64
|
+
r,
|
|
65
|
+
fill: "none",
|
|
66
|
+
strokeWidth: stroke,
|
|
67
|
+
strokeLinecap: "round",
|
|
68
|
+
pathLength: 100,
|
|
69
|
+
strokeDasharray: 100,
|
|
70
|
+
strokeDashoffset: known ? 100 - percent : 75,
|
|
71
|
+
"data-state": state,
|
|
72
|
+
className: s.indicator()
|
|
73
|
+
}
|
|
74
|
+
)
|
|
75
|
+
] }),
|
|
76
|
+
children !== void 0 && /* @__PURE__ */ jsx("div", { className: s.center(), children })
|
|
77
|
+
] });
|
|
78
|
+
}
|
|
79
|
+
return /* @__PURE__ */ jsx("div", { ...aria, className: s.root({ className }), ...props, children: /* @__PURE__ */ jsx("div", { "data-state": state, className: s.indicator(), style: known ? { width: `${ratio * 100}%` } : void 0 }) });
|
|
80
|
+
}
|
|
81
|
+
export {
|
|
82
|
+
Progress,
|
|
83
|
+
progress
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/progress/progress.tsx"],"sourcesContent":["// Server-safe: no hook, no context. role=\"progressbar\" with aria-valuenow / aria-valuemax (none when indeterminate),\n// named by `label`. A bar or a ring; the ring can hold content in its centre (an amount, a percentage).\nimport type * as React from \"react\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nexport const progress = tv({\n slots: {\n root: \"relative\",\n track: \"\",\n indicator: \"\",\n center: \"absolute inset-0 flex flex-col items-center justify-center text-center\",\n },\n variants: {\n variant: {\n bar: {\n root: \"w-full overflow-hidden rounded-full bg-surface-3\",\n indicator:\n \"kz-progress h-full rounded-full bg-linear-to-r from-accent to-accent-2 transition-[width] duration-500 motion-reduce:transition-none \" +\n \"data-[state=indeterminate]:w-2/5\",\n },\n ring: {\n root: \"inline-flex shrink-0 items-center justify-center\",\n track: \"stroke-border-default\",\n indicator:\n \"stroke-accent transition-[stroke-dashoffset] duration-1000 motion-reduce:transition-none \" +\n \"data-[state=indeterminate]:origin-center data-[state=indeterminate]:animate-spin motion-reduce:data-[state=indeterminate]:animate-none\",\n },\n },\n size: { sm: {}, md: {}, lg: {} },\n },\n compoundVariants: [\n { variant: \"bar\", size: \"sm\", class: { root: \"h-1\" } },\n { variant: \"bar\", size: \"md\", class: { root: \"h-2\" } },\n { variant: \"bar\", size: \"lg\", class: { root: \"h-3\" } },\n { variant: \"ring\", size: \"sm\", class: { root: \"h-10 w-10\" } },\n { variant: \"ring\", size: \"md\", class: { root: \"h-20 w-20\" } },\n { variant: \"ring\", size: \"lg\", class: { root: \"h-36 w-36\" } },\n ],\n defaultVariants: { variant: \"bar\", size: \"md\" },\n});\n\nexport type ProgressVariants = VariantProps<typeof progress>;\n\nexport type ProgressProps = Omit<React.ComponentProps<\"div\">, \"children\"> &\n ProgressVariants & {\n /** How far, between 0 and `max`. `null` or absent: indeterminate (a wait of unknown length). */\n value?: number | null;\n max?: number;\n /** The accessible name — passed translated (\"Upload\", \"Raised towards the goal\"). */\n label: string;\n /** The value in words for assistive technology (\"$420 of $1,000\") — default: the percentage. */\n valueText?: string;\n /** A ring's centre: an amount, a percentage, an icon. */\n children?: React.ReactNode;\n };\n\nconst STROKE = { sm: 12, md: 9, lg: 7 } as const;\n\n/** A progress bar or ring: `value` / `max`, indeterminate without a value. State: `data-state` (loading · complete · indeterminate). */\nexport function Progress({ variant = \"bar\", size = \"md\", value, max = 100, label, valueText, className, children, ...props }: ProgressProps) {\n const s = progress({ variant, size });\n const known = typeof value === \"number\" && Number.isFinite(value);\n const ratio = known ? Math.min(1, Math.max(0, value / (max || 1))) : 0;\n const percent = Math.round(ratio * 100);\n const state = !known ? \"indeterminate\" : ratio >= 1 ? \"complete\" : \"loading\";\n const aria = {\n role: \"progressbar\" as const,\n \"aria-label\": label,\n \"aria-valuemin\": known ? 0 : undefined,\n \"aria-valuemax\": known ? max : undefined,\n \"aria-valuenow\": known ? Math.min(max, Math.max(0, value)) : undefined,\n \"aria-valuetext\": known ? (valueText ?? `${percent}%`) : valueText,\n \"data-state\": state,\n \"data-value\": known ? value : undefined,\n \"data-variant\": variant,\n };\n if (variant === \"ring\") {\n const stroke = STROKE[size];\n const r = 50 - stroke / 2;\n return (\n <div {...aria} className={s.root({ className })} {...props}>\n <svg viewBox=\"0 0 100 100\" className=\"h-full w-full -rotate-90\" aria-hidden>\n <circle cx=\"50\" cy=\"50\" r={r} fill=\"none\" strokeWidth={stroke} className={s.track()} />\n <circle\n cx=\"50\"\n cy=\"50\"\n r={r}\n fill=\"none\"\n strokeWidth={stroke}\n strokeLinecap=\"round\"\n pathLength={100}\n strokeDasharray={100}\n strokeDashoffset={known ? 100 - percent : 75}\n data-state={state}\n className={s.indicator()}\n />\n </svg>\n {children !== undefined && <div className={s.center()}>{children}</div>}\n </div>\n );\n }\n return (\n <div {...aria} className={s.root({ className })} {...props}>\n <div data-state={state} className={s.indicator()} style={known ? { width: `${ratio * 100}%` } : undefined} />\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import * as tailwind_variants from 'tailwind-variants';
|
|
2
|
+
import { RadioGroup as RadioGroup$1 } from 'radix-ui';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
|
|
5
|
+
declare const radioGroup: tailwind_variants.TVReturnType<{
|
|
6
|
+
[key: string]: {
|
|
7
|
+
[key: string]: tailwind_variants.ClassValue | {
|
|
8
|
+
root?: tailwind_variants.ClassValue;
|
|
9
|
+
dot?: tailwind_variants.ClassValue;
|
|
10
|
+
label?: tailwind_variants.ClassValue;
|
|
11
|
+
item?: tailwind_variants.ClassValue;
|
|
12
|
+
card?: tailwind_variants.ClassValue;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
} | {
|
|
16
|
+
[x: string]: {
|
|
17
|
+
[x: string]: tailwind_variants.ClassValue | {
|
|
18
|
+
root?: tailwind_variants.ClassValue;
|
|
19
|
+
dot?: tailwind_variants.ClassValue;
|
|
20
|
+
label?: tailwind_variants.ClassValue;
|
|
21
|
+
item?: tailwind_variants.ClassValue;
|
|
22
|
+
card?: tailwind_variants.ClassValue;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
} | {}, {
|
|
26
|
+
root: string;
|
|
27
|
+
item: string;
|
|
28
|
+
dot: string;
|
|
29
|
+
label: string;
|
|
30
|
+
card: string;
|
|
31
|
+
}, undefined, {
|
|
32
|
+
[key: string]: {
|
|
33
|
+
[key: string]: tailwind_variants.ClassValue | {
|
|
34
|
+
root?: tailwind_variants.ClassValue;
|
|
35
|
+
dot?: tailwind_variants.ClassValue;
|
|
36
|
+
label?: tailwind_variants.ClassValue;
|
|
37
|
+
item?: tailwind_variants.ClassValue;
|
|
38
|
+
card?: tailwind_variants.ClassValue;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
} | {}, {
|
|
42
|
+
root: string;
|
|
43
|
+
item: string;
|
|
44
|
+
dot: string;
|
|
45
|
+
label: string;
|
|
46
|
+
card: string;
|
|
47
|
+
}, tailwind_variants.TVReturnTypeLike<unknown, {
|
|
48
|
+
root: string;
|
|
49
|
+
item: string;
|
|
50
|
+
dot: string;
|
|
51
|
+
label: string;
|
|
52
|
+
card: string;
|
|
53
|
+
}>>;
|
|
54
|
+
type RadioGroupRootProps = React.ComponentProps<typeof RadioGroup$1.Root> & {
|
|
55
|
+
/** The group's accessible name — passed translated (or `aria-labelledby` a visible heading). */
|
|
56
|
+
label?: string;
|
|
57
|
+
/** Marks every radio invalid: aria-invalid (pair it with a `Field.Error`). */
|
|
58
|
+
invalid?: boolean;
|
|
59
|
+
};
|
|
60
|
+
/** `value`/`defaultValue` + `onValueChange`, `orientation`, `required`, `name` for a form. */
|
|
61
|
+
declare function RadioGroupRoot({ label, invalid, className, ...props }: RadioGroupRootProps): React.JSX.Element;
|
|
62
|
+
type RadioGroupItemProps = Omit<React.ComponentProps<typeof RadioGroup$1.Item>, "children"> & {
|
|
63
|
+
/** The words next to the dot, clickable. Otherwise name it with `Field.Label htmlFor` or `aria-label`. */
|
|
64
|
+
children?: React.ReactNode;
|
|
65
|
+
};
|
|
66
|
+
/** A radio: a dot, and its words when given. */
|
|
67
|
+
declare function RadioGroupItem({ className, children, ...props }: RadioGroupItemProps): React.JSX.Element;
|
|
68
|
+
/** A whole card as the radio: its content is the radio's name. `data-state="checked"` styles the chosen one. */
|
|
69
|
+
declare function RadioGroupCard({ className, ...props }: React.ComponentProps<typeof RadioGroup$1.Item>): React.JSX.Element;
|
|
70
|
+
/** `RadioGroup.Root/Item/Card`. */
|
|
71
|
+
declare const RadioGroup: {
|
|
72
|
+
Root: typeof RadioGroupRoot;
|
|
73
|
+
Item: typeof RadioGroupItem;
|
|
74
|
+
Card: typeof RadioGroupCard;
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
export { RadioGroup, RadioGroupCard, RadioGroupItem, type RadioGroupItemProps, RadioGroupRoot, type RadioGroupRootProps, radioGroup };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/radio-group/radio-group.tsx
|
|
4
|
+
import { RadioGroup as RadioGroupPrimitive } from "radix-ui";
|
|
5
|
+
import { tv } from "tailwind-variants";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
var radioGroup = tv({
|
|
8
|
+
slots: {
|
|
9
|
+
root: "grid gap-2 data-[orientation=horizontal]:flex data-[orientation=horizontal]:flex-wrap",
|
|
10
|
+
item: "peer inline-flex h-5 w-5 shrink-0 items-center justify-center rounded-full border border-border-strong bg-surface-1 transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-surface-0 hover:border-accent disabled:cursor-not-allowed disabled:opacity-40 data-[state=checked]:border-accent aria-invalid:border-danger",
|
|
11
|
+
dot: "h-2.5 w-2.5 rounded-full bg-accent",
|
|
12
|
+
label: "flex cursor-pointer items-start gap-3 text-sm text-fg has-disabled:cursor-not-allowed has-disabled:opacity-60",
|
|
13
|
+
card: "relative flex min-w-0 flex-col items-start gap-1 rounded-xl border border-border-default bg-surface-1 p-3 text-left text-sm text-fg transition-colors hover:border-border-strong focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-40 data-[state=checked]:border-accent data-[state=checked]:bg-accent-soft data-[state=checked]:shadow-sm"
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
var s = radioGroup();
|
|
17
|
+
function RadioGroupRoot({ label, invalid, className, ...props }) {
|
|
18
|
+
return /* @__PURE__ */ jsx(
|
|
19
|
+
RadioGroupPrimitive.Root,
|
|
20
|
+
{
|
|
21
|
+
"aria-label": label,
|
|
22
|
+
"aria-invalid": invalid || void 0,
|
|
23
|
+
"data-invalid": invalid ? "" : void 0,
|
|
24
|
+
className: s.root({ className }),
|
|
25
|
+
...props
|
|
26
|
+
}
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
function RadioGroupItem({ className, children, ...props }) {
|
|
30
|
+
const item = /* @__PURE__ */ jsx(RadioGroupPrimitive.Item, { className: s.item({ className: children ? "mt-0.5" : className }), ...props, children: /* @__PURE__ */ jsx(RadioGroupPrimitive.Indicator, { className: s.dot() }) });
|
|
31
|
+
if (!children) return item;
|
|
32
|
+
return /* @__PURE__ */ jsxs("label", { className: s.label({ className }), children: [
|
|
33
|
+
item,
|
|
34
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0", children })
|
|
35
|
+
] });
|
|
36
|
+
}
|
|
37
|
+
function RadioGroupCard({ className, ...props }) {
|
|
38
|
+
return /* @__PURE__ */ jsx(RadioGroupPrimitive.Item, { className: s.card({ className }), ...props });
|
|
39
|
+
}
|
|
40
|
+
var RadioGroup = { Root: RadioGroupRoot, Item: RadioGroupItem, Card: RadioGroupCard };
|
|
41
|
+
export {
|
|
42
|
+
RadioGroup,
|
|
43
|
+
RadioGroupCard,
|
|
44
|
+
RadioGroupItem,
|
|
45
|
+
RadioGroupRoot,
|
|
46
|
+
radioGroup
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=radio-group.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/radio-group/radio-group.tsx"],"sourcesContent":["// Client (a context). Radix RadioGroup: role=\"radiogroup\" / \"radio\", one tab stop, the arrows move and select, a\n// hidden input inside a form. Two looks: `RadioGroup.Item` (a dot and its words) and `RadioGroup.Card` (a whole card\n// is the radio: an amount, a pack, a payment method, a plan).\nimport { RadioGroup as RadioGroupPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nexport const radioGroup = tv({\n slots: {\n root: \"grid gap-2 data-[orientation=horizontal]:flex data-[orientation=horizontal]:flex-wrap\",\n item:\n \"peer inline-flex h-5 w-5 shrink-0 items-center justify-center rounded-full border border-border-strong bg-surface-1 transition-colors \" +\n \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-surface-0 \" +\n \"hover:border-accent disabled:cursor-not-allowed disabled:opacity-40 data-[state=checked]:border-accent aria-invalid:border-danger\",\n dot: \"h-2.5 w-2.5 rounded-full bg-accent\",\n label: \"flex cursor-pointer items-start gap-3 text-sm text-fg has-disabled:cursor-not-allowed has-disabled:opacity-60\",\n card:\n \"relative flex min-w-0 flex-col items-start gap-1 rounded-xl border border-border-default bg-surface-1 p-3 text-left text-sm text-fg transition-colors \" +\n \"hover:border-border-strong focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring \" +\n \"disabled:cursor-not-allowed disabled:opacity-40 data-[state=checked]:border-accent data-[state=checked]:bg-accent-soft \" +\n \"data-[state=checked]:shadow-sm\",\n },\n});\nconst s = radioGroup();\n\nexport type RadioGroupRootProps = React.ComponentProps<typeof RadioGroupPrimitive.Root> & {\n /** The group's accessible name — passed translated (or `aria-labelledby` a visible heading). */\n label?: string;\n /** Marks every radio invalid: aria-invalid (pair it with a `Field.Error`). */\n invalid?: boolean;\n};\n\n/** `value`/`defaultValue` + `onValueChange`, `orientation`, `required`, `name` for a form. */\nexport function RadioGroupRoot({ label, invalid, className, ...props }: RadioGroupRootProps) {\n return (\n <RadioGroupPrimitive.Root\n aria-label={label}\n aria-invalid={invalid || undefined}\n data-invalid={invalid ? \"\" : undefined}\n className={s.root({ className })}\n {...props}\n />\n );\n}\n\nexport type RadioGroupItemProps = Omit<React.ComponentProps<typeof RadioGroupPrimitive.Item>, \"children\"> & {\n /** The words next to the dot, clickable. Otherwise name it with `Field.Label htmlFor` or `aria-label`. */\n children?: React.ReactNode;\n};\n\n/** A radio: a dot, and its words when given. */\nexport function RadioGroupItem({ className, children, ...props }: RadioGroupItemProps) {\n const item = (\n <RadioGroupPrimitive.Item className={s.item({ className: children ? \"mt-0.5\" : className })} {...props}>\n <RadioGroupPrimitive.Indicator className={s.dot()} />\n </RadioGroupPrimitive.Item>\n );\n if (!children) return item;\n return (\n <label className={s.label({ className })}>\n {item}\n <span className=\"min-w-0\">{children}</span>\n </label>\n );\n}\n\n/** A whole card as the radio: its content is the radio's name. `data-state=\"checked\"` styles the chosen one. */\nexport function RadioGroupCard({ className, ...props }: React.ComponentProps<typeof RadioGroupPrimitive.Item>) {\n return <RadioGroupPrimitive.Item className={s.card({ className })} {...props} />;\n}\n\n/** `RadioGroup.Root/Item/Card`. */\nexport const RadioGroup = { Root: RadioGroupRoot, Item: RadioGroupItem, Card: RadioGroupCard };\n"],"mappings":";;;AAGA,SAAS,cAAc,2BAA2B;AAElD,SAAS,UAAU;AA8Bf,cAwBA,YAxBA;AA5BG,IAAM,aAAa,GAAG;AAAA,EAC3B,OAAO;AAAA,IACL,MAAM;AAAA,IACN,MACE;AAAA,IAGF,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MACE;AAAA,EAIJ;AACF,CAAC;AACD,IAAM,IAAI,WAAW;AAUd,SAAS,eAAe,EAAE,OAAO,SAAS,WAAW,GAAG,MAAM,GAAwB;AAC3F,SACE;AAAA,IAAC,oBAAoB;AAAA,IAApB;AAAA,MACC,cAAY;AAAA,MACZ,gBAAc,WAAW;AAAA,MACzB,gBAAc,UAAU,KAAK;AAAA,MAC7B,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC;AAAA,MAC9B,GAAG;AAAA;AAAA,EACN;AAEJ;AAQO,SAAS,eAAe,EAAE,WAAW,UAAU,GAAG,MAAM,GAAwB;AACrF,QAAM,OACJ,oBAAC,oBAAoB,MAApB,EAAyB,WAAW,EAAE,KAAK,EAAE,WAAW,WAAW,WAAW,UAAU,CAAC,GAAI,GAAG,OAC/F,8BAAC,oBAAoB,WAApB,EAA8B,WAAW,EAAE,IAAI,GAAG,GACrD;AAEF,MAAI,CAAC,SAAU,QAAO;AACtB,SACE,qBAAC,WAAM,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,GACpC;AAAA;AAAA,IACD,oBAAC,UAAK,WAAU,WAAW,UAAS;AAAA,KACtC;AAEJ;AAGO,SAAS,eAAe,EAAE,WAAW,GAAG,MAAM,GAA0D;AAC7G,SAAO,oBAAC,oBAAoB,MAApB,EAAyB,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,GAAI,GAAG,OAAO;AAChF;AAGO,IAAM,aAAa,EAAE,MAAM,gBAAgB,MAAM,gBAAgB,MAAM,eAAe;","names":[]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as tailwind_variants from 'tailwind-variants';
|
|
2
|
+
import { Separator as Separator$1 } from 'radix-ui';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
|
|
5
|
+
declare const separatorVariants: tailwind_variants.TVReturnType<{
|
|
6
|
+
orientation: {
|
|
7
|
+
horizontal: "h-px w-full";
|
|
8
|
+
vertical: "h-full w-px self-stretch";
|
|
9
|
+
};
|
|
10
|
+
}, undefined, "shrink-0 bg-border-default", {
|
|
11
|
+
orientation: {
|
|
12
|
+
horizontal: "h-px w-full";
|
|
13
|
+
vertical: "h-full w-px self-stretch";
|
|
14
|
+
};
|
|
15
|
+
}, undefined, tailwind_variants.TVReturnTypeLike<{
|
|
16
|
+
orientation: {
|
|
17
|
+
horizontal: "h-px w-full";
|
|
18
|
+
vertical: "h-full w-px self-stretch";
|
|
19
|
+
};
|
|
20
|
+
}, undefined>>;
|
|
21
|
+
type SeparatorProps = React.ComponentProps<typeof Separator$1.Root>;
|
|
22
|
+
declare function Separator({ orientation, decorative, className, ...props }: SeparatorProps): React.JSX.Element;
|
|
23
|
+
|
|
24
|
+
export { Separator, type SeparatorProps, separatorVariants };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// src/separator/separator.tsx
|
|
2
|
+
import { Separator as SeparatorPrimitive } from "radix-ui";
|
|
3
|
+
import { tv } from "tailwind-variants";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
var separatorVariants = tv({
|
|
6
|
+
base: "shrink-0 bg-border-default",
|
|
7
|
+
variants: { orientation: { horizontal: "h-px w-full", vertical: "h-full w-px self-stretch" } },
|
|
8
|
+
defaultVariants: { orientation: "horizontal" }
|
|
9
|
+
});
|
|
10
|
+
function Separator({ orientation = "horizontal", decorative = true, className, ...props }) {
|
|
11
|
+
return /* @__PURE__ */ jsx(SeparatorPrimitive.Root, { orientation, decorative, className: separatorVariants({ orientation, className }), ...props });
|
|
12
|
+
}
|
|
13
|
+
export {
|
|
14
|
+
Separator,
|
|
15
|
+
separatorVariants
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=separator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/separator/separator.tsx"],"sourcesContent":["// Server-safe. A line between groups: decorative by default (hidden from assistive technology), or a real\n// `role=\"separator\"` with `decorative={false}`.\nimport { Separator as SeparatorPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nexport const separatorVariants = tv({\n base: \"shrink-0 bg-border-default\",\n variants: { orientation: { horizontal: \"h-px w-full\", vertical: \"h-full w-px self-stretch\" } },\n defaultVariants: { orientation: \"horizontal\" },\n});\n\nexport type SeparatorProps = React.ComponentProps<typeof SeparatorPrimitive.Root>;\n\nexport function Separator({ orientation = \"horizontal\", decorative = true, className, ...props }: SeparatorProps) {\n return <SeparatorPrimitive.Root orientation={orientation} decorative={decorative} className={separatorVariants({ orientation, className })} {...props} />;\n}\n"],"mappings":";AAEA,SAAS,aAAa,0BAA0B;AAEhD,SAAS,UAAU;AAWV;AATF,IAAM,oBAAoB,GAAG;AAAA,EAClC,MAAM;AAAA,EACN,UAAU,EAAE,aAAa,EAAE,YAAY,eAAe,UAAU,2BAA2B,EAAE;AAAA,EAC7F,iBAAiB,EAAE,aAAa,aAAa;AAC/C,CAAC;AAIM,SAAS,UAAU,EAAE,cAAc,cAAc,aAAa,MAAM,WAAW,GAAG,MAAM,GAAmB;AAChH,SAAO,oBAAC,mBAAmB,MAAnB,EAAwB,aAA0B,YAAwB,WAAW,kBAAkB,EAAE,aAAa,UAAU,CAAC,GAAI,GAAG,OAAO;AACzJ;","names":[]}
|
package/dist/slider.d.ts
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import * as tailwind_variants from 'tailwind-variants';
|
|
2
|
+
import { Slider as Slider$1 } from 'radix-ui';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
|
|
5
|
+
declare const slider: tailwind_variants.TVReturnType<{
|
|
6
|
+
[key: string]: {
|
|
7
|
+
[key: string]: tailwind_variants.ClassValue | {
|
|
8
|
+
root?: tailwind_variants.ClassValue;
|
|
9
|
+
header?: tailwind_variants.ClassValue;
|
|
10
|
+
value?: tailwind_variants.ClassValue;
|
|
11
|
+
control?: tailwind_variants.ClassValue;
|
|
12
|
+
track?: tailwind_variants.ClassValue;
|
|
13
|
+
range?: tailwind_variants.ClassValue;
|
|
14
|
+
thumb?: tailwind_variants.ClassValue;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
} | {
|
|
18
|
+
[x: string]: {
|
|
19
|
+
[x: string]: tailwind_variants.ClassValue | {
|
|
20
|
+
root?: tailwind_variants.ClassValue;
|
|
21
|
+
header?: tailwind_variants.ClassValue;
|
|
22
|
+
value?: tailwind_variants.ClassValue;
|
|
23
|
+
control?: tailwind_variants.ClassValue;
|
|
24
|
+
track?: tailwind_variants.ClassValue;
|
|
25
|
+
range?: tailwind_variants.ClassValue;
|
|
26
|
+
thumb?: tailwind_variants.ClassValue;
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
} | {}, {
|
|
30
|
+
root: string;
|
|
31
|
+
header: string;
|
|
32
|
+
value: string;
|
|
33
|
+
control: string;
|
|
34
|
+
track: string;
|
|
35
|
+
range: string;
|
|
36
|
+
thumb: string;
|
|
37
|
+
}, undefined, {
|
|
38
|
+
[key: string]: {
|
|
39
|
+
[key: string]: tailwind_variants.ClassValue | {
|
|
40
|
+
root?: tailwind_variants.ClassValue;
|
|
41
|
+
header?: tailwind_variants.ClassValue;
|
|
42
|
+
value?: tailwind_variants.ClassValue;
|
|
43
|
+
control?: tailwind_variants.ClassValue;
|
|
44
|
+
track?: tailwind_variants.ClassValue;
|
|
45
|
+
range?: tailwind_variants.ClassValue;
|
|
46
|
+
thumb?: tailwind_variants.ClassValue;
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
} | {}, {
|
|
50
|
+
root: string;
|
|
51
|
+
header: string;
|
|
52
|
+
value: string;
|
|
53
|
+
control: string;
|
|
54
|
+
track: string;
|
|
55
|
+
range: string;
|
|
56
|
+
thumb: string;
|
|
57
|
+
}, tailwind_variants.TVReturnTypeLike<unknown, {
|
|
58
|
+
root: string;
|
|
59
|
+
header: string;
|
|
60
|
+
value: string;
|
|
61
|
+
control: string;
|
|
62
|
+
track: string;
|
|
63
|
+
range: string;
|
|
64
|
+
thumb: string;
|
|
65
|
+
}>>;
|
|
66
|
+
type SliderValue = number | [number, number];
|
|
67
|
+
type SliderProps<V extends SliderValue = number> = Omit<React.ComponentProps<typeof Slider$1.Root>, "value" | "defaultValue" | "onValueChange" | "onValueCommit" | "children"> & {
|
|
68
|
+
/** One number (a thumb) or two (a range). Controlled with `onValueChange`. */
|
|
69
|
+
value?: V;
|
|
70
|
+
defaultValue?: V;
|
|
71
|
+
onValueChange?: (value: V) => void;
|
|
72
|
+
/** Called once the drag or the key press ends. */
|
|
73
|
+
onValueCommit?: (value: V) => void;
|
|
74
|
+
/** The accessible name — of the thumb, or of both thumbs of a range — passed translated. */
|
|
75
|
+
label: string;
|
|
76
|
+
/** For a range: each thumb's own name (["Minimum", "Maximum"]), passed translated. */
|
|
77
|
+
thumbLabels?: [string, string];
|
|
78
|
+
/** The value as words (aria-valuetext) and as shown: "1.5×", "−12 %", "3 min". */
|
|
79
|
+
formatValue?: (value: number) => string;
|
|
80
|
+
/** Shows the label and the value above the track. Without it, `label` only names the thumb. */
|
|
81
|
+
showLabel?: boolean;
|
|
82
|
+
/** Fills from this value instead of the minimum (a ±range from 0: brightness, balance). One thumb only. */
|
|
83
|
+
origin?: number;
|
|
84
|
+
};
|
|
85
|
+
/** A slider on one value or a range: `value`/`defaultValue` + `onValueChange`, `min`, `max`, `step`. */
|
|
86
|
+
declare function Slider<V extends SliderValue = number>({ value, defaultValue, onValueChange, onValueCommit, label, thumbLabels, formatValue, showLabel, origin, min, max, className, ...props }: SliderProps<V>): React.JSX.Element;
|
|
87
|
+
|
|
88
|
+
export { Slider, type SliderProps, type SliderValue, slider };
|
package/dist/slider.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/slider/slider.tsx
|
|
4
|
+
import { Slider as SliderPrimitive } from "radix-ui";
|
|
5
|
+
import * as React from "react";
|
|
6
|
+
import { tv } from "tailwind-variants";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
var slider = tv({
|
|
9
|
+
slots: {
|
|
10
|
+
root: "flex flex-col gap-2",
|
|
11
|
+
header: "flex items-baseline justify-between gap-3 text-xs font-semibold text-fg-secondary",
|
|
12
|
+
value: "font-mono text-[11px] tabular-nums text-fg-secondary",
|
|
13
|
+
control: "relative flex h-6 w-full touch-none select-none items-center data-disabled:cursor-not-allowed data-disabled:opacity-40",
|
|
14
|
+
track: "relative h-1.5 w-full grow overflow-hidden rounded-full bg-surface-3",
|
|
15
|
+
range: "absolute h-full rounded-full bg-linear-to-r from-accent to-accent-2",
|
|
16
|
+
thumb: "block h-5 w-5 cursor-grab rounded-full border border-border-strong bg-fg-on-media shadow-md transition-[box-shadow] focus-visible:outline-hidden focus-visible:ring-4 focus-visible:ring-ring/50 active:cursor-grabbing"
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
var toArray = (v) => v === void 0 ? void 0 : typeof v === "number" ? [v] : v;
|
|
20
|
+
function Slider({
|
|
21
|
+
value,
|
|
22
|
+
defaultValue,
|
|
23
|
+
onValueChange,
|
|
24
|
+
onValueCommit,
|
|
25
|
+
label,
|
|
26
|
+
thumbLabels,
|
|
27
|
+
formatValue = String,
|
|
28
|
+
showLabel,
|
|
29
|
+
origin,
|
|
30
|
+
min = 0,
|
|
31
|
+
max = 100,
|
|
32
|
+
className,
|
|
33
|
+
...props
|
|
34
|
+
}) {
|
|
35
|
+
const s = slider();
|
|
36
|
+
const range = Array.isArray(value ?? defaultValue);
|
|
37
|
+
const [inner, setInner] = React.useState(() => toArray(defaultValue) ?? [min]);
|
|
38
|
+
const current = toArray(value) ?? inner;
|
|
39
|
+
const out = (next) => range ? next : next[0];
|
|
40
|
+
const pct = (v) => (v - min) / (max - min || 1) * 100;
|
|
41
|
+
const fill = origin !== void 0 && !range ? { left: `${Math.min(pct(origin), pct(current[0]))}%`, right: `${100 - Math.max(pct(origin), pct(current[0]))}%` } : void 0;
|
|
42
|
+
const id = React.useId();
|
|
43
|
+
return /* @__PURE__ */ jsxs("div", { className: s.root({ className }), "data-range": range ? "" : void 0, children: [
|
|
44
|
+
showLabel && /* @__PURE__ */ jsxs("div", { className: s.header(), children: [
|
|
45
|
+
/* @__PURE__ */ jsx("span", { id: `${id}-label`, children: label }),
|
|
46
|
+
/* @__PURE__ */ jsx("span", { className: s.value(), "aria-hidden": true, children: current.map(formatValue).join(" \u2013 ") })
|
|
47
|
+
] }),
|
|
48
|
+
/* @__PURE__ */ jsxs(
|
|
49
|
+
SliderPrimitive.Root,
|
|
50
|
+
{
|
|
51
|
+
min,
|
|
52
|
+
max,
|
|
53
|
+
value: current,
|
|
54
|
+
onValueChange: (next) => {
|
|
55
|
+
if (value === void 0) setInner(next);
|
|
56
|
+
onValueChange?.(out(next));
|
|
57
|
+
},
|
|
58
|
+
onValueCommit: onValueCommit && ((next) => onValueCommit(out(next))),
|
|
59
|
+
className: s.control(),
|
|
60
|
+
...props,
|
|
61
|
+
children: [
|
|
62
|
+
/* @__PURE__ */ jsx(SliderPrimitive.Track, { className: s.track(), children: fill ? /* @__PURE__ */ jsx("span", { "data-origin": "", className: s.range(), style: fill }) : /* @__PURE__ */ jsx(SliderPrimitive.Range, { className: s.range() }) }),
|
|
63
|
+
current.map((v, i) => /* @__PURE__ */ jsx(
|
|
64
|
+
SliderPrimitive.Thumb,
|
|
65
|
+
{
|
|
66
|
+
"aria-label": range ? thumbLabels?.[i] ?? label : showLabel ? void 0 : label,
|
|
67
|
+
"aria-labelledby": !range && showLabel ? `${id}-label` : void 0,
|
|
68
|
+
"aria-valuetext": formatValue(v),
|
|
69
|
+
className: s.thumb()
|
|
70
|
+
},
|
|
71
|
+
i
|
|
72
|
+
))
|
|
73
|
+
]
|
|
74
|
+
}
|
|
75
|
+
)
|
|
76
|
+
] });
|
|
77
|
+
}
|
|
78
|
+
export {
|
|
79
|
+
Slider,
|
|
80
|
+
slider
|
|
81
|
+
};
|
|
82
|
+
//# sourceMappingURL=slider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/slider/slider.tsx"],"sourcesContent":["// Client. Radix Slider: role=\"slider\" on each thumb, arrows / Page Up / Page Down / Home / End, a range with two\n// thumbs. The words arrive as props: `label` names the thumb(s), `formatValue` gives the aria-valuetext and the value\n// shown next to a visible label.\nimport { Slider as SliderPrimitive } from \"radix-ui\";\nimport * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nexport const slider = tv({\n slots: {\n root: \"flex flex-col gap-2\",\n header: \"flex items-baseline justify-between gap-3 text-xs font-semibold text-fg-secondary\",\n value: \"font-mono text-[11px] tabular-nums text-fg-secondary\",\n control:\n \"relative flex h-6 w-full touch-none select-none items-center data-disabled:cursor-not-allowed data-disabled:opacity-40\",\n track: \"relative h-1.5 w-full grow overflow-hidden rounded-full bg-surface-3\",\n range: \"absolute h-full rounded-full bg-linear-to-r from-accent to-accent-2\",\n thumb:\n \"block h-5 w-5 cursor-grab rounded-full border border-border-strong bg-fg-on-media shadow-md transition-[box-shadow] \" +\n \"focus-visible:outline-hidden focus-visible:ring-4 focus-visible:ring-ring/50 active:cursor-grabbing\",\n },\n});\n\nexport type SliderValue = number | [number, number];\n\nexport type SliderProps<V extends SliderValue = number> = Omit<\n React.ComponentProps<typeof SliderPrimitive.Root>,\n \"value\" | \"defaultValue\" | \"onValueChange\" | \"onValueCommit\" | \"children\"\n> & {\n /** One number (a thumb) or two (a range). Controlled with `onValueChange`. */\n value?: V;\n defaultValue?: V;\n onValueChange?: (value: V) => void;\n /** Called once the drag or the key press ends. */\n onValueCommit?: (value: V) => void;\n /** The accessible name — of the thumb, or of both thumbs of a range — passed translated. */\n label: string;\n /** For a range: each thumb's own name ([\"Minimum\", \"Maximum\"]), passed translated. */\n thumbLabels?: [string, string];\n /** The value as words (aria-valuetext) and as shown: \"1.5×\", \"−12 %\", \"3 min\". */\n formatValue?: (value: number) => string;\n /** Shows the label and the value above the track. Without it, `label` only names the thumb. */\n showLabel?: boolean;\n /** Fills from this value instead of the minimum (a ±range from 0: brightness, balance). One thumb only. */\n origin?: number;\n};\n\nconst toArray = (v: SliderValue | undefined) => (v === undefined ? undefined : typeof v === \"number\" ? [v] : v);\n\n/** A slider on one value or a range: `value`/`defaultValue` + `onValueChange`, `min`, `max`, `step`. */\nexport function Slider<V extends SliderValue = number>({\n value,\n defaultValue,\n onValueChange,\n onValueCommit,\n label,\n thumbLabels,\n formatValue = String,\n showLabel,\n origin,\n min = 0,\n max = 100,\n className,\n ...props\n}: SliderProps<V>) {\n const s = slider();\n const range = Array.isArray(value ?? defaultValue);\n const [inner, setInner] = React.useState(() => toArray(defaultValue) ?? [min]);\n const current = toArray(value) ?? inner;\n const out = (next: number[]) => (range ? next : next[0]) as V;\n const pct = (v: number) => ((v - min) / (max - min || 1)) * 100;\n const fill =\n origin !== undefined && !range\n ? { left: `${Math.min(pct(origin), pct(current[0]))}%`, right: `${100 - Math.max(pct(origin), pct(current[0]))}%` }\n : undefined;\n const id = React.useId();\n return (\n <div className={s.root({ className })} data-range={range ? \"\" : undefined}>\n {showLabel && (\n <div className={s.header()}>\n <span id={`${id}-label`}>{label}</span>\n <span className={s.value()} aria-hidden>\n {current.map(formatValue).join(\" – \")}\n </span>\n </div>\n )}\n <SliderPrimitive.Root\n min={min}\n max={max}\n value={current}\n onValueChange={(next) => {\n if (value === undefined) setInner(next);\n onValueChange?.(out(next));\n }}\n onValueCommit={onValueCommit && ((next) => onValueCommit(out(next)))}\n className={s.control()}\n {...props}\n >\n <SliderPrimitive.Track className={s.track()}>\n {fill ? <span data-origin=\"\" className={s.range()} style={fill} /> : <SliderPrimitive.Range className={s.range()} />}\n </SliderPrimitive.Track>\n {current.map((v, i) => (\n <SliderPrimitive.Thumb\n key={i}\n aria-label={range ? (thumbLabels?.[i] ?? label) : showLabel ? undefined : label}\n aria-labelledby={!range && showLabel ? `${id}-label` : undefined}\n aria-valuetext={formatValue(v)}\n className={s.thumb()}\n />\n ))}\n </SliderPrimitive.Root>\n </div>\n );\n}\n"],"mappings":";;;AAGA,SAAS,UAAU,uBAAuB;AAC1C,YAAY,WAAW;AACvB,SAAS,UAAU;AAyEX,SACE,KADF;AAvED,IAAM,SAAS,GAAG;AAAA,EACvB,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SACE;AAAA,IACF,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OACE;AAAA,EAEJ;AACF,CAAC;AA0BD,IAAM,UAAU,CAAC,MAAgC,MAAM,SAAY,SAAY,OAAO,MAAM,WAAW,CAAC,CAAC,IAAI;AAGtG,SAAS,OAAuC;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,MAAM;AAAA,EACN,MAAM;AAAA,EACN;AAAA,EACA,GAAG;AACL,GAAmB;AACjB,QAAM,IAAI,OAAO;AACjB,QAAM,QAAQ,MAAM,QAAQ,SAAS,YAAY;AACjD,QAAM,CAAC,OAAO,QAAQ,IAAU,eAAS,MAAM,QAAQ,YAAY,KAAK,CAAC,GAAG,CAAC;AAC7E,QAAM,UAAU,QAAQ,KAAK,KAAK;AAClC,QAAM,MAAM,CAAC,SAAoB,QAAQ,OAAO,KAAK,CAAC;AACtD,QAAM,MAAM,CAAC,OAAgB,IAAI,QAAQ,MAAM,OAAO,KAAM;AAC5D,QAAM,OACJ,WAAW,UAAa,CAAC,QACrB,EAAE,MAAM,GAAG,KAAK,IAAI,IAAI,MAAM,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,GAAG,MAAM,KAAK,IAAI,IAAI,MAAM,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,IAChH;AACN,QAAM,KAAW,YAAM;AACvB,SACE,qBAAC,SAAI,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,GAAG,cAAY,QAAQ,KAAK,QAC7D;AAAA,iBACC,qBAAC,SAAI,WAAW,EAAE,OAAO,GACvB;AAAA,0BAAC,UAAK,IAAI,GAAG,EAAE,UAAW,iBAAM;AAAA,MAChC,oBAAC,UAAK,WAAW,EAAE,MAAM,GAAG,eAAW,MACpC,kBAAQ,IAAI,WAAW,EAAE,KAAK,UAAK,GACtC;AAAA,OACF;AAAA,IAEF;AAAA,MAAC,gBAAgB;AAAA,MAAhB;AAAA,QACC;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,eAAe,CAAC,SAAS;AACvB,cAAI,UAAU,OAAW,UAAS,IAAI;AACtC,0BAAgB,IAAI,IAAI,CAAC;AAAA,QAC3B;AAAA,QACA,eAAe,kBAAkB,CAAC,SAAS,cAAc,IAAI,IAAI,CAAC;AAAA,QAClE,WAAW,EAAE,QAAQ;AAAA,QACpB,GAAG;AAAA,QAEJ;AAAA,8BAAC,gBAAgB,OAAhB,EAAsB,WAAW,EAAE,MAAM,GACvC,iBAAO,oBAAC,UAAK,eAAY,IAAG,WAAW,EAAE,MAAM,GAAG,OAAO,MAAM,IAAK,oBAAC,gBAAgB,OAAhB,EAAsB,WAAW,EAAE,MAAM,GAAG,GACpH;AAAA,UACC,QAAQ,IAAI,CAAC,GAAG,MACf;AAAA,YAAC,gBAAgB;AAAA,YAAhB;AAAA,cAEC,cAAY,QAAS,cAAc,CAAC,KAAK,QAAS,YAAY,SAAY;AAAA,cAC1E,mBAAiB,CAAC,SAAS,YAAY,GAAG,EAAE,WAAW;AAAA,cACvD,kBAAgB,YAAY,CAAC;AAAA,cAC7B,WAAW,EAAE,MAAM;AAAA;AAAA,YAJd;AAAA,UAKP,CACD;AAAA;AAAA;AAAA,IACH;AAAA,KACF;AAEJ;","names":[]}
|
package/dist/stat.d.ts
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import * as tailwind_variants from 'tailwind-variants';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
|
|
4
|
+
declare const stat: tailwind_variants.TVReturnType<{
|
|
5
|
+
trend: {
|
|
6
|
+
up: {
|
|
7
|
+
trend: string;
|
|
8
|
+
};
|
|
9
|
+
down: {
|
|
10
|
+
trend: string;
|
|
11
|
+
};
|
|
12
|
+
flat: {
|
|
13
|
+
trend: string;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
}, {
|
|
17
|
+
root: string;
|
|
18
|
+
label: string;
|
|
19
|
+
value: string;
|
|
20
|
+
meta: string;
|
|
21
|
+
trend: string;
|
|
22
|
+
hint: string;
|
|
23
|
+
}, undefined, {
|
|
24
|
+
trend: {
|
|
25
|
+
up: {
|
|
26
|
+
trend: string;
|
|
27
|
+
};
|
|
28
|
+
down: {
|
|
29
|
+
trend: string;
|
|
30
|
+
};
|
|
31
|
+
flat: {
|
|
32
|
+
trend: string;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
}, {
|
|
36
|
+
root: string;
|
|
37
|
+
label: string;
|
|
38
|
+
value: string;
|
|
39
|
+
meta: string;
|
|
40
|
+
trend: string;
|
|
41
|
+
hint: string;
|
|
42
|
+
}, tailwind_variants.TVReturnTypeLike<{
|
|
43
|
+
trend: {
|
|
44
|
+
up: {
|
|
45
|
+
trend: string;
|
|
46
|
+
};
|
|
47
|
+
down: {
|
|
48
|
+
trend: string;
|
|
49
|
+
};
|
|
50
|
+
flat: {
|
|
51
|
+
trend: string;
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
}, {
|
|
55
|
+
root: string;
|
|
56
|
+
label: string;
|
|
57
|
+
value: string;
|
|
58
|
+
meta: string;
|
|
59
|
+
trend: string;
|
|
60
|
+
hint: string;
|
|
61
|
+
}>>;
|
|
62
|
+
type StatTrend = "up" | "down" | "flat";
|
|
63
|
+
type StatProps = Omit<React.ComponentProps<"div">, "children"> & {
|
|
64
|
+
label: React.ReactNode;
|
|
65
|
+
value: React.ReactNode;
|
|
66
|
+
/** A line under the value: the period, the comparison. */
|
|
67
|
+
hint?: React.ReactNode;
|
|
68
|
+
/** The direction of the change; its arrow is decorative. */
|
|
69
|
+
trend?: StatTrend;
|
|
70
|
+
/** The change, in words, as read and shown (e.g. "+12 % vs last week") — the arrow alone says nothing. */
|
|
71
|
+
trendLabel?: React.ReactNode;
|
|
72
|
+
};
|
|
73
|
+
declare function Stat({ label, value, hint, trend, trendLabel, className, ...props }: StatProps): React.JSX.Element;
|
|
74
|
+
|
|
75
|
+
export { Stat, type StatProps, type StatTrend, stat };
|
package/dist/stat.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// src/stat/stat.tsx
|
|
2
|
+
import { tv } from "tailwind-variants";
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
var stat = tv({
|
|
5
|
+
slots: {
|
|
6
|
+
root: "flex min-w-0 flex-col gap-1",
|
|
7
|
+
label: "text-xs font-semibold uppercase tracking-wider text-fg-secondary",
|
|
8
|
+
value: "font-display text-2xl font-black tabular-nums text-fg",
|
|
9
|
+
meta: "flex flex-wrap items-center gap-x-2 gap-y-1 text-xs",
|
|
10
|
+
// The status tokens are too light for small text on a light surface: the words stay a text role, the arrow carries
|
|
11
|
+
// the direction's colour.
|
|
12
|
+
trend: "inline-flex items-center gap-1 font-semibold text-fg [&>svg]:h-3.5 [&>svg]:w-3.5 [&>svg]:shrink-0",
|
|
13
|
+
hint: "text-fg-secondary"
|
|
14
|
+
},
|
|
15
|
+
variants: {
|
|
16
|
+
trend: {
|
|
17
|
+
up: { trend: "[&>svg]:text-success" },
|
|
18
|
+
down: { trend: "[&>svg]:text-danger" },
|
|
19
|
+
flat: { trend: "[&>svg]:text-fg-secondary" }
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
var ARROW = { up: "M7 17 17 7M8 7h9v9", down: "M7 7l10 10M17 8v9H8", flat: "M5 12h14M13 6l6 6-6 6" };
|
|
24
|
+
function Stat({ label, value, hint, trend, trendLabel, className, ...props }) {
|
|
25
|
+
const s = stat({ trend });
|
|
26
|
+
return /* @__PURE__ */ jsxs("div", { "data-trend": trend, className: s.root({ className }), ...props, children: [
|
|
27
|
+
/* @__PURE__ */ jsx("p", { className: s.label(), children: label }),
|
|
28
|
+
/* @__PURE__ */ jsx("p", { className: s.value(), children: value }),
|
|
29
|
+
(trendLabel || hint) && /* @__PURE__ */ jsxs("p", { className: s.meta(), children: [
|
|
30
|
+
trend && trendLabel && /* @__PURE__ */ jsxs("span", { className: s.trend(), children: [
|
|
31
|
+
/* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: /* @__PURE__ */ jsx("path", { d: ARROW[trend] }) }),
|
|
32
|
+
trendLabel
|
|
33
|
+
] }),
|
|
34
|
+
hint && /* @__PURE__ */ jsx("span", { className: s.hint(), children: hint })
|
|
35
|
+
] })
|
|
36
|
+
] });
|
|
37
|
+
}
|
|
38
|
+
export {
|
|
39
|
+
Stat,
|
|
40
|
+
stat
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=stat.js.map
|
package/dist/stat.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/stat/stat.tsx"],"sourcesContent":["// Server-safe. A key figure: a label, the value in tabular digits, a hint, a trend. Every word is a prop.\nimport type * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nexport const stat = tv({\n slots: {\n root: \"flex min-w-0 flex-col gap-1\",\n label: \"text-xs font-semibold uppercase tracking-wider text-fg-secondary\",\n value: \"font-display text-2xl font-black tabular-nums text-fg\",\n meta: \"flex flex-wrap items-center gap-x-2 gap-y-1 text-xs\",\n // The status tokens are too light for small text on a light surface: the words stay a text role, the arrow carries\n // the direction's colour.\n trend: \"inline-flex items-center gap-1 font-semibold text-fg [&>svg]:h-3.5 [&>svg]:w-3.5 [&>svg]:shrink-0\",\n hint: \"text-fg-secondary\",\n },\n variants: {\n trend: {\n up: { trend: \"[&>svg]:text-success\" },\n down: { trend: \"[&>svg]:text-danger\" },\n flat: { trend: \"[&>svg]:text-fg-secondary\" },\n },\n },\n});\n\nexport type StatTrend = \"up\" | \"down\" | \"flat\";\n\nconst ARROW: Record<StatTrend, string> = { up: \"M7 17 17 7M8 7h9v9\", down: \"M7 7l10 10M17 8v9H8\", flat: \"M5 12h14M13 6l6 6-6 6\" };\n\nexport type StatProps = Omit<React.ComponentProps<\"div\">, \"children\"> & {\n label: React.ReactNode;\n value: React.ReactNode;\n /** A line under the value: the period, the comparison. */\n hint?: React.ReactNode;\n /** The direction of the change; its arrow is decorative. */\n trend?: StatTrend;\n /** The change, in words, as read and shown (e.g. \"+12 % vs last week\") — the arrow alone says nothing. */\n trendLabel?: React.ReactNode;\n};\n\nexport function Stat({ label, value, hint, trend, trendLabel, className, ...props }: StatProps) {\n const s = stat({ trend });\n return (\n <div data-trend={trend} className={s.root({ className })} {...props}>\n <p className={s.label()}>{label}</p>\n <p className={s.value()}>{value}</p>\n {(trendLabel || hint) && (\n <p className={s.meta()}>\n {trend && trendLabel && (\n <span className={s.trend()}>\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d={ARROW[trend]} />\n </svg>\n {trendLabel}\n </span>\n )}\n {hint && <span className={s.hint()}>{hint}</span>}\n </p>\n )}\n </div>\n );\n}\n"],"mappings":";AAEA,SAAS,UAAU;AAyCb,cAKM,YALN;AAvCC,IAAM,OAAO,GAAG;AAAA,EACrB,OAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA;AAAA;AAAA,IAGN,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,MACL,IAAI,EAAE,OAAO,uBAAuB;AAAA,MACpC,MAAM,EAAE,OAAO,sBAAsB;AAAA,MACrC,MAAM,EAAE,OAAO,4BAA4B;AAAA,IAC7C;AAAA,EACF;AACF,CAAC;AAID,IAAM,QAAmC,EAAE,IAAI,sBAAsB,MAAM,uBAAuB,MAAM,wBAAwB;AAazH,SAAS,KAAK,EAAE,OAAO,OAAO,MAAM,OAAO,YAAY,WAAW,GAAG,MAAM,GAAc;AAC9F,QAAM,IAAI,KAAK,EAAE,MAAM,CAAC;AACxB,SACE,qBAAC,SAAI,cAAY,OAAO,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,GAAI,GAAG,OAC5D;AAAA,wBAAC,OAAE,WAAW,EAAE,MAAM,GAAI,iBAAM;AAAA,IAChC,oBAAC,OAAE,WAAW,EAAE,MAAM,GAAI,iBAAM;AAAA,KAC9B,cAAc,SACd,qBAAC,OAAE,WAAW,EAAE,KAAK,GAClB;AAAA,eAAS,cACR,qBAAC,UAAK,WAAW,EAAE,MAAM,GACvB;AAAA,4BAAC,SAAI,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,eAAW,MACnI,8BAAC,UAAK,GAAG,MAAM,KAAK,GAAG,GACzB;AAAA,QACC;AAAA,SACH;AAAA,MAED,QAAQ,oBAAC,UAAK,WAAW,EAAE,KAAK,GAAI,gBAAK;AAAA,OAC5C;AAAA,KAEJ;AAEJ;","names":[]}
|