@acronis-platform/ui-react 0.57.1 → 0.60.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 (170) hide show
  1. package/dist/components/ui/area-chart/area-chart.js +177 -0
  2. package/dist/components/ui/area-chart/area-chart.js.map +1 -0
  3. package/dist/components/ui/bar-chart/bar-chart.js +184 -78
  4. package/dist/components/ui/bar-chart/bar-chart.js.map +1 -1
  5. package/dist/components/ui/button-icon-input/button-icon-input.js +36 -0
  6. package/dist/components/ui/button-icon-input/button-icon-input.js.map +1 -0
  7. package/dist/components/ui/button-menu/button-menu.js +1 -1
  8. package/dist/components/ui/button-menu/button-menu.js.map +1 -1
  9. package/dist/components/ui/calendar/calendar.js +17 -15
  10. package/dist/components/ui/calendar/calendar.js.map +1 -1
  11. package/dist/components/ui/card-filter/card-filter.js +40 -27
  12. package/dist/components/ui/card-filter/card-filter.js.map +1 -1
  13. package/dist/components/ui/carousel-dialog/carousel-dialog.js +87 -0
  14. package/dist/components/ui/carousel-dialog/carousel-dialog.js.map +1 -0
  15. package/dist/components/ui/category-bar/category-bar.js +126 -0
  16. package/dist/components/ui/category-bar/category-bar.js.map +1 -0
  17. package/dist/components/ui/chart/chart-format.js +40 -0
  18. package/dist/components/ui/chart/chart-format.js.map +1 -0
  19. package/dist/components/ui/chart/chart.js.map +1 -1
  20. package/dist/components/ui/chart-state/chart-state.js +42 -0
  21. package/dist/components/ui/chart-state/chart-state.js.map +1 -0
  22. package/dist/components/ui/chip/chip.js +13 -13
  23. package/dist/components/ui/chip/chip.js.map +1 -1
  24. package/dist/components/ui/composed-chart/composed-chart.js +135 -0
  25. package/dist/components/ui/composed-chart/composed-chart.js.map +1 -0
  26. package/dist/components/ui/confidence-cone/confidence-cone.js +223 -0
  27. package/dist/components/ui/confidence-cone/confidence-cone.js.map +1 -0
  28. package/dist/components/ui/date-range-picker/date-range-picker.js +21 -21
  29. package/dist/components/ui/date-range-picker/date-range-picker.js.map +1 -1
  30. package/dist/components/ui/dialog/dialog.js +248 -76
  31. package/dist/components/ui/dialog/dialog.js.map +1 -1
  32. package/dist/components/ui/dialog-footer-carousel/dialog-footer-carousel.js +57 -0
  33. package/dist/components/ui/dialog-footer-carousel/dialog-footer-carousel.js.map +1 -0
  34. package/dist/components/ui/dialog-footer-default/dialog-footer-default.js +26 -0
  35. package/dist/components/ui/dialog-footer-default/dialog-footer-default.js.map +1 -0
  36. package/dist/components/ui/dialog-welcome/dialog-welcome.js +272 -0
  37. package/dist/components/ui/dialog-welcome/dialog-welcome.js.map +1 -0
  38. package/dist/components/ui/dropdown-menu/dropdown-menu.js +21 -21
  39. package/dist/components/ui/dropdown-menu/dropdown-menu.js.map +1 -1
  40. package/dist/components/ui/filter-search/filter-search.js +91 -90
  41. package/dist/components/ui/filter-search/filter-search.js.map +1 -1
  42. package/dist/components/ui/funnel-chart/funnel-chart.js +87 -0
  43. package/dist/components/ui/funnel-chart/funnel-chart.js.map +1 -0
  44. package/dist/components/ui/histogram/histogram.js +136 -0
  45. package/dist/components/ui/histogram/histogram.js.map +1 -0
  46. package/dist/components/ui/input/input.js.map +1 -1
  47. package/dist/components/ui/input-otp/input-otp.js +104 -0
  48. package/dist/components/ui/input-otp/input-otp.js.map +1 -0
  49. package/dist/components/ui/input-password/input-password.js +120 -0
  50. package/dist/components/ui/input-password/input-password.js.map +1 -0
  51. package/dist/components/ui/input-text/input-text.js +9 -9
  52. package/dist/components/ui/input-text/input-text.js.map +1 -1
  53. package/dist/components/ui/line-chart/line-chart.js +234 -0
  54. package/dist/components/ui/line-chart/line-chart.js.map +1 -0
  55. package/dist/components/ui/link/link.js +5 -5
  56. package/dist/components/ui/link/link.js.map +1 -1
  57. package/dist/components/ui/loading/loading.js +79 -0
  58. package/dist/components/ui/loading/loading.js.map +1 -0
  59. package/dist/components/ui/meter/meter.js +93 -0
  60. package/dist/components/ui/meter/meter.js.map +1 -0
  61. package/dist/components/ui/metric/metric.js +185 -0
  62. package/dist/components/ui/metric/metric.js.map +1 -0
  63. package/dist/components/ui/pie-chart/pie-chart.js +113 -0
  64. package/dist/components/ui/pie-chart/pie-chart.js.map +1 -0
  65. package/dist/components/ui/popover/popover.js +57 -27
  66. package/dist/components/ui/popover/popover.js.map +1 -1
  67. package/dist/components/ui/radar-chart/radar-chart.js +74 -0
  68. package/dist/components/ui/radar-chart/radar-chart.js.map +1 -0
  69. package/dist/components/ui/radial-bar-chart/radial-bar-chart.js +69 -0
  70. package/dist/components/ui/radial-bar-chart/radial-bar-chart.js.map +1 -0
  71. package/dist/components/ui/sankey-chart/sankey-chart.js +192 -0
  72. package/dist/components/ui/sankey-chart/sankey-chart.js.map +1 -0
  73. package/dist/components/ui/scatter-chart/scatter-chart.js +130 -0
  74. package/dist/components/ui/scatter-chart/scatter-chart.js.map +1 -0
  75. package/dist/components/ui/search/search.js +16 -16
  76. package/dist/components/ui/search/search.js.map +1 -1
  77. package/dist/components/ui/sheet/sheet-details.js +16 -16
  78. package/dist/components/ui/sheet/sheet-details.js.map +1 -1
  79. package/dist/components/ui/spinner/spinner.js.map +1 -1
  80. package/dist/components/ui/timeline/timeline.js +175 -0
  81. package/dist/components/ui/timeline/timeline.js.map +1 -0
  82. package/dist/components/ui/toolbar/toolbar.js +82 -92
  83. package/dist/components/ui/toolbar/toolbar.js.map +1 -1
  84. package/dist/components/ui/treemap/treemap.js +83 -0
  85. package/dist/components/ui/treemap/treemap.js.map +1 -0
  86. package/dist/components/ui/trend-indicator/trend-indicator.js +97 -0
  87. package/dist/components/ui/trend-indicator/trend-indicator.js.map +1 -0
  88. package/dist/index.js +461 -400
  89. package/dist/index.js.map +1 -1
  90. package/dist/lib/breakpoints.js +9 -6
  91. package/dist/lib/breakpoints.js.map +1 -1
  92. package/dist/node_modules/.pnpm/embla-carousel-react@8.6.0_react@19.2.6/node_modules/embla-carousel-react/esm/embla-carousel-react.esm.js +25 -0
  93. package/dist/node_modules/.pnpm/embla-carousel-react@8.6.0_react@19.2.6/node_modules/embla-carousel-react/esm/embla-carousel-react.esm.js.map +1 -0
  94. package/dist/node_modules/.pnpm/embla-carousel-reactive-utils@8.6.0_embla-carousel@8.6.0/node_modules/embla-carousel-reactive-utils/esm/embla-carousel-reactive-utils.esm.js +36 -0
  95. package/dist/node_modules/.pnpm/embla-carousel-reactive-utils@8.6.0_embla-carousel@8.6.0/node_modules/embla-carousel-reactive-utils/esm/embla-carousel-reactive-utils.esm.js.map +1 -0
  96. package/dist/node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/embla-carousel.esm.js +1205 -0
  97. package/dist/node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/embla-carousel.esm.js.map +1 -0
  98. package/dist/react.js +461 -400
  99. package/dist/react.js.map +1 -1
  100. package/dist/src/components/ui/area-chart/area-chart.d.ts +34 -0
  101. package/dist/src/components/ui/area-chart/index.d.ts +1 -0
  102. package/dist/src/components/ui/avatar/avatar.d.ts +1 -1
  103. package/dist/src/components/ui/bar-chart/bar-chart.d.ts +30 -5
  104. package/dist/src/components/ui/bar-chart/index.d.ts +1 -1
  105. package/dist/src/components/ui/button-icon-input/button-icon-input.d.ts +21 -0
  106. package/dist/src/components/ui/button-icon-input/index.d.ts +1 -0
  107. package/dist/src/components/ui/card-filter/card-filter.d.ts +5 -0
  108. package/dist/src/components/ui/carousel-dialog/carousel-dialog.d.ts +28 -0
  109. package/dist/src/components/ui/carousel-dialog/index.d.ts +1 -0
  110. package/dist/src/components/ui/category-bar/category-bar.d.ts +51 -0
  111. package/dist/src/components/ui/category-bar/index.d.ts +1 -0
  112. package/dist/src/components/ui/chart/__tests__/chart-format.test.d.ts +1 -0
  113. package/dist/src/components/ui/chart/chart-format.d.ts +111 -0
  114. package/dist/src/components/ui/chart/chart.d.ts +2 -0
  115. package/dist/src/components/ui/chart/index.d.ts +3 -1
  116. package/dist/src/components/ui/chart-state/chart-state.d.ts +11 -0
  117. package/dist/src/components/ui/chart-state/index.d.ts +1 -0
  118. package/dist/src/components/ui/composed-chart/composed-chart.d.ts +33 -0
  119. package/dist/src/components/ui/composed-chart/index.d.ts +1 -0
  120. package/dist/src/components/ui/confidence-cone/confidence-cone.d.ts +62 -0
  121. package/dist/src/components/ui/confidence-cone/index.d.ts +1 -0
  122. package/dist/src/components/ui/dialog/dialog.d.ts +105 -9
  123. package/dist/src/components/ui/dialog/dialog.docs.d.ts +82 -5
  124. package/dist/src/components/ui/dialog/index.d.ts +1 -1
  125. package/dist/src/components/ui/dialog-footer-carousel/dialog-footer-carousel.d.ts +9 -0
  126. package/dist/src/components/ui/dialog-footer-carousel/index.d.ts +1 -0
  127. package/dist/src/components/ui/dialog-footer-default/dialog-footer-default.d.ts +11 -0
  128. package/dist/src/components/ui/dialog-footer-default/index.d.ts +1 -0
  129. package/dist/src/components/ui/dialog-welcome/dialog-welcome.d.ts +54 -0
  130. package/dist/src/components/ui/dialog-welcome/dialog-welcome.docs.d.ts +55 -0
  131. package/dist/src/components/ui/dialog-welcome/index.d.ts +1 -0
  132. package/dist/src/components/ui/filter-search/filter-search.d.ts +1 -1
  133. package/dist/src/components/ui/funnel-chart/funnel-chart.d.ts +39 -0
  134. package/dist/src/components/ui/funnel-chart/index.d.ts +1 -0
  135. package/dist/src/components/ui/histogram/histogram.d.ts +40 -0
  136. package/dist/src/components/ui/histogram/index.d.ts +1 -0
  137. package/dist/src/components/ui/input-otp/index.d.ts +1 -0
  138. package/dist/src/components/ui/input-otp/input-otp.d.ts +23 -0
  139. package/dist/src/components/ui/input-password/index.d.ts +1 -0
  140. package/dist/src/components/ui/input-password/input-password.d.ts +21 -0
  141. package/dist/src/components/ui/line-chart/index.d.ts +1 -0
  142. package/dist/src/components/ui/line-chart/line-chart.d.ts +68 -0
  143. package/dist/src/components/ui/loading/index.d.ts +1 -0
  144. package/dist/src/components/ui/loading/loading.d.ts +13 -0
  145. package/dist/src/components/ui/meter/index.d.ts +1 -0
  146. package/dist/src/components/ui/meter/meter.d.ts +25 -0
  147. package/dist/src/components/ui/metric/index.d.ts +1 -0
  148. package/dist/src/components/ui/metric/metric.d.ts +37 -0
  149. package/dist/src/components/ui/pie-chart/index.d.ts +1 -0
  150. package/dist/src/components/ui/pie-chart/pie-chart.d.ts +54 -0
  151. package/dist/src/components/ui/popover/index.d.ts +1 -1
  152. package/dist/src/components/ui/popover/popover.d.ts +13 -1
  153. package/dist/src/components/ui/radar-chart/index.d.ts +1 -0
  154. package/dist/src/components/ui/radar-chart/radar-chart.d.ts +40 -0
  155. package/dist/src/components/ui/radial-bar-chart/index.d.ts +1 -0
  156. package/dist/src/components/ui/radial-bar-chart/radial-bar-chart.d.ts +45 -0
  157. package/dist/src/components/ui/sankey-chart/index.d.ts +2 -0
  158. package/dist/src/components/ui/sankey-chart/sankey-chart.d.ts +69 -0
  159. package/dist/src/components/ui/scatter-chart/index.d.ts +1 -0
  160. package/dist/src/components/ui/scatter-chart/scatter-chart.d.ts +35 -0
  161. package/dist/src/components/ui/stack/stack.d.ts +1 -1
  162. package/dist/src/components/ui/timeline/index.d.ts +1 -0
  163. package/dist/src/components/ui/timeline/timeline.d.ts +41 -0
  164. package/dist/src/components/ui/treemap/index.d.ts +1 -0
  165. package/dist/src/components/ui/treemap/treemap.d.ts +44 -0
  166. package/dist/src/components/ui/trend-indicator/index.d.ts +1 -0
  167. package/dist/src/components/ui/trend-indicator/trend-indicator.d.ts +32 -0
  168. package/dist/src/index.d.ts +27 -2
  169. package/dist/ui-react.css +1 -1
  170. package/package.json +5 -4
