@cascivo/react 0.17.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/README.md +4 -3
  2. package/dist/action-sheet/action-sheet.js +1 -1
  3. package/dist/breadcrumb/breadcrumb.js +7 -7
  4. package/dist/checkbox/checkbox.js +11 -10
  5. package/dist/color-picker/color-picker.js +81 -77
  6. package/dist/combobox/combobox.js +81 -76
  7. package/dist/command-menu/command-menu.js +104 -104
  8. package/dist/comparison/comparison.js +18 -18
  9. package/dist/data-table/data-table.css +1 -1
  10. package/dist/data-table/data-table.js +148 -121
  11. package/dist/data-table/data-table.module.js +29 -29
  12. package/dist/date-picker/date-picker.js +98 -93
  13. package/dist/date-range-picker/date-range-picker.js +1 -1
  14. package/dist/dock/dock.js +2 -2
  15. package/dist/dropdown/dropdown.js +43 -40
  16. package/dist/editable/editable.js +29 -20
  17. package/dist/fab/fab.js +37 -37
  18. package/dist/field/field.js +24 -17
  19. package/dist/file-uploader/file-uploader.js +24 -23
  20. package/dist/filter/filter.js +11 -11
  21. package/dist/index.d.ts +1302 -85
  22. package/dist/input/input.js +14 -13
  23. package/dist/navigation-menu/navigation-menu.js +9 -9
  24. package/dist/node/action-sheet/action-sheet.js +1 -1
  25. package/dist/node/breadcrumb/breadcrumb.js +7 -7
  26. package/dist/node/checkbox/checkbox.js +11 -10
  27. package/dist/node/color-picker/color-picker.js +81 -77
  28. package/dist/node/combobox/combobox.js +81 -76
  29. package/dist/node/command-menu/command-menu.js +104 -104
  30. package/dist/node/comparison/comparison.js +18 -18
  31. package/dist/node/data-table/data-table.js +148 -121
  32. package/dist/node/data-table/data-table.module.js +29 -29
  33. package/dist/node/date-picker/date-picker.js +98 -93
  34. package/dist/node/date-range-picker/date-range-picker.js +1 -1
  35. package/dist/node/dock/dock.js +2 -2
  36. package/dist/node/dropdown/dropdown.js +43 -40
  37. package/dist/node/editable/editable.js +29 -20
  38. package/dist/node/fab/fab.js +37 -37
  39. package/dist/node/field/field.js +24 -17
  40. package/dist/node/file-uploader/file-uploader.js +24 -23
  41. package/dist/node/filter/filter.js +11 -11
  42. package/dist/node/input/input.js +14 -13
  43. package/dist/node/navigation-menu/navigation-menu.js +9 -9
  44. package/dist/node/number-input/number-input.js +28 -27
  45. package/dist/node/overflow-menu/overflow-menu.js +7 -7
  46. package/dist/node/progress/progress.js +3 -3
  47. package/dist/node/progress-circle/progress-circle.js +8 -8
  48. package/dist/node/progress-indicator/progress-indicator.js +1 -1
  49. package/dist/node/qr-code/qr-code.js +11 -11
  50. package/dist/node/radial-progress/radial-progress.js +9 -9
  51. package/dist/node/radio/radio.js +10 -9
  52. package/dist/node/react/src/index.js +93 -93
  53. package/dist/node/resizable/resizable.js +24 -24
  54. package/dist/node/search/search.js +35 -31
  55. package/dist/node/select/select.js +15 -14
  56. package/dist/node/side-nav/side-nav.js +35 -35
  57. package/dist/node/side-nav/side-nav.module.js +27 -27
  58. package/dist/node/slider/slider.js +13 -12
  59. package/dist/node/spinner/spinner.js +4 -4
  60. package/dist/node/steps/steps.js +10 -10
  61. package/dist/node/structured-list/structured-list.js +14 -14
  62. package/dist/node/swap/swap.js +5 -5
  63. package/dist/node/switcher/switcher.js +5 -5
  64. package/dist/node/tags-input/tags-input.js +20 -16
  65. package/dist/node/textarea/textarea.js +14 -13
  66. package/dist/node/time-picker/time-picker.js +21 -20
  67. package/dist/node/toggle/toggle.js +8 -7
  68. package/dist/node/tree-view/tree-view.js +43 -43
  69. package/dist/node/virtual-list/virtual-list.js +10 -10
  70. package/dist/node/wheel-picker/wheel-picker.js +36 -36
  71. package/dist/number-input/number-input.js +28 -27
  72. package/dist/overflow-menu/overflow-menu.js +7 -7
  73. package/dist/progress/progress.js +3 -3
  74. package/dist/progress-circle/progress-circle.js +8 -8
  75. package/dist/progress-indicator/progress-indicator.js +1 -1
  76. package/dist/qr-code/qr-code.js +11 -11
  77. package/dist/radial-progress/radial-progress.js +9 -9
  78. package/dist/radio/radio.js +10 -9
  79. package/dist/react/src/index.js +93 -93
  80. package/dist/resizable/resizable.js +24 -24
  81. package/dist/search/search.js +35 -31
  82. package/dist/select/select.js +15 -14
  83. package/dist/side-nav/side-nav.css +1 -1
  84. package/dist/side-nav/side-nav.js +35 -35
  85. package/dist/side-nav/side-nav.module.js +27 -27
  86. package/dist/slider/slider.js +13 -12
  87. package/dist/spinner/spinner.js +4 -4
  88. package/dist/steps/steps.js +10 -10
  89. package/dist/structured-list/structured-list.js +14 -14
  90. package/dist/styles.css +2 -2
  91. package/dist/swap/swap.js +5 -5
  92. package/dist/switcher/switcher.js +5 -5
  93. package/dist/tags-input/tags-input.js +20 -16
  94. package/dist/textarea/textarea.js +14 -13
  95. package/dist/time-picker/time-picker.js +21 -20
  96. package/dist/toggle/toggle.js +8 -7
  97. package/dist/tree-view/tree-view.js +43 -43
  98. package/dist/virtual-list/virtual-list.js +10 -10
  99. package/dist/wheel-picker/wheel-picker.js +36 -36
  100. package/package.json +4 -4
  101. package/readme.body.md +4 -3
@@ -4,11 +4,11 @@ import { Spinner as e } from "../spinner/spinner.js";
4
4
  import { Kbd as t } from "../kbd/kbd.js";
5
5
  import n from "./command-menu.module.js";
6
6
  import { useId as r, useRef as i } from "react";
7
- import { batch as a, cn as o, focusElement as s, useEffectPropSignal as c, useSignal as l, useSignalEffect as u, useSignals as ee } from "@cascivo/core";
8
- import { builtin as d, t as f } from "@cascivo/i18n";
9
- import { jsx as p, jsxs as m } from "react/jsx-runtime";
7
+ import { batch as a, cn as o, focusElement as s, useEffectPropSignal as c, useSignal as l, useSignalEffect as u, useSignals as d } from "@cascivo/core";
8
+ import { builtin as f, t as p } from "@cascivo/i18n";
9
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
10
10
  //#region ../components/src/command-menu/command-menu.tsx
