@crispy-seed/data-table 0.1.0 → 0.1.2

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