@brycks/core-front 0.3.0 → 0.3.2

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 (110) hide show
  1. package/dist/components/data/List/List.cjs +1 -1
  2. package/dist/components/data/List/List.cjs.map +1 -1
  3. package/dist/components/data/List/List.js +92 -88
  4. package/dist/components/data/List/List.js.map +1 -1
  5. package/dist/components/data/Table/Table.cjs +1 -1
  6. package/dist/components/data/Table/Table.cjs.map +1 -1
  7. package/dist/components/data/Table/Table.js +129 -125
  8. package/dist/components/data/Table/Table.js.map +1 -1
  9. package/dist/components/data/TreeView/TreeView.cjs +2 -0
  10. package/dist/components/data/TreeView/TreeView.cjs.map +1 -0
  11. package/dist/components/data/TreeView/TreeView.js +256 -0
  12. package/dist/components/data/TreeView/TreeView.js.map +1 -0
  13. package/dist/components/data/VirtualList/VirtualList.cjs +2 -0
  14. package/dist/components/data/VirtualList/VirtualList.cjs.map +1 -0
  15. package/dist/components/data/VirtualList/VirtualList.js +186 -0
  16. package/dist/components/data/VirtualList/VirtualList.js.map +1 -0
  17. package/dist/components/data.cjs +1 -1
  18. package/dist/components/data.js +21 -16
  19. package/dist/components/data.js.map +1 -1
  20. package/dist/components/feedback/Modal/Modal.cjs +1 -1
  21. package/dist/components/feedback/Modal/Modal.cjs.map +1 -1
  22. package/dist/components/feedback/Modal/Modal.js +81 -77
  23. package/dist/components/feedback/Modal/Modal.js.map +1 -1
  24. package/dist/components/form/Combobox/Combobox.cjs +7 -0
  25. package/dist/components/form/Combobox/Combobox.cjs.map +1 -0
  26. package/dist/components/form/Combobox/Combobox.js +338 -0
  27. package/dist/components/form/Combobox/Combobox.js.map +1 -0
  28. package/dist/components/form/DateRangePicker/DateRangePicker.cjs +2 -0
  29. package/dist/components/form/DateRangePicker/DateRangePicker.cjs.map +1 -0
  30. package/dist/components/form/DateRangePicker/DateRangePicker.js +372 -0
  31. package/dist/components/form/DateRangePicker/DateRangePicker.js.map +1 -0
  32. package/dist/components/form/MultiSelect/MultiSelect.cjs +2 -0
  33. package/dist/components/form/MultiSelect/MultiSelect.cjs.map +1 -0
  34. package/dist/components/form/MultiSelect/MultiSelect.js +393 -0
  35. package/dist/components/form/MultiSelect/MultiSelect.js.map +1 -0
  36. package/dist/components/form/Rating/Rating.cjs +2 -0
  37. package/dist/components/form/Rating/Rating.cjs.map +1 -0
  38. package/dist/components/form/Rating/Rating.js +163 -0
  39. package/dist/components/form/Rating/Rating.js.map +1 -0
  40. package/dist/components/form/Slider/Slider.cjs +1 -1
  41. package/dist/components/form/Slider/Slider.cjs.map +1 -1
  42. package/dist/components/form/Slider/Slider.js +120 -85
  43. package/dist/components/form/Slider/Slider.js.map +1 -1
  44. package/dist/components/form/TagInput/TagInput.cjs +2 -0
  45. package/dist/components/form/TagInput/TagInput.cjs.map +1 -0
  46. package/dist/components/form/TagInput/TagInput.js +286 -0
  47. package/dist/components/form/TagInput/TagInput.js.map +1 -0
  48. package/dist/components/form/TimePicker/TimePicker.cjs +2 -0
  49. package/dist/components/form/TimePicker/TimePicker.cjs.map +1 -0
  50. package/dist/components/form/TimePicker/TimePicker.js +328 -0
  51. package/dist/components/form/TimePicker/TimePicker.js.map +1 -0
  52. package/dist/components/form.cjs +1 -1
  53. package/dist/components/form.js +34 -22
  54. package/dist/components/form.js.map +1 -1
  55. package/dist/components/layout/Card/Card.cjs +1 -1
  56. package/dist/components/layout/Card/Card.cjs.map +1 -1
  57. package/dist/components/layout/Card/Card.js +62 -59
  58. package/dist/components/layout/Card/Card.js.map +1 -1
  59. package/dist/components/layout/Collapse/Collapse.cjs +2 -0
  60. package/dist/components/layout/Collapse/Collapse.cjs.map +1 -0
  61. package/dist/components/layout/Collapse/Collapse.js +140 -0
  62. package/dist/components/layout/Collapse/Collapse.js.map +1 -0
  63. package/dist/components/layout.cjs +1 -1
  64. package/dist/components/layout.js +27 -24
  65. package/dist/components/layout.js.map +1 -1
  66. package/dist/components/navigation/Breadcrumb/Breadcrumb.cjs +1 -1
  67. package/dist/components/navigation/Breadcrumb/Breadcrumb.cjs.map +1 -1
  68. package/dist/components/navigation/Breadcrumb/Breadcrumb.js +66 -62
  69. package/dist/components/navigation/Breadcrumb/Breadcrumb.js.map +1 -1
  70. package/dist/components/navigation/ContextMenu/ContextMenu.cjs +2 -0
  71. package/dist/components/navigation/ContextMenu/ContextMenu.cjs.map +1 -0
  72. package/dist/components/navigation/ContextMenu/ContextMenu.js +227 -0
  73. package/dist/components/navigation/ContextMenu/ContextMenu.js.map +1 -0
  74. package/dist/components/navigation/Dropdown/Dropdown.cjs +2 -2
  75. package/dist/components/navigation/Dropdown/Dropdown.cjs.map +1 -1
  76. package/dist/components/navigation/Dropdown/Dropdown.js +84 -80
  77. package/dist/components/navigation/Dropdown/Dropdown.js.map +1 -1
  78. package/dist/components/navigation/Menu/Menu.cjs +1 -1
  79. package/dist/components/navigation/Menu/Menu.cjs.map +1 -1
  80. package/dist/components/navigation/Menu/Menu.js +132 -94
  81. package/dist/components/navigation/Menu/Menu.js.map +1 -1
  82. package/dist/components/navigation/Pagination/Pagination.cjs +1 -1
  83. package/dist/components/navigation/Pagination/Pagination.cjs.map +1 -1
  84. package/dist/components/navigation/Pagination/Pagination.js +111 -107
  85. package/dist/components/navigation/Pagination/Pagination.js.map +1 -1
  86. package/dist/components/navigation/Stepper/Stepper.cjs +2 -0
  87. package/dist/components/navigation/Stepper/Stepper.cjs.map +1 -0
  88. package/dist/components/navigation/Stepper/Stepper.js +187 -0
  89. package/dist/components/navigation/Stepper/Stepper.js.map +1 -0
  90. package/dist/components/navigation.cjs +1 -1
  91. package/dist/components/navigation.js +27 -21
  92. package/dist/components/navigation.js.map +1 -1
  93. package/dist/components/utility/Badge/Badge.cjs +1 -1
  94. package/dist/components/utility/Badge/Badge.cjs.map +1 -1
  95. package/dist/components/utility/Badge/Badge.js +38 -35
  96. package/dist/components/utility/Badge/Badge.js.map +1 -1
  97. package/dist/data.d.ts +116 -0
  98. package/dist/form.d.ts +316 -0
  99. package/dist/hooks/useInteractionState.cjs +2 -0
  100. package/dist/hooks/useInteractionState.cjs.map +1 -0
  101. package/dist/hooks/useInteractionState.js +67 -0
  102. package/dist/hooks/useInteractionState.js.map +1 -0
  103. package/dist/hooks.cjs +1 -1
  104. package/dist/hooks.d.ts +87 -0
  105. package/dist/hooks.js +16 -14
  106. package/dist/hooks.js.map +1 -1
  107. package/dist/layout.d.ts +44 -0
  108. package/dist/navigation.d.ts +88 -0
  109. package/dist/styles.css +1 -1
  110. package/package.json +1 -1
@@ -1,247 +1,251 @@
1
- import { jsx as a, jsxs as k } from "react/jsx-runtime";
2
- import { forwardRef as c, createContext as C, useContext as w } from "react";
3
- import { cx as b } from "../../../utils/styles.js";
4
- const h = C({ size: "md", variant: "default" });
5
- function m() {
6
- return w(h);
1
+ import { jsx as r, jsxs as w } from "react/jsx-runtime";
2
+ import { forwardRef as b, createContext as P, useContext as z } from "react";
3
+ import { cx as p } from "../../../utils/styles.js";
4
+ import { durations as v, easings as T } from "../../../design-system/tokens/motion.js";
5
+ import { componentPaddingX as c, componentPaddingY as S, componentGap as L } from "../../../design-system/primitives/sizing.js";
6
+ import { spacing as h } from "../../../design-system/tokens/spacing.js";
7
+ import { fontSizes as m } from "../../../design-system/tokens/typography.js";
8
+ const N = P({ size: "md", variant: "default" });
9
+ function x() {
10
+ return z(N);
7
11
  }
8
- const v = {
9
- sm: { fontSize: 13, padding: "8px 12px", headerPadding: "8px 12px" },
10
- md: { fontSize: 14, padding: "12px 16px", headerPadding: "12px 16px" },
11
- lg: { fontSize: 15, padding: "16px 20px", headerPadding: "14px 20px" }
12
- }, S = c(function({
12
+ const C = {
13
+ sm: { fontSize: m.base - 1, paddingY: S.md, paddingX: c.sm, headerPaddingY: S.md, headerPaddingX: c.sm },
14
+ md: { fontSize: m.base, paddingY: c.sm, paddingX: c.md, headerPaddingY: c.sm, headerPaddingX: c.md },
15
+ lg: { fontSize: m.base + 1, paddingY: c.md, paddingX: c.lg, headerPaddingY: h[3.5], headerPaddingX: c.lg }
16
+ }, X = b(function({
13
17
  size: e = "md",
14
18
  variant: t = "default",
15
- stickyHeader: l = !1,
19
+ stickyHeader: n = !1,
16
20
  loading: o = !1,
17
- className: r,
18
- style: n,
19
- children: s,
21
+ className: a,
22
+ style: l,
23
+ children: d,
20
24
  testId: y,
21
- ...p
25
+ ...f
22
26
  }, i) {
23
- const f = {
27
+ const u = {
24
28
  position: "relative",
25
29
  width: "100%",
26
30
  overflow: "auto",
27
- ...n
28
- }, u = {
31
+ ...l
32
+ }, g = {
29
33
  width: "100%",
30
34
  borderCollapse: t === "bordered" ? "separate" : "collapse",
31
35
  borderSpacing: 0,
32
- fontSize: v[e].fontSize,
36
+ fontSize: C[e].fontSize,
33
37
  opacity: o ? 0.6 : 1,
34
- transition: "opacity 150ms ease-out"
38
+ transition: `opacity ${v.quick}ms ${T.easeOut}`
35
39
  };
36
- return /* @__PURE__ */ a(h.Provider, { value: { size: e, variant: t }, children: /* @__PURE__ */ a("div", { className: "brycks-table-container", style: f, children: /* @__PURE__ */ a(
40
+ return /* @__PURE__ */ r(N.Provider, { value: { size: e, variant: t }, children: /* @__PURE__ */ r("div", { className: "brycks-table-container", style: u, children: /* @__PURE__ */ r(
37
41
  "table",
38
42
  {
39
43
  ref: i,
40
- className: b("brycks-table", `brycks-table--${e}`, `brycks-table--${t}`, r),
41
- style: u,
44
+ className: p("brycks-table", `brycks-table--${e}`, `brycks-table--${t}`, a),
45
+ style: g,
42
46
  "data-testid": y,
43
- ...p,
44
- children: s
47
+ ...f,
48
+ children: d
45
49
  }
46
50
  ) }) });
47
51
  });
48
- S.displayName = "Table";
49
- const N = c(function({ sticky: e = !1, className: t, style: l, children: o, ...r }, n) {
50
- const s = {
52
+ X.displayName = "Table";
53
+ const Y = b(function({ sticky: e = !1, className: t, style: n, children: o, ...a }, l) {
54
+ const d = {
51
55
  backgroundColor: "var(--brycks-background-muted)",
52
56
  position: e ? "sticky" : void 0,
53
57
  top: e ? 0 : void 0,
54
58
  zIndex: e ? 1 : void 0,
55
- ...l
59
+ ...n
56
60
  };
57
- return /* @__PURE__ */ a(
61
+ return /* @__PURE__ */ r(
58
62
  "thead",
59
63
  {
60
- ref: n,
61
- className: b("brycks-table-head", e && "brycks-table-head--sticky", t),
62
- style: s,
63
- ...r,
64
+ ref: l,
65
+ className: p("brycks-table-head", e && "brycks-table-head--sticky", t),
66
+ style: d,
67
+ ...a,
64
68
  children: o
65
69
  }
66
70
  );
67
71
  });
68
- N.displayName = "TableHead";
69
- const H = c(function({ className: e, style: t, children: l, ...o }, r) {
70
- const n = {
72
+ Y.displayName = "TableHead";
73
+ const M = b(function({ className: e, style: t, children: n, ...o }, a) {
74
+ const l = {
71
75
  ...t
72
76
  };
73
- return /* @__PURE__ */ a(
77
+ return /* @__PURE__ */ r(
74
78
  "tbody",
75
79
  {
76
- ref: r,
77
- className: b("brycks-table-body", e),
78
- style: n,
80
+ ref: a,
81
+ className: p("brycks-table-body", e),
82
+ style: l,
79
83
  ...o,
80
- children: l
84
+ children: n
81
85
  }
82
86
  );
83
87
  });
84
- H.displayName = "TableBody";
85
- const L = c(function({ selected: e = !1, clickable: t = !1, className: l, style: o, children: r, ...n }, s) {
86
- const { variant: y } = m(), p = {
88
+ M.displayName = "TableBody";
89
+ const B = b(function({ selected: e = !1, clickable: t = !1, className: n, style: o, children: a, ...l }, d) {
90
+ const { variant: y } = x(), f = {
87
91
  backgroundColor: e ? "var(--brycks-primary-50)" : "transparent",
88
92
  borderBottom: y !== "bordered" ? "1px solid var(--brycks-border-muted)" : void 0,
89
93
  cursor: t ? "pointer" : void 0,
90
- transition: "background-color 150ms ease-out",
94
+ transition: `background-color ${v.quick}ms ${T.easeOut}`,
91
95
  ...o
92
96
  };
93
- return /* @__PURE__ */ a(
97
+ return /* @__PURE__ */ r(
94
98
  "tr",
95
99
  {
96
- ref: s,
97
- className: b(
100
+ ref: d,
101
+ className: p(
98
102
  "brycks-table-row",
99
103
  e && "brycks-table-row--selected",
100
104
  t && "brycks-table-row--clickable",
101
- l
105
+ n
102
106
  ),
103
- style: p,
107
+ style: f,
104
108
  onMouseEnter: (i) => {
105
109
  t && !e && (i.currentTarget.style.backgroundColor = "var(--brycks-background-muted)");
106
110
  },
107
111
  onMouseLeave: (i) => {
108
112
  e || (i.currentTarget.style.backgroundColor = "transparent");
109
113
  },
110
- ...n,
111
- children: r
114
+ ...l,
115
+ children: a
112
116
  }
113
117
  );
114
118
  });
115
- L.displayName = "TableRow";
116
- function z({ direction: d }) {
117
- return d ? /* @__PURE__ */ a("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", children: d === "asc" ? /* @__PURE__ */ a("path", { d: "M7 3L10 6H4L7 3Z", fill: "currentColor" }) : /* @__PURE__ */ a("path", { d: "M7 11L4 8H10L7 11Z", fill: "currentColor" }) }) : /* @__PURE__ */ k("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", style: { opacity: 0.4 }, children: [
118
- /* @__PURE__ */ a("path", { d: "M7 3L10 6H4L7 3Z", fill: "currentColor" }),
119
- /* @__PURE__ */ a("path", { d: "M7 11L4 8H10L7 11Z", fill: "currentColor" })
119
+ B.displayName = "TableRow";
120
+ function A({ direction: s }) {
121
+ return s ? /* @__PURE__ */ r("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", children: s === "asc" ? /* @__PURE__ */ r("path", { d: "M7 3L10 6H4L7 3Z", fill: "currentColor" }) : /* @__PURE__ */ r("path", { d: "M7 11L4 8H10L7 11Z", fill: "currentColor" }) }) : /* @__PURE__ */ w("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", style: { opacity: 0.4 }, children: [
122
+ /* @__PURE__ */ r("path", { d: "M7 3L10 6H4L7 3Z", fill: "currentColor" }),
123
+ /* @__PURE__ */ r("path", { d: "M7 11L4 8H10L7 11Z", fill: "currentColor" })
120
124
  ] });
121
125
  }
122
- const M = c(function({
126
+ const O = b(function({
123
127
  sortable: e = !1,
124
128
  sortDirection: t = null,
125
- onSort: l,
129
+ onSort: n,
126
130
  align: o = "left",
127
- className: r,
128
- style: n,
129
- children: s,
131
+ className: a,
132
+ style: l,
133
+ children: d,
130
134
  ...y
131
- }, p) {
132
- const { size: i } = m(), u = {
133
- padding: v[i].headerPadding,
135
+ }, f) {
136
+ const { size: i } = x(), u = C[i], g = {
137
+ padding: `${u.headerPaddingY}px ${u.headerPaddingX}px`,
134
138
  fontWeight: 600,
135
139
  color: "var(--brycks-foreground-muted)",
136
140
  textAlign: o,
137
141
  whiteSpace: "nowrap",
138
142
  cursor: e ? "pointer" : void 0,
139
143
  userSelect: e ? "none" : void 0,
140
- transition: "color 150ms ease-out",
141
- ...n
142
- }, x = {
144
+ transition: `color ${v.quick}ms ${T.easeOut}`,
145
+ ...l
146
+ }, $ = {
143
147
  display: "flex",
144
148
  alignItems: "center",
145
- gap: 6,
149
+ gap: L.sm,
146
150
  justifyContent: o === "right" ? "flex-end" : o === "center" ? "center" : "flex-start"
147
- }, T = () => {
148
- e && l && l();
151
+ }, H = () => {
152
+ e && n && n();
149
153
  };
150
- return /* @__PURE__ */ a(
154
+ return /* @__PURE__ */ r(
151
155
  "th",
152
156
  {
153
- ref: p,
154
- className: b("brycks-table-header", e && "brycks-table-header--sortable", r),
155
- style: u,
156
- onClick: T,
157
- onMouseEnter: (g) => {
158
- e && (g.currentTarget.style.color = "var(--brycks-foreground-default)");
157
+ ref: f,
158
+ className: p("brycks-table-header", e && "brycks-table-header--sortable", a),
159
+ style: g,
160
+ onClick: H,
161
+ onMouseEnter: (k) => {
162
+ e && (k.currentTarget.style.color = "var(--brycks-foreground-default)");
159
163
  },
160
- onMouseLeave: (g) => {
161
- g.currentTarget.style.color = "var(--brycks-foreground-muted)";
164
+ onMouseLeave: (k) => {
165
+ k.currentTarget.style.color = "var(--brycks-foreground-muted)";
162
166
  },
163
167
  ...y,
164
- children: /* @__PURE__ */ k("span", { style: x, children: [
165
- s,
166
- e && /* @__PURE__ */ a(z, { direction: t })
168
+ children: /* @__PURE__ */ w("span", { style: $, children: [
169
+ d,
170
+ e && /* @__PURE__ */ r(A, { direction: t })
167
171
  ] })
168
172
  }
169
173
  );
170
174
  });
171
- M.displayName = "TableHeader";
172
- const B = c(function({ align: e = "left", truncate: t = !1, className: l, style: o, children: r, ...n }, s) {
173
- const { size: y, variant: p } = m(), f = {
174
- padding: v[y].padding,
175
+ O.displayName = "TableHeader";
176
+ const R = b(function({ align: e = "left", truncate: t = !1, className: n, style: o, children: a, ...l }, d) {
177
+ const { size: y, variant: f } = x(), i = C[y], u = {
178
+ padding: `${i.paddingY}px ${i.paddingX}px`,
175
179
  color: "var(--brycks-foreground-default)",
176
180
  textAlign: e,
177
181
  verticalAlign: "middle",
178
- border: p === "bordered" ? "1px solid var(--brycks-border-muted)" : void 0,
182
+ border: f === "bordered" ? "1px solid var(--brycks-border-muted)" : void 0,
179
183
  maxWidth: t ? 200 : void 0,
180
184
  overflow: t ? "hidden" : void 0,
181
185
  textOverflow: t ? "ellipsis" : void 0,
182
186
  whiteSpace: t ? "nowrap" : void 0,
183
187
  ...o
184
188
  };
185
- return /* @__PURE__ */ a(
189
+ return /* @__PURE__ */ r(
186
190
  "td",
187
191
  {
188
- ref: s,
189
- className: b("brycks-table-cell", t && "brycks-table-cell--truncate", l),
190
- style: f,
191
- title: t && typeof r == "string" ? r : void 0,
192
- ...n,
193
- children: r
192
+ ref: d,
193
+ className: p("brycks-table-cell", t && "brycks-table-cell--truncate", n),
194
+ style: u,
195
+ title: t && typeof a == "string" ? a : void 0,
196
+ ...l,
197
+ children: a
194
198
  }
195
199
  );
196
200
  });
197
- B.displayName = "TableCell";
198
- const P = c(function({ className: e, style: t, children: l, ...o }, r) {
199
- const n = {
201
+ R.displayName = "TableCell";
202
+ const Z = b(function({ className: e, style: t, children: n, ...o }, a) {
203
+ const l = {
200
204
  backgroundColor: "var(--brycks-background-muted)",
201
205
  fontWeight: 500,
202
206
  ...t
203
207
  };
204
- return /* @__PURE__ */ a(
208
+ return /* @__PURE__ */ r(
205
209
  "tfoot",
206
210
  {
207
- ref: r,
208
- className: b("brycks-table-foot", e),
209
- style: n,
211
+ ref: a,
212
+ className: p("brycks-table-foot", e),
213
+ style: l,
210
214
  ...o,
211
- children: l
215
+ children: n
212
216
  }
213
217
  );
214
218
  });
215
- P.displayName = "TableFoot";
216
- const A = c(function({ placement: e = "bottom", className: t, style: l, children: o, ...r }, n) {
217
- const s = {
219
+ Z.displayName = "TableFoot";
220
+ const j = b(function({ placement: e = "bottom", className: t, style: n, children: o, ...a }, l) {
221
+ const d = {
218
222
  captionSide: e,
219
- padding: "12px 16px",
220
- fontSize: 13,
223
+ padding: `${h[3]}px ${h[4]}px`,
224
+ fontSize: m.base - 1,
221
225
  color: "var(--brycks-foreground-muted)",
222
226
  textAlign: "left",
223
- ...l
227
+ ...n
224
228
  };
225
- return /* @__PURE__ */ a(
229
+ return /* @__PURE__ */ r(
226
230
  "caption",
227
231
  {
228
- ref: n,
229
- className: b("brycks-table-caption", t),
230
- style: s,
231
- ...r,
232
+ ref: l,
233
+ className: p("brycks-table-caption", t),
234
+ style: d,
235
+ ...a,
232
236
  children: o
233
237
  }
234
238
  );
235
239
  });
236
- A.displayName = "TableCaption";
240
+ j.displayName = "TableCaption";
237
241
  export {
238
- S as Table,
239
- H as TableBody,
240
- A as TableCaption,
241
- B as TableCell,
242
- P as TableFoot,
243
- N as TableHead,
244
- M as TableHeader,
245
- L as TableRow
242
+ X as Table,
243
+ M as TableBody,
244
+ j as TableCaption,
245
+ R as TableCell,
246
+ Z as TableFoot,
247
+ Y as TableHead,
248
+ O as TableHeader,
249
+ B as TableRow
246
250
  };
247
251
  //# sourceMappingURL=Table.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Table.js","sources":["../../../../src/components/data/Table/Table.tsx"],"sourcesContent":["/**\n * Table Component\n *\n * A flexible table component with sorting, selection, and responsive support.\n * Follows design system patterns for consistent styling.\n */\n\nimport {\n forwardRef,\n createContext,\n useContext,\n type CSSProperties,\n type HTMLAttributes,\n type ThHTMLAttributes,\n type TdHTMLAttributes,\n} from 'react'\nimport { cx } from '../../../utils/styles'\n\nexport type TableSize = 'sm' | 'md' | 'lg'\nexport type TableVariant = 'default' | 'striped' | 'bordered'\n\ninterface TableContextValue {\n size: TableSize\n variant: TableVariant\n}\n\nconst TableContext = createContext<TableContextValue>({ size: 'md', variant: 'default' })\n\nfunction useTableContext() {\n return useContext(TableContext)\n}\n\nexport interface TableProps extends HTMLAttributes<HTMLTableElement> {\n /** Table size */\n size?: TableSize\n /** Table variant */\n variant?: TableVariant\n /** Whether the table has a sticky header */\n stickyHeader?: boolean\n /** Whether the table is in a loading state */\n loading?: boolean\n /** Custom class name */\n className?: string\n /** Test ID */\n testId?: string\n}\n\nconst sizeConfig: Record<TableSize, { fontSize: number; padding: string; headerPadding: string }> = {\n sm: { fontSize: 13, padding: '8px 12px', headerPadding: '8px 12px' },\n md: { fontSize: 14, padding: '12px 16px', headerPadding: '12px 16px' },\n lg: { fontSize: 15, padding: '16px 20px', headerPadding: '14px 20px' },\n}\n\nexport const Table = forwardRef<HTMLTableElement, TableProps>(function Table(\n {\n size = 'md',\n variant = 'default',\n stickyHeader: _stickyHeader = false,\n loading = false,\n className,\n style,\n children,\n testId,\n ...props\n },\n ref\n) {\n const containerStyle: CSSProperties = {\n position: 'relative',\n width: '100%',\n overflow: 'auto',\n ...style,\n }\n\n const tableStyle: CSSProperties = {\n width: '100%',\n borderCollapse: variant === 'bordered' ? 'separate' : 'collapse',\n borderSpacing: 0,\n fontSize: sizeConfig[size].fontSize,\n opacity: loading ? 0.6 : 1,\n transition: 'opacity 150ms ease-out',\n }\n\n return (\n <TableContext.Provider value={{ size, variant }}>\n <div className=\"brycks-table-container\" style={containerStyle}>\n <table\n ref={ref}\n className={cx('brycks-table', `brycks-table--${size}`, `brycks-table--${variant}`, className)}\n style={tableStyle}\n data-testid={testId}\n {...props}\n >\n {children}\n </table>\n </div>\n </TableContext.Provider>\n )\n})\n\nTable.displayName = 'Table'\n\n// TableHead\nexport interface TableHeadProps extends HTMLAttributes<HTMLTableSectionElement> {\n /** Whether the header is sticky */\n sticky?: boolean\n /** Custom class name */\n className?: string\n}\n\nexport const TableHead = forwardRef<HTMLTableSectionElement, TableHeadProps>(function TableHead(\n { sticky = false, className, style, children, ...props },\n ref\n) {\n const headStyle: CSSProperties = {\n backgroundColor: 'var(--brycks-background-muted)',\n position: sticky ? 'sticky' : undefined,\n top: sticky ? 0 : undefined,\n zIndex: sticky ? 1 : undefined,\n ...style,\n }\n\n return (\n <thead\n ref={ref}\n className={cx('brycks-table-head', sticky && 'brycks-table-head--sticky', className)}\n style={headStyle}\n {...props}\n >\n {children}\n </thead>\n )\n})\n\nTableHead.displayName = 'TableHead'\n\n// TableBody\nexport interface TableBodyProps extends HTMLAttributes<HTMLTableSectionElement> {\n /** Custom class name */\n className?: string\n}\n\nexport const TableBody = forwardRef<HTMLTableSectionElement, TableBodyProps>(function TableBody(\n { className, style, children, ...props },\n ref\n) {\n const bodyStyle: CSSProperties = {\n ...style,\n }\n\n return (\n <tbody\n ref={ref}\n className={cx('brycks-table-body', className)}\n style={bodyStyle}\n {...props}\n >\n {children}\n </tbody>\n )\n})\n\nTableBody.displayName = 'TableBody'\n\n// TableRow\nexport interface TableRowProps extends HTMLAttributes<HTMLTableRowElement> {\n /** Whether the row is selected */\n selected?: boolean\n /** Whether the row is clickable */\n clickable?: boolean\n /** Custom class name */\n className?: string\n}\n\nexport const TableRow = forwardRef<HTMLTableRowElement, TableRowProps>(function TableRow(\n { selected = false, clickable = false, className, style, children, ...props },\n ref\n) {\n const { variant } = useTableContext()\n\n const rowStyle: CSSProperties = {\n backgroundColor: selected\n ? 'var(--brycks-primary-50)'\n : 'transparent',\n borderBottom: variant !== 'bordered' ? '1px solid var(--brycks-border-muted)' : undefined,\n cursor: clickable ? 'pointer' : undefined,\n transition: 'background-color 150ms ease-out',\n ...style,\n }\n\n return (\n <tr\n ref={ref}\n className={cx(\n 'brycks-table-row',\n selected && 'brycks-table-row--selected',\n clickable && 'brycks-table-row--clickable',\n className\n )}\n style={rowStyle}\n onMouseEnter={(e) => {\n if (clickable && !selected) {\n e.currentTarget.style.backgroundColor = 'var(--brycks-background-muted)'\n }\n }}\n onMouseLeave={(e) => {\n if (!selected) {\n e.currentTarget.style.backgroundColor = 'transparent'\n }\n }}\n {...props}\n >\n {children}\n </tr>\n )\n})\n\nTableRow.displayName = 'TableRow'\n\n// TableHeader (th)\nexport interface TableHeaderProps extends ThHTMLAttributes<HTMLTableCellElement> {\n /** Whether the column is sortable */\n sortable?: boolean\n /** Sort direction */\n sortDirection?: 'asc' | 'desc' | null\n /** Callback when sort is requested */\n onSort?: () => void\n /** Text alignment */\n align?: 'left' | 'center' | 'right'\n /** Custom class name */\n className?: string\n}\n\nfunction SortIcon({ direction }: { direction: 'asc' | 'desc' | null }) {\n if (!direction) {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" style={{ opacity: 0.4 }}>\n <path d=\"M7 3L10 6H4L7 3Z\" fill=\"currentColor\" />\n <path d=\"M7 11L4 8H10L7 11Z\" fill=\"currentColor\" />\n </svg>\n )\n }\n\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n {direction === 'asc' ? (\n <path d=\"M7 3L10 6H4L7 3Z\" fill=\"currentColor\" />\n ) : (\n <path d=\"M7 11L4 8H10L7 11Z\" fill=\"currentColor\" />\n )}\n </svg>\n )\n}\n\nexport const TableHeader = forwardRef<HTMLTableCellElement, TableHeaderProps>(function TableHeader(\n {\n sortable = false,\n sortDirection = null,\n onSort,\n align = 'left',\n className,\n style,\n children,\n ...props\n },\n ref\n) {\n const { size } = useTableContext()\n const config = sizeConfig[size]\n\n const headerStyle: CSSProperties = {\n padding: config.headerPadding,\n fontWeight: 600,\n color: 'var(--brycks-foreground-muted)',\n textAlign: align,\n whiteSpace: 'nowrap',\n cursor: sortable ? 'pointer' : undefined,\n userSelect: sortable ? 'none' : undefined,\n transition: 'color 150ms ease-out',\n ...style,\n }\n\n const contentStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n justifyContent: align === 'right' ? 'flex-end' : align === 'center' ? 'center' : 'flex-start',\n }\n\n const handleClick = () => {\n if (sortable && onSort) {\n onSort()\n }\n }\n\n return (\n <th\n ref={ref}\n className={cx('brycks-table-header', sortable && 'brycks-table-header--sortable', className)}\n style={headerStyle}\n onClick={handleClick}\n onMouseEnter={(e) => {\n if (sortable) {\n e.currentTarget.style.color = 'var(--brycks-foreground-default)'\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = 'var(--brycks-foreground-muted)'\n }}\n {...props}\n >\n <span style={contentStyle}>\n {children}\n {sortable && <SortIcon direction={sortDirection} />}\n </span>\n </th>\n )\n})\n\nTableHeader.displayName = 'TableHeader'\n\n// TableCell (td)\nexport interface TableCellProps extends TdHTMLAttributes<HTMLTableCellElement> {\n /** Text alignment */\n align?: 'left' | 'center' | 'right'\n /** Whether to truncate text */\n truncate?: boolean\n /** Custom class name */\n className?: string\n}\n\nexport const TableCell = forwardRef<HTMLTableCellElement, TableCellProps>(function TableCell(\n { align = 'left', truncate = false, className, style, children, ...props },\n ref\n) {\n const { size, variant } = useTableContext()\n const config = sizeConfig[size]\n\n const cellStyle: CSSProperties = {\n padding: config.padding,\n color: 'var(--brycks-foreground-default)',\n textAlign: align,\n verticalAlign: 'middle',\n border: variant === 'bordered' ? '1px solid var(--brycks-border-muted)' : undefined,\n maxWidth: truncate ? 200 : undefined,\n overflow: truncate ? 'hidden' : undefined,\n textOverflow: truncate ? 'ellipsis' : undefined,\n whiteSpace: truncate ? 'nowrap' : undefined,\n ...style,\n }\n\n return (\n <td\n ref={ref}\n className={cx('brycks-table-cell', truncate && 'brycks-table-cell--truncate', className)}\n style={cellStyle}\n title={truncate && typeof children === 'string' ? children : undefined}\n {...props}\n >\n {children}\n </td>\n )\n})\n\nTableCell.displayName = 'TableCell'\n\n// TableFoot\nexport interface TableFootProps extends HTMLAttributes<HTMLTableSectionElement> {\n /** Custom class name */\n className?: string\n}\n\nexport const TableFoot = forwardRef<HTMLTableSectionElement, TableFootProps>(function TableFoot(\n { className, style, children, ...props },\n ref\n) {\n const footStyle: CSSProperties = {\n backgroundColor: 'var(--brycks-background-muted)',\n fontWeight: 500,\n ...style,\n }\n\n return (\n <tfoot\n ref={ref}\n className={cx('brycks-table-foot', className)}\n style={footStyle}\n {...props}\n >\n {children}\n </tfoot>\n )\n})\n\nTableFoot.displayName = 'TableFoot'\n\n// TableCaption\nexport interface TableCaptionProps extends HTMLAttributes<HTMLTableCaptionElement> {\n /** Caption placement */\n placement?: 'top' | 'bottom'\n /** Custom class name */\n className?: string\n}\n\nexport const TableCaption = forwardRef<HTMLTableCaptionElement, TableCaptionProps>(function TableCaption(\n { placement = 'bottom', className, style, children, ...props },\n ref\n) {\n const captionStyle: CSSProperties = {\n captionSide: placement,\n padding: '12px 16px',\n fontSize: 13,\n color: 'var(--brycks-foreground-muted)',\n textAlign: 'left',\n ...style,\n }\n\n return (\n <caption\n ref={ref}\n className={cx('brycks-table-caption', className)}\n style={captionStyle}\n {...props}\n >\n {children}\n </caption>\n )\n})\n\nTableCaption.displayName = 'TableCaption'\n"],"names":["TableContext","createContext","useTableContext","useContext","sizeConfig","Table","forwardRef","size","variant","_stickyHeader","loading","className","style","children","testId","props","ref","containerStyle","tableStyle","jsx","cx","TableHead","sticky","headStyle","TableBody","bodyStyle","TableRow","selected","clickable","rowStyle","e","SortIcon","direction","jsxs","TableHeader","sortable","sortDirection","onSort","align","headerStyle","contentStyle","handleClick","TableCell","truncate","cellStyle","TableFoot","footStyle","TableCaption","placement","captionStyle"],"mappings":"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"}
1
+ {"version":3,"file":"Table.js","sources":["../../../../src/components/data/Table/Table.tsx"],"sourcesContent":["/**\n * Table Component\n *\n * A flexible table component with sorting, selection, and responsive support.\n * Follows design system patterns for consistent styling.\n */\n\nimport {\n forwardRef,\n createContext,\n useContext,\n type CSSProperties,\n type HTMLAttributes,\n type ThHTMLAttributes,\n type TdHTMLAttributes,\n} from 'react'\nimport { cx } from '../../../utils/styles'\nimport { spacing, fontSizes, durations, easings } from '../../../design-system'\nimport { componentGap, componentPaddingX, componentPaddingY } from '../../../design-system/primitives'\n\nexport type TableSize = 'sm' | 'md' | 'lg'\nexport type TableVariant = 'default' | 'striped' | 'bordered'\n\ninterface TableContextValue {\n size: TableSize\n variant: TableVariant\n}\n\nconst TableContext = createContext<TableContextValue>({ size: 'md', variant: 'default' })\n\nfunction useTableContext() {\n return useContext(TableContext)\n}\n\nexport interface TableProps extends HTMLAttributes<HTMLTableElement> {\n /** Table size */\n size?: TableSize\n /** Table variant */\n variant?: TableVariant\n /** Whether the table has a sticky header */\n stickyHeader?: boolean\n /** Whether the table is in a loading state */\n loading?: boolean\n /** Custom class name */\n className?: string\n /** Test ID */\n testId?: string\n}\n\nconst sizeConfig: Record<TableSize, { fontSize: number; paddingY: number; paddingX: number; headerPaddingY: number; headerPaddingX: number }> = {\n sm: { fontSize: fontSizes.base - 1, paddingY: componentPaddingY.md, paddingX: componentPaddingX.sm, headerPaddingY: componentPaddingY.md, headerPaddingX: componentPaddingX.sm },\n md: { fontSize: fontSizes.base, paddingY: componentPaddingX.sm, paddingX: componentPaddingX.md, headerPaddingY: componentPaddingX.sm, headerPaddingX: componentPaddingX.md },\n lg: { fontSize: fontSizes.base + 1, paddingY: componentPaddingX.md, paddingX: componentPaddingX.lg, headerPaddingY: spacing[3.5], headerPaddingX: componentPaddingX.lg },\n}\n\nexport const Table = forwardRef<HTMLTableElement, TableProps>(function Table(\n {\n size = 'md',\n variant = 'default',\n stickyHeader: _stickyHeader = false,\n loading = false,\n className,\n style,\n children,\n testId,\n ...props\n },\n ref\n) {\n const containerStyle: CSSProperties = {\n position: 'relative',\n width: '100%',\n overflow: 'auto',\n ...style,\n }\n\n const tableStyle: CSSProperties = {\n width: '100%',\n borderCollapse: variant === 'bordered' ? 'separate' : 'collapse',\n borderSpacing: 0,\n fontSize: sizeConfig[size].fontSize,\n opacity: loading ? 0.6 : 1,\n transition: `opacity ${durations.quick}ms ${easings.easeOut}`,\n }\n\n return (\n <TableContext.Provider value={{ size, variant }}>\n <div className=\"brycks-table-container\" style={containerStyle}>\n <table\n ref={ref}\n className={cx('brycks-table', `brycks-table--${size}`, `brycks-table--${variant}`, className)}\n style={tableStyle}\n data-testid={testId}\n {...props}\n >\n {children}\n </table>\n </div>\n </TableContext.Provider>\n )\n})\n\nTable.displayName = 'Table'\n\n// TableHead\nexport interface TableHeadProps extends HTMLAttributes<HTMLTableSectionElement> {\n /** Whether the header is sticky */\n sticky?: boolean\n /** Custom class name */\n className?: string\n}\n\nexport const TableHead = forwardRef<HTMLTableSectionElement, TableHeadProps>(function TableHead(\n { sticky = false, className, style, children, ...props },\n ref\n) {\n const headStyle: CSSProperties = {\n backgroundColor: 'var(--brycks-background-muted)',\n position: sticky ? 'sticky' : undefined,\n top: sticky ? 0 : undefined,\n zIndex: sticky ? 1 : undefined,\n ...style,\n }\n\n return (\n <thead\n ref={ref}\n className={cx('brycks-table-head', sticky && 'brycks-table-head--sticky', className)}\n style={headStyle}\n {...props}\n >\n {children}\n </thead>\n )\n})\n\nTableHead.displayName = 'TableHead'\n\n// TableBody\nexport interface TableBodyProps extends HTMLAttributes<HTMLTableSectionElement> {\n /** Custom class name */\n className?: string\n}\n\nexport const TableBody = forwardRef<HTMLTableSectionElement, TableBodyProps>(function TableBody(\n { className, style, children, ...props },\n ref\n) {\n const bodyStyle: CSSProperties = {\n ...style,\n }\n\n return (\n <tbody\n ref={ref}\n className={cx('brycks-table-body', className)}\n style={bodyStyle}\n {...props}\n >\n {children}\n </tbody>\n )\n})\n\nTableBody.displayName = 'TableBody'\n\n// TableRow\nexport interface TableRowProps extends HTMLAttributes<HTMLTableRowElement> {\n /** Whether the row is selected */\n selected?: boolean\n /** Whether the row is clickable */\n clickable?: boolean\n /** Custom class name */\n className?: string\n}\n\nexport const TableRow = forwardRef<HTMLTableRowElement, TableRowProps>(function TableRow(\n { selected = false, clickable = false, className, style, children, ...props },\n ref\n) {\n const { variant } = useTableContext()\n\n const rowStyle: CSSProperties = {\n backgroundColor: selected\n ? 'var(--brycks-primary-50)'\n : 'transparent',\n borderBottom: variant !== 'bordered' ? '1px solid var(--brycks-border-muted)' : undefined,\n cursor: clickable ? 'pointer' : undefined,\n transition: `background-color ${durations.quick}ms ${easings.easeOut}`,\n ...style,\n }\n\n return (\n <tr\n ref={ref}\n className={cx(\n 'brycks-table-row',\n selected && 'brycks-table-row--selected',\n clickable && 'brycks-table-row--clickable',\n className\n )}\n style={rowStyle}\n onMouseEnter={(e) => {\n if (clickable && !selected) {\n e.currentTarget.style.backgroundColor = 'var(--brycks-background-muted)'\n }\n }}\n onMouseLeave={(e) => {\n if (!selected) {\n e.currentTarget.style.backgroundColor = 'transparent'\n }\n }}\n {...props}\n >\n {children}\n </tr>\n )\n})\n\nTableRow.displayName = 'TableRow'\n\n// TableHeader (th)\nexport interface TableHeaderProps extends ThHTMLAttributes<HTMLTableCellElement> {\n /** Whether the column is sortable */\n sortable?: boolean\n /** Sort direction */\n sortDirection?: 'asc' | 'desc' | null\n /** Callback when sort is requested */\n onSort?: () => void\n /** Text alignment */\n align?: 'left' | 'center' | 'right'\n /** Custom class name */\n className?: string\n}\n\nfunction SortIcon({ direction }: { direction: 'asc' | 'desc' | null }) {\n if (!direction) {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" style={{ opacity: 0.4 }}>\n <path d=\"M7 3L10 6H4L7 3Z\" fill=\"currentColor\" />\n <path d=\"M7 11L4 8H10L7 11Z\" fill=\"currentColor\" />\n </svg>\n )\n }\n\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n {direction === 'asc' ? (\n <path d=\"M7 3L10 6H4L7 3Z\" fill=\"currentColor\" />\n ) : (\n <path d=\"M7 11L4 8H10L7 11Z\" fill=\"currentColor\" />\n )}\n </svg>\n )\n}\n\nexport const TableHeader = forwardRef<HTMLTableCellElement, TableHeaderProps>(function TableHeader(\n {\n sortable = false,\n sortDirection = null,\n onSort,\n align = 'left',\n className,\n style,\n children,\n ...props\n },\n ref\n) {\n const { size } = useTableContext()\n const config = sizeConfig[size]\n\n const headerStyle: CSSProperties = {\n padding: `${config.headerPaddingY}px ${config.headerPaddingX}px`,\n fontWeight: 600,\n color: 'var(--brycks-foreground-muted)',\n textAlign: align,\n whiteSpace: 'nowrap',\n cursor: sortable ? 'pointer' : undefined,\n userSelect: sortable ? 'none' : undefined,\n transition: `color ${durations.quick}ms ${easings.easeOut}`,\n ...style,\n }\n\n const contentStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: componentGap.sm,\n justifyContent: align === 'right' ? 'flex-end' : align === 'center' ? 'center' : 'flex-start',\n }\n\n const handleClick = () => {\n if (sortable && onSort) {\n onSort()\n }\n }\n\n return (\n <th\n ref={ref}\n className={cx('brycks-table-header', sortable && 'brycks-table-header--sortable', className)}\n style={headerStyle}\n onClick={handleClick}\n onMouseEnter={(e) => {\n if (sortable) {\n e.currentTarget.style.color = 'var(--brycks-foreground-default)'\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = 'var(--brycks-foreground-muted)'\n }}\n {...props}\n >\n <span style={contentStyle}>\n {children}\n {sortable && <SortIcon direction={sortDirection} />}\n </span>\n </th>\n )\n})\n\nTableHeader.displayName = 'TableHeader'\n\n// TableCell (td)\nexport interface TableCellProps extends TdHTMLAttributes<HTMLTableCellElement> {\n /** Text alignment */\n align?: 'left' | 'center' | 'right'\n /** Whether to truncate text */\n truncate?: boolean\n /** Custom class name */\n className?: string\n}\n\nexport const TableCell = forwardRef<HTMLTableCellElement, TableCellProps>(function TableCell(\n { align = 'left', truncate = false, className, style, children, ...props },\n ref\n) {\n const { size, variant } = useTableContext()\n const config = sizeConfig[size]\n\n const cellStyle: CSSProperties = {\n padding: `${config.paddingY}px ${config.paddingX}px`,\n color: 'var(--brycks-foreground-default)',\n textAlign: align,\n verticalAlign: 'middle',\n border: variant === 'bordered' ? '1px solid var(--brycks-border-muted)' : undefined,\n maxWidth: truncate ? 200 : undefined,\n overflow: truncate ? 'hidden' : undefined,\n textOverflow: truncate ? 'ellipsis' : undefined,\n whiteSpace: truncate ? 'nowrap' : undefined,\n ...style,\n }\n\n return (\n <td\n ref={ref}\n className={cx('brycks-table-cell', truncate && 'brycks-table-cell--truncate', className)}\n style={cellStyle}\n title={truncate && typeof children === 'string' ? children : undefined}\n {...props}\n >\n {children}\n </td>\n )\n})\n\nTableCell.displayName = 'TableCell'\n\n// TableFoot\nexport interface TableFootProps extends HTMLAttributes<HTMLTableSectionElement> {\n /** Custom class name */\n className?: string\n}\n\nexport const TableFoot = forwardRef<HTMLTableSectionElement, TableFootProps>(function TableFoot(\n { className, style, children, ...props },\n ref\n) {\n const footStyle: CSSProperties = {\n backgroundColor: 'var(--brycks-background-muted)',\n fontWeight: 500,\n ...style,\n }\n\n return (\n <tfoot\n ref={ref}\n className={cx('brycks-table-foot', className)}\n style={footStyle}\n {...props}\n >\n {children}\n </tfoot>\n )\n})\n\nTableFoot.displayName = 'TableFoot'\n\n// TableCaption\nexport interface TableCaptionProps extends HTMLAttributes<HTMLTableCaptionElement> {\n /** Caption placement */\n placement?: 'top' | 'bottom'\n /** Custom class name */\n className?: string\n}\n\nexport const TableCaption = forwardRef<HTMLTableCaptionElement, TableCaptionProps>(function TableCaption(\n { placement = 'bottom', className, style, children, ...props },\n ref\n) {\n const captionStyle: CSSProperties = {\n captionSide: placement,\n padding: `${spacing[3]}px ${spacing[4]}px`,\n fontSize: fontSizes.base - 1,\n color: 'var(--brycks-foreground-muted)',\n textAlign: 'left',\n ...style,\n }\n\n return (\n <caption\n ref={ref}\n className={cx('brycks-table-caption', className)}\n style={captionStyle}\n {...props}\n >\n {children}\n </caption>\n )\n})\n\nTableCaption.displayName = 'TableCaption'\n"],"names":["TableContext","createContext","useTableContext","useContext","sizeConfig","fontSizes","componentPaddingY","componentPaddingX","spacing","Table","forwardRef","size","variant","_stickyHeader","loading","className","style","children","testId","props","ref","containerStyle","tableStyle","durations","easings","jsx","cx","TableHead","sticky","headStyle","TableBody","bodyStyle","TableRow","selected","clickable","rowStyle","e","SortIcon","direction","jsxs","TableHeader","sortable","sortDirection","onSort","align","config","headerStyle","contentStyle","componentGap","handleClick","TableCell","truncate","cellStyle","TableFoot","footStyle","TableCaption","placement","captionStyle"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),u=require("react"),H=require("../../../utils/styles.cjs"),k=require("../../../design-system/tokens/spacing.cjs"),w=require("../../../design-system/primitives/sizing.cjs"),R=require("../../../design-system/tokens/typography.cjs"),j=require("../../../design-system/tokens/motion.cjs"),N={sm:{fontSize:R.fontSizes.sm,iconSize:w.iconSizes.xs,padding:w.componentPaddingY.xs,indent:k.spacing[4]},md:{fontSize:R.fontSizes.base,iconSize:w.iconSizes.sm,padding:w.componentPaddingY.sm,indent:k.spacing[5]},lg:{fontSize:R.fontSizes.md,iconSize:w.iconSizes.md,padding:w.componentPaddingY.md,indent:k.spacing[6]}};function U({expanded:e}){return a.jsx("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none","aria-hidden":"true",style:{transform:e?"rotate(90deg)":"rotate(0)",transition:`transform ${j.durations.fast}ms ${j.easings.easeOut}`},children:a.jsx("path",{d:"M6 4l4 4-4 4",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})}function A({node:e,level:f,config:i,isSelected:y,isExpanded:l,showLines:S,onToggle:p,onSelect:g,renderNode:x,selectedIds:m,expandedIds:z,multiSelect:C}){const o=e.children&&e.children.length>0,I=u.useCallback(n=>{e.disabled||g(e.id,n.ctrlKey||n.metaKey)},[e.id,e.disabled,g]),D=u.useCallback(n=>{n.stopPropagation(),o&&p(e.id)},[e.id,o,p]),K=u.useCallback(n=>{if(!e.disabled)switch(n.key){case"Enter":case" ":n.preventDefault(),g(e.id,n.ctrlKey||n.metaKey);break;case"ArrowRight":n.preventDefault(),o&&!l&&p(e.id);break;case"ArrowLeft":n.preventDefault(),o&&l&&p(e.id);break}},[e.id,e.disabled,o,l,p,g]),q={display:"flex",alignItems:"center",gap:k.spacing[1.5],padding:`${i.padding}px ${k.spacing[2]}px`,paddingLeft:k.spacing[2]+f*i.indent,fontSize:i.fontSize,color:e.disabled?"var(--brycks-foreground-disabled)":"var(--brycks-foreground-default)",backgroundColor:y?"var(--brycks-primary-50)":"transparent",borderRadius:"var(--brycks-radius-md)",cursor:e.disabled?"not-allowed":"pointer",userSelect:"none",transition:`background-color ${j.durations.fast}ms ${j.easings.easeOut}`,position:"relative"},T={display:"flex",alignItems:"center",justifyContent:"center",width:i.iconSize,height:i.iconSize,color:"var(--brycks-foreground-muted)",cursor:"pointer",flexShrink:0},$={display:"flex",alignItems:"center",justifyContent:"center",width:i.iconSize,height:i.iconSize,color:y?"var(--brycks-primary-default)":"var(--brycks-foreground-muted)",flexShrink:0},M=S&&f>0?{position:"absolute",left:k.spacing[2]+(f-1)*i.indent+i.iconSize/2,top:0,bottom:0,width:1,backgroundColor:"var(--brycks-border-default)"}:{};return a.jsxs("li",{role:"treeitem","aria-selected":y,"aria-expanded":o?l:void 0,children:[a.jsxs("div",{tabIndex:e.disabled?-1:0,style:q,onClick:I,onKeyDown:K,onMouseEnter:n=>{!e.disabled&&!y&&(n.currentTarget.style.backgroundColor="var(--brycks-background-muted)")},onMouseLeave:n=>{y||(n.currentTarget.style.backgroundColor="transparent")},children:[S&&f>0&&a.jsx("span",{style:M,"aria-hidden":"true"}),a.jsx("span",{style:T,onClick:D,children:o&&a.jsx(U,{expanded:l})}),e.icon&&a.jsx("span",{style:$,children:e.icon}),x?x(e,y,l):a.jsx("span",{style:{flex:1},children:e.label})]}),o&&l&&a.jsx("ul",{role:"group",style:{listStyle:"none",margin:0,padding:0},children:e.children.map(n=>a.jsx(A,{node:n,level:f+1,config:i,isSelected:m.includes(n.id),isExpanded:z.includes(n.id),showLines:S,onToggle:p,onSelect:g,renderNode:x,selectedIds:m,expandedIds:z,multiSelect:C},n.id))})]})}const V=u.forwardRef(function({data:f,selectedIds:i,defaultSelectedIds:y=[],expandedIds:l,defaultExpandedIds:S=[],onSelectionChange:p,onExpansionChange:g,onNodeClick:x,multiSelect:m=!1,size:z="md",showLines:C=!1,renderNode:o,"aria-label":I="Tree",className:D,testId:K},q){const[T,$]=u.useState(y),[M,n]=u.useState(S),d=i!==void 0?i:T,h=l!==void 0?l:M,L=N[z],s=u.useMemo(()=>{const t=(c,r=[])=>(c.forEach(b=>{r.push(b),b.children&&h.includes(b.id)&&t(b.children,r)}),r);return t(f)},[f,h]),O=u.useCallback(t=>{const c=h.includes(t)?h.filter(r=>r!==t):[...h,t];l===void 0&&n(c),g?.(c)},[h,l,g]),v=u.useCallback((t,c)=>{const r=s.find(P=>P.id===t);r&&x?.(r);let b;m&&c?b=d.includes(t)?d.filter(P=>P!==t):[...d,t]:b=d.includes(t)&&d.length===1?[]:[t],i===void 0&&$(b),p?.(b)},[s,m,d,i,p,x]),Y=u.useCallback(t=>{const c=s.findIndex(r=>d.includes(r.id));switch(t.key){case"ArrowDown":{t.preventDefault();const r=c<s.length-1?c+1:0;v(s[r].id,!1);break}case"ArrowUp":{t.preventDefault();const r=c>0?c-1:s.length-1;v(s[r].id,!1);break}case"Home":t.preventDefault(),s.length>0&&v(s[0].id,!1);break;case"End":t.preventDefault(),s.length>0&&v(s[s.length-1].id,!1);break}},[s,d,v]),B={listStyle:"none",margin:0,padding:k.spacing[1],outline:"none"};return a.jsx("ul",{ref:q,role:"tree","aria-label":I,"aria-multiselectable":m,tabIndex:0,className:H.cx("brycks-treeview",`brycks-treeview--${z}`,D),style:B,"data-testid":K,onKeyDown:Y,children:f.map(t=>a.jsx(A,{node:t,level:0,config:L,isSelected:d.includes(t.id),isExpanded:h.includes(t.id),showLines:C,onToggle:O,onSelect:v,renderNode:o,selectedIds:d,expandedIds:h,multiSelect:m},t.id))})});V.displayName="TreeView";exports.TreeView=V;
2
+ //# sourceMappingURL=TreeView.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TreeView.cjs","sources":["../../../../src/components/data/TreeView/TreeView.tsx"],"sourcesContent":["/**\n * TreeView Component\n *\n * A hierarchical tree structure for displaying nested data.\n * Supports selection, expansion, and keyboard navigation.\n *\n * @module components/data/TreeView\n */\n\nimport {\n forwardRef,\n useState,\n useCallback,\n useMemo,\n type CSSProperties,\n type ReactNode,\n type KeyboardEvent,\n} from 'react'\nimport { cx } from '../../../utils/styles'\nimport { spacing, fontSizes, durations, easings } from '../../../design-system'\nimport { componentPaddingY, iconSizes } from '../../../design-system/primitives'\n\nexport interface TreeNode {\n /** Unique identifier */\n id: string\n /** Display label */\n label: string\n /** Optional icon */\n icon?: ReactNode\n /** Child nodes */\n children?: TreeNode[]\n /** Whether the node is disabled */\n disabled?: boolean\n /** Additional data */\n data?: unknown\n}\n\nexport type TreeViewSize = 'sm' | 'md' | 'lg'\n\nexport interface TreeViewProps {\n /** Tree data */\n data: TreeNode[]\n /** Selected node IDs (controlled) */\n selectedIds?: string[]\n /** Default selected node IDs (uncontrolled) */\n defaultSelectedIds?: string[]\n /** Expanded node IDs (controlled) */\n expandedIds?: string[]\n /** Default expanded node IDs (uncontrolled) */\n defaultExpandedIds?: string[]\n /** Callback when selection changes */\n onSelectionChange?: (selectedIds: string[]) => void\n /** Callback when expansion changes */\n onExpansionChange?: (expandedIds: string[]) => void\n /** Callback when a node is clicked */\n onNodeClick?: (node: TreeNode) => void\n /** Whether to allow multi-selection */\n multiSelect?: boolean\n /** Component size */\n size?: TreeViewSize\n /** Whether to show connecting lines */\n showLines?: boolean\n /** Custom node renderer */\n renderNode?: (node: TreeNode, isSelected: boolean, isExpanded: boolean) => ReactNode\n /** Label for accessibility */\n 'aria-label'?: string\n /** Custom class name */\n className?: string\n /** Test ID */\n testId?: string\n}\n\nconst sizeConfig: Record<TreeViewSize, { fontSize: number; iconSize: number; padding: number; indent: number }> = {\n sm: { fontSize: fontSizes.sm, iconSize: iconSizes.xs, padding: componentPaddingY.xs, indent: spacing[4] },\n md: { fontSize: fontSizes.base, iconSize: iconSizes.sm, padding: componentPaddingY.sm, indent: spacing[5] },\n lg: { fontSize: fontSizes.md, iconSize: iconSizes.md, padding: componentPaddingY.md, indent: spacing[6] },\n}\n\nfunction ChevronIcon({ expanded }: { expanded: boolean }) {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n style={{\n transform: expanded ? 'rotate(90deg)' : 'rotate(0)',\n transition: `transform ${durations.fast}ms ${easings.easeOut}`,\n }}\n >\n <path d=\"M6 4l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n\ninterface TreeNodeItemProps {\n node: TreeNode\n level: number\n config: typeof sizeConfig.md\n isSelected: boolean\n isExpanded: boolean\n showLines: boolean\n onToggle: (id: string) => void\n onSelect: (id: string, multi: boolean) => void\n renderNode?: TreeViewProps['renderNode']\n selectedIds: string[]\n expandedIds: string[]\n multiSelect: boolean\n}\n\nfunction TreeNodeItem({\n node,\n level,\n config,\n isSelected,\n isExpanded,\n showLines,\n onToggle,\n onSelect,\n renderNode,\n selectedIds,\n expandedIds,\n multiSelect,\n}: TreeNodeItemProps) {\n const hasChildren = node.children && node.children.length > 0\n\n const handleClick = useCallback(\n (e: React.MouseEvent) => {\n if (node.disabled) return\n onSelect(node.id, e.ctrlKey || e.metaKey)\n },\n [node.id, node.disabled, onSelect]\n )\n\n const handleToggle = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n if (hasChildren) {\n onToggle(node.id)\n }\n },\n [node.id, hasChildren, onToggle]\n )\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (node.disabled) return\n\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault()\n onSelect(node.id, e.ctrlKey || e.metaKey)\n break\n case 'ArrowRight':\n e.preventDefault()\n if (hasChildren && !isExpanded) {\n onToggle(node.id)\n }\n break\n case 'ArrowLeft':\n e.preventDefault()\n if (hasChildren && isExpanded) {\n onToggle(node.id)\n }\n break\n }\n },\n [node.id, node.disabled, hasChildren, isExpanded, onToggle, onSelect]\n )\n\n const itemStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: spacing[1.5],\n padding: `${config.padding}px ${spacing[2]}px`,\n paddingLeft: spacing[2] + level * config.indent,\n fontSize: config.fontSize,\n color: node.disabled ? 'var(--brycks-foreground-disabled)' : 'var(--brycks-foreground-default)',\n backgroundColor: isSelected ? 'var(--brycks-primary-50)' : 'transparent',\n borderRadius: 'var(--brycks-radius-md)',\n cursor: node.disabled ? 'not-allowed' : 'pointer',\n userSelect: 'none',\n transition: `background-color ${durations.fast}ms ${easings.easeOut}`,\n position: 'relative',\n }\n\n const toggleStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: config.iconSize,\n height: config.iconSize,\n color: 'var(--brycks-foreground-muted)',\n cursor: 'pointer',\n flexShrink: 0,\n }\n\n const iconStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: config.iconSize,\n height: config.iconSize,\n color: isSelected ? 'var(--brycks-primary-default)' : 'var(--brycks-foreground-muted)',\n flexShrink: 0,\n }\n\n const lineStyle: CSSProperties = showLines && level > 0 ? {\n position: 'absolute',\n left: spacing[2] + (level - 1) * config.indent + config.iconSize / 2,\n top: 0,\n bottom: 0,\n width: 1,\n backgroundColor: 'var(--brycks-border-default)',\n } : {}\n\n return (\n <li role=\"treeitem\" aria-selected={isSelected} aria-expanded={hasChildren ? isExpanded : undefined}>\n <div\n tabIndex={node.disabled ? -1 : 0}\n style={itemStyle}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onMouseEnter={(e) => {\n if (!node.disabled && !isSelected) {\n e.currentTarget.style.backgroundColor = 'var(--brycks-background-muted)'\n }\n }}\n onMouseLeave={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = 'transparent'\n }\n }}\n >\n {showLines && level > 0 && <span style={lineStyle} aria-hidden=\"true\" />}\n <span style={toggleStyle} onClick={handleToggle}>\n {hasChildren && <ChevronIcon expanded={isExpanded} />}\n </span>\n {node.icon && <span style={iconStyle}>{node.icon}</span>}\n {renderNode ? (\n renderNode(node, isSelected, isExpanded)\n ) : (\n <span style={{ flex: 1 }}>{node.label}</span>\n )}\n </div>\n {hasChildren && isExpanded && (\n <ul role=\"group\" style={{ listStyle: 'none', margin: 0, padding: 0 }}>\n {node.children!.map((child) => (\n <TreeNodeItem\n key={child.id}\n node={child}\n level={level + 1}\n config={config}\n isSelected={selectedIds.includes(child.id)}\n isExpanded={expandedIds.includes(child.id)}\n showLines={showLines}\n onToggle={onToggle}\n onSelect={onSelect}\n renderNode={renderNode}\n selectedIds={selectedIds}\n expandedIds={expandedIds}\n multiSelect={multiSelect}\n />\n ))}\n </ul>\n )}\n </li>\n )\n}\n\nexport const TreeView = forwardRef<HTMLUListElement, TreeViewProps>(function TreeView(\n {\n data,\n selectedIds: controlledSelectedIds,\n defaultSelectedIds = [],\n expandedIds: controlledExpandedIds,\n defaultExpandedIds = [],\n onSelectionChange,\n onExpansionChange,\n onNodeClick,\n multiSelect = false,\n size = 'md',\n showLines = false,\n renderNode,\n 'aria-label': ariaLabel = 'Tree',\n className,\n testId,\n },\n ref\n) {\n const [internalSelectedIds, setInternalSelectedIds] = useState<string[]>(defaultSelectedIds)\n const [internalExpandedIds, setInternalExpandedIds] = useState<string[]>(defaultExpandedIds)\n\n const selectedIds = controlledSelectedIds !== undefined ? controlledSelectedIds : internalSelectedIds\n const expandedIds = controlledExpandedIds !== undefined ? controlledExpandedIds : internalExpandedIds\n const config = sizeConfig[size]\n\n // Flatten all nodes for keyboard navigation\n const flatNodes = useMemo(() => {\n const flatten = (nodes: TreeNode[], result: TreeNode[] = []): TreeNode[] => {\n nodes.forEach((node) => {\n result.push(node)\n if (node.children && expandedIds.includes(node.id)) {\n flatten(node.children, result)\n }\n })\n return result\n }\n return flatten(data)\n }, [data, expandedIds])\n\n const handleToggle = useCallback(\n (id: string) => {\n const newExpandedIds = expandedIds.includes(id)\n ? expandedIds.filter((eid) => eid !== id)\n : [...expandedIds, id]\n\n if (controlledExpandedIds === undefined) {\n setInternalExpandedIds(newExpandedIds)\n }\n onExpansionChange?.(newExpandedIds)\n },\n [expandedIds, controlledExpandedIds, onExpansionChange]\n )\n\n const handleSelect = useCallback(\n (id: string, additive: boolean) => {\n const node = flatNodes.find((n) => n.id === id)\n if (node) {\n onNodeClick?.(node)\n }\n\n let newSelectedIds: string[]\n if (multiSelect && additive) {\n newSelectedIds = selectedIds.includes(id)\n ? selectedIds.filter((sid) => sid !== id)\n : [...selectedIds, id]\n } else {\n newSelectedIds = selectedIds.includes(id) && selectedIds.length === 1 ? [] : [id]\n }\n\n if (controlledSelectedIds === undefined) {\n setInternalSelectedIds(newSelectedIds)\n }\n onSelectionChange?.(newSelectedIds)\n },\n [flatNodes, multiSelect, selectedIds, controlledSelectedIds, onSelectionChange, onNodeClick]\n )\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLUListElement>) => {\n const currentIndex = flatNodes.findIndex((n) => selectedIds.includes(n.id))\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault()\n const nextIndex = currentIndex < flatNodes.length - 1 ? currentIndex + 1 : 0\n handleSelect(flatNodes[nextIndex].id, false)\n break\n }\n case 'ArrowUp': {\n e.preventDefault()\n const prevIndex = currentIndex > 0 ? currentIndex - 1 : flatNodes.length - 1\n handleSelect(flatNodes[prevIndex].id, false)\n break\n }\n case 'Home':\n e.preventDefault()\n if (flatNodes.length > 0) {\n handleSelect(flatNodes[0].id, false)\n }\n break\n case 'End':\n e.preventDefault()\n if (flatNodes.length > 0) {\n handleSelect(flatNodes[flatNodes.length - 1].id, false)\n }\n break\n }\n },\n [flatNodes, selectedIds, handleSelect]\n )\n\n const containerStyle: CSSProperties = {\n listStyle: 'none',\n margin: 0,\n padding: spacing[1],\n outline: 'none',\n }\n\n return (\n <ul\n ref={ref}\n role=\"tree\"\n aria-label={ariaLabel}\n aria-multiselectable={multiSelect}\n tabIndex={0}\n className={cx('brycks-treeview', `brycks-treeview--${size}`, className)}\n style={containerStyle}\n data-testid={testId}\n onKeyDown={handleKeyDown}\n >\n {data.map((node) => (\n <TreeNodeItem\n key={node.id}\n node={node}\n level={0}\n config={config}\n isSelected={selectedIds.includes(node.id)}\n isExpanded={expandedIds.includes(node.id)}\n showLines={showLines}\n onToggle={handleToggle}\n onSelect={handleSelect}\n renderNode={renderNode}\n selectedIds={selectedIds}\n expandedIds={expandedIds}\n multiSelect={multiSelect}\n />\n ))}\n </ul>\n )\n})\n\nTreeView.displayName = 'TreeView'\n"],"names":["sizeConfig","fontSizes","iconSizes","componentPaddingY","spacing","ChevronIcon","expanded","jsx","durations","easings","TreeNodeItem","node","level","config","isSelected","isExpanded","showLines","onToggle","onSelect","renderNode","selectedIds","expandedIds","multiSelect","hasChildren","handleClick","useCallback","e","handleToggle","handleKeyDown","itemStyle","toggleStyle","iconStyle","lineStyle","jsxs","child","TreeView","forwardRef","data","controlledSelectedIds","defaultSelectedIds","controlledExpandedIds","defaultExpandedIds","onSelectionChange","onExpansionChange","onNodeClick","size","ariaLabel","className","testId","ref","internalSelectedIds","setInternalSelectedIds","useState","internalExpandedIds","setInternalExpandedIds","flatNodes","useMemo","flatten","nodes","result","id","newExpandedIds","eid","handleSelect","additive","n","newSelectedIds","sid","currentIndex","nextIndex","prevIndex","containerStyle","cx"],"mappings":"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"}