@pibit.ai/cure-design-system 0.6.23 → 0.6.25

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 (44) hide show
  1. package/dist/index.d.ts +5 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +403 -388
  4. package/dist/patterns/sub-sidebar/sub-sidebar.js +2 -2
  5. package/dist/patterns/table/toolbar/ColumnHeaderMenu.js +19 -19
  6. package/dist/patterns/table/toolbar/TableViewsDropdown.js +1 -1
  7. package/dist/primitives/button-group/button-group.d.ts +45 -0
  8. package/dist/primitives/button-group/button-group.d.ts.map +1 -0
  9. package/dist/primitives/button-group/button-group.js +73 -0
  10. package/dist/primitives/button-group/index.d.ts +2 -0
  11. package/dist/primitives/button-group/index.d.ts.map +1 -0
  12. package/dist/primitives/checkbox/checkbox.js +1 -1
  13. package/dist/primitives/input/hint-text.js +5 -5
  14. package/dist/primitives/input/index.d.ts +1 -0
  15. package/dist/primitives/input/index.d.ts.map +1 -1
  16. package/dist/primitives/input/input-group.d.ts +31 -0
  17. package/dist/primitives/input/input-group.d.ts.map +1 -0
  18. package/dist/primitives/input/input-group.js +116 -0
  19. package/dist/primitives/progress-bar/index.d.ts +2 -0
  20. package/dist/primitives/progress-bar/index.d.ts.map +1 -0
  21. package/dist/primitives/progress-bar/progress-bar.d.ts +52 -0
  22. package/dist/primitives/progress-bar/progress-bar.d.ts.map +1 -0
  23. package/dist/primitives/progress-bar/progress-bar.js +96 -0
  24. package/dist/primitives/segmented-control/index.d.ts +2 -0
  25. package/dist/primitives/segmented-control/index.d.ts.map +1 -0
  26. package/dist/primitives/segmented-control/segmented-control.d.ts +21 -0
  27. package/dist/primitives/segmented-control/segmented-control.d.ts.map +1 -0
  28. package/dist/primitives/segmented-control/segmented-control.js +43 -0
  29. package/dist/primitives/select/multi-select.js +20 -20
  30. package/dist/primitives/slider/index.d.ts +3 -0
  31. package/dist/primitives/slider/index.d.ts.map +1 -0
  32. package/dist/primitives/slider/range-slider.d.ts +24 -0
  33. package/dist/primitives/slider/range-slider.d.ts.map +1 -0
  34. package/dist/primitives/slider/range-slider.js +115 -0
  35. package/dist/primitives/slider/slider.d.ts +13 -0
  36. package/dist/primitives/slider/slider.d.ts.map +1 -0
  37. package/dist/primitives/slider/slider.js +55 -0
  38. package/dist/styles/components.css +1 -1
  39. package/dist/styles/theme.css +1 -1
  40. package/dist/utils/cn.d.ts.map +1 -1
  41. package/dist/utils/cn.js +12 -10
  42. package/dist/utils/cn.test.d.ts +2 -0
  43. package/dist/utils/cn.test.d.ts.map +1 -0
  44. package/package.json +1 -1