11
- function h(e, t) {
11
+ function g(e, t) {
12
12
  if (e.length === 0) return {
13
13
  score: 1,
14
14
  indices: []
@@ -25,21 +25,21 @@ function h(e, t) {
25
25
  indices: s
26
26
  } : null;
27
27
  }
28
- function g(e, t) {
29
- return h(e, t)?.score ?? 0;
30
- }
31
28
  function _(e, t) {
32
- let n = g(e, t.label);
29
+ return g(e, t)?.score ?? 0;
30
+ }
31
+ function v(e, t) {
32
+ let n = _(e, t.label);
33
33
  for (let r of t.keywords ?? []) {
34
- let t = g(e, r);
34
+ let t = _(e, r);
35
35
  t > n && (n = t);
36
36
  }
37
37
  return n;
38
38
  }
39
- function v(e, t) {
39
+ function ee(e, t) {
40
40
  if (t.length === 0) return e;
41
41
  let r = new Set(t), i = [], a = "", o = r.has(0), s = (e) => {
42
- a !== "" && (i.push(o ? /* @__PURE__ */ p("mark", {
42
+ a !== "" && (i.push(o ? /* @__PURE__ */ m("mark", {
43
43
  className: n.match,
44
44
  children: a
45
45
  }, e) : a), a = "");
@@ -50,7 +50,7 @@ function v(e, t) {
50
50
  }
51
51
  return s(e.length), i;
52
52
  }
53
- function y(e, t) {
53
+ function te(e, t) {
54
54
  for (let n of t) {
55
55
  let t = n.prefix;
56
56
  if (t) {
@@ -66,49 +66,49 @@ function y(e, t) {
66
66
  }
67
67
  return null;
68
68
  }
69
- function b({ open: g, onOpenChange: b, groups: te, placeholder: ne, emptyLabel: re, hotkey: x = !0, label: S, loading: C = !1, onQueryChange: w, scopes: T = [], className: ie }) {
70
- ee();
71
- let E = S ?? f(d.commandMenu.label), ae = re ?? f(d.commandMenu.empty), D = r(), O = `${D}-listbox`, k = i(null), A = i(null), j = i([]), M = i(b);
72
- M.current = b;
73
- let N = i(w);
74
- N.current = w;
75
- let P = c(g), F = c(x), I = l(""), L = l(0), R = l([]), z = l(null), B = R.value.at(-1)?.groups ?? te, oe = ne ?? R.value.at(-1)?.placeholder ?? f(d.commandMenu.placeholder), V = T.find((e) => e.id === z.value) ?? null, H = B.filter((e) => !z.value || !e.scope || e.scope === z.value).map((e) => ({
69
+ function y({ open: _, onOpenChange: y, groups: ne, placeholder: b, emptyLabel: x, hotkey: re = !0, label: S, ariaLabel: ie, loading: C = !1, onQueryChange: w, scopes: T = [], className: ae }) {
70
+ d();
71
+ let E = ie ?? S ?? p(f.commandMenu.label), D = x ?? p(f.commandMenu.empty), O = r(), k = `${O}-listbox`, A = i(null), j = i(null), M = i([]), N = i(y);
72
+ N.current = y;
73
+ let P = i(w);
74
+ P.current = w;
75
+ let F = c(_), oe = c(re), I = l(""), L = l(0), R = l([]), z = l(null), se = R.value.at(-1)?.groups ?? ne, B = b ?? R.value.at(-1)?.placeholder ?? p(f.commandMenu.placeholder), V = T.find((e) => e.id === z.value) ?? null, H = se.filter((e) => !z.value || !e.scope || e.scope === z.value).map((e) => ({
76
76
  heading: e.heading,
77
77
  items: e.items.map((e) => ({
78
78
  item: e,
79
- score: _(I.value, e)
79
+ score: v(I.value, e)
80
80
  })).filter(({ score: e }) => e > 0).sort((e, t) => t.score - e.score).map(({ item: e }) => ({
81
81
  item: e,
82
- indices: h(I.value, e.label)?.indices ?? []
82
+ indices: g(I.value, e.label)?.indices ?? []
83
83
  }))
84
- })).filter((e) => e.items.length > 0), U = H.flatMap((e) => e.items.map((e) => e.item)), W = U.flatMap((e, t) => e.disabled ? [] : [t]), G = W.includes(L.value) ? L.value : W[0] ?? -1, K = (e) => `${D}-option-${e}`;
84
+ })).filter((e) => e.items.length > 0), U = H.flatMap((e) => e.items.map((e) => e.item)), W = U.flatMap((e, t) => e.disabled ? [] : [t]), G = W.includes(L.value) ? L.value : W[0] ?? -1, K = (e) => `${O}-option-${e}`;
85
85
  u(() => {
86
- let e = k.current;
87
- e && (P.value ? e.open || (a(() => {
86
+ let e = A.current;
87
+ e && (F.value ? e.open || (a(() => {
88
88
  I.value = "", L.value = 0, R.value = [], z.value = null;
89
- }), typeof e.showModal == "function" && e.showModal(), s(A.current)) : e.open && (R.value = [], e.close()));
89
+ }), typeof e.showModal == "function" && e.showModal(), s(j.current)) : e.open && (R.value = [], e.close()));
90
90
  }), u(() => {
91
- let e = k.current;
91
+ let e = A.current;
92
92
  if (!e) return;
93
- let t = () => M.current(!1);
93
+ let t = () => N.current(!1);
94
94
  return e.addEventListener("close", t), () => e.removeEventListener("close", t);
95
95
  }), u(() => {
96
- if (!F.value) return;
96
+ if (!oe.value) return;
97
97
  let e = (e) => {
98
- (e.metaKey || e.ctrlKey) && e.key.toLowerCase() === "k" && (e.preventDefault(), M.current(!P.value));
98
+ (e.metaKey || e.ctrlKey) && e.key.toLowerCase() === "k" && (e.preventDefault(), N.current(!F.value));
99
99
  };
100
100
  return window.addEventListener("keydown", e), () => window.removeEventListener("keydown", e);
101
101
  });
102
102
  let q = (e) => {
103
103
  L.value = e;
104
- let t = j.current[e];
104
+ let t = M.current[e];
105
105
  t && typeof t.scrollIntoView == "function" && t.scrollIntoView({ block: "nearest" });
106
106
  }, J = (e) => {
107
107
  if (W.length === 0) return;
108
108
  let t = W[(W.indexOf(G) + e + W.length) % W.length];
109
109
  t !== void 0 && q(t);
110
110
  }, Y = (e) => {
111
- e.onSelect(), b(!1);
111
+ e.onSelect(), y(!1);
112
112
  }, X = (e, t) => {
113
113
  if (!(!e || e.disabled)) {
114
114
  if (e.page) {
@@ -123,9 +123,9 @@ function b({ open: g, onOpenChange: b, groups: te, placeholder: ne, emptyLabel:
123
123
  n && Y(n);
124
124
  return;
125
125
  }
126
- t !== "secondary" && (e.onSelect?.(), b(!1));
126
+ t !== "secondary" && (e.onSelect?.(), y(!1));
127
127
  }
128
- }, se = (e) => {
128
+ }, ce = (e) => {
129
129
  if (T.length === 0) return;
130
130
  let t = [null, ...T.map((e) => e.id)], n = t[(t.indexOf(z.value) + e + t.length) % t.length];
131
131
  a(() => {
@@ -134,12 +134,12 @@ function b({ open: g, onOpenChange: b, groups: te, placeholder: ne, emptyLabel:
134
134
  }, Z = () => {
135
135
  a(() => {
136
136
  z.value = null, L.value = 0;
137
- }), s(A.current);
137
+ }), s(j.current);
138
138
  }, Q = () => {
139
139
  a(() => {
140
140
  R.value = R.value.slice(0, -1), I.value = "", L.value = 0;
141
141
  });
142
- }, ce = (e) => {
142
+ }, le = (e) => {
143
143
  switch (e.key) {
144
144
  case "ArrowDown":
145
145
  e.preventDefault(), J(1);
@@ -148,7 +148,7 @@ function b({ open: g, onOpenChange: b, groups: te, placeholder: ne, emptyLabel:
148
148
  e.preventDefault(), J(-1);
149
149
  break;
150
150
  case "Tab":
151
- T.length > 0 && (e.preventDefault(), se(e.shiftKey ? -1 : 1));
151
+ T.length > 0 && (e.preventDefault(), ce(e.shiftKey ? -1 : 1));
152
152
  break;
153
153
  case "Home":
154
154
  e.preventDefault(), W[0] !== void 0 && q(W[0]);
@@ -166,24 +166,24 @@ function b({ open: g, onOpenChange: b, groups: te, placeholder: ne, emptyLabel:
166
166
  I.value === "" && (R.value.length > 0 ? (e.preventDefault(), Q()) : z.value && (e.preventDefault(), Z()));
167
167
  break;
168
168
  }
169
- }, le = (e) => {
170
- e.key === "Escape" && (e.preventDefault(), R.value.length > 0 ? Q() : k.current?.close());
171
169
  }, ue = (e) => {
172
- e.target === k.current && k.current?.close();
170
+ e.key === "Escape" && (e.preventDefault(), R.value.length > 0 ? Q() : A.current?.close());
171
+ }, de = (e) => {
172
+ e.target === A.current && A.current?.close();
173
173
  }, $ = -1;
174
- return /* @__PURE__ */ p("dialog", {
175
- ref: k,
174
+ return /* @__PURE__ */ m("dialog", {
175
+ ref: A,
176
176
  "aria-label": E,
177
- className: o(n.dialog, ie),
178
- onClick: ue,
179
- onKeyDown: le,
180
- children: /* @__PURE__ */ m("div", {
177
+ className: o(n.dialog, ae),
178
+ onClick: de,
179
+ onKeyDown: ue,
180
+ children: /* @__PURE__ */ h("div", {
181
181
  className: n.panel,
182
182
  children: [
183
- /* @__PURE__ */ m("div", {
183
+ /* @__PURE__ */ h("div", {
184
184
  className: n.search,
185
185
  children: [
186
- /* @__PURE__ */ m("svg", {
186
+ /* @__PURE__ */ h("svg", {
187
187
  className: n.searchIcon,
188
188
  "aria-hidden": "true",
189
189
  viewBox: "0 0 16 16",
@@ -193,30 +193,30 @@ function b({ open: g, onOpenChange: b, groups: te, placeholder: ne, emptyLabel:
193
193
  stroke: "currentColor",
194
194
  strokeWidth: "1.5",
195
195
  strokeLinecap: "round",
196
- children: [/* @__PURE__ */ p("circle", {
196
+ children: [/* @__PURE__ */ m("circle", {
197
197
  cx: "7",
198
198
  cy: "7",
199
199
  r: "4.5"
200
- }), /* @__PURE__ */ p("line", {
200
+ }), /* @__PURE__ */ m("line", {
201
201
  x1: "10.5",
202
202
  y1: "10.5",
203
203
  x2: "14",
204
204
  y2: "14"
205
205
  })]
206
206
  }),
207
- V && /* @__PURE__ */ m("span", {
207
+ V && /* @__PURE__ */ h("span", {
208
208
  className: n.scopeChip,
209
- children: [V.label, /* @__PURE__ */ p("button", {
209
+ children: [V.label, /* @__PURE__ */ m("button", {
210
210
  type: "button",
211
211
  className: n.scopeClear,
212
- "aria-label": f(d.commandMenu.clearScope),
212
+ "aria-label": p(f.commandMenu.clearScope),
213
213
  onClick: Z,
214
- children: /* @__PURE__ */ p("svg", {
214
+ children: /* @__PURE__ */ m("svg", {
215
215
  viewBox: "0 0 16 16",
216
216
  width: "12",
217
217
  height: "12",
218
218
  "aria-hidden": "true",
219
- children: /* @__PURE__ */ p("path", {
219
+ children: /* @__PURE__ */ m("path", {
220
220
  d: "M4 4l8 8M12 4l-8 8",
221
221
  fill: "none",
222
222
  stroke: "currentColor",
@@ -226,77 +226,77 @@ function b({ open: g, onOpenChange: b, groups: te, placeholder: ne, emptyLabel:
226
226
  })
227
227
  })]
228
228
  }),
229
- /* @__PURE__ */ p("input", {
230
- ref: A,
229
+ /* @__PURE__ */ m("input", {
230
+ ref: j,
231
231
  type: "text",
232
232
  role: "combobox",
233
233
  "aria-expanded": "true",
234
- "aria-controls": O,
234
+ "aria-controls": k,
235
235
  "aria-activedescendant": G >= 0 ? K(G) : void 0,
236
236
  "aria-autocomplete": "list",
237
237
  "aria-label": E,
238
238
  autoComplete: "off",
239
239
  spellCheck: !1,
240
240
  className: n.input,
241
- placeholder: oe,
241
+ placeholder: B,
242
242
  value: I.value,
243
243
  onChange: (e) => {
244
244
  let t = e.target.value;
245
245
  if (!z.value && T.length > 0) {
246
- let e = y(t, T);
246
+ let e = te(t, T);
247
247
  e && (z.value = e.scope.id, t = e.rest);
248
248
  }
249
- I.value = t, L.value = 0, N.current?.(t);
249
+ I.value = t, L.value = 0, P.current?.(t);
250
250
  },
251
- onKeyDown: ce
251
+ onKeyDown: le
252
252
  })
253
253
  ]
254
254
  }),
255
- T.length > 0 && /* @__PURE__ */ m("div", {
255
+ T.length > 0 && /* @__PURE__ */ h("div", {
256
256
  className: n.scopes,
257
- children: [/* @__PURE__ */ p("span", {
257
+ children: [/* @__PURE__ */ m("span", {
258
258
  className: n.scopesLabel,
259
- children: f(d.commandMenu.scopeLabel)
260
- }), T.map((e) => /* @__PURE__ */ m("button", {
259
+ children: p(f.commandMenu.scopeLabel)
260
+ }), T.map((e) => /* @__PURE__ */ h("button", {
261
261
  type: "button",
262
262
  className: n.scopePill,
263
263
  "data-active": e.id === z.value || void 0,
264
264
  onClick: () => {
265
265
  a(() => {
266
266
  z.value = z.value === e.id ? null : e.id, L.value = 0;
267
- }), s(A.current);
267
+ }), s(j.current);
268
268
  },
269
- children: [e.prefix && /* @__PURE__ */ p("span", {
269
+ children: [e.prefix && /* @__PURE__ */ m("span", {
270
270
  className: n.scopePrefix,
271
271
  children: e.prefix
272
272
  }), e.label]
273
273
  }, e.id))]
274
274
  }),
275
- /* @__PURE__ */ m("div", {
275
+ /* @__PURE__ */ h("div", {
276
276
  className: n.list,
277
- children: [/* @__PURE__ */ p("div", {
277
+ children: [/* @__PURE__ */ m("div", {
278
278
  role: "listbox",
279
- id: O,
279
+ id: k,
280
280
  "aria-label": S,
281
281
  tabIndex: 0,
282
- children: H.map((e, r) => /* @__PURE__ */ m("div", {
282
+ children: H.map((e, r) => /* @__PURE__ */ h("div", {
283
283
  role: "group",
284
284
  "aria-label": e.heading,
285
285
  className: n.group,
286
- children: [e.heading && /* @__PURE__ */ m("div", {
286
+ children: [e.heading && /* @__PURE__ */ h("div", {
287
287
  className: n.heading,
288
288
  "aria-hidden": "true",
289
- children: [/* @__PURE__ */ p("span", { children: e.heading }), I.value !== "" && /* @__PURE__ */ p("span", {
289
+ children: [/* @__PURE__ */ m("span", { children: e.heading }), I.value !== "" && /* @__PURE__ */ m("span", {
290
290
  className: n.count,
291
- children: f(d.commandMenu.matches, { count: e.items.length })
291
+ children: p(f.commandMenu.matches, { count: e.items.length })
292
292
  })]
293
293
  }), e.items.map((e) => {
294
294
  let { item: r, indices: i } = e;
295
295
  $++;
296
296
  let a = $;
297
- return /* @__PURE__ */ m("div", {
297
+ return /* @__PURE__ */ h("div", {
298
298
  ref: (e) => {
299
- j.current[a] = e;
299
+ M.current[a] = e;
300
300
  },
301
301
  id: K(a),
302
302
  role: "option",
@@ -310,50 +310,50 @@ function b({ open: g, onOpenChange: b, groups: te, placeholder: ne, emptyLabel:
310
310
  },
311
311
  onClick: () => X(r, "primary"),
312
312
  children: [
313
- r.icon && /* @__PURE__ */ p("span", {
313
+ r.icon && /* @__PURE__ */ m("span", {
314
314
  className: n.icon,
315
315
  "aria-hidden": "true",
316
316
  children: r.icon
317
317
  }),
318
- /* @__PURE__ */ m("span", {
318
+ /* @__PURE__ */ h("span", {
319
319
  className: n.text,
320
- children: [/* @__PURE__ */ p("span", {
320
+ children: [/* @__PURE__ */ m("span", {
321
321
  className: n.label,
322
- children: v(r.label, i)
323
- }), r.description && /* @__PURE__ */ p("span", {
322
+ children: ee(r.label, i)
323
+ }), r.description && /* @__PURE__ */ m("span", {
324
324
  className: n.description,
325
325
  children: r.description
326
326
  })]
327
327
  }),
328
- r.status && /* @__PURE__ */ m("span", {
328
+ r.status && /* @__PURE__ */ h("span", {
329
329
  className: n.status,
330
330
  "data-tone": r.status.tone ?? "neutral",
331
- children: [/* @__PURE__ */ p("span", {
331
+ children: [/* @__PURE__ */ m("span", {
332
332
  className: n.statusDot,
333
333
  "aria-hidden": "true"
334
334
  }), r.status.label]
335
335
  }),
336
- r.actions && r.actions.length > 0 && /* @__PURE__ */ p("span", {
336
+ r.actions && r.actions.length > 0 && /* @__PURE__ */ m("span", {
337
337
  className: n.actions,
338
- children: r.actions.map((e) => /* @__PURE__ */ m("span", {
338
+ children: r.actions.map((e) => /* @__PURE__ */ h("span", {
339
339
  className: n.action,
340
340
  onClick: (t) => {
341
341
  t.stopPropagation(), Y(e);
342
342
  },
343
- children: [e.label, e.shortcut && /* @__PURE__ */ p("span", {
343
+ children: [e.label, e.shortcut && /* @__PURE__ */ m("span", {
344
344
  className: n.actionKeys,
345
345
  "aria-hidden": "true",
346
- children: e.shortcut.map((e, n) => /* @__PURE__ */ p(t, {
346
+ children: e.shortcut.map((e, n) => /* @__PURE__ */ m(t, {
347
347
  size: "sm",
348
348
  children: e
349
349
  }, n))
350
350
  })]
351
351
  }, e.id))
352
352
  }),
353
- r.shortcut && /* @__PURE__ */ p("span", {
353
+ r.shortcut && /* @__PURE__ */ m("span", {
354
354
  className: n.shortcut,
355
355
  "aria-hidden": "true",
356
- children: r.shortcut.map((e, n) => /* @__PURE__ */ p(t, {
356
+ children: r.shortcut.map((e, n) => /* @__PURE__ */ m(t, {
357
357
  size: "sm",
358
358
  children: e
359
359
  }, n))
@@ -362,51 +362,51 @@ function b({ open: g, onOpenChange: b, groups: te, placeholder: ne, emptyLabel:
362
362
  }, r.id);
363
363
  })]
364
364
  }, e.heading ?? `group-${r}`))
365
- }), U.length === 0 && (C ? /* @__PURE__ */ m("div", {
365
+ }), U.length === 0 && (C ? /* @__PURE__ */ h("div", {
366
366
  role: "status",
367
367
  className: n.empty,
368
- children: [/* @__PURE__ */ p(e, { size: "sm" }), f(d.commandMenu.loading)]
369
- }) : /* @__PURE__ */ p("div", {
368
+ children: [/* @__PURE__ */ m(e, { size: "sm" }), p(f.commandMenu.loading)]
369
+ }) : /* @__PURE__ */ m("div", {
370
370
  role: "status",
371
371
  className: n.empty,
372
- children: ae
372
+ children: D
373
373
  }))]
374
374
  }),
375
- /* @__PURE__ */ m("div", {
375
+ /* @__PURE__ */ h("div", {
376
376
  className: n.footer,
377
377
  "aria-hidden": "true",
378
378
  children: [
379
- /* @__PURE__ */ m("span", {
379
+ /* @__PURE__ */ h("span", {
380
380
  className: n.hint,
381
381
  children: [
382
- /* @__PURE__ */ p(t, {
382
+ /* @__PURE__ */ m(t, {
383
383
  size: "sm",
384
384
  children: "↑"
385
385
  }),
386
- /* @__PURE__ */ p(t, {
386
+ /* @__PURE__ */ m(t, {
387
387
  size: "sm",
388
388
  children: "↓"
389
389
  }),
390
390
  " navigate"
391
391
  ]
392
392
  }),
393
- /* @__PURE__ */ m("span", {
393
+ /* @__PURE__ */ h("span", {
394
394
  className: n.hint,
395
- children: [/* @__PURE__ */ p(t, {
395
+ children: [/* @__PURE__ */ m(t, {
396
396
  size: "sm",
397
397
  children: "↵"
398
398
  }), " open"]
399
399
  }),
400
- T.length > 0 && /* @__PURE__ */ m("span", {
400
+ T.length > 0 && /* @__PURE__ */ h("span", {
401
401
  className: n.hint,
402
- children: [/* @__PURE__ */ p(t, {
402
+ children: [/* @__PURE__ */ m(t, {
403
403
  size: "sm",
404
404
  children: "Tab"
405
405
  }), " scope"]
406
406
  }),
407
- /* @__PURE__ */ m("span", {
407
+ /* @__PURE__ */ h("span", {
408
408
  className: n.hint,
409
- children: [/* @__PURE__ */ p(t, {
409
+ children: [/* @__PURE__ */ m(t, {
410
410
  size: "sm",
411
411
  children: "esc"
412
412
  }), " close"]
@@ -418,4 +418,4 @@ function b({ open: g, onOpenChange: b, groups: te, placeholder: ne, emptyLabel:
418
418
  });
419
419
  }
420
420
  //#endregion
421
- export { b as CommandMenu, h as fuzzyMatch, g as fuzzyScore };
421
+ export { y as CommandMenu, g as fuzzyMatch, _ as fuzzyScore };
@@ -7,37 +7,37 @@ import { builtin as o, t as s } from "@cascivo/i18n";
7
7
  import { jsx as c, jsxs as l } from "react/jsx-runtime";
8
8
  //#region ../components/src/comparison/comparison.tsx
9
9
  var u = (e) => Math.min(100, Math.max(0, e));
10
- function d({ after: d, before: f, position: p, defaultPosition: m = 50, onPositionChange: h, orientation: g = "horizontal", keyboardStep: _ = 5, label: v, className: y, ...b }) {
10
+ function d({ after: d, before: f, position: p, defaultPosition: m = 50, onPositionChange: h, orientation: g = "horizontal", keyboardStep: _ = 5, label: v, ariaLabel: y, className: b, ...x }) {
11
11
  a();
12
- let x = t(null), S = i(!1), [C, w] = r({
12
+ let S = t(null), C = i(!1), [w, T] = r({
13
13
  value: p,
14
14
  defaultValue: m,
15
15
  onChange: h
16
- }), T = Math.round(u(C.value)), E = (e) => {
17
- let t = x.current;
16
+ }), E = Math.round(u(w.value)), D = (e) => {
17
+ let t = S.current;
18
18
  if (!t) return;
19
19
  let n = t.getBoundingClientRect();
20
- w(u(g === "vertical" ? (e.clientY - n.top) / n.height * 100 : (e.clientX - n.left) / n.width * 100));
21
- }, D = (e) => {
20
+ T(u(g === "vertical" ? (e.clientY - n.top) / n.height * 100 : (e.clientX - n.left) / n.width * 100));
21
+ }, O = (e) => {
22
22
  let t = g === "vertical" ? "ArrowUp" : "ArrowLeft", n = g === "vertical" ? "ArrowDown" : "ArrowRight", r = null;
23
- e.key === t || e.key === "ArrowLeft" || e.key === "ArrowUp" ? r = T - _ : e.key === n || e.key === "ArrowRight" || e.key === "ArrowDown" ? r = T + _ : e.key === "Home" ? r = 0 : e.key === "End" ? r = 100 : e.key === "PageUp" ? r = T + _ * 2 : e.key === "PageDown" && (r = T - _ * 2), r !== null && (e.preventDefault(), w(u(r)));
23
+ e.key === t || e.key === "ArrowLeft" || e.key === "ArrowUp" ? r = E - _ : e.key === n || e.key === "ArrowRight" || e.key === "ArrowDown" ? r = E + _ : e.key === "Home" ? r = 0 : e.key === "End" ? r = 100 : e.key === "PageUp" ? r = E + _ * 2 : e.key === "PageDown" && (r = E - _ * 2), r !== null && (e.preventDefault(), T(u(r)));
24
24
  };
25
25
  return /* @__PURE__ */ l("div", {
26
- ref: x,
26
+ ref: S,
27
27
  "data-orientation": g,
28
- "data-dragging": S.value || void 0,
29
- className: n(e.comparison, y),
30
- style: { "--position": `${T}%` },
28
+ "data-dragging": C.value || void 0,
29
+ className: n(e.comparison, b),
30
+ style: { "--position": `${E}%` },
31
31
  onPointerDown: (e) => {
32
- S.value = !0, e.currentTarget.setPointerCapture?.(e.pointerId), E(e);
32
+ C.value = !0, e.currentTarget.setPointerCapture?.(e.pointerId), D(e);
33
33
  },
34
34
  onPointerMove: (e) => {
35
- S.value && E(e);
35
+ C.value && D(e);
36
36
  },
37
37
  onPointerUp: (e) => {
38
- S.value = !1, e.currentTarget.releasePointerCapture?.(e.pointerId);
38
+ C.value = !1, e.currentTarget.releasePointerCapture?.(e.pointerId);
39
39
  },
40
- ...b,
40
+ ...x,
41
41
  children: [
42
42
  /* @__PURE__ */ c("div", {
43
43
  className: e.item,
@@ -53,13 +53,13 @@ function d({ after: d, before: f, position: p, defaultPosition: m = 50, onPositi
53
53
  children: /* @__PURE__ */ c("div", {
54
54
  role: "slider",
55
55
  tabIndex: 0,
56
- "aria-label": v ?? s(o.comparison.label),
56
+ "aria-label": y ?? v ?? s(o.comparison.label),
57
57
  "aria-orientation": g,
58
58
  "aria-valuemin": 0,
59
59
  "aria-valuemax": 100,
60
- "aria-valuenow": T,
60
+ "aria-valuenow": E,
61
61
  className: e.handle,
62
- onKeyDown: D
62
+ onKeyDown: O
63
63
  })
64
64
  })
65
65
  ]
@@ -1 +1 @@
1
- @layer cascivo.component{._root_bwapn_2{--_row-height:3rem;font-family:var(--cascivo-font-sans);font-size:var(--cascivo-text-sm);color:var(--cascivo-color-text);border:1px solid var(--cascivo-color-border);border-radius:var(--cascivo-radius-surface);background-color:var(--cascivo-color-surface);flex-direction:column;display:flex;overflow:hidden}._root_bwapn_2[data-density=compact]{--_row-height:2.25rem}._root_bwapn_2[data-density=normal]{--_row-height:3rem}._root_bwapn_2[data-density=relaxed]{--_row-height:3.75rem}._toolbar_bwapn_26{justify-content:space-between;align-items:flex-end;gap:var(--cascivo-space-4);padding:var(--cascivo-space-3) var(--cascivo-space-4);border-block-end:1px solid var(--cascivo-color-border);display:flex}._heading_bwapn_35{gap:var(--cascivo-space-1);flex-direction:column;display:flex}._title_bwapn_41{font-size:var(--cascivo-text-base);font-weight:var(--cascivo-font-semibold);color:var(--cascivo-color-text)}._description_bwapn_47{font-size:var(--cascivo-text-sm);color:var(--cascivo-color-text-subtle)}._search_bwapn_52{appearance:none;height:2rem;min-inline-size:14rem;padding-inline:var(--cascivo-space-3);font-family:var(--cascivo-font-sans);font-size:var(--cascivo-text-sm);color:var(--cascivo-color-text);background-color:var(--cascivo-color-surface);border:1px solid var(--cascivo-color-border);border-radius:var(--cascivo-radius-field);transition:border-color var(--cascivo-duration-150) var(--cascivo-ease-out), box-shadow var(--cascivo-duration-150) var(--cascivo-ease-out);outline:none}._search_bwapn_52:hover:not(:focus){border-color:var(--cascivo-color-border-strong)}._search_bwapn_52:focus-visible{border-color:var(--cascivo-color-accent);box-shadow:0 0 0 3px color-mix(in srgb, var(--cascivo-color-accent) 20%, transparent)}._batchBar_bwapn_79{justify-content:space-between;align-items:center;gap:var(--cascivo-space-4);padding:var(--cascivo-space-2) var(--cascivo-space-4);background-color:var(--cascivo-color-bg-subtle);border-block-end:1px solid var(--cascivo-color-border);display:flex}._batchCount_bwapn_89{font-size:var(--cascivo-text-sm);font-weight:var(--cascivo-font-medium);color:var(--cascivo-color-text)}._batchActions_bwapn_95{gap:var(--cascivo-space-2);display:flex}._scroller_bwapn_101{max-block-size:var(--cascivo-data-table-max-height,none);scrollbar-gutter:stable;overflow:auto}._scrollerVirtualized_bwapn_111{block-size:var(--cascivo-data-table-height,400px);max-block-size:none;overflow:auto}._table_bwapn_117{border-collapse:collapse;table-layout:auto;inline-size:100%}._root_bwapn_2[data-paginated=true][data-fixed-layout=true] ._table_bwapn_117{table-layout:fixed}._table_bwapn_117 thead th{padding-block:var(--cascivo-space-2);padding-inline:var(--cascivo-data-table-cell-gap,var(--cascivo-space-4));text-align:start;font-weight:var(--cascivo-font-semibold);font-size:var(--cascivo-text-xs);text-transform:uppercase;letter-spacing:var(--cascivo-tracking-wide);color:var(--cascivo-color-text-subtle);background-color:var(--cascivo-color-bg-subtle);border-block-end:1px solid var(--cascivo-color-border);white-space:nowrap}._table_bwapn_117 thead th[data-align=end]{text-align:end}._table_bwapn_117 td{padding-block:0;padding-inline:var(--cascivo-data-table-cell-gap,var(--cascivo-space-4));block-size:var(--_row-height);vertical-align:middle;border-block-end:1px solid var(--cascivo-color-border);color:var(--cascivo-color-text)}._table_bwapn_117 td[data-sized],._table_bwapn_117 th[data-sized]{overflow-wrap:break-word;min-inline-size:min-content}._table_bwapn_117 td[data-align=end]{text-align:end}._table_bwapn_117 tbody tr[data-filler-row] td{border-block-end:none}._root_bwapn_2[data-sticky-header=true] ._table_bwapn_117 thead th{z-index:var(--cascivo-z-raised,10);background-color:var(--cascivo-color-surface);position:sticky;inset-block-start:0}._root_bwapn_2[data-zebra=true] ._table_bwapn_117 tbody tr:nth-child(2n of ._row_bwapn_199){background-color:var(--cascivo-table-zebra-bg,color-mix(in oklab, var(--cascivo-color-text) 5%, transparent))}._controlCol_bwapn_219{inline-size:3rem}._controlCell_bwapn_223{text-align:center;padding-inline:var(--cascivo-space-2)}._sortButton_bwapn_229{align-items:center;gap:var(--cascivo-space-1);font-family:inherit;font-size:inherit;font-weight:inherit;text-transform:inherit;letter-spacing:inherit;color:inherit;cursor:pointer;background:0 0;border:none;outline:none;padding:0;display:inline-flex}._sortButton_bwapn_229:focus-visible{text-decoration:underline}._sortButton_bwapn_229:after{content:"↕";opacity:.4;font-size:.75em}._sortButton_bwapn_229[data-state=ascending]:after{content:"↑";opacity:.9}._sortButton_bwapn_229[data-state=descending]:after{content:"↓";opacity:.9}._row_bwapn_199{content-visibility:auto;contain-intrinsic-size:auto var(--_row-height,3rem)}._row_bwapn_199[data-state=selected] td{background-color:color-mix(in srgb, var(--cascivo-color-accent) 8%, transparent)}._emptyCell_bwapn_277{padding:var(--cascivo-space-8) var(--cascivo-space-4);text-align:center;color:var(--cascivo-color-text-muted)}._expansionRow_bwapn_284[data-state=closed]{display:none}._expansionGrid_bwapn_290{overflow:hidden}._expansionInner_bwapn_294{padding:var(--cascivo-space-4)}._expandButton_bwapn_299{cursor:pointer;block-size:1.5rem;inline-size:1.5rem;color:var(--cascivo-color-text-muted);border-radius:var(--cascivo-radius-control);background:0 0;border:none;outline:none;justify-content:center;align-items:center;display:inline-flex}._expandButton_bwapn_299:focus-visible{box-shadow:0 0 0 2px var(--cascivo-color-accent)}._expandButton_bwapn_299:hover{color:var(--cascivo-color-text);background-color:var(--cascivo-color-bg-subtle)}._chevron_bwapn_322{block-size:.75rem;inline-size:.75rem;transition:transform var(--cascivo-duration-150) var(--cascivo-ease-out);border-block-end:2px solid;border-inline-end:2px solid;display:block;transform:rotate(45deg)}._expandButton_bwapn_299[data-state=open] ._chevron_bwapn_322{transform:rotate(-135deg)}._shimmer_bwapn_337{background-color:var(--cascivo-color-bg-subtle);border-radius:var(--cascivo-radius-indicator);block-size:.875rem;inline-size:80%;display:block;position:relative;overflow:hidden}._shimmer_bwapn_337:after{content:"";background:linear-gradient(90deg, transparent, var(--cascivo-color-surface), transparent);animation:_shimmer_bwapn_337 var(--cascivo-duration-500,.5s) var(--cascivo-ease-in-out,ease-in-out) infinite;position:absolute;inset:0;translate:-100%}@keyframes _shimmer_bwapn_337{to{translate:100%}}._footer_bwapn_364{justify-content:flex-end;align-items:center;gap:var(--cascivo-space-4);padding:var(--cascivo-space-3) var(--cascivo-space-4);border-block-start:1px solid var(--cascivo-color-border);font-size:var(--cascivo-text-sm);display:flex}._pageSize_bwapn_374{align-items:center;gap:var(--cascivo-space-2);color:var(--cascivo-color-text-muted);display:flex}._pageSize_bwapn_374 select{appearance:none;height:2rem;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-surface);border:1px solid var(--cascivo-color-border);border-radius:var(--cascivo-radius-field);cursor:pointer;outline:none}._pageSize_bwapn_374 select:focus-visible{border-color:var(--cascivo-color-accent);box-shadow:0 0 0 3px color-mix(in srgb, var(--cascivo-color-accent) 20%, transparent)}._range_bwapn_400{color:var(--cascivo-color-text-muted);white-space:nowrap}._pageButtons_bwapn_405{gap:var(--cascivo-space-1);display:flex}._pageButton_bwapn_405{border:1px solid var(--cascivo-color-border);border-radius:var(--cascivo-radius-control);cursor:pointer;block-size:2rem;inline-size:2rem;color:var(--cascivo-color-text);font-size:var(--cascivo-text-base);transition:background-color var(--cascivo-duration-150) var(--cascivo-ease-out), border-color var(--cascivo-duration-150) var(--cascivo-ease-out);background:0 0;outline:none;justify-content:center;align-items:center;display:inline-flex}._pageButton_bwapn_405:hover:not(:disabled){background-color:var(--cascivo-color-bg-subtle);border-color:var(--cascivo-color-border-strong)}._pageButton_bwapn_405:focus-visible{border-color:var(--cascivo-color-accent);box-shadow:0 0 0 3px color-mix(in srgb, var(--cascivo-color-accent) 20%, transparent)}._pageButton_bwapn_405:disabled{color:var(--cascivo-color-text-muted);cursor:not-allowed}._srOnly_bwapn_446{clip-path:inset(50%);white-space:nowrap;block-size:1px;inline-size:1px;position:absolute;overflow:hidden}}
1
+ @layer cascivo.component{._root_1bz3s_2{--_row-height:3rem;font-family:var(--cascivo-font-sans);font-size:var(--cascivo-text-sm);color:var(--cascivo-color-text);border:1px solid var(--cascivo-color-border);border-radius:var(--cascivo-radius-surface);background-color:var(--cascivo-color-surface);flex-direction:column;display:flex;overflow:hidden}._root_1bz3s_2[data-density=compact]{--_row-height:2.25rem}._root_1bz3s_2[data-density=normal]{--_row-height:3rem}._root_1bz3s_2[data-density=relaxed]{--_row-height:3.75rem}._toolbar_1bz3s_26{justify-content:space-between;align-items:flex-end;gap:var(--cascivo-space-4);padding:var(--cascivo-space-3) var(--cascivo-space-4);border-block-end:1px solid var(--cascivo-color-border);display:flex}._heading_1bz3s_35{gap:var(--cascivo-space-1);flex-direction:column;display:flex}._title_1bz3s_41{font-size:var(--cascivo-text-base);font-weight:var(--cascivo-font-semibold);color:var(--cascivo-color-text)}._description_1bz3s_47{font-size:var(--cascivo-text-sm);color:var(--cascivo-color-text-subtle)}._search_1bz3s_52{appearance:none;height:2rem;min-inline-size:14rem;padding-inline:var(--cascivo-space-3);font-family:var(--cascivo-font-sans);font-size:var(--cascivo-text-sm);color:var(--cascivo-color-text);background-color:var(--cascivo-color-surface);border:1px solid var(--cascivo-color-border);border-radius:var(--cascivo-radius-field);transition:border-color var(--cascivo-duration-150) var(--cascivo-ease-out), box-shadow var(--cascivo-duration-150) var(--cascivo-ease-out);outline:none}._search_1bz3s_52:hover:not(:focus){border-color:var(--cascivo-color-border-strong)}._search_1bz3s_52:focus-visible{border-color:var(--cascivo-color-accent);box-shadow:0 0 0 3px color-mix(in srgb, var(--cascivo-color-accent) 20%, transparent)}._batchBar_1bz3s_79{justify-content:space-between;align-items:center;gap:var(--cascivo-space-4);padding:var(--cascivo-space-2) var(--cascivo-space-4);background-color:var(--cascivo-color-bg-subtle);border-block-end:1px solid var(--cascivo-color-border);display:flex}._batchCount_1bz3s_89{font-size:var(--cascivo-text-sm);font-weight:var(--cascivo-font-medium);color:var(--cascivo-color-text)}._batchActions_1bz3s_95{gap:var(--cascivo-space-2);display:flex}._scroller_1bz3s_101{max-block-size:var(--cascivo-data-table-max-height,none);scrollbar-gutter:stable;background-image:linear-gradient(to right, var(--cascivo-color-surface) 30%, transparent), linear-gradient(to left, var(--cascivo-color-surface) 30%, transparent), radial-gradient(farthest-side at 0 50%, var(--cascivo-color-border), transparent), radial-gradient(farthest-side at 100% 50%, var(--cascivo-color-border), transparent);background-position:0 0,100% 0,0 0,100% 0;background-repeat:no-repeat;background-size:2.5rem 100%,2.5rem 100%,.875rem 100%,.875rem 100%;background-attachment:local,local,scroll,scroll;overflow:auto}._scrollerVirtualized_1bz3s_137{block-size:var(--cascivo-data-table-height,400px);max-block-size:none;overflow:auto}._table_1bz3s_143{border-collapse:collapse;table-layout:auto;inline-size:100%}._root_1bz3s_2[data-paginated=true][data-fixed-layout=true] ._table_1bz3s_143{table-layout:fixed}._table_1bz3s_143 thead th{padding-block:var(--cascivo-space-2);padding-inline:var(--cascivo-data-table-cell-gap,var(--cascivo-space-4));text-align:start;font-weight:var(--cascivo-font-semibold);font-size:var(--cascivo-text-xs);text-transform:uppercase;letter-spacing:var(--cascivo-tracking-wide);color:var(--cascivo-color-text-subtle);background-color:var(--cascivo-color-bg-subtle);border-block-end:1px solid var(--cascivo-color-border);white-space:nowrap}._table_1bz3s_143 thead th[data-align=end]{text-align:end}._table_1bz3s_143 td{padding-block:0;padding-inline:var(--cascivo-data-table-cell-gap,var(--cascivo-space-4));block-size:var(--_row-height);vertical-align:middle;border-block-end:1px solid var(--cascivo-color-border);color:var(--cascivo-color-text)}._table_1bz3s_143 td[data-sized],._table_1bz3s_143 th[data-sized]{overflow-wrap:break-word;min-inline-size:min-content}._table_1bz3s_143 td[data-align=end]{text-align:end}._table_1bz3s_143 tbody tr[data-filler-row] td{border-block-end:none}._root_1bz3s_2[data-sticky-header=true] ._table_1bz3s_143 thead th{z-index:var(--cascivo-z-raised,10);background-color:var(--cascivo-color-surface);position:sticky;inset-block-start:0}._root_1bz3s_2[data-zebra=true] ._table_1bz3s_143 tbody tr:nth-child(2n of ._row_1bz3s_225){background-color:var(--cascivo-table-zebra-bg,color-mix(in oklab, var(--cascivo-color-text) 5%, transparent))}._controlCol_1bz3s_245{inline-size:3rem}._controlCell_1bz3s_249{text-align:center;padding-inline:var(--cascivo-space-2)}._sortButton_1bz3s_255{align-items:center;gap:var(--cascivo-space-1);font-family:inherit;font-size:inherit;font-weight:inherit;text-transform:inherit;letter-spacing:inherit;color:inherit;cursor:pointer;background:0 0;border:none;outline:none;padding:0;display:inline-flex}._sortButton_1bz3s_255:focus-visible{text-decoration:underline}._sortButton_1bz3s_255:after{content:"↕";opacity:.4;font-size:.75em}._sortButton_1bz3s_255[data-state=ascending]:after{content:"↑";opacity:.9}._sortButton_1bz3s_255[data-state=descending]:after{content:"↓";opacity:.9}._row_1bz3s_225{content-visibility:auto;contain-intrinsic-size:auto var(--_row-height,3rem)}._row_1bz3s_225[data-state=selected] td{background-color:color-mix(in srgb, var(--cascivo-color-accent) 8%, transparent)}._emptyCell_1bz3s_303{padding:var(--cascivo-space-8) var(--cascivo-space-4);text-align:center;color:var(--cascivo-color-text-muted)}._expansionRow_1bz3s_310[data-state=closed]{display:none}._expansionGrid_1bz3s_316{overflow:hidden}._expansionInner_1bz3s_320{padding:var(--cascivo-space-4)}._expandButton_1bz3s_325{cursor:pointer;block-size:1.5rem;inline-size:1.5rem;color:var(--cascivo-color-text-muted);border-radius:var(--cascivo-radius-control);background:0 0;border:none;outline:none;justify-content:center;align-items:center;display:inline-flex}._expandButton_1bz3s_325:focus-visible{box-shadow:0 0 0 2px var(--cascivo-color-accent)}._expandButton_1bz3s_325:hover{color:var(--cascivo-color-text);background-color:var(--cascivo-color-bg-subtle)}._chevron_1bz3s_348{block-size:.75rem;inline-size:.75rem;transition:transform var(--cascivo-duration-150) var(--cascivo-ease-out);border-block-end:2px solid;border-inline-end:2px solid;display:block;transform:rotate(45deg)}._expandButton_1bz3s_325[data-state=open] ._chevron_1bz3s_348{transform:rotate(-135deg)}._shimmer_1bz3s_363{background-color:var(--cascivo-color-bg-subtle);border-radius:var(--cascivo-radius-indicator);block-size:.875rem;inline-size:80%;display:block;position:relative;overflow:hidden}._shimmer_1bz3s_363:after{content:"";background:linear-gradient(90deg, transparent, var(--cascivo-color-surface), transparent);animation:_shimmer_1bz3s_363 var(--cascivo-duration-500,.5s) var(--cascivo-ease-in-out,ease-in-out) infinite;position:absolute;inset:0;translate:-100%}@keyframes _shimmer_1bz3s_363{to{translate:100%}}._footer_1bz3s_390{justify-content:flex-end;align-items:center;gap:var(--cascivo-space-4);padding:var(--cascivo-space-3) var(--cascivo-space-4);border-block-start:1px solid var(--cascivo-color-border);font-size:var(--cascivo-text-sm);display:flex}._pageSize_1bz3s_400{align-items:center;gap:var(--cascivo-space-2);color:var(--cascivo-color-text-muted);display:flex}._pageSize_1bz3s_400 select{appearance:none;height:2rem;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-surface);border:1px solid var(--cascivo-color-border);border-radius:var(--cascivo-radius-field);cursor:pointer;outline:none}._pageSize_1bz3s_400 select:focus-visible{border-color:var(--cascivo-color-accent);box-shadow:0 0 0 3px color-mix(in srgb, var(--cascivo-color-accent) 20%, transparent)}._range_1bz3s_426{color:var(--cascivo-color-text-muted);white-space:nowrap}._pageButtons_1bz3s_431{gap:var(--cascivo-space-1);display:flex}._pageButton_1bz3s_431{border:1px solid var(--cascivo-color-border);border-radius:var(--cascivo-radius-control);cursor:pointer;block-size:2rem;inline-size:2rem;color:var(--cascivo-color-text);font-size:var(--cascivo-text-base);transition:background-color var(--cascivo-duration-150) var(--cascivo-ease-out), border-color var(--cascivo-duration-150) var(--cascivo-ease-out);background:0 0;outline:none;justify-content:center;align-items:center;display:inline-flex}._pageButton_1bz3s_431:hover:not(:disabled){background-color:var(--cascivo-color-bg-subtle);border-color:var(--cascivo-color-border-strong)}._pageButton_1bz3s_431:focus-visible{border-color:var(--cascivo-color-accent);box-shadow:0 0 0 3px color-mix(in srgb, var(--cascivo-color-accent) 20%, transparent)}._pageButton_1bz3s_431:disabled{color:var(--cascivo-color-text-muted);cursor:not-allowed}._srOnly_1bz3s_472{clip-path:inset(50%);white-space:nowrap;block-size:1px;inline-size:1px;position:absolute;overflow:hidden}}