@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.
- package/dist/assets/ui.css +443 -247
- package/dist/blocks/components/index.d.ts +0 -2
- package/dist/blocks/components/index.d.ts.map +1 -1
- package/dist/codeblock.cjs +187 -184
- package/dist/codeblock.cjs.map +1 -1
- package/dist/codeblock.js +183 -180
- package/dist/codeblock.js.map +1 -1
- package/dist/components/Box/Box.module.scss.cjs +73 -0
- package/dist/components/Box/Box.module.scss.cjs.map +1 -1
- package/dist/components/Box/Box.module.scss.js +73 -0
- package/dist/components/Box/Box.module.scss.js.map +1 -1
- package/dist/components/ButtonGroup/ButtonGroup.module.scss.cjs +6 -0
- package/dist/components/ButtonGroup/ButtonGroup.module.scss.cjs.map +1 -1
- package/dist/components/ButtonGroup/ButtonGroup.module.scss.js +6 -0
- package/dist/components/ButtonGroup/ButtonGroup.module.scss.js.map +1 -1
- package/dist/components/CodeBlock/CodeBlock.module.scss.cjs +20 -23
- package/dist/components/CodeBlock/CodeBlock.module.scss.cjs.map +1 -1
- package/dist/components/CodeBlock/CodeBlock.module.scss.js +20 -23
- package/dist/components/CodeBlock/CodeBlock.module.scss.js.map +1 -1
- package/dist/components/CodeBlock/index.d.ts +11 -7
- package/dist/components/CodeBlock/index.d.ts.map +1 -1
- package/dist/components/Combobox/Combobox.module.scss.cjs +15 -15
- package/dist/components/Combobox/Combobox.module.scss.js +15 -15
- package/dist/components/DataTable/DataTable.module.scss.cjs +84 -0
- package/dist/components/DataTable/DataTable.module.scss.cjs.map +1 -0
- package/dist/components/DataTable/DataTable.module.scss.js +84 -0
- package/dist/components/DataTable/DataTable.module.scss.js.map +1 -0
- package/dist/components/DataTable/index.cjs +383 -0
- package/dist/components/DataTable/index.cjs.map +1 -0
- package/dist/components/DataTable/index.d.ts +78 -0
- package/dist/components/DataTable/index.d.ts.map +1 -0
- package/dist/components/DataTable/index.js +366 -0
- package/dist/components/DataTable/index.js.map +1 -0
- package/dist/components/Drawer/Drawer.module.scss.cjs +9 -0
- package/dist/components/Drawer/Drawer.module.scss.cjs.map +1 -1
- package/dist/components/Drawer/Drawer.module.scss.js +9 -0
- package/dist/components/Drawer/Drawer.module.scss.js.map +1 -1
- package/dist/components/Image/Image.module.scss.cjs +12 -0
- package/dist/components/Image/Image.module.scss.cjs.map +1 -1
- package/dist/components/Image/Image.module.scss.js +12 -0
- package/dist/components/Image/Image.module.scss.js.map +1 -1
- package/dist/components/Link/Link.module.scss.cjs +3 -0
- package/dist/components/Link/Link.module.scss.cjs.map +1 -1
- package/dist/components/Link/Link.module.scss.js +3 -0
- package/dist/components/Link/Link.module.scss.js.map +1 -1
- package/dist/components/List/List.module.scss.cjs +5 -0
- package/dist/components/List/List.module.scss.cjs.map +1 -1
- package/dist/components/List/List.module.scss.js +5 -0
- package/dist/components/List/List.module.scss.js.map +1 -1
- package/dist/components/Loading/Loading.module.scss.cjs +5 -0
- package/dist/components/Loading/Loading.module.scss.cjs.map +1 -1
- package/dist/components/Loading/Loading.module.scss.js +5 -0
- package/dist/components/Loading/Loading.module.scss.js.map +1 -1
- package/dist/components/Markdown/Markdown.module.scss.cjs +1 -1
- package/dist/components/Markdown/Markdown.module.scss.js +1 -1
- package/dist/components/Message/Message.module.scss.cjs +22 -16
- package/dist/components/Message/Message.module.scss.cjs.map +1 -1
- package/dist/components/Message/Message.module.scss.js +22 -16
- package/dist/components/Message/Message.module.scss.js.map +1 -1
- package/dist/components/Message/index.cjs +5 -3
- package/dist/components/Message/index.cjs.map +1 -1
- package/dist/components/Message/index.d.ts +5 -1
- package/dist/components/Message/index.d.ts.map +1 -1
- package/dist/components/Message/index.js +5 -3
- package/dist/components/Message/index.js.map +1 -1
- package/dist/components/Skeleton/Skeleton.module.scss.cjs +14 -0
- package/dist/components/Skeleton/Skeleton.module.scss.cjs.map +1 -1
- package/dist/components/Skeleton/Skeleton.module.scss.js +14 -0
- package/dist/components/Skeleton/Skeleton.module.scss.js.map +1 -1
- package/dist/components/Stack/Stack.module.scss.cjs +14 -0
- package/dist/components/Stack/Stack.module.scss.cjs.map +1 -1
- package/dist/components/Stack/Stack.module.scss.js +14 -0
- package/dist/components/Stack/Stack.module.scss.js.map +1 -1
- package/dist/components/Table/Table.module.scss.cjs +21 -36
- package/dist/components/Table/Table.module.scss.cjs.map +1 -1
- package/dist/components/Table/Table.module.scss.js +21 -36
- package/dist/components/Table/Table.module.scss.js.map +1 -1
- package/dist/components/Table/index.d.ts +35 -55
- package/dist/components/Table/index.d.ts.map +1 -1
- package/dist/components/Text/Text.module.scss.cjs +14 -0
- package/dist/components/Text/Text.module.scss.cjs.map +1 -1
- package/dist/components/Text/Text.module.scss.js +14 -0
- package/dist/components/Text/Text.module.scss.js.map +1 -1
- package/dist/components/Textarea/Textarea.module.scss.cjs +4 -0
- package/dist/components/Textarea/Textarea.module.scss.cjs.map +1 -1
- package/dist/components/Textarea/Textarea.module.scss.js +4 -0
- package/dist/components/Textarea/Textarea.module.scss.js.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs +5 -0
- package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroup.module.scss.js +5 -0
- package/dist/components/ToggleGroup/ToggleGroup.module.scss.js.map +1 -1
- package/dist/index.cjs +119 -117
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/table.cjs +44 -262
- package/dist/table.cjs.map +1 -1
- package/dist/table.js +47 -248
- package/dist/table.js.map +1 -1
- package/fragments.json +1 -1
- package/package.json +110 -118
- package/src/blocks/components/index.ts +0 -3
- package/src/components/CodeBlock/CodeBlock.module.scss +16 -34
- package/src/components/CodeBlock/index.tsx +351 -345
- package/src/components/Combobox/Combobox.module.scss +13 -9
- package/src/components/ConversationList/ConversationList.fragment.tsx +96 -129
- package/src/components/DataTable/DataTable.fragment.tsx +754 -0
- package/src/components/DataTable/DataTable.module.scss +300 -0
- package/src/components/DataTable/DataTable.test.tsx +224 -0
- package/src/components/DataTable/index.tsx +533 -0
- package/src/components/Message/Message.fragment.tsx +34 -0
- package/src/components/Message/Message.module.scss +11 -0
- package/src/components/Message/index.tsx +12 -3
- package/src/components/Table/Table.fragment.tsx +190 -175
- package/src/components/Table/Table.module.scss +15 -88
- package/src/components/Table/Table.test.tsx +184 -94
- package/src/components/Table/index.tsx +105 -374
- package/src/index.ts +15 -4
- package/src/tokens/_computed.scss +7 -6
- package/src/tokens/_density.scss +87 -47
- package/src/tokens/_variables.scss +46 -31
- package/dist/blocks/components/DataTable.d.ts +0 -19
- package/dist/blocks/components/DataTable.d.ts.map +0 -1
- package/src/blocks/components/DataTable.tsx +0 -124
package/dist/table.js
CHANGED
|
@@ -1,270 +1,69 @@
|
|
|
1
|
-
import { jsx
|
|
2
|
-
import * as React from "react";
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
2
|
/* empty css */
|
|
4
3
|
import styles from "./components/Table/Table.module.scss.js";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
let _getSortedRowModel = null;
|
|
8
|
-
let _flexRender = null;
|
|
9
|
-
let _tableLoaded = false;
|
|
10
|
-
let _tableFailed = false;
|
|
11
|
-
function loadTableDeps() {
|
|
12
|
-
if (_tableLoaded) return;
|
|
13
|
-
_tableLoaded = true;
|
|
14
|
-
try {
|
|
15
|
-
const rt = require("@tanstack/react-table");
|
|
16
|
-
_useReactTable = rt.useReactTable;
|
|
17
|
-
_getCoreRowModel = rt.getCoreRowModel;
|
|
18
|
-
_getSortedRowModel = rt.getSortedRowModel;
|
|
19
|
-
_flexRender = rt.flexRender;
|
|
20
|
-
} catch {
|
|
21
|
-
_tableFailed = true;
|
|
22
|
-
}
|
|
4
|
+
function TableHead({ className, children, ...props }) {
|
|
5
|
+
return /* @__PURE__ */ jsx("thead", { className: [styles.thead, className].filter(Boolean).join(" "), ...props, children });
|
|
23
6
|
}
|
|
24
|
-
function
|
|
25
|
-
|
|
26
|
-
data,
|
|
27
|
-
getRowId,
|
|
28
|
-
sortable = false,
|
|
29
|
-
sorting: controlledSorting,
|
|
30
|
-
onSortingChange,
|
|
31
|
-
selectable = false,
|
|
32
|
-
rowSelection: controlledRowSelection,
|
|
33
|
-
onRowSelectionChange,
|
|
34
|
-
onRowClick,
|
|
35
|
-
emptyMessage = "No data available",
|
|
36
|
-
size = "md",
|
|
37
|
-
className,
|
|
38
|
-
caption,
|
|
39
|
-
captionHidden = false,
|
|
40
|
-
striped = false,
|
|
41
|
-
bordered = false,
|
|
42
|
-
"aria-label": ariaLabel,
|
|
43
|
-
"aria-describedby": ariaDescribedBy,
|
|
44
|
-
...htmlProps
|
|
45
|
-
}) {
|
|
46
|
-
loadTableDeps();
|
|
47
|
-
const [internalSorting, setInternalSorting] = React.useState([]);
|
|
48
|
-
const sorting = controlledSorting ?? internalSorting;
|
|
49
|
-
const handleSortingChange = onSortingChange ?? setInternalSorting;
|
|
50
|
-
const [internalRowSelection, setInternalRowSelection] = React.useState({});
|
|
51
|
-
const rowSelection = controlledRowSelection ?? internalRowSelection;
|
|
52
|
-
const handleRowSelectionChange = onRowSelectionChange ?? setInternalRowSelection;
|
|
53
|
-
if (_tableFailed || !_useReactTable) {
|
|
54
|
-
if (_tableFailed && process.env.NODE_ENV === "development") {
|
|
55
|
-
console.warn(
|
|
56
|
-
"[@fragments-sdk/ui] Table: @tanstack/react-table is not installed. Install it with: npm install @tanstack/react-table"
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
return null;
|
|
60
|
-
}
|
|
61
|
-
const table = _useReactTable({
|
|
62
|
-
data,
|
|
63
|
-
columns,
|
|
64
|
-
getRowId,
|
|
65
|
-
getCoreRowModel: _getCoreRowModel(),
|
|
66
|
-
getSortedRowModel: sortable ? _getSortedRowModel() : void 0,
|
|
67
|
-
state: {
|
|
68
|
-
sorting: sortable ? sorting : void 0,
|
|
69
|
-
rowSelection: selectable ? rowSelection : void 0
|
|
70
|
-
},
|
|
71
|
-
onSortingChange: sortable ? handleSortingChange : void 0,
|
|
72
|
-
onRowSelectionChange: selectable ? handleRowSelectionChange : void 0,
|
|
73
|
-
enableRowSelection: selectable,
|
|
74
|
-
enableSorting: sortable
|
|
75
|
-
});
|
|
76
|
-
const isEmpty = data.length === 0;
|
|
77
|
-
const hasExplicitColumnSizing = React.useMemo(
|
|
78
|
-
() => columns.some(
|
|
79
|
-
(column) => column.size !== void 0 || column.minSize !== void 0 || column.maxSize !== void 0
|
|
80
|
-
),
|
|
81
|
-
[columns]
|
|
82
|
-
);
|
|
83
|
-
const rootClasses = [
|
|
84
|
-
styles.table,
|
|
85
|
-
hasExplicitColumnSizing && styles.fixedLayout,
|
|
86
|
-
styles[size],
|
|
87
|
-
striped && styles.striped,
|
|
88
|
-
className
|
|
89
|
-
].filter(Boolean).join(" ");
|
|
90
|
-
const getColumnSizeStyle = (column) => {
|
|
91
|
-
const { size: size2, minSize, maxSize } = column.columnDef;
|
|
92
|
-
const hasExplicitSize = size2 !== void 0 || minSize !== void 0 || maxSize !== void 0;
|
|
93
|
-
if (!hasExplicitSize) {
|
|
94
|
-
return void 0;
|
|
95
|
-
}
|
|
96
|
-
const resolvedSize = column.getSize();
|
|
97
|
-
return {
|
|
98
|
-
width: resolvedSize,
|
|
99
|
-
minWidth: minSize ?? resolvedSize,
|
|
100
|
-
maxWidth: maxSize ?? resolvedSize
|
|
101
|
-
};
|
|
102
|
-
};
|
|
103
|
-
if (isEmpty) {
|
|
104
|
-
return /* @__PURE__ */ jsx("div", { className: styles.emptyState, children: /* @__PURE__ */ jsx("span", { className: styles.emptyMessage, children: emptyMessage }) });
|
|
105
|
-
}
|
|
106
|
-
const isInteractiveTarget = (target, currentTarget) => {
|
|
107
|
-
if (!(target instanceof Element)) return false;
|
|
108
|
-
const interactiveElement = target.closest(
|
|
109
|
-
'button, a, input, select, textarea, [role="button"], [role="link"], [role="checkbox"], [role="switch"]'
|
|
110
|
-
);
|
|
111
|
-
return Boolean(interactiveElement && currentTarget.contains(interactiveElement));
|
|
112
|
-
};
|
|
113
|
-
return /* @__PURE__ */ jsx("div", { className: [styles.wrapper, bordered && styles.bordered].filter(Boolean).join(" "), children: /* @__PURE__ */ jsxs(
|
|
114
|
-
"table",
|
|
115
|
-
{
|
|
116
|
-
...htmlProps,
|
|
117
|
-
className: rootClasses,
|
|
118
|
-
"aria-label": ariaLabel,
|
|
119
|
-
"aria-describedby": ariaDescribedBy,
|
|
120
|
-
children: [
|
|
121
|
-
caption && /* @__PURE__ */ jsx("caption", { className: captionHidden ? styles.captionHidden : styles.caption, children: caption }),
|
|
122
|
-
/* @__PURE__ */ jsx("thead", { className: styles.thead, children: table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ jsx("tr", { className: styles.headerRow, children: headerGroup.headers.map((header) => {
|
|
123
|
-
const canSort = sortable && header.column.getCanSort();
|
|
124
|
-
const sortDirection = header.column.getIsSorted();
|
|
125
|
-
const toggleSorting = canSort ? header.column.getToggleSortingHandler() : void 0;
|
|
126
|
-
return /* @__PURE__ */ jsx(
|
|
127
|
-
"th",
|
|
128
|
-
{
|
|
129
|
-
className: [styles.th, canSort && styles.thSortable].filter(Boolean).join(" "),
|
|
130
|
-
style: getColumnSizeStyle(header.column),
|
|
131
|
-
scope: "col",
|
|
132
|
-
"aria-sort": sortDirection ? sortDirection === "asc" ? "ascending" : "descending" : canSort ? "none" : void 0,
|
|
133
|
-
children: canSort ? /* @__PURE__ */ jsxs(
|
|
134
|
-
"button",
|
|
135
|
-
{
|
|
136
|
-
type: "button",
|
|
137
|
-
className: styles.sortButton,
|
|
138
|
-
onClick: toggleSorting,
|
|
139
|
-
children: [
|
|
140
|
-
/* @__PURE__ */ jsx("span", { className: styles.headerContent, children: header.isPlaceholder ? null : _flexRender(
|
|
141
|
-
header.column.columnDef.header,
|
|
142
|
-
header.getContext()
|
|
143
|
-
) }),
|
|
144
|
-
/* @__PURE__ */ jsx("span", { className: styles.sortIndicator, "aria-hidden": "true", children: sortDirection === "asc" ? /* @__PURE__ */ jsx(SortAscIcon, {}) : sortDirection === "desc" ? /* @__PURE__ */ jsx(SortDescIcon, {}) : /* @__PURE__ */ jsx(SortIcon, {}) })
|
|
145
|
-
]
|
|
146
|
-
}
|
|
147
|
-
) : /* @__PURE__ */ jsx("div", { className: styles.headerContent, children: header.isPlaceholder ? null : _flexRender(
|
|
148
|
-
header.column.columnDef.header,
|
|
149
|
-
header.getContext()
|
|
150
|
-
) })
|
|
151
|
-
},
|
|
152
|
-
header.id
|
|
153
|
-
);
|
|
154
|
-
}) }, headerGroup.id)) }),
|
|
155
|
-
/* @__PURE__ */ jsx("tbody", { className: styles.tbody, children: table.getRowModel().rows.map((row) => {
|
|
156
|
-
const isClickable = !!onRowClick;
|
|
157
|
-
const isSelected = selectable ? row.getIsSelected() : false;
|
|
158
|
-
const handleRowClick = (event) => {
|
|
159
|
-
if (!onRowClick) return;
|
|
160
|
-
if (isInteractiveTarget(event.target, event.currentTarget)) return;
|
|
161
|
-
onRowClick(row.original);
|
|
162
|
-
};
|
|
163
|
-
const handleRowKeyDown = (event) => {
|
|
164
|
-
if (!onRowClick) return;
|
|
165
|
-
if (isInteractiveTarget(event.target, event.currentTarget)) return;
|
|
166
|
-
if (event.key === "Enter" || event.key === " ") {
|
|
167
|
-
event.preventDefault();
|
|
168
|
-
onRowClick(row.original);
|
|
169
|
-
}
|
|
170
|
-
};
|
|
171
|
-
return /* @__PURE__ */ jsx(
|
|
172
|
-
"tr",
|
|
173
|
-
{
|
|
174
|
-
className: [
|
|
175
|
-
styles.row,
|
|
176
|
-
isClickable && styles.clickable,
|
|
177
|
-
isSelected && styles.selected
|
|
178
|
-
].filter(Boolean).join(" "),
|
|
179
|
-
onClick: isClickable ? handleRowClick : void 0,
|
|
180
|
-
onKeyDown: isClickable ? handleRowKeyDown : void 0,
|
|
181
|
-
tabIndex: isClickable ? 0 : void 0,
|
|
182
|
-
"data-selected": isSelected || void 0,
|
|
183
|
-
children: row.getVisibleCells().map((cell) => /* @__PURE__ */ jsx("td", { className: styles.td, style: getColumnSizeStyle(cell.column), children: _flexRender(cell.column.columnDef.cell, cell.getContext()) }, cell.id))
|
|
184
|
-
},
|
|
185
|
-
row.id
|
|
186
|
-
);
|
|
187
|
-
}) })
|
|
188
|
-
]
|
|
189
|
-
}
|
|
190
|
-
) });
|
|
7
|
+
function TableBody({ className, children, ...props }) {
|
|
8
|
+
return /* @__PURE__ */ jsx("tbody", { className: [styles.tbody, className].filter(Boolean).join(" "), ...props, children });
|
|
191
9
|
}
|
|
192
|
-
function
|
|
193
|
-
return /* @__PURE__ */
|
|
194
|
-
"svg",
|
|
195
|
-
{
|
|
196
|
-
width: "12",
|
|
197
|
-
height: "12",
|
|
198
|
-
viewBox: "0 0 12 12",
|
|
199
|
-
fill: "none",
|
|
200
|
-
xmlns: "http://www.w3.org/2000/svg",
|
|
201
|
-
"aria-hidden": "true",
|
|
202
|
-
children: [
|
|
203
|
-
/* @__PURE__ */ jsx(
|
|
204
|
-
"path",
|
|
205
|
-
{
|
|
206
|
-
d: "M6 2L8.5 5H3.5L6 2Z",
|
|
207
|
-
fill: "currentColor",
|
|
208
|
-
opacity: "0.3"
|
|
209
|
-
}
|
|
210
|
-
),
|
|
211
|
-
/* @__PURE__ */ jsx(
|
|
212
|
-
"path",
|
|
213
|
-
{
|
|
214
|
-
d: "M6 10L3.5 7H8.5L6 10Z",
|
|
215
|
-
fill: "currentColor",
|
|
216
|
-
opacity: "0.3"
|
|
217
|
-
}
|
|
218
|
-
)
|
|
219
|
-
]
|
|
220
|
-
}
|
|
221
|
-
);
|
|
10
|
+
function TableFooter({ className, children, ...props }) {
|
|
11
|
+
return /* @__PURE__ */ jsx("tfoot", { className: [styles.tfoot, className].filter(Boolean).join(" "), ...props, children });
|
|
222
12
|
}
|
|
223
|
-
function
|
|
13
|
+
function TableRow({ className, selected, children, ...props }) {
|
|
224
14
|
return /* @__PURE__ */ jsx(
|
|
225
|
-
"
|
|
15
|
+
"tr",
|
|
226
16
|
{
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
xmlns: "http://www.w3.org/2000/svg",
|
|
232
|
-
"aria-hidden": "true",
|
|
233
|
-
children: /* @__PURE__ */ jsx("path", { d: "M6 2L8.5 5H3.5L6 2Z", fill: "currentColor" })
|
|
17
|
+
className: [styles.row, selected && styles.selected, className].filter(Boolean).join(" "),
|
|
18
|
+
"data-selected": selected || void 0,
|
|
19
|
+
...props,
|
|
20
|
+
children
|
|
234
21
|
}
|
|
235
22
|
);
|
|
236
23
|
}
|
|
237
|
-
function
|
|
24
|
+
function TableCell({ className, children, ...props }) {
|
|
25
|
+
return /* @__PURE__ */ jsx("td", { className: [styles.td, className].filter(Boolean).join(" "), ...props, children });
|
|
26
|
+
}
|
|
27
|
+
function TableHeaderCell({ className, scope = "col", children, ...props }) {
|
|
28
|
+
return /* @__PURE__ */ jsx("th", { className: [styles.th, className].filter(Boolean).join(" "), scope, ...props, children: /* @__PURE__ */ jsx("div", { className: styles.headerContent, children }) });
|
|
29
|
+
}
|
|
30
|
+
function TableCaption({ className, hidden: visuallyHidden, children, ...props }) {
|
|
238
31
|
return /* @__PURE__ */ jsx(
|
|
239
|
-
"
|
|
32
|
+
"caption",
|
|
240
33
|
{
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
fill: "none",
|
|
245
|
-
xmlns: "http://www.w3.org/2000/svg",
|
|
246
|
-
"aria-hidden": "true",
|
|
247
|
-
children: /* @__PURE__ */ jsx("path", { d: "M6 10L3.5 7H8.5L6 10Z", fill: "currentColor" })
|
|
34
|
+
className: [visuallyHidden ? styles.captionHidden : styles.caption, className].filter(Boolean).join(" "),
|
|
35
|
+
...props,
|
|
36
|
+
children
|
|
248
37
|
}
|
|
249
38
|
);
|
|
250
39
|
}
|
|
251
|
-
function
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
40
|
+
function TableRoot({
|
|
41
|
+
size = "md",
|
|
42
|
+
striped = false,
|
|
43
|
+
bordered = false,
|
|
44
|
+
className,
|
|
45
|
+
children,
|
|
46
|
+
...htmlProps
|
|
47
|
+
}) {
|
|
48
|
+
const tableClasses = [
|
|
49
|
+
styles.table,
|
|
50
|
+
styles[size],
|
|
51
|
+
striped && styles.striped,
|
|
52
|
+
className
|
|
53
|
+
].filter(Boolean).join(" ");
|
|
54
|
+
return /* @__PURE__ */ jsx("div", { className: [styles.wrapper, bordered && styles.bordered].filter(Boolean).join(" "), children: /* @__PURE__ */ jsx("table", { className: tableClasses, ...htmlProps, children }) });
|
|
261
55
|
}
|
|
262
56
|
const Table = Object.assign(TableRoot, {
|
|
263
57
|
Root: TableRoot,
|
|
264
|
-
|
|
58
|
+
Head: TableHead,
|
|
59
|
+
Body: TableBody,
|
|
60
|
+
Footer: TableFooter,
|
|
61
|
+
Row: TableRow,
|
|
62
|
+
Cell: TableCell,
|
|
63
|
+
HeaderCell: TableHeaderCell,
|
|
64
|
+
Caption: TableCaption
|
|
265
65
|
});
|
|
266
66
|
export {
|
|
267
|
-
Table
|
|
268
|
-
createColumns
|
|
67
|
+
Table
|
|
269
68
|
};
|
|
270
69
|
//# sourceMappingURL=table.js.map
|
package/dist/table.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.js","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":["size"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"table.js","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":[],"mappings":";;;AA+CA,SAAS,UAAU,EAAE,WAAW,UAAU,GAAG,SAAwD;AACnG,6BACG,SAAA,EAAM,WAAW,CAAC,OAAO,OAAO,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,OACxE,UACH;AAEJ;AAEA,SAAS,UAAU,EAAE,WAAW,UAAU,GAAG,SAAwD;AACnG,6BACG,SAAA,EAAM,WAAW,CAAC,OAAO,OAAO,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,OACxE,UACH;AAEJ;AAEA,SAAS,YAAY,EAAE,WAAW,UAAU,GAAG,SAAwD;AACrG,6BACG,SAAA,EAAM,WAAW,CAAC,OAAO,OAAO,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,OACxE,UACH;AAEJ;AAEA,SAAS,SAAS,EAAE,WAAW,UAAU,UAAU,GAAG,SAAwB;AAC5E,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,CAAC,OAAO,KAAK,YAAY,OAAO,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,6BACG,MAAA,EAAG,WAAW,CAAC,OAAO,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,SACE,oBAAC,QAAG,WAAW,CAAC,OAAO,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAG,OAAe,GAAG,OACjF,UAAA,oBAAC,SAAI,WAAW,OAAO,eAAgB,SAAA,CAAS,EAAA,CAClD;AAEJ;AAEA,SAAS,aAAa,EAAE,WAAW,QAAQ,gBAAgB,UAAU,GAAG,SAA4B;AAClG,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,CAAC,iBAAiB,OAAO,gBAAgB,OAAO,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,IACnB,OAAO;AAAA,IACP,OAAO,IAAI;AAAA,IACX,WAAW,OAAO;AAAA,IAClB;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SACE,oBAAC,SAAI,WAAW,CAAC,OAAO,SAAS,YAAY,OAAO,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GACpF,UAAA,oBAAC,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;"}
|