@@ -0,0 +1,96 @@
1
+ import { jsx as a, jsxs as i } from "react/jsx-runtime";
2
+ import { cx as g } from "../../utils/cn.js";
3
+ const u = (r, e, t) => t > e ? Math.min(100, Math.max(0, (r - e) * 100 / (t - e))) : 0, x = ({
4
+ value: r,
5
+ min: e = 0,
6
+ max: t = 100,
7
+ className: l,
8
+ progressClassName: d,
9
+ "aria-label": c
10
+ }) => {
11
+ const m = u(r, e, t);
12
+ return /* @__PURE__ */ a(
13
+ "div",
14
+ {
15
+ role: "progressbar",
16
+ "aria-label": c,
17
+ "aria-valuenow": r,
18
+ "aria-valuemin": e,
19
+ "aria-valuemax": t,
20
+ className: g("h-2 w-full overflow-hidden rounded-md bg-quaternary", l),
21
+ children: /* @__PURE__ */ a(
22
+ "div",
23
+ {
24
+ style: { transform: `translateX(-${100 - m}%)` },
25
+ className: g(
26
+ "size-full rounded-md bg-fg-brand-primary transition duration-75 ease-linear",
27
+ d
28
+ )
29
+ }
30
+ )
31
+ }
32
+ );
33
+ }, h = ({
34
+ value: r,
35
+ min: e = 0,
36
+ max: t = 100,
37
+ valueFormatter: l,
38
+ labelPosition: d,
39
+ className: c,
40
+ progressClassName: m,
41
+ "aria-label": f
42
+ }) => {
43
+ const n = u(r, e, t), o = l ? l(r, n) : `${n.toFixed(0)}%`, s = /* @__PURE__ */ a(
44
+ x,
45
+ {
46
+ min: e,
47
+ max: t,
48
+ value: r,
49
+ className: c,
50
+ progressClassName: m,
51
+ "aria-label": f
52
+ }
53
+ );
54
+ switch (d) {
55
+ case "right":
56
+ return /* @__PURE__ */ i("div", { className: "flex items-center gap-3", children: [
57
+ s,
58
+ /* @__PURE__ */ a("span", { className: "shrink-0 text-sm font-medium text-secondary tabular-nums", children: o })
59
+ ] });
60
+ case "bottom":
61
+ return /* @__PURE__ */ i("div", { className: "flex flex-col items-end gap-2", children: [
62
+ s,
63
+ /* @__PURE__ */ a("span", { className: "text-sm font-medium text-secondary tabular-nums", children: o })
64
+ ] });
65
+ case "top-floating":
66
+ return /* @__PURE__ */ i("div", { className: "relative flex flex-col items-end gap-2", children: [
67
+ s,
68
+ /* @__PURE__ */ a(
69
+ "div",
70
+ {
71
+ style: { left: `${n}%` },
72
+ className: "absolute -top-2 -translate-x-1/2 -translate-y-full rounded-lg bg-primary_alt px-3 py-2 shadow-lg ring-1 ring-secondary_alt",
73
+ children: /* @__PURE__ */ a("div", { className: "text-xs font-semibold text-secondary tabular-nums", children: o })
74
+ }
75
+ )
76
+ ] });
77
+ case "bottom-floating":
78
+ return /* @__PURE__ */ i("div", { className: "relative flex flex-col items-end gap-2", children: [
79
+ s,
80
+ /* @__PURE__ */ a(
81
+ "div",
82
+ {
83
+ style: { left: `${n}%` },
84
+ className: "absolute -bottom-2 -translate-x-1/2 translate-y-full rounded-lg bg-primary_alt px-3 py-2 shadow-lg ring-1 ring-secondary_alt",
85
+ children: /* @__PURE__ */ a("div", { className: "text-xs font-semibold text-secondary", children: o })
86
+ }
87
+ )
88
+ ] });
89
+ default:
90
+ return s;
91
+ }
92
+ };
93
+ export {
94
+ h as ProgressBar,
95
+ x as ProgressBarBase
96
+ };
@@ -0,0 +1,2 @@
1
+ export { SegmentedControl, type SegmentedControlOption, type SegmentedControlProps } from './segmented-control';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/primitives/segmented-control/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,KAAK,sBAAsB,EAAE,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,21 @@
1
+ export interface SegmentedControlOption {
2
+ label: string;
3
+ onClick: () => void;
4
+ /** Shown after the label; a shimmer stands in while `isLoading`. */
5
+ count?: number;
6
+ }
7
+ export interface SegmentedControlProps {
8
+ buttonsArray: SegmentedControlOption[];
9
+ /** Controlled active option. Without it the control starts on the first option and tracks clicks itself. */
10
+ activeIndex?: number;
11
+ isLoading?: boolean;
12
+ buttonDisabled?: boolean;
13
+ /** Called after an option's own `onClick`, e.g. for analytics. */
14
+ onChange?: (index: number, option: SegmentedControlOption) => void;
15
+ }
16
+ /**
17
+ * A row of text buttons where one is active (brand-tinted, `aria-pressed`), each with an optional
18
+ * count. Used for view filters such as the notification panel's All / Unread / Mentions.
19
+ */
20
+ export declare const SegmentedControl: ({ buttonsArray, activeIndex: controlledIndex, isLoading, buttonDisabled, onChange, }: SegmentedControlProps) => import("react/jsx-runtime").JSX.Element;
21
+ //# sourceMappingURL=segmented-control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segmented-control.d.ts","sourceRoot":"","sources":["../../../src/primitives/segmented-control/segmented-control.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,sBAAsB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IAClC,YAAY,EAAE,sBAAsB,EAAE,CAAC;IACvC,4GAA4G;IAC5G,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,KAAK,IAAI,CAAC;CACtE;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,sFAM9B,qBAAqB,4CAgDvB,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { jsx as a, jsxs as p, Fragment as n } from "react/jsx-runtime";
2
+ import { useState as v, useEffect as b } from "react";
3
+ import { cx as f } from "../../utils/cn.js";
4
+ import { Button as h } from "../button/button.js";
5
+ import g from "../shimmer/shimmer.js";
6
+ const S = ({
7
+ buttonsArray: i,
8
+ activeIndex: o,
9
+ isLoading: l = !1,
10
+ buttonDisabled: m,
11
+ onChange: c
12
+ }) => {
13
+ const [s, t] = v(o ?? 0);
14
+ b(() => {
15
+ o !== void 0 && t(o);
16
+ }, [o]);
17
+ const d = (r) => {
18
+ var e;
19
+ t(r), (e = i[r]) == null || e.onClick(), i[r] && (c == null || c(r, i[r]));
20
+ };
21
+ return /* @__PURE__ */ a("div", { className: "inline-flex gap-1", children: i.map((r, e) => /* @__PURE__ */ p(
22
+ h,
23
+ {
24
+ onClick: () => d(e),
25
+ size: "xs",
26
+ color: "tertiary",
27
+ className: f(
28
+ "h-8 px-3 border-0 border-white cursor-pointer text-xs font-medium text-[var(--color-gray-600)] transition-all duration-150",
29
+ s === e && "text-[var(--color-text-brand-tertiary)] rounded-sm bg-[var(--color-bg-brand-primary)] border border-[var(--color-border-brand)] hover:bg-[var(--color-bg-brand-primary)]"
30
+ ),
31
+ isDisabled: m,
32
+ "aria-pressed": s === e,
33
+ children: [
34
+ /* @__PURE__ */ a("span", { children: r.label }),
35
+ r.count !== void 0 && /* @__PURE__ */ a(n, { children: l ? /* @__PURE__ */ a(g, { className: "ml-1 inline-block", children: /* @__PURE__ */ a("div", { className: "bg-gray-200 rounded h-3.5 w-4" }) }) : /* @__PURE__ */ a("span", { className: "ml-1 ", children: r.count }) })
36
+ ]
37
+ },
38
+ e
39
+ )) });
40
+ };
41
+ export {
42
+ S as SegmentedControl
43
+ };
@@ -1,6 +1,6 @@
1
1
  import { jsx as s, jsxs as M, Fragment as me } from "react/jsx-runtime";
