@cascivo/react 0.16.0 → 0.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +6 -1
  2. package/dist/badge/badge.js +1 -1
  3. package/dist/context-menu/context-menu.js +42 -38
  4. package/dist/index.d.ts +235 -141
  5. package/dist/infinite-scroll/infinite-scroll.css +1 -0
  6. package/dist/infinite-scroll/infinite-scroll.js +49 -0
  7. package/dist/infinite-scroll/infinite-scroll.module.js +8 -0
  8. package/dist/large-title-header/large-title-header.css +1 -0
  9. package/dist/large-title-header/large-title-header.js +38 -0
  10. package/dist/large-title-header/large-title-header.module.js +13 -0
  11. package/dist/link/link.css +1 -1
  12. package/dist/link/link.module.js +1 -1
  13. package/dist/menu/menu.js +47 -43
  14. package/dist/node/badge/badge.js +1 -1
  15. package/dist/node/context-menu/context-menu.js +42 -38
  16. package/dist/node/infinite-scroll/infinite-scroll.js +49 -0
  17. package/dist/node/infinite-scroll/infinite-scroll.module.js +7 -0
  18. package/dist/node/large-title-header/large-title-header.js +38 -0
  19. package/dist/node/large-title-header/large-title-header.module.js +12 -0
  20. package/dist/node/link/link.module.js +1 -1
  21. package/dist/node/menu/menu.js +47 -43
  22. package/dist/node/react/src/index.js +27 -23
  23. package/dist/node/reorder-list/reorder-list.js +143 -0
  24. package/dist/node/reorder-list/reorder-list.module.js +11 -0
  25. package/dist/node/skip-nav/skip-nav.js +1 -0
  26. package/dist/node/tabs/tabs.js +38 -38
  27. package/dist/node/tag/tag.module.js +2 -2
  28. package/dist/node/virtual-list/virtual-list.js +40 -0
  29. package/dist/node/virtual-list/virtual-list.module.js +7 -0
  30. package/dist/node/wheel-picker/wheel-picker.js +84 -0
  31. package/dist/node/wheel-picker/wheel-picker.module.js +8 -0
  32. package/dist/react/src/index.js +27 -23
  33. package/dist/reorder-list/reorder-list.css +1 -0
  34. package/dist/reorder-list/reorder-list.js +143 -0
  35. package/dist/reorder-list/reorder-list.module.js +12 -0
  36. package/dist/skip-nav/skip-nav.js +1 -0
  37. package/dist/styles.css +41 -4
  38. package/dist/tabs/tabs.js +38 -38
  39. package/dist/tag/tag.css +1 -1
  40. package/dist/tag/tag.module.js +2 -2
  41. package/dist/virtual-list/virtual-list.css +1 -0
  42. package/dist/virtual-list/virtual-list.js +40 -0
  43. package/dist/virtual-list/virtual-list.module.js +8 -0
  44. package/dist/wheel-picker/wheel-picker.css +1 -0
  45. package/dist/wheel-picker/wheel-picker.js +84 -0
  46. package/dist/wheel-picker/wheel-picker.module.js +9 -0
  47. package/package.json +4 -4
  48. package/readme.body.md +6 -1
  49. package/dist/node/react/src/theme.js +0 -78
  50. package/dist/node/storage/src/drivers.js +0 -34
  51. package/dist/node/storage/src/persisted-signal.js +0 -41
  52. package/dist/react/src/theme.js +0 -78
  53. package/dist/storage/src/drivers.js +0 -34
  54. package/dist/storage/src/persisted-signal.js +0 -41
@@ -0,0 +1,143 @@
1
+ "use client";
2
+
3
+ import e from "./reorder-list.module.js";
4
+ import { useRef as t } from "react";
5
+ import { cn as n, useSignal as r, useSignalEffect as i, useSignals as a } from "@cascivo/core";
6
+ import { builtin as o, t as s } from "@cascivo/i18n";
7
+ import { jsx as c, jsxs as l } from "react/jsx-runtime";
8
+ //#region ../components/src/reorder-list/reorder-list.tsx
9
+ function u(e) {
10
+ return e.name ?? (typeof e.label == "string" ? e.label : e.id);
11
+ }
12
+ function d(e, t, n) {
13
+ let r = e.slice(), [i] = r.splice(t, 1);
14
+ return i && r.splice(n, 0, i), r;
15
+ }
16
+ function f({ value: f, onValueChange: p, disabled: m = !1, labels: h, className: g }) {
17
+ a();
18
+ let _ = t(null), v = r(null), y = r(""), b = t(f);
19
+ b.current = f;
20
+ let x = t(p);
21
+ x.current = p;
22
+ let S = t(m);
23
+ S.current = m;
24
+ let C = t(null), w = (e, t, n) => {
25
+ y.value = e ? e.replace("{name}", n.name).replace("{position}", String(n.position)).replace("{total}", String(n.total)) : t;
26
+ }, T = (e, t) => {
27
+ let n = b.current, r = Math.max(0, Math.min(n.length - 1, t));
28
+ if (r === e) return;
29
+ let i = n[e];
30
+ if (!i) return;
31
+ x.current(d(n, e, r)), v.value = r;
32
+ let a = {
33
+ name: u(i),
34
+ position: r + 1,
35
+ total: n.length
36
+ };
37
+ w(h?.moved, s(o.reorderList.moved, a), a);
38
+ }, E = (e) => {
39
+ let t = b.current, n = t[e];
40
+ if (!n) return;
41
+ C.current = t, v.value = e;
42
+ let r = {
43
+ name: u(n),
44
+ position: e + 1,
45
+ total: t.length
46
+ };
47
+ w(h?.grabbed, s(o.reorderList.grabbed, r), r);
48
+ }, D = () => {
49
+ let e = v.value;
50
+ if (e === null) return;
51
+ let t = b.current, n = t[e];
52
+ if (C.current = null, v.value = null, !n) return;
53
+ let r = {
54
+ name: u(n),
55
+ position: e + 1,
56
+ total: t.length
57
+ };
58
+ w(h?.dropped, s(o.reorderList.dropped, r), r);
59
+ }, O = () => {
60
+ let e = C.current, t = v.value;
61
+ if (C.current = null, v.value = null, !e) return;
62
+ x.current(e);
63
+ let n = t === null ? void 0 : e[t], r = {
64
+ name: n ? u(n) : "",
65
+ position: (t ?? 0) + 1,
66
+ total: e.length
67
+ };
68
+ w(h?.cancelled, s(o.reorderList.cancelled, r), r);
69
+ }, k = (e, t) => {
70
+ if (m) return;
71
+ let n = v.value;
72
+ if (e.key === " " || e.key === "Enter") {
73
+ e.preventDefault(), n === t ? D() : E(t);
74
+ return;
75
+ }
76
+ if (e.key === "Escape" && n !== null) {
77
+ e.preventDefault(), O();
78
+ return;
79
+ }
80
+ n === t && (e.key === "ArrowUp" ? (e.preventDefault(), T(t, t - 1)) : e.key === "ArrowDown" && (e.preventDefault(), T(t, t + 1)));
81
+ };
82
+ return i(() => {
83
+ let e = _.current;
84
+ if (!e || typeof window > "u") return;
85
+ let t = (t) => {
86
+ let n = v.value;
87
+ if (n === null || S.current) return;
88
+ let r = [...e.querySelectorAll("[data-reorder-row]")].findIndex((e) => {
89
+ let n = e.getBoundingClientRect();
90
+ return t.clientY >= n.top && t.clientY <= n.bottom;
91
+ });
92
+ r !== -1 && r !== n && T(n, r);
93
+ }, n = () => {
94
+ v.value !== null && C.current && D();
95
+ };
96
+ return window.addEventListener("pointermove", t), window.addEventListener("pointerup", n), window.addEventListener("pointercancel", n), () => {
97
+ window.removeEventListener("pointermove", t), window.removeEventListener("pointerup", n), window.removeEventListener("pointercancel", n);
98
+ };
99
+ }), /* @__PURE__ */ l("div", {
100
+ className: n(e.root, g),
101
+ children: [/* @__PURE__ */ c("ul", {
102
+ ref: _,
103
+ className: e.list,
104
+ children: f.map((t, n) => /* @__PURE__ */ l("li", {
105
+ "data-reorder-row": "",
106
+ "data-active": v.value === n ? "" : void 0,
107
+ className: e.row,
108
+ children: [/* @__PURE__ */ c("button", {
109
+ type: "button",
110
+ disabled: m,
111
+ "aria-label": h?.handle ? h.handle.replace("{name}", u(t)) : s(o.reorderList.handle, { name: u(t) }),
112
+ "aria-pressed": v.value === n,
113
+ className: e.handle,
114
+ onKeyDown: (e) => k(e, n),
115
+ onPointerDown: () => {
116
+ m || E(n);
117
+ },
118
+ children: /* @__PURE__ */ c("svg", {
119
+ "aria-hidden": "true",
120
+ viewBox: "0 0 16 16",
121
+ className: e.grip,
122
+ children: /* @__PURE__ */ c("path", {
123
+ d: "M6 4h.01M10 4h.01M6 8h.01M10 8h.01M6 12h.01M10 12h.01",
124
+ stroke: "currentColor",
125
+ strokeWidth: "2",
126
+ strokeLinecap: "round"
127
+ })
128
+ })
129
+ }), /* @__PURE__ */ c("span", {
130
+ className: e.label,
131
+ children: t.label
132
+ })]
133
+ }, t.id))
134
+ }), /* @__PURE__ */ c("span", {
135
+ role: "status",
136
+ "aria-live": "polite",
137
+ className: e.srOnly,
138
+ children: y.value
139
+ })]
140
+ });
141
+ }
142
+ //#endregion
143
+ export { f as ReorderList };
@@ -0,0 +1,12 @@
1
+ import './reorder-list.css';
2
+ var e = {
3
+ root: "_root_1tie9_4",
4
+ list: "_list_1tie9_8",
5
+ row: "_row_1tie9_16",
6
+ handle: "_handle_1tie9_34",
7
+ grip: "_grip_1tie9_69",
8
+ label: "_label_1tie9_74",
9
+ srOnly: "_srOnly_1tie9_79"
10
+ };
11
+ //#endregion
12
+ export { e as default };
@@ -10,6 +10,7 @@ var s = "cascade-skip-target", c = t(function({ targetId: t = s, labels: c, clas
10
10
  r();
11
11
  let f = c?.label ?? a(i.skipNav.label);
12
12
  return /* @__PURE__ */ o("a", {
13
+ ref: d,
13
14
  href: `#${t}`,
14
15
  className: n(e.link, l),
15
16
  ...u,
package/dist/styles.css CHANGED
@@ -13,6 +13,8 @@
13
13
  * cascivo.base minimal html font/color reset (@cascivo/themes/base.css)
14
14
  * cascivo.tokens primitive design tokens + @function helpers (@cascivo/tokens)
15
15
  * cascivo.component component + layout styles
16
+ * cascivo.platform platform-idiomatic geometry + motion (@cascivo/platform),
17
+ * keyed [data-platform] — see below
16
18
  * cascivo.theme semantic token values per [data-theme] (@cascivo/themes/*)
17
19
  * cascivo.blocks shipped composite blocks — each block gets its own
18
20
  * cascivo.blocks.<name> sublayer (packages/components/src/blocks/*)
@@ -29,13 +31,22 @@
29
31
  * sublayers (cascivo.example) are not shipped by any package; insert them between
30
32
  * cascivo.blocks and cascivo.override.
31
33
  *
34
+ * cascivo.platform sits ABOVE component and BELOW theme, and that placement encodes an
35
+ * invariant: **platform owns geometry, motion and interaction affordance; theme owns
36
+ * colour; neither writes the other's properties.** Above component, so a platform can
37
+ * re-tune the geometry a component chose. Below theme, so a platform can never win a
38
+ * colour decision — which is safe precisely because it is forbidden from setting one.
39
+ * `packages/platform/src/parity.test.ts` enforces the colour half mechanically. Keeping
40
+ * the two axes disjoint is what makes them compose additively (12 themes + N platforms)
41
+ * instead of multiplicatively.
42
+ *
32
43
  * Guard: scripts/checks/layer-order.test.ts asserts every shipped/scaffolded
33
44
  * @layer statement is an ordered subsequence of this one, and that every shipped
34
45
  * `@layer cascivo.* { … }` block uses a canonical name or the cascivo.blocks.<name>
35
46
  * pattern (depth ≤ 3) — no invented layer names.
36
47
  */
37
- @layer cascivo.reset, cascivo.base, cascivo.tokens, cascivo.component, cascivo.theme, cascivo.blocks,
38
- cascivo.override;
48
+ @layer cascivo.reset, cascivo.base, cascivo.tokens, cascivo.component, cascivo.platform,
49
+ cascivo.theme, cascivo.blocks, cascivo.override;
39
50
  /* packages/tokens/src/reset.css */
40
51
  /* cascivo — the `cascivo.reset` floor. */
41
52
  /*
@@ -204,6 +215,22 @@
204
215
  --cascivo-text-3xl: 1.875rem; /* 30px */
205
216
  --cascivo-text-4xl: 2.25rem; /* 36px */
206
217
 
218
+ /* `--cascivo-font-size-*` aliases of the `--cascivo-text-*` scale above.
219
+ The split is a trap for anyone typing from memory — and agents type from memory:
220
+ `--cascivo-text-*` is the SIZE while `--cascivo-font-*` is weight and family, so
221
+ `--cascivo-font-size-sm` is the natural guess and used to resolve to nothing (an
222
+ invalid custom property is silently dropped, with no error anywhere). Aliasing costs
223
+ nothing and removes the trap instead of documenting it. `--cascivo-text-*` remains
224
+ canonical; these forward to it and can never drift, because they are `var()` refs. */
225
+ --cascivo-font-size-xs: var(--cascivo-text-xs);
226
+ --cascivo-font-size-sm: var(--cascivo-text-sm);
227
+ --cascivo-font-size-base: var(--cascivo-text-base);
228
+ --cascivo-font-size-lg: var(--cascivo-text-lg);
229
+ --cascivo-font-size-xl: var(--cascivo-text-xl);
230
+ --cascivo-font-size-2xl: var(--cascivo-text-2xl);
231
+ --cascivo-font-size-3xl: var(--cascivo-text-3xl);
232
+ --cascivo-font-size-4xl: var(--cascivo-text-4xl);
233
+
207
234
  --cascivo-font-normal: 400;
208
235
  --cascivo-font-medium: 500;
209
236
  --cascivo-font-semibold: 600;
@@ -966,6 +993,8 @@
966
993
  /*$vite$:1*/
967
994
  @layer cascivo.component{._indicator_12iz3_2{display:inline-flex;position:relative}._overlay_12iz3_7{z-index:1;pointer-events:none;position:absolute}._indicator_12iz3_2[data-placement=top-start] ._overlay_12iz3_7{inset-block-start:0;inset-inline-start:0;transform:translate(-25%,-25%)}._indicator_12iz3_2[data-placement=top-end] ._overlay_12iz3_7{inset-block-start:0;inset-inline-end:0;transform:translate(25%,-25%)}._indicator_12iz3_2[data-placement=bottom-start] ._overlay_12iz3_7{inset-block-end:0;inset-inline-start:0;transform:translate(-25%,25%)}._indicator_12iz3_2[data-placement=bottom-end] ._overlay_12iz3_7{inset-block-end:0;inset-inline-end:0;transform:translate(25%,25%)}}
968
995
  /*$vite$:1*/
996
+ @layer cascivo.component{._root_50go8_2{padding-block:var(--cascivo-space-4);justify-content:center;align-items:center;display:flex}._status_50go8_9{align-items:center;gap:var(--cascivo-space-2);color:var(--cascivo-color-text-muted);font-size:var(--cascivo-text-ui);display:inline-flex}._button_50go8_17{padding-inline:var(--cascivo-space-4);padding-block:var(--cascivo-space-2);border:1px solid var(--cascivo-color-border);border-radius:var(--cascivo-radius-md);color:var(--cascivo-color-foreground);font:inherit;font-size:var(--cascivo-text-ui);cursor:pointer;background:0 0;justify-content:center;align-items:center;display:inline-flex}._button_50go8_17:hover{background:var(--cascivo-color-surface-2)}._button_50go8_17:focus-visible{outline:var(--cascivo-ring-width) solid var(--cascivo-ring-color);outline-offset:2px}@media (pointer:coarse){._button_50go8_17{min-block-size:var(--cascivo-target-min-coarse,2.75rem)}}}
997
+ /*$vite$:1*/
969
998
  @layer cascivo.component{._inline-loading_h27o5_2{align-items:center;gap:var(--cascivo-space-2);font-family:var(--cascivo-font-sans);font-size:var(--cascivo-text-sm);line-height:var(--cascivo-leading-none);color:var(--cascivo-color-text);display:inline-flex}._inline-loading_h27o5_2[data-status=finished]{color:var(--cascivo-color-success-foreground,var(--cascivo-color-success))}._inline-loading_h27o5_2[data-status=error]{color:var(--cascivo-color-destructive)}._indicator_h27o5_20{flex-shrink:0;justify-content:center;align-items:center;block-size:1rem;inline-size:1rem;display:inline-flex}._spinner_h27o5_29{color:var(--cascivo-color-text-muted)}._icon_h27o5_33{opacity:1;block-size:1rem;inline-size:1rem}@starting-style{._icon_h27o5_33{opacity:0}}._icon_h27o5_33{transition:opacity var(--cascivo-motion-enter)}._label_h27o5_46{color:inherit}}@media (forced-colors:active){._inline-loading_h27o5_2[data-status=finished],._inline-loading_h27o5_2[data-status=error]{color:canvastext}}
970
999
  /*$vite$:1*/
971
1000
  @layer cascivo.component{._input-group_n9tv2_2{align-items:stretch;width:100%;display:flex}._input-group_n9tv2_2[data-has-prefix] ._input-wrap_n9tv2_8>*{border-start-start-radius:0;border-end-start-radius:0}._input-group_n9tv2_2[data-has-suffix] ._input-wrap_n9tv2_8>*{border-start-end-radius:0;border-end-end-radius:0}._input-group_n9tv2_2[data-has-prefix] ._addon_n9tv2_18[data-position=prefix]{border-inline-end:none;border-start-end-radius:0;border-end-end-radius:0}._input-group_n9tv2_2[data-has-suffix] ._addon_n9tv2_18[data-position=suffix]{border-inline-start:none;border-start-start-radius:0;border-end-start-radius:0}._input-wrap_n9tv2_8{flex:1;min-width:0}._input-wrap_n9tv2_8>*{width:100%}._addon_n9tv2_18{padding-inline:var(--cascivo-space-3);font-family:var(--cascivo-font-sans);font-size:var(--cascivo-text-sm);color:var(--cascivo-color-text-subtle);background-color:var(--cascivo-color-bg-subtle);border:1px solid var(--cascivo-color-border);border-radius:var(--cascivo-radius-field);white-space:nowrap;flex-shrink:0;align-items:center;display:inline-flex}._input-group_n9tv2_2:has(._inline-addon_n9tv2_55){border:1px solid var(--cascivo-color-border);border-radius:var(--cascivo-radius-field,var(--cascivo-radius-control));background:var(--cascivo-color-bg);align-items:center;transition:border-color .12s,box-shadow .12s;display:flex}._input-group_n9tv2_2:has(._inline-addon_n9tv2_55):focus-within{border-color:var(--cascivo-color-accent);box-shadow:var(--cascivo-focus-ring)}._input-group_n9tv2_2:has(._inline-addon_n9tv2_55) ._input-wrap_n9tv2_8 input{box-shadow:none;background:0 0;border:none;outline:none}._inline-addon_n9tv2_55{color:var(--cascivo-color-text-subtle);pointer-events:none;align-items:center;display:inline-flex}._inline-addon_n9tv2_55[data-align=inline-start]{order:-1;padding-inline-start:var(--cascivo-space-3)}._inline-addon_n9tv2_55[data-align=inline-end]{order:1;padding-inline-end:var(--cascivo-space-3)}._inline-addon_n9tv2_55 svg{block-size:1rem;inline-size:1rem}._button-group_n9tv2_101{align-items:stretch;display:inline-flex}._button-group_n9tv2_101>:not(:first-child){border-start-start-radius:0;border-end-start-radius:0;margin-inline-start:-1px}._button-group_n9tv2_101>:not(:last-child){border-start-end-radius:0;border-end-end-radius:0}._button-group_n9tv2_101>:focus-visible{z-index:1;position:relative}}
@@ -980,6 +1009,8 @@
980
1009
  /*$vite$:1*/
981
1010
  @layer cascivo.component{._label_qztdi_2{align-items:center;gap:var(--cascivo-space-1);font-family:var(--cascivo-font-sans);font-size:var(--cascivo-text-sm);font-weight:var(--cascivo-font-medium);line-height:var(--cascivo-leading-snug);color:var(--cascivo-color-text);display:inline-flex}._label_qztdi_2[data-disabled]{opacity:.5;cursor:not-allowed}._marker_qztdi_18{color:var(--cascivo-color-destructive);line-height:var(--cascivo-leading-none)}._srOnly_qztdi_23{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0;block-size:1px;inline-size:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}}@media (forced-colors:active){._label_qztdi_2[data-disabled]{color:graytext}}
982
1011
  /*$vite$:1*/
1012
+ @layer cascivo.component{._root_1fozn_6{background:var(--cascivo-color-surface);block-size:100%;overflow-y:auto}._bar_1fozn_12{z-index:var(--cascivo-z-raised);align-items:center;gap:var(--cascivo-space-2);min-block-size:var(--cascivo-target-min-coarse,2.75rem);padding-inline:var(--cascivo-space-4);background:var(--cascivo-color-surface);border-block-end:1px solid #0000;padding-block-start:env(safe-area-inset-top,0px);display:flex;position:sticky;inset-block-start:0}._slot_1fozn_29{align-items:center;gap:var(--cascivo-space-1);flex:1 0 0;min-inline-size:0;display:flex}._slotEnd_1fozn_37{justify-content:flex-end}._compactTitle_1fozn_41{min-inline-size:0;font-size:var(--cascivo-text-ui);font-weight:var(--cascivo-font-semibold);color:var(--cascivo-color-foreground);text-overflow:ellipsis;white-space:nowrap;flex:0 auto;display:none;overflow:hidden}._largeTitle_1fozn_56{padding-inline:var(--cascivo-space-4);padding-block:var(--cascivo-space-2) var(--cascivo-space-4);font-size:var(--cascivo-text-heading-lg);font-weight:var(--cascivo-font-bold);line-height:var(--cascivo-leading-tight);color:var(--cascivo-color-foreground);letter-spacing:-.02em;margin:0}@supports (animation-timeline:scroll()){._compactTitle_1fozn_41{opacity:0;animation:linear both _cascivo-large-title-reveal_1fozn_1;animation-timeline:scroll();animation-range:0 var(--_collapse,48px);display:block}._bar_1fozn_12{animation:linear both _cascivo-large-title-hairline_1fozn_1;animation-timeline:scroll();animation-range:0 var(--_collapse,48px)}@media (prefers-reduced-motion:reduce){._compactTitle_1fozn_41,._bar_1fozn_12{animation-timing-function:step-end}}}@keyframes _cascivo-large-title-reveal_1fozn_1{to{opacity:1}}@keyframes _cascivo-large-title-hairline_1fozn_1{to{border-block-end-color:var(--cascivo-border-subtle)}}}
1013
+ /*$vite$:1*/
983
1014
  @layer cascivo.component{._auto-grid_v8cqo_2{grid-template-columns:repeat(auto-fill, minmax(min(var(--_min,16rem), 100%), 1fr));gap:var(--_gap,var(--cascivo-space-4));display:grid}}
984
1015
  /*$vite$:1*/
985
1016
  @layer cascivo.component{._center_1euo8_2{max-inline-size:var(--_center-max,48rem);padding-inline:var(--cascivo-space-4);inline-size:100%;margin-inline:auto}}
@@ -994,7 +1025,7 @@
994
1025
  /*$vite$:1*/
995
1026
  @layer cascivo.component{._spacer_9ie78_2{block-size:var(--_spacer-size,var(--cascivo-space-4));flex-shrink:0}}
996
1027
  /*$vite$:1*/
997
- @layer cascivo.component{._link_6dwxn_2{color:var(--cascivo-link-color,var(--cascivo-color-accent));cursor:pointer;border-radius:var(--cascivo-radius-item);text-underline-offset:.2em;transition:color var(--cascivo-duration-150) var(--cascivo-ease-out)}._link_6dwxn_2:hover{color:var(--cascivo-color-accent-hover)}._link_6dwxn_2:active{color:var(--cascivo-color-accent-active)}._link_6dwxn_2:focus-visible{box-shadow:var(--cascivo-focus-ring);outline:none}._link_6dwxn_2[data-variant=standalone]{font-family:var(--cascivo-font-sans);font-weight:var(--cascivo-font-medium);text-decoration:none}._link_6dwxn_2[data-variant=standalone]:hover{text-decoration:underline}._link_6dwxn_2[data-variant=standalone][data-size=sm]{font-size:var(--cascivo-text-sm)}._link_6dwxn_2[data-variant=standalone][data-size=md]{font-size:var(--cascivo-text-base)}._link_6dwxn_2[data-variant=standalone][data-size=lg]{font-size:var(--cascivo-text-lg)}._link_6dwxn_2[data-variant=inline]{font:inherit;text-decoration:underline}._link_6dwxn_2[data-external]:after{content:"↗" / "";margin-inline-start:var(--cascivo-space-1);font-size:.8em}}
1028
+ @layer cascivo.component{._link_14poz_2{color:var(--cascivo-link-color,var(--cascivo-color-accent));cursor:pointer;border-radius:var(--cascivo-radius-item);text-underline-offset:.2em;transition:color var(--cascivo-duration-150) var(--cascivo-ease-out)}._link_14poz_2:hover{color:var(--cascivo-color-accent-hover)}._link_14poz_2:active{color:var(--cascivo-color-accent-active)}._link_14poz_2:focus-visible{box-shadow:var(--cascivo-focus-ring);outline:none}._link_14poz_2[data-variant=standalone]{font-family:var(--cascivo-font-sans);font-weight:var(--cascivo-font-medium);text-decoration:none}._link_14poz_2[data-variant=standalone]:hover{text-decoration:underline}._link_14poz_2[data-variant=standalone][data-size=sm]{font-size:var(--cascivo-text-sm)}._link_14poz_2[data-variant=standalone][data-size=md]{font-size:var(--cascivo-text-base)}._link_14poz_2[data-variant=standalone][data-size=lg]{font-size:var(--cascivo-text-lg)}._link_14poz_2[data-variant=inline]{font:inherit;text-decoration:underline}._link_14poz_2[data-external]:not(:has(>svg:last-child)):after{content:"↗" / "";margin-inline-start:var(--cascivo-space-1);font-size:.8em}}
998
1029
  /*$vite$:1*/
999
1030
  @layer cascivo.component{._list_96m5o_2{font-family:var(--cascivo-font-sans);font-size:var(--cascivo-text-base);line-height:var(--cascivo-leading-normal);color:var(--cascivo-color-text);margin:0;padding-inline-start:var(--cascivo-space-6)}._list_96m5o_2[data-marker=disc]{list-style-type:disc}._list_96m5o_2[data-marker=decimal]{list-style-type:decimal}._list_96m5o_2[data-marker=none]{padding-inline-start:0;list-style-type:none}._item_96m5o_24{margin-block:var(--cascivo-space-1)}}
1000
1031
  /*$vite$:1*/
@@ -1052,6 +1083,8 @@
1052
1083
  /*$vite$:1*/
1053
1084
  @layer cascivo.component{._relativeTime_ohxan_2{color:inherit;font:inherit;display:inline}}
1054
1085
  /*$vite$:1*/
1086
+ @layer cascivo.component{._root_1tie9_4{position:relative}._list_1tie9_8{flex-direction:column;margin:0;padding:0;list-style:none;display:flex}._row_1tie9_16{align-items:center;gap:var(--cascivo-space-2);padding-inline:var(--cascivo-space-2);padding-block:var(--cascivo-space-2);border-block-end:1px solid var(--cascivo-border-subtle);background:var(--cascivo-color-surface);display:flex}._row_1tie9_16:last-child{border-block-end:none}._row_1tie9_16[data-active]{background:var(--cascivo-color-surface-2)}._handle_1tie9_34{padding:var(--cascivo-space-1);border-radius:var(--cascivo-radius-sm);color:var(--cascivo-color-text-muted);touch-action:none;cursor:grab;background:0 0;border:none;flex:none;justify-content:center;align-items:center;display:inline-flex}._handle_1tie9_34:focus-visible{outline:var(--cascivo-ring-width) solid var(--cascivo-ring-color);outline-offset:2px}._handle_1tie9_34[aria-pressed=true]{color:var(--cascivo-color-accent);cursor:grabbing}._handle_1tie9_34:disabled{opacity:var(--cascivo-disabled-opacity);cursor:not-allowed}@media (pointer:coarse){._handle_1tie9_34{min-inline-size:var(--cascivo-target-min-coarse,2.75rem);min-block-size:var(--cascivo-target-min-coarse,2.75rem)}}._grip_1tie9_69{block-size:1rem;inline-size:1rem}._label_1tie9_74{min-inline-size:0;color:var(--cascivo-color-foreground)}._srOnly_1tie9_79{clip-path:inset(50%);white-space:nowrap;border:0;block-size:1px;inline-size:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}}
1087
+ /*$vite$:1*/
1055
1088
  @layer cascivo.component{._resizable_1agxs_2{block-size:100%;inline-size:100%;display:flex;overflow:hidden}._resizable_1agxs_2[data-orientation=horizontal]{flex-direction:row}._resizable_1agxs_2[data-orientation=vertical]{flex-direction:column}._pane_1agxs_17{min-block-size:0;min-inline-size:0;overflow:auto}._pane_1agxs_17:first-child{flex:var(--cascivo-resizable-ratio,.5)}._pane_1agxs_17:last-child{flex:calc(1 - var(--cascivo-resizable-ratio,.5))}._handle_1agxs_31{background-color:var(--cascivo-color-border);touch-action:none;flex:none;justify-content:center;align-items:center;display:flex;position:relative}._handle_1agxs_31:hover{background-color:var(--cascivo-color-border-strong)}._handle_1agxs_31:focus-visible{box-shadow:var(--cascivo-focus-ring);outline:none}._grip_1agxs_50{border-radius:var(--cascivo-radius-full);background-color:var(--cascivo-color-border-strong)}._resizable_1agxs_2[data-orientation=horizontal] ._handle_1agxs_31{cursor:col-resize;inline-size:.5rem}._resizable_1agxs_2[data-orientation=horizontal] ._grip_1agxs_50{block-size:2rem;inline-size:.125rem}._resizable_1agxs_2[data-orientation=vertical] ._handle_1agxs_31{cursor:row-resize;block-size:.5rem}._resizable_1agxs_2[data-orientation=vertical] ._grip_1agxs_50{block-size:.125rem;inline-size:2rem}}@media (forced-colors:active){._handle_1agxs_31{border:1px solid buttontext}._handle_1agxs_31:focus-visible{outline-offset:2px;outline:2px solid highlight}}
1056
1089
  /*$vite$:1*/
1057
1090
  @layer cascivo.component{._root_v07bg_2{max-block-size:var(--cascivo-scroll-area-height,none);max-inline-size:var(--cascivo-scroll-area-width,none);scrollbar-width:thin;scrollbar-color:var(--cascivo-color-border) transparent}._root_v07bg_2[data-orientation=vertical]{overflow:hidden auto}._root_v07bg_2[data-orientation=horizontal]{overflow:auto hidden}._root_v07bg_2[data-orientation=both]{overflow:auto}._root_v07bg_2::-webkit-scrollbar{block-size:.5rem;inline-size:.5rem}._root_v07bg_2::-webkit-scrollbar-track{background:0 0}._root_v07bg_2::-webkit-scrollbar-thumb{background-color:var(--cascivo-color-border);border-radius:var(--cascivo-radius-control)}._root_v07bg_2::-webkit-scrollbar-thumb:hover{background-color:var(--cascivo-color-text-subtle)}._root_v07bg_2{background:linear-gradient(var(--cascivo-color-surface) 30%, transparent) center top / 100% 1.5rem no-repeat, linear-gradient(transparent, var(--cascivo-color-surface) 70%) center bottom / 100% 1.5rem no-repeat;background-attachment:local,local}._root_v07bg_2[data-scroll-top]:not([data-edges=none]){box-shadow:inset 0 .5rem .4rem -.4rem color-mix(in srgb, var(--cascivo-color-text) 12%, transparent)}._root_v07bg_2[data-scroll-bottom]:not([data-edges=none]){box-shadow:inset 0 -.5rem .4rem -.4rem color-mix(in srgb, var(--cascivo-color-text) 12%, transparent)}._root_v07bg_2[data-scroll-top][data-scroll-bottom]:not([data-edges=none]){box-shadow:inset 0 .5rem .4rem -.4rem color-mix(in srgb, var(--cascivo-color-text) 12%, transparent), inset 0 -.5rem .4rem -.4rem color-mix(in srgb, var(--cascivo-color-text) 12%, transparent)}._root_v07bg_2[data-edges=mask][data-scroll-top]{-webkit-mask-image:linear-gradient(#0000,#000 1.5rem);mask-image:linear-gradient(#0000,#000 1.5rem)}._root_v07bg_2[data-edges=mask][data-scroll-bottom]{-webkit-mask-image:linear-gradient(0deg,#0000,#000 1.5rem);mask-image:linear-gradient(0deg,#0000,#000 1.5rem)}._root_v07bg_2[data-edges=mask][data-scroll-top][data-scroll-bottom]{-webkit-mask-image:linear-gradient(#0000,#000 1.5rem calc(100% - 1.5rem),#0000);mask-image:linear-gradient(#0000,#000 1.5rem calc(100% - 1.5rem),#0000)}}
@@ -1096,7 +1129,7 @@
1096
1129
  /*$vite$:1*/
1097
1130
  @layer cascivo.component{._tabs_1i48y_2{gap:var(--cascivo-space-4);flex-direction:column;display:flex}._list_1i48y_8{gap:var(--cascivo-space-1);border-block-end:1px solid var(--cascivo-color-border);scroll-snap-type:x proximity;scrollbar-width:thin;-webkit-overflow-scrolling:touch;overscroll-behavior-x:contain;flex-wrap:nowrap;display:flex;overflow-x:auto}._trigger_1i48y_20{padding-inline:var(--cascivo-space-3);padding-block:var(--cascivo-space-2);font-family:var(--cascivo-font-sans);font-size:var(--cascivo-text-sm);font-weight:var(--cascivo-font-medium);color:var(--cascivo-color-text-subtle);cursor:pointer;transition:color var(--cascivo-duration-150) var(--cascivo-ease-out);background:0 0;border:none;position:relative}._trigger_1i48y_20:after{content:"";background-color:var(--cascivo-color-accent);block-size:2px;transition:scale var(--cascivo-duration-150) var(--cascivo-ease-out);position:absolute;inset-block-end:-1px;inset-inline:0;scale:0 1}._trigger_1i48y_20:hover:not(:disabled){color:var(--cascivo-color-text)}._trigger_1i48y_20:focus-visible{box-shadow:var(--cascivo-focus-ring);border-radius:var(--cascivo-radius-control);outline:none}._trigger_1i48y_20:disabled{opacity:.5;cursor:not-allowed}._trigger_1i48y_20[data-state=active]{color:var(--cascivo-color-text)}._trigger_1i48y_20[data-state=active]:after{scale:1}._content_1i48y_68{font-family:var(--cascivo-font-sans);color:var(--cascivo-color-text)}._content_1i48y_68:focus-visible{box-shadow:var(--cascivo-focus-ring);border-radius:var(--cascivo-radius-control);outline:none}}@media (forced-colors:active){._list_1i48y_8{border-block-end:1px solid buttontext}._trigger_1i48y_20[data-state=active]{border-block-end:2px solid highlight}._trigger_1i48y_20:focus-visible{outline-offset:2px;outline:2px solid highlight}}
1098
1131
  /*$vite$:1*/
1099
- @layer cascivo.component{._tag_onneh_2{align-items:center;gap:var(--cascivo-space-1);font-family:var(--cascivo-font-sans);font-weight:var(--cascivo-font-medium);border-radius:var(--cascivo-radius-badge);white-space:nowrap;display:inline-flex}._tag_onneh_2[data-size=sm]{padding-inline:var(--cascivo-space-2);padding-block:var(--cascivo-space-1);font-size:var(--cascivo-text-xs);line-height:1}._tag_onneh_2[data-size=md]{padding-inline:var(--cascivo-space-3);padding-block:var(--cascivo-space-1);font-size:var(--cascivo-text-xs);line-height:var(--cascivo-leading-normal)}._tag_onneh_2[data-variant=default]{background-color:var(--cascivo-color-bg-subtle);color:var(--cascivo-color-text-subtle)}._tag_onneh_2[data-variant=info]{background-color:var(--cascivo-color-info-subtle);color:var(--cascivo-color-info-foreground)}._tag_onneh_2[data-variant=success]{background-color:var(--cascivo-color-success-subtle);color:var(--cascivo-color-success-foreground)}._tag_onneh_2[data-variant=warning]{background-color:var(--cascivo-color-warning-subtle);color:var(--cascivo-color-warning-foreground)}._tag_onneh_2[data-variant=error]{background-color:var(--cascivo-color-destructive-subtle);color:var(--cascivo-color-destructive-foreground)}._dismiss_onneh_51{color:currentColor;font-size:inherit;cursor:pointer;border-radius:var(--cascivo-radius-full);opacity:.7;transition:opacity var(--cascivo-duration-150) var(--cascivo-ease-out);background:0 0;border:none;justify-content:center;align-items:center;margin-inline-end:calc(-1 * var(--cascivo-space-1));padding:0;line-height:1;display:inline-flex}._dismiss_onneh_51:hover{opacity:1}._dismiss_onneh_51:focus-visible{box-shadow:var(--cascivo-focus-ring);opacity:1;outline:none}}
1132
+ @layer cascivo.component{._tag_1idve_2{align-items:center;gap:var(--cascivo-space-1);font-family:var(--cascivo-font-sans);font-weight:var(--cascivo-font-medium);border-radius:var(--cascivo-radius-badge);white-space:nowrap;border:1px solid #0000;display:inline-flex}._tag_1idve_2[data-size=sm]{padding-inline:var(--cascivo-space-2);padding-block:var(--cascivo-space-1);font-size:var(--cascivo-text-xs);line-height:1}._tag_1idve_2[data-size=md]{padding-inline:var(--cascivo-space-3);padding-block:var(--cascivo-space-1);font-size:var(--cascivo-text-xs);line-height:var(--cascivo-leading-normal)}._tag_1idve_2[data-variant=default]{background-color:var(--cascivo-color-bg-subtle);color:var(--cascivo-color-text-subtle);border-color:var(--cascivo-color-border)}._tag_1idve_2[data-variant=info]{background-color:var(--cascivo-color-info-subtle);color:var(--cascivo-color-info-foreground)}._tag_1idve_2[data-variant=success]{background-color:var(--cascivo-color-success-subtle);color:var(--cascivo-color-success-foreground)}._tag_1idve_2[data-variant=warning]{background-color:var(--cascivo-color-warning-subtle);color:var(--cascivo-color-warning-foreground)}._tag_1idve_2[data-variant=error]{background-color:var(--cascivo-color-destructive-subtle);color:var(--cascivo-color-destructive-foreground)}._dismiss_1idve_57{color:currentColor;font-size:inherit;cursor:pointer;border-radius:var(--cascivo-radius-full);opacity:.7;transition:opacity var(--cascivo-duration-150) var(--cascivo-ease-out);background:0 0;border:none;justify-content:center;align-items:center;margin-inline-end:calc(-1 * var(--cascivo-space-1));padding:0;line-height:1;display:inline-flex}._dismiss_1idve_57:hover{opacity:1}._dismiss_1idve_57:focus-visible{box-shadow:var(--cascivo-focus-ring);opacity:1;outline:none}}
1100
1133
  /*$vite$:1*/
1101
1134
  @layer cascivo.component{._wrapper_1w754_2{gap:var(--cascivo-space-1);min-inline-size:0;min-height:2.5rem;padding:var(--cascivo-space-2);background-color:var(--cascivo-color-surface);border:1px solid var(--cascivo-color-border);border-radius:var(--cascivo-radius-field);cursor:text;transition:border-color var(--cascivo-duration-150) var(--cascivo-ease-out), box-shadow var(--cascivo-duration-150) var(--cascivo-ease-out);flex-wrap:wrap;display:flex}._wrapper_1w754_2:focus-within{border-color:var(--cascivo-color-accent);box-shadow:var(--cascivo-focus-ring)}._wrapper_1w754_2[data-disabled]{cursor:not-allowed;background-color:var(--cascivo-color-bg-subtle)}._wrapper_1w754_2[data-disabled] ._tag_1w754_32{color:var(--cascivo-color-text-muted);border-color:var(--cascivo-color-border)}._tag_1w754_32{align-items:center;gap:var(--cascivo-space-1);padding-block:var(--cascivo-space-1);padding-inline:var(--cascivo-space-2);font-family:var(--cascivo-font-sans);font-size:var(--cascivo-text-sm);color:var(--cascivo-color-text);background-color:var(--cascivo-color-bg-subtle);border:1px solid var(--cascivo-color-border);border-radius:var(--cascivo-radius-full);line-height:1.25;display:inline-flex}._tag_1w754_32[data-state=invalid]{color:var(--cascivo-color-destructive);background-color:rgb(from var(--cascivo-color-destructive) r g b / .08);border-color:var(--cascivo-color-destructive)}._dismiss_1w754_59{border-radius:var(--cascivo-radius-full);width:1rem;height:1rem;color:var(--cascivo-color-text-muted);cursor:pointer;font-size:var(--cascivo-text-sm);background:0 0;border:none;justify-content:center;align-items:center;padding:0;line-height:1;display:inline-flex}._dismiss_1w754_59:hover{color:var(--cascivo-color-text);background-color:var(--cascivo-color-border)}._dismiss_1w754_59:focus-visible{outline:2px solid var(--cascivo-color-accent);outline-offset:1px}._dismiss_1w754_59:disabled{cursor:not-allowed}._input_1w754_89{min-width:4rem;font-family:var(--cascivo-font-sans);font-size:var(--cascivo-text-sm);color:var(--cascivo-color-text);background:0 0;border:none;outline:none;flex:1}._input_1w754_89::placeholder{color:var(--cascivo-color-text-muted)}._input_1w754_89:disabled{cursor:not-allowed}}
1102
1135
  /*$vite$:1*/
@@ -1125,4 +1158,8 @@
1125
1158
  @layer cascivo.component{._tree_ufkml_2{--cascivo-tree-indent:var(--cascivo-space-5);font-family:var(--cascivo-font-sans);font-size:var(--cascivo-text-sm);color:var(--cascivo-color-text);margin:0;padding:0;list-style:none}._item_ufkml_12{list-style:none}._row_ufkml_16{align-items:center;gap:var(--cascivo-space-2);padding-inline-start:calc(var(--cascivo-tree-indent) * (var(--cascivo-tree-level) - 1));padding-block:var(--cascivo-space-2);border-radius:var(--cascivo-radius-control);cursor:pointer;transition:background-color var(--cascivo-duration-150) var(--cascivo-ease-out);padding-inline-end:var(--cascivo-space-3);display:flex}._row_ufkml_16:hover{background-color:var(--cascivo-color-bg-subtle)}._item_ufkml_12:focus-visible{outline:none}._item_ufkml_12:focus-visible>._row_ufkml_16{box-shadow:var(--cascivo-focus-ring)}._item_ufkml_12[data-selected]>._row_ufkml_16{background-color:var(--cascivo-color-bg-subtle);color:var(--cascivo-color-text);font-weight:var(--cascivo-font-medium)}._twisty_ufkml_47{block-size:.75rem;inline-size:.75rem;transition:rotate var(--cascivo-duration-150) var(--cascivo-ease-out);background-color:currentColor;flex-shrink:0;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round' d='M6 4l4 4-4 4'/%3E%3C/svg%3E") 50%/contain no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round' d='M6 4l4 4-4 4'/%3E%3C/svg%3E") 50%/contain no-repeat}._twisty_ufkml_47[data-state=open]{rotate:90deg}._twistySpacer_ufkml_61{flex-shrink:0;block-size:.75rem;inline-size:.75rem}._icon_ufkml_67{block-size:1rem;inline-size:1rem;color:var(--cascivo-color-text-subtle);flex-shrink:0;display:inline-flex}._label_ufkml_75{text-overflow:ellipsis;white-space:nowrap;min-inline-size:0;overflow:hidden}._groupWrap_ufkml_83{visibility:hidden;transition:grid-template-rows var(--cascivo-duration-200) var(--cascivo-ease-out), visibility var(--cascivo-duration-200) var(--cascivo-ease-out);grid-template-rows:0fr;display:grid}._groupWrap_ufkml_83[data-state=open]{visibility:visible;grid-template-rows:1fr}@starting-style{._groupWrap_ufkml_83[data-state=open]{grid-template-rows:0fr}}._group_ufkml_83{min-block-size:0;margin:0;padding:0;list-style:none;overflow:hidden}}@media (prefers-reduced-motion:reduce){._groupWrap_ufkml_83,._row_ufkml_16,._twisty_ufkml_47{transition:none}}@media (forced-colors:active){._item_ufkml_12:focus-visible>._row_ufkml_16{outline-offset:-2px;outline:2px solid highlight}._item_ufkml_12[data-selected]>._row_ufkml_16{color:highlighttext;background-color:highlight}}
1126
1159
  /*$vite$:1*/
1127
1160
  @layer cascivo.component{._user_uuj1b_2{align-items:center;gap:var(--cascivo-space-3);min-inline-size:0;font-family:var(--cascivo-font-sans);display:inline-flex}._text_uuj1b_10{min-inline-size:0;line-height:var(--cascivo-leading-snug,1.3);flex-direction:column;display:flex}._name_uuj1b_17{color:var(--cascivo-color-text);font-size:var(--cascivo-text-sm);font-weight:var(--cascivo-font-medium);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._description_uuj1b_26{color:var(--cascivo-color-text-muted);font-size:var(--cascivo-text-xs);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._action_uuj1b_34{align-items:center;margin-inline-start:var(--cascivo-space-2);display:inline-flex}}
1161
+ /*$vite$:1*/
1162
+ @layer cascivo.component{._viewport_1wmsq_2{overscroll-behavior:contain;position:relative;overflow-y:auto}._viewport_1wmsq_2:focus-visible{outline:2px solid var(--cascivo-color-accent);outline-offset:-2px}._canvas_1wmsq_14{inline-size:100%;position:relative}._row_1wmsq_19{will-change:transform;align-items:center;display:flex;position:absolute;inset-block-start:0;inset-inline:0}}
1163
+ /*$vite$:1*/
1164
+ @layer cascivo.component{._root_11q00_2{inline-size:fit-content;position:relative}._column_11q00_7{block-size:var(--_column-height);scroll-snap-type:y mandatory;scrollbar-width:none;padding-block:var(--_pad);overflow-y:auto;-webkit-mask-image:linear-gradient(#0000 0%,#000 25% 75%,#0000 100%);mask-image:linear-gradient(#0000 0%,#000 25% 75%,#0000 100%)}._column_11q00_7::-webkit-scrollbar{display:none}._column_11q00_7:focus-visible{outline:var(--cascivo-ring-width) solid var(--cascivo-ring-color);outline-offset:2px;border-radius:var(--cascivo-radius-md)}._option_11q00_29{block-size:var(--_item-height);scroll-snap-align:center;padding-inline:var(--cascivo-space-4);color:var(--cascivo-color-text-muted);font-size:var(--cascivo-text-ui);white-space:nowrap;-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;display:flex}._option_11q00_29[aria-selected=true]{color:var(--cascivo-color-foreground);font-weight:var(--cascivo-font-semibold)}._band_11q00_48{block-size:var(--_item-height);border-block:1px solid var(--cascivo-border-subtle);pointer-events:none;position:absolute;inset-block-start:50%;inset-inline:0;translate:0 -50%}@media (prefers-reduced-motion:no-preference){._column_11q00_7{scroll-behavior:smooth}}}
1128
1165
  /*$vite$:1*/
package/dist/tabs/tabs.js CHANGED
@@ -2,12 +2,12 @@
2
2
 
3
3
  import e from "./tabs.module.js";
4
4
  import { createContext as t, forwardRef as n, useId as r, useRef as i } from "react";
5
- import { cn as a, useSignal as o, useSignals as s } from "@cascivo/core";
6
- import { jsx as c } from "react/jsx-runtime";
5
+ import { Slot as a, cn as o, useSignal as s, useSignals as c } from "@cascivo/core";
6
+ import { jsx as l } from "react/jsx-runtime";
7
7
  //#region ../components/src/tabs/tabs.tsx
8
- var l = t(null);
9
- function u({ defaultValue: t, value: n, onValueChange: i, className: s, children: u }) {
10
- let d = r(), f = o(n ?? t ?? "");
8
+ var u = t(null);
9
+ function d({ defaultValue: t, value: n, onValueChange: i, className: a, children: c }) {
10
+ let d = r(), f = s(n ?? t ?? "");
11
11
  n !== void 0 && (f.value = n);
12
12
  let p = {
13
13
  active: f,
@@ -16,20 +16,20 @@ function u({ defaultValue: t, value: n, onValueChange: i, className: s, children
16
16
  n === void 0 && (f.value = e), i?.(e);
17
17
  }
18
18
  };
19
- return /* @__PURE__ */ c(l.Provider, {
19
+ return /* @__PURE__ */ l(u.Provider, {
20
20
  value: p,
21
- children: /* @__PURE__ */ c("div", {
22
- className: a(e.tabs, s),
23
- children: u
21
+ children: /* @__PURE__ */ l("div", {
22
+ className: o(e.tabs, a),
23
+ children: c
24
24
  })
25
25
  });
26
26
  }
27
- function d({ className: t, children: n, ...r }) {
28
- let o = i(null);
29
- return /* @__PURE__ */ c(l.Consumer, { children: (i) => /* @__PURE__ */ c("div", {
30
- ref: o,
27
+ function f({ className: t, children: n, ...r }) {
28
+ let a = i(null);
29
+ return /* @__PURE__ */ l(u.Consumer, { children: (i) => /* @__PURE__ */ l("div", {
30
+ ref: a,
31
31
  role: "tablist",
32
- className: a(e.list, t),
32
+ className: o(e.list, t),
33
33
  onKeyDown: (e) => {
34
34
  if (!i || ![
35
35
  "ArrowRight",
@@ -37,61 +37,61 @@ function d({ className: t, children: n, ...r }) {
37
37
  "Home",
38
38
  "End"
39
39
  ].includes(e.key)) return;
40
- let t = Array.from(o.current?.querySelectorAll("[role=\"tab\"]:not([disabled])") ?? []);
40
+ let t = Array.from(a.current?.querySelectorAll("[role=\"tab\"]:not([disabled])") ?? []);
41
41
  if (t.length === 0) return;
42
42
  e.preventDefault();
43
43
  let n = t.findIndex((e) => e.dataset.value === i.active.value), r = n;
44
44
  e.key === "ArrowRight" ? r = (n + 1) % t.length : e.key === "ArrowLeft" ? r = (n - 1 + t.length) % t.length : e.key === "Home" ? r = 0 : e.key === "End" && (r = t.length - 1);
45
- let a = t[r];
46
- a?.focus(), a?.dataset.value && i.setValue(a.dataset.value);
45
+ let o = t[r];
46
+ o?.focus(), o?.dataset.value && i.setValue(o.dataset.value);
47
47
  },
48
48
  ...r,
49
49
  children: n
50
50
  }) });
51
51
  }
52
- var f = n(function(e, t) {
53
- return /* @__PURE__ */ c(l.Consumer, { children: (n) => n ? /* @__PURE__ */ c(p, {
52
+ var p = n(function(e, t) {
53
+ return /* @__PURE__ */ l(u.Consumer, { children: (n) => n ? /* @__PURE__ */ l(m, {
54
54
  store: n,
55
55
  buttonRef: t,
56
56
  ...e
57
57
  }) : null });
58
58
  });
59
- function p({ store: t, value: n, className: r, children: i, disabled: o, buttonRef: l, ...u }) {
60
- s();
61
- let d = t.active.value === n;
62
- return /* @__PURE__ */ c("button", {
63
- type: "button",
59
+ function m({ store: t, value: n, className: r, children: i, disabled: s, buttonRef: u, asChild: d = !1, ...f }) {
60
+ c();
61
+ let p = t.active.value === n;
62
+ return /* @__PURE__ */ l(d ? a : "button", {
63
+ type: d ? void 0 : "button",
64
64
  role: "tab",
65
65
  id: `${t.baseId}-trigger-${n}`,
66
- "aria-selected": d,
66
+ "aria-selected": p,
67
67
  "aria-controls": `${t.baseId}-content-${n}`,
68
- tabIndex: d ? 0 : -1,
69
- "data-state": d ? "active" : "inactive",
68
+ tabIndex: p ? 0 : -1,
69
+ "data-state": p ? "active" : "inactive",
70
70
  "data-value": n,
71
- disabled: o,
72
- className: a(e.trigger, r),
71
+ ...d ? { "aria-disabled": s || void 0 } : { disabled: s },
72
+ className: o(e.trigger, r),
73
73
  onClick: () => t.setValue(n),
74
- ref: l,
75
- ...u,
74
+ ref: u,
75
+ ...f,
76
76
  children: i
77
77
  });
78
78
  }
79
- function m(e) {
80
- return /* @__PURE__ */ c(l.Consumer, { children: (t) => t ? /* @__PURE__ */ c(h, {
79
+ function h(e) {
80
+ return /* @__PURE__ */ l(u.Consumer, { children: (t) => t ? /* @__PURE__ */ l(g, {
81
81
  store: t,
82
82
  ...e
83
83
  }) : null });
84
84
  }
85
- function h({ store: t, value: n, className: r, children: i, ...o }) {
86
- return s(), t.active.value === n ? /* @__PURE__ */ c("div", {
85
+ function g({ store: t, value: n, className: r, children: i, ...a }) {
86
+ return c(), t.active.value === n ? /* @__PURE__ */ l("div", {
87
87
  role: "tabpanel",
88
88
  id: `${t.baseId}-content-${n}`,
89
89
  "aria-labelledby": `${t.baseId}-trigger-${n}`,
90
90
  tabIndex: 0,
91
- className: a(e.content, r),
92
- ...o,
91
+ className: o(e.content, r),
92
+ ...a,
93
93
  children: i
94
94
  }) : null;
95
95
  }
96
96
  //#endregion
97
- export { u as Tabs, m as TabsContent, d as TabsList, f as TabsTrigger };
97
+ export { d as Tabs, h as TabsContent, f as TabsList, p as TabsTrigger };
package/dist/tag/tag.css CHANGED
@@ -1 +1 @@
1
- @layer cascivo.component{._tag_onneh_2{align-items:center;gap:var(--cascivo-space-1);font-family:var(--cascivo-font-sans);font-weight:var(--cascivo-font-medium);border-radius:var(--cascivo-radius-badge);white-space:nowrap;display:inline-flex}._tag_onneh_2[data-size=sm]{padding-inline:var(--cascivo-space-2);padding-block:var(--cascivo-space-1);font-size:var(--cascivo-text-xs);line-height:1}._tag_onneh_2[data-size=md]{padding-inline:var(--cascivo-space-3);padding-block:var(--cascivo-space-1);font-size:var(--cascivo-text-xs);line-height:var(--cascivo-leading-normal)}._tag_onneh_2[data-variant=default]{background-color:var(--cascivo-color-bg-subtle);color:var(--cascivo-color-text-subtle)}._tag_onneh_2[data-variant=info]{background-color:var(--cascivo-color-info-subtle);color:var(--cascivo-color-info-foreground)}._tag_onneh_2[data-variant=success]{background-color:var(--cascivo-color-success-subtle);color:var(--cascivo-color-success-foreground)}._tag_onneh_2[data-variant=warning]{background-color:var(--cascivo-color-warning-subtle);color:var(--cascivo-color-warning-foreground)}._tag_onneh_2[data-variant=error]{background-color:var(--cascivo-color-destructive-subtle);color:var(--cascivo-color-destructive-foreground)}._dismiss_onneh_51{color:currentColor;font-size:inherit;cursor:pointer;border-radius:var(--cascivo-radius-full);opacity:.7;transition:opacity var(--cascivo-duration-150) var(--cascivo-ease-out);background:0 0;border:none;justify-content:center;align-items:center;margin-inline-end:calc(-1 * var(--cascivo-space-1));padding:0;line-height:1;display:inline-flex}._dismiss_onneh_51:hover{opacity:1}._dismiss_onneh_51:focus-visible{box-shadow:var(--cascivo-focus-ring);opacity:1;outline:none}}
1
+ @layer cascivo.component{._tag_1idve_2{align-items:center;gap:var(--cascivo-space-1);font-family:var(--cascivo-font-sans);font-weight:var(--cascivo-font-medium);border-radius:var(--cascivo-radius-badge);white-space:nowrap;border:1px solid #0000;display:inline-flex}._tag_1idve_2[data-size=sm]{padding-inline:var(--cascivo-space-2);padding-block:var(--cascivo-space-1);font-size:var(--cascivo-text-xs);line-height:1}._tag_1idve_2[data-size=md]{padding-inline:var(--cascivo-space-3);padding-block:var(--cascivo-space-1);font-size:var(--cascivo-text-xs);line-height:var(--cascivo-leading-normal)}._tag_1idve_2[data-variant=default]{background-color:var(--cascivo-color-bg-subtle);color:var(--cascivo-color-text-subtle);border-color:var(--cascivo-color-border)}._tag_1idve_2[data-variant=info]{background-color:var(--cascivo-color-info-subtle);color:var(--cascivo-color-info-foreground)}._tag_1idve_2[data-variant=success]{background-color:var(--cascivo-color-success-subtle);color:var(--cascivo-color-success-foreground)}._tag_1idve_2[data-variant=warning]{background-color:var(--cascivo-color-warning-subtle);color:var(--cascivo-color-warning-foreground)}._tag_1idve_2[data-variant=error]{background-color:var(--cascivo-color-destructive-subtle);color:var(--cascivo-color-destructive-foreground)}._dismiss_1idve_57{color:currentColor;font-size:inherit;cursor:pointer;border-radius:var(--cascivo-radius-full);opacity:.7;transition:opacity var(--cascivo-duration-150) var(--cascivo-ease-out);background:0 0;border:none;justify-content:center;align-items:center;margin-inline-end:calc(-1 * var(--cascivo-space-1));padding:0;line-height:1;display:inline-flex}._dismiss_1idve_57:hover{opacity:1}._dismiss_1idve_57:focus-visible{box-shadow:var(--cascivo-focus-ring);opacity:1;outline:none}}
@@ -1,7 +1,7 @@
1
1
  import './tag.css';
2
2
  var e = {
3
- tag: "_tag_onneh_2",
4
- dismiss: "_dismiss_onneh_51"
3
+ tag: "_tag_1idve_2",
4
+ dismiss: "_dismiss_1idve_57"
5
5
  };
6
6
  //#endregion
7
7
  export { e as default };
@@ -0,0 +1 @@
1
+ @layer cascivo.component{._viewport_1wmsq_2{overscroll-behavior:contain;position:relative;overflow-y:auto}._viewport_1wmsq_2:focus-visible{outline:2px solid var(--cascivo-color-accent);outline-offset:-2px}._canvas_1wmsq_14{inline-size:100%;position:relative}._row_1wmsq_19{will-change:transform;align-items:center;display:flex;position:absolute;inset-block-start:0;inset-inline:0}}
@@ -0,0 +1,40 @@
1
+ "use client";
2
+
3
+ import e from "./virtual-list.module.js";
4
+ import { cn as t, useSignal as n, useSignals as r } from "@cascivo/core";
5
+ import { jsx as i } from "react/jsx-runtime";
6
+ //#region ../components/src/virtual-list/virtual-list.tsx
7
+ function a({ items: a, itemHeight: o, height: s, renderItem: c, overscan: l = 3, ariaLabel: u, className: d }) {
8
+ r();
9
+ let f = n(0), p = Math.ceil(s / o), m = Math.floor(f.value / o), h = Math.max(0, m - l), g = Math.min(a.length, m + p + l), _ = a.slice(h, g), v = (e) => {
10
+ f.value = e.currentTarget.scrollTop;
11
+ }, y = { blockSize: `${s}px` };
12
+ return /* @__PURE__ */ i("div", {
13
+ className: t(e.viewport, d),
14
+ style: y,
15
+ onScroll: v,
16
+ role: "list",
17
+ "aria-label": u,
18
+ tabIndex: 0,
19
+ children: /* @__PURE__ */ i("div", {
20
+ className: e.canvas,
21
+ style: { blockSize: `${a.length * o}px` },
22
+ children: _.map((t, n) => {
23
+ let r = h + n;
24
+ return /* @__PURE__ */ i("div", {
25
+ role: "listitem",
26
+ "aria-setsize": a.length,
27
+ "aria-posinset": r + 1,
28
+ className: e.row,
29
+ style: {
30
+ blockSize: `${o}px`,
31
+ transform: `translateY(${r * o}px)`
32
+ },
33
+ children: c(t, r)
34
+ }, r);
35
+ })
36
+ })
37
+ });
38
+ }
39
+ //#endregion
40
+ export { a as VirtualList };
@@ -0,0 +1,8 @@
1
+ import './virtual-list.css';
2
+ var e = {
3
+ viewport: "_viewport_1wmsq_2",
4
+ canvas: "_canvas_1wmsq_14",
5
+ row: "_row_1wmsq_19"
6
+ };
7
+ //#endregion
8
+ export { e as default };
@@ -0,0 +1 @@
1
+ @layer cascivo.component{._root_11q00_2{inline-size:fit-content;position:relative}._column_11q00_7{block-size:var(--_column-height);scroll-snap-type:y mandatory;scrollbar-width:none;padding-block:var(--_pad);overflow-y:auto;-webkit-mask-image:linear-gradient(#0000 0%,#000 25% 75%,#0000 100%);mask-image:linear-gradient(#0000 0%,#000 25% 75%,#0000 100%)}._column_11q00_7::-webkit-scrollbar{display:none}._column_11q00_7:focus-visible{outline:var(--cascivo-ring-width) solid var(--cascivo-ring-color);outline-offset:2px;border-radius:var(--cascivo-radius-md)}._option_11q00_29{block-size:var(--_item-height);scroll-snap-align:center;padding-inline:var(--cascivo-space-4);color:var(--cascivo-color-text-muted);font-size:var(--cascivo-text-ui);white-space:nowrap;-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;display:flex}._option_11q00_29[aria-selected=true]{color:var(--cascivo-color-foreground);font-weight:var(--cascivo-font-semibold)}._band_11q00_48{block-size:var(--_item-height);border-block:1px solid var(--cascivo-border-subtle);pointer-events:none;position:absolute;inset-block-start:50%;inset-inline:0;translate:0 -50%}@media (prefers-reduced-motion:no-preference){._column_11q00_7{scroll-behavior:smooth}}}
@@ -0,0 +1,84 @@
1
+ "use client";
2
+
3
+ import e from "./wheel-picker.module.js";
4
+ import { useRef as t } from "react";
5
+ import { cn as n, useEffectPropSignal as r, useId as i, useSignalEffect as a } from "@cascivo/core";
6
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
7
+ //#region ../components/src/wheel-picker/wheel-picker.tsx
8
+ var c = 120;
9
+ function l({ options: l, value: u, onValueChange: d, visibleCount: f = 5, itemHeight: p = 36, ariaLabel: m, className: h }) {
10
+ let g = t(null), _ = i(), v = Math.max(0, l.findIndex((e) => e.value === u)), y = t(l);
11
+ y.current = l;
12
+ let b = t(d);
13
+ b.current = d;
14
+ let x = t(p);
15
+ x.current = p;
16
+ let S = t(u);
17
+ S.current = u;
18
+ let C = (e, t) => {
19
+ let n = g.current;
20
+ n && n.scrollTo({
21
+ top: e * x.current,
22
+ behavior: t ? "smooth" : "instant"
23
+ });
24
+ }, w = r(u);
25
+ a(() => {
26
+ let e = w.value, t = y.current.findIndex((t) => t.value === e);
27
+ t >= 0 && C(t, !1);
28
+ }), a(() => {
29
+ let e = g.current;
30
+ if (!e) return;
31
+ let t, n = () => {
32
+ clearTimeout(t), t = setTimeout(() => {
33
+ let t = Math.round(e.scrollTop / x.current), n = y.current[t];
34
+ n && n.value !== S.current && b.current(n.value);
35
+ }, c);
36
+ };
37
+ return e.addEventListener("scroll", n, { passive: !0 }), () => {
38
+ clearTimeout(t), e.removeEventListener("scroll", n);
39
+ };
40
+ });
41
+ let T = (e) => {
42
+ let t = Math.max(0, Math.min(l.length - 1, e)), n = l[t];
43
+ !n || n.value === u || (d(n.value), C(t, !0));
44
+ }, E = (e) => {
45
+ let t = {
46
+ ArrowDown: v + 1,
47
+ ArrowUp: v - 1,
48
+ Home: 0,
49
+ End: l.length - 1,
50
+ PageDown: v + f,
51
+ PageUp: v - f
52
+ }[e.key];
53
+ t !== void 0 && (e.preventDefault(), T(t));
54
+ }, D = (f - 1) / 2 * p, O = {
55
+ "--_item-height": `${p}px`,
56
+ "--_pad": `${D}px`,
57
+ "--_column-height": `${f * p}px`
58
+ };
59
+ return /* @__PURE__ */ s("div", {
60
+ className: n(e.root, h),
61
+ style: O,
62
+ children: [/* @__PURE__ */ o("div", {
63
+ ref: g,
64
+ role: "listbox",
65
+ tabIndex: 0,
66
+ "aria-label": m,
67
+ "aria-activedescendant": `${_}-${v}`,
68
+ className: e.column,
69
+ onKeyDown: E,
70
+ children: l.map((t, n) => /* @__PURE__ */ o("div", {
71
+ id: `${_}-${n}`,
72
+ role: "option",
73
+ "aria-selected": n === v,
74
+ className: e.option,
75
+ children: t.label
76
+ }, t.value))
77
+ }), /* @__PURE__ */ o("div", {
78
+ "aria-hidden": "true",
79
+ className: e.band
80
+ })]
81
+ });
82
+ }
83
+ //#endregion
84
+ export { l as WheelPicker };
@@ -0,0 +1,9 @@
1
+ import './wheel-picker.css';
2
+ var e = {
3
+ root: "_root_11q00_2",
4
+ column: "_column_11q00_7",
5
+ option: "_option_11q00_29",
6
+ band: "_band_11q00_48"
7
+ };
8
+ //#endregion
9
+ export { e as default };