@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.
Files changed (172) hide show
  1. package/README.md +2 -2
  2. package/dist/animated-number/index.js +33 -0
  3. package/dist/avatar/index.js +38 -0
  4. package/dist/backdrop/index.d.ts +7 -3
  5. package/dist/backdrop/index.d.ts.map +1 -1
  6. package/dist/backdrop/index.js +98 -0
  7. package/dist/badge/index.d.ts +1 -1
  8. package/dist/badge/index.js +24 -0
  9. package/dist/button/index.d.ts +10 -3
  10. package/dist/button/index.d.ts.map +1 -1
  11. package/dist/button/index.js +54 -0
  12. package/dist/calendar/index.d.ts +44 -0
  13. package/dist/calendar/index.d.ts.map +1 -0
  14. package/dist/calendar/index.js +161 -0
  15. package/dist/card/index.d.ts +15 -6
  16. package/dist/card/index.d.ts.map +1 -1
  17. package/dist/card/index.js +60 -0
  18. package/dist/chart/donut.d.ts +30 -0
  19. package/dist/chart/donut.d.ts.map +1 -0
  20. package/dist/chart/donut.js +96 -0
  21. package/dist/chart/index.d.ts +81 -0
  22. package/dist/chart/index.d.ts.map +1 -0
  23. package/dist/chart/index.js +362 -0
  24. package/dist/chart/tooltip.d.ts +25 -0
  25. package/dist/chart/tooltip.d.ts.map +1 -0
  26. package/dist/chart/tooltip.js +51 -0
  27. package/dist/checkbox/index.d.ts +20 -0
  28. package/dist/checkbox/index.d.ts.map +1 -0
  29. package/dist/checkbox/index.js +61 -0
  30. package/dist/chip/index.d.ts +12 -0
  31. package/dist/chip/index.d.ts.map +1 -0
  32. package/dist/chip/index.js +14 -0
  33. package/dist/code-block/index.js +36 -0
  34. package/dist/collapse/index.d.ts +17 -7
  35. package/dist/collapse/index.d.ts.map +1 -1
  36. package/dist/collapse/index.js +82 -0
  37. package/dist/combobox/index.d.ts +89 -0
  38. package/dist/combobox/index.d.ts.map +1 -0
  39. package/dist/combobox/index.js +262 -0
  40. package/dist/confirm-dialog/index.d.ts.map +1 -1
  41. package/dist/confirm-dialog/index.js +25 -0
  42. package/dist/date-picker/index.d.ts +48 -0
  43. package/dist/date-picker/index.d.ts.map +1 -0
  44. package/dist/date-picker/index.js +112 -0
  45. package/dist/dialog/index.d.ts +14 -2
  46. package/dist/dialog/index.d.ts.map +1 -1
  47. package/dist/dialog/index.js +77 -0
  48. package/dist/disclosure/index.d.ts +25 -0
  49. package/dist/disclosure/index.d.ts.map +1 -0
  50. package/dist/disclosure/index.js +66 -0
  51. package/dist/editable-cell/index.js +24 -0
  52. package/dist/field/index.d.ts +42 -3
  53. package/dist/field/index.d.ts.map +1 -1
  54. package/dist/field/index.js +66 -0
  55. package/dist/header/index.js +17 -0
  56. package/dist/icons/chevron-down.js +21 -0
  57. package/dist/icons/chevron-left.js +21 -0
  58. package/dist/icons/chevron-right.js +21 -0
  59. package/dist/icons/chevron-up.js +21 -0
  60. package/dist/icons/ellipsis.d.ts +4 -0
  61. package/dist/icons/ellipsis.d.ts.map +1 -0
  62. package/dist/icons/ellipsis.js +31 -0
  63. package/dist/icons/index.d.ts +1 -0
  64. package/dist/icons/index.d.ts.map +1 -1
  65. package/dist/icons/search.js +21 -0
  66. package/dist/icons/x-mark.js +21 -0
  67. package/dist/index.d.ts +22 -10
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/input/index.d.ts.map +1 -1
  70. package/dist/input/index.js +16 -0
  71. package/dist/input-group/index.d.ts.map +1 -1
  72. package/dist/input-group/index.js +36 -0
  73. package/dist/inset/index.d.ts +16 -0
  74. package/dist/inset/index.d.ts.map +1 -0
  75. package/dist/inset/index.js +23 -0
  76. package/dist/lib.js +74 -0
  77. package/dist/menu/index.d.ts +55 -0
  78. package/dist/menu/index.d.ts.map +1 -0
  79. package/dist/menu/index.js +118 -0
  80. package/dist/meter/index.js +41 -0
  81. package/dist/money-input/index.d.ts +77 -7
  82. package/dist/money-input/index.d.ts.map +1 -1
  83. package/dist/money-input/index.js +304 -0
  84. package/dist/month-picker/index.d.ts +4 -3
  85. package/dist/month-picker/index.d.ts.map +1 -1
  86. package/dist/month-picker/index.js +93 -0
  87. package/dist/page-header/index.js +26 -0
  88. package/dist/pills/index.d.ts +35 -0
  89. package/dist/pills/index.d.ts.map +1 -0
  90. package/dist/pills/index.js +50 -0
  91. package/dist/popover/index.d.ts +41 -22
  92. package/dist/popover/index.d.ts.map +1 -1
  93. package/dist/popover/index.js +75 -0
  94. package/dist/progress-ring/index.js +49 -0
  95. package/dist/radio-cards/index.d.ts +34 -0
  96. package/dist/radio-cards/index.d.ts.map +1 -0
  97. package/dist/radio-cards/index.js +48 -0
  98. package/dist/radio-group/index.d.ts +39 -0
  99. package/dist/radio-group/index.d.ts.map +1 -0
  100. package/dist/radio-group/index.js +63 -0
  101. package/dist/segmented/index.d.ts +16 -6
  102. package/dist/segmented/index.d.ts.map +1 -1
  103. package/dist/segmented/index.js +58 -0
  104. package/dist/select/index.d.ts +28 -14
  105. package/dist/select/index.d.ts.map +1 -1
  106. package/dist/select/index.js +187 -0
  107. package/dist/side-nav/index.js +37 -0
  108. package/dist/skeleton/index.js +12 -0
  109. package/dist/slider/index.js +34 -0
  110. package/dist/spinner/index.js +14 -0
  111. package/dist/tab-bar/index.d.ts +3 -0
  112. package/dist/tab-bar/index.d.ts.map +1 -1
  113. package/dist/tab-bar/index.js +34 -0
  114. package/dist/table/index.js +148 -0
  115. package/dist/table-of-contents/index.js +37 -0
  116. package/dist/tabs/index.d.ts +3 -2
  117. package/dist/tabs/index.d.ts.map +1 -1
  118. package/dist/tabs/index.js +114 -0
  119. package/dist/tailwind.css +1 -1
  120. package/dist/textarea/index.d.ts.map +1 -1
  121. package/dist/textarea/index.js +16 -0
  122. package/dist/theme-toggle/index.js +43 -0
  123. package/dist/theme.css +178 -13
  124. package/dist/toast/index.d.ts +6 -1
  125. package/dist/toast/index.d.ts.map +1 -1
  126. package/dist/toast/index.js +248 -0
  127. package/dist/toggle/index.d.ts.map +1 -1
  128. package/dist/toggle/index.js +26 -0
  129. package/dist/tooltip/index.d.ts +25 -0
  130. package/dist/tooltip/index.d.ts.map +1 -0
  131. package/dist/tooltip/index.js +108 -0
  132. package/dist/tree/index.d.ts.map +1 -1
  133. package/dist/tree/index.js +135 -0
  134. package/dist/utils/cva.js +25 -0
  135. package/dist/utils/cx.js +6 -0
  136. package/dist/utils/date.d.ts +37 -0
  137. package/dist/utils/date.d.ts.map +1 -0
  138. package/dist/utils/date.js +68 -0
  139. package/dist/utils/field-chevron.js +19 -0
  140. package/dist/utils/fx.d.ts +30 -0
  141. package/dist/utils/fx.d.ts.map +1 -0
  142. package/dist/utils/fx.js +21 -0
  143. package/dist/utils/graphics.js +33 -0
  144. package/dist/utils/indicator.d.ts +24 -0
  145. package/dist/utils/indicator.d.ts.map +1 -0
  146. package/dist/utils/indicator.js +37 -0
  147. package/dist/utils/merge.js +305 -0
  148. package/dist/utils/money.js +73 -0
  149. package/dist/utils/month.js +46 -0
  150. package/dist/utils/slot.d.ts +9 -5
  151. package/dist/utils/slot.d.ts.map +1 -1
  152. package/dist/utils/slot.js +25 -0
  153. package/dist/utils/status-icons.js +48 -0
  154. package/dist/utils/styles.d.ts +6 -6
  155. package/dist/utils/styles.d.ts.map +1 -1
  156. package/dist/utils/styles.js +6 -0
  157. package/dist/utils/theme.js +200 -0
  158. package/dist/utils/useAnchoredPopup.d.ts +8 -2
  159. package/dist/utils/useAnchoredPopup.d.ts.map +1 -1
  160. package/dist/utils/useAnchoredPopup.js +63 -0
  161. package/dist/utils/useHydrated.js +9 -0
  162. package/dist/utils/useVirtualList.js +45 -0
  163. package/dist/variables.css +22 -0
  164. package/dist/zen.css +1 -1
  165. package/package.json +9 -4
  166. package/dist/actions-menu/index.d.ts +0 -18
  167. package/dist/actions-menu/index.d.ts.map +0 -1
  168. package/dist/dropdown/index.d.ts +0 -28
  169. package/dist/dropdown/index.d.ts.map +0 -1
  170. package/dist/nav-pills/index.d.ts +0 -31
  171. package/dist/nav-pills/index.d.ts.map +0 -1
  172. 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 };
@@ -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;;;GAGG;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"}
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 };
@@ -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): Sora's in-page tabs, a bar under the active tab.
6
- * `pills`: Sora's top-nav look, a glowing pill sliding along a glass track.
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;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/tabs/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EACH,cAAc,EAQjB,MAAM,OAAO,CAAC;AAgBf,6GAA6G;AAC7G,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,EAAE,KAAK,EAAE,YAAiB,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,SAAS,+BAetG;AAID;;;GAGG;AACH,wBAAgB,OAAO,CAAC,EAAE,OAAqB,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,YAAY,+BA8D5F;AAED,wBAAgB,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,QAAQ,+BA2BnE;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"}
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
@@ -4,4 +4,4 @@
4
4
  * @import '@rinzai/zen/tailwind.css';
5
5
  */
6
6
  @import './theme.css';
7
- @source './zen.js';
7
+ @source './**/*.js';