2
2
  import { useId as ge, useCallback as L, useMemo as B, useRef as G, useState as ue, createContext as we, useContext as H, useLayoutEffect as ye } from "react";
3
- import { useFilter as be, useInteractOutside as xe, FocusScope as ve, useFocusManager as De } from "react-aria";
3
+ import { useFilter as be, useInteractOutside as ve, FocusScope as xe, useFocusManager as De } from "react-aria";
4
4
  import { ChevronDown as Ne, SearchMd as ke } from "@untitledui/icons";
5
5
  import { ComboBox as Te, ListBox as Se, ComboBoxStateContext as Z, ButtonContext as ee, Group as Re, Input as Fe } from "react-aria-components";
6
6
  import { useListData as Ae } from "../../node_modules/react-stately/dist/private/data/useListData.js";
@@ -44,7 +44,7 @@ function $e({
44
44
  popoverRef: y
45
45
  }) {
46
46
  const d = H(Z);
47
- return xe({
47
+ return ve({
48
48
  ref: y,
49
49
  isDisabled: !(d != null && d.isOpen),
50
50
  onInteractOutside: (m) => {
@@ -169,7 +169,7 @@ const Ue = ({
169
169
  ...f
170
170
  }) => {
171
171
  var ae;
172
- const _ = ge(), { contains: V } = be({ sensitivity: "base" }), E = (ae = m == null ? void 0 : m.items) != null && ae.length ? m.items.map((n) => n.id) : [], v = L(
172
+ const _ = ge(), { contains: V } = be({ sensitivity: "base" }), E = (ae = m == null ? void 0 : m.items) != null && ae.length ? m.items.map((n) => n.id) : [], x = L(
173
173
  (n) => E.some((i) => String(i) === String(n)),
174
174
  [E]
175
175
  ), X = L(
@@ -179,9 +179,9 @@ const Ue = ({
179
179
  i,
180
180
  V
181
181
  );
182
- return (R || !v(n.id)) && A;
182
+ return (R || !x(n.id)) && A;
183
183
  },
184
- [V, v, R]
184
+ [V, x, R]
185
185
  ), w = Ae({
186
186
  initialItems: c,
187
187
  filter: X
@@ -190,34 +190,34 @@ const Ue = ({
190
190
  ) : c : [], [c, z, w.filterText, V]), P = B(() => {
191
191
  if (D.length === 0) return "unselected";
192
192
  const n = D.filter(
193
- (i) => v(i.id)
193
+ (i) => x(i.id)
194
194
  ).length;
195
195
  return n === 0 ? "unselected" : n === D.length ? "selected" : "indeterminate";
196
- }, [D, v]), t = G(!1), N = L(() => {
196
+ }, [D, x]), t = G(!1), N = L(() => {
197
197
  t.current = !0, setTimeout(() => {
198
198
  t.current = !1;
199
199
  }, 0);
200
200
  }, []), J = L(() => {
201
201
  N();
202
- const n = P !== "selected", i = D.map((x) => x.id), A = new Set(i.map(String)), K = n ? [.../* @__PURE__ */ new Set([...E, ...i])] : E.filter((x) => !A.has(String(x))), W = D.filter((x) => !v(x.id)), U = D.filter((x) => v(x.id)).map((x) => x.id);
202
+ const n = P !== "selected", i = D.map((v) => v.id), A = new Set(i.map(String)), K = n ? [.../* @__PURE__ */ new Set([...E, ...i])] : E.filter((v) => !A.has(String(v))), W = D.filter((v) => !x(v.id)), U = D.filter((v) => x(v.id)).map((v) => v.id);
203
203
  if (n && W.length > 0 ? m.append(...W) : !n && U.length > 0 && m.remove(...U), T) {
204
204
  T(K);
205
205
  return;
206
206
  }
207
207
  if (n) {
208
- for (const x of D)
209
- v(x.id) || b == null || b(x.id);
208
+ for (const v of D)
209
+ x(v.id) || b == null || b(v.id);
210
210
  return;
211
211
  }
212
- for (const x of D)
213
- v(x.id) && (l == null || l(x.id));
212
+ for (const v of D)
213
+ x(v.id) && (l == null || l(v.id));
214
214
  }, [
215
215
  N,
216
216
  P,
217
217
  D,
218
218
  E,
219
219
  m,
220
- v,
220
+ x,
221
221
  T,
222
222
  b,
223
223
  l
@@ -238,7 +238,7 @@ const Ue = ({
238
238
  }, 0);
239
239
  const A = w.getItem(n) ?? (c == null ? void 0 : c.find((K) => String(K.id) === String(n)));
240
240
  if (A) {
241
- if (v(n)) {
241
+ if (x(n)) {
242
242
  const K = E.find((W) => String(W) === i) ?? n;
243
243
  m.remove(K), l == null || l(K);
244
244
  } else
@@ -313,7 +313,7 @@ const Ue = ({
313
313
  className: k(
314
314
  "text-tertiary",
315
315
  ce[d],
316
- "-mt-0.5 leading-[18px]"
316
+ "-mt-0.5 leading-4.5"
317
317
  ),
318
318
  children: j
319
319
  }
@@ -510,7 +510,7 @@ const Ue = ({
510
510
  e == null || e.close();
511
511
  break;
512
512
  }
513
- }, v = ((z = (w = a == null ? void 0 : a.selectedItems) == null ? void 0 : w.items) == null ? void 0 : z.length) === 0;
513
+ }, x = ((z = (w = a == null ? void 0 : a.selectedItems) == null ? void 0 : w.items) == null ? void 0 : z.length) === 0;
514
514
  return /* @__PURE__ */ M("div", { className: "relative min-w-0 w-full flex-1", children: [
515
515
  /* @__PURE__ */ M(
516
516
  "div",
@@ -525,7 +525,7 @@ const Ue = ({
525
525
  ) : "flex-nowrap items-center overflow-x-auto overflow-y-hidden scrollbar-hide"
526
526
  ),
527
527
  children: [
528
- /* @__PURE__ */ s(ee.Provider, { value: null, children: !v && ((P = (D = a == null ? void 0 : a.selectedItems) == null ? void 0 : D.items) == null ? void 0 : P.map((t) => /* @__PURE__ */ M(
528
+ /* @__PURE__ */ s(ee.Provider, { value: null, children: !x && ((P = (D = a == null ? void 0 : a.selectedItems) == null ? void 0 : D.items) == null ? void 0 : P.map((t) => /* @__PURE__ */ M(
529
529
  "span",
530
530
  {
531
531
  "data-multiselect-chip": !0,
@@ -575,7 +575,7 @@ const Ue = ({
575
575
  className: k(
576
576
  "relative flex flex-1 flex-row items-center",
577
577
  o ? "min-w-[20%]" : "min-w-0",
578
- !v && "ml-0.5",
578
+ !x && "ml-0.5",
579
579
  y && "min-w-[30%]"
580
580
  ),
581
581
  children: [
@@ -583,7 +583,7 @@ const Ue = ({
583
583
  Fe,
584
584
  {
585
585
  ref: T,
586
- placeholder: v ? m : void 0,
586
+ placeholder: x ? m : void 0,
587
587
  onKeyDown: F,
588
588
  onMouseDown: _,
589
589
  onFocus: V,
@@ -692,7 +692,7 @@ const Ue = ({
692
692
  },
693
693
  children: ({ isDisabled: u, isFocusWithin: h }) => /* @__PURE__ */ M(me, { children: [
694
694
  l && /* @__PURE__ */ s(l, { className: "pointer-events-none size-5 shrink-0 text-fg-quaternary" }),
695
- /* @__PURE__ */ s(ve, { contain: !1, autoFocus: !1, restoreFocus: !1, children: /* @__PURE__ */ s("div", { className: "min-w-0 flex-1", children: /* @__PURE__ */ s(
695
+ /* @__PURE__ */ s(xe, { contain: !1, autoFocus: !1, restoreFocus: !1, children: /* @__PURE__ */ s("div", { className: "min-w-0 flex-1", children: /* @__PURE__ */ s(
696
696
  Je,
697
697
  {
698
698
  inputRef: g,
@@ -0,0 +1,3 @@
1
+ export { Slider, type SliderProps } from './slider';
2
+ export { RangeSlider, type RangeSliderProps, type RangeSliderZoneLabel } from './range-slider';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/primitives/slider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,24 @@
1
+ export interface RangeSliderZoneLabel {
2
+ title: string;
3
+ value: string;
4
+ }
5
+ export interface RangeSliderProps {
6
+ minValue: number;
7
+ maxValue: number;
8
+ step?: number;
9
+ value: [number, number];
10
+ onChange: (value: [number, number]) => void;
11
+ isDisabled?: boolean;
12
+ marks?: number[];
13
+ zoneLabels?: {
14
+ left: RangeSliderZoneLabel;
15
+ middle: RangeSliderZoneLabel;
16
+ right: RangeSliderZoneLabel;
17
+ };
18
+ leftSegmentClassName?: string;
19
+ middleSegmentClassName?: string;
20
+ rightSegmentClassName?: string;
21
+ trackClassName?: string;
22
+ }
23
+ export declare function RangeSlider({ minValue, maxValue, step, value, onChange, isDisabled, marks, zoneLabels, leftSegmentClassName, middleSegmentClassName, rightSegmentClassName, trackClassName, }: RangeSliderProps): import("react/jsx-runtime").JSX.Element;
24
+ //# sourceMappingURL=range-slider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"range-slider.d.ts","sourceRoot":"","sources":["../../../src/primitives/slider/range-slider.tsx"],"names":[],"mappings":"AAOA,MAAM,WAAW,oBAAoB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;IAC5C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE;QACT,IAAI,EAAE,oBAAoB,CAAC;QAC3B,MAAM,EAAE,oBAAoB,CAAC;QAC7B,KAAK,EAAE,oBAAoB,CAAC;KAC/B,CAAC;IACF,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,WAAW,CAAC,EACxB,QAAQ,EACR,QAAQ,EACR,IAAQ,EACR,KAAK,EACL,QAAQ,EACR,UAAkB,EAClB,KAAK,EACL,UAAU,EACV,oBAA6C,EAC7C,sBAAuC,EACvC,qBAAgD,EAChD,cAA+B,GAClC,EAAE,gBAAgB,2CAkHlB"}
@@ -0,0 +1,115 @@
1
+ import { jsxs as a, jsx as e, Fragment as S } from "react/jsx-runtime";
2
+ import { Slider as $, SliderTrack as j, SliderThumb as V } from "react-aria-components";
3
+ import { cx as s } from "../../utils/cn.js";
4
+ function M({
5
+ minValue: m,
6
+ maxValue: u,
7
+ step: f = 1,
8
+ value: d,
9
+ onChange: h,
10
+ isDisabled: o = !1,
11
+ marks: r,
12
+ zoneLabels: t,
13
+ leftSegmentClassName: x = "bg-utility-error-300",
14
+ middleSegmentClassName: p = "bg-[#DEE1E8]",
15
+ rightSegmentClassName: g = "bg-utility-success-300",
16
+ trackClassName: N = "bg-[#DEE1E8]"
17
+ }) {
18
+ const [y, b] = d, w = y < b;
19
+ return /* @__PURE__ */ a("div", { className: "flex flex-col gap-4", children: [
20
+ t ? /* @__PURE__ */ a("div", { className: "grid grid-cols-3 gap-2 text-center", children: [
21
+ /* @__PURE__ */ a("div", { className: "flex flex-col gap-0.5 items-start", children: [
22
+ /* @__PURE__ */ e("span", { className: "text-xs text-tertiary font-medium", children: t.left.title }),
23
+ /* @__PURE__ */ e("span", { className: "text-md font-bold text-primary", children: t.left.value })
24
+ ] }),
25
+ /* @__PURE__ */ a("div", { className: "flex flex-col gap-0.5 items-center", children: [
26
+ /* @__PURE__ */ e("span", { className: "text-xs text-tertiary font-medium", children: t.middle.title }),
27
+ /* @__PURE__ */ e("span", { className: "text-md font-bold text-primary", children: t.middle.value })
28
+ ] }),
29
+ /* @__PURE__ */ a("div", { className: "flex flex-col gap-0.5 items-end", children: [
30
+ /* @__PURE__ */ e("span", { className: "text-xs text-tertiary font-medium", children: t.right.title }),
31
+ /* @__PURE__ */ e("span", { className: "text-md font-bold text-primary", children: t.right.value })
32
+ ] })
33
+ ] }) : null,
34
+ /* @__PURE__ */ e(
35
+ $,
36
+ {
37
+ minValue: m,
38
+ maxValue: u,
39
+ step: f,
40
+ value: d,
41
+ onChange: (l) => h(l),
42
+ isDisabled: o,
43
+ className: "w-full",
44
+ children: /* @__PURE__ */ e(j, { className: "relative h-8 w-full", children: ({ state: { getThumbPercent: l } }) => {
45
+ const i = l(0), n = l(1);
46
+ return /* @__PURE__ */ a(S, { children: [
47
+ /* @__PURE__ */ e(
48
+ "span",
49
+ {
50
+ className: s(
51
+ "absolute top-1/2 h-2 w-full -translate-y-1/2 rounded-full",
52
+ N
53
+ )
54
+ }
55
+ ),
56
+ i > 0 ? /* @__PURE__ */ e(
57
+ "span",
58
+ {
59
+ className: s(
60
+ "absolute top-1/2 h-2 -translate-y-1/2 rounded-l-full",
61
+ x
62
+ ),
63
+ style: {
64
+ left: 0,
65
+ width: `${i * 100}%`
66
+ }
67
+ }
68
+ ) : null,
69
+ w ? /* @__PURE__ */ e(
70
+ "span",
71
+ {
72
+ className: s("absolute top-1/2 h-2 -translate-y-1/2", p),
73
+ style: {
74
+ left: `${i * 100}%`,
75
+ width: `${(n - i) * 100}%`
76
+ }
77
+ }
78
+ ) : null,
79
+ n < 1 ? /* @__PURE__ */ e(
80
+ "span",
81
+ {
82
+ className: s(
83
+ "absolute top-1/2 h-2 -translate-y-1/2 rounded-r-full",
84
+ g
85
+ ),
86
+ style: {
87
+ left: `${n * 100}%`,
88
+ width: `${(1 - n) * 100}%`
89
+ }
90
+ }
91
+ ) : null,
92
+ [0, 1].map((c) => /* @__PURE__ */ e(
93
+ V,
94
+ {
95
+ index: c,
96
+ className: ({ isFocusVisible: v, isDragging: E }) => s(
97
+ "top-1/2 box-border size-5 cursor-grab rounded-full bg-white shadow-md ring-1 ring-secondary",
98
+ c === 0 ? "z-[2]" : "z-[1]",
99
+ v && "outline-2 outline-offset-2 outline-focus-ring",
100
+ E && "cursor-grabbing",
101
+ o && "cursor-not-allowed opacity-60"
102
+ )
103
+ },
104
+ c
105
+ ))
106
+ ] });
107
+ } })
108
+ }
109
+ ),
110
+ r != null && r.length ? /* @__PURE__ */ e("div", { className: "flex justify-between px-0.5", children: r.map((l) => /* @__PURE__ */ e("span", { className: "w-5 text-center text-xs font-medium text-tertiary", children: l }, l)) }) : null
111
+ ] });
112
+ }
113
+ export {
114
+ M as RangeSlider
115
+ };
@@ -0,0 +1,13 @@
1
+ import { SliderProps as AriaSliderProps } from 'react-aria-components';
2
+ declare const styles: {
3
+ default: string;
4
+ bottom: string;
5
+ "top-floating": string;
6
+ };
7
+ export interface SliderProps extends AriaSliderProps {
8
+ labelPosition?: keyof typeof styles;
9
+ labelFormatter?: (value: number) => string;
10
+ }
11
+ export declare const Slider: ({ labelPosition, minValue, maxValue, labelFormatter, formatOptions, ...rest }: SliderProps) => import("react/jsx-runtime").JSX.Element;
12
+ export {};
13
+ //# sourceMappingURL=slider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider.d.ts","sourceRoot":"","sources":["../../../src/primitives/slider/slider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAU5E,QAAA,MAAM,MAAM;;;;CAKV,CAAC;AAEH,MAAM,WAAW,WAAY,SAAQ,eAAe;IAChD,aAAa,CAAC,EAAE,MAAM,OAAO,MAAM,CAAC;IACpC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CAC9C;AAED,eAAO,MAAM,MAAM,GAAI,+EAOpB,WAAW,4CAqDb,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { jsxs as s, jsx as t, Fragment as y } from "react/jsx-runtime";
2
+ import { Slider as x, Label as w, SliderTrack as S, SliderThumb as N, SliderOutput as O } from "react-aria-components";
3
+ import { cx as n, sortCx as F } from "../../utils/cn.js";
4
+ const $ = F({
5
+ default: "hidden",
6
+ bottom: "absolute top-2 left-1/2 -translate-x-1/2 translate-y-full text-md font-medium text-primary",
7
+ "top-floating": "absolute -top-2 left-1/2 -translate-x-1/2 -translate-y-full rounded-lg bg-primary px-2 py-1.5 text-xs font-semibold text-secondary shadow-lg ring-1 ring-secondary_alt"
8
+ }), D = ({
9
+ labelPosition: i = "default",
10
+ minValue: d = 0,
11
+ maxValue: u = 100,
12
+ labelFormatter: a,
13
+ formatOptions: f,
14
+ ...m
15
+ }) => /* @__PURE__ */ s(x, { ...m, minValue: d, maxValue: u, formatOptions: f ?? {
16
+ style: "percent",
17
+ maximumFractionDigits: 0
18
+ }, children: [
19
+ /* @__PURE__ */ t(w, {}),
20
+ /* @__PURE__ */ t(S, { className: "relative h-6 w-full", children: ({ state: { values: e, getThumbValue: p, getThumbPercent: l, getFormattedValue: c } }) => {
21
+ const o = e.length === 1 ? 0 : l(0), g = e.length === 1 ? l(0) : l(1) - o;
22
+ return /* @__PURE__ */ s(y, { children: [
23
+ /* @__PURE__ */ t("span", { className: "absolute top-1/2 h-2 w-full -translate-y-1/2 rounded-full bg-tertiary" }),
24
+ /* @__PURE__ */ t(
25
+ "span",
26
+ {
27
+ className: "absolute top-1/2 h-2 w-full -translate-y-1/2 rounded-full bg-brand-solid",
28
+ style: {
29
+ left: `${o * 100}%`,
30
+ width: `${g * 100}%`
31
+ }
32
+ }
33
+ ),
34
+ e.map((_, r) => /* @__PURE__ */ t(
35
+ N,
36
+ {
37
+ index: r,
38
+ className: ({ isFocusVisible: b, isDragging: h }) => n(
39
+ "top-1/2 box-border size-6 cursor-grab rounded-full bg-slider-handle-bg shadow-md ring-2 ring-slider-handle-border ring-inset",
40
+ b && "outline-2 outline-offset-2 outline-focus-ring",
41
+ h && "cursor-grabbing"
42
+ ),
43
+ children: /* @__PURE__ */ t(O, { className: n("whitespace-nowrap", $[i]), children: a ? a(p(r)) : (
44
+ // The default format is a percent, so pass the thumb's 0–1 position in the range.
45
+ c(l(r))
46
+ ) })
47
+ },
48
+ r
49
+ ))
50
+ ] });
51
+ } })
52
+ ] });
53
+ export {
54
+ D as Slider
55
+ };