@fragments-sdk/ui 0.9.4 → 0.9.6

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 (126) hide show
  1. package/dist/assets/ui.css +443 -247
  2. package/dist/blocks/components/index.d.ts +0 -2
  3. package/dist/blocks/components/index.d.ts.map +1 -1
  4. package/dist/codeblock.cjs +187 -184
  5. package/dist/codeblock.cjs.map +1 -1
  6. package/dist/codeblock.js +183 -180
  7. package/dist/codeblock.js.map +1 -1
  8. package/dist/components/Box/Box.module.scss.cjs +73 -0
  9. package/dist/components/Box/Box.module.scss.cjs.map +1 -1
  10. package/dist/components/Box/Box.module.scss.js +73 -0
  11. package/dist/components/Box/Box.module.scss.js.map +1 -1
  12. package/dist/components/ButtonGroup/ButtonGroup.module.scss.cjs +6 -0
  13. package/dist/components/ButtonGroup/ButtonGroup.module.scss.cjs.map +1 -1
  14. package/dist/components/ButtonGroup/ButtonGroup.module.scss.js +6 -0
  15. package/dist/components/ButtonGroup/ButtonGroup.module.scss.js.map +1 -1
  16. package/dist/components/CodeBlock/CodeBlock.module.scss.cjs +20 -23
  17. package/dist/components/CodeBlock/CodeBlock.module.scss.cjs.map +1 -1
  18. package/dist/components/CodeBlock/CodeBlock.module.scss.js +20 -23
  19. package/dist/components/CodeBlock/CodeBlock.module.scss.js.map +1 -1
  20. package/dist/components/CodeBlock/index.d.ts +11 -7
  21. package/dist/components/CodeBlock/index.d.ts.map +1 -1
  22. package/dist/components/Combobox/Combobox.module.scss.cjs +15 -15
  23. package/dist/components/Combobox/Combobox.module.scss.js +15 -15
  24. package/dist/components/DataTable/DataTable.module.scss.cjs +84 -0
  25. package/dist/components/DataTable/DataTable.module.scss.cjs.map +1 -0
  26. package/dist/components/DataTable/DataTable.module.scss.js +84 -0
  27. package/dist/components/DataTable/DataTable.module.scss.js.map +1 -0
  28. package/dist/components/DataTable/index.cjs +383 -0
  29. package/dist/components/DataTable/index.cjs.map +1 -0
  30. package/dist/components/DataTable/index.d.ts +78 -0
  31. package/dist/components/DataTable/index.d.ts.map +1 -0
  32. package/dist/components/DataTable/index.js +366 -0
  33. package/dist/components/DataTable/index.js.map +1 -0
  34. package/dist/components/Drawer/Drawer.module.scss.cjs +9 -0
  35. package/dist/components/Drawer/Drawer.module.scss.cjs.map +1 -1
  36. package/dist/components/Drawer/Drawer.module.scss.js +9 -0
  37. package/dist/components/Drawer/Drawer.module.scss.js.map +1 -1
  38. package/dist/components/Image/Image.module.scss.cjs +12 -0
  39. package/dist/components/Image/Image.module.scss.cjs.map +1 -1
  40. package/dist/components/Image/Image.module.scss.js +12 -0
  41. package/dist/components/Image/Image.module.scss.js.map +1 -1
  42. package/dist/components/Link/Link.module.scss.cjs +3 -0
  43. package/dist/components/Link/Link.module.scss.cjs.map +1 -1
  44. package/dist/components/Link/Link.module.scss.js +3 -0
  45. package/dist/components/Link/Link.module.scss.js.map +1 -1
  46. package/dist/components/List/List.module.scss.cjs +5 -0
  47. package/dist/components/List/List.module.scss.cjs.map +1 -1
  48. package/dist/components/List/List.module.scss.js +5 -0
  49. package/dist/components/List/List.module.scss.js.map +1 -1
  50. package/dist/components/Loading/Loading.module.scss.cjs +5 -0
  51. package/dist/components/Loading/Loading.module.scss.cjs.map +1 -1
  52. package/dist/components/Loading/Loading.module.scss.js +5 -0
  53. package/dist/components/Loading/Loading.module.scss.js.map +1 -1
  54. package/dist/components/Markdown/Markdown.module.scss.cjs +1 -1
  55. package/dist/components/Markdown/Markdown.module.scss.js +1 -1
  56. package/dist/components/Message/Message.module.scss.cjs +22 -16
  57. package/dist/components/Message/Message.module.scss.cjs.map +1 -1
  58. package/dist/components/Message/Message.module.scss.js +22 -16
  59. package/dist/components/Message/Message.module.scss.js.map +1 -1
  60. package/dist/components/Message/index.cjs +5 -3
  61. package/dist/components/Message/index.cjs.map +1 -1
  62. package/dist/components/Message/index.d.ts +5 -1
  63. package/dist/components/Message/index.d.ts.map +1 -1
  64. package/dist/components/Message/index.js +5 -3
  65. package/dist/components/Message/index.js.map +1 -1
  66. package/dist/components/Skeleton/Skeleton.module.scss.cjs +14 -0
  67. package/dist/components/Skeleton/Skeleton.module.scss.cjs.map +1 -1
  68. package/dist/components/Skeleton/Skeleton.module.scss.js +14 -0
  69. package/dist/components/Skeleton/Skeleton.module.scss.js.map +1 -1
  70. package/dist/components/Stack/Stack.module.scss.cjs +14 -0
  71. package/dist/components/Stack/Stack.module.scss.cjs.map +1 -1
  72. package/dist/components/Stack/Stack.module.scss.js +14 -0
  73. package/dist/components/Stack/Stack.module.scss.js.map +1 -1
  74. package/dist/components/Table/Table.module.scss.cjs +21 -36
  75. package/dist/components/Table/Table.module.scss.cjs.map +1 -1
  76. package/dist/components/Table/Table.module.scss.js +21 -36
  77. package/dist/components/Table/Table.module.scss.js.map +1 -1
  78. package/dist/components/Table/index.d.ts +35 -55
  79. package/dist/components/Table/index.d.ts.map +1 -1
  80. package/dist/components/Text/Text.module.scss.cjs +14 -0
  81. package/dist/components/Text/Text.module.scss.cjs.map +1 -1
  82. package/dist/components/Text/Text.module.scss.js +14 -0
  83. package/dist/components/Text/Text.module.scss.js.map +1 -1
  84. package/dist/components/Textarea/Textarea.module.scss.cjs +4 -0
  85. package/dist/components/Textarea/Textarea.module.scss.cjs.map +1 -1
  86. package/dist/components/Textarea/Textarea.module.scss.js +4 -0
  87. package/dist/components/Textarea/Textarea.module.scss.js.map +1 -1
  88. package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs +5 -0
  89. package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs.map +1 -1
  90. package/dist/components/ToggleGroup/ToggleGroup.module.scss.js +5 -0
  91. package/dist/components/ToggleGroup/ToggleGroup.module.scss.js.map +1 -1
  92. package/dist/index.cjs +119 -117
  93. package/dist/index.cjs.map +1 -1
  94. package/dist/index.d.ts +2 -1
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.js +3 -1
  97. package/dist/index.js.map +1 -1
  98. package/dist/table.cjs +44 -262
  99. package/dist/table.cjs.map +1 -1
  100. package/dist/table.js +47 -248
  101. package/dist/table.js.map +1 -1
  102. package/fragments.json +1 -1
  103. package/package.json +110 -118
  104. package/src/blocks/components/index.ts +0 -3
  105. package/src/components/CodeBlock/CodeBlock.module.scss +16 -34
  106. package/src/components/CodeBlock/index.tsx +351 -345
  107. package/src/components/Combobox/Combobox.module.scss +13 -9
  108. package/src/components/ConversationList/ConversationList.fragment.tsx +96 -129
  109. package/src/components/DataTable/DataTable.fragment.tsx +754 -0
  110. package/src/components/DataTable/DataTable.module.scss +300 -0
  111. package/src/components/DataTable/DataTable.test.tsx +224 -0
  112. package/src/components/DataTable/index.tsx +533 -0
  113. package/src/components/Message/Message.fragment.tsx +34 -0
  114. package/src/components/Message/Message.module.scss +11 -0
  115. package/src/components/Message/index.tsx +12 -3
  116. package/src/components/Table/Table.fragment.tsx +190 -175
  117. package/src/components/Table/Table.module.scss +15 -88
  118. package/src/components/Table/Table.test.tsx +184 -94
  119. package/src/components/Table/index.tsx +105 -374
  120. package/src/index.ts +15 -4
  121. package/src/tokens/_computed.scss +7 -6
  122. package/src/tokens/_density.scss +87 -47
  123. package/src/tokens/_variables.scss +46 -31
  124. package/dist/blocks/components/DataTable.d.ts +0 -19
  125. package/dist/blocks/components/DataTable.d.ts.map +0 -1
  126. package/src/blocks/components/DataTable.tsx +0 -124
package/dist/table.cjs CHANGED
@@ -1,287 +1,69 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
- const React = require("react");
5
4
  ;/* empty css */
6
5
  const Table_module = require("./components/Table/Table.module.scss.cjs");
7
- function _interopNamespaceDefault(e) {
8
- const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
9
- if (e) {
10
- for (const k in e) {
11
- if (k !== "default") {
12
- const d = Object.getOwnPropertyDescriptor(e, k);
13
- Object.defineProperty(n, k, d.get ? d : {
14
- enumerable: true,
15
- get: () => e[k]
16
- });
17
- }
6
+ function TableHead({ className, children, ...props }) {
7
+ return /* @__PURE__ */ jsxRuntime.jsx("thead", { className: [Table_module.default.thead, className].filter(Boolean).join(" "), ...props, children });
8
+ }
9
+ function TableBody({ className, children, ...props }) {
10
+ return /* @__PURE__ */ jsxRuntime.jsx("tbody", { className: [Table_module.default.tbody, className].filter(Boolean).join(" "), ...props, children });
11
+ }
12
+ function TableFooter({ className, children, ...props }) {
13
+ return /* @__PURE__ */ jsxRuntime.jsx("tfoot", { className: [Table_module.default.tfoot, className].filter(Boolean).join(" "), ...props, children });
14
+ }
15
+ function TableRow({ className, selected, children, ...props }) {
16
+ return /* @__PURE__ */ jsxRuntime.jsx(
17
+ "tr",
18
+ {
19
+ className: [Table_module.default.row, selected && Table_module.default.selected, className].filter(Boolean).join(" "),
20
+ "data-selected": selected || void 0,
21
+ ...props,
22
+ children
18
23
  }
19
- }
20
- n.default = e;
21
- return Object.freeze(n);
24
+ );
25
+ }
26
+ function TableCell({ className, children, ...props }) {
27
+ return /* @__PURE__ */ jsxRuntime.jsx("td", { className: [Table_module.default.td, className].filter(Boolean).join(" "), ...props, children });
22
28
  }
23
- const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
24
- let _useReactTable = null;
25
- let _getCoreRowModel = null;
26
- let _getSortedRowModel = null;
27
- let _flexRender = null;
28
- let _tableLoaded = false;
29
- let _tableFailed = false;
30
- function loadTableDeps() {
31
- if (_tableLoaded) return;
32
- _tableLoaded = true;
33
- try {
34
- const rt = require("@tanstack/react-table");
35
- _useReactTable = rt.useReactTable;
36
- _getCoreRowModel = rt.getCoreRowModel;
37
- _getSortedRowModel = rt.getSortedRowModel;
38
- _flexRender = rt.flexRender;
39
- } catch {
40
- _tableFailed = true;
41
- }
29
+ function TableHeaderCell({ className, scope = "col", children, ...props }) {
30
+ return /* @__PURE__ */ jsxRuntime.jsx("th", { className: [Table_module.default.th, className].filter(Boolean).join(" "), scope, ...props, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: Table_module.default.headerContent, children }) });
31
+ }
32
+ function TableCaption({ className, hidden: visuallyHidden, children, ...props }) {
33
+ return /* @__PURE__ */ jsxRuntime.jsx(
34
+ "caption",
35
+ {
36
+ className: [visuallyHidden ? Table_module.default.captionHidden : Table_module.default.caption, className].filter(Boolean).join(" "),
37
+ ...props,
38
+ children
39
+ }
40
+ );
42
41
  }
43
42
  function TableRoot({
44
- columns,
45
- data,
46
- getRowId,
47
- sortable = false,
48
- sorting: controlledSorting,
49
- onSortingChange,
50
- selectable = false,
51
- rowSelection: controlledRowSelection,
52
- onRowSelectionChange,
53
- onRowClick,
54
- emptyMessage = "No data available",
55
43
  size = "md",
56
- className,
57
- caption,
58
- captionHidden = false,
59
44
  striped = false,
60
45
  bordered = false,
61
- "aria-label": ariaLabel,
62
- "aria-describedby": ariaDescribedBy,
46
+ className,
47
+ children,
63
48
  ...htmlProps
64
49
  }) {
65
- loadTableDeps();
66
- const [internalSorting, setInternalSorting] = React__namespace.useState([]);
67
- const sorting = controlledSorting ?? internalSorting;
68
- const handleSortingChange = onSortingChange ?? setInternalSorting;
69
- const [internalRowSelection, setInternalRowSelection] = React__namespace.useState({});
70
- const rowSelection = controlledRowSelection ?? internalRowSelection;
71
- const handleRowSelectionChange = onRowSelectionChange ?? setInternalRowSelection;
72
- if (_tableFailed || !_useReactTable) {
73
- if (_tableFailed && process.env.NODE_ENV === "development") {
74
- console.warn(
75
- "[@fragments-sdk/ui] Table: @tanstack/react-table is not installed. Install it with: npm install @tanstack/react-table"
76
- );
77
- }
78
- return null;
79
- }
80
- const table = _useReactTable({
81
- data,
82
- columns,
83
- getRowId,
84
- getCoreRowModel: _getCoreRowModel(),
85
- getSortedRowModel: sortable ? _getSortedRowModel() : void 0,
86
- state: {
87
- sorting: sortable ? sorting : void 0,
88
- rowSelection: selectable ? rowSelection : void 0
89
- },
90
- onSortingChange: sortable ? handleSortingChange : void 0,
91
- onRowSelectionChange: selectable ? handleRowSelectionChange : void 0,
92
- enableRowSelection: selectable,
93
- enableSorting: sortable
94
- });
95
- const isEmpty = data.length === 0;
96
- const hasExplicitColumnSizing = React__namespace.useMemo(
97
- () => columns.some(
98
- (column) => column.size !== void 0 || column.minSize !== void 0 || column.maxSize !== void 0
99
- ),
100
- [columns]
101
- );
102
- const rootClasses = [
50
+ const tableClasses = [
103
51
  Table_module.default.table,
104
- hasExplicitColumnSizing && Table_module.default.fixedLayout,
105
52
  Table_module.default[size],
106
53
  striped && Table_module.default.striped,
107
54
  className
108
55
  ].filter(Boolean).join(" ");
109
- const getColumnSizeStyle = (column) => {
110
- const { size: size2, minSize, maxSize } = column.columnDef;
111
- const hasExplicitSize = size2 !== void 0 || minSize !== void 0 || maxSize !== void 0;
112
- if (!hasExplicitSize) {
113
- return void 0;
114
- }
115
- const resolvedSize = column.getSize();
116
- return {
117
- width: resolvedSize,
118
- minWidth: minSize ?? resolvedSize,
119
- maxWidth: maxSize ?? resolvedSize
120
- };
121
- };
122
- if (isEmpty) {
123
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: Table_module.default.emptyState, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: Table_module.default.emptyMessage, children: emptyMessage }) });
124
- }
125
- const isInteractiveTarget = (target, currentTarget) => {
126
- if (!(target instanceof Element)) return false;
127
- const interactiveElement = target.closest(
128
- 'button, a, input, select, textarea, [role="button"], [role="link"], [role="checkbox"], [role="switch"]'
129
- );
130
- return Boolean(interactiveElement && currentTarget.contains(interactiveElement));
131
- };
132
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: [Table_module.default.wrapper, bordered && Table_module.default.bordered].filter(Boolean).join(" "), children: /* @__PURE__ */ jsxRuntime.jsxs(
133
- "table",
134
- {
135
- ...htmlProps,
136
- className: rootClasses,
137
- "aria-label": ariaLabel,
138
- "aria-describedby": ariaDescribedBy,
139
- children: [
140
- caption && /* @__PURE__ */ jsxRuntime.jsx("caption", { className: captionHidden ? Table_module.default.captionHidden : Table_module.default.caption, children: caption }),
141
- /* @__PURE__ */ jsxRuntime.jsx("thead", { className: Table_module.default.thead, children: table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ jsxRuntime.jsx("tr", { className: Table_module.default.headerRow, children: headerGroup.headers.map((header) => {
142
- const canSort = sortable && header.column.getCanSort();
143
- const sortDirection = header.column.getIsSorted();
144
- const toggleSorting = canSort ? header.column.getToggleSortingHandler() : void 0;
145
- return /* @__PURE__ */ jsxRuntime.jsx(
146
- "th",
147
- {
148
- className: [Table_module.default.th, canSort && Table_module.default.thSortable].filter(Boolean).join(" "),
149
- style: getColumnSizeStyle(header.column),
150
- scope: "col",
151
- "aria-sort": sortDirection ? sortDirection === "asc" ? "ascending" : "descending" : canSort ? "none" : void 0,
152
- children: canSort ? /* @__PURE__ */ jsxRuntime.jsxs(
153
- "button",
154
- {
155
- type: "button",
156
- className: Table_module.default.sortButton,
157
- onClick: toggleSorting,
158
- children: [
159
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: Table_module.default.headerContent, children: header.isPlaceholder ? null : _flexRender(
160
- header.column.columnDef.header,
161
- header.getContext()
162
- ) }),
163
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: Table_module.default.sortIndicator, "aria-hidden": "true", children: sortDirection === "asc" ? /* @__PURE__ */ jsxRuntime.jsx(SortAscIcon, {}) : sortDirection === "desc" ? /* @__PURE__ */ jsxRuntime.jsx(SortDescIcon, {}) : /* @__PURE__ */ jsxRuntime.jsx(SortIcon, {}) })
164
- ]
165
- }
166
- ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: Table_module.default.headerContent, children: header.isPlaceholder ? null : _flexRender(
167
- header.column.columnDef.header,
168
- header.getContext()
169
- ) })
170
- },
171
- header.id
172
- );
173
- }) }, headerGroup.id)) }),
174
- /* @__PURE__ */ jsxRuntime.jsx("tbody", { className: Table_module.default.tbody, children: table.getRowModel().rows.map((row) => {
175
- const isClickable = !!onRowClick;
176
- const isSelected = selectable ? row.getIsSelected() : false;
177
- const handleRowClick = (event) => {
178
- if (!onRowClick) return;
179
- if (isInteractiveTarget(event.target, event.currentTarget)) return;
180
- onRowClick(row.original);
181
- };
182
- const handleRowKeyDown = (event) => {
183
- if (!onRowClick) return;
184
- if (isInteractiveTarget(event.target, event.currentTarget)) return;
185
- if (event.key === "Enter" || event.key === " ") {
186
- event.preventDefault();
187
- onRowClick(row.original);
188
- }
189
- };
190
- return /* @__PURE__ */ jsxRuntime.jsx(
191
- "tr",
192
- {
193
- className: [
194
- Table_module.default.row,
195
- isClickable && Table_module.default.clickable,
196
- isSelected && Table_module.default.selected
197
- ].filter(Boolean).join(" "),
198
- onClick: isClickable ? handleRowClick : void 0,
199
- onKeyDown: isClickable ? handleRowKeyDown : void 0,
200
- tabIndex: isClickable ? 0 : void 0,
201
- "data-selected": isSelected || void 0,
202
- children: row.getVisibleCells().map((cell) => /* @__PURE__ */ jsxRuntime.jsx("td", { className: Table_module.default.td, style: getColumnSizeStyle(cell.column), children: _flexRender(cell.column.columnDef.cell, cell.getContext()) }, cell.id))
203
- },
204
- row.id
205
- );
206
- }) })
207
- ]
208
- }
209
- ) });
210
- }
211
- function SortIcon() {
212
- return /* @__PURE__ */ jsxRuntime.jsxs(
213
- "svg",
214
- {
215
- width: "12",
216
- height: "12",
217
- viewBox: "0 0 12 12",
218
- fill: "none",
219
- xmlns: "http://www.w3.org/2000/svg",
220
- "aria-hidden": "true",
221
- children: [
222
- /* @__PURE__ */ jsxRuntime.jsx(
223
- "path",
224
- {
225
- d: "M6 2L8.5 5H3.5L6 2Z",
226
- fill: "currentColor",
227
- opacity: "0.3"
228
- }
229
- ),
230
- /* @__PURE__ */ jsxRuntime.jsx(
231
- "path",
232
- {
233
- d: "M6 10L3.5 7H8.5L6 10Z",
234
- fill: "currentColor",
235
- opacity: "0.3"
236
- }
237
- )
238
- ]
239
- }
240
- );
241
- }
242
- function SortAscIcon() {
243
- return /* @__PURE__ */ jsxRuntime.jsx(
244
- "svg",
245
- {
246
- width: "12",
247
- height: "12",
248
- viewBox: "0 0 12 12",
249
- fill: "none",
250
- xmlns: "http://www.w3.org/2000/svg",
251
- "aria-hidden": "true",
252
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 2L8.5 5H3.5L6 2Z", fill: "currentColor" })
253
- }
254
- );
255
- }
256
- function SortDescIcon() {
257
- return /* @__PURE__ */ jsxRuntime.jsx(
258
- "svg",
259
- {
260
- width: "12",
261
- height: "12",
262
- viewBox: "0 0 12 12",
263
- fill: "none",
264
- xmlns: "http://www.w3.org/2000/svg",
265
- "aria-hidden": "true",
266
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 10L3.5 7H8.5L6 10Z", fill: "currentColor" })
267
- }
268
- );
269
- }
270
- function createColumns(columns) {
271
- return columns.map((col) => ({
272
- id: col.key,
273
- accessorKey: col.key,
274
- header: col.header,
275
- size: col.width,
276
- minSize: col.width,
277
- maxSize: col.width,
278
- cell: col.cell ? ({ row }) => col.cell(row.original) : ({ getValue }) => getValue() ?? "--"
279
- }));
56
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: [Table_module.default.wrapper, bordered && Table_module.default.bordered].filter(Boolean).join(" "), children: /* @__PURE__ */ jsxRuntime.jsx("table", { className: tableClasses, ...htmlProps, children }) });
280
57
  }
281
58
  const Table = Object.assign(TableRoot, {
282
59
  Root: TableRoot,
283
- Columns: createColumns
60
+ Head: TableHead,
61
+ Body: TableBody,
62
+ Footer: TableFooter,
63
+ Row: TableRow,
64
+ Cell: TableCell,
65
+ HeaderCell: TableHeaderCell,
66
+ Caption: TableCaption
284
67
  });
285
68
  exports.Table = Table;
286
- exports.createColumns = createColumns;
287
69
  //# sourceMappingURL=table.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"table.cjs","sources":["../src/components/Table/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\n// Import globals to ensure CSS variables are defined\nimport '../../styles/globals.scss';\nimport styles from './Table.module.scss';\n\n// ============================================\n// Types (self-owned — no external dependency for types)\n// ============================================\n\n/** Column definition compatible with @tanstack/react-table */\nexport type ColumnDef<TData = unknown, TValue = unknown> = {\n id?: string;\n accessorKey?: string;\n accessorFn?: (row: TData) => TValue;\n header?: string | ((context: any) => React.ReactNode);\n cell?: string | ((context: any) => React.ReactNode);\n size?: number;\n minSize?: number;\n maxSize?: number;\n enableSorting?: boolean;\n [key: string]: unknown;\n};\n\nexport type SortingState = Array<{ id: string; desc: boolean }>;\nexport type RowSelectionState = Record<string, boolean>;\ntype OnChangeFn<T> = ((updaterOrValue: T | ((prev: T) => T)) => void);\n\nexport type TableColumn<T> = ColumnDef<T, unknown>;\n\n// ============================================\n// Lazy-loaded dependency (@tanstack/react-table)\n// ============================================\n\nlet _useReactTable: any = null;\nlet _getCoreRowModel: any = null;\nlet _getSortedRowModel: any = null;\nlet _flexRender: any = null;\nlet _tableLoaded = false;\nlet _tableFailed = false;\n\nfunction loadTableDeps() {\n if (_tableLoaded) return;\n _tableLoaded = true;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const rt = require('@tanstack/react-table');\n _useReactTable = rt.useReactTable;\n _getCoreRowModel = rt.getCoreRowModel;\n _getSortedRowModel = rt.getSortedRowModel;\n _flexRender = rt.flexRender;\n } catch {\n _tableFailed = true;\n }\n}\n\nexport interface TableProps<T> extends Omit<React.HTMLAttributes<HTMLTableElement>, 'onClick'> {\n /** Column definitions */\n columns: TableColumn<T>[];\n /** Data array */\n data: T[];\n /** Unique key extractor for each row */\n getRowId?: (row: T) => string;\n /** Enable sorting */\n sortable?: boolean;\n /** Controlled sorting state */\n sorting?: SortingState;\n /** Sorting change handler */\n onSortingChange?: OnChangeFn<SortingState>;\n /** Enable row selection */\n selectable?: boolean;\n /** Controlled selection state */\n rowSelection?: RowSelectionState;\n /** Selection change handler */\n onRowSelectionChange?: OnChangeFn<RowSelectionState>;\n /** Row click handler */\n onRowClick?: (row: T) => void;\n /** Empty state message */\n emptyMessage?: string;\n /** Size variant */\n size?: 'sm' | 'md';\n /** Visible caption for the table (recommended for accessibility) */\n caption?: string;\n /** Hide the caption visually but keep it for screen readers */\n captionHidden?: boolean;\n /** Show alternating row backgrounds */\n striped?: boolean;\n /** Wrap table in a bordered container */\n bordered?: boolean;\n}\n\nfunction TableRoot<T>({\n columns,\n data,\n getRowId,\n sortable = false,\n sorting: controlledSorting,\n onSortingChange,\n selectable = false,\n rowSelection: controlledRowSelection,\n onRowSelectionChange,\n onRowClick,\n emptyMessage = 'No data available',\n size = 'md',\n className,\n caption,\n captionHidden = false,\n striped = false,\n bordered = false,\n 'aria-label': ariaLabel,\n 'aria-describedby': ariaDescribedBy,\n ...htmlProps\n}: TableProps<T>) {\n loadTableDeps();\n\n // Internal sorting state when uncontrolled\n const [internalSorting, setInternalSorting] = React.useState<SortingState>([]);\n const sorting = controlledSorting ?? internalSorting;\n const handleSortingChange = onSortingChange ?? setInternalSorting;\n\n // Internal selection state when uncontrolled\n const [internalRowSelection, setInternalRowSelection] = React.useState<RowSelectionState>({});\n const rowSelection = controlledRowSelection ?? internalRowSelection;\n const handleRowSelectionChange = onRowSelectionChange ?? setInternalRowSelection;\n\n if (_tableFailed || !_useReactTable) {\n if (_tableFailed && process.env.NODE_ENV === 'development') {\n console.warn(\n '[@fragments-sdk/ui] Table: @tanstack/react-table is not installed. ' +\n 'Install it with: npm install @tanstack/react-table'\n );\n }\n return null;\n }\n\n const table = _useReactTable({\n data,\n columns,\n getRowId,\n getCoreRowModel: _getCoreRowModel(),\n getSortedRowModel: sortable ? _getSortedRowModel() : undefined,\n state: {\n sorting: sortable ? sorting : undefined,\n rowSelection: selectable ? rowSelection : undefined,\n },\n onSortingChange: sortable ? handleSortingChange : undefined,\n onRowSelectionChange: selectable ? handleRowSelectionChange : undefined,\n enableRowSelection: selectable,\n enableSorting: sortable,\n });\n\n const isEmpty = data.length === 0;\n\n const hasExplicitColumnSizing = React.useMemo(\n () =>\n columns.some((column) =>\n column.size !== undefined ||\n column.minSize !== undefined ||\n column.maxSize !== undefined\n ),\n [columns]\n );\n\n const rootClasses = [\n styles.table,\n hasExplicitColumnSizing && styles.fixedLayout,\n styles[size],\n striped && styles.striped,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const getColumnSizeStyle = (\n column: {\n getSize: () => number;\n columnDef: { size?: number; minSize?: number; maxSize?: number };\n }\n ): React.CSSProperties | undefined => {\n const { size, minSize, maxSize } = column.columnDef;\n const hasExplicitSize = size !== undefined || minSize !== undefined || maxSize !== undefined;\n\n if (!hasExplicitSize) {\n return undefined;\n }\n\n const resolvedSize = column.getSize();\n\n return {\n width: resolvedSize,\n minWidth: minSize ?? resolvedSize,\n maxWidth: maxSize ?? resolvedSize,\n };\n };\n\n if (isEmpty) {\n return (\n <div className={styles.emptyState}>\n <span className={styles.emptyMessage}>{emptyMessage}</span>\n </div>\n );\n }\n\n const isInteractiveTarget = (\n target: EventTarget | null,\n currentTarget: HTMLTableRowElement\n ) => {\n if (!(target instanceof Element)) return false;\n\n const interactiveElement = target.closest(\n 'button, a, input, select, textarea, [role=\"button\"], [role=\"link\"], [role=\"checkbox\"], [role=\"switch\"]'\n );\n\n return Boolean(interactiveElement && currentTarget.contains(interactiveElement));\n };\n\n return (\n <div className={[styles.wrapper, bordered && styles.bordered].filter(Boolean).join(' ')}>\n <table\n {...htmlProps}\n className={rootClasses}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedBy}\n >\n {caption && (\n <caption className={captionHidden ? styles.captionHidden : styles.caption}>\n {caption}\n </caption>\n )}\n <thead className={styles.thead}>\n {table.getHeaderGroups().map((headerGroup: any) => (\n <tr key={headerGroup.id} className={styles.headerRow}>\n {headerGroup.headers.map((header: any) => {\n const canSort = sortable && header.column.getCanSort();\n const sortDirection = header.column.getIsSorted();\n const toggleSorting = canSort ? header.column.getToggleSortingHandler() : undefined;\n\n return (\n <th\n key={header.id}\n className={[styles.th, canSort && styles.thSortable].filter(Boolean).join(' ')}\n style={getColumnSizeStyle(header.column)}\n scope=\"col\"\n aria-sort={\n sortDirection\n ? sortDirection === 'asc'\n ? 'ascending'\n : 'descending'\n : canSort\n ? 'none'\n : undefined\n }\n >\n {canSort ? (\n <button\n type=\"button\"\n className={styles.sortButton}\n onClick={toggleSorting}\n >\n <span className={styles.headerContent}>\n {header.isPlaceholder\n ? null\n : _flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n </span>\n <span className={styles.sortIndicator} aria-hidden=\"true\">\n {sortDirection === 'asc' ? (\n <SortAscIcon />\n ) : sortDirection === 'desc' ? (\n <SortDescIcon />\n ) : (\n <SortIcon />\n )}\n </span>\n </button>\n ) : (\n <div className={styles.headerContent}>\n {header.isPlaceholder\n ? null\n : _flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n </div>\n )}\n </th>\n );\n })}\n </tr>\n ))}\n </thead>\n <tbody className={styles.tbody}>\n {table.getRowModel().rows.map((row: any) => {\n const isClickable = !!onRowClick;\n const isSelected = selectable ? row.getIsSelected() : false;\n const handleRowClick = (event: React.MouseEvent<HTMLTableRowElement>) => {\n if (!onRowClick) return;\n if (isInteractiveTarget(event.target, event.currentTarget)) return;\n onRowClick(row.original);\n };\n\n const handleRowKeyDown = (event: React.KeyboardEvent<HTMLTableRowElement>) => {\n if (!onRowClick) return;\n if (isInteractiveTarget(event.target, event.currentTarget)) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onRowClick(row.original);\n }\n };\n\n return (\n <tr\n key={row.id}\n className={[\n styles.row,\n isClickable && styles.clickable,\n isSelected && styles.selected,\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={isClickable ? handleRowClick : undefined}\n onKeyDown={isClickable ? handleRowKeyDown : undefined}\n tabIndex={isClickable ? 0 : undefined}\n data-selected={isSelected || undefined}\n >\n {row.getVisibleCells().map((cell: any) => (\n <td key={cell.id} className={styles.td} style={getColumnSizeStyle(cell.column)}>\n {_flexRender(cell.column.columnDef.cell, cell.getContext())}\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n\n// Sort icons - minimal and functional\nfunction SortIcon() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6 2L8.5 5H3.5L6 2Z\"\n fill=\"currentColor\"\n opacity=\"0.3\"\n />\n <path\n d=\"M6 10L3.5 7H8.5L6 10Z\"\n fill=\"currentColor\"\n opacity=\"0.3\"\n />\n </svg>\n );\n}\n\nfunction SortAscIcon() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 2L8.5 5H3.5L6 2Z\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction SortDescIcon() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 10L3.5 7H8.5L6 10Z\" fill=\"currentColor\" />\n </svg>\n );\n}\n\n// Helper to create simple columns without TanStack's createColumnHelper\nexport function createColumns<T>(\n columns: Array<{\n key: string;\n header: string;\n width?: number;\n cell?: (row: T) => React.ReactNode;\n }>\n): TableColumn<T>[] {\n return columns.map((col) => ({\n id: col.key,\n accessorKey: col.key,\n header: col.header,\n size: col.width,\n minSize: col.width,\n maxSize: col.width,\n cell: col.cell\n ? ({ row }) => col.cell!(row.original)\n : ({ getValue }) => getValue() ?? '--',\n }));\n}\n\nexport const Table = Object.assign(TableRoot, {\n Root: TableRoot,\n Columns: createColumns,\n});\n"],"names":["React","styles","size","jsx","jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"table.cjs","sources":["../src/components/Table/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\n// Import globals to ensure CSS variables are defined\nimport '../../styles/globals.scss';\nimport styles from './Table.module.scss';\n\n// ============================================\n// Types\n// ============================================\n\nexport interface TableProps extends React.HTMLAttributes<HTMLTableElement> {\n /** Size variant */\n size?: 'sm' | 'md';\n /** Show alternating row backgrounds */\n striped?: boolean;\n /** Wrap table in a bordered container */\n bordered?: boolean;\n children?: React.ReactNode;\n}\n\nexport interface TableRowProps extends React.HTMLAttributes<HTMLTableRowElement> {\n /** Mark row as selected */\n selected?: boolean;\n children?: React.ReactNode;\n}\n\nexport interface TableCellProps extends React.TdHTMLAttributes<HTMLTableCellElement> {\n children?: React.ReactNode;\n}\n\nexport interface TableHeaderCellProps extends React.ThHTMLAttributes<HTMLTableCellElement> {\n /** Scope for the header cell */\n scope?: string;\n children?: React.ReactNode;\n}\n\nexport interface TableCaptionProps extends React.HTMLAttributes<HTMLTableCaptionElement> {\n /** Visually hide the caption (screen readers only) */\n hidden?: boolean;\n children?: React.ReactNode;\n}\n\n// ============================================\n// Sub-components\n// ============================================\n\nfunction TableHead({ className, children, ...props }: React.HTMLAttributes<HTMLTableSectionElement>) {\n return (\n <thead className={[styles.thead, className].filter(Boolean).join(' ')} {...props}>\n {children}\n </thead>\n );\n}\n\nfunction TableBody({ className, children, ...props }: React.HTMLAttributes<HTMLTableSectionElement>) {\n return (\n <tbody className={[styles.tbody, className].filter(Boolean).join(' ')} {...props}>\n {children}\n </tbody>\n );\n}\n\nfunction TableFooter({ className, children, ...props }: React.HTMLAttributes<HTMLTableSectionElement>) {\n return (\n <tfoot className={[styles.tfoot, className].filter(Boolean).join(' ')} {...props}>\n {children}\n </tfoot>\n );\n}\n\nfunction TableRow({ className, selected, children, ...props }: TableRowProps) {\n return (\n <tr\n className={[styles.row, selected && styles.selected, className].filter(Boolean).join(' ')}\n data-selected={selected || undefined}\n {...props}\n >\n {children}\n </tr>\n );\n}\n\nfunction TableCell({ className, children, ...props }: TableCellProps) {\n return (\n <td className={[styles.td, className].filter(Boolean).join(' ')} {...props}>\n {children}\n </td>\n );\n}\n\nfunction TableHeaderCell({ className, scope = 'col', children, ...props }: TableHeaderCellProps) {\n return (\n <th className={[styles.th, className].filter(Boolean).join(' ')} scope={scope} {...props}>\n <div className={styles.headerContent}>{children}</div>\n </th>\n );\n}\n\nfunction TableCaption({ className, hidden: visuallyHidden, children, ...props }: TableCaptionProps) {\n return (\n <caption\n className={[visuallyHidden ? styles.captionHidden : styles.caption, className].filter(Boolean).join(' ')}\n {...props}\n >\n {children}\n </caption>\n );\n}\n\n// ============================================\n// Root component\n// ============================================\n\nfunction TableRoot({\n size = 'md',\n striped = false,\n bordered = false,\n className,\n children,\n ...htmlProps\n}: TableProps) {\n const tableClasses = [\n styles.table,\n styles[size],\n striped && styles.striped,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={[styles.wrapper, bordered && styles.bordered].filter(Boolean).join(' ')}>\n <table className={tableClasses} {...htmlProps}>\n {children}\n </table>\n </div>\n );\n}\n\n// ============================================\n// Compound export\n// ============================================\n\nexport const Table = Object.assign(TableRoot, {\n Root: TableRoot,\n Head: TableHead,\n Body: TableBody,\n Footer: TableFooter,\n Row: TableRow,\n Cell: TableCell,\n HeaderCell: TableHeaderCell,\n Caption: TableCaption,\n});\n"],"names":["styles","jsx"],"mappings":";;;;;AA+CA,SAAS,UAAU,EAAE,WAAW,UAAU,GAAG,SAAwD;AACnG,wCACG,SAAA,EAAM,WAAW,CAACA,aAAAA,QAAO,OAAO,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,OACxE,UACH;AAEJ;AAEA,SAAS,UAAU,EAAE,WAAW,UAAU,GAAG,SAAwD;AACnG,wCACG,SAAA,EAAM,WAAW,CAACA,aAAAA,QAAO,OAAO,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,OACxE,UACH;AAEJ;AAEA,SAAS,YAAY,EAAE,WAAW,UAAU,GAAG,SAAwD;AACrG,wCACG,SAAA,EAAM,WAAW,CAACA,aAAAA,QAAO,OAAO,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,OACxE,UACH;AAEJ;AAEA,SAAS,SAAS,EAAE,WAAW,UAAU,UAAU,GAAG,SAAwB;AAC5E,SACEC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,CAACD,aAAAA,QAAO,KAAK,YAAYA,aAAAA,QAAO,UAAU,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACxF,iBAAe,YAAY;AAAA,MAC1B,GAAG;AAAA,MAEH;AAAA,IAAA;AAAA,EAAA;AAGP;AAEA,SAAS,UAAU,EAAE,WAAW,UAAU,GAAG,SAAyB;AACpE,wCACG,MAAA,EAAG,WAAW,CAACA,aAAAA,QAAO,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,OAClE,UACH;AAEJ;AAEA,SAAS,gBAAgB,EAAE,WAAW,QAAQ,OAAO,UAAU,GAAG,SAA+B;AAC/F,SACEC,+BAAC,QAAG,WAAW,CAACD,aAAAA,QAAO,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAG,OAAe,GAAG,OACjF,UAAAC,2BAAAA,IAAC,SAAI,WAAWD,qBAAO,eAAgB,SAAA,CAAS,EAAA,CAClD;AAEJ;AAEA,SAAS,aAAa,EAAE,WAAW,QAAQ,gBAAgB,UAAU,GAAG,SAA4B;AAClG,SACEC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,CAAC,iBAAiBD,qBAAO,gBAAgBA,aAAAA,QAAO,SAAS,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACtG,GAAG;AAAA,MAEH;AAAA,IAAA;AAAA,EAAA;AAGP;AAMA,SAAS,UAAU;AAAA,EACjB,OAAO;AAAA,EACP,UAAU;AAAA,EACV,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAe;AACb,QAAM,eAAe;AAAA,IACnBA,aAAAA,QAAO;AAAA,IACPA,aAAAA,QAAO,IAAI;AAAA,IACX,WAAWA,aAAAA,QAAO;AAAA,IAClB;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SACEC,+BAAC,SAAI,WAAW,CAACD,aAAAA,QAAO,SAAS,YAAYA,aAAAA,QAAO,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GACpF,UAAAC,2BAAAA,IAAC,SAAA,EAAM,WAAW,cAAe,GAAG,WACjC,SAAA,CACH,EAAA,CACF;AAEJ;AAMO,MAAM,QAAQ,OAAO,OAAO,WAAW;AAAA,EAC5C,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,SAAS;AACX,CAAC;;"}