@@ -1,79 +1,80 @@
1
- import { jsx as o, jsxs as c } from "react/jsx-runtime";
1
+ import { jsx as n, jsxs as d } from "react/jsx-runtime";
2
2
  import * as a from "react";
3
- import { ChevronDownIcon as D } from "@acronis-platform/icons-react/stroke-mono";
4
- import { cn as h } from "../../../lib/utils.js";
5
- import { deepEqual as A } from "../../../lib/deep-equal.js";
6
- import { Chip as P } from "../chip/chip.js";
7
- import { Button as d } from "../button/button.js";
8
- import { Popover as $, PopoverTrigger as E, PopoverContent as q } from "../popover/popover.js";
9
- const z = a.forwardRef(
10
- ({ className: t, ...e }, n) => /* @__PURE__ */ o(
3
+ import { ChevronDownIcon as A } from "@acronis-platform/icons-react/stroke-mono";
4
+ import { cn as u } from "../../../lib/utils.js";
5
+ import { deepEqual as P } from "../../../lib/deep-equal.js";
6
+ import { Chip as $ } from "../chip/chip.js";
7
+ import { Button as p } from "../button/button.js";
8
+ import { Popover as E, PopoverTrigger as q, PopoverContent as z } from "../popover/popover.js";
9
+ const B = a.forwardRef(
10
+ ({ className: t, ...e }, r) => /* @__PURE__ */ n(
11
11
  "div",
12
12
  {
13
- ref: n,
14
- className: h("flex items-center gap-4", t),
13
+ ref: r,
14
+ className: u("flex items-center gap-4", t),
15
15
  ...e
16
16
  }
17
17
  )
18
18
  );
19
- z.displayName = "FilterSearch";
20
- const B = a.forwardRef(({ className: t, ...e }, n) => /* @__PURE__ */ o(
19
+ B.displayName = "FilterSearch";
20
+ const I = a.forwardRef(({ className: t, ...e }, r) => /* @__PURE__ */ n(
21
21
  "div",
22
22
  {
23
- ref: n,
24
- className: h("flex h-8 min-w-px flex-1 items-center justify-end gap-4", t),
23
+ ref: r,
24
+ className: u("flex h-8 min-w-px flex-1 items-center justify-end gap-4", t),
25
25
  ...e
26
26
  }
27
27
  ));
28
- B.displayName = "FilterSearchActions";
29
- const S = a.createContext(null);
30
- function W() {
31
- const t = a.useContext(S);
28
+ I.displayName = "FilterSearchActions";
29
+ const C = a.createContext(null);
30
+ function X() {
31
+ const t = a.useContext(C);
32
32
  if (t === null)
33
33
  throw new Error(
34
34
  "useFilterSearchFilters must be used within a <FilterSearchFilters> popover."
35
35
  );
36
36
  return t;
37
37
  }
38
- const I = a.forwardRef(({ value: t, onValueChange: e, onApply: n, label: l = "Filters", children: u, className: b }, p) => {
39
- const [x, r] = a.useState(!1), [i, m] = a.useState(t), C = (s) => {
40
- m(t), r(s);
41
- }, v = a.useCallback((s, F) => {
42
- m((f) => {
43
- if (F === void 0) {
44
- if (!(s in f)) return f;
45
- const g = { ...f };
46
- return delete g[s], g;
38
+ const J = a.forwardRef(({ value: t, onValueChange: e, onApply: r, label: s = "Filters", children: b, className: x, ...m }, v) => {
39
+ const [o, l] = a.useState(!1), [c, f] = a.useState(t), N = (i) => {
40
+ f(t), l(i);
41
+ }, F = a.useCallback((i, g) => {
42
+ f((h) => {
43
+ if (g === void 0) {
44
+ if (!(i in h)) return h;
45
+ const S = { ...h };
46
+ return delete S[i], S;
47
47
  }
48
- return { ...f, [s]: F };
48
+ return { ...h, [i]: g };
49
49
  });
50
- }, []), N = a.useMemo(
51
- () => ({ filters: i, setFilter: v }),
52
- [i, v]
53
- ), y = () => m({}), w = () => {
54
- m(t), r(!1);
55
- }, R = () => {
56
- e(i), n == null || n(i), r(!1);
57
- }, j = Object.keys(i).length === 0, O = A(i, t);
58
- return /* @__PURE__ */ c($, { open: x, onOpenChange: C, children: [
59
- /* @__PURE__ */ c(
60
- E,
50
+ }, []), y = a.useMemo(
51
+ () => ({ filters: c, setFilter: F }),
52
+ [c, F]
53
+ ), w = () => f({}), R = () => {
54
+ f(t), l(!1);
55
+ }, j = () => {
56
+ e(c), r == null || r(c), l(!1);
57
+ }, O = Object.keys(c).length === 0, D = P(c, t);
58
+ return /* @__PURE__ */ d(E, { open: o, onOpenChange: N, children: [
59
+ /* @__PURE__ */ d(
60
+ q,
61
61
  {
62
- ref: p,
63
- render: /* @__PURE__ */ o(
64
- d,
62
+ ref: v,
63
+ render: /* @__PURE__ */ n(
64
+ p,
65
65
  {
66
66
  variant: "secondary",
67
- className: h(
67
+ className: u(
68
68
  "group data-[popup-open]:border-[var(--ui-button-secondary-container-border-color-active)] data-[popup-open]:bg-[var(--ui-button-secondary-container-color-active)] data-[popup-open]:text-[var(--ui-button-secondary-label-color-active)]",
69
- b
70
- )
69
+ x
70
+ ),
71
+ ...m
71
72
  }
72
73
  ),
73
74
  children: [
74
- l,
75
- /* @__PURE__ */ o(
76
- D,
75
+ s,
76
+ /* @__PURE__ */ n(
77
+ A,
77
78
  {
78
79
  size: 16,
79
80
  className: "transition-transform group-data-[popup-open]:rotate-180"
@@ -82,28 +83,28 @@ const I = a.forwardRef(({ value: t, onValueChange: e, onApply: n, label: l = "Fi
82
83
  ]
83
84
  }
84
85
  ),
85
- /* @__PURE__ */ o(q, { align: "start", className: "w-96 p-0", children: /* @__PURE__ */ c(
86
+ /* @__PURE__ */ n(z, { align: "start", className: "w-96 p-0", children: /* @__PURE__ */ d(
86
87
  "form",
87
88
  {
88
- onSubmit: (s) => {
89
- s.preventDefault(), R();
89
+ onSubmit: (i) => {
90
+ i.preventDefault(), j();
90
91
  },
91
92
  children: [
92
- /* @__PURE__ */ o("div", { className: "flex max-h-80 flex-col gap-4 overflow-y-auto p-4", children: /* @__PURE__ */ o(S.Provider, { value: N, children: u }) }),
93
- /* @__PURE__ */ c("div", { className: "flex items-center gap-2 border-t border-border p-4", children: [
94
- /* @__PURE__ */ o(
95
- d,
93
+ /* @__PURE__ */ n("div", { className: "flex max-h-80 flex-col gap-4 overflow-y-auto p-4", children: /* @__PURE__ */ n(C.Provider, { value: y, children: b }) }),
94
+ /* @__PURE__ */ d("div", { className: "flex items-center gap-2 border-t border-border p-4", children: [
95
+ /* @__PURE__ */ n(
96
+ p,
96
97
  {
97
98
  type: "button",
98
99
  variant: "ghost",
99
- disabled: j,
100
- onClick: y,
100
+ disabled: O,
101
+ onClick: w,
101
102
  children: "Reset filters"
102
103
  }
103
104
  ),
104
- /* @__PURE__ */ c("div", { className: "ms-auto flex items-center gap-2", children: [
105
- /* @__PURE__ */ o(d, { type: "button", variant: "secondary", onClick: w, children: "Cancel" }),
106
- /* @__PURE__ */ o(d, { type: "submit", variant: "default", disabled: O, children: "Apply" })
105
+ /* @__PURE__ */ d("div", { className: "ms-auto flex items-center gap-2", children: [
106
+ /* @__PURE__ */ n(p, { type: "button", variant: "secondary", onClick: R, children: "Cancel" }),
107
+ /* @__PURE__ */ n(p, { type: "submit", variant: "default", disabled: D, children: "Apply" })
107
108
  ] })
108
109
  ] })
109
110
  ]
@@ -111,41 +112,41 @@ const I = a.forwardRef(({ value: t, onValueChange: e, onApply: n, label: l = "Fi
111
112
  ) })
112
113
  ] });
113
114
  });
114
- I.displayName = "FilterSearchFilters";
115
- function J(t, e) {
116
- const n = Array.isArray(e) ? e.map((l) => String(l)).join(", ") : typeof e == "object" && e !== null ? JSON.stringify(e) : String(e);
117
- return `${t}: ${n}`;
115
+ J.displayName = "FilterSearchFilters";
116
+ function L(t, e) {
117
+ const r = Array.isArray(e) ? e.map((s) => String(s)).join(", ") : typeof e == "object" && e !== null ? JSON.stringify(e) : String(e);
118
+ return `${t}: ${r}`;
118
119
  }
119
- const L = a.forwardRef(({ className: t, filters: e, onValueChange: n, getFilterChipLabel: l, ...u }, b) => {
120
- const p = Object.keys(e);
121
- if (p.length === 0) return null;
122
- const x = (r) => {
123
- const i = { ...e };
124
- delete i[r], n(i);
120
+ const M = a.forwardRef(({ className: t, filters: e, onValueChange: r, getFilterChipLabel: s, ...b }, x) => {
121
+ const m = Object.keys(e);
122
+ if (m.length === 0) return null;
123
+ const v = (o) => {
124
+ const l = { ...e };
125
+ delete l[o], r(l);
125
126
  };
126
- return /* @__PURE__ */ c(
127
+ return /* @__PURE__ */ d(
127
128
  "div",
128
129
  {
129
- ref: b,
130
- className: h("flex flex-wrap items-center gap-3", t),
131
- ...u,
130
+ ref: x,
131
+ className: u("flex flex-wrap items-center gap-3", t),
132
+ ...b,
132
133
  children: [
133
- p.map((r) => /* @__PURE__ */ o(
134
- P,
134
+ m.map((o) => /* @__PURE__ */ n(
135
+ $,
135
136
  {
136
137
  variant: "removable",
137
- onRemove: () => x(r),
138
- removeLabel: `Remove ${r} filter`,
139
- children: l ? l(r, e[r]) : J(r, e[r])
138
+ onRemove: () => v(o),
139
+ removeLabel: `Remove ${o} filter`,
140
+ children: s ? s(o, e[o]) : L(o, e[o])
140
141
  },
141
- r
142
+ o
142
143
  )),
143
- /* @__PURE__ */ o(
144
- d,
144
+ /* @__PURE__ */ n(
145
+ p,
145
146
  {
146
147
  type: "button",
147
148
  variant: "ghost",
148
- onClick: () => n({}),
149
+ onClick: () => r({}),
149
150
  children: "Reset filters"
150
151
  }
151
152
  )
@@ -153,12 +154,12 @@ const L = a.forwardRef(({ className: t, filters: e, onValueChange: n, getFilterC
153
154
  }
154
155
  );
155
156
  });
156
- L.displayName = "FilterSearchAppliedFilters";
157
+ M.displayName = "FilterSearchAppliedFilters";
157
158
  export {
158
- z as FilterSearch,
159
- B as FilterSearchActions,
160
- L as FilterSearchAppliedFilters,
161
- I as FilterSearchFilters,
162
- W as useFilterSearchFilters
159
+ B as FilterSearch,
160
+ I as FilterSearchActions,
161
+ M as FilterSearchAppliedFilters,
162
+ J as FilterSearchFilters,
163
+ X as useFilterSearchFilters
163
164
  };
164
165
  //# sourceMappingURL=filter-search.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"filter-search.js","sources":["../../../../src/components/ui/filter-search/filter-search.tsx"],"sourcesContent":["import * as React from 'react';\nimport { ChevronDownIcon } from '@acronis-platform/icons-react/stroke-mono';\n\nimport { cn } from '@/lib/utils';\nimport { deepEqual } from '@/lib/deep-equal';\nimport { Button } from '../button';\nimport { Chip } from '../chip';\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover';\n\n// A composable toolbar for data tables: arranges a search field, optional\n// filters button, optional tenant/scope switcher, and trailing action buttons\n// in a single horizontal row. Maps to the Figma \"FilterSearch\" component. The\n// root container uses 16px inter-item gap (Figma `gap/gap-16`) and centers\n// children vertically. `FilterSearchActions` is a right-aligned flex area that\n// pushes its content to the trailing edge.\n//\n// No dedicated token tier — spacing is the Figma `gap/gap-16` semantic token\n// (16px), and each child (Search, ButtonMenu, Select) brings its own\n// `--ui-*` tier.\n//\n// `FilterSearchFilters` and `FilterSearchAppliedFilters` are design-pending\n// additions (no Figma node yet, unlike the FilterSearch node itself): the\n// filter popover (trigger + form + Reset/Cancel/Apply) and the applied-filter\n// chip row + top-level \"Reset filters\" affordance. Compose `FilterSearchFilters`\n// as a child of `<FilterSearch>` in place of a plain filter trigger, and render\n// `<FilterSearchAppliedFilters>` as a sibling row below it. Reconcile against\n// the real design with `/figma-component FilterSearchFilters <url> --update`\n// once a mockup lands.\n\nexport type FilterSearchProps = React.ComponentPropsWithoutRef<'div'>;\n\nconst FilterSearch = React.forwardRef<HTMLDivElement, FilterSearchProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex items-center gap-4', className)}\n {...props}\n />\n )\n);\nFilterSearch.displayName = 'FilterSearch';\n\nexport type FilterSearchActionsProps = React.ComponentPropsWithoutRef<'div'>;\n\nconst FilterSearchActions = React.forwardRef<\n HTMLDivElement,\n FilterSearchActionsProps\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex h-8 min-w-px flex-1 items-center justify-end gap-4', className)}\n {...props}\n />\n));\nFilterSearchActions.displayName = 'FilterSearchActions';\n\ninterface FilterSearchFiltersContextValue {\n /** The current draft filters being edited inside the popover. */\n filters: Record<string, unknown>;\n /** Set a single draft filter value by key. */\n setFilter: (key: string, value: unknown) => void;\n}\n\nconst FilterSearchFiltersContext =\n React.createContext<FilterSearchFiltersContextValue | null>(null);\n\n/**\n * Bind a filter field child (rendered inside `FilterSearchFilters`'s popover) to\n * the component's draft filters. Returns the current draft map and a per-key\n * setter. Field children are plain JSX (no render prop) and wire their own\n * `onChange` to `setFilter`; Apply commits the draft, Cancel/dismiss reverts it.\n */\nexport function useFilterSearchFilters(): FilterSearchFiltersContextValue {\n const context = React.useContext(FilterSearchFiltersContext);\n if (context === null) {\n throw new Error(\n 'useFilterSearchFilters must be used within a <FilterSearchFilters> popover.'\n );\n }\n return context;\n}\n\nexport interface FilterSearchFiltersProps {\n /** The applied filter values, keyed by an arbitrary consumer-chosen id. */\n value: Record<string, unknown>;\n /** Called with the committed filters when Apply is pressed. */\n onValueChange: (next: Record<string, unknown>) => void;\n /** Called with the newly applied filters when Apply is pressed (fires alongside `onValueChange`). */\n onApply?: (filters: Record<string, unknown>) => void;\n /** Label for the filter trigger button. */\n label?: React.ReactNode;\n /**\n * Filter field children rendered inside the popover form. Plain children —\n * wire each field to the draft via `useFilterSearchFilters`. Group fields with\n * a `Separator` as a layout convention if desired.\n */\n children?: React.ReactNode;\n /** Additional classes merged onto the trigger button. */\n className?: string;\n}\n\nconst FilterSearchFilters = React.forwardRef<\n HTMLButtonElement,\n FilterSearchFiltersProps\n>(({ value, onValueChange, onApply, label = 'Filters', children, className }, ref) => {\n const [open, setOpen] = React.useState(false);\n const [draft, setDraft] = React.useState<Record<string, unknown>>(value);\n\n const handleOpenChange = (nextOpen: boolean) => {\n // Snapshot the applied filters on open; revert the draft on any dismiss\n // (outside press / Escape) so an un-applied edit never leaks out.\n setDraft(value);\n setOpen(nextOpen);\n };\n\n const setFilter = React.useCallback((key: string, filterValue: unknown) => {\n setDraft((previous) => {\n if (filterValue === undefined) {\n if (!(key in previous)) return previous;\n const next = { ...previous };\n delete next[key];\n return next;\n }\n return { ...previous, [key]: filterValue };\n });\n }, []);\n\n const filterContext = React.useMemo<FilterSearchFiltersContextValue>(\n () => ({ filters: draft, setFilter }),\n [draft, setFilter]\n );\n\n const handleReset = () => setDraft({});\n\n const handleCancel = () => {\n setDraft(value);\n setOpen(false);\n };\n\n const handleApply = () => {\n onValueChange(draft);\n onApply?.(draft);\n setOpen(false);\n };\n\n const resetDisabled = Object.keys(draft).length === 0;\n const applyDisabled = deepEqual(draft, value);\n\n return (\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger\n ref={ref}\n render={\n <Button\n variant=\"secondary\"\n className={cn(\n 'group data-[popup-open]:border-[var(--ui-button-secondary-container-border-color-active)] data-[popup-open]:bg-[var(--ui-button-secondary-container-color-active)] data-[popup-open]:text-[var(--ui-button-secondary-label-color-active)]',\n className\n )}\n />\n }\n >\n {label}\n <ChevronDownIcon\n size={16}\n className=\"transition-transform group-data-[popup-open]:rotate-180\"\n />\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-96 p-0\">\n <form\n onSubmit={(event) => {\n event.preventDefault();\n handleApply();\n }}\n >\n <div className=\"flex max-h-80 flex-col gap-4 overflow-y-auto p-4\">\n <FilterSearchFiltersContext.Provider value={filterContext}>\n {children}\n </FilterSearchFiltersContext.Provider>\n </div>\n <div className=\"flex items-center gap-2 border-t border-border p-4\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n disabled={resetDisabled}\n onClick={handleReset}\n >\n Reset filters\n </Button>\n <div className=\"ms-auto flex items-center gap-2\">\n <Button type=\"button\" variant=\"secondary\" onClick={handleCancel}>\n Cancel\n </Button>\n <Button type=\"submit\" variant=\"default\" disabled={applyDisabled}>\n Apply\n </Button>\n </div>\n </div>\n </form>\n </PopoverContent>\n </Popover>\n );\n});\nFilterSearchFilters.displayName = 'FilterSearchFilters';\n\nfunction defaultFilterChipLabel(key: string, value: unknown): string {\n const text = Array.isArray(value)\n ? value.map((entry) => String(entry)).join(', ')\n : typeof value === 'object' && value !== null\n ? JSON.stringify(value)\n : String(value);\n return `${key}: ${text}`;\n}\n\nexport interface FilterSearchAppliedFiltersProps\n extends Omit<React.ComponentPropsWithoutRef<'div'>, 'children'> {\n /** The currently applied filter values, keyed by an arbitrary consumer-chosen id. */\n filters: Record<string, unknown>;\n /** Called with the remaining filters when a chip is removed or \"Reset filters\" clears all. */\n onValueChange: (next: Record<string, unknown>) => void;\n /** Format an applied-filter chip's label. Defaults to `\"<key>: <value>\"`. */\n getFilterChipLabel?: (key: string, value: unknown) => React.ReactNode;\n}\n\n/**\n * Renders one removable chip per applied filter plus a \"Reset filters\" action\n * that clears all filters immediately (no popover involved). Renders nothing\n * when `filters` is empty.\n */\nconst FilterSearchAppliedFilters = React.forwardRef<\n HTMLDivElement,\n FilterSearchAppliedFiltersProps\n>(({ className, filters, onValueChange, getFilterChipLabel, ...props }, ref) => {\n const keys = Object.keys(filters);\n if (keys.length === 0) return null;\n\n const handleRemove = (key: string) => {\n const next = { ...filters };\n delete next[key];\n onValueChange(next);\n };\n\n return (\n <div\n ref={ref}\n className={cn('flex flex-wrap items-center gap-3', className)}\n {...props}\n >\n {keys.map((key) => (\n <Chip\n key={key}\n variant=\"removable\"\n onRemove={() => handleRemove(key)}\n removeLabel={`Remove ${key} filter`}\n >\n {getFilterChipLabel\n ? getFilterChipLabel(key, filters[key])\n : defaultFilterChipLabel(key, filters[key])}\n </Chip>\n ))}\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => onValueChange({})}\n >\n Reset filters\n </Button>\n </div>\n );\n});\nFilterSearchAppliedFilters.displayName = 'FilterSearchAppliedFilters';\n\nexport {\n FilterSearch,\n FilterSearchActions,\n FilterSearchFilters,\n FilterSearchAppliedFilters,\n};\n"],"names":["FilterSearch","React","className","props","ref","jsx","cn","FilterSearchActions","FilterSearchFiltersContext","useFilterSearchFilters","context","FilterSearchFilters","value","onValueChange","onApply","label","children","open","setOpen","draft","setDraft","handleOpenChange","nextOpen","setFilter","key","filterValue","previous","next","filterContext","handleReset","handleCancel","handleApply","resetDisabled","applyDisabled","deepEqual","jsxs","Popover","PopoverTrigger","Button","ChevronDownIcon","PopoverContent","event","defaultFilterChipLabel","text","entry","FilterSearchAppliedFilters","filters","getFilterChipLabel","keys","handleRemove","Chip"],"mappings":"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"}
1
+ {"version":3,"file":"filter-search.js","sources":["../../../../src/components/ui/filter-search/filter-search.tsx"],"sourcesContent":["import * as React from 'react';\nimport { ChevronDownIcon } from '@acronis-platform/icons-react/stroke-mono';\n\nimport { cn } from '@/lib/utils';\nimport { deepEqual } from '@/lib/deep-equal';\nimport { Button } from '../button';\nimport { Chip } from '../chip';\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover';\n\n// A composable toolbar for data tables: arranges a search field, optional\n// filters button, optional tenant/scope switcher, and trailing action buttons\n// in a single horizontal row. Maps to the Figma \"FilterSearch\" component. The\n// root container uses 16px inter-item gap (Figma `gap/gap-16`) and centers\n// children vertically. `FilterSearchActions` is a right-aligned flex area that\n// pushes its content to the trailing edge.\n//\n// No dedicated token tier — spacing is the Figma `gap/gap-16` semantic token\n// (16px), and each child (Search, ButtonMenu, Select) brings its own\n// `--ui-*` tier.\n//\n// `FilterSearchFilters` and `FilterSearchAppliedFilters` are design-pending\n// additions (no Figma node yet, unlike the FilterSearch node itself): the\n// filter popover (trigger + form + Reset/Cancel/Apply) and the applied-filter\n// chip row + top-level \"Reset filters\" affordance. Compose `FilterSearchFilters`\n// as a child of `<FilterSearch>` in place of a plain filter trigger, and render\n// `<FilterSearchAppliedFilters>` as a sibling row below it. Reconcile against\n// the real design with `/figma-component FilterSearchFilters <url> --update`\n// once a mockup lands.\n\nexport type FilterSearchProps = React.ComponentPropsWithoutRef<'div'>;\n\nconst FilterSearch = React.forwardRef<HTMLDivElement, FilterSearchProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex items-center gap-4', className)}\n {...props}\n />\n )\n);\nFilterSearch.displayName = 'FilterSearch';\n\nexport type FilterSearchActionsProps = React.ComponentPropsWithoutRef<'div'>;\n\nconst FilterSearchActions = React.forwardRef<\n HTMLDivElement,\n FilterSearchActionsProps\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex h-8 min-w-px flex-1 items-center justify-end gap-4', className)}\n {...props}\n />\n));\nFilterSearchActions.displayName = 'FilterSearchActions';\n\ninterface FilterSearchFiltersContextValue {\n /** The current draft filters being edited inside the popover. */\n filters: Record<string, unknown>;\n /** Set a single draft filter value by key. */\n setFilter: (key: string, value: unknown) => void;\n}\n\nconst FilterSearchFiltersContext =\n React.createContext<FilterSearchFiltersContextValue | null>(null);\n\n/**\n * Bind a filter field child (rendered inside `FilterSearchFilters`'s popover) to\n * the component's draft filters. Returns the current draft map and a per-key\n * setter. Field children are plain JSX (no render prop) and wire their own\n * `onChange` to `setFilter`; Apply commits the draft, Cancel/dismiss reverts it.\n */\nexport function useFilterSearchFilters(): FilterSearchFiltersContextValue {\n const context = React.useContext(FilterSearchFiltersContext);\n if (context === null) {\n throw new Error(\n 'useFilterSearchFilters must be used within a <FilterSearchFilters> popover.'\n );\n }\n return context;\n}\n\nexport interface FilterSearchFiltersProps\n extends Omit<React.ComponentPropsWithoutRef<'button'>, 'value' | 'onValueChange'> {\n /** The applied filter values, keyed by an arbitrary consumer-chosen id. */\n value: Record<string, unknown>;\n /** Called with the committed filters when Apply is pressed. */\n onValueChange: (next: Record<string, unknown>) => void;\n /** Called with the newly applied filters when Apply is pressed (fires alongside `onValueChange`). */\n onApply?: (filters: Record<string, unknown>) => void;\n /** Label for the filter trigger button. */\n label?: React.ReactNode;\n /**\n * Filter field children rendered inside the popover form. Plain children —\n * wire each field to the draft via `useFilterSearchFilters`. Group fields with\n * a `Separator` as a layout convention if desired.\n */\n children?: React.ReactNode;\n /** Additional classes merged onto the trigger button. */\n className?: string;\n}\n\nconst FilterSearchFilters = React.forwardRef<\n HTMLButtonElement,\n FilterSearchFiltersProps\n>(({ value, onValueChange, onApply, label = 'Filters', children, className, ...rest }, ref) => {\n const [open, setOpen] = React.useState(false);\n const [draft, setDraft] = React.useState<Record<string, unknown>>(value);\n\n const handleOpenChange = (nextOpen: boolean) => {\n // Snapshot the applied filters on open; revert the draft on any dismiss\n // (outside press / Escape) so an un-applied edit never leaks out.\n setDraft(value);\n setOpen(nextOpen);\n };\n\n const setFilter = React.useCallback((key: string, filterValue: unknown) => {\n setDraft((previous) => {\n if (filterValue === undefined) {\n if (!(key in previous)) return previous;\n const next = { ...previous };\n delete next[key];\n return next;\n }\n return { ...previous, [key]: filterValue };\n });\n }, []);\n\n const filterContext = React.useMemo<FilterSearchFiltersContextValue>(\n () => ({ filters: draft, setFilter }),\n [draft, setFilter]\n );\n\n const handleReset = () => setDraft({});\n\n const handleCancel = () => {\n setDraft(value);\n setOpen(false);\n };\n\n const handleApply = () => {\n onValueChange(draft);\n onApply?.(draft);\n setOpen(false);\n };\n\n const resetDisabled = Object.keys(draft).length === 0;\n const applyDisabled = deepEqual(draft, value);\n\n return (\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger\n ref={ref}\n render={\n <Button\n variant=\"secondary\"\n className={cn(\n 'group data-[popup-open]:border-[var(--ui-button-secondary-container-border-color-active)] data-[popup-open]:bg-[var(--ui-button-secondary-container-color-active)] data-[popup-open]:text-[var(--ui-button-secondary-label-color-active)]',\n className\n )}\n {...rest}\n />\n }\n >\n {label}\n <ChevronDownIcon\n size={16}\n className=\"transition-transform group-data-[popup-open]:rotate-180\"\n />\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-96 p-0\">\n <form\n onSubmit={(event) => {\n event.preventDefault();\n handleApply();\n }}\n >\n <div className=\"flex max-h-80 flex-col gap-4 overflow-y-auto p-4\">\n <FilterSearchFiltersContext.Provider value={filterContext}>\n {children}\n </FilterSearchFiltersContext.Provider>\n </div>\n <div className=\"flex items-center gap-2 border-t border-border p-4\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n disabled={resetDisabled}\n onClick={handleReset}\n >\n Reset filters\n </Button>\n <div className=\"ms-auto flex items-center gap-2\">\n <Button type=\"button\" variant=\"secondary\" onClick={handleCancel}>\n Cancel\n </Button>\n <Button type=\"submit\" variant=\"default\" disabled={applyDisabled}>\n Apply\n </Button>\n </div>\n </div>\n </form>\n </PopoverContent>\n </Popover>\n );\n});\nFilterSearchFilters.displayName = 'FilterSearchFilters';\n\nfunction defaultFilterChipLabel(key: string, value: unknown): string {\n const text = Array.isArray(value)\n ? value.map((entry) => String(entry)).join(', ')\n : typeof value === 'object' && value !== null\n ? JSON.stringify(value)\n : String(value);\n return `${key}: ${text}`;\n}\n\nexport interface FilterSearchAppliedFiltersProps\n extends Omit<React.ComponentPropsWithoutRef<'div'>, 'children'> {\n /** The currently applied filter values, keyed by an arbitrary consumer-chosen id. */\n filters: Record<string, unknown>;\n /** Called with the remaining filters when a chip is removed or \"Reset filters\" clears all. */\n onValueChange: (next: Record<string, unknown>) => void;\n /** Format an applied-filter chip's label. Defaults to `\"<key>: <value>\"`. */\n getFilterChipLabel?: (key: string, value: unknown) => React.ReactNode;\n}\n\n/**\n * Renders one removable chip per applied filter plus a \"Reset filters\" action\n * that clears all filters immediately (no popover involved). Renders nothing\n * when `filters` is empty.\n */\nconst FilterSearchAppliedFilters = React.forwardRef<\n HTMLDivElement,\n FilterSearchAppliedFiltersProps\n>(({ className, filters, onValueChange, getFilterChipLabel, ...props }, ref) => {\n const keys = Object.keys(filters);\n if (keys.length === 0) return null;\n\n const handleRemove = (key: string) => {\n const next = { ...filters };\n delete next[key];\n onValueChange(next);\n };\n\n return (\n <div\n ref={ref}\n className={cn('flex flex-wrap items-center gap-3', className)}\n {...props}\n >\n {keys.map((key) => (\n <Chip\n key={key}\n variant=\"removable\"\n onRemove={() => handleRemove(key)}\n removeLabel={`Remove ${key} filter`}\n >\n {getFilterChipLabel\n ? getFilterChipLabel(key, filters[key])\n : defaultFilterChipLabel(key, filters[key])}\n </Chip>\n ))}\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => onValueChange({})}\n >\n Reset filters\n </Button>\n </div>\n );\n});\nFilterSearchAppliedFilters.displayName = 'FilterSearchAppliedFilters';\n\nexport {\n FilterSearch,\n FilterSearchActions,\n FilterSearchFilters,\n FilterSearchAppliedFilters,\n};\n"],"names":["FilterSearch","React","className","props","ref","jsx","cn","FilterSearchActions","FilterSearchFiltersContext","useFilterSearchFilters","context","FilterSearchFilters","value","onValueChange","onApply","label","children","rest","open","setOpen","draft","setDraft","handleOpenChange","nextOpen","setFilter","key","filterValue","previous","next","filterContext","handleReset","handleCancel","handleApply","resetDisabled","applyDisabled","deepEqual","jsxs","Popover","PopoverTrigger","Button","ChevronDownIcon","PopoverContent","event","defaultFilterChipLabel","text","entry","FilterSearchAppliedFilters","filters","getFilterChipLabel","keys","handleRemove","Chip"],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ import { jsx as t, jsxs as i } from "react/jsx-runtime";
2
+ import * as g from "react";
3
+ import { cva as v } from "../../../node_modules/.pnpm/class-variance-authority@0.7.1/node_modules/class-variance-authority/dist/index.js";
4
+ import { FunnelChart as F, Funnel as N, Cell as b, LabelList as x } from "recharts";
5
+ import { cn as L } from "../../../lib/utils.js";
6
+ import { ChartContainer as T, ChartTooltip as $, ChartTooltipContent as j } from "../chart/chart.js";
7
+ const A = v("", {
8
+ variants: {
9
+ lastShape: {
10
+ triangle: "",
11
+ rectangle: ""
12
+ }
13
+ },
14
+ defaultVariants: {
15
+ lastShape: "triangle"
16
+ }
17
+ }), R = g.forwardRef(
18
+ ({
19
+ className: n,
20
+ config: o,
21
+ data: s,
22
+ dataKey: c,
23
+ nameKey: a,
24
+ lastShape: e = "triangle",
25
+ reversed: f = !1,
26
+ showLabels: h = !0,
27
+ showTooltip: m = !0,
28
+ tooltipContent: p,
29
+ ...d
30
+ }, u) => {
31
+ const l = s.map((r) => ({
32
+ ...r,
33
+ fill: `var(--color-${r[a]})`
34
+ }));
35
+ return /* @__PURE__ */ t(
36
+ "div",
37
+ {
38
+ ref: u,
39
+ "data-last-shape": e,
40
+ className: L(A({ lastShape: e }), n),
41
+ ...d,
42
+ children: /* @__PURE__ */ t(T, { config: o, className: "size-full", children: /* @__PURE__ */ i(F, { margin: { top: 8, right: 96, bottom: 8, left: 24 }, children: [
43
+ m && /* @__PURE__ */ t(
44
+ $,
45
+ {
46
+ content: p ?? /* @__PURE__ */ t(j, { nameKey: a, hideLabel: !0 })
47
+ }
48
+ ),
49
+ /* @__PURE__ */ i(
50
+ N,
51
+ {
52
+ dataKey: c,
53
+ nameKey: a,
54
+ data: l,
55
+ lastShapeType: e ?? "triangle",
56
+ reversed: f,
57
+ isAnimationActive: !1,
58
+ children: [
59
+ l.map((r, C) => (
60
+ // Keyed by index, not the name: two stages could share a nameKey
61
+ // value, which would collide as a React key. Same-named stages
62
+ // intentionally share a color/config entry via `--color-<name>`.
63
+ /* @__PURE__ */ t(b, { fill: `var(--color-${r[a]})` }, C)
64
+ )),
65
+ h && /* @__PURE__ */ t(
66
+ x,
67
+ {
68
+ position: "right",
69
+ dataKey: a,
70
+ className: "fill-foreground",
71
+ stroke: "none"
72
+ }
73
+ )
74
+ ]
75
+ }
76
+ )
77
+ ] }) })
78
+ }
79
+ );
80
+ }
81
+ );
82
+ R.displayName = "FunnelChart";
83
+ export {
84
+ R as FunnelChart,
85
+ A as funnelChartVariants
86
+ };
87
+ //# sourceMappingURL=funnel-chart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"funnel-chart.js","sources":["../../../../src/components/ui/funnel-chart/funnel-chart.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Cell, Funnel, FunnelChart as RechartsFunnelChart, LabelList } from 'recharts';\n\nimport { cn } from '@/lib/utils';\nimport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n type ChartConfig,\n} from '../chart';\n\n// A typed recharts composition over the shared `Chart` primitives. The single\n// CVA axis is the design's Funnel-chart variant set: `lastShape` (does the\n// funnel narrow to a point — `triangle` — or end flat — `rectangle`). The class\n// stays empty because recharts' SVG — not CSS — draws the funnel: `lastShape`\n// drives the `<Funnel>`'s `lastShapeType`. CVA is kept so the variant set is a\n// first-class, spec-conformant part of the API (matched against ui-spec's\n// api.yaml enums) and exposed via `VariantProps`; the resolved value is also\n// mirrored onto `data-last-shape`.\nconst funnelChartVariants = cva('', {\n variants: {\n lastShape: {\n triangle: '',\n rectangle: '',\n },\n },\n defaultVariants: {\n lastShape: 'triangle',\n },\n});\n\nexport interface FunnelChartProps\n extends Omit<React.ComponentProps<'div'>, 'children'>,\n VariantProps<typeof funnelChartVariants> {\n /** Row-per-stage data. Each object holds the stage's `nameKey` label + its `dataKey` numeric value. */\n data: ReadonlyArray<Record<string, string | number>>;\n /**\n * Per-stage map of `label` / `color`, keyed by the stage's `nameKey` value\n * (imported from the shared `Chart` primitives). Turned into `--color-<name>`\n * custom properties. Colors are caller-supplied — reference an existing\n * semantic `--ui-*` token; there is no chart palette tier yet.\n */\n config: ChartConfig;\n /** Numeric field that sizes each stage (the funnel narrows as it drops). */\n dataKey: string;\n /**\n * Label field that names each stage (drives the legend, tooltip, on-chart\n * labels, and the `--color-<name>` lookup). Values should be unique per chart —\n * stages sharing a name share one `config`/color entry.\n */\n nameKey: string;\n /** Flip the funnel so it widens toward the bottom instead of narrowing. */\n reversed?: boolean;\n /** Render each stage's name beside its segment. */\n showLabels?: boolean;\n showTooltip?: boolean;\n /**\n * Replace the default tooltip. Pass a configured `ChartTooltipContent`\n * (imported from this library) — e.g. with a `formatter` / `labelFormatter` —\n * to customize formatting, per-series rows, or extra fields without composing\n * recharts yourself. Ignored when `showTooltip` is false.\n */\n tooltipContent?: React.ComponentProps<typeof ChartTooltip>['content'];\n}\n\nconst FunnelChart = React.forwardRef<HTMLDivElement, FunnelChartProps>(\n (\n {\n className,\n config,\n data,\n dataKey,\n nameKey,\n lastShape = 'triangle',\n reversed = false,\n showLabels = true,\n showTooltip = true,\n tooltipContent,\n ...props\n },\n ref\n ) => {\n // Stamp each row with its `fill` (the shadcn data-driven pattern). A Funnel's\n // default fill is grey (#808080) and recharts doesn't carry a per-segment\n // color on the tooltip/legend payload item, so putting the color on the data\n // row is what lets a real hover resolve each segment's color. (The forced-open\n // `defaultIndex` VR snapshot can still show a neutral indicator — it\n // synthesizes the open state without a pointer hover.)\n const seriesData: Record<string, string | number>[] = data.map((row) => ({\n ...row,\n fill: `var(--color-${row[nameKey]})`,\n }));\n\n return (\n <div\n ref={ref}\n data-last-shape={lastShape}\n className={cn(funnelChartVariants({ lastShape }), className)}\n {...props}\n >\n <ChartContainer config={config} className=\"size-full\">\n <RechartsFunnelChart margin={{ top: 8, right: 96, bottom: 8, left: 24 }}>\n {showTooltip && (\n <ChartTooltip\n content={\n tooltipContent ?? (\n <ChartTooltipContent nameKey={nameKey} hideLabel />\n )\n }\n />\n )}\n <Funnel\n dataKey={dataKey}\n nameKey={nameKey}\n data={seriesData}\n lastShapeType={lastShape ?? 'triangle'}\n reversed={reversed}\n isAnimationActive={false}\n >\n {seriesData.map((entry, index) => (\n // Keyed by index, not the name: two stages could share a nameKey\n // value, which would collide as a React key. Same-named stages\n // intentionally share a color/config entry via `--color-<name>`.\n <Cell key={index} fill={`var(--color-${entry[nameKey]})`} />\n ))}\n {showLabels && (\n <LabelList\n position=\"right\"\n dataKey={nameKey}\n className=\"fill-foreground\"\n stroke=\"none\"\n />\n )}\n </Funnel>\n </RechartsFunnelChart>\n </ChartContainer>\n </div>\n );\n }\n);\nFunnelChart.displayName = 'FunnelChart';\n\nexport { FunnelChart, funnelChartVariants };\n"],"names":["funnelChartVariants","cva","FunnelChart","React","className","config","data","dataKey","nameKey","lastShape","reversed","showLabels","showTooltip","tooltipContent","props","ref","seriesData","row","jsx","cn","ChartContainer","RechartsFunnelChart","ChartTooltip","ChartTooltipContent","jsxs","Funnel","entry","index","Cell","LabelList"],"mappings":";;;;;;AAsBA,MAAMA,IAAsBC,EAAI,IAAI;AAAA,EAClC,UAAU;AAAA,IACR,WAAW;AAAA,MACT,UAAU;AAAA,MACV,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,iBAAiB;AAAA,IACf,WAAW;AAAA,EAAA;AAEf,CAAC,GAoCKC,IAAcC,EAAM;AAAA,EACxB,CACE;AAAA,IACE,WAAAC;AAAA,IACA,QAAAC;AAAA,IACA,MAAAC;AAAA,IACA,SAAAC;AAAA,IACA,SAAAC;AAAA,IACA,WAAAC,IAAY;AAAA,IACZ,UAAAC,IAAW;AAAA,IACX,YAAAC,IAAa;AAAA,IACb,aAAAC,IAAc;AAAA,IACd,gBAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AAOH,UAAMC,IAAgDV,EAAK,IAAI,CAACW,OAAS;AAAA,MACvE,GAAGA;AAAA,MACH,MAAM,eAAeA,EAAIT,CAAO,CAAC;AAAA,IAAA,EACjC;AAEF,WACE,gBAAAU;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAH;AAAA,QACA,mBAAiBN;AAAA,QACjB,WAAWU,EAAGnB,EAAoB,EAAE,WAAAS,EAAA,CAAW,GAAGL,CAAS;AAAA,QAC1D,GAAGU;AAAA,QAEJ,4BAACM,GAAA,EAAe,QAAAf,GAAgB,WAAU,aACxC,4BAACgB,GAAA,EAAoB,QAAQ,EAAE,KAAK,GAAG,OAAO,IAAI,QAAQ,GAAG,MAAM,MAChE,UAAA;AAAA,UAAAT,KACC,gBAAAM;AAAA,YAACI;AAAA,YAAA;AAAA,cACC,SACET,KACE,gBAAAK,EAACK,GAAA,EAAoB,SAAAf,GAAkB,WAAS,GAAA,CAAC;AAAA,YAAA;AAAA,UAAA;AAAA,UAKzD,gBAAAgB;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,SAAAlB;AAAA,cACA,SAAAC;AAAA,cACA,MAAMQ;AAAA,cACN,eAAeP,KAAa;AAAA,cAC5B,UAAAC;AAAA,cACA,mBAAmB;AAAA,cAElB,UAAA;AAAA,gBAAAM,EAAW,IAAI,CAACU,GAAOC;AAAA;AAAA;AAAA;AAAA,kBAItB,gBAAAT,EAACU,KAAiB,MAAM,eAAeF,EAAMlB,CAAO,CAAC,OAA1CmB,CAA+C;AAAA,iBAC3D;AAAA,gBACAhB,KACC,gBAAAO;AAAA,kBAACW;AAAA,kBAAA;AAAA,oBACC,UAAS;AAAA,oBACT,SAASrB;AAAA,oBACT,WAAU;AAAA,oBACV,QAAO;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACT;AAAA,YAAA;AAAA,UAAA;AAAA,QAEJ,EAAA,CACF,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AACF;AACAN,EAAY,cAAc;"}
@@ -0,0 +1,136 @@
1
+ import { jsx as a, jsxs as _ } from "react/jsx-runtime";
2
+ import * as k from "react";
3
+ import { BarChart as E, CartesianGrid as W, XAxis as X, YAxis as Y, Bar as q } from "recharts";
4
+ import { cn as I } from "../../../lib/utils.js";
5
+ import { ChartContainer as J, ChartTooltip as L, ChartTooltipContent as O } from "../chart/chart.js";
6
+ import { resolveAxisDomain as P } from "../chart/chart-format.js";
7
+ const y = (l) => Number(l.toFixed(2));
8
+ function Q(l, e, h) {
9
+ const i = l.filter(
10
+ (o) => typeof o == "number" && Number.isFinite(o)
11
+ );
12
+ if (i.length === 0 || e < 1) return [];
13
+ const [c, m] = h ?? [Math.min(...i), Math.max(...i)], t = Math.min(c, m), s = Math.max(c, m), f = t === s ? t + 1 : s, n = (f - t) / e, u = Array.from({ length: e }, (o, r) => {
14
+ const p = t + r * n, v = r === e - 1 ? f : t + (r + 1) * n;
15
+ return { x0: p, x1: v, label: `${y(p)}–${y(v)}`, count: 0 };
16
+ });
17
+ for (const o of i) {
18
+ if (o < t || o > f) continue;
19
+ let r = Math.floor((o - t) / n);
20
+ r >= e && (r = e - 1), u[r].count += 1;
21
+ }
22
+ return u;
23
+ }
24
+ const R = k.forwardRef(
25
+ ({
26
+ className: l,
27
+ config: e,
28
+ values: h,
29
+ dataKey: i = "count",
30
+ binCount: c = 10,
31
+ domain: m,
32
+ xAxisLabel: t,
33
+ yAxisLabel: s,
34
+ yUnit: f,
35
+ barRadius: n = 0,
36
+ showGrid: u = !0,
37
+ showTooltip: o = !0,
38
+ showXAxis: r = !0,
39
+ showYAxis: p = !0,
40
+ xTickFormatter: v,
41
+ yTickFormatter: x,
42
+ xAxisAngle: d,
43
+ xAxisInterval: M,
44
+ yAxisTickCount: N,
45
+ yAxisDomain: w,
46
+ gridDashed: B,
47
+ gridHorizontal: D,
48
+ gridVertical: F,
49
+ tooltipContent: H,
50
+ ...T
51
+ }, C) => {
52
+ const $ = t ? { value: t, position: "insideBottom", offset: 0 } : void 0, b = s ? {
53
+ value: s,
54
+ angle: -90,
55
+ position: "insideLeft",
56
+ style: { textAnchor: "middle" }
57
+ } : void 0, j = P(w), z = t || d != null ? 30 + (d != null ? 20 : 0) + (t ? 18 : 0) : void 0, G = k.useMemo(
58
+ () => Q(h, c, m),
59
+ [h, c, m]
60
+ ).map((g) => ({ label: g.label, [i]: g.count }));
61
+ return /* @__PURE__ */ a(
62
+ "div",
63
+ {
64
+ ref: C,
65
+ className: I(l),
66
+ ...T,
67
+ children: /* @__PURE__ */ a(
68
+ J,
69
+ {
70
+ config: e,
71
+ className: "size-full [&_.recharts-label]:fill-foreground",
72
+ children: /* @__PURE__ */ _(E, { data: G, barCategoryGap: 0, children: [
73
+ u && /* @__PURE__ */ a(
74
+ W,
75
+ {
76
+ horizontal: D ?? !0,
77
+ vertical: F ?? !1,
78
+ strokeDasharray: B ? "3 3" : void 0
79
+ }
80
+ ),
81
+ /* @__PURE__ */ a(
82
+ X,
83
+ {
84
+ dataKey: "label",
85
+ hide: !r,
86
+ tickLine: !1,
87
+ axisLine: !1,
88
+ tickFormatter: v,
89
+ angle: d,
90
+ interval: M,
91
+ textAnchor: d != null ? d < 0 ? "end" : "start" : void 0,
92
+ height: z,
93
+ label: $
94
+ }
95
+ ),
96
+ /* @__PURE__ */ a(
97
+ Y,
98
+ {
99
+ type: "number",
100
+ hide: !p,
101
+ tickLine: !1,
102
+ axisLine: !1,
103
+ allowDecimals: !1,
104
+ unit: f,
105
+ tickFormatter: x,
106
+ tickCount: N,
107
+ domain: j,
108
+ width: s ? 72 : void 0,
109
+ label: b
110
+ }
111
+ ),
112
+ o && /* @__PURE__ */ a(L, { content: H ?? /* @__PURE__ */ a(O, {}) }),
113
+ /* @__PURE__ */ a(
114
+ q,
115
+ {
116
+ dataKey: i,
117
+ fill: `var(--color-${i})`,
118
+ stroke: "var(--ui-background-surface-primary)",
119
+ strokeWidth: 1,
120
+ radius: n > 0 ? [n, n, 0, 0] : void 0,
121
+ isAnimationActive: !1
122
+ }
123
+ )
124
+ ] })
125
+ }
126
+ )
127
+ }
128
+ );
129
+ }
130
+ );
131
+ R.displayName = "Histogram";
132
+ export {
133
+ R as Histogram,
134
+ Q as computeHistogramBins
135
+ };
136
+ //# sourceMappingURL=histogram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"histogram.js","sources":["../../../../src/components/ui/histogram/histogram.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport {\n Bar,\n BarChart as RechartsBarChart,\n CartesianGrid,\n XAxis,\n YAxis,\n} from 'recharts';\n\nimport { cn } from '@/lib/utils';\nimport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n resolveAxisDomain,\n type ChartConfig,\n type CartesianChartProps,\n} from '../chart';\n\n// A histogram bins a set of continuous samples into equal-width ranges and plots\n// the frequency of each as contiguous bars — distinct from BarChart, whose bars\n// are pre-categorized. The binning is the component's job (a pure helper), so the\n// consumer passes raw `values`, not pre-aggregated rows. Built on the shared\n// `Chart` primitives; no new tokens (the single series' color is caller-supplied\n// via `config`, same `--color-<key>` mechanism as the other chart types).\n\nexport interface HistogramBin {\n /** Lower bound of the bin (inclusive). */\n x0: number;\n /** Upper bound of the bin (exclusive, except the last bin which is inclusive). */\n x1: number;\n /** Human-readable range label, e.g. `\"0–10\"`. */\n label: string;\n /** How many samples fell in the bin. */\n count: number;\n}\n\nconst roundEdge = (n: number) => Number(n.toFixed(2));\n\n/**\n * Split `values` into `binCount` equal-width bins and count the samples in each.\n * The range is `domain` if given, else the data's [min, max]; values outside the\n * domain are dropped, and the max value lands in the last (inclusive) bin.\n * Returns [] when there's nothing to bin. Exported for unit tests; not part of\n * the package's public API.\n */\nexport function computeHistogramBins(\n values: ReadonlyArray<number>,\n binCount: number,\n domain?: [number, number]\n): HistogramBin[] {\n const nums = values.filter(\n (v): v is number => typeof v === 'number' && Number.isFinite(v)\n );\n if (nums.length === 0 || binCount < 1) return [];\n\n const [d0, d1] = domain ?? [Math.min(...nums), Math.max(...nums)];\n // Normalize an inverted domain ([max, min]) so binning stays robust.\n const min = Math.min(d0, d1);\n const hi = Math.max(d0, d1);\n // A zero-width range (all values equal, or a degenerate domain) can't be\n // divided — widen it by 1 so the single bin has extent.\n const max = min === hi ? min + 1 : hi;\n const width = (max - min) / binCount;\n\n const bins: HistogramBin[] = Array.from({ length: binCount }, (_, i) => {\n const x0 = min + i * width;\n const x1 = i === binCount - 1 ? max : min + (i + 1) * width;\n return { x0, x1, label: `${roundEdge(x0)}–${roundEdge(x1)}`, count: 0 };\n });\n\n for (const v of nums) {\n if (v < min || v > max) continue;\n let idx = Math.floor((v - min) / width);\n if (idx >= binCount) idx = binCount - 1; // the max value\n bins[idx].count += 1;\n }\n return bins;\n}\n\nexport interface HistogramProps\n extends Omit<React.ComponentProps<'div'>, 'children'>,\n CartesianChartProps {\n /** Raw continuous samples to bin (non-finite values are ignored). */\n values: ReadonlyArray<number>;\n /**\n * Single-series map of `label` / `color`, keyed by `dataKey` (imported from\n * the shared `Chart` primitives). Color is caller-supplied — reference an\n * existing semantic `--ui-*` token; there is no chart palette tier yet.\n */\n config: ChartConfig;\n /** `config` key that colors + labels the frequency bars. */\n dataKey?: string;\n /** Number of equal-width bins. */\n binCount?: number;\n /** Fix the binning range instead of deriving it from the data's min/max. */\n domain?: [number, number];\n /** Corner radius on the top of each bar. */\n barRadius?: number;\n}\n\nconst Histogram = React.forwardRef<HTMLDivElement, HistogramProps>(\n (\n {\n className,\n config,\n values,\n dataKey = 'count',\n binCount = 10,\n domain,\n xAxisLabel,\n yAxisLabel,\n yUnit,\n barRadius = 0,\n showGrid = true,\n showTooltip = true,\n showXAxis = true,\n showYAxis = true,\n xTickFormatter,\n yTickFormatter,\n xAxisAngle,\n xAxisInterval,\n yAxisTickCount,\n yAxisDomain,\n gridDashed,\n gridHorizontal,\n gridVertical,\n tooltipContent,\n ...props\n },\n ref\n ) => {\n const xAxisTitle = xAxisLabel\n ? { value: xAxisLabel, position: 'insideBottom' as const, offset: 0 }\n : undefined;\n const yAxisTitle = yAxisLabel\n ? {\n value: yAxisLabel,\n angle: -90,\n position: 'insideLeft' as const,\n style: { textAnchor: 'middle' as const },\n }\n : undefined;\n\n const yDomain = resolveAxisDomain(yAxisDomain);\n\n // Room for the X tick row: recharts' default 30, plus a rotated tick row\n // (+20) and/or the axis title (+18). Additive — both can be present at once,\n // which the old label-or-angle ternary under-allocated.\n const xAxisHeight =\n xAxisLabel || xAxisAngle != null\n ? 30 + (xAxisAngle != null ? 20 : 0) + (xAxisLabel ? 18 : 0)\n : undefined;\n\n const bins = React.useMemo(\n () => computeHistogramBins(values, binCount, domain),\n [values, binCount, domain]\n );\n // Bars carry the bin `label` as the category and `count` under `dataKey`, so\n // the tooltip resolves the frequency from `config[dataKey]`.\n const data = bins.map((bin) => ({ label: bin.label, [dataKey]: bin.count }));\n\n return (\n <div\n ref={ref}\n className={cn(className)}\n {...props}\n >\n <ChartContainer\n config={config}\n className=\"size-full [&_.recharts-label]:fill-foreground\"\n >\n <RechartsBarChart data={data} barCategoryGap={0}>\n {showGrid && (\n <CartesianGrid\n horizontal={gridHorizontal ?? true}\n vertical={gridVertical ?? false}\n strokeDasharray={gridDashed ? '3 3' : undefined}\n />\n )}\n <XAxis\n dataKey=\"label\"\n hide={!showXAxis}\n tickLine={false}\n axisLine={false}\n tickFormatter={xTickFormatter}\n angle={xAxisAngle}\n interval={xAxisInterval}\n textAnchor={\n xAxisAngle != null ? (xAxisAngle < 0 ? 'end' : 'start') : undefined\n }\n height={xAxisHeight}\n label={xAxisTitle}\n />\n <YAxis\n type=\"number\"\n hide={!showYAxis}\n tickLine={false}\n axisLine={false}\n allowDecimals={false}\n unit={yUnit}\n tickFormatter={yTickFormatter}\n tickCount={yAxisTickCount}\n domain={yDomain}\n width={yAxisLabel ? 72 : undefined}\n label={yAxisTitle}\n />\n {showTooltip && (\n <ChartTooltip content={tooltipContent ?? <ChartTooltipContent />} />\n )}\n <Bar\n dataKey={dataKey}\n fill={`var(--color-${dataKey})`}\n // A hairline in the surface color separates the contiguous bars so\n // they don't blend into one mass (same trick as the Treemap cells).\n stroke=\"var(--ui-background-surface-primary)\"\n strokeWidth={1}\n radius={barRadius > 0 ? [barRadius, barRadius, 0, 0] : undefined}\n isAnimationActive={false}\n />\n </RechartsBarChart>\n </ChartContainer>\n </div>\n );\n }\n);\nHistogram.displayName = 'Histogram';\n\nexport { Histogram };\n"],"names":["roundEdge","n","computeHistogramBins","values","binCount","domain","nums","v","d0","d1","min","hi","max","width","bins","_","i","x0","x1","idx","Histogram","React","className","config","dataKey","xAxisLabel","yAxisLabel","yUnit","barRadius","showGrid","showTooltip","showXAxis","showYAxis","xTickFormatter","yTickFormatter","xAxisAngle","xAxisInterval","yAxisTickCount","yAxisDomain","gridDashed","gridHorizontal","gridVertical","tooltipContent","props","ref","xAxisTitle","yAxisTitle","yDomain","resolveAxisDomain","xAxisHeight","data","bin","jsx","cn","ChartContainer","jsxs","RechartsBarChart","CartesianGrid","XAxis","YAxis","ChartTooltip","ChartTooltipContent","Bar"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"input.js","sources":["../../../../src/components/ui/input/input.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\n// Internal primitive: the bare single-line input box behind the public\n// `InputText` field (which is also exported as `Input`). Not exported from the\n// package; consumed by `input-text`. Themed by the dedicated next-gen `--ui-input-text-*`\n// token tier from @acronis-platform/tokens-pd. The box fill (`global-box-color-*`)\n// and the normal border (`normal-box-border-color-*`) are wired per state: idle /\n// hover / focus / disabled. The `normal-box-border-color-*` tier has no `-active`,\n// so focus reuses `-hover` for the border, paired with a 3px `--ui-focus-primary`\n// ring. Value and placeholder text use `global-value-color-*` /\n// `global-placeholder-color-*`. The error state is driven by `aria-invalid` —\n// `error-msg-box-border-color-*` border and, on focus, a `--ui-focus-error` ring —\n// scoped with `not-aria-[invalid]` so it wins over the hover/focus border. Box\n// geometry (32px height, 4px radius, 12px padding-x) comes from\n// `--ui-input-text-global-box-*`. Label, description, and error message are\n// composed by the consumer (a Field component is future work).\nexport type InputBoxProps = React.ComponentPropsWithoutRef<'input'>;\n\nconst InputBox = React.forwardRef<HTMLInputElement, InputBoxProps>(\n ({ className, type = 'text', ...props }, ref) => (\n <input\n ref={ref}\n type={type}\n className={cn(\n 'h-[var(--ui-input-text-global-box-height)] w-full min-w-0 rounded-[var(--ui-input-text-global-box-border-radius)] border bg-[var(--ui-input-text-global-box-color-idle)] border-[var(--ui-input-text-normal-box-border-color-idle)] px-[var(--ui-input-text-global-box-padding-x)] text-sm leading-6 text-[var(--ui-input-text-global-value-color-idle)] transition-colors placeholder:text-[var(--ui-input-text-global-placeholder-color-idle)] focus-visible:outline-none focus-visible:ring-[3px] enabled:not-aria-[invalid=true]:hover:border-[var(--ui-input-text-normal-box-border-color-hover)] enabled:not-aria-[invalid=true]:hover:bg-[var(--ui-input-text-global-box-color-hover)] not-aria-[invalid=true]:focus-visible:border-[var(--ui-input-text-normal-box-border-color-hover)] not-aria-[invalid=true]:focus-visible:ring-[var(--ui-focus-primary)] aria-[invalid=true]:border-[var(--ui-input-text-error-msg-box-border-color-idle)] aria-[invalid=true]:focus-visible:ring-[var(--ui-focus-error)] disabled:cursor-not-allowed disabled:border-[var(--ui-input-text-normal-box-border-color-disabled)] disabled:bg-[var(--ui-input-text-global-box-color-disabled)] disabled:text-[var(--ui-input-text-global-value-color-disabled)] disabled:placeholder:text-[var(--ui-input-text-global-placeholder-color-disabled)]',\n className\n )}\n {...props}\n />\n )\n);\nInputBox.displayName = 'InputBox';\n\nexport { InputBox };\n"],"names":["InputBox","React","className","type","props","ref","jsx","cn"],"mappings":";;;AAoBA,MAAMA,IAAWC,EAAM;AAAA,EACrB,CAAC,EAAE,WAAAC,GAAW,MAAAC,IAAO,QAAQ,GAAGC,EAAA,GAASC,MACvC,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAD;AAAA,MACA,MAAAF;AAAA,MACA,WAAWI;AAAA,QACT;AAAA,QACAL;AAAA,MAAA;AAAA,MAED,GAAGE;AAAA,IAAA;AAAA,EAAA;AAGV;AACAJ,EAAS,cAAc;"}
1
+ {"version":3,"file":"input.js","sources":["../../../../src/components/ui/input/input.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\n// The bare single-line input box behind the public `InputText` field (which is\n// also exported as `Input`). Exported in its own right for pairing with `Field`\n// (`<FieldControl render={<InputBox />} />`) — use `InputText` when a bundled\n// label/description/error is wanted instead. Themed by the dedicated next-gen `--ui-input-text-*`\n// token tier from @acronis-platform/tokens-pd. The box fill (`global-box-color-*`)\n// and the normal border (`normal-box-border-color-*`) are wired per state: idle /\n// hover / focus / disabled. The `normal-box-border-color-*` tier has no `-active`,\n// so focus reuses `-hover` for the border, paired with a 3px `--ui-focus-primary`\n// ring. Value and placeholder text use `global-value-color-*` /\n// `global-placeholder-color-*`. The error state is driven by `aria-invalid` —\n// `error-msg-box-border-color-*` border and, on focus, a `--ui-focus-error` ring —\n// scoped with `not-aria-[invalid]` so it wins over the hover/focus border. Box\n// geometry (32px height, 4px radius, 12px padding-x) comes from\n// `--ui-input-text-global-box-*`. Label, description, and error message are\n// composed by the consumer (a Field component is future work).\nexport type InputBoxProps = React.ComponentPropsWithoutRef<'input'>;\n\nconst InputBox = React.forwardRef<HTMLInputElement, InputBoxProps>(\n ({ className, type = 'text', ...props }, ref) => (\n <input\n ref={ref}\n type={type}\n className={cn(\n 'h-[var(--ui-input-text-global-box-height)] w-full min-w-0 rounded-[var(--ui-input-text-global-box-border-radius)] border bg-[var(--ui-input-text-global-box-color-idle)] border-[var(--ui-input-text-normal-box-border-color-idle)] px-[var(--ui-input-text-global-box-padding-x)] text-sm leading-6 text-[var(--ui-input-text-global-value-color-idle)] transition-colors placeholder:text-[var(--ui-input-text-global-placeholder-color-idle)] focus-visible:outline-none focus-visible:ring-[3px] enabled:not-aria-[invalid=true]:hover:border-[var(--ui-input-text-normal-box-border-color-hover)] enabled:not-aria-[invalid=true]:hover:bg-[var(--ui-input-text-global-box-color-hover)] not-aria-[invalid=true]:focus-visible:border-[var(--ui-input-text-normal-box-border-color-hover)] not-aria-[invalid=true]:focus-visible:ring-[var(--ui-focus-primary)] aria-[invalid=true]:border-[var(--ui-input-text-error-msg-box-border-color-idle)] aria-[invalid=true]:focus-visible:ring-[var(--ui-focus-error)] disabled:cursor-not-allowed disabled:border-[var(--ui-input-text-normal-box-border-color-disabled)] disabled:bg-[var(--ui-input-text-global-box-color-disabled)] disabled:text-[var(--ui-input-text-global-value-color-disabled)] disabled:placeholder:text-[var(--ui-input-text-global-placeholder-color-disabled)]',\n className\n )}\n {...props}\n />\n )\n);\nInputBox.displayName = 'InputBox';\n\nexport { InputBox };\n"],"names":["InputBox","React","className","type","props","ref","jsx","cn"],"mappings":";;;AAqBA,MAAMA,IAAWC,EAAM;AAAA,EACrB,CAAC,EAAE,WAAAC,GAAW,MAAAC,IAAO,QAAQ,GAAGC,EAAA,GAASC,MACvC,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAD;AAAA,MACA,MAAAF;AAAA,MACA,WAAWI;AAAA,QACT;AAAA,QACAL;AAAA,MAAA;AAAA,MAED,GAAGE;AAAA,IAAA;AAAA,EAAA;AAGV;AACAJ,EAAS,cAAc;"}