@tonyarbor/components 0.2.0 → 0.4.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 (140) hide show
  1. package/dist/Avatar.d.mts +42 -0
  2. package/dist/Avatar.d.ts +42 -0
  3. package/dist/Avatar.js +158 -0
  4. package/dist/Avatar.js.map +1 -0
  5. package/dist/Avatar.mjs +7 -0
  6. package/dist/Avatar.mjs.map +1 -0
  7. package/dist/Banner.d.mts +59 -0
  8. package/dist/Banner.d.ts +59 -0
  9. package/dist/Banner.js +222 -0
  10. package/dist/Banner.js.map +1 -0
  11. package/dist/Banner.mjs +7 -0
  12. package/dist/Banner.mjs.map +1 -0
  13. package/dist/Breadcrumbs.d.mts +51 -0
  14. package/dist/Breadcrumbs.d.ts +51 -0
  15. package/dist/Breadcrumbs.js +276 -0
  16. package/dist/Breadcrumbs.js.map +1 -0
  17. package/dist/Breadcrumbs.mjs +7 -0
  18. package/dist/Breadcrumbs.mjs.map +1 -0
  19. package/dist/Checkbox.d.mts +4 -0
  20. package/dist/Checkbox.d.ts +4 -0
  21. package/dist/Checkbox.js +45 -16
  22. package/dist/Checkbox.js.map +1 -1
  23. package/dist/Checkbox.mjs +1 -1
  24. package/dist/DatePicker.d.mts +68 -0
  25. package/dist/DatePicker.d.ts +68 -0
  26. package/dist/DatePicker.js +490 -0
  27. package/dist/DatePicker.js.map +1 -0
  28. package/dist/DatePicker.mjs +7 -0
  29. package/dist/DatePicker.mjs.map +1 -0
  30. package/dist/Pagination.d.mts +36 -0
  31. package/dist/Pagination.d.ts +36 -0
  32. package/dist/Pagination.js +301 -0
  33. package/dist/Pagination.js.map +1 -0
  34. package/dist/Pagination.mjs +7 -0
  35. package/dist/Pagination.mjs.map +1 -0
  36. package/dist/Radio.js +32 -12
  37. package/dist/Radio.js.map +1 -1
  38. package/dist/Radio.mjs +1 -1
  39. package/dist/SearchGlobal.d.mts +45 -0
  40. package/dist/SearchGlobal.d.ts +45 -0
  41. package/dist/SearchGlobal.js +209 -0
  42. package/dist/SearchGlobal.js.map +1 -0
  43. package/dist/SearchGlobal.mjs +7 -0
  44. package/dist/SearchGlobal.mjs.map +1 -0
  45. package/dist/SearchOnPage.d.mts +45 -0
  46. package/dist/SearchOnPage.d.ts +45 -0
  47. package/dist/SearchOnPage.js +171 -0
  48. package/dist/SearchOnPage.js.map +1 -0
  49. package/dist/SearchOnPage.mjs +7 -0
  50. package/dist/SearchOnPage.mjs.map +1 -0
  51. package/dist/Table.d.mts +80 -0
  52. package/dist/Table.d.ts +80 -0
  53. package/dist/Table.js +347 -0
  54. package/dist/Table.js.map +1 -0
  55. package/dist/Table.mjs +8 -0
  56. package/dist/Table.mjs.map +1 -0
  57. package/dist/TableControls.d.mts +76 -0
  58. package/dist/TableControls.d.ts +76 -0
  59. package/dist/TableControls.js +461 -0
  60. package/dist/TableControls.js.map +1 -0
  61. package/dist/TableControls.mjs +7 -0
  62. package/dist/TableControls.mjs.map +1 -0
  63. package/dist/TableFooterPagination.d.mts +56 -0
  64. package/dist/TableFooterPagination.d.ts +56 -0
  65. package/dist/TableFooterPagination.js +499 -0
  66. package/dist/TableFooterPagination.js.map +1 -0
  67. package/dist/TableFooterPagination.mjs +7 -0
  68. package/dist/TableFooterPagination.mjs.map +1 -0
  69. package/dist/Tabs.d.mts +50 -0
  70. package/dist/Tabs.d.ts +50 -0
  71. package/dist/Tabs.js +187 -0
  72. package/dist/Tabs.js.map +1 -0
  73. package/dist/Tabs.mjs +7 -0
  74. package/dist/Tabs.mjs.map +1 -0
  75. package/dist/TextArea.d.mts +64 -0
  76. package/dist/TextArea.d.ts +64 -0
  77. package/dist/TextArea.js +171 -0
  78. package/dist/TextArea.js.map +1 -0
  79. package/dist/TextArea.mjs +7 -0
  80. package/dist/TextArea.mjs.map +1 -0
  81. package/dist/Toast.d.mts +48 -0
  82. package/dist/Toast.d.ts +48 -0
  83. package/dist/Toast.js +169 -0
  84. package/dist/Toast.js.map +1 -0
  85. package/dist/Toast.mjs +7 -0
  86. package/dist/Toast.mjs.map +1 -0
  87. package/dist/Toggle.d.mts +48 -0
  88. package/dist/Toggle.d.ts +48 -0
  89. package/dist/Toggle.js +291 -0
  90. package/dist/Toggle.js.map +1 -0
  91. package/dist/Toggle.mjs +7 -0
  92. package/dist/Toggle.mjs.map +1 -0
  93. package/dist/Tooltip.d.mts +32 -0
  94. package/dist/Tooltip.d.ts +32 -0
  95. package/dist/Tooltip.js +109 -0
  96. package/dist/Tooltip.js.map +1 -0
  97. package/dist/Tooltip.mjs +7 -0
  98. package/dist/Tooltip.mjs.map +1 -0
  99. package/dist/chunk-52TG3BFX.mjs +463 -0
  100. package/dist/chunk-52TG3BFX.mjs.map +1 -0
  101. package/dist/chunk-AI2U34CF.mjs +159 -0
  102. package/dist/chunk-AI2U34CF.mjs.map +1 -0
  103. package/dist/chunk-B7RX3TPX.mjs +135 -0
  104. package/dist/chunk-B7RX3TPX.mjs.map +1 -0
  105. package/dist/chunk-C25FFMRQ.mjs +255 -0
  106. package/dist/chunk-C25FFMRQ.mjs.map +1 -0
  107. package/dist/{chunk-BCYJIUQX.mjs → chunk-CUTYEIFE.mjs} +47 -18
  108. package/dist/chunk-CUTYEIFE.mjs.map +1 -0
  109. package/dist/chunk-DULH2KRW.mjs +133 -0
  110. package/dist/chunk-DULH2KRW.mjs.map +1 -0
  111. package/dist/chunk-G5NVKF2G.mjs +434 -0
  112. package/dist/chunk-G5NVKF2G.mjs.map +1 -0
  113. package/dist/chunk-JSG27ZZS.mjs +122 -0
  114. package/dist/chunk-JSG27ZZS.mjs.map +1 -0
  115. package/dist/{chunk-ARBHNHO7.mjs → chunk-M6DVBEEL.mjs} +33 -13
  116. package/dist/chunk-M6DVBEEL.mjs.map +1 -0
  117. package/dist/chunk-MBUMR2XJ.mjs +135 -0
  118. package/dist/chunk-MBUMR2XJ.mjs.map +1 -0
  119. package/dist/chunk-MNH2TGUX.mjs +73 -0
  120. package/dist/chunk-MNH2TGUX.mjs.map +1 -0
  121. package/dist/chunk-RQP6ZGD7.mjs +240 -0
  122. package/dist/chunk-RQP6ZGD7.mjs.map +1 -0
  123. package/dist/chunk-RRMG2SSZ.mjs +265 -0
  124. package/dist/chunk-RRMG2SSZ.mjs.map +1 -0
  125. package/dist/chunk-U4JXKZZG.mjs +186 -0
  126. package/dist/chunk-U4JXKZZG.mjs.map +1 -0
  127. package/dist/chunk-UPBHDBAK.mjs +173 -0
  128. package/dist/chunk-UPBHDBAK.mjs.map +1 -0
  129. package/dist/chunk-W55QJIAN.mjs +467 -0
  130. package/dist/chunk-W55QJIAN.mjs.map +1 -0
  131. package/dist/chunk-YV4OXFIM.mjs +151 -0
  132. package/dist/chunk-YV4OXFIM.mjs.map +1 -0
  133. package/dist/index.d.mts +15 -0
  134. package/dist/index.d.ts +15 -0
  135. package/dist/index.js +3414 -30
  136. package/dist/index.js.map +1 -1
  137. package/dist/index.mjs +63 -3
  138. package/package.json +78 -1
  139. package/dist/chunk-ARBHNHO7.mjs.map +0 -1
  140. package/dist/chunk-BCYJIUQX.mjs.map +0 -1
@@ -0,0 +1,434 @@
1
+ // src/TableControls/TableControls.tsx
2
+ import * as React from "react";
3
+ import { clsx } from "clsx";
4
+ import * as Popover from "@radix-ui/react-popover";
5
+ import {
6
+ ChevronDown,
7
+ Undo2,
8
+ Redo2,
9
+ Search,
10
+ Download,
11
+ MessageSquare,
12
+ Settings,
13
+ Expand
14
+ } from "lucide-react";
15
+ import { jsx, jsxs } from "react/jsx-runtime";
16
+ var containerStyles = {
17
+ display: "flex",
18
+ alignItems: "center",
19
+ justifyContent: "space-between",
20
+ paddingTop: "8px",
21
+ paddingBottom: "8px",
22
+ paddingLeft: 0,
23
+ paddingRight: 0,
24
+ fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
25
+ };
26
+ var actions1Styles = {
27
+ display: "flex",
28
+ gap: "12px",
29
+ alignItems: "center"
30
+ };
31
+ var actions2Styles = {
32
+ display: "flex",
33
+ gap: "12px",
34
+ alignItems: "center",
35
+ justifyContent: "flex-end",
36
+ flexGrow: 1,
37
+ paddingRight: "4px"
38
+ };
39
+ var dropdownButtonStyles = {
40
+ height: "32px",
41
+ backgroundColor: "white",
42
+ border: "1px solid #d1d1d1",
43
+ borderRadius: "8px",
44
+ display: "flex",
45
+ alignItems: "center",
46
+ justifyContent: "center",
47
+ gap: "8px",
48
+ paddingLeft: "12px",
49
+ paddingRight: "8px",
50
+ paddingTop: 0,
51
+ paddingBottom: 0,
52
+ cursor: "pointer",
53
+ transition: "background-color 0.2s ease-in-out",
54
+ outline: "none"
55
+ };
56
+ var dropdownTextStyles = {
57
+ fontSize: "13px",
58
+ fontWeight: 600,
59
+ lineHeight: "1.5",
60
+ color: "#2f2f2f",
61
+ textAlign: "center"
62
+ };
63
+ var iconButtonStyles = {
64
+ width: "32px",
65
+ height: "32px",
66
+ borderRadius: "99px",
67
+ border: "none",
68
+ backgroundColor: "white",
69
+ cursor: "pointer",
70
+ display: "flex",
71
+ alignItems: "center",
72
+ justifyContent: "center",
73
+ padding: 0,
74
+ transition: "background-color 0.2s ease-in-out",
75
+ flexShrink: 0,
76
+ outline: "none"
77
+ };
78
+ var iconButtonDisabledStyles = {
79
+ cursor: "not-allowed",
80
+ opacity: 0.5
81
+ };
82
+ var popoverContentStyles = {
83
+ backgroundColor: "white",
84
+ border: "1px solid #d1d1d1",
85
+ borderRadius: "8px",
86
+ padding: "8px",
87
+ minWidth: "180px",
88
+ boxShadow: "0 4px 12px rgba(0, 0, 0, 0.1)",
89
+ zIndex: 1e3
90
+ };
91
+ var menuItemStyles = {
92
+ padding: "8px 12px",
93
+ fontSize: "13px",
94
+ color: "#2f2f2f",
95
+ cursor: "pointer",
96
+ borderRadius: "4px",
97
+ border: "none",
98
+ backgroundColor: "white",
99
+ width: "100%",
100
+ textAlign: "left",
101
+ transition: "background-color 0.2s ease-in-out"
102
+ };
103
+ var TableControls = React.forwardRef(
104
+ ({
105
+ selectedCount = 0,
106
+ onActionsClick,
107
+ onUndoClick,
108
+ onRedoClick,
109
+ onHideColumnsClick,
110
+ onSearchClick,
111
+ onDownloadClick,
112
+ onTooltipsClick,
113
+ tooltipsEnabled = false,
114
+ onSettingsClick,
115
+ onExpandClick,
116
+ undoDisabled = false,
117
+ redoDisabled = false,
118
+ className,
119
+ style,
120
+ "data-testid": dataTestId
121
+ }, ref) => {
122
+ const [hoveredButton, setHoveredButton] = React.useState(null);
123
+ const [focusedButton, setFocusedButton] = React.useState(null);
124
+ const [actionsOpen, setActionsOpen] = React.useState(false);
125
+ const [hideColumnsOpen, setHideColumnsOpen] = React.useState(false);
126
+ const getIconButtonStyle = (buttonName, disabled = false) => {
127
+ if (disabled) {
128
+ return { ...iconButtonStyles, ...iconButtonDisabledStyles };
129
+ }
130
+ const isHovered = hoveredButton === buttonName;
131
+ const isFocused = focusedButton === buttonName;
132
+ return {
133
+ ...iconButtonStyles,
134
+ backgroundColor: isHovered ? "#f5f5f5" : "white",
135
+ boxShadow: isFocused ? "0 0 0 3px #3cad51" : "none"
136
+ };
137
+ };
138
+ const getDropdownButtonStyle = (buttonName) => {
139
+ const isHovered = hoveredButton === buttonName;
140
+ const isFocused = focusedButton === buttonName;
141
+ return {
142
+ ...dropdownButtonStyles,
143
+ backgroundColor: isHovered ? "#f5f5f5" : "white",
144
+ boxShadow: isFocused ? "0 0 0 3px #3cad51" : "none"
145
+ };
146
+ };
147
+ return /* @__PURE__ */ jsxs(
148
+ "div",
149
+ {
150
+ ref,
151
+ className: clsx("arbor-table-controls", className),
152
+ style: { ...containerStyles, ...style },
153
+ "data-testid": dataTestId,
154
+ children: [
155
+ /* @__PURE__ */ jsxs("div", { style: actions1Styles, children: [
156
+ onActionsClick && /* @__PURE__ */ jsxs(Popover.Root, { open: actionsOpen, onOpenChange: setActionsOpen, children: [
157
+ /* @__PURE__ */ jsx(Popover.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(
158
+ "button",
159
+ {
160
+ type: "button",
161
+ onClick: () => {
162
+ setActionsOpen(!actionsOpen);
163
+ onActionsClick();
164
+ },
165
+ onMouseEnter: () => setHoveredButton("actions"),
166
+ onMouseLeave: () => setHoveredButton(null),
167
+ onFocus: () => setFocusedButton("actions"),
168
+ onBlur: () => setFocusedButton(null),
169
+ style: getDropdownButtonStyle("actions"),
170
+ "aria-label": "Actions",
171
+ children: [
172
+ /* @__PURE__ */ jsxs("span", { style: dropdownTextStyles, children: [
173
+ "Actions (",
174
+ selectedCount,
175
+ ")"
176
+ ] }),
177
+ /* @__PURE__ */ jsx(ChevronDown, { size: 16, color: "#2f2f2f" })
178
+ ]
179
+ }
180
+ ) }),
181
+ /* @__PURE__ */ jsx(Popover.Portal, { children: /* @__PURE__ */ jsxs(
182
+ Popover.Content,
183
+ {
184
+ style: popoverContentStyles,
185
+ sideOffset: 4,
186
+ align: "start",
187
+ children: [
188
+ /* @__PURE__ */ jsx(
189
+ "button",
190
+ {
191
+ style: menuItemStyles,
192
+ onMouseEnter: (e) => e.currentTarget.style.backgroundColor = "#f5f5f5",
193
+ onMouseLeave: (e) => e.currentTarget.style.backgroundColor = "white",
194
+ onClick: () => {
195
+ console.log("Edit selected items");
196
+ setActionsOpen(false);
197
+ },
198
+ children: "Edit selected items"
199
+ }
200
+ ),
201
+ /* @__PURE__ */ jsx(
202
+ "button",
203
+ {
204
+ style: menuItemStyles,
205
+ onMouseEnter: (e) => e.currentTarget.style.backgroundColor = "#f5f5f5",
206
+ onMouseLeave: (e) => e.currentTarget.style.backgroundColor = "white",
207
+ onClick: () => {
208
+ console.log("Delete selected items");
209
+ setActionsOpen(false);
210
+ },
211
+ children: "Delete selected items"
212
+ }
213
+ ),
214
+ /* @__PURE__ */ jsx(
215
+ "button",
216
+ {
217
+ style: menuItemStyles,
218
+ onMouseEnter: (e) => e.currentTarget.style.backgroundColor = "#f5f5f5",
219
+ onMouseLeave: (e) => e.currentTarget.style.backgroundColor = "white",
220
+ onClick: () => {
221
+ console.log("Export selected items");
222
+ setActionsOpen(false);
223
+ },
224
+ children: "Export selected items"
225
+ }
226
+ )
227
+ ]
228
+ }
229
+ ) })
230
+ ] }),
231
+ onUndoClick && /* @__PURE__ */ jsx(
232
+ "button",
233
+ {
234
+ type: "button",
235
+ onClick: onUndoClick,
236
+ disabled: undoDisabled,
237
+ onMouseEnter: () => setHoveredButton("undo"),
238
+ onMouseLeave: () => setHoveredButton(null),
239
+ onFocus: () => setFocusedButton("undo"),
240
+ onBlur: () => setFocusedButton(null),
241
+ style: getIconButtonStyle("undo", undoDisabled),
242
+ "aria-label": "Undo",
243
+ children: /* @__PURE__ */ jsx(Undo2, { size: 16, color: "#2f2f2f" })
244
+ }
245
+ ),
246
+ onRedoClick && /* @__PURE__ */ jsx(
247
+ "button",
248
+ {
249
+ type: "button",
250
+ onClick: onRedoClick,
251
+ disabled: redoDisabled,
252
+ onMouseEnter: () => setHoveredButton("redo"),
253
+ onMouseLeave: () => setHoveredButton(null),
254
+ onFocus: () => setFocusedButton("redo"),
255
+ onBlur: () => setFocusedButton(null),
256
+ style: getIconButtonStyle("redo", redoDisabled),
257
+ "aria-label": "Redo",
258
+ children: /* @__PURE__ */ jsx(Redo2, { size: 16, color: "#2f2f2f" })
259
+ }
260
+ ),
261
+ onHideColumnsClick && /* @__PURE__ */ jsxs(Popover.Root, { open: hideColumnsOpen, onOpenChange: setHideColumnsOpen, children: [
262
+ /* @__PURE__ */ jsx(Popover.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(
263
+ "button",
264
+ {
265
+ type: "button",
266
+ onClick: () => {
267
+ setHideColumnsOpen(!hideColumnsOpen);
268
+ onHideColumnsClick();
269
+ },
270
+ onMouseEnter: () => setHoveredButton("hideColumns"),
271
+ onMouseLeave: () => setHoveredButton(null),
272
+ onFocus: () => setFocusedButton("hideColumns"),
273
+ onBlur: () => setFocusedButton(null),
274
+ style: getDropdownButtonStyle("hideColumns"),
275
+ "aria-label": "Hide Columns",
276
+ children: [
277
+ /* @__PURE__ */ jsx("span", { style: dropdownTextStyles, children: "Hide Columns" }),
278
+ /* @__PURE__ */ jsx(ChevronDown, { size: 16, color: "#2f2f2f" })
279
+ ]
280
+ }
281
+ ) }),
282
+ /* @__PURE__ */ jsx(Popover.Portal, { children: /* @__PURE__ */ jsxs(
283
+ Popover.Content,
284
+ {
285
+ style: popoverContentStyles,
286
+ sideOffset: 4,
287
+ align: "start",
288
+ children: [
289
+ /* @__PURE__ */ jsx(
290
+ "button",
291
+ {
292
+ style: menuItemStyles,
293
+ onMouseEnter: (e) => e.currentTarget.style.backgroundColor = "#f5f5f5",
294
+ onMouseLeave: (e) => e.currentTarget.style.backgroundColor = "white",
295
+ onClick: () => {
296
+ console.log("Hide Name column");
297
+ setHideColumnsOpen(false);
298
+ },
299
+ children: "Name"
300
+ }
301
+ ),
302
+ /* @__PURE__ */ jsx(
303
+ "button",
304
+ {
305
+ style: menuItemStyles,
306
+ onMouseEnter: (e) => e.currentTarget.style.backgroundColor = "#f5f5f5",
307
+ onMouseLeave: (e) => e.currentTarget.style.backgroundColor = "white",
308
+ onClick: () => {
309
+ console.log("Hide Email column");
310
+ setHideColumnsOpen(false);
311
+ },
312
+ children: "Email"
313
+ }
314
+ ),
315
+ /* @__PURE__ */ jsx(
316
+ "button",
317
+ {
318
+ style: menuItemStyles,
319
+ onMouseEnter: (e) => e.currentTarget.style.backgroundColor = "#f5f5f5",
320
+ onMouseLeave: (e) => e.currentTarget.style.backgroundColor = "white",
321
+ onClick: () => {
322
+ console.log("Hide Status column");
323
+ setHideColumnsOpen(false);
324
+ },
325
+ children: "Status"
326
+ }
327
+ ),
328
+ /* @__PURE__ */ jsx(
329
+ "button",
330
+ {
331
+ style: menuItemStyles,
332
+ onMouseEnter: (e) => e.currentTarget.style.backgroundColor = "#f5f5f5",
333
+ onMouseLeave: (e) => e.currentTarget.style.backgroundColor = "white",
334
+ onClick: () => {
335
+ console.log("Hide Date column");
336
+ setHideColumnsOpen(false);
337
+ },
338
+ children: "Date"
339
+ }
340
+ )
341
+ ]
342
+ }
343
+ ) })
344
+ ] })
345
+ ] }),
346
+ /* @__PURE__ */ jsxs("div", { style: actions2Styles, children: [
347
+ onSearchClick && /* @__PURE__ */ jsx(
348
+ "button",
349
+ {
350
+ type: "button",
351
+ onClick: onSearchClick,
352
+ onMouseEnter: () => setHoveredButton("search"),
353
+ onMouseLeave: () => setHoveredButton(null),
354
+ onFocus: () => setFocusedButton("search"),
355
+ onBlur: () => setFocusedButton(null),
356
+ style: getIconButtonStyle("search"),
357
+ "aria-label": "Search",
358
+ children: /* @__PURE__ */ jsx(Search, { size: 16, color: "#2f2f2f" })
359
+ }
360
+ ),
361
+ onDownloadClick && /* @__PURE__ */ jsx(
362
+ "button",
363
+ {
364
+ type: "button",
365
+ onClick: onDownloadClick,
366
+ onMouseEnter: () => setHoveredButton("download"),
367
+ onMouseLeave: () => setHoveredButton(null),
368
+ onFocus: () => setFocusedButton("download"),
369
+ onBlur: () => setFocusedButton(null),
370
+ style: getIconButtonStyle("download"),
371
+ "aria-label": "Download",
372
+ children: /* @__PURE__ */ jsx(Download, { size: 16, color: "#2f2f2f" })
373
+ }
374
+ ),
375
+ onTooltipsClick && /* @__PURE__ */ jsx(
376
+ "button",
377
+ {
378
+ type: "button",
379
+ onClick: onTooltipsClick,
380
+ onMouseEnter: () => setHoveredButton("tooltips"),
381
+ onMouseLeave: () => setHoveredButton(null),
382
+ onFocus: () => setFocusedButton("tooltips"),
383
+ onBlur: () => setFocusedButton(null),
384
+ style: getIconButtonStyle("tooltips"),
385
+ "aria-label": tooltipsEnabled ? "Disable tooltips" : "Enable tooltips",
386
+ children: /* @__PURE__ */ jsx(
387
+ MessageSquare,
388
+ {
389
+ size: 16,
390
+ color: "#2f2f2f"
391
+ }
392
+ )
393
+ }
394
+ ),
395
+ onSettingsClick && /* @__PURE__ */ jsx(
396
+ "button",
397
+ {
398
+ type: "button",
399
+ onClick: onSettingsClick,
400
+ onMouseEnter: () => setHoveredButton("settings"),
401
+ onMouseLeave: () => setHoveredButton(null),
402
+ onFocus: () => setFocusedButton("settings"),
403
+ onBlur: () => setFocusedButton(null),
404
+ style: getIconButtonStyle("settings"),
405
+ "aria-label": "Settings",
406
+ children: /* @__PURE__ */ jsx(Settings, { size: 16, color: "#2f2f2f" })
407
+ }
408
+ ),
409
+ onExpandClick && /* @__PURE__ */ jsx(
410
+ "button",
411
+ {
412
+ type: "button",
413
+ onClick: onExpandClick,
414
+ onMouseEnter: () => setHoveredButton("expand"),
415
+ onMouseLeave: () => setHoveredButton(null),
416
+ onFocus: () => setFocusedButton("expand"),
417
+ onBlur: () => setFocusedButton(null),
418
+ style: getIconButtonStyle("expand"),
419
+ "aria-label": "Expand",
420
+ children: /* @__PURE__ */ jsx(Expand, { size: 16, color: "#2f2f2f" })
421
+ }
422
+ )
423
+ ] })
424
+ ]
425
+ }
426
+ );
427
+ }
428
+ );
429
+ TableControls.displayName = "TableControls";
430
+
431
+ export {
432
+ TableControls
433
+ };
434
+ //# sourceMappingURL=chunk-G5NVKF2G.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/TableControls/TableControls.tsx"],"sourcesContent":["import * as React from 'react';\nimport { clsx } from 'clsx';\nimport * as Popover from '@radix-ui/react-popover';\nimport {\n ChevronDown,\n Undo2,\n Redo2,\n Search,\n Download,\n MessageSquare,\n Settings,\n Expand,\n} from 'lucide-react';\n\nexport interface TableControlsProps {\n /**\n * Number of selected items for the Actions button\n */\n selectedCount?: number;\n /**\n * Callback when Actions dropdown is clicked\n */\n onActionsClick?: () => void;\n /**\n * Callback when Undo is clicked\n */\n onUndoClick?: () => void;\n /**\n * Callback when Redo is clicked\n */\n onRedoClick?: () => void;\n /**\n * Callback when Hide Columns is clicked\n */\n onHideColumnsClick?: () => void;\n /**\n * Callback when Search is clicked\n */\n onSearchClick?: () => void;\n /**\n * Callback when Download is clicked\n */\n onDownloadClick?: () => void;\n /**\n * Callback when Tooltips toggle is clicked\n */\n onTooltipsClick?: () => void;\n /**\n * Whether tooltips are enabled\n */\n tooltipsEnabled?: boolean;\n /**\n * Callback when Settings is clicked\n */\n onSettingsClick?: () => void;\n /**\n * Callback when Expand is clicked\n */\n onExpandClick?: () => void;\n /**\n * Whether undo is disabled\n */\n undoDisabled?: boolean;\n /**\n * Whether redo is disabled\n */\n redoDisabled?: boolean;\n /**\n * Custom className\n */\n className?: string;\n /**\n * Custom style\n */\n style?: React.CSSProperties;\n /**\n * Test ID for testing\n */\n 'data-testid'?: string;\n}\n\nconst containerStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingTop: '8px',\n paddingBottom: '8px',\n paddingLeft: 0,\n paddingRight: 0,\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n};\n\nconst actions1Styles: React.CSSProperties = {\n display: 'flex',\n gap: '12px',\n alignItems: 'center',\n};\n\nconst actions2Styles: React.CSSProperties = {\n display: 'flex',\n gap: '12px',\n alignItems: 'center',\n justifyContent: 'flex-end',\n flexGrow: 1,\n paddingRight: '4px',\n};\n\nconst dropdownButtonStyles: React.CSSProperties = {\n height: '32px',\n backgroundColor: 'white',\n border: '1px solid #d1d1d1',\n borderRadius: '8px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n paddingLeft: '12px',\n paddingRight: '8px',\n paddingTop: 0,\n paddingBottom: 0,\n cursor: 'pointer',\n transition: 'background-color 0.2s ease-in-out',\n outline: 'none',\n};\n\nconst dropdownTextStyles: React.CSSProperties = {\n fontSize: '13px',\n fontWeight: 600,\n lineHeight: '1.5',\n color: '#2f2f2f',\n textAlign: 'center',\n};\n\nconst iconButtonStyles: React.CSSProperties = {\n width: '32px',\n height: '32px',\n borderRadius: '99px',\n border: 'none',\n backgroundColor: 'white',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 0,\n transition: 'background-color 0.2s ease-in-out',\n flexShrink: 0,\n outline: 'none',\n};\n\nconst iconButtonDisabledStyles: React.CSSProperties = {\n cursor: 'not-allowed',\n opacity: 0.5,\n};\n\nconst popoverContentStyles: React.CSSProperties = {\n backgroundColor: 'white',\n border: '1px solid #d1d1d1',\n borderRadius: '8px',\n padding: '8px',\n minWidth: '180px',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.1)',\n zIndex: 1000,\n};\n\nconst menuItemStyles: React.CSSProperties = {\n padding: '8px 12px',\n fontSize: '13px',\n color: '#2f2f2f',\n cursor: 'pointer',\n borderRadius: '4px',\n border: 'none',\n backgroundColor: 'white',\n width: '100%',\n textAlign: 'left',\n transition: 'background-color 0.2s ease-in-out',\n};\n\n/**\n * TableControls component - Arbor Design System\n *\n * A toolbar component with action buttons and controls for tables.\n */\nexport const TableControls = React.forwardRef<HTMLDivElement, TableControlsProps>(\n (\n {\n selectedCount = 0,\n onActionsClick,\n onUndoClick,\n onRedoClick,\n onHideColumnsClick,\n onSearchClick,\n onDownloadClick,\n onTooltipsClick,\n tooltipsEnabled = false,\n onSettingsClick,\n onExpandClick,\n undoDisabled = false,\n redoDisabled = false,\n className,\n style,\n 'data-testid': dataTestId,\n },\n ref\n ) => {\n const [hoveredButton, setHoveredButton] = React.useState<string | null>(null);\n const [focusedButton, setFocusedButton] = React.useState<string | null>(null);\n const [actionsOpen, setActionsOpen] = React.useState(false);\n const [hideColumnsOpen, setHideColumnsOpen] = React.useState(false);\n\n const getIconButtonStyle = (\n buttonName: string,\n disabled: boolean = false\n ): React.CSSProperties => {\n if (disabled) {\n return { ...iconButtonStyles, ...iconButtonDisabledStyles };\n }\n\n const isHovered = hoveredButton === buttonName;\n const isFocused = focusedButton === buttonName;\n return {\n ...iconButtonStyles,\n backgroundColor: isHovered ? '#f5f5f5' : 'white',\n boxShadow: isFocused ? '0 0 0 3px #3cad51' : 'none',\n };\n };\n\n const getDropdownButtonStyle = (buttonName: string): React.CSSProperties => {\n const isHovered = hoveredButton === buttonName;\n const isFocused = focusedButton === buttonName;\n return {\n ...dropdownButtonStyles,\n backgroundColor: isHovered ? '#f5f5f5' : 'white',\n boxShadow: isFocused ? '0 0 0 3px #3cad51' : 'none',\n };\n };\n\n return (\n <div\n ref={ref}\n className={clsx('arbor-table-controls', className)}\n style={{ ...containerStyles, ...style }}\n data-testid={dataTestId}\n >\n {/* Left section - Actions 1 */}\n <div style={actions1Styles}>\n {onActionsClick && (\n <Popover.Root open={actionsOpen} onOpenChange={setActionsOpen}>\n <Popover.Trigger asChild>\n <button\n type=\"button\"\n onClick={() => {\n setActionsOpen(!actionsOpen);\n onActionsClick();\n }}\n onMouseEnter={() => setHoveredButton('actions')}\n onMouseLeave={() => setHoveredButton(null)}\n onFocus={() => setFocusedButton('actions')}\n onBlur={() => setFocusedButton(null)}\n style={getDropdownButtonStyle('actions')}\n aria-label=\"Actions\"\n >\n <span style={dropdownTextStyles}>Actions ({selectedCount})</span>\n <ChevronDown size={16} color=\"#2f2f2f\" />\n </button>\n </Popover.Trigger>\n <Popover.Portal>\n <Popover.Content\n style={popoverContentStyles}\n sideOffset={4}\n align=\"start\"\n >\n <button\n style={menuItemStyles}\n onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = '#f5f5f5')}\n onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = 'white')}\n onClick={() => {\n console.log('Edit selected items');\n setActionsOpen(false);\n }}\n >\n Edit selected items\n </button>\n <button\n style={menuItemStyles}\n onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = '#f5f5f5')}\n onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = 'white')}\n onClick={() => {\n console.log('Delete selected items');\n setActionsOpen(false);\n }}\n >\n Delete selected items\n </button>\n <button\n style={menuItemStyles}\n onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = '#f5f5f5')}\n onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = 'white')}\n onClick={() => {\n console.log('Export selected items');\n setActionsOpen(false);\n }}\n >\n Export selected items\n </button>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n )}\n\n {onUndoClick && (\n <button\n type=\"button\"\n onClick={onUndoClick}\n disabled={undoDisabled}\n onMouseEnter={() => setHoveredButton('undo')}\n onMouseLeave={() => setHoveredButton(null)}\n onFocus={() => setFocusedButton('undo')}\n onBlur={() => setFocusedButton(null)}\n style={getIconButtonStyle('undo', undoDisabled)}\n aria-label=\"Undo\"\n >\n <Undo2 size={16} color=\"#2f2f2f\" />\n </button>\n )}\n\n {onRedoClick && (\n <button\n type=\"button\"\n onClick={onRedoClick}\n disabled={redoDisabled}\n onMouseEnter={() => setHoveredButton('redo')}\n onMouseLeave={() => setHoveredButton(null)}\n onFocus={() => setFocusedButton('redo')}\n onBlur={() => setFocusedButton(null)}\n style={getIconButtonStyle('redo', redoDisabled)}\n aria-label=\"Redo\"\n >\n <Redo2 size={16} color=\"#2f2f2f\" />\n </button>\n )}\n\n {onHideColumnsClick && (\n <Popover.Root open={hideColumnsOpen} onOpenChange={setHideColumnsOpen}>\n <Popover.Trigger asChild>\n <button\n type=\"button\"\n onClick={() => {\n setHideColumnsOpen(!hideColumnsOpen);\n onHideColumnsClick();\n }}\n onMouseEnter={() => setHoveredButton('hideColumns')}\n onMouseLeave={() => setHoveredButton(null)}\n onFocus={() => setFocusedButton('hideColumns')}\n onBlur={() => setFocusedButton(null)}\n style={getDropdownButtonStyle('hideColumns')}\n aria-label=\"Hide Columns\"\n >\n <span style={dropdownTextStyles}>Hide Columns</span>\n <ChevronDown size={16} color=\"#2f2f2f\" />\n </button>\n </Popover.Trigger>\n <Popover.Portal>\n <Popover.Content\n style={popoverContentStyles}\n sideOffset={4}\n align=\"start\"\n >\n <button\n style={menuItemStyles}\n onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = '#f5f5f5')}\n onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = 'white')}\n onClick={() => {\n console.log('Hide Name column');\n setHideColumnsOpen(false);\n }}\n >\n Name\n </button>\n <button\n style={menuItemStyles}\n onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = '#f5f5f5')}\n onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = 'white')}\n onClick={() => {\n console.log('Hide Email column');\n setHideColumnsOpen(false);\n }}\n >\n Email\n </button>\n <button\n style={menuItemStyles}\n onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = '#f5f5f5')}\n onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = 'white')}\n onClick={() => {\n console.log('Hide Status column');\n setHideColumnsOpen(false);\n }}\n >\n Status\n </button>\n <button\n style={menuItemStyles}\n onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = '#f5f5f5')}\n onMouseLeave={(e) => (e.currentTarget.style.backgroundColor = 'white')}\n onClick={() => {\n console.log('Hide Date column');\n setHideColumnsOpen(false);\n }}\n >\n Date\n </button>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n )}\n </div>\n\n {/* Right section - Actions 2 */}\n <div style={actions2Styles}>\n {onSearchClick && (\n <button\n type=\"button\"\n onClick={onSearchClick}\n onMouseEnter={() => setHoveredButton('search')}\n onMouseLeave={() => setHoveredButton(null)}\n onFocus={() => setFocusedButton('search')}\n onBlur={() => setFocusedButton(null)}\n style={getIconButtonStyle('search')}\n aria-label=\"Search\"\n >\n <Search size={16} color=\"#2f2f2f\" />\n </button>\n )}\n\n {onDownloadClick && (\n <button\n type=\"button\"\n onClick={onDownloadClick}\n onMouseEnter={() => setHoveredButton('download')}\n onMouseLeave={() => setHoveredButton(null)}\n onFocus={() => setFocusedButton('download')}\n onBlur={() => setFocusedButton(null)}\n style={getIconButtonStyle('download')}\n aria-label=\"Download\"\n >\n <Download size={16} color=\"#2f2f2f\" />\n </button>\n )}\n\n {onTooltipsClick && (\n <button\n type=\"button\"\n onClick={onTooltipsClick}\n onMouseEnter={() => setHoveredButton('tooltips')}\n onMouseLeave={() => setHoveredButton(null)}\n onFocus={() => setFocusedButton('tooltips')}\n onBlur={() => setFocusedButton(null)}\n style={getIconButtonStyle('tooltips')}\n aria-label={tooltipsEnabled ? 'Disable tooltips' : 'Enable tooltips'}\n >\n <MessageSquare\n size={16}\n color=\"#2f2f2f\"\n />\n </button>\n )}\n\n {onSettingsClick && (\n <button\n type=\"button\"\n onClick={onSettingsClick}\n onMouseEnter={() => setHoveredButton('settings')}\n onMouseLeave={() => setHoveredButton(null)}\n onFocus={() => setFocusedButton('settings')}\n onBlur={() => setFocusedButton(null)}\n style={getIconButtonStyle('settings')}\n aria-label=\"Settings\"\n >\n <Settings size={16} color=\"#2f2f2f\" />\n </button>\n )}\n\n {onExpandClick && (\n <button\n type=\"button\"\n onClick={onExpandClick}\n onMouseEnter={() => setHoveredButton('expand')}\n onMouseLeave={() => setHoveredButton(null)}\n onFocus={() => setFocusedButton('expand')}\n onBlur={() => setFocusedButton(null)}\n style={getIconButtonStyle('expand')}\n aria-label=\"Expand\"\n >\n <Expand size={16} color=\"#2f2f2f\" />\n </button>\n )}\n </div>\n </div>\n );\n }\n);\n\nTableControls.displayName = 'TableControls';\n"],"mappings":";AAAA,YAAY,WAAW;AACvB,SAAS,YAAY;AACrB,YAAY,aAAa;AACzB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAyPW,SACA,KADA;AApLlB,IAAM,kBAAuC;AAAA,EAC3C,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,aAAa;AAAA,EACb,cAAc;AAAA,EACd,YAAY;AACd;AAEA,IAAM,iBAAsC;AAAA,EAC1C,SAAS;AAAA,EACT,KAAK;AAAA,EACL,YAAY;AACd;AAEA,IAAM,iBAAsC;AAAA,EAC1C,SAAS;AAAA,EACT,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,cAAc;AAChB;AAEA,IAAM,uBAA4C;AAAA,EAChD,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,KAAK;AAAA,EACL,aAAa;AAAA,EACb,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,SAAS;AACX;AAEA,IAAM,qBAA0C;AAAA,EAC9C,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,WAAW;AACb;AAEA,IAAM,mBAAwC;AAAA,EAC5C,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,SAAS;AACX;AAEA,IAAM,2BAAgD;AAAA,EACpD,QAAQ;AAAA,EACR,SAAS;AACX;AAEA,IAAM,uBAA4C;AAAA,EAChD,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,SAAS;AAAA,EACT,UAAU;AAAA,EACV,WAAW;AAAA,EACX,QAAQ;AACV;AAEA,IAAM,iBAAsC;AAAA,EAC1C,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,OAAO;AAAA,EACP,WAAW;AAAA,EACX,YAAY;AACd;AAOO,IAAM,gBAAsB;AAAA,EACjC,CACE;AAAA,IACE,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA,eAAe;AAAA,EACjB,GACA,QACG;AACH,UAAM,CAAC,eAAe,gBAAgB,IAAU,eAAwB,IAAI;AAC5E,UAAM,CAAC,eAAe,gBAAgB,IAAU,eAAwB,IAAI;AAC5E,UAAM,CAAC,aAAa,cAAc,IAAU,eAAS,KAAK;AAC1D,UAAM,CAAC,iBAAiB,kBAAkB,IAAU,eAAS,KAAK;AAElE,UAAM,qBAAqB,CACzB,YACA,WAAoB,UACI;AACxB,UAAI,UAAU;AACZ,eAAO,EAAE,GAAG,kBAAkB,GAAG,yBAAyB;AAAA,MAC5D;AAEA,YAAM,YAAY,kBAAkB;AACpC,YAAM,YAAY,kBAAkB;AACpC,aAAO;AAAA,QACL,GAAG;AAAA,QACH,iBAAiB,YAAY,YAAY;AAAA,QACzC,WAAW,YAAY,sBAAsB;AAAA,MAC/C;AAAA,IACF;AAEA,UAAM,yBAAyB,CAAC,eAA4C;AAC1E,YAAM,YAAY,kBAAkB;AACpC,YAAM,YAAY,kBAAkB;AACpC,aAAO;AAAA,QACL,GAAG;AAAA,QACH,iBAAiB,YAAY,YAAY;AAAA,QACzC,WAAW,YAAY,sBAAsB;AAAA,MAC/C;AAAA,IACF;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW,KAAK,wBAAwB,SAAS;AAAA,QACjD,OAAO,EAAE,GAAG,iBAAiB,GAAG,MAAM;AAAA,QACtC,eAAa;AAAA,QAGb;AAAA,+BAAC,SAAI,OAAO,gBACT;AAAA,8BACC,qBAAS,cAAR,EAAa,MAAM,aAAa,cAAc,gBAC7C;AAAA,kCAAS,iBAAR,EAAgB,SAAO,MACtB;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,MAAM;AACb,mCAAe,CAAC,WAAW;AAC3B,mCAAe;AAAA,kBACjB;AAAA,kBACA,cAAc,MAAM,iBAAiB,SAAS;AAAA,kBAC9C,cAAc,MAAM,iBAAiB,IAAI;AAAA,kBACzC,SAAS,MAAM,iBAAiB,SAAS;AAAA,kBACzC,QAAQ,MAAM,iBAAiB,IAAI;AAAA,kBACnC,OAAO,uBAAuB,SAAS;AAAA,kBACvC,cAAW;AAAA,kBAEX;AAAA,yCAAC,UAAK,OAAO,oBAAoB;AAAA;AAAA,sBAAU;AAAA,sBAAc;AAAA,uBAAC;AAAA,oBAC1D,oBAAC,eAAY,MAAM,IAAI,OAAM,WAAU;AAAA;AAAA;AAAA,cACzC,GACF;AAAA,cACA,oBAAS,gBAAR,EACC;AAAA,gBAAS;AAAA,gBAAR;AAAA,kBACC,OAAO;AAAA,kBACP,YAAY;AAAA,kBACZ,OAAM;AAAA,kBAEN;AAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,wBACP,cAAc,CAAC,MAAO,EAAE,cAAc,MAAM,kBAAkB;AAAA,wBAC9D,cAAc,CAAC,MAAO,EAAE,cAAc,MAAM,kBAAkB;AAAA,wBAC9D,SAAS,MAAM;AACb,kCAAQ,IAAI,qBAAqB;AACjC,yCAAe,KAAK;AAAA,wBACtB;AAAA,wBACD;AAAA;AAAA,oBAED;AAAA,oBACA;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,wBACP,cAAc,CAAC,MAAO,EAAE,cAAc,MAAM,kBAAkB;AAAA,wBAC9D,cAAc,CAAC,MAAO,EAAE,cAAc,MAAM,kBAAkB;AAAA,wBAC9D,SAAS,MAAM;AACb,kCAAQ,IAAI,uBAAuB;AACnC,yCAAe,KAAK;AAAA,wBACtB;AAAA,wBACD;AAAA;AAAA,oBAED;AAAA,oBACA;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,wBACP,cAAc,CAAC,MAAO,EAAE,cAAc,MAAM,kBAAkB;AAAA,wBAC9D,cAAc,CAAC,MAAO,EAAE,cAAc,MAAM,kBAAkB;AAAA,wBAC9D,SAAS,MAAM;AACb,kCAAQ,IAAI,uBAAuB;AACnC,yCAAe,KAAK;AAAA,wBACtB;AAAA,wBACD;AAAA;AAAA,oBAED;AAAA;AAAA;AAAA,cACF,GACF;AAAA,eACF;AAAA,YAGD,eACC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,cAAc,MAAM,iBAAiB,MAAM;AAAA,gBAC3C,cAAc,MAAM,iBAAiB,IAAI;AAAA,gBACzC,SAAS,MAAM,iBAAiB,MAAM;AAAA,gBACtC,QAAQ,MAAM,iBAAiB,IAAI;AAAA,gBACnC,OAAO,mBAAmB,QAAQ,YAAY;AAAA,gBAC9C,cAAW;AAAA,gBAEX,8BAAC,SAAM,MAAM,IAAI,OAAM,WAAU;AAAA;AAAA,YACnC;AAAA,YAGD,eACC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,cAAc,MAAM,iBAAiB,MAAM;AAAA,gBAC3C,cAAc,MAAM,iBAAiB,IAAI;AAAA,gBACzC,SAAS,MAAM,iBAAiB,MAAM;AAAA,gBACtC,QAAQ,MAAM,iBAAiB,IAAI;AAAA,gBACnC,OAAO,mBAAmB,QAAQ,YAAY;AAAA,gBAC9C,cAAW;AAAA,gBAEX,8BAAC,SAAM,MAAM,IAAI,OAAM,WAAU;AAAA;AAAA,YACnC;AAAA,YAGD,sBACC,qBAAS,cAAR,EAAa,MAAM,iBAAiB,cAAc,oBACjD;AAAA,kCAAS,iBAAR,EAAgB,SAAO,MACtB;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,MAAM;AACb,uCAAmB,CAAC,eAAe;AACnC,uCAAmB;AAAA,kBACrB;AAAA,kBACA,cAAc,MAAM,iBAAiB,aAAa;AAAA,kBAClD,cAAc,MAAM,iBAAiB,IAAI;AAAA,kBACzC,SAAS,MAAM,iBAAiB,aAAa;AAAA,kBAC7C,QAAQ,MAAM,iBAAiB,IAAI;AAAA,kBACnC,OAAO,uBAAuB,aAAa;AAAA,kBAC3C,cAAW;AAAA,kBAEX;AAAA,wCAAC,UAAK,OAAO,oBAAoB,0BAAY;AAAA,oBAC7C,oBAAC,eAAY,MAAM,IAAI,OAAM,WAAU;AAAA;AAAA;AAAA,cACzC,GACF;AAAA,cACA,oBAAS,gBAAR,EACC;AAAA,gBAAS;AAAA,gBAAR;AAAA,kBACC,OAAO;AAAA,kBACP,YAAY;AAAA,kBACZ,OAAM;AAAA,kBAEN;AAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,wBACP,cAAc,CAAC,MAAO,EAAE,cAAc,MAAM,kBAAkB;AAAA,wBAC9D,cAAc,CAAC,MAAO,EAAE,cAAc,MAAM,kBAAkB;AAAA,wBAC9D,SAAS,MAAM;AACb,kCAAQ,IAAI,kBAAkB;AAC9B,6CAAmB,KAAK;AAAA,wBAC1B;AAAA,wBACD;AAAA;AAAA,oBAED;AAAA,oBACA;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,wBACP,cAAc,CAAC,MAAO,EAAE,cAAc,MAAM,kBAAkB;AAAA,wBAC9D,cAAc,CAAC,MAAO,EAAE,cAAc,MAAM,kBAAkB;AAAA,wBAC9D,SAAS,MAAM;AACb,kCAAQ,IAAI,mBAAmB;AAC/B,6CAAmB,KAAK;AAAA,wBAC1B;AAAA,wBACD;AAAA;AAAA,oBAED;AAAA,oBACA;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,wBACP,cAAc,CAAC,MAAO,EAAE,cAAc,MAAM,kBAAkB;AAAA,wBAC9D,cAAc,CAAC,MAAO,EAAE,cAAc,MAAM,kBAAkB;AAAA,wBAC9D,SAAS,MAAM;AACb,kCAAQ,IAAI,oBAAoB;AAChC,6CAAmB,KAAK;AAAA,wBAC1B;AAAA,wBACD;AAAA;AAAA,oBAED;AAAA,oBACA;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,wBACP,cAAc,CAAC,MAAO,EAAE,cAAc,MAAM,kBAAkB;AAAA,wBAC9D,cAAc,CAAC,MAAO,EAAE,cAAc,MAAM,kBAAkB;AAAA,wBAC9D,SAAS,MAAM;AACb,kCAAQ,IAAI,kBAAkB;AAC9B,6CAAmB,KAAK;AAAA,wBAC1B;AAAA,wBACD;AAAA;AAAA,oBAED;AAAA;AAAA;AAAA,cACF,GACF;AAAA,eACF;AAAA,aAEJ;AAAA,UAGA,qBAAC,SAAI,OAAO,gBACT;AAAA,6BACC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,cAAc,MAAM,iBAAiB,QAAQ;AAAA,gBAC7C,cAAc,MAAM,iBAAiB,IAAI;AAAA,gBACzC,SAAS,MAAM,iBAAiB,QAAQ;AAAA,gBACxC,QAAQ,MAAM,iBAAiB,IAAI;AAAA,gBACnC,OAAO,mBAAmB,QAAQ;AAAA,gBAClC,cAAW;AAAA,gBAEX,8BAAC,UAAO,MAAM,IAAI,OAAM,WAAU;AAAA;AAAA,YACpC;AAAA,YAGD,mBACC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,cAAc,MAAM,iBAAiB,UAAU;AAAA,gBAC/C,cAAc,MAAM,iBAAiB,IAAI;AAAA,gBACzC,SAAS,MAAM,iBAAiB,UAAU;AAAA,gBAC1C,QAAQ,MAAM,iBAAiB,IAAI;AAAA,gBACnC,OAAO,mBAAmB,UAAU;AAAA,gBACpC,cAAW;AAAA,gBAEX,8BAAC,YAAS,MAAM,IAAI,OAAM,WAAU;AAAA;AAAA,YACtC;AAAA,YAGD,mBACC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,cAAc,MAAM,iBAAiB,UAAU;AAAA,gBAC/C,cAAc,MAAM,iBAAiB,IAAI;AAAA,gBACzC,SAAS,MAAM,iBAAiB,UAAU;AAAA,gBAC1C,QAAQ,MAAM,iBAAiB,IAAI;AAAA,gBACnC,OAAO,mBAAmB,UAAU;AAAA,gBACpC,cAAY,kBAAkB,qBAAqB;AAAA,gBAEnD;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAM;AAAA,oBACN,OAAM;AAAA;AAAA,gBACR;AAAA;AAAA,YACF;AAAA,YAGD,mBACC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,cAAc,MAAM,iBAAiB,UAAU;AAAA,gBAC/C,cAAc,MAAM,iBAAiB,IAAI;AAAA,gBACzC,SAAS,MAAM,iBAAiB,UAAU;AAAA,gBAC1C,QAAQ,MAAM,iBAAiB,IAAI;AAAA,gBACnC,OAAO,mBAAmB,UAAU;AAAA,gBACpC,cAAW;AAAA,gBAEX,8BAAC,YAAS,MAAM,IAAI,OAAM,WAAU;AAAA;AAAA,YACtC;AAAA,YAGD,iBACC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,cAAc,MAAM,iBAAiB,QAAQ;AAAA,gBAC7C,cAAc,MAAM,iBAAiB,IAAI;AAAA,gBACzC,SAAS,MAAM,iBAAiB,QAAQ;AAAA,gBACxC,QAAQ,MAAM,iBAAiB,IAAI;AAAA,gBACnC,OAAO,mBAAmB,QAAQ;AAAA,gBAClC,cAAW;AAAA,gBAEX,8BAAC,UAAO,MAAM,IAAI,OAAM,WAAU;AAAA;AAAA,YACpC;AAAA,aAEJ;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,cAAc,cAAc;","names":[]}
@@ -0,0 +1,122 @@
1
+ // src/Avatar/Avatar.tsx
2
+ import * as React from "react";
3
+ import { User } from "lucide-react";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ var sizeConfig = {
6
+ small: {
7
+ size: 20,
8
+ fontSize: 0,
9
+ // Too small for initials
10
+ fontWeight: 400,
11
+ iconSize: 12,
12
+ borderRadius: "99px"
13
+ },
14
+ medium: {
15
+ size: 32,
16
+ fontSize: 13,
17
+ fontWeight: 400,
18
+ iconSize: 16,
19
+ borderRadius: "99px"
20
+ },
21
+ large: {
22
+ size: 48,
23
+ fontSize: 13,
24
+ fontWeight: 400,
25
+ iconSize: 24,
26
+ borderRadius: "4px"
27
+ },
28
+ "extra-large": {
29
+ size: 96,
30
+ fontSize: 27,
31
+ fontWeight: 600,
32
+ iconSize: 48,
33
+ borderRadius: "8px"
34
+ }
35
+ };
36
+ var Avatar = React.forwardRef(
37
+ ({
38
+ size = "medium",
39
+ src,
40
+ initials,
41
+ alt = "Avatar",
42
+ className,
43
+ style,
44
+ "data-testid": dataTestId
45
+ }, ref) => {
46
+ const [isHovered, setIsHovered] = React.useState(false);
47
+ const [imageError, setImageError] = React.useState(false);
48
+ const config = sizeConfig[size];
49
+ const hasHoverState = size === "small";
50
+ const containerStyles = {
51
+ width: `${config.size}px`,
52
+ height: `${config.size}px`,
53
+ borderRadius: config.borderRadius,
54
+ border: "1px solid #efefef",
55
+ overflow: "hidden",
56
+ position: "relative",
57
+ backgroundColor: "#f8f8f8",
58
+ display: "flex",
59
+ alignItems: "center",
60
+ justifyContent: "center",
61
+ fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
62
+ cursor: "default",
63
+ boxSizing: "border-box",
64
+ ...style
65
+ };
66
+ const hoverOverlayStyles = {
67
+ position: "absolute",
68
+ inset: 0,
69
+ pointerEvents: "none",
70
+ boxShadow: isHovered && hasHoverState ? "inset 0px 4px 100px 0px rgba(32, 32, 32, 0.3)" : "none",
71
+ borderRadius: config.borderRadius,
72
+ transition: "box-shadow 0.2s ease-in-out"
73
+ };
74
+ const imageStyles = {
75
+ width: "100%",
76
+ height: "100%",
77
+ objectFit: "cover"
78
+ };
79
+ const initialsStyles = {
80
+ fontSize: `${config.fontSize}px`,
81
+ fontWeight: config.fontWeight,
82
+ color: "#2f2f2f",
83
+ lineHeight: 1.5,
84
+ textAlign: "center",
85
+ userSelect: "none"
86
+ };
87
+ const showImage = src && !imageError;
88
+ const showInitials = !showImage && initials && size !== "small";
89
+ const showPlaceholder = !showImage && !showInitials;
90
+ return /* @__PURE__ */ jsxs(
91
+ "div",
92
+ {
93
+ ref,
94
+ className,
95
+ style: containerStyles,
96
+ onMouseEnter: () => setIsHovered(true),
97
+ onMouseLeave: () => setIsHovered(false),
98
+ "data-testid": dataTestId,
99
+ children: [
100
+ showImage && /* @__PURE__ */ jsx(
101
+ "img",
102
+ {
103
+ src,
104
+ alt,
105
+ style: imageStyles,
106
+ onError: () => setImageError(true)
107
+ }
108
+ ),
109
+ showInitials && /* @__PURE__ */ jsx("span", { style: initialsStyles, children: initials.slice(0, 2).toUpperCase() }),
110
+ showPlaceholder && /* @__PURE__ */ jsx(User, { size: config.iconSize, color: "#d1d1d1", strokeWidth: 2 }),
111
+ /* @__PURE__ */ jsx("div", { style: hoverOverlayStyles })
112
+ ]
113
+ }
114
+ );
115
+ }
116
+ );
117
+ Avatar.displayName = "Avatar";
118
+
119
+ export {
120
+ Avatar
121
+ };
122
+ //# sourceMappingURL=chunk-JSG27ZZS.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Avatar/Avatar.tsx"],"sourcesContent":["import * as React from 'react';\nimport { User } from 'lucide-react';\n\nexport type AvatarSize = 'small' | 'medium' | 'large' | 'extra-large';\n\nexport interface AvatarProps {\n /**\n * Size of the avatar\n */\n size?: AvatarSize;\n /**\n * Image source URL\n */\n src?: string;\n /**\n * Initials to display (2 characters) when no image is provided\n */\n initials?: string;\n /**\n * Alt text for the image\n */\n alt?: string;\n /**\n * Custom className\n */\n className?: string;\n /**\n * Custom style\n */\n style?: React.CSSProperties;\n /**\n * Test ID for testing\n */\n 'data-testid'?: string;\n}\n\nconst sizeConfig = {\n small: {\n size: 20,\n fontSize: 0, // Too small for initials\n fontWeight: 400,\n iconSize: 12,\n borderRadius: '99px',\n },\n medium: {\n size: 32,\n fontSize: 13,\n fontWeight: 400,\n iconSize: 16,\n borderRadius: '99px',\n },\n large: {\n size: 48,\n fontSize: 13,\n fontWeight: 400,\n iconSize: 24,\n borderRadius: '4px',\n },\n 'extra-large': {\n size: 96,\n fontSize: 27,\n fontWeight: 600,\n iconSize: 48,\n borderRadius: '8px',\n },\n};\n\n/**\n * Avatar component - Arbor Design System\n *\n * Displays a user avatar with support for images, initials, or a placeholder icon.\n * Features hover state with inner shadow effect.\n */\nexport const Avatar = React.forwardRef<HTMLDivElement, AvatarProps>(\n (\n {\n size = 'medium',\n src,\n initials,\n alt = 'Avatar',\n className,\n style,\n 'data-testid': dataTestId,\n },\n ref\n ) => {\n const [isHovered, setIsHovered] = React.useState(false);\n const [imageError, setImageError] = React.useState(false);\n const config = sizeConfig[size];\n\n // Only apply hover state for small size\n const hasHoverState = size === 'small';\n\n const containerStyles: React.CSSProperties = {\n width: `${config.size}px`,\n height: `${config.size}px`,\n borderRadius: config.borderRadius,\n border: '1px solid #efefef',\n overflow: 'hidden',\n position: 'relative',\n backgroundColor: '#f8f8f8',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n cursor: 'default',\n boxSizing: 'border-box',\n ...style,\n };\n\n const hoverOverlayStyles: React.CSSProperties = {\n position: 'absolute',\n inset: 0,\n pointerEvents: 'none',\n boxShadow: isHovered && hasHoverState ? 'inset 0px 4px 100px 0px rgba(32, 32, 32, 0.3)' : 'none',\n borderRadius: config.borderRadius,\n transition: 'box-shadow 0.2s ease-in-out',\n };\n\n const imageStyles: React.CSSProperties = {\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n };\n\n const initialsStyles: React.CSSProperties = {\n fontSize: `${config.fontSize}px`,\n fontWeight: config.fontWeight,\n color: '#2f2f2f',\n lineHeight: 1.5,\n textAlign: 'center',\n userSelect: 'none',\n };\n\n // Determine what to display\n const showImage = src && !imageError;\n const showInitials = !showImage && initials && size !== 'small';\n const showPlaceholder = !showImage && !showInitials;\n\n return (\n <div\n ref={ref}\n className={className}\n style={containerStyles}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n data-testid={dataTestId}\n >\n {showImage && (\n <img\n src={src}\n alt={alt}\n style={imageStyles}\n onError={() => setImageError(true)}\n />\n )}\n\n {showInitials && (\n <span style={initialsStyles}>\n {initials.slice(0, 2).toUpperCase()}\n </span>\n )}\n\n {showPlaceholder && (\n <User size={config.iconSize} color=\"#d1d1d1\" strokeWidth={2} />\n )}\n\n <div style={hoverOverlayStyles} />\n </div>\n );\n }\n);\n\nAvatar.displayName = 'Avatar';\n"],"mappings":";AAAA,YAAY,WAAW;AACvB,SAAS,YAAY;AA2If,SASI,KATJ;AAxGN,IAAM,aAAa;AAAA,EACjB,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA;AAAA,IACV,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,cAAc;AAAA,EAChB;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,cAAc;AAAA,EAChB;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,cAAc;AAAA,EAChB;AAAA,EACA,eAAe;AAAA,IACb,MAAM;AAAA,IACN,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,cAAc;AAAA,EAChB;AACF;AAQO,IAAM,SAAe;AAAA,EAC1B,CACE;AAAA,IACE,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,eAAe;AAAA,EACjB,GACA,QACG;AACH,UAAM,CAAC,WAAW,YAAY,IAAU,eAAS,KAAK;AACtD,UAAM,CAAC,YAAY,aAAa,IAAU,eAAS,KAAK;AACxD,UAAM,SAAS,WAAW,IAAI;AAG9B,UAAM,gBAAgB,SAAS;AAE/B,UAAM,kBAAuC;AAAA,MAC3C,OAAO,GAAG,OAAO,IAAI;AAAA,MACrB,QAAQ,GAAG,OAAO,IAAI;AAAA,MACtB,cAAc,OAAO;AAAA,MACrB,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,UAAU;AAAA,MACV,iBAAiB;AAAA,MACjB,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,GAAG;AAAA,IACL;AAEA,UAAM,qBAA0C;AAAA,MAC9C,UAAU;AAAA,MACV,OAAO;AAAA,MACP,eAAe;AAAA,MACf,WAAW,aAAa,gBAAgB,kDAAkD;AAAA,MAC1F,cAAc,OAAO;AAAA,MACrB,YAAY;AAAA,IACd;AAEA,UAAM,cAAmC;AAAA,MACvC,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,WAAW;AAAA,IACb;AAEA,UAAM,iBAAsC;AAAA,MAC1C,UAAU,GAAG,OAAO,QAAQ;AAAA,MAC5B,YAAY,OAAO;AAAA,MACnB,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,YAAY;AAAA,IACd;AAGA,UAAM,YAAY,OAAO,CAAC;AAC1B,UAAM,eAAe,CAAC,aAAa,YAAY,SAAS;AACxD,UAAM,kBAAkB,CAAC,aAAa,CAAC;AAEvC,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,cAAc,MAAM,aAAa,IAAI;AAAA,QACrC,cAAc,MAAM,aAAa,KAAK;AAAA,QACtC,eAAa;AAAA,QAEZ;AAAA,uBACC;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA,OAAO;AAAA,cACP,SAAS,MAAM,cAAc,IAAI;AAAA;AAAA,UACnC;AAAA,UAGD,gBACC,oBAAC,UAAK,OAAO,gBACV,mBAAS,MAAM,GAAG,CAAC,EAAE,YAAY,GACpC;AAAA,UAGD,mBACC,oBAAC,QAAK,MAAM,OAAO,UAAU,OAAM,WAAU,aAAa,GAAG;AAAA,UAG/D,oBAAC,SAAI,OAAO,oBAAoB;AAAA;AAAA;AAAA,IAClC;AAAA,EAEJ;AACF;AAEA,OAAO,cAAc;","names":[]}