@crispy-seed/data-table 0.1.1 → 0.1.3

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 (49) hide show
  1. package/dist/index.cjs +4570 -2
  2. package/dist/index.js +4554 -1
  3. package/package.json +1 -1
  4. package/dist/DataTable-12s-D02v6Qj5.js +0 -1523
  5. package/dist/DataTable-12s-Gpv6I4J8.cjs +0 -1574
  6. package/dist/DataTable-12s-Zml1x9Kr-12s-B-mwMBhn.cjs +0 -161
  7. package/dist/DataTable-12s-Zml1x9Kr-12s-BR-yHfob.js +0 -153
  8. package/dist/Menu-12s-A4lEc__n.cjs +0 -103
  9. package/dist/Menu-12s-v9vnaq8F.js +0 -77
  10. package/dist/Select-12s-CE3SMzFp.js +0 -218
  11. package/dist/Select-12s-CNQC9z8t.cjs +0 -249
  12. package/dist/body-cells-12s-2sTwdliH.cjs +0 -461
  13. package/dist/body-cells-12s-Ba2uF4T-.js +0 -452
  14. package/dist/column-calc-12s-C1-I2KdV.js +0 -129
  15. package/dist/column-calc-12s-CJ26VuDJ.cjs +0 -149
  16. package/dist/column-layout-12s-BhQmNTJG.js +0 -99
  17. package/dist/column-layout-12s-k2fZYeKl.cjs +0 -120
  18. package/dist/column-menu-12s-6Yvu4SZ0.js +0 -406
  19. package/dist/column-menu-12s-BnknuXGh.cjs +0 -426
  20. package/dist/editors-12s-C0RxmTcI.cjs +0 -554
  21. package/dist/editors-12s-COixUnI2.js +0 -524
  22. package/dist/resize-12s-CajyNXFB.js +0 -58
  23. package/dist/resize-12s-ChLpxb4i.cjs +0 -58
  24. package/dist/states-12s-BB0PT_bq.cjs +0 -125
  25. package/dist/states-12s-m5mBR90e.js +0 -122
  26. package/dist/toolbar-12s-B1xiS-Zu.js +0 -68
  27. package/dist/toolbar-12s-DzLbghpK.cjs +0 -70
  28. package/dist/useDataTable-12s-BHiDUubw-12s-CBeCwTe7.js +0 -61
  29. package/dist/useDataTable-12s-BHiDUubw-12s-Dgvt7XDk.cjs +0 -61
  30. package/dist/useDataTableColumnCalc-12s-DTQQTtEJ-12s-CvD14JYo.cjs +0 -207
  31. package/dist/useDataTableColumnCalc-12s-DTQQTtEJ-12s-DsEse3uq.js +0 -183
  32. package/dist/useDataTableColumns-12s-Cn2ZAzFL-12s-CD6goR59.js +0 -289
  33. package/dist/useDataTableColumns-12s-Cn2ZAzFL-12s-CUk_CpYT.cjs +0 -292
  34. package/dist/useDataTableEdit-12s-9Wb_UCrN-12s-BoOHq3GB.js +0 -98
  35. package/dist/useDataTableEdit-12s-9Wb_UCrN-12s-De6YHBba.cjs +0 -98
  36. package/dist/useDataTableFilter-12s-ZzbmWMin-12s-CWyBeFna.js +0 -74
  37. package/dist/useDataTableFilter-12s-ZzbmWMin-12s-lpjzZY3_.cjs +0 -74
  38. package/dist/useDataTableInfiniteScroll-12s-8ZG31URd-12s-BexjP6iO.js +0 -104
  39. package/dist/useDataTableInfiniteScroll-12s-8ZG31URd-12s-Bt8gojr9.cjs +0 -104
  40. package/dist/useDataTableRow-12s-CPYaDa1p-12s-4qkGoz-j.js +0 -30
  41. package/dist/useDataTableRow-12s-CPYaDa1p-12s-DG64uYjn.cjs +0 -30
  42. package/dist/useDataTableScroll-12s-BKDCr0en-12s-C7f2vHeG.js +0 -61
  43. package/dist/useDataTableScroll-12s-BKDCr0en-12s-CUvUYMtt.cjs +0 -61
  44. package/dist/useDataTableSearch-12s-Ck3iWcpX-12s-B-65V6gH.js +0 -37
  45. package/dist/useDataTableSearch-12s-Ck3iWcpX-12s-DhVfN2Hq.cjs +0 -37
  46. package/dist/useDataTableSelection-12s-BIDtiRQq-12s-IS__VAnU.cjs +0 -71
  47. package/dist/useDataTableSelection-12s-BIDtiRQq-12s-O6M_BhrH.js +0 -71
  48. package/dist/useDataTableSort-12s-DvJYtmeS-12s-C5VGnsq4.cjs +0 -78
  49. package/dist/useDataTableSort-12s-DvJYtmeS-12s-DABSNt6U.js +0 -78
@@ -1,406 +0,0 @@
1
- 'use client';
2
- function __insertCSS(code) {
3
- if (!code || typeof document == 'undefined') return
4
- let head = document.head || document.getElementsByTagName('head')[0]
5
- let style = document.createElement('style')
6
- style.type = 'text/css'
7
- head.appendChild(style)
8
- ;style.styleSheet ? (style.styleSheet.cssText = code) : style.appendChild(document.createTextNode(code))
9
- }
10
-
11
- import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
12
- import * as React from 'react';
13
- import { c as createSlotRecipeContext, P as Primitive, k as DataTableHeaderCell, l as DataTableHeaderCellInner, m as DataTableHeaderCellLabel, n as DataTableHeaderCellIcon, o as IconSlider2HorizontalLine_default, C as CheckboxRoot, e as CheckboxControl, f as CheckboxIndicator, p as CheckboxLabel, g as CheckboxHiddenInput, q as IconDot3HorizontalLine_default, d as IconCheckmarkLine_default, j as IconChevronDownLine_default, r as IconChevronUpLine_default } from './DataTable-12s-D02v6Qj5.js';
14
- import { dataAttr } from '@seed-design/dom-utils';
15
- import { M as MenuRoot, a as MenuTrigger, b as MenuPositioner, c as MenuContent, d as MenuScrollArea, e as MenuItem, f as MenuItemLabel } from './Menu-12s-v9vnaq8F.js';
16
- import { segmentedControl } from '@seed-design/css/recipes/segmented-control';
17
- import { SegmentedControl } from '@seed-design/react-segmented-control';
18
- import { u as useEffectiveColumns, s as stickyProps } from './column-layout-12s-BhQmNTJG.js';
19
- import { C as ColumnResizeHandle } from './resize-12s-CajyNXFB.js';
20
- import { u as useDataTableContext } from './DataTable-12s-Zml1x9Kr-12s-BR-yHfob.js';
21
-
22
- const { withProvider, withContext } = createSlotRecipeContext(segmentedControl);
23
- const SegmentedControlRoot = withProvider(SegmentedControl.Root, "root");
24
- const SegmentedControlIndicator = withContext(Primitive.div, "indicator");
25
- const SegmentedControlItem = withContext(SegmentedControl.Item, "item");
26
- const SegmentedControlItemHiddenInput = SegmentedControl.ItemHiddenInput;
27
-
28
- // Same fix as cells.tsx's `CheckboxCell`/editors.tsx's `CheckboxEditor` -- seed's
29
- // `CheckboxIndicator` needs a real icon for its `checked` prop (it renders exactly
30
- // what's passed there, nothing automatically); `checked={null}` here used to render an
31
- // empty box even once a value was actually checked. 12px, matching the row-selection
32
- // checkbox's own already-correct icon size (`DataTable.tsx`'s `SELECTION_ICON_SIZE`).
33
- const FILTER_CHECKED_ICON = /*#__PURE__*/ jsx(IconCheckmarkLine_default, {
34
- size: 12
35
- });
36
- // Fix (bug report): karrot icons default to a 24px intrinsic `width`/`height`
37
- // SVG ATTRIBUTE (not CSS) -- inside a fixed 16px `headerCellIcon` box (a flex
38
- // item), flexbox only auto-shrinks the MAIN axis (width) to fit, leaving the
39
- // CROSS axis (height) at its full 24px intrinsic size, so the glyph rendered
40
- // visibly oversized/non-square and spilled out of its slot (measured live:
41
- // 16×24, not 16×16). Passing `size` sets both attributes directly, sidestepping
42
- // the mismatch entirely rather than fighting it with more CSS. Matches crisp's
43
- // own measured `.crisp-datatable-chevron` size (14px).
44
- const SORT_ICON_SIZE = 14;
45
- const DEFAULT_SORT_ICON = {
46
- idle: /*#__PURE__*/ jsx(IconChevronDownLine_default, {
47
- size: SORT_ICON_SIZE
48
- }),
49
- asc: /*#__PURE__*/ jsx(IconChevronUpLine_default, {
50
- size: SORT_ICON_SIZE
51
- }),
52
- desc: /*#__PURE__*/ jsx(IconChevronDownLine_default, {
53
- size: SORT_ICON_SIZE
54
- })
55
- };
56
- /**
57
- * Rendered for EVERY sortable column, sorted or not -- unlike a naive "only show the
58
- * active column's arrow", Attio reveals a neutral chevron on ANY sortable header on
59
- * hover (`data-chevron`'s own CSS in `data-table.ts` owns the opacity: 0 at rest, 0.6
60
- * on header hover, 1 + full foreground once sorted). Conditionally rendering only the
61
- * sorted state, the way this component used to, has nothing for that hover state to
62
- * reveal.
63
- */ function SortIndicator({ columnKey, icon }) {
64
- const { sort } = useDataTableContext();
65
- const isSorted = sort?.key === columnKey;
66
- const resolved = isSorted ? sort?.dir === "asc" ? icon?.asc ?? DEFAULT_SORT_ICON.asc : icon?.desc ?? DEFAULT_SORT_ICON.desc : icon?.idle ?? DEFAULT_SORT_ICON.idle;
67
- return /*#__PURE__*/ jsx(DataTableHeaderCellIcon, {
68
- "aria-hidden": true,
69
- "data-chevron": "",
70
- draggable: false,
71
- children: resolved
72
- });
73
- }
74
- /** Attio's own condition word: "Is"/"Is not" alone with zero or one value checked,
75
- * "Is any of"/"Is not any of" once a second value joins the set -- the underlying
76
- * predicate never changes (`useDataTableFilter.ts`'s own comment: membership in a
77
- * set of one IS "is X"), only the word describing it does. */ function filterConditionLabel(mode, hasMultipleValues) {
78
- if (mode === "isnot") return hasMultipleValues ? "Is not any of" : "Is not";
79
- return hasMultipleValues ? "Is any of" : "Is";
80
- }
81
- /**
82
- * A column's "is / is not / is any of" checkbox filter picker (DATATABLE-ATTIO-
83
- * SPEC.md's Feature contract), Attio's own chrome: a two-way condition control above a
84
- * checkbox value list, both built from seed's own documented components -- `Menu` for
85
- * the popover shell (`MenuRoot`/`Trigger`/`Positioner`/`Content`, unchanged), seed's
86
- * `SegmentedControl` (docs/content/react/components/segmented-control.mdx) for the
87
- * is/is-not toggle in place of the two hand-styled buttons (hardcoded hex, no seed
88
- * token) this used to be, and plain `<label>` + `CheckboxRoot` rows for the value
89
- * list -- NOT `MenuItem` there either: `MenuItem`'s own `getItemProps` (`useMenu.ts`)
90
- * closes the menu unconditionally after every click, which is correct for a normal
91
- * command menu but would close this ENTIRE popover after a single condition pick or a
92
- * single checked value -- exactly wrong for a control meant to stay open while the
93
- * condition changes and several boxes get checked. `SegmentedControl` has no such
94
- * auto-close (it's a plain controlled radio group, not a menu), which is exactly why
95
- * it -- not `MenuItem` -- is the documented component that fits here.
96
- */ function FilterMenu({ column }) {
97
- const { filters, toggleFilterValue, setFilterMode } = useDataTableContext();
98
- const values = column.filterValues ?? [];
99
- const current = filters[column.key];
100
- const mode = current?.mode ?? "is";
101
- const checkedValues = current?.values ?? [];
102
- const hasMultipleValues = checkedValues.length > 1;
103
- const columnLabel = typeof column.header === "string" ? column.header : column.key;
104
- // A filter trigger lives INSIDE a (possibly sortable) header cell, whose own
105
- // onClick/onKeyDown toggle sort -- stop the event here so opening the filter
106
- // picker never also reorders the rows out from under it.
107
- const stopPropagation = (event)=>event.stopPropagation();
108
- return /*#__PURE__*/ jsxs(MenuRoot, {
109
- children: [
110
- /*#__PURE__*/ jsx(DataTableHeaderCellIcon, {
111
- asChild: true,
112
- onClick: stopPropagation,
113
- onKeyDown: stopPropagation,
114
- draggable: false,
115
- children: /*#__PURE__*/ jsx(MenuTrigger, {
116
- "aria-label": `Filter ${columnLabel}`,
117
- "data-active": dataAttr(checkedValues.length > 0),
118
- children: /*#__PURE__*/ jsx(IconSlider2HorizontalLine_default, {
119
- size: 16
120
- })
121
- })
122
- }),
123
- /*#__PURE__*/ jsx(MenuPositioner, {
124
- children: /*#__PURE__*/ jsx(MenuContent, {
125
- style: {
126
- minWidth: 180
127
- },
128
- children: /*#__PURE__*/ jsxs(MenuScrollArea, {
129
- children: [
130
- /*#__PURE__*/ jsx("div", {
131
- style: {
132
- padding: "0 8px"
133
- },
134
- children: /*#__PURE__*/ jsxs(SegmentedControlRoot, {
135
- "aria-label": `${columnLabel} filter condition`,
136
- value: mode,
137
- onValueChange: (next)=>setFilterMode(column.key, next),
138
- style: {
139
- width: "100%"
140
- },
141
- children: [
142
- /*#__PURE__*/ jsxs(SegmentedControlItem, {
143
- value: "is",
144
- children: [
145
- /*#__PURE__*/ jsx(SegmentedControlItemHiddenInput, {}),
146
- filterConditionLabel("is", hasMultipleValues)
147
- ]
148
- }),
149
- /*#__PURE__*/ jsxs(SegmentedControlItem, {
150
- value: "isnot",
151
- children: [
152
- /*#__PURE__*/ jsx(SegmentedControlItemHiddenInput, {}),
153
- filterConditionLabel("isnot", hasMultipleValues)
154
- ]
155
- }),
156
- /*#__PURE__*/ jsx(SegmentedControlIndicator, {})
157
- ]
158
- })
159
- }),
160
- values.map((value)=>// `CheckboxRoot` is ALREADY a `<label>` (`Checkbox.tsx`'s own
161
- // `Primitive.label`) wrapping the hidden input + `CheckboxLabel` text --
162
- // wrapping it in a SECOND `<label>` here used to nest one label inside
163
- // another, which is invalid HTML and made a click on the row's own text
164
- // reach the checkbox's native activation twice (once via each label),
165
- // toggling it on then immediately back off. `CheckboxRoot` takes the
166
- // row's own layout via `style` directly instead.
167
- /*#__PURE__*/ jsxs(CheckboxRoot, {
168
- checked: checkedValues.includes(value),
169
- onCheckedChange: ()=>toggleFilterValue(column.key, value),
170
- style: {
171
- display: "flex",
172
- alignItems: "center",
173
- gap: 8,
174
- padding: "4px 8px",
175
- cursor: "pointer"
176
- },
177
- children: [
178
- /*#__PURE__*/ jsx(CheckboxControl, {
179
- children: /*#__PURE__*/ jsx(CheckboxIndicator, {
180
- checked: FILTER_CHECKED_ICON
181
- })
182
- }),
183
- /*#__PURE__*/ jsx(CheckboxLabel, {
184
- children: value
185
- }),
186
- /*#__PURE__*/ jsx(CheckboxHiddenInput, {
187
- "aria-label": value
188
- })
189
- ]
190
- }, value))
191
- ]
192
- })
193
- })
194
- })
195
- ]
196
- });
197
- }
198
- /** Every header cell, in the effective (ordered, visible) order -- a standalone
199
- * component (not inlined in `DataTableInner`'s render) so it alone re-renders when
200
- * `visibleColumnOrder`/labels/widths change, without also re-deriving `sortedData`'s
201
- * render above it. */ function ColumnHeaderCells({ columns, columnMenu, reorderable, resizable, sortIcon, selectable, stickyFirst, stickyLast }) {
202
- const { draggingColumnKey, beginColumnDrag, dragOverColumn, endColumnDrag } = useDataTableContext();
203
- const effective = useEffectiveColumns(columns);
204
- const [renamingKey, setRenamingKey] = React.useState(null);
205
- return /*#__PURE__*/ jsx(Fragment, {
206
- children: effective.map(({ column, label, width }, index)=>{
207
- const isFirst = index === 0;
208
- const isLast = index === effective.length - 1;
209
- const sticky = stickyProps({
210
- selectable,
211
- stickyFirst,
212
- stickyLast,
213
- isSelectionCell: false,
214
- isFirst,
215
- isLast
216
- });
217
- return /*#__PURE__*/ jsxs(DataTableHeaderCell, {
218
- columnKey: column.key,
219
- sortable: column.sortable,
220
- "data-column-key": column.key,
221
- draggable: reorderable && renamingKey !== column.key,
222
- onDragStart: (event)=>{
223
- event.dataTransfer.effectAllowed = "move";
224
- beginColumnDrag(column.key);
225
- },
226
- onDragOver: (event)=>{
227
- event.preventDefault();
228
- if (draggingColumnKey && draggingColumnKey !== column.key) dragOverColumn(column.key);
229
- },
230
- onDrop: (event)=>event.preventDefault(),
231
- onDragEnd: endColumnDrag,
232
- "data-dragging": dataAttr(draggingColumnKey === column.key),
233
- style: sticky.style,
234
- "data-sticky": sticky["data-sticky"],
235
- "data-sticky-edge": sticky["data-sticky-edge"],
236
- "data-sticky-edge-end": sticky["data-sticky-edge-end"],
237
- children: [
238
- /*#__PURE__*/ jsx(DataTableHeaderCellInner, {
239
- children: renamingKey === column.key ? /*#__PURE__*/ jsx(ColumnRenameInput, {
240
- column: column,
241
- initialLabel: typeof label === "string" ? label : column.key,
242
- onDone: ()=>setRenamingKey(null)
243
- }) : /*#__PURE__*/ jsxs(Fragment, {
244
- children: [
245
- /*#__PURE__*/ jsx(DataTableHeaderCellLabel, {
246
- children: label
247
- }),
248
- column.filterValues && column.filterValues.length > 0 && /*#__PURE__*/ jsx(FilterMenu, {
249
- column: column
250
- }),
251
- column.sortable && /*#__PURE__*/ jsx(SortIndicator, {
252
- columnKey: column.key,
253
- icon: sortIcon
254
- }),
255
- columnMenu && /*#__PURE__*/ jsx(ColumnMenu, {
256
- column: column,
257
- onRename: ()=>setRenamingKey(column.key)
258
- })
259
- ]
260
- })
261
- }),
262
- resizable && column.resizable !== false && /*#__PURE__*/ jsx(ColumnResizeHandle, {
263
- columnKey: column.key,
264
- width: width
265
- })
266
- ]
267
- }, column.key);
268
- })
269
- });
270
- }
271
- function ColumnRenameInput({ column, initialLabel, onDone }) {
272
- const { renameColumn } = useDataTableContext();
273
- const [value, setValue] = React.useState(initialLabel);
274
- // Opening this input is ITSELF the result of clicking a `MenuItem` -- the menu's own
275
- // close (which happens on that same click) restores focus to its trigger a beat
276
- // later, and that focus move fires as a `blur` on this input the instant it mounts
277
- // with `autoFocus`. Committing on THAT blur would silently re-close the editor
278
- // before anyone saw it (found writing this file's own rename test, which failed
279
- // with the header reverting to its plain label with no visible input in between).
280
- // `ready` flips true one frame after mount, so only a blur after that -- an actual
281
- // click/tab away -- commits.
282
- const readyRef = React.useRef(false);
283
- const inputRef = React.useRef(null);
284
- React.useEffect(()=>{
285
- // The menu's close restores focus to its trigger one frame after this input
286
- // mounts, stealing focus from `autoFocus`. Re-grab it in the SAME frame (after
287
- // the restore) and select the text, so the user can type/replace immediately.
288
- const frame = requestAnimationFrame(()=>{
289
- readyRef.current = true;
290
- inputRef.current?.focus();
291
- inputRef.current?.select();
292
- });
293
- return ()=>cancelAnimationFrame(frame);
294
- }, []);
295
- const commit = ()=>{
296
- if (value.trim()) renameColumn(column.key, value.trim());
297
- onDone();
298
- };
299
- return(// A bare, minimal input -- NOT seed's `TextField` (its labeled root measures
300
- // ~52px tall, per DATATABLE-ATTIO-SPEC.md's own note; this has to fit a 40px
301
- // header cell with no label/description chrome of its own). Seed has no lighter
302
- // input primitive at this level, so this follows crisp's own measured
303
- // `.crisp-datatable-th-rename` (`datatable.recipe.ts`) instead: full-width,
304
- // header-row height, a small inset, no border (an inset brand-solid box-shadow
305
- // stands in for a focus ring), the header's own font weight/size inherited
306
- // rather than a new size introduced for one input.
307
- /*#__PURE__*/ jsx("input", {
308
- ref: inputRef,
309
- // biome-ignore lint/a11y/noAutofocus: opening this input IS the user's own click a moment earlier (crisp's `.crisp-datatable-th-rename` does the same), not an unannounced page-load autofocus.
310
- autoFocus: true,
311
- "aria-label": `Rename ${initialLabel}`,
312
- value: value,
313
- onClick: (event)=>event.stopPropagation(),
314
- onChange: (event)=>setValue(event.target.value),
315
- onBlur: ()=>{
316
- if (readyRef.current) commit();
317
- },
318
- onKeyDown: (event)=>{
319
- event.stopPropagation();
320
- if (event.key === "Enter") commit();
321
- if (event.key === "Escape") onDone();
322
- },
323
- // Bare inline input: no border/ring/background/radius -- it reads as the
324
- // header label made editable in place, not a boxed field.
325
- style: {
326
- width: "100%",
327
- minWidth: 0,
328
- height: "100%",
329
- margin: 0,
330
- padding: 0,
331
- border: "none",
332
- borderRadius: 0,
333
- background: "transparent",
334
- boxShadow: "none",
335
- font: "inherit",
336
- fontWeight: "var(--seed-font-weight-medium)",
337
- color: "var(--seed-color-fg-neutral)",
338
- outline: "none"
339
- }
340
- }));
341
- }
342
- /** The per-column header menu (rename / hide / move left / move right) -- seed
343
- * `Menu`, opened from the same `headerCellIcon` slot the filter trigger and sort
344
- * chevron already share. Hover/focus-reveal (`data-column-menu`'s own CSS in
345
- * `data-table.ts`) -- crisp's own header shows the trigger only on hover, not
346
- * permanently, so this one carries its own marker attribute distinct from that
347
- * slot's OTHER occupants (the sort chevron, the filter trigger), which stay visible
348
- * under their own separate rules regardless of hover. */ function ColumnMenu({ column, onRename }) {
349
- const { moveColumn, hideColumn } = useDataTableContext();
350
- const columnLabel = typeof column.header === "string" ? column.header : column.key;
351
- const stopPropagation = (event)=>event.stopPropagation();
352
- return /*#__PURE__*/ jsxs(MenuRoot, {
353
- children: [
354
- /*#__PURE__*/ jsx(DataTableHeaderCellIcon, {
355
- asChild: true,
356
- "data-column-menu": "",
357
- onClick: stopPropagation,
358
- onKeyDown: stopPropagation,
359
- draggable: false,
360
- children: /*#__PURE__*/ jsx(MenuTrigger, {
361
- "aria-label": `${columnLabel} column menu`,
362
- children: /*#__PURE__*/ jsx(IconDot3HorizontalLine_default, {
363
- size: 16
364
- })
365
- })
366
- }),
367
- /*#__PURE__*/ jsx(MenuPositioner, {
368
- children: /*#__PURE__*/ jsx(MenuContent, {
369
- style: {
370
- minWidth: 160
371
- },
372
- children: /*#__PURE__*/ jsxs(MenuScrollArea, {
373
- children: [
374
- /*#__PURE__*/ jsx(MenuItem, {
375
- onClick: onRename,
376
- children: /*#__PURE__*/ jsx(MenuItemLabel, {
377
- children: "Rename"
378
- })
379
- }),
380
- /*#__PURE__*/ jsx(MenuItem, {
381
- onClick: ()=>moveColumn(column.key, "left"),
382
- children: /*#__PURE__*/ jsx(MenuItemLabel, {
383
- children: "Move left"
384
- })
385
- }),
386
- /*#__PURE__*/ jsx(MenuItem, {
387
- onClick: ()=>moveColumn(column.key, "right"),
388
- children: /*#__PURE__*/ jsx(MenuItemLabel, {
389
- children: "Move right"
390
- })
391
- }),
392
- /*#__PURE__*/ jsx(MenuItem, {
393
- onClick: ()=>hideColumn(column.key),
394
- children: /*#__PURE__*/ jsx(MenuItemLabel, {
395
- children: "Hide column"
396
- })
397
- })
398
- ]
399
- })
400
- })
401
- })
402
- ]
403
- });
404
- }
405
-
406
- export { ColumnHeaderCells as C };