entangle-ui 0.8.2 → 0.9.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 (203) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/dist/esm/assets/src/components/controls/Combobox/Combobox.css.ts.vanilla-B7B5ttkq.css +210 -0
  3. package/dist/esm/assets/src/components/controls/FileUploader/FileUploader.css.ts.vanilla-T4nRiI7s.css +194 -0
  4. package/dist/esm/assets/src/components/controls/MultiSelect/MultiSelect.css.ts.vanilla-CdYayqaF.css +311 -0
  5. package/dist/esm/assets/src/components/controls/TagInput/TagInput.css.ts.vanilla-hnkMOPp1.css +141 -0
  6. package/dist/esm/assets/src/components/data/DataTable/DataTable.css.ts.vanilla-CmRgtjIW.css +231 -0
  7. package/dist/esm/assets/src/components/feedback/Alert/{Alert.css.ts.vanilla-CRAI-xHx.css → Alert.css.ts.vanilla-CfCDsIEg.css} +2 -0
  8. package/dist/esm/assets/src/components/feedback/CommandPalette/CommandPalette.css.ts.vanilla-DGdrLKYZ.css +160 -0
  9. package/dist/esm/assets/src/components/feedback/Drawer/Drawer.css.ts.vanilla-CLPTOUrA.css +247 -0
  10. package/dist/esm/assets/src/components/feedback/Skeleton/SkeletonLayout.css.ts.vanilla-Db7bpqiI.css +75 -0
  11. package/dist/esm/assets/src/components/feedback/Stat/Stat.css.ts.vanilla-GBk3JAMB.css +69 -0
  12. package/dist/esm/assets/src/components/layout/Card/Card.css.ts.vanilla-Ducn1gUX.css +124 -0
  13. package/dist/esm/assets/src/components/navigation/Pagination/Pagination.css.ts.vanilla-CmlFyyjh.css +103 -0
  14. package/dist/esm/assets/src/components/primitives/HoverCard/HoverCard.css.ts.vanilla-BYT0qbLp.css +41 -0
  15. package/dist/esm/components/Icons/CloudUploadIcon.js +24 -0
  16. package/dist/esm/components/Icons/CloudUploadIcon.js.map +1 -0
  17. package/dist/esm/components/Icons/ExternalLinkIcon.js +26 -0
  18. package/dist/esm/components/Icons/ExternalLinkIcon.js.map +1 -0
  19. package/dist/esm/components/Icons/FirstIcon.js +23 -0
  20. package/dist/esm/components/Icons/FirstIcon.js.map +1 -0
  21. package/dist/esm/components/Icons/LastIcon.js +23 -0
  22. package/dist/esm/components/Icons/LastIcon.js.map +1 -0
  23. package/dist/esm/components/Icons/UnlinkIcon.js +26 -0
  24. package/dist/esm/components/Icons/UnlinkIcon.js.map +1 -0
  25. package/dist/esm/components/controls/Combobox/Combobox.css.js +20 -0
  26. package/dist/esm/components/controls/Combobox/Combobox.css.js.map +1 -0
  27. package/dist/esm/components/controls/Combobox/Combobox.js +354 -0
  28. package/dist/esm/components/controls/Combobox/Combobox.js.map +1 -0
  29. package/dist/esm/components/controls/FileUploader/FileUploader.css.js +20 -0
  30. package/dist/esm/components/controls/FileUploader/FileUploader.css.js.map +1 -0
  31. package/dist/esm/components/controls/FileUploader/FileUploader.js +264 -0
  32. package/dist/esm/components/controls/FileUploader/FileUploader.js.map +1 -0
  33. package/dist/esm/components/controls/MultiSelect/MultiSelect.css.js +23 -0
  34. package/dist/esm/components/controls/MultiSelect/MultiSelect.css.js.map +1 -0
  35. package/dist/esm/components/controls/MultiSelect/MultiSelect.js +269 -0
  36. package/dist/esm/components/controls/MultiSelect/MultiSelect.js.map +1 -0
  37. package/dist/esm/components/controls/Select/Select.js +5 -4
  38. package/dist/esm/components/controls/Select/Select.js.map +1 -1
  39. package/dist/esm/components/controls/TagInput/TagInput.css.js +12 -0
  40. package/dist/esm/components/controls/TagInput/TagInput.css.js.map +1 -0
  41. package/dist/esm/components/controls/TagInput/TagInput.js +189 -0
  42. package/dist/esm/components/controls/TagInput/TagInput.js.map +1 -0
  43. package/dist/esm/components/controls/TreeView/TreeNode.js +87 -1
  44. package/dist/esm/components/controls/TreeView/TreeNode.js.map +1 -1
  45. package/dist/esm/components/controls/VectorInput/VectorInput.js +87 -4
  46. package/dist/esm/components/controls/VectorInput/VectorInput.js.map +1 -1
  47. package/dist/esm/components/data/DataTable/DataTable.css.js +25 -0
  48. package/dist/esm/components/data/DataTable/DataTable.css.js.map +1 -0
  49. package/dist/esm/components/data/DataTable/DataTable.js +502 -0
  50. package/dist/esm/components/data/DataTable/DataTable.js.map +1 -0
  51. package/dist/esm/components/editor/ChatPanel/ChatCodeBlock.js +87 -5
  52. package/dist/esm/components/editor/ChatPanel/ChatCodeBlock.js.map +1 -1
  53. package/dist/esm/components/editor/ChatPanel/ChatInput.js +87 -5
  54. package/dist/esm/components/editor/ChatPanel/ChatInput.js.map +1 -1
  55. package/dist/esm/components/editor/ChatPanel/ChatMessage.js +87 -2
  56. package/dist/esm/components/editor/ChatPanel/ChatMessage.js.map +1 -1
  57. package/dist/esm/components/editor/PropertyInspector/PropertyRow.js +87 -3
  58. package/dist/esm/components/editor/PropertyInspector/PropertyRow.js.map +1 -1
  59. package/dist/esm/components/editor/PropertyInspector/PropertySection.js +87 -3
  60. package/dist/esm/components/editor/PropertyInspector/PropertySection.js.map +1 -1
  61. package/dist/esm/components/feedback/Alert/Alert.css.js +1 -1
  62. package/dist/esm/components/feedback/Alert/Alert.js +3 -2
  63. package/dist/esm/components/feedback/Alert/Alert.js.map +1 -1
  64. package/dist/esm/components/feedback/CommandPalette/CommandPalette.css.js +20 -0
  65. package/dist/esm/components/feedback/CommandPalette/CommandPalette.css.js.map +1 -0
  66. package/dist/esm/components/feedback/CommandPalette/CommandPalette.js +261 -0
  67. package/dist/esm/components/feedback/CommandPalette/CommandPalette.js.map +1 -0
  68. package/dist/esm/components/feedback/CommandPalette/fuzzySearch.js +86 -0
  69. package/dist/esm/components/feedback/CommandPalette/fuzzySearch.js.map +1 -0
  70. package/dist/esm/components/feedback/CommandPalette/useRecentItems.js +63 -0
  71. package/dist/esm/components/feedback/CommandPalette/useRecentItems.js.map +1 -0
  72. package/dist/esm/components/feedback/Dialog/DialogHeader.js +2 -1
  73. package/dist/esm/components/feedback/Dialog/DialogHeader.js.map +1 -1
  74. package/dist/esm/components/feedback/Drawer/Drawer.css.js +17 -0
  75. package/dist/esm/components/feedback/Drawer/Drawer.css.js.map +1 -0
  76. package/dist/esm/components/feedback/Drawer/Drawer.js +120 -0
  77. package/dist/esm/components/feedback/Drawer/Drawer.js.map +1 -0
  78. package/dist/esm/components/feedback/Drawer/useDrawerAnimation.js +74 -0
  79. package/dist/esm/components/feedback/Drawer/useDrawerAnimation.js.map +1 -0
  80. package/dist/esm/components/feedback/Skeleton/SkeletonLayout.css.js +18 -0
  81. package/dist/esm/components/feedback/Skeleton/SkeletonLayout.css.js.map +1 -0
  82. package/dist/esm/components/feedback/Skeleton/SkeletonLayout.js +95 -0
  83. package/dist/esm/components/feedback/Skeleton/SkeletonLayout.js.map +1 -0
  84. package/dist/esm/components/feedback/Stat/Stat.css.js +15 -0
  85. package/dist/esm/components/feedback/Stat/Stat.css.js.map +1 -0
  86. package/dist/esm/components/feedback/Stat/Stat.js +55 -0
  87. package/dist/esm/components/feedback/Stat/Stat.js.map +1 -0
  88. package/dist/esm/components/feedback/Toast/ToastItem.js +12 -15
  89. package/dist/esm/components/feedback/Toast/ToastItem.js.map +1 -1
  90. package/dist/esm/components/layout/Accordion/Accordion.js +2 -1
  91. package/dist/esm/components/layout/Accordion/Accordion.js.map +1 -1
  92. package/dist/esm/components/layout/Accordion/AccordionTrigger.js +2 -3
  93. package/dist/esm/components/layout/Accordion/AccordionTrigger.js.map +1 -1
  94. package/dist/esm/components/layout/Card/Card.css.js +18 -0
  95. package/dist/esm/components/layout/Card/Card.css.js.map +1 -0
  96. package/dist/esm/components/layout/Card/Card.js +66 -0
  97. package/dist/esm/components/layout/Card/Card.js.map +1 -0
  98. package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbEllipsis.js +1 -0
  99. package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbEllipsis.js.map +1 -1
  100. package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbItem.js +1 -0
  101. package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbItem.js.map +1 -1
  102. package/dist/esm/components/navigation/Breadcrumbs/Breadcrumbs.js +5 -0
  103. package/dist/esm/components/navigation/Breadcrumbs/Breadcrumbs.js.map +1 -1
  104. package/dist/esm/components/navigation/Pagination/Pagination.css.js +12 -0
  105. package/dist/esm/components/navigation/Pagination/Pagination.css.js.map +1 -0
  106. package/dist/esm/components/navigation/Pagination/Pagination.js +107 -0
  107. package/dist/esm/components/navigation/Pagination/Pagination.js.map +1 -0
  108. package/dist/esm/components/navigation/Pagination/usePagination.js +143 -0
  109. package/dist/esm/components/navigation/Pagination/usePagination.js.map +1 -0
  110. package/dist/esm/components/primitives/Avatar/Avatar.js +87 -1
  111. package/dist/esm/components/primitives/Avatar/Avatar.js.map +1 -1
  112. package/dist/esm/components/primitives/Badge/Badge.js +87 -1
  113. package/dist/esm/components/primitives/Badge/Badge.js.map +1 -1
  114. package/dist/esm/components/primitives/Checkbox/Checkbox.js +5 -2
  115. package/dist/esm/components/primitives/Checkbox/Checkbox.js.map +1 -1
  116. package/dist/esm/components/primitives/Collapsible/Collapsible.js +2 -3
  117. package/dist/esm/components/primitives/Collapsible/Collapsible.js.map +1 -1
  118. package/dist/esm/components/primitives/HoverCard/HoverCard.css.js +7 -0
  119. package/dist/esm/components/primitives/HoverCard/HoverCard.css.js.map +1 -0
  120. package/dist/esm/components/primitives/HoverCard/HoverCard.js +169 -0
  121. package/dist/esm/components/primitives/HoverCard/HoverCard.js.map +1 -0
  122. package/dist/esm/components/primitives/Icon/Icon.js +16 -2
  123. package/dist/esm/components/primitives/Icon/Icon.js.map +1 -1
  124. package/dist/esm/components/primitives/Link/Link.js +3 -3
  125. package/dist/esm/components/primitives/Link/Link.js.map +1 -1
  126. package/dist/esm/components/primitives/Popover/PopoverClose.js +2 -3
  127. package/dist/esm/components/primitives/Popover/PopoverClose.js.map +1 -1
  128. package/dist/esm/components/primitives/Radio/Radio.js +1 -1
  129. package/dist/esm/hooks/useBreakpoint/useBreakpoint.js +44 -0
  130. package/dist/esm/hooks/useBreakpoint/useBreakpoint.js.map +1 -0
  131. package/dist/esm/hooks/useDebounced/useDebouncedCallback.js +97 -0
  132. package/dist/esm/hooks/useDebounced/useDebouncedCallback.js.map +1 -0
  133. package/dist/esm/hooks/useDebounced/useDebouncedValue.js +35 -0
  134. package/dist/esm/hooks/useDebounced/useDebouncedValue.js.map +1 -0
  135. package/dist/esm/hooks/useIntersectionObserver/useIntersectionObserver.js +73 -0
  136. package/dist/esm/hooks/useIntersectionObserver/useIntersectionObserver.js.map +1 -0
  137. package/dist/esm/hooks/useListboxNav/useListboxNav.js +181 -0
  138. package/dist/esm/hooks/useListboxNav/useListboxNav.js.map +1 -0
  139. package/dist/esm/hooks/useMediaQuery/useMediaQuery.js +54 -0
  140. package/dist/esm/hooks/useMediaQuery/useMediaQuery.js.map +1 -0
  141. package/dist/esm/hooks/useThrottledCallback/useThrottledCallback.js +78 -0
  142. package/dist/esm/hooks/useThrottledCallback/useThrottledCallback.js.map +1 -0
  143. package/dist/esm/index.js +25 -0
  144. package/dist/esm/index.js.map +1 -1
  145. package/dist/esm/theme/breakpoints.js +27 -0
  146. package/dist/esm/theme/breakpoints.js.map +1 -0
  147. package/dist/esm/theme/index.js +1 -0
  148. package/dist/esm/theme/index.js.map +1 -1
  149. package/dist/tokens/tokens.dark.css +1 -1
  150. package/dist/tokens/tokens.json +1 -1
  151. package/dist/tokens/tokens.light.css +1 -1
  152. package/dist/types/components/Icons/CloudUploadIcon.d.ts +27 -0
  153. package/dist/types/components/Icons/ExternalLinkIcon.d.ts +29 -0
  154. package/dist/types/components/Icons/FirstIcon.d.ts +26 -0
  155. package/dist/types/components/Icons/LastIcon.d.ts +26 -0
  156. package/dist/types/components/Icons/UnlinkIcon.d.ts +29 -0
  157. package/dist/types/components/controls/Combobox/Combobox.d.ts +29 -0
  158. package/dist/types/components/controls/Combobox/Combobox.types.d.ts +109 -0
  159. package/dist/types/components/controls/FileUploader/FileUploader.d.ts +34 -0
  160. package/dist/types/components/controls/FileUploader/FileUploader.types.d.ts +94 -0
  161. package/dist/types/components/controls/MultiSelect/MultiSelect.d.ts +31 -0
  162. package/dist/types/components/controls/MultiSelect/MultiSelect.types.d.ts +85 -0
  163. package/dist/types/components/controls/TagInput/TagInput.d.ts +24 -0
  164. package/dist/types/components/controls/TagInput/TagInput.types.d.ts +100 -0
  165. package/dist/types/components/data/DataTable/DataTable.d.ts +8 -0
  166. package/dist/types/components/data/DataTable/DataTable.types.d.ts +159 -0
  167. package/dist/types/components/feedback/Alert/Alert.d.ts +1 -0
  168. package/dist/types/components/feedback/Alert/Alert.types.d.ts +7 -0
  169. package/dist/types/components/feedback/CommandPalette/CommandPalette.d.ts +29 -0
  170. package/dist/types/components/feedback/CommandPalette/CommandPalette.types.d.ts +61 -0
  171. package/dist/types/components/feedback/CommandPalette/fuzzySearch.d.ts +6 -0
  172. package/dist/types/components/feedback/Drawer/Drawer.d.ts +12 -0
  173. package/dist/types/components/feedback/Drawer/Drawer.types.d.ts +70 -0
  174. package/dist/types/components/feedback/Skeleton/Skeleton.types.d.ts +44 -1
  175. package/dist/types/components/feedback/Skeleton/SkeletonLayout.d.ts +314 -0
  176. package/dist/types/components/feedback/Stat/Stat.d.ts +23 -0
  177. package/dist/types/components/feedback/Stat/Stat.types.d.ts +38 -0
  178. package/dist/types/components/layout/Accordion/Accordion.types.d.ts +7 -0
  179. package/dist/types/components/layout/Card/Card.d.ts +12 -0
  180. package/dist/types/components/layout/Card/Card.types.d.ts +54 -0
  181. package/dist/types/components/navigation/Pagination/Pagination.d.ts +22 -0
  182. package/dist/types/components/navigation/Pagination/Pagination.types.d.ts +49 -0
  183. package/dist/types/components/primitives/Button/Button.d.ts +1 -1
  184. package/dist/types/components/primitives/HoverCard/HoverCard.d.ts +10 -0
  185. package/dist/types/components/primitives/HoverCard/HoverCard.types.d.ts +64 -0
  186. package/dist/types/components/primitives/Icon/Icon.d.ts +14 -1
  187. package/dist/types/components/primitives/IconButton/IconButton.d.ts +1 -1
  188. package/dist/types/hooks/useBreakpoint/useBreakpoint.d.ts +19 -0
  189. package/dist/types/hooks/useBreakpoint/useBreakpoint.types.d.ts +20 -0
  190. package/dist/types/hooks/useDebounced/useDebounced.types.d.ts +15 -0
  191. package/dist/types/hooks/useDebounced/useDebouncedCallback.d.ts +22 -0
  192. package/dist/types/hooks/useDebounced/useDebouncedValue.d.ts +16 -0
  193. package/dist/types/hooks/useIntersectionObserver/useIntersectionObserver.d.ts +22 -0
  194. package/dist/types/hooks/useIntersectionObserver/useIntersectionObserver.types.d.ts +22 -0
  195. package/dist/types/hooks/useListboxNav/useListboxNav.d.ts +75 -0
  196. package/dist/types/hooks/useMediaQuery/useMediaQuery.d.ts +19 -0
  197. package/dist/types/hooks/useMediaQuery/useMediaQuery.types.d.ts +6 -0
  198. package/dist/types/hooks/useThrottledCallback/useThrottledCallback.d.ts +23 -0
  199. package/dist/types/hooks/useThrottledCallback/useThrottledCallback.types.d.ts +13 -0
  200. package/dist/types/index.d.ts +43 -1
  201. package/dist/types/theme/breakpoints.d.ts +22 -0
  202. package/dist/types/theme/index.d.ts +1 -0
  203. package/package.json +3 -1
@@ -0,0 +1,502 @@
1
+ "use client";
2
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
3
+ import { useState, useMemo, useCallback, useRef, useEffect } from 'react';
4
+ import { assignInlineVars } from '@vanilla-extract/dynamic';
5
+ import { useVirtualizer } from '@tanstack/react-virtual';
6
+ import { cx } from '../../../utils/cx.js';
7
+ import { useControlledState } from '../../../hooks/useControlledState/useControlledState.js';
8
+ import { Checkbox } from '../../primitives/Checkbox/Checkbox.js';
9
+ import '../../primitives/Checkbox/CheckboxGroup.js';
10
+ import { ChevronDownIcon } from '../../Icons/ChevronDownIcon.js';
11
+ import { ChevronUpIcon } from '../../Icons/ChevronUpIcon.js';
12
+ import { SortIcon } from '../../Icons/SortIcon.js';
13
+ import { tableMinWidthVar, gridTemplateColumnsVar, scrollContainerStyle, innerWrapperStyle, bodyStyle, emptyStateStyle, virtualBodyStyle, totalHeightVar, rootRecipe, headerCellRecipe, headerStyle, skeletonRowStyle, skeletonCellStyle, skeletonBarStyle, cellRecipe, rowRecipe, headerCellInnerStyle, resizeHandleStyle, sortIndicatorRecipe } from './DataTable.css.js';
14
+
15
+ const DENSITY_ROW_HEIGHT = {
16
+ comfortable: 40,
17
+ compact: 32,
18
+ dense: 24,
19
+ };
20
+ const VIRTUALIZATION_THRESHOLD_DEFAULT = 100;
21
+ const SELECT_COLUMN_WIDTH = 40;
22
+ function getRowKey(rowKey, row, rowIndex) {
23
+ if (typeof rowKey === 'function')
24
+ return rowKey(row, rowIndex);
25
+ const value = row[rowKey];
26
+ return typeof value === 'string' ? value : String(value);
27
+ }
28
+ function readCellValue(column, row, rowIndex) {
29
+ const accessor = column.accessor;
30
+ if (typeof accessor === 'function')
31
+ return accessor(row, rowIndex);
32
+ if (typeof accessor === 'string')
33
+ return row[accessor];
34
+ return row[column.id];
35
+ }
36
+ function defaultCompare(a, b) {
37
+ if (a === b)
38
+ return 0;
39
+ if (a === null || a === undefined)
40
+ return 1;
41
+ if (b === null || b === undefined)
42
+ return -1;
43
+ if (typeof a === 'number' && typeof b === 'number')
44
+ return a - b;
45
+ if (a instanceof Date && b instanceof Date)
46
+ return a.getTime() - b.getTime();
47
+ if (typeof a === 'boolean' && typeof b === 'boolean')
48
+ return a === b ? 0 : a ? 1 : -1;
49
+ const sa = typeof a === 'string' ? a : JSON.stringify(a);
50
+ const sb = typeof b === 'string' ? b : JSON.stringify(b);
51
+ return sa.localeCompare(sb);
52
+ }
53
+ function nextSortDirection(current) {
54
+ if (current === null)
55
+ return 'asc';
56
+ if (current === 'asc')
57
+ return 'desc';
58
+ return null;
59
+ }
60
+ function resolveDimension(value) {
61
+ if (value === undefined)
62
+ return undefined;
63
+ return typeof value === 'number' ? `${value}px` : value;
64
+ }
65
+ function getColumnTrack(column, override) {
66
+ if (override !== undefined) {
67
+ return { templateValue: `${override}px`, minPx: override };
68
+ }
69
+ if (column.width !== undefined) {
70
+ const resolved = resolveDimension(column.width) ?? '1fr';
71
+ const minPx = typeof column.width === 'number' ? column.width : 0;
72
+ return { templateValue: resolved, minPx };
73
+ }
74
+ const minWidth = column.minWidth ?? 80;
75
+ return { templateValue: `minmax(${minWidth}px, 1fr)`, minPx: minWidth };
76
+ }
77
+ /**
78
+ * Data-driven table with sortable columns, row selection, sticky header,
79
+ * optional sticky first column, optional column resizing, and optional
80
+ * row virtualization (auto-enabled above 100 rows).
81
+ *
82
+ * Uses a CSS grid layout under `role="grid"` so columns line up across the
83
+ * sticky header and individual virtualized rows without depending on real
84
+ * `<table>` semantics.
85
+ *
86
+ * @example
87
+ * ```tsx
88
+ * <DataTable
89
+ * rows={users}
90
+ * rowKey="id"
91
+ * columns={[
92
+ * { id: 'name', header: 'Name', accessor: 'name', sortable: true },
93
+ * { id: 'role', header: 'Role', accessor: 'role' },
94
+ * ]}
95
+ * selectionMode="multiple"
96
+ * onSelectionChange={setSelected}
97
+ * />
98
+ * ```
99
+ */
100
+ function DataTableInner(props) {
101
+ const { rows, columns, rowKey, density = 'comfortable', stickyHeader = true, sort, defaultSort, onSortChange, manualSort = false, selectionMode = false, selection, defaultSelection, onSelectionChange, isRowSelectable, onRowClick, onRowActivate, renderRow, emptyState, loading = false, loadingRowCount = 5, virtualized = 'auto', virtualizationThreshold = VIRTUALIZATION_THRESHOLD_DEFAULT, estimatedRowHeight, overscan = 8, height = 480, maxHeight, resizableColumns = false, onColumnResize, className, style, testId, ref, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, ...rest } = props;
102
+ const [sortState, setSortState] = useControlledState({
103
+ value: sort ?? undefined,
104
+ defaultValue: defaultSort ?? undefined,
105
+ onChange: onSortChange,
106
+ fallback: { columnId: null, direction: null },
107
+ });
108
+ const [selectionState, setSelectionState] = useControlledState({
109
+ value: selection,
110
+ defaultValue: defaultSelection,
111
+ onChange: onSelectionChange,
112
+ fallback: [],
113
+ });
114
+ const [columnWidths, setColumnWidths] = useState({});
115
+ const [activeRowIndex, setActiveRowIndex] = useState(null);
116
+ const showSelectColumn = selectionMode === 'multiple';
117
+ const selectedSet = useMemo(() => new Set(selectionState), [selectionState]);
118
+ const sortedRows = useMemo(() => {
119
+ if (manualSort)
120
+ return rows;
121
+ const { columnId, direction } = sortState;
122
+ if (!columnId || direction === null)
123
+ return rows;
124
+ const column = columns.find(c => c.id === columnId);
125
+ if (!column)
126
+ return rows;
127
+ const indexed = rows.map((row, idx) => ({ row, idx }));
128
+ indexed.sort((a, b) => {
129
+ const valueA = readCellValue(column, a.row, a.idx);
130
+ const valueB = readCellValue(column, b.row, b.idx);
131
+ const cmp = column.sortComparator
132
+ ? column.sortComparator(valueA, valueB, a.row, b.row)
133
+ : defaultCompare(valueA, valueB);
134
+ return direction === 'asc' ? cmp : -cmp;
135
+ });
136
+ return indexed.map(item => item.row);
137
+ }, [rows, sortState, columns, manualSort]);
138
+ const rowKeys = useMemo(() => sortedRows.map((row, idx) => getRowKey(rowKey, row, idx)), [sortedRows, rowKey]);
139
+ const selectableIndexes = useMemo(() => {
140
+ if (!selectionMode)
141
+ return [];
142
+ if (!isRowSelectable)
143
+ return sortedRows.map((_, idx) => idx);
144
+ const result = [];
145
+ sortedRows.forEach((row, idx) => {
146
+ if (isRowSelectable(row, idx))
147
+ result.push(idx);
148
+ });
149
+ return result;
150
+ }, [sortedRows, isRowSelectable, selectionMode]);
151
+ const allSelectableSelected = selectableIndexes.length > 0 &&
152
+ selectableIndexes.every(idx => {
153
+ const k = rowKeys[idx];
154
+ return k !== undefined && selectedSet.has(k);
155
+ });
156
+ const someSelectableSelected = !allSelectableSelected &&
157
+ selectableIndexes.some(idx => {
158
+ const k = rowKeys[idx];
159
+ return k !== undefined && selectedSet.has(k);
160
+ });
161
+ const handleSortClick = useCallback((column) => {
162
+ if (!column.sortable)
163
+ return;
164
+ setSortState(prev => {
165
+ if (prev.columnId === column.id) {
166
+ const next = nextSortDirection(prev.direction);
167
+ return next === null
168
+ ? { columnId: null, direction: null }
169
+ : { columnId: column.id, direction: next };
170
+ }
171
+ return { columnId: column.id, direction: 'asc' };
172
+ });
173
+ }, [setSortState]);
174
+ const selectionAnchorRef = useRef(null);
175
+ const selectionShiftKeyRef = useRef(false);
176
+ const toggleRowSelection = useCallback((rowKeyValue, row, rowIdx, rangeMode = false) => {
177
+ if (!selectionMode)
178
+ return;
179
+ if (isRowSelectable && !isRowSelectable(row, rowIdx))
180
+ return;
181
+ if (selectionMode === 'single') {
182
+ selectionAnchorRef.current = rowIdx;
183
+ setSelectionState(prev => prev[0] === rowKeyValue ? [] : [rowKeyValue]);
184
+ return;
185
+ }
186
+ const anchor = selectionAnchorRef.current;
187
+ if (rangeMode && anchor !== null && anchor !== rowIdx) {
188
+ const [start, end] = anchor < rowIdx ? [anchor, rowIdx] : [rowIdx, anchor];
189
+ const rangeKeys = [];
190
+ for (let i = start; i <= end; i += 1) {
191
+ const candidate = sortedRows[i];
192
+ const candidateKey = rowKeys[i];
193
+ if (candidate === undefined || candidateKey === undefined)
194
+ continue;
195
+ if (isRowSelectable && !isRowSelectable(candidate, i))
196
+ continue;
197
+ rangeKeys.push(candidateKey);
198
+ }
199
+ setSelectionState(prev => {
200
+ const set = new Set(prev);
201
+ const shouldDeselect = set.has(rowKeyValue);
202
+ for (const key of rangeKeys) {
203
+ if (shouldDeselect)
204
+ set.delete(key);
205
+ else
206
+ set.add(key);
207
+ }
208
+ return Array.from(set);
209
+ });
210
+ return;
211
+ }
212
+ selectionAnchorRef.current = rowIdx;
213
+ setSelectionState(prev => {
214
+ const set = new Set(prev);
215
+ if (set.has(rowKeyValue))
216
+ set.delete(rowKeyValue);
217
+ else
218
+ set.add(rowKeyValue);
219
+ return Array.from(set);
220
+ });
221
+ }, [selectionMode, isRowSelectable, setSelectionState, sortedRows, rowKeys]);
222
+ const toggleSelectAll = useCallback(() => {
223
+ if (selectionMode !== 'multiple')
224
+ return;
225
+ if (allSelectableSelected) {
226
+ setSelectionState([]);
227
+ return;
228
+ }
229
+ const next = selectableIndexes
230
+ .map(idx => rowKeys[idx])
231
+ .filter((k) => typeof k === 'string');
232
+ setSelectionState(next);
233
+ }, [
234
+ allSelectableSelected,
235
+ selectableIndexes,
236
+ rowKeys,
237
+ selectionMode,
238
+ setSelectionState,
239
+ ]);
240
+ const scrollContainerRef = useRef(null);
241
+ const shouldVirtualize = virtualized === true ||
242
+ (virtualized === 'auto' && sortedRows.length > virtualizationThreshold);
243
+ const rowHeightPx = estimatedRowHeight ?? DENSITY_ROW_HEIGHT[density];
244
+ const virtualizer = useVirtualizer({
245
+ count: shouldVirtualize ? sortedRows.length : 0,
246
+ getScrollElement: () => scrollContainerRef.current,
247
+ estimateSize: () => rowHeightPx,
248
+ overscan,
249
+ });
250
+ const virtualItems = shouldVirtualize ? virtualizer.getVirtualItems() : [];
251
+ const totalSize = shouldVirtualize ? virtualizer.getTotalSize() : 0;
252
+ const tracks = useMemo(() => {
253
+ const items = [];
254
+ let minWidth = 0;
255
+ if (showSelectColumn) {
256
+ items.push(`${SELECT_COLUMN_WIDTH}px`);
257
+ minWidth += SELECT_COLUMN_WIDTH;
258
+ }
259
+ columns.forEach(column => {
260
+ const t = getColumnTrack(column, columnWidths[column.id]);
261
+ items.push(t.templateValue);
262
+ minWidth += t.minPx;
263
+ });
264
+ return { template: items.join(' '), minWidth };
265
+ }, [columns, columnWidths, showSelectColumn]);
266
+ const renderSortIndicator = (column) => {
267
+ if (!column.sortable)
268
+ return null;
269
+ const active = sortState.columnId === column.id && sortState.direction !== null;
270
+ const direction = active ? sortState.direction : null;
271
+ const Icon = direction === 'asc'
272
+ ? ChevronUpIcon
273
+ : direction === 'desc'
274
+ ? ChevronDownIcon
275
+ : SortIcon;
276
+ return (jsx("span", { className: sortIndicatorRecipe({ active: active || undefined }), "aria-hidden": "true", children: jsx(Icon, { size: "sm" }) }));
277
+ };
278
+ const beginResize = useCallback((columnId, startX, startWidth, column) => {
279
+ const minWidth = column.minWidth ?? 40;
280
+ const maxWidth = column.maxWidth ?? Infinity;
281
+ const handleMove = (event) => {
282
+ const delta = event.clientX - startX;
283
+ const next = Math.max(minWidth, Math.min(maxWidth, startWidth + delta));
284
+ setColumnWidths(prev => ({ ...prev, [columnId]: next }));
285
+ };
286
+ const handleUp = () => {
287
+ window.removeEventListener('pointermove', handleMove);
288
+ window.removeEventListener('pointerup', handleUp);
289
+ setColumnWidths(prev => {
290
+ const finalWidth = prev[columnId];
291
+ if (finalWidth !== undefined)
292
+ onColumnResize?.(columnId, finalWidth);
293
+ return prev;
294
+ });
295
+ };
296
+ window.addEventListener('pointermove', handleMove);
297
+ window.addEventListener('pointerup', handleUp);
298
+ }, [onColumnResize]);
299
+ const focusRow = useCallback((index) => {
300
+ if (sortedRows.length === 0)
301
+ return;
302
+ const clamped = Math.max(0, Math.min(sortedRows.length - 1, index));
303
+ setActiveRowIndex(clamped);
304
+ if (shouldVirtualize) {
305
+ virtualizer.scrollToIndex(clamped, { align: 'auto' });
306
+ }
307
+ }, [sortedRows.length, shouldVirtualize, virtualizer]);
308
+ const handleKeyDown = useCallback((event) => {
309
+ if (sortedRows.length === 0)
310
+ return;
311
+ const current = activeRowIndex ?? -1;
312
+ switch (event.key) {
313
+ case 'ArrowDown':
314
+ event.preventDefault();
315
+ focusRow(current + 1);
316
+ return;
317
+ case 'ArrowUp':
318
+ event.preventDefault();
319
+ focusRow(current - 1);
320
+ return;
321
+ case 'Home':
322
+ event.preventDefault();
323
+ focusRow(0);
324
+ return;
325
+ case 'End':
326
+ event.preventDefault();
327
+ focusRow(sortedRows.length - 1);
328
+ return;
329
+ case 'PageDown':
330
+ event.preventDefault();
331
+ focusRow(current + 10);
332
+ return;
333
+ case 'PageUp':
334
+ event.preventDefault();
335
+ focusRow(current - 10);
336
+ return;
337
+ case 'Enter': {
338
+ if (current < 0)
339
+ return;
340
+ event.preventDefault();
341
+ const row = sortedRows[current];
342
+ if (row === undefined)
343
+ return;
344
+ const k = rowKeys[current];
345
+ if (selectionMode === 'single' && k !== undefined) {
346
+ toggleRowSelection(k, row, current);
347
+ }
348
+ onRowActivate?.(row, current);
349
+ return;
350
+ }
351
+ case ' ': {
352
+ if (current < 0)
353
+ return;
354
+ if (selectionMode !== 'multiple')
355
+ return;
356
+ event.preventDefault();
357
+ const row = sortedRows[current];
358
+ const k = rowKeys[current];
359
+ if (row === undefined || k === undefined)
360
+ return;
361
+ toggleRowSelection(k, row, current, event.shiftKey);
362
+ return;
363
+ }
364
+ default:
365
+ return;
366
+ }
367
+ }, [
368
+ activeRowIndex,
369
+ focusRow,
370
+ sortedRows,
371
+ rowKeys,
372
+ selectionMode,
373
+ toggleRowSelection,
374
+ onRowActivate,
375
+ ]);
376
+ useEffect(() => {
377
+ if (activeRowIndex !== null && activeRowIndex >= sortedRows.length) {
378
+ setActiveRowIndex(sortedRows.length === 0 ? null : sortedRows.length - 1);
379
+ }
380
+ }, [activeRowIndex, sortedRows.length]);
381
+ const renderHeaderCell = (column) => {
382
+ const ariaSort = column.sortable
383
+ ? sortState.columnId === column.id && sortState.direction === 'asc'
384
+ ? 'ascending'
385
+ : sortState.columnId === column.id && sortState.direction === 'desc'
386
+ ? 'descending'
387
+ : 'none'
388
+ : undefined;
389
+ return (jsxs("div", { role: "columnheader", "data-column-id": column.id, className: cx(headerCellRecipe({
390
+ align: column.align ?? 'left',
391
+ sortable: column.sortable ? true : undefined,
392
+ sticky: column.sticky ? true : undefined,
393
+ }), column.className), "aria-sort": ariaSort, "aria-hidden": column.ariaHidden ? true : undefined, tabIndex: column.sortable ? 0 : undefined, onClick: column.sortable
394
+ ? () => {
395
+ handleSortClick(column);
396
+ }
397
+ : undefined, onKeyDown: column.sortable
398
+ ? event => {
399
+ if (event.key === 'Enter' || event.key === ' ') {
400
+ event.preventDefault();
401
+ handleSortClick(column);
402
+ }
403
+ }
404
+ : undefined, children: [jsxs("span", { className: headerCellInnerStyle, children: [jsx("span", { children: column.header }), renderSortIndicator(column)] }), resizableColumns && !column.disableResize && (jsx("span", { className: resizeHandleStyle, role: "separator", "aria-orientation": "vertical", "aria-label": `Resize column ${column.id}`, onPointerDown: event => {
405
+ event.preventDefault();
406
+ event.stopPropagation();
407
+ const startWidth = columnWidths[column.id] ??
408
+ event.currentTarget.parentElement?.getBoundingClientRect()
409
+ .width ??
410
+ 100;
411
+ beginResize(column.id, event.clientX, startWidth, column);
412
+ } }))] }, column.id));
413
+ };
414
+ const renderHeader = () => (jsxs("div", { role: "row", "aria-rowindex": 1, className: headerStyle({ sticky: stickyHeader || undefined }), children: [showSelectColumn && (jsx("div", { role: "columnheader", className: headerCellRecipe({ selectColumn: true, sticky: true }), "aria-label": "Select all rows", children: jsx(Checkbox, { checked: allSelectableSelected, indeterminate: someSelectableSelected, onChange: () => {
415
+ toggleSelectAll();
416
+ }, "aria-label": "Select all rows", size: "sm" }) })), columns.map(renderHeaderCell)] }));
417
+ const renderCells = (row, rowIdx) => columns.map(column => {
418
+ const value = readCellValue(column, row, rowIdx);
419
+ return (jsx("div", { role: "gridcell", className: cx(cellRecipe({
420
+ align: column.align ?? 'left',
421
+ sticky: column.sticky ? true : undefined,
422
+ }), column.className), "data-column-id": column.id, children: column.cell
423
+ ? column.cell({ value, row, rowIndex: rowIdx, column })
424
+ : value === null || value === undefined
425
+ ? ''
426
+ : typeof value === 'string'
427
+ ? value
428
+ : typeof value === 'number' || typeof value === 'boolean'
429
+ ? String(value)
430
+ : JSON.stringify(value) }, column.id));
431
+ });
432
+ const renderRowElement = (row, rowIdx, options = {}) => {
433
+ const k = rowKeys[rowIdx] ?? `__row_${rowIdx}__`;
434
+ const isSelected = selectedSet.has(k);
435
+ const interactive = selectionMode === 'single' || onRowClick !== undefined;
436
+ const cells = (jsxs(Fragment, { children: [showSelectColumn && (jsx("div", { role: "gridcell", className: cellRecipe({ selectColumn: true, sticky: true }), onClickCapture: event => {
437
+ selectionShiftKeyRef.current = event.shiftKey;
438
+ }, onClick: event => {
439
+ event.stopPropagation();
440
+ }, children: jsx(Checkbox, { checked: isSelected, disabled: isRowSelectable ? !isRowSelectable(row, rowIdx) : false, onChange: () => {
441
+ toggleRowSelection(k, row, rowIdx, selectionShiftKeyRef.current);
442
+ selectionShiftKeyRef.current = false;
443
+ }, "aria-label": `Select row ${rowIdx + 1}`, size: "sm" }) })), renderCells(row, rowIdx)] }));
444
+ const handleRowClick = (event) => {
445
+ onRowClick?.(row, rowIdx, event);
446
+ if (selectionMode === 'single') {
447
+ toggleRowSelection(k, row, rowIdx);
448
+ }
449
+ setActiveRowIndex(rowIdx);
450
+ };
451
+ const handleRowDoubleClick = () => {
452
+ onRowActivate?.(row, rowIdx);
453
+ };
454
+ const rowContent = renderRow
455
+ ? renderRow({ row, rowIndex: rowIdx, selected: isSelected }, cells)
456
+ : cells;
457
+ const rowClassName = rowRecipe({
458
+ virtualized: options.virtualized ? true : undefined,
459
+ interactive: interactive ? true : undefined,
460
+ selected: isSelected ? true : undefined,
461
+ active: activeRowIndex === rowIdx ? true : undefined,
462
+ });
463
+ const rowStyle = options.virtualized && options.transformY !== undefined
464
+ ? { transform: `translateY(${options.transformY}px)` }
465
+ : undefined;
466
+ return (jsx("div", { role: "row", "aria-rowindex": rowIdx + 2, "aria-selected": selectionMode ? isSelected : undefined, "data-row-key": k, "data-row-index": rowIdx, "data-row-interactive": interactive ? 'true' : undefined, className: rowClassName, style: rowStyle, onClick: interactive ? handleRowClick : undefined, onDoubleClick: onRowActivate ? handleRowDoubleClick : undefined, children: rowContent }, k));
467
+ };
468
+ const renderSkeletonRows = () => {
469
+ const rowsToRender = Array.from({ length: loadingRowCount }, (_, i) => i);
470
+ const cellCount = columns.length + (showSelectColumn ? 1 : 0);
471
+ return rowsToRender.map(idx => (jsx("div", { className: skeletonRowStyle, "aria-hidden": "true", children: Array.from({ length: cellCount }, (_, ci) => (jsx("div", { className: skeletonCellStyle, children: jsx("span", { className: skeletonBarStyle }) }, ci))) }, `__skeleton_${idx}__`)));
472
+ };
473
+ const containerStyle = {
474
+ height: resolveDimension(height),
475
+ ...(maxHeight !== undefined
476
+ ? { maxHeight: resolveDimension(maxHeight) }
477
+ : {}),
478
+ ...style,
479
+ };
480
+ const isEmpty = !loading && sortedRows.length === 0;
481
+ const totalColumnsCount = columns.length + (showSelectColumn ? 1 : 0);
482
+ const gridVars = assignInlineVars({
483
+ [gridTemplateColumnsVar]: tracks.template,
484
+ [tableMinWidthVar]: `${tracks.minWidth}px`,
485
+ });
486
+ return (jsx("div", { ref: ref, role: "grid", "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, "aria-rowcount": sortedRows.length + 1, "aria-colcount": totalColumnsCount, "aria-multiselectable": selectionMode === 'multiple' ? true : undefined, "data-testid": testId, "data-density": density, tabIndex: 0, className: cx(rootRecipe({ density }), className), style: { ...containerStyle, ...gridVars }, onKeyDown: handleKeyDown, ...rest, children: jsx("div", { ref: scrollContainerRef, className: scrollContainerStyle, children: jsxs("div", { className: innerWrapperStyle, children: [renderHeader(), loading ? (jsx("div", { className: bodyStyle, children: renderSkeletonRows() })) : isEmpty ? (jsx("div", { className: bodyStyle, children: jsx("div", { className: emptyStateStyle, role: "row", children: jsx("div", { role: "gridcell", "aria-colspan": totalColumnsCount, children: emptyState ?? 'No rows to display' }) }) })) : shouldVirtualize ? (jsx("div", { className: virtualBodyStyle, style: assignInlineVars({
487
+ [totalHeightVar]: `${totalSize}px`,
488
+ }), children: virtualItems.map(item => {
489
+ const row = sortedRows[item.index];
490
+ if (row === undefined)
491
+ return null;
492
+ return renderRowElement(row, item.index, {
493
+ virtualized: true,
494
+ transformY: item.start,
495
+ });
496
+ }) })) : (jsx("div", { className: bodyStyle, children: sortedRows.map((row, rowIdx) => renderRowElement(row, rowIdx)) }))] }) }) }));
497
+ }
498
+ DataTableInner.displayName = 'DataTable';
499
+ const DataTable = DataTableInner;
500
+
501
+ export { DataTable };
502
+ //# sourceMappingURL=DataTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTable.js","sources":["../../../../../../src/components/data/DataTable/DataTable.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;;;;AA+CA;AACE;AACA;AACA;;AAGF;AACA;AAEA;;AAKoC;AAClC;AACA;AACF;AAEA;AAKE;;AACoC;;AAElC;AACF;AACF;AAEA;;AACe;AACb;AAAmC;AACnC;;;;AAEA;;;;AAGA;AACA;AACA;AACF;AAEA;;AAGwB;;AACC;AACvB;AACF;AAEA;;AAG2B;AACzB;AACF;AAOA;AAIE;;;AAGA;;AAEE;AACA;;AAEF;;AAEF;AAEA;;;;;;;;;;;;;;;;;;;;;;AAsBG;AACH;;AAuCE;;;AAGE;;AAED;AAED;AAEI;AACA;AACA;AACA;AACD;;;AAKH;AACA;AAEA;AACE;AAAgB;AAChB;AACA;AAAqC;AACrC;AACA;AAAa;;;AAGX;AACA;AACA;AACE;AACA;AACF;AACF;AACA;;AAGF;AAKA;AACE;AAAoB;AACpB;AAAsB;;;AAGpB;AAA+B;AACjC;AACA;;AAGF;AAEE;AACE;;AAEF;;AAGA;AACE;;AAEF;AAEF;;;;;;;;AAQU;;;AAGN;AACF;AAIF;AACA;AAEA;AAEI;;;;AAEA;AACE;;;;AAOF;;;;AAKE;AACE;AACA;AACA;;;;AAEA;;;AAGA;;AAEA;AACE;AAAoB;;AACf;;AAEP;AACF;;;AAIF;;AAEE;AACA;AAA0B;;AACrB;AACL;AACF;AACF;AAIF;;;;;;;;;;;AAUA;;;;;;AAMC;AAED;AAEA;;;;;AAQE;AACA;;AAED;AAED;AACA;AAEA;;;;AAII;;;AAGF;AACE;AACA;AACA;AACF;AACA;;AAGF;;AACwB;AACtB;AAEA;AACA;AAEI;;AAEE;;;AAUR;AAEA;AAOI;AACA;AACA;AACE;AACA;AACA;AACF;;AAEE;AACA;;AAEE;;AAC8B;AAC9B;AACF;AACF;AACA;AACA;AACF;AAIF;AAEI;;;;;;;;AAUJ;AAEI;;AACA;AACA;AACE;;AAEE;;AAEF;;AAEE;;AAEF;;;;AAIA;;AAEE;;AAEF;;AAEE;;AAEF;;AAEE;;;;;;AAKA;;;AAEA;;AAEE;;AAEF;;;;;;;;;AAOA;AACA;AACA;;;;;AAIF;;;AAGJ;;;;;;;;AASC;;;AAKC;;;AAIJ;AACE;AAEI;AACE;AACA;AACE;AACA;;AAER;AAOQ;;;AAGD;;;;AAWC;;AAKI;;;;;;;;AAqBF;AAEE;;AAEA;AACF;;AAMZ;AAEA;AAgBY;AACF;AAUV;;;AASY;;AAED;AAMD;AACA;AACE;AACA;AACE;;AAEE;AACA;AAGd;;;;;AAWA;AAOU;AACF;;AAGA;;AAYI;;AAWZ;;AAEE;AACE;;;AAGJ;;AAGE;AACF;;AAGE;;;;;;;AAQD;;;;AAOD;AAiBF;;;AAIE;;AAcF;AAEA;AACE;;;;AAIA;;;AAIF;;AAGE;AACA;AACD;AAED;AAkCc;AACD;;;AAIwB;AACvB;AACE;;AAED;AACH;AAWd;AAEA;AAEO;;"}
@@ -3,12 +3,94 @@ import { jsxs, jsx } from 'react/jsx-runtime';
3
3
  import React, { useState, useCallback } from 'react';
4
4
  import { assignInlineVars } from '@vanilla-extract/dynamic';
5
5
  import { cx } from '../../../utils/cx.js';
6
+ import '../../Icons/AddIcon.js';
7
+ import '../../Icons/AiChatIcon.js';
8
+ import '../../Icons/AiSparklesIcon.js';
9
+ import '../../Icons/ArrowDownIcon.js';
10
+ import '../../Icons/ArrowLeftIcon.js';
11
+ import '../../Icons/ArrowRightIcon.js';
12
+ import '../../Icons/ArrowUpIcon.js';
13
+ import '../../Icons/BookmarkIcon.js';
14
+ import '../../Icons/CalendarIcon.js';
15
+ import '../../Icons/ChevronDownIcon.js';
16
+ import '../../Icons/ChevronUpIcon.js';
17
+ import '../../Icons/ClockIcon.js';
18
+ import '../../Icons/CloseIcon.js';
19
+ import '../../Icons/CloudUploadIcon.js';
20
+ import '../../Icons/CodeIcon.js';
21
+ import { CopyIcon } from '../../Icons/CopyIcon.js';
22
+ import '../../Icons/CutIcon.js';
23
+ import '../../Icons/DownloadIcon.js';
24
+ import '../../Icons/EditIcon.js';
25
+ import '../../Icons/ErrorIcon.js';
26
+ import '../../Icons/ExternalLinkIcon.js';
27
+ import '../../Icons/EyeDropperIcon.js';
28
+ import '../../Icons/EyeIcon.js';
29
+ import '../../Icons/FilterIcon.js';
30
+ import '../../Icons/FirstIcon.js';
31
+ import '../../Icons/FolderIcon.js';
32
+ import '../../Icons/FullscreenIcon.js';
33
+ import '../../Icons/GridIcon.js';
34
+ import '../../Icons/HeartIcon.js';
35
+ import '../../Icons/HelpIcon.js';
36
+ import '../../Icons/HomeIcon.js';
37
+ import '../../Icons/InfoIcon.js';
38
+ import '../../Icons/LastIcon.js';
39
+ import '../../Icons/LinkIcon.js';
40
+ import '../../Icons/ListIcon.js';
41
+ import '../../Icons/LockIcon.js';
42
+ import '../../Icons/MaximizeIcon.js';
43
+ import '../../Icons/MenuIcon.js';
44
+ import '../../Icons/MinimizeIcon.js';
45
+ import '../../Icons/PasteIcon.js';
46
+ import '../../Icons/PlayIcon.js';
47
+ import '../../Icons/RedoIcon.js';
48
+ import '../../Icons/RefreshIcon.js';
49
+ import '../../Icons/RobotIcon.js';
50
+ import '../../Icons/SaveIcon.js';
51
+ import '../../Icons/SearchIcon.js';
52
+ import '../../Icons/SettingsIcon.js';
53
+ import '../../Icons/SortIcon.js';
54
+ import '../../Icons/StarIcon.js';
55
+ import '../../Icons/SuccessIcon.js';
56
+ import '../../Icons/TagIcon.js';
57
+ import '../../Icons/TrashIcon.js';
58
+ import '../../Icons/UndoIcon.js';
59
+ import '../../Icons/UnlinkIcon.js';
60
+ import '../../Icons/UnlockIcon.js';
61
+ import '../../Icons/UploadIcon.js';
62
+ import '../../Icons/UserIcon.js';
63
+ import '../../Icons/WarningIcon.js';
64
+ import '../../Icons/ZoomInIcon.js';
65
+ import '../../Icons/ZoomOutIcon.js';
66
+ import { CheckIcon } from '../../Icons/CheckIcon.js';
67
+ import '../../Icons/CircleIcon.js';
68
+ import '../../Icons/TangentFreeIcon.js';
69
+ import '../../Icons/TangentAlignedIcon.js';
70
+ import '../../Icons/TangentMirroredIcon.js';
71
+ import '../../Icons/TangentAutoIcon.js';
72
+ import '../../Icons/TangentLinearIcon.js';
73
+ import '../../Icons/TangentStepIcon.js';
74
+ import '../../Icons/ArchiveIcon.js';
75
+ import '../../Icons/DotsVerticalIcon.js';
76
+ import '../../Icons/DotsHorizontalIcon.js';
77
+ import '../../Icons/ChevronLeftIcon.js';
78
+ import '../../Icons/ChevronRightIcon.js';
79
+ import '../../Icons/FolderOpenIcon.js';
80
+ import '../../Icons/FolderCogIcon.js';
81
+ import '../../Icons/UsersIcon.js';
82
+ import '../../Icons/BuildingIcon.js';
83
+ import '../../Icons/FileTextIcon.js';
84
+ import '../../Icons/PauseIcon.js';
85
+ import '../../Icons/StopIcon.js';
86
+ import '../../Icons/SendIcon.js';
87
+ import '../../Icons/TerminalIcon.js';
88
+ import '../../Icons/GitBranchIcon.js';
89
+ import '../../Icons/BugIcon.js';
90
+ import '../../Icons/MinusIcon.js';
91
+ import '../../Icons/PinIcon.js';
6
92
  import { codeBlockHeaderStyle, codeBlockLanguageStyle, codeBlockActionsStyle, codeBlockCopyButtonStyle, codeBlockLineNumbersColumnStyle, codeBlockPreStyle, codeBlockMaxHeightVar, codeBlockContentWithLineNumbersStyle, codeBlockContentStyle, codeBlockContainerStyle } from './ChatPanel.css.js';
7
93
 
8
- // ─── Icons ───────────────────────────────────────────────────────
9
- const CopyIcon = () => (jsxs("svg", { width: "12", height: "12", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: [jsx("rect", { x: "5", y: "5", width: "9", height: "9", rx: "1.5", stroke: "currentColor", strokeWidth: "1.5" }), jsx("path", { d: "M11 5V3.5A1.5 1.5 0 009.5 2H3.5A1.5 1.5 0 002 3.5V9.5A1.5 1.5 0 003.5 11H5", stroke: "currentColor", strokeWidth: "1.5" })] }));
10
- const CheckIcon = () => (jsx("svg", { width: "12", height: "12", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: jsx("path", { d: "M3 8.5L6.5 12L13 4", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) }));
11
- // ─── Component ───────────────────────────────────────────────────
12
94
  const ChatCodeBlock = /*#__PURE__*/ React.memo(({ code, language, copyable = true, lineNumbers = false, maxHeight = 400, actions, className, style, testId, ref, ...rest }) => {
13
95
  const [copied, setCopied] = useState(false);
14
96
  const handleCopy = useCallback(() => {
@@ -24,7 +106,7 @@ const ChatCodeBlock = /*#__PURE__*/ React.memo(({ code, language, copyable = tru
24
106
  }, [code]);
25
107
  const lines = code.split('\n');
26
108
  const showHeader = language != null || copyable || actions != null;
27
- return (jsxs("div", { ref: ref, className: cx(codeBlockContainerStyle, className), style: style, "data-testid": testId, ...rest, children: [showHeader && (jsxs("div", { className: codeBlockHeaderStyle, children: [language != null && (jsx("span", { className: codeBlockLanguageStyle, children: language })), jsxs("div", { className: codeBlockActionsStyle, children: [actions, copyable && (jsx("button", { type: "button", className: codeBlockCopyButtonStyle, onClick: handleCopy, "aria-label": copied ? 'Copied' : 'Copy code', children: copied ? jsx(CheckIcon, {}) : jsx(CopyIcon, {}) }))] })] })), jsxs("div", { className: cx(codeBlockContentStyle, lineNumbers && codeBlockContentWithLineNumbersStyle), style: assignInlineVars({
109
+ return (jsxs("div", { ref: ref, className: cx(codeBlockContainerStyle, className), style: style, "data-testid": testId, ...rest, children: [showHeader && (jsxs("div", { className: codeBlockHeaderStyle, children: [language != null && (jsx("span", { className: codeBlockLanguageStyle, children: language })), jsxs("div", { className: codeBlockActionsStyle, children: [actions, copyable && (jsx("button", { type: "button", className: codeBlockCopyButtonStyle, onClick: handleCopy, "aria-label": copied ? 'Copied' : 'Copy code', children: copied ? (jsx(CheckIcon, { size: 12, decorative: true })) : (jsx(CopyIcon, { size: 12, decorative: true })) }))] })] })), jsxs("div", { className: cx(codeBlockContentStyle, lineNumbers && codeBlockContentWithLineNumbersStyle), style: assignInlineVars({
28
110
  [codeBlockMaxHeightVar]: `${maxHeight}px`,
29
111
  }), "data-testid": testId ? `${testId}-content` : undefined, children: [lineNumbers && (jsx("div", { className: codeBlockLineNumbersColumnStyle, "aria-hidden": "true", "data-testid": testId ? `${testId}-line-numbers` : undefined, children: lines.map((_, i) => (jsx("div", { children: i + 1 }, i))) })), jsx("pre", { className: codeBlockPreStyle, children: jsx("code", { children: code }) })] })] }));
30
112
  });
@@ -1 +1 @@
1
- {"version":3,"file":"ChatCodeBlock.js","sources":["../../../../../../src/components/editor/ChatPanel/ChatCodeBlock.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;AAmBA;AAEA;AAyBA;AAkBA;AAEO;;AAgBH;AACE;;;;;AAKE;;;AAGA;AACJ;;;;AAwCQ;AACD;AAoBT;AAGF;;"}
1
+ {"version":3,"file":"ChatCodeBlock.js","sources":["../../../../../../src/components/editor/ChatPanel/ChatCodeBlock.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBO;;AAgBH;AACE;;;;;AAKE;;;AAGA;AACJ;;;AAKA;AAuCQ;AACD;AAoBT;AAGF;;"}