@rinzai/zen 0.5.0 → 0.6.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/README.md +2 -2
- package/dist/animated-number/index.js +33 -0
- package/dist/avatar/index.js +38 -0
- package/dist/backdrop/index.d.ts +7 -3
- package/dist/backdrop/index.d.ts.map +1 -1
- package/dist/backdrop/index.js +98 -0
- package/dist/badge/index.d.ts +1 -1
- package/dist/badge/index.js +24 -0
- package/dist/button/index.d.ts +10 -3
- package/dist/button/index.d.ts.map +1 -1
- package/dist/button/index.js +54 -0
- package/dist/calendar/index.d.ts +44 -0
- package/dist/calendar/index.d.ts.map +1 -0
- package/dist/calendar/index.js +161 -0
- package/dist/card/index.d.ts +15 -6
- package/dist/card/index.d.ts.map +1 -1
- package/dist/card/index.js +60 -0
- package/dist/chart/donut.d.ts +30 -0
- package/dist/chart/donut.d.ts.map +1 -0
- package/dist/chart/donut.js +96 -0
- package/dist/chart/index.d.ts +81 -0
- package/dist/chart/index.d.ts.map +1 -0
- package/dist/chart/index.js +362 -0
- package/dist/chart/tooltip.d.ts +25 -0
- package/dist/chart/tooltip.d.ts.map +1 -0
- package/dist/chart/tooltip.js +51 -0
- package/dist/checkbox/index.d.ts +20 -0
- package/dist/checkbox/index.d.ts.map +1 -0
- package/dist/checkbox/index.js +61 -0
- package/dist/chip/index.d.ts +12 -0
- package/dist/chip/index.d.ts.map +1 -0
- package/dist/chip/index.js +14 -0
- package/dist/code-block/index.js +36 -0
- package/dist/collapse/index.d.ts +17 -7
- package/dist/collapse/index.d.ts.map +1 -1
- package/dist/collapse/index.js +82 -0
- package/dist/combobox/index.d.ts +89 -0
- package/dist/combobox/index.d.ts.map +1 -0
- package/dist/combobox/index.js +262 -0
- package/dist/confirm-dialog/index.d.ts.map +1 -1
- package/dist/confirm-dialog/index.js +25 -0
- package/dist/date-picker/index.d.ts +48 -0
- package/dist/date-picker/index.d.ts.map +1 -0
- package/dist/date-picker/index.js +112 -0
- package/dist/dialog/index.d.ts +14 -2
- package/dist/dialog/index.d.ts.map +1 -1
- package/dist/dialog/index.js +77 -0
- package/dist/disclosure/index.d.ts +25 -0
- package/dist/disclosure/index.d.ts.map +1 -0
- package/dist/disclosure/index.js +66 -0
- package/dist/editable-cell/index.js +24 -0
- package/dist/field/index.d.ts +42 -3
- package/dist/field/index.d.ts.map +1 -1
- package/dist/field/index.js +66 -0
- package/dist/header/index.js +17 -0
- package/dist/icons/chevron-down.js +21 -0
- package/dist/icons/chevron-left.js +21 -0
- package/dist/icons/chevron-right.js +21 -0
- package/dist/icons/chevron-up.js +21 -0
- package/dist/icons/ellipsis.d.ts +4 -0
- package/dist/icons/ellipsis.d.ts.map +1 -0
- package/dist/icons/ellipsis.js +31 -0
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/index.d.ts.map +1 -1
- package/dist/icons/search.js +21 -0
- package/dist/icons/x-mark.js +21 -0
- package/dist/index.d.ts +22 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/input/index.d.ts.map +1 -1
- package/dist/input/index.js +16 -0
- package/dist/input-group/index.d.ts.map +1 -1
- package/dist/input-group/index.js +36 -0
- package/dist/inset/index.d.ts +16 -0
- package/dist/inset/index.d.ts.map +1 -0
- package/dist/inset/index.js +23 -0
- package/dist/lib.js +74 -0
- package/dist/menu/index.d.ts +55 -0
- package/dist/menu/index.d.ts.map +1 -0
- package/dist/menu/index.js +118 -0
- package/dist/meter/index.js +41 -0
- package/dist/money-input/index.d.ts +77 -7
- package/dist/money-input/index.d.ts.map +1 -1
- package/dist/money-input/index.js +304 -0
- package/dist/month-picker/index.d.ts +4 -3
- package/dist/month-picker/index.d.ts.map +1 -1
- package/dist/month-picker/index.js +93 -0
- package/dist/page-header/index.js +26 -0
- package/dist/pills/index.d.ts +35 -0
- package/dist/pills/index.d.ts.map +1 -0
- package/dist/pills/index.js +50 -0
- package/dist/popover/index.d.ts +41 -22
- package/dist/popover/index.d.ts.map +1 -1
- package/dist/popover/index.js +75 -0
- package/dist/progress-ring/index.js +49 -0
- package/dist/radio-cards/index.d.ts +34 -0
- package/dist/radio-cards/index.d.ts.map +1 -0
- package/dist/radio-cards/index.js +48 -0
- package/dist/radio-group/index.d.ts +39 -0
- package/dist/radio-group/index.d.ts.map +1 -0
- package/dist/radio-group/index.js +63 -0
- package/dist/segmented/index.d.ts +16 -6
- package/dist/segmented/index.d.ts.map +1 -1
- package/dist/segmented/index.js +58 -0
- package/dist/select/index.d.ts +28 -14
- package/dist/select/index.d.ts.map +1 -1
- package/dist/select/index.js +187 -0
- package/dist/side-nav/index.js +37 -0
- package/dist/skeleton/index.js +12 -0
- package/dist/slider/index.js +34 -0
- package/dist/spinner/index.js +14 -0
- package/dist/tab-bar/index.d.ts +3 -0
- package/dist/tab-bar/index.d.ts.map +1 -1
- package/dist/tab-bar/index.js +34 -0
- package/dist/table/index.js +148 -0
- package/dist/table-of-contents/index.js +37 -0
- package/dist/tabs/index.d.ts +3 -2
- package/dist/tabs/index.d.ts.map +1 -1
- package/dist/tabs/index.js +114 -0
- package/dist/tailwind.css +1 -1
- package/dist/textarea/index.d.ts.map +1 -1
- package/dist/textarea/index.js +16 -0
- package/dist/theme-toggle/index.js +43 -0
- package/dist/theme.css +178 -13
- package/dist/toast/index.d.ts +6 -1
- package/dist/toast/index.d.ts.map +1 -1
- package/dist/toast/index.js +248 -0
- package/dist/toggle/index.d.ts.map +1 -1
- package/dist/toggle/index.js +26 -0
- package/dist/tooltip/index.d.ts +25 -0
- package/dist/tooltip/index.d.ts.map +1 -0
- package/dist/tooltip/index.js +108 -0
- package/dist/tree/index.d.ts.map +1 -1
- package/dist/tree/index.js +135 -0
- package/dist/utils/cva.js +25 -0
- package/dist/utils/cx.js +6 -0
- package/dist/utils/date.d.ts +37 -0
- package/dist/utils/date.d.ts.map +1 -0
- package/dist/utils/date.js +68 -0
- package/dist/utils/field-chevron.js +19 -0
- package/dist/utils/fx.d.ts +30 -0
- package/dist/utils/fx.d.ts.map +1 -0
- package/dist/utils/fx.js +21 -0
- package/dist/utils/graphics.js +33 -0
- package/dist/utils/indicator.d.ts +24 -0
- package/dist/utils/indicator.d.ts.map +1 -0
- package/dist/utils/indicator.js +37 -0
- package/dist/utils/merge.js +305 -0
- package/dist/utils/money.js +73 -0
- package/dist/utils/month.js +46 -0
- package/dist/utils/slot.d.ts +9 -5
- package/dist/utils/slot.d.ts.map +1 -1
- package/dist/utils/slot.js +25 -0
- package/dist/utils/status-icons.js +48 -0
- package/dist/utils/styles.d.ts +6 -6
- package/dist/utils/styles.d.ts.map +1 -1
- package/dist/utils/styles.js +6 -0
- package/dist/utils/theme.js +200 -0
- package/dist/utils/useAnchoredPopup.d.ts +8 -2
- package/dist/utils/useAnchoredPopup.d.ts.map +1 -1
- package/dist/utils/useAnchoredPopup.js +63 -0
- package/dist/utils/useHydrated.js +9 -0
- package/dist/utils/useVirtualList.js +45 -0
- package/dist/variables.css +22 -0
- package/dist/zen.css +1 -1
- package/package.json +9 -4
- package/dist/actions-menu/index.d.ts +0 -18
- package/dist/actions-menu/index.d.ts.map +0 -1
- package/dist/dropdown/index.d.ts +0 -28
- package/dist/dropdown/index.d.ts.map +0 -1
- package/dist/nav-pills/index.d.ts +0 -31
- package/dist/nav-pills/index.d.ts.map +0 -1
- package/dist/zen.js +0 -2970
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cx as e } from "../utils/cx.js";
|
|
3
|
+
import { useAnchoredPopup as t } from "../utils/useAnchoredPopup.js";
|
|
4
|
+
import { POPUP as n, TRIGGER as r } from "../utils/styles.js";
|
|
5
|
+
import { CheckIcon as i } from "../utils/status-icons.js";
|
|
6
|
+
import { useFieldProps as a } from "../field/index.js";
|
|
7
|
+
import { FieldChevron as o } from "../utils/field-chevron.js";
|
|
8
|
+
import { Children as s, Fragment as c, createContext as l, isValidElement as u, useCallback as d, useContext as f, useEffect as p, useId as m, useLayoutEffect as h, useRef as g, useState as _ } from "react";
|
|
9
|
+
import { Fragment as v, jsx as y, jsxs as b } from "react/jsx-runtime";
|
|
10
|
+
//#region packages/select/index.tsx
|
|
11
|
+
var x = l(null);
|
|
12
|
+
function S({ value: i, onChange: s, placeholder: c = "Select…", disabled: l = !1, name: u, id: f, className: h, listClassName: S, children: w, style: T, onKeyDown: E, ...D }) {
|
|
13
|
+
let O = g(null), k = m(), A = f ?? k, j = a({
|
|
14
|
+
...D,
|
|
15
|
+
id: f
|
|
16
|
+
}), [M, N] = _(null), P = g({
|
|
17
|
+
text: "",
|
|
18
|
+
at: 0
|
|
19
|
+
}), [F, I] = _(/* @__PURE__ */ new Map()), L = () => Array.from(O.current?.querySelectorAll("[role=\"option\"]") ?? []).map((e) => ({
|
|
20
|
+
value: e.dataset.value,
|
|
21
|
+
label: e.dataset.label ?? "",
|
|
22
|
+
disabled: e.getAttribute("aria-disabled") === "true"
|
|
23
|
+
})), R = t({
|
|
24
|
+
matchWidth: !0,
|
|
25
|
+
onOpenChange: (e) => {
|
|
26
|
+
if (!e) return;
|
|
27
|
+
let t = L();
|
|
28
|
+
N(t.find((e) => e.value === i)?.value ?? t.find((e) => !e.disabled)?.value ?? null);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
p(() => {
|
|
32
|
+
R.open && O.current?.focus();
|
|
33
|
+
}, [R.open]);
|
|
34
|
+
let z = (e) => {
|
|
35
|
+
L().find((t) => t.value === e)?.disabled || (s(e), R.setOpen(!1));
|
|
36
|
+
}, B = d((e, t) => (I((n) => n.get(e) === t ? n : new Map(n).set(e, t)), () => I((t) => {
|
|
37
|
+
let n = new Map(t);
|
|
38
|
+
return n.delete(e), n;
|
|
39
|
+
})), []), V = new Map(F);
|
|
40
|
+
C(w, V);
|
|
41
|
+
let H = i === null ? void 0 : V.get(i), U = (e, t, n = L()) => {
|
|
42
|
+
let r = e === null ? t === 1 ? -1 : n.length : n.findIndex((t) => t.value === e);
|
|
43
|
+
for (let e = 1; e <= n.length; e++) {
|
|
44
|
+
let i = (r + t * e + n.length * 2) % n.length;
|
|
45
|
+
if (!n[i].disabled) return n[i].value;
|
|
46
|
+
}
|
|
47
|
+
return e;
|
|
48
|
+
}, W = (e) => {
|
|
49
|
+
let t = {
|
|
50
|
+
ArrowDown: () => N((e) => U(e, 1)),
|
|
51
|
+
ArrowUp: () => N((e) => U(e, -1)),
|
|
52
|
+
Home: () => N(U(null, 1)),
|
|
53
|
+
End: () => N(U(null, -1)),
|
|
54
|
+
Enter: () => M !== null && z(M),
|
|
55
|
+
" ": () => M !== null && z(M),
|
|
56
|
+
Tab: () => R.setOpen(!1)
|
|
57
|
+
};
|
|
58
|
+
if (t[e.key]) {
|
|
59
|
+
e.key !== "Tab" && e.preventDefault(), t[e.key]();
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {
|
|
63
|
+
let t = Date.now(), n = (t - P.current.at < 700 ? P.current.text : "") + e.key.toLowerCase();
|
|
64
|
+
P.current = {
|
|
65
|
+
text: n,
|
|
66
|
+
at: t
|
|
67
|
+
};
|
|
68
|
+
let r = L().find((e) => !e.disabled && e.label.toLowerCase().startsWith(n));
|
|
69
|
+
r && N(r.value);
|
|
70
|
+
}
|
|
71
|
+
}, G = (e) => `${R.id}-option-${e}`;
|
|
72
|
+
return /* @__PURE__ */ b(v, { children: [
|
|
73
|
+
/* @__PURE__ */ b("button", {
|
|
74
|
+
type: "button",
|
|
75
|
+
...D,
|
|
76
|
+
...j,
|
|
77
|
+
id: A,
|
|
78
|
+
disabled: l,
|
|
79
|
+
"aria-haspopup": "listbox",
|
|
80
|
+
...R.triggerProps,
|
|
81
|
+
style: {
|
|
82
|
+
...R.triggerProps.style,
|
|
83
|
+
...T
|
|
84
|
+
},
|
|
85
|
+
onKeyDown: (e) => {
|
|
86
|
+
E?.(e), ["ArrowDown", "ArrowUp"].includes(e.key) && !R.open && (e.preventDefault(), R.setOpen(!0));
|
|
87
|
+
},
|
|
88
|
+
className: e("zen__select group", r, "w-full", R.open && "border-glow/60 [--glow-border-color:transparent] shadow-[0_0_0_3px_oklch(var(--glow)/0.16),0_0_24px_-6px_oklch(var(--glow)/0.6)]", h),
|
|
89
|
+
children: [/* @__PURE__ */ y("span", {
|
|
90
|
+
className: e("truncate", H === void 0 && "text-muted-foreground"),
|
|
91
|
+
children: H ?? c
|
|
92
|
+
}), /* @__PURE__ */ y(o, { open: R.open })]
|
|
93
|
+
}),
|
|
94
|
+
u && /* @__PURE__ */ y("input", {
|
|
95
|
+
type: "hidden",
|
|
96
|
+
name: u,
|
|
97
|
+
value: i ?? ""
|
|
98
|
+
}),
|
|
99
|
+
/* @__PURE__ */ y("div", {
|
|
100
|
+
...R.popupProps,
|
|
101
|
+
className: e("zen__popover", n, "overflow-visible py-1", S),
|
|
102
|
+
children: /* @__PURE__ */ y("div", {
|
|
103
|
+
ref: O,
|
|
104
|
+
role: "listbox",
|
|
105
|
+
tabIndex: -1,
|
|
106
|
+
"aria-label": D["aria-label"],
|
|
107
|
+
"aria-labelledby": D["aria-label"] ? void 0 : A,
|
|
108
|
+
"aria-activedescendant": M === null ? void 0 : G(M),
|
|
109
|
+
onKeyDown: W,
|
|
110
|
+
className: "max-h-72 overflow-y-auto outline-hidden",
|
|
111
|
+
children: /* @__PURE__ */ y(x.Provider, {
|
|
112
|
+
value: {
|
|
113
|
+
value: i,
|
|
114
|
+
active: M,
|
|
115
|
+
setActive: N,
|
|
116
|
+
choose: z,
|
|
117
|
+
optionId: G,
|
|
118
|
+
register: B
|
|
119
|
+
},
|
|
120
|
+
children: w
|
|
121
|
+
})
|
|
122
|
+
})
|
|
123
|
+
})
|
|
124
|
+
] });
|
|
125
|
+
}
|
|
126
|
+
function C(e, t) {
|
|
127
|
+
s.forEach(e, (e) => {
|
|
128
|
+
if (!u(e)) return;
|
|
129
|
+
let n = e;
|
|
130
|
+
if (n.type === T && n.props.value !== void 0) {
|
|
131
|
+
let e = n.props.label ?? w(n.props.children);
|
|
132
|
+
e && t.set(n.props.value, e);
|
|
133
|
+
} else (n.type === E || n.type === c) && C(n.props.children, t);
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
var w = (e) => typeof e == "string" || typeof e == "number" ? String(e) : Array.isArray(e) ? e.map(w).join("") : "";
|
|
137
|
+
function T({ value: t, label: n, disabled: r, className: a, children: o }) {
|
|
138
|
+
let s = f(x);
|
|
139
|
+
if (!s) throw Error("SelectItem must be inside a Select");
|
|
140
|
+
let c = g(null), l = n ?? w(o), u = s.register;
|
|
141
|
+
h(() => u(t, l || c.current?.textContent?.trim() || ""), [
|
|
142
|
+
u,
|
|
143
|
+
t,
|
|
144
|
+
l
|
|
145
|
+
]);
|
|
146
|
+
let d = s.value === t;
|
|
147
|
+
return /* @__PURE__ */ b("div", {
|
|
148
|
+
ref: c,
|
|
149
|
+
id: s.optionId(t),
|
|
150
|
+
role: "option",
|
|
151
|
+
"data-value": t,
|
|
152
|
+
"data-label": l || void 0,
|
|
153
|
+
"aria-selected": d,
|
|
154
|
+
"aria-disabled": r || void 0,
|
|
155
|
+
"data-highlighted": s.active === t || void 0,
|
|
156
|
+
onMouseMove: () => !r && s.setActive(t),
|
|
157
|
+
onClick: () => s.choose(t),
|
|
158
|
+
className: e("grid cursor-pointer grid-cols-[1rem_1fr] items-center gap-2 px-3 py-2 text-sm outline-hidden select-none", "data-highlighted:bg-muted aria-disabled:cursor-not-allowed aria-disabled:opacity-50", a),
|
|
159
|
+
children: [/* @__PURE__ */ y("span", {
|
|
160
|
+
className: "text-primary col-start-1",
|
|
161
|
+
"aria-hidden": !0,
|
|
162
|
+
children: d && /* @__PURE__ */ y(i, {})
|
|
163
|
+
}), /* @__PURE__ */ y("span", {
|
|
164
|
+
className: "col-start-2 truncate",
|
|
165
|
+
children: o
|
|
166
|
+
})]
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
function E({ label: e, children: t }) {
|
|
170
|
+
return /* @__PURE__ */ b("div", {
|
|
171
|
+
role: "group",
|
|
172
|
+
"aria-label": typeof e == "string" ? e : void 0,
|
|
173
|
+
children: [/* @__PURE__ */ y("div", {
|
|
174
|
+
"aria-hidden": !0,
|
|
175
|
+
className: "text-muted-foreground px-3 pt-2 pb-1 text-xs font-medium",
|
|
176
|
+
children: e
|
|
177
|
+
}), t]
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
function D() {
|
|
181
|
+
return /* @__PURE__ */ y("div", {
|
|
182
|
+
role: "separator",
|
|
183
|
+
className: "bg-tint/[0.07] mx-2 my-1 h-px"
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
//#endregion
|
|
187
|
+
export { E as SelectGroup, T as SelectItem, D as SelectSeparator, S as default };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cx as e } from "../utils/cx.js";
|
|
3
|
+
import { Slot as t } from "../utils/slot.js";
|
|
4
|
+
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
5
|
+
//#region packages/side-nav/index.tsx
|
|
6
|
+
function i({ className: t, ...r }) {
|
|
7
|
+
return /* @__PURE__ */ n("nav", {
|
|
8
|
+
className: e("zen__side-nav flex flex-col gap-6", t),
|
|
9
|
+
...r
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
function a({ title: t, children: i, className: a }) {
|
|
13
|
+
return /* @__PURE__ */ r("div", {
|
|
14
|
+
className: e("flex flex-col gap-1", a),
|
|
15
|
+
children: [t && /* @__PURE__ */ n("span", {
|
|
16
|
+
className: "text-muted-foreground px-3 pb-1 text-[0.68rem] tracking-[0.1em] uppercase",
|
|
17
|
+
children: t
|
|
18
|
+
}), i]
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
var o = e("rounded-lg px-3 py-1.5 text-sm outline-hidden transition-[background-color,color,box-shadow] duration-200", "text-muted-foreground hover:bg-tint/[0.05] hover:text-foreground focus-visible:ring-ring/50 focus-visible:ring-2", "aria-[current=page]:bg-primary/15 aria-[current=page]:text-foreground aria-[current=page]:shadow-[inset_0_0_0_1px_oklch(var(--primary)/0.25)]");
|
|
22
|
+
function s({ active: r, asChild: i, className: a, children: s, ...c }) {
|
|
23
|
+
let l = {
|
|
24
|
+
...c,
|
|
25
|
+
"aria-current": r ? "page" : void 0,
|
|
26
|
+
className: e(o, a)
|
|
27
|
+
};
|
|
28
|
+
return i ? (r || delete l["aria-current"], /* @__PURE__ */ n(t, {
|
|
29
|
+
...l,
|
|
30
|
+
children: s
|
|
31
|
+
})) : /* @__PURE__ */ n("a", {
|
|
32
|
+
...l,
|
|
33
|
+
children: s
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { a as SideNavGroup, s as SideNavLink, i as default };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cx as e } from "../utils/cx.js";
|
|
3
|
+
import { jsx as t } from "react/jsx-runtime";
|
|
4
|
+
//#region packages/skeleton/index.tsx
|
|
5
|
+
function n({ className: n }) {
|
|
6
|
+
return /* @__PURE__ */ t("span", {
|
|
7
|
+
"aria-hidden": !0,
|
|
8
|
+
className: e("zen__skeleton block rounded-md", n)
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
//#endregion
|
|
12
|
+
export { n as default };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cx as e } from "../utils/cx.js";
|
|
3
|
+
import { useEffect as t, useRef as n } from "react";
|
|
4
|
+
import { jsx as r } from "react/jsx-runtime";
|
|
5
|
+
//#region packages/slider/index.tsx
|
|
6
|
+
function i({ value: i, min: a = 0, max: o = 100, step: s = 1, onValueChange: c, onValueCommit: l, trackBackground: u, thumbColor: d, valueText: f, className: p, style: m, ...h }) {
|
|
7
|
+
let g = n(null), _ = n(l);
|
|
8
|
+
_.current = l, t(() => {
|
|
9
|
+
let e = g.current;
|
|
10
|
+
if (!e) return;
|
|
11
|
+
let t = () => _.current?.(Number(e.value));
|
|
12
|
+
return e.addEventListener("change", t), () => e.removeEventListener("change", t);
|
|
13
|
+
}, []);
|
|
14
|
+
let v = o > a ? (i - a) / (o - a) * 100 : 0, y = u ?? `linear-gradient(to right, oklch(var(--primary)) ${v}%, oklch(var(--muted)) ${v}%)`;
|
|
15
|
+
return /* @__PURE__ */ r("input", {
|
|
16
|
+
ref: g,
|
|
17
|
+
type: "range",
|
|
18
|
+
min: a,
|
|
19
|
+
max: o,
|
|
20
|
+
step: s,
|
|
21
|
+
value: i,
|
|
22
|
+
"aria-valuetext": f?.(i),
|
|
23
|
+
onChange: (e) => c?.(Number(e.target.value)),
|
|
24
|
+
style: {
|
|
25
|
+
...m,
|
|
26
|
+
"--zen-track": y,
|
|
27
|
+
"--zen-thumb": d ?? "oklch(var(--primary))"
|
|
28
|
+
},
|
|
29
|
+
className: e("zen__slider h-5 w-full cursor-pointer appearance-none bg-transparent outline-hidden disabled:cursor-not-allowed disabled:opacity-50", "[&::-webkit-slider-runnable-track]:h-2.5 [&::-webkit-slider-runnable-track]:rounded-full [&::-webkit-slider-runnable-track]:[background:var(--zen-track)]", "[&::-moz-range-track]:h-2.5 [&::-moz-range-track]:rounded-full [&::-moz-range-track]:[background:var(--zen-track)]", "[&::-webkit-slider-thumb]:-mt-[5px] [&::-webkit-slider-thumb]:size-5 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-white [&::-webkit-slider-thumb]:shadow-[0_0_0_1px_oklch(0_0_0/0.3),0_0_16px_oklch(var(--glow)/0.8)] [&::-webkit-slider-thumb]:[background:var(--zen-thumb)]", "[&::-moz-range-thumb]:size-5 [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:border-2 [&::-moz-range-thumb]:border-white [&::-moz-range-thumb]:shadow-[0_0_0_1px_oklch(0_0_0/0.3),0_0_16px_oklch(var(--glow)/0.8)] [&::-moz-range-thumb]:[background:var(--zen-thumb)]", "focus-visible:[&::-webkit-slider-thumb]:ring-ring/40 focus-visible:[&::-webkit-slider-thumb]:ring-4", p),
|
|
30
|
+
...h
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
//#endregion
|
|
34
|
+
export { i as default };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cx as e } from "../utils/cx.js";
|
|
3
|
+
import { jsx as t } from "react/jsx-runtime";
|
|
4
|
+
//#region packages/spinner/index.tsx
|
|
5
|
+
function n({ label: n, className: r }) {
|
|
6
|
+
return /* @__PURE__ */ t("span", {
|
|
7
|
+
role: n ? "status" : void 0,
|
|
8
|
+
"aria-label": n,
|
|
9
|
+
"aria-hidden": !n || void 0,
|
|
10
|
+
className: e("zen__spinner inline-block size-4 shrink-0 animate-spin rounded-full border-2 border-current border-t-transparent", r)
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
export { n as default };
|
package/dist/tab-bar/index.d.ts
CHANGED
|
@@ -2,6 +2,9 @@ import { ComponentProps, ReactNode } from 'react';
|
|
|
2
2
|
/**
|
|
3
3
|
* Phone navigation: a glass bar fixed to the bottom, clear of the home
|
|
4
4
|
* indicator, hidden from `hideFrom` up (default md). Fill it with TabBarItems.
|
|
5
|
+
* Inside a rounded frame, round the bar to match (className, e.g.
|
|
6
|
+
* rounded-b-[15px]): with GPU compositing, Chrome doesn't clip a blurred
|
|
7
|
+
* backdrop to an ancestor's rounded corners, only to the element's own.
|
|
5
8
|
*/
|
|
6
9
|
export default function TabBar({ hideFrom, className, children, ...rest }: TabBarProps): import('react').JSX.Element;
|
|
7
10
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/tab-bar/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAY,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5D
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/tab-bar/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAY,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5D;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,QAAe,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,WAAW,+BAiB5F;AAOD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,eAAe,+BAYlG;AAED,MAAM,WAAW,WAAY,SAAQ,cAAc,CAAC,KAAK,CAAC;IACtD,iEAAiE;IACjE,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;CACzC;AAED,MAAM,WAAW,eAAgB,SAAQ,cAAc,CAAC,GAAG,CAAC;IACxD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,6GAA6G;IAC7G,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cx as e } from "../utils/cx.js";
|
|
3
|
+
import { Slot as t } from "../utils/slot.js";
|
|
4
|
+
import { Children as n } from "react";
|
|
5
|
+
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
6
|
+
//#region packages/tab-bar/index.tsx
|
|
7
|
+
function a({ hideFrom: t = "md", className: i, children: a, ...o }) {
|
|
8
|
+
return /* @__PURE__ */ r("nav", {
|
|
9
|
+
className: e("zen__tab-bar glass glass-blur glow-edge fixed inset-x-0 bottom-0 z-40 rounded-none border-x-0! border-b-0! pb-[env(safe-area-inset-bottom)]", t === "sm" && "sm:hidden", t === "md" && "md:hidden", t === "lg" && "lg:hidden", i),
|
|
10
|
+
...o,
|
|
11
|
+
children: /* @__PURE__ */ r("div", {
|
|
12
|
+
className: "grid",
|
|
13
|
+
style: { gridTemplateColumns: `repeat(${n.count(a)}, 1fr)` },
|
|
14
|
+
children: a
|
|
15
|
+
})
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
var o = e("flex flex-col items-center gap-1 py-2.5 text-[0.7rem] outline-hidden transition-colors duration-200 focus-visible:bg-tint/5", "text-muted-foreground aria-[current=page]:text-primary [&_svg]:size-5 aria-[current=page]:[&_svg]:drop-shadow-[0_0_8px_oklch(var(--glow)/0.8)]");
|
|
19
|
+
function s({ icon: n, active: a, asChild: s, className: c, children: l, ...u }) {
|
|
20
|
+
let d = {
|
|
21
|
+
...u,
|
|
22
|
+
"aria-current": a ? "page" : void 0,
|
|
23
|
+
className: e(o, c)
|
|
24
|
+
};
|
|
25
|
+
return s ? (a || delete d["aria-current"], /* @__PURE__ */ r(t, {
|
|
26
|
+
...d,
|
|
27
|
+
children: l
|
|
28
|
+
})) : /* @__PURE__ */ i("a", {
|
|
29
|
+
...d,
|
|
30
|
+
children: [n, l]
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
//#endregion
|
|
34
|
+
export { s as TabBarItem, a as default };
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cx as e } from "../utils/cx.js";
|
|
3
|
+
import t from "../icons/chevron-down.js";
|
|
4
|
+
import n from "../icons/chevron-up.js";
|
|
5
|
+
import { useCallback as r, useEffect as i, useMemo as a, useRef as o, useState as s } from "react";
|
|
6
|
+
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
7
|
+
//#region packages/table/index.tsx
|
|
8
|
+
function u({ label: t, className: n, ref: a, onScroll: s, ...l }) {
|
|
9
|
+
let u = o(null), d = r(() => {
|
|
10
|
+
let e = u.current;
|
|
11
|
+
if (!e) return;
|
|
12
|
+
let t = (t, n) => n !== e.hasAttribute(t) && e.toggleAttribute(t, n);
|
|
13
|
+
t("data-under-top", e.scrollTop > 0), t("data-under-left", e.scrollLeft > 0), t("data-under-bottom", e.scrollTop + e.clientHeight < e.scrollHeight - 1);
|
|
14
|
+
}, []);
|
|
15
|
+
return i(() => {
|
|
16
|
+
let e = u.current;
|
|
17
|
+
if (!e) return;
|
|
18
|
+
d();
|
|
19
|
+
let t = typeof ResizeObserver > "u" ? null : new ResizeObserver(d);
|
|
20
|
+
return t?.observe(e), e.firstElementChild && t?.observe(e.firstElementChild), () => t?.disconnect();
|
|
21
|
+
}, [d]), /* @__PURE__ */ c("div", {
|
|
22
|
+
className: e("zen__table-panel glass glow-edge isolate flex flex-col overflow-hidden rounded-xl", n),
|
|
23
|
+
children: /* @__PURE__ */ c("div", {
|
|
24
|
+
ref: (e) => {
|
|
25
|
+
u.current = e, typeof a == "function" ? a(e) : a && (a.current = e);
|
|
26
|
+
},
|
|
27
|
+
onScroll: (e) => {
|
|
28
|
+
d(), s?.(e);
|
|
29
|
+
},
|
|
30
|
+
role: t ? "region" : void 0,
|
|
31
|
+
"aria-label": t,
|
|
32
|
+
tabIndex: t ? 0 : void 0,
|
|
33
|
+
className: "zen__table-container focus-visible:ring-ring/30 min-h-0 overflow-auto rounded-[inherit] outline-hidden will-change-scroll focus-visible:ring-2 focus-visible:ring-inset",
|
|
34
|
+
...l
|
|
35
|
+
})
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function d({ className: t, ...n }) {
|
|
39
|
+
return /* @__PURE__ */ c("table", {
|
|
40
|
+
className: e("zen__table w-full border-separate border-spacing-0 text-sm", t),
|
|
41
|
+
...n
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
function f({ className: t, ...n }) {
|
|
45
|
+
return /* @__PURE__ */ c("thead", {
|
|
46
|
+
className: e("zen__sticky-top sticky top-0 z-20", t),
|
|
47
|
+
...n
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
function p(e) {
|
|
51
|
+
return /* @__PURE__ */ c("tbody", { ...e });
|
|
52
|
+
}
|
|
53
|
+
function m({ className: t, ...n }) {
|
|
54
|
+
return /* @__PURE__ */ c("tfoot", {
|
|
55
|
+
className: e("zen__sticky-bottom sticky bottom-0 z-20", t),
|
|
56
|
+
...n
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
function h({ className: t, ...n }) {
|
|
60
|
+
return /* @__PURE__ */ c("tr", {
|
|
61
|
+
className: e("group", t),
|
|
62
|
+
...n
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
function g({ numeric: r, sticky: i, sortDirection: a, onSort: o, scope: s = "col", className: u, children: d, ...f }) {
|
|
66
|
+
return /* @__PURE__ */ c("th", {
|
|
67
|
+
scope: s,
|
|
68
|
+
"aria-sort": a === "asc" ? "ascending" : a === "desc" ? "descending" : void 0,
|
|
69
|
+
className: e("border-tint/[0.07] text-muted-foreground border-b px-3 py-2.5 align-middle text-xs leading-5 font-medium tracking-wider whitespace-nowrap uppercase", i === "left" && "zen__sticky-left sticky left-0 z-10", r ? "text-right" : "text-left", u),
|
|
70
|
+
...f,
|
|
71
|
+
children: o ? /* @__PURE__ */ l("button", {
|
|
72
|
+
type: "button",
|
|
73
|
+
onClick: o,
|
|
74
|
+
className: e("hover:text-foreground inline-flex items-center gap-1 align-middle leading-5 tracking-wider uppercase", r && "flex-row-reverse"),
|
|
75
|
+
children: [d, /* @__PURE__ */ c("span", {
|
|
76
|
+
"aria-hidden": !0,
|
|
77
|
+
className: "inline-flex w-3",
|
|
78
|
+
children: a === "asc" ? /* @__PURE__ */ c(n, {
|
|
79
|
+
className: "size-3",
|
|
80
|
+
strokeWidth: 2.5
|
|
81
|
+
}) : a === "desc" ? /* @__PURE__ */ c(t, {
|
|
82
|
+
className: "size-3",
|
|
83
|
+
strokeWidth: 2.5
|
|
84
|
+
}) : null
|
|
85
|
+
})]
|
|
86
|
+
}) : d
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
function _({ numeric: t, sticky: n, className: r, ...i }) {
|
|
90
|
+
return /* @__PURE__ */ c("td", {
|
|
91
|
+
className: e("border-tint/[0.045] border-b px-3 py-2.5 transition-colors duration-150", "group-hover:[background-image:linear-gradient(oklch(var(--tint)/0.035),oklch(var(--tint)/0.035))]", n === "left" && "zen__sticky-left sticky left-0 z-10 shadow-[inset_-1px_0_0_oklch(var(--tint)/0.06)]", t && "text-right tabular-nums", r),
|
|
92
|
+
...i
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
function v({ numeric: t, sticky: n, className: r, ...i }) {
|
|
96
|
+
return /* @__PURE__ */ c("td", {
|
|
97
|
+
className: e("border-tint/[0.07] h-9 border-t px-3 font-medium whitespace-nowrap", n === "left" && "zen__sticky-left sticky left-0 z-10 shadow-[inset_-1px_0_0_oklch(var(--tint)/0.06)]", t && "text-right tabular-nums", r),
|
|
98
|
+
...i
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
function y({ height: e, colSpan: t }) {
|
|
102
|
+
return e <= 0 ? null : /* @__PURE__ */ c("tr", {
|
|
103
|
+
"aria-hidden": !0,
|
|
104
|
+
children: /* @__PURE__ */ c("td", {
|
|
105
|
+
colSpan: t,
|
|
106
|
+
style: {
|
|
107
|
+
height: e,
|
|
108
|
+
padding: 0,
|
|
109
|
+
border: 0
|
|
110
|
+
}
|
|
111
|
+
})
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
function b({ colSpan: e, children: t = "Nothing here yet." }) {
|
|
115
|
+
return /* @__PURE__ */ c("tr", { children: /* @__PURE__ */ c("td", {
|
|
116
|
+
colSpan: e,
|
|
117
|
+
className: "text-muted-foreground px-3 py-8 text-center",
|
|
118
|
+
children: t
|
|
119
|
+
}) });
|
|
120
|
+
}
|
|
121
|
+
function x(e, t, n) {
|
|
122
|
+
let [r, i] = s(n ?? null);
|
|
123
|
+
return {
|
|
124
|
+
rows: a(() => {
|
|
125
|
+
if (!r) return e;
|
|
126
|
+
let n = t[r.key], i = [...e].sort(n);
|
|
127
|
+
return r.direction === "desc" ? i.reverse() : i;
|
|
128
|
+
}, [
|
|
129
|
+
e,
|
|
130
|
+
r,
|
|
131
|
+
t
|
|
132
|
+
]),
|
|
133
|
+
sort: r,
|
|
134
|
+
setSort: i,
|
|
135
|
+
headProps: (e) => ({
|
|
136
|
+
sortDirection: r?.key === e ? r.direction : void 0,
|
|
137
|
+
onSort: () => i((t) => t?.key === e ? t.direction === "asc" ? {
|
|
138
|
+
key: e,
|
|
139
|
+
direction: "desc"
|
|
140
|
+
} : null : {
|
|
141
|
+
key: e,
|
|
142
|
+
direction: "asc"
|
|
143
|
+
})
|
|
144
|
+
})
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
//#endregion
|
|
148
|
+
export { p as TableBody, _ as TableCell, u as TableContainer, b as TableEmpty, m as TableFooter, v as TableFooterCell, g as TableHead, f as TableHeader, h as TableRow, y as TableSpacerRow, d as default, x as useSort };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cx as e } from "../utils/cx.js";
|
|
3
|
+
import { useEffect as t, useState as n } from "react";
|
|
4
|
+
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
5
|
+
//#region packages/table-of-contents/index.tsx
|
|
6
|
+
function a({ items: a, title: o = "On this page", className: s }) {
|
|
7
|
+
let [c, l] = n();
|
|
8
|
+
return t(() => {
|
|
9
|
+
if (typeof IntersectionObserver > "u") return;
|
|
10
|
+
let e = a.map((e) => document.getElementById(e.id)).filter((e) => !!e), t = /* @__PURE__ */ new Set(), n = new IntersectionObserver((e) => {
|
|
11
|
+
for (let n of e) n.isIntersecting ? t.add(n.target.id) : t.delete(n.target.id);
|
|
12
|
+
let n = a.find((e) => t.has(e.id));
|
|
13
|
+
n && l(n.id);
|
|
14
|
+
}, { rootMargin: "0px 0px -65% 0px" });
|
|
15
|
+
return e.forEach((e) => n.observe(e)), () => n.disconnect();
|
|
16
|
+
}, [a]), a.length ? /* @__PURE__ */ i("nav", {
|
|
17
|
+
"aria-label": o,
|
|
18
|
+
className: e("zen__toc flex flex-col gap-3", s),
|
|
19
|
+
children: [/* @__PURE__ */ r("p", {
|
|
20
|
+
className: "text-muted-foreground mt-0! text-[0.68rem] tracking-[0.1em] uppercase",
|
|
21
|
+
children: o
|
|
22
|
+
}), /* @__PURE__ */ r("ul", {
|
|
23
|
+
className: "border-tint/[0.07] flex flex-col gap-2 border-l text-sm",
|
|
24
|
+
children: a.map((t) => /* @__PURE__ */ r("li", {
|
|
25
|
+
className: e("-ml-px", t.depth === 2 && "pl-3"),
|
|
26
|
+
children: /* @__PURE__ */ r("a", {
|
|
27
|
+
href: `#${t.id}`,
|
|
28
|
+
"aria-current": t.id === c ? "location" : void 0,
|
|
29
|
+
className: e("text-muted-foreground hover:text-foreground block border-l border-transparent pl-3 transition-colors", "aria-[current=location]:border-primary aria-[current=location]:text-foreground"),
|
|
30
|
+
children: t.label
|
|
31
|
+
})
|
|
32
|
+
}, t.id))
|
|
33
|
+
})]
|
|
34
|
+
}) : null;
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { a as default };
|
package/dist/tabs/index.d.ts
CHANGED
|
@@ -2,8 +2,9 @@ import { ComponentProps } from 'react';
|
|
|
2
2
|
/** Tab set with an underline that slides to the active tab. Controlled (`value`) or not (`defaultValue`). */
|
|
3
3
|
export default function Tabs({ value, defaultValue, onValueChange, className, ...rest }: TabsProps): import('react').JSX.Element;
|
|
4
4
|
/**
|
|
5
|
-
* `underline` (default):
|
|
6
|
-
* `pills`:
|
|
5
|
+
* The row of tabs. `underline` (default): in-page tabs, a bar sliding under
|
|
6
|
+
* the active tab. `pills`: the Pills look, a glowing pill sliding along a
|
|
7
|
+
* glass track (for navigation between pages, use Pills itself).
|
|
7
8
|
*/
|
|
8
9
|
export declare function TabList({ variant, className, children, ...rest }: TabListProps): import('react').JSX.Element;
|
|
9
10
|
export declare function Tab({ value, className, onClick, ...rest }: TabProps): import('react').JSX.Element;
|
package/dist/tabs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/tabs/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/tabs/index.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAqE,MAAM,OAAO,CAAC;AAgB1G,6GAA6G;AAC7G,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,EAAE,KAAK,EAAE,YAAiB,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,SAAS,+BAetG;AAID;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,EAAE,OAAqB,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,YAAY,+BAiC5F;AA4BD,wBAAgB,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,QAAQ,+BA0BnE;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,aAAa,sCAapE;AAED,MAAM,WAAW,SAAU,SAAQ,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAED,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,OAAO,CAAC;AAEnD,MAAM,WAAW,YAAa,SAAQ,cAAc,CAAC,KAAK,CAAC;IACvD,OAAO,CAAC,EAAE,cAAc,CAAC;CAC5B;AAED,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACrE,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAc,SAAQ,cAAc,CAAC,KAAK,CAAC;IACxD,KAAK,EAAE,MAAM,CAAC;CACjB"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cx as e } from "../utils/cx.js";
|
|
3
|
+
import { PILL as t } from "../utils/styles.js";
|
|
4
|
+
import { useIndicator as n } from "../utils/indicator.js";
|
|
5
|
+
import r, { PillIndicator as i } from "../pills/index.js";
|
|
6
|
+
import { createContext as a, useContext as o, useId as s, useRef as c, useState as l } from "react";
|
|
7
|
+
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
8
|
+
//#region packages/tabs/index.tsx
|
|
9
|
+
var f = a(null);
|
|
10
|
+
function p(e) {
|
|
11
|
+
let t = o(f);
|
|
12
|
+
if (!t) throw Error(`<${e}> must be inside <Tabs>`);
|
|
13
|
+
return t;
|
|
14
|
+
}
|
|
15
|
+
function m({ value: t, defaultValue: n = "", onValueChange: r, className: i, ...a }) {
|
|
16
|
+
let [o, c] = l(n), d = t ?? o, p = s();
|
|
17
|
+
return /* @__PURE__ */ u(f.Provider, {
|
|
18
|
+
value: {
|
|
19
|
+
value: d,
|
|
20
|
+
select: (e) => {
|
|
21
|
+
t === void 0 && c(e), r?.(e);
|
|
22
|
+
},
|
|
23
|
+
idFor: (e, t) => `${p}-${e}-${t.replace(/\s+/g, "-")}`
|
|
24
|
+
},
|
|
25
|
+
children: /* @__PURE__ */ u("div", {
|
|
26
|
+
className: e("zen__tabs flex flex-col gap-4", i),
|
|
27
|
+
...a
|
|
28
|
+
})
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
var h = a("underline");
|
|
32
|
+
function g({ variant: e = "underline", className: t, children: n, ...a }) {
|
|
33
|
+
p("TabList");
|
|
34
|
+
let o = c(null), s = (e) => {
|
|
35
|
+
let t = Array.from(o.current?.querySelectorAll("[role=\"tab\"]:not(:disabled)") ?? []), n = t.indexOf(document.activeElement);
|
|
36
|
+
if (n === -1) return;
|
|
37
|
+
let r = {
|
|
38
|
+
ArrowRight: n + 1,
|
|
39
|
+
ArrowLeft: n - 1,
|
|
40
|
+
Home: 0,
|
|
41
|
+
End: t.length - 1
|
|
42
|
+
}[e.key];
|
|
43
|
+
if (r === void 0) return;
|
|
44
|
+
e.preventDefault();
|
|
45
|
+
let i = t[(r + t.length) % t.length];
|
|
46
|
+
i.focus(), i.click();
|
|
47
|
+
}, l = /* @__PURE__ */ u(h.Provider, {
|
|
48
|
+
value: e,
|
|
49
|
+
children: n
|
|
50
|
+
});
|
|
51
|
+
return e === "pills" ? /* @__PURE__ */ d(r, {
|
|
52
|
+
ref: o,
|
|
53
|
+
role: "tablist",
|
|
54
|
+
onKeyDown: s,
|
|
55
|
+
className: t,
|
|
56
|
+
...a,
|
|
57
|
+
children: [l, /* @__PURE__ */ u(i, {})]
|
|
58
|
+
}) : /* @__PURE__ */ u(_, {
|
|
59
|
+
ref: o,
|
|
60
|
+
role: "tablist",
|
|
61
|
+
onKeyDown: s,
|
|
62
|
+
className: t,
|
|
63
|
+
...a,
|
|
64
|
+
children: l
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
function _({ ref: t, className: r, children: i, ...a }) {
|
|
68
|
+
let o = c(null), s = n(o, "[role=\"tab\"][aria-selected=\"true\"]");
|
|
69
|
+
return /* @__PURE__ */ d("div", {
|
|
70
|
+
ref: (e) => {
|
|
71
|
+
o.current = e, typeof t == "function" ? t(e) : t && (t.current = e);
|
|
72
|
+
},
|
|
73
|
+
className: e("border-border relative flex gap-1 border-b", r),
|
|
74
|
+
...a,
|
|
75
|
+
children: [i, s && /* @__PURE__ */ u("span", {
|
|
76
|
+
"aria-hidden": !0,
|
|
77
|
+
className: "bg-primary absolute bottom-[-1px] left-0 h-0.5 transition-[translate,width] duration-150 ease-in-out",
|
|
78
|
+
style: {
|
|
79
|
+
width: s.w,
|
|
80
|
+
translate: `${s.x}px 0`
|
|
81
|
+
}
|
|
82
|
+
})]
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
function v({ value: n, className: r, onClick: i, ...a }) {
|
|
86
|
+
let { value: s, select: c, idFor: l } = p("Tab"), d = o(h), f = s === n;
|
|
87
|
+
return /* @__PURE__ */ u("button", {
|
|
88
|
+
type: "button",
|
|
89
|
+
role: "tab",
|
|
90
|
+
id: l("tab", n),
|
|
91
|
+
"aria-selected": f,
|
|
92
|
+
"aria-controls": l("panel", n),
|
|
93
|
+
tabIndex: f ? 0 : -1,
|
|
94
|
+
"data-active": f || void 0,
|
|
95
|
+
onClick: (e) => {
|
|
96
|
+
c(n), i?.(e);
|
|
97
|
+
},
|
|
98
|
+
className: e(d === "pills" ? t : "focus-visible:ring-ring text-muted-foreground hover:text-foreground data-active:text-foreground px-3 py-2 text-sm whitespace-nowrap outline-hidden select-none focus-visible:ring-1", r),
|
|
99
|
+
...a
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
function y({ value: t, className: n, ...r }) {
|
|
103
|
+
let { value: i, idFor: a } = p("TabPanel");
|
|
104
|
+
return i === t ? /* @__PURE__ */ u("div", {
|
|
105
|
+
role: "tabpanel",
|
|
106
|
+
id: a("panel", t),
|
|
107
|
+
"aria-labelledby": a("tab", t),
|
|
108
|
+
tabIndex: 0,
|
|
109
|
+
className: e("outline-hidden", n),
|
|
110
|
+
...r
|
|
111
|
+
}) : null;
|
|
112
|
+
}
|
|
113
|
+
//#endregion
|
|
114
|
+
export { v as Tab, g as TabList, y as TabPanel, m as default };
|
package/dist/tailwind.css
CHANGED