@crispy-seed/data-table 0.10.4 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import * as react from 'react';
1
+ import * as React from 'react';
2
2
  import * as react_jsx_runtime from 'react/jsx-runtime';
3
3
 
4
4
  declare interface DataTableVariant {
@@ -57,18 +57,22 @@ interface ToolbarFilter {
57
57
  }
58
58
 
59
59
  /**
60
- * Live-review fix (Attio/GRC parity): the ColumnCalc footer's own aggregation set --
61
- * three apply to every column, six more to numeric ones, one more to non-numeric ones.
62
- * Distinct from crisp's own `ColumnCalc` (`countEmpty`/`countFilled`/`percentEmpty`/
63
- * `percentFilled` + sum/average/min/max + "none") -- crisp's own set was read for the
64
- * MENU/trigger interaction (`column-calc.tsx`'s own doc comment), not copied op-for-op;
65
- * this table's contract is the ten named directly in DATATABLE-ATTIO-SPEC.md/the GRC
66
- * feature contract: count / empty / not-empty everywhere, sum / average / median / min
67
- * / max / range on a numeric column, count-unique on a non-numeric one. The styled
68
- * layer picks which extra set to offer off the column's own cell type (`column-calc.tsx`'s
69
- * `ColumnCalcCell`).
60
+ * Attio-parity follow-up (bring the discovery doc's PARTIAL #7 to full parity, on top
61
+ * of the earlier GRC live-review fix): the ColumnCalc footer's own aggregation set --
62
+ * six apply to every column, six more to numeric ones, one more to non-numeric ones.
63
+ * The six universal ops are `count` (GRC's own addition, kept) plus Attio's measured
64
+ * four -- `empty`/`notEmpty` labelled "Count empty"/"Count filled", `percentEmpty` /
65
+ * `percentFilled` -- plus `none`, which is Attio's own menu entry for "no calculation",
66
+ * not a conditionally-appended "Clear" item: it renders nothing (`computeColumnCalc`
67
+ * returns `null` for it) and, unlike `setColumnCalcOp(key, undefined)`, is a real,
68
+ * explicit, controllable op value so it overrides a column's `summaryDefaultOp`
69
+ * instead of falling back to it. Numeric columns still additionally get sum / average
70
+ * / median / min / max / range (GRC's set, not in Attio's own measured menu but kept --
71
+ * this table's contract, not a straight port); non-numeric columns still get
72
+ * count-unique. The styled layer picks which extra set to offer off the column's own
73
+ * cell type (`column-calc.tsx`'s `ColumnCalcCell`).
70
74
  */
71
- type DataTableCalcOp = "count" | "empty" | "notEmpty" | "sum" | "average" | "median" | "min" | "max" | "range" | "countUnique";
75
+ type DataTableCalcOp = "count" | "empty" | "notEmpty" | "percentEmpty" | "percentFilled" | "none" | "sum" | "average" | "median" | "min" | "max" | "range" | "countUnique";
72
76
 
73
77
  /** Everything a saved view actually captures -- deliberately the same five controlled
74
78
  * props `useDataTableColumns` + the toolbar sort/filter hooks already expose, so
@@ -114,6 +118,15 @@ interface UseDataTableViewsProps {
114
118
  storageKey?: string;
115
119
  }
116
120
 
121
+ /** The context a consumer's `cellContextMenuItems` render slot gets -- everything it
122
+ * needs to build its own `MenuItem`s (which row/column this menu opened for, the raw
123
+ * value already read off `getColumnValue`) without re-deriving any of it itself. */
124
+ interface DataTableCellContextMenuContext<TRow> {
125
+ row: TRow;
126
+ column: DataTableColumn<TRow>;
127
+ value: unknown;
128
+ }
129
+
117
130
  type DataTableCellType = "text" | "entity" | "url" | "email" | "tags" | "status" | "number" | "currency" | "date" | "datetime" | "rating" | "checkbox" | "chip" | "chip-list";
118
131
 
119
132
  /** A `select`/`reference`/`actor` editor's own choice list -- `value`/`label` are
@@ -138,7 +151,7 @@ interface DataTableColumn<TRow> {
138
151
  */
139
152
  key: string;
140
153
  /** 헤더 셀에 표시할 내용입니다. */
141
- header: react.ReactNode;
154
+ header: React.ReactNode;
142
155
  /** 이 열을 클릭해 정렬할 수 있는지 여부입니다. */
143
156
  sortable?: boolean;
144
157
  /**
@@ -149,7 +162,7 @@ interface DataTableColumn<TRow> {
149
162
  /** 셀 내용을 직접 그립니다. 지정하면 `type`의 기본 렌더러 대신 이것을 사용합니다.
150
163
  * `editable`이어도 편집/always-live 상태에는 영향이 없습니다 -- 이 필드는 REST
151
164
  * 상태의 표시만 바꿉니다. */
152
- render?: (row: TRow) => react.ReactNode;
165
+ render?: (row: TRow) => React.ReactNode;
153
166
  /** `type: "currency"`의 통화 기호입니다. @default "$" */
154
167
  symbol?: string;
155
168
  /** `type: "rating"`의 별 개수입니다. @default 5 */
@@ -276,11 +289,11 @@ interface DataTableColumn<TRow> {
276
289
  * 줄임표 처리되고, 아이콘은 `flex-shrink:0`). `type: "text"`(기본)와 `"url"`/
277
290
  * `"email"` 열에서 동작합니다.
278
291
  */
279
- suffixIcon?: (row: TRow) => react.ReactNode;
292
+ suffixIcon?: (row: TRow) => React.ReactNode;
280
293
  }
281
294
  interface DataTableProps<TRow extends {
282
295
  id: string;
283
- }> extends DataTableVariantProps, Omit<PrimitiveProps, "asChild">, Omit<react.HTMLAttributes<HTMLDivElement>, "children"> {
296
+ }> extends DataTableVariantProps, Omit<PrimitiveProps, "asChild">, Omit<React.HTMLAttributes<HTMLDivElement>, "children"> {
284
297
  columns: DataTableColumn<TRow>[];
285
298
  data: TRow[];
286
299
  /** `type`이 있는 열의 number/currency/date/datetime 표시에 쓰는 로캘입니다. @default "en-US" */
@@ -298,9 +311,9 @@ interface DataTableProps<TRow extends {
298
311
  * 씁니다. 생략하면 karrot 아이콘 셋의 chevron을 씁니다.
299
312
  */
300
313
  sortIcon?: {
301
- idle?: react.ReactNode;
302
- asc?: react.ReactNode;
303
- desc?: react.ReactNode;
314
+ idle?: React.ReactNode;
315
+ asc?: React.ReactNode;
316
+ desc?: React.ReactNode;
304
317
  };
305
318
  /** 왼쪽에 40px짜리 체크박스 선택 열을 추가합니다. */
306
319
  selectable?: boolean;
@@ -316,10 +329,21 @@ interface DataTableProps<TRow extends {
316
329
  getRowSelectionLabel?: (row: TRow) => string;
317
330
  /** 선택 체크박스가 checked일 때 표시할 아이콘입니다. 생략하면 karrot의 체크 아이콘을
318
331
  * 씁니다. */
319
- selectionCheckedIcon?: react.ReactNode;
332
+ selectionCheckedIcon?: React.ReactNode;
320
333
  /** 전체 선택 체크박스가 일부만 선택됐을 때(indeterminate) 표시할 아이콘입니다.
321
334
  * 생략하면 karrot의 minus 아이콘을 씁니다. */
322
- selectionIndeterminateIcon?: react.ReactNode;
335
+ selectionIndeterminateIcon?: React.ReactNode;
336
+ /**
337
+ * 행이 하나 이상 선택되면 테이블 하단 중앙에 뜨는 벌크 액션 바(Attio 스타일 floating
338
+ * pill, gap #4)에 넣을 소비자 액션입니다. 현재 선택된 행 id 목록을 받는 render prop --
339
+ * 이 컴포넌트는 바의 크롬("N selected" + 지우기 버튼)만 제공하고, 실제 액션 버튼(Add
340
+ * to list, Send email, …)은 항상 소비자 자신의 것입니다 (`toolbarActions`와 같은
341
+ * "크롬 vs 소비자 콘텐츠" 분리). 생략하면 바는 크롬만 보여줍니다. `selectable`이 꺼져
342
+ * 있으면 무시됩니다(선택 자체가 없으므로).
343
+ */
344
+ bulkActions?: (selectedIds: string[]) => React.ReactNode;
345
+ /** 벌크 액션 바의 지우기(x) 버튼 접근성 이름입니다. @default "Clear selection" */
346
+ clearSelectionLabel?: string;
323
347
  /** 제어할 검색어입니다. */
324
348
  query?: string;
325
349
  /** 비제어 방식으로 사용할 때의 초기 검색어입니다. */
@@ -356,7 +380,7 @@ interface DataTableProps<TRow extends {
356
380
  * 행 개수 텍스트를 직접 만듭니다. 생략하면 crisp의 기본 형식을 씁니다: 검색/필터로
357
381
  * 줄지 않았으면 "N rows"(단수는 "row"), 줄었으면 "N of M".
358
382
  */
359
- countLabel?: (shown: number, total: number) => react.ReactNode;
383
+ countLabel?: (shown: number, total: number) => React.ReactNode;
360
384
  /**
361
385
  * 툴바 오른쪽, 행 개수 옆에 렌더링할 커스텀 액션입니다(예: Download/내보내기 버튼).
362
386
  * 이전에는 이 자리에 넣을 공식 prop이 없어서 소비자가 `.seed-data-table__toolbar`
@@ -365,7 +389,7 @@ interface DataTableProps<TRow extends {
365
389
  * 렌더링됩니다). 검색/정렬/필터보다 뒤, 카운트보다 앞(같은 그룹 안에서 카운트
366
390
  * 왼쪽)에 옵니다.
367
391
  */
368
- toolbarActions?: react.ReactNode;
392
+ toolbarActions?: React.ReactNode;
369
393
  /** 헤더의 열별 메뉴(이름 변경 / 숨기기 / 왼쪽·오른쪽으로 이동)를 켭니다, seed `Menu`. */
370
394
  columnMenu?: boolean;
371
395
  /** 헤더를 드래그해 열 순서를 바꿀 수 있게 합니다. @default true */
@@ -429,6 +453,24 @@ interface DataTableProps<TRow extends {
429
453
  * 커밋됩니다.
430
454
  */
431
455
  onEdit?: (id: string, key: string, value: string) => Promise<void> | void;
456
+ /**
457
+ * Attio parity (attio-column-features-full.md gap #1) -- right-click any body cell
458
+ * to open a menu: Copy (any cell, built-in -- `navigator.clipboard.writeText` of the
459
+ * cell's own display text), Clear value/Paste (editable cells only, see
460
+ * `cell-context-menu.tsx`'s own `isClearableEditableCell`/`isSimpleEditableCell` for
461
+ * exactly which shapes qualify), and View edit history (only when
462
+ * `onViewEditHistory` is passed). @default true
463
+ */
464
+ cellContextMenu?: boolean;
465
+ /** Shown as "View edit history" in the cell context menu, only when passed -- the
466
+ * consumer owns whatever history UI opens (a drawer, a modal, …); this component
467
+ * only fires the callback with the row and the column's key. */
468
+ onViewEditHistory?: (row: TRow, columnKey: string) => void;
469
+ /** Extra `MenuItem`s appended to the end of every cell's right-click menu (e.g. a
470
+ * consumer's own "Assign to…") -- rendered inside the SAME `MenuScrollArea` the
471
+ * built-in items are, so a `<MenuItem>` from this package's own `Menu` export
472
+ * composes the way `column-menu.tsx`'s own items do. */
473
+ cellContextMenuItems?: (ctx: DataTableCellContextMenuContext<TRow>) => React.ReactNode;
432
474
  /** 행을 클릭할 수 있게 하는 호버 표시입니다 (crisp의 3%/4% 포그라운드 틴트). 커서
433
475
  * 모양은 `onRowClick`이 있는지에 따로 달려 있습니다 -- 이 값과 독립적으로 켤 수
434
476
  * 있습니다(crisp의 두 prop, `interactive`/`onRowClick`도 서로 독립적입니다). */
@@ -439,19 +481,19 @@ interface DataTableProps<TRow extends {
439
481
  /** 주어지면 맨 아래에 crisp가 측정한 "+ New" 추가 행 버튼을 렌더링합니다. */
440
482
  onAddRow?: () => void;
441
483
  /** 추가 행 버튼의 라벨입니다. @default "New record" */
442
- addRowLabel?: react.ReactNode;
484
+ addRowLabel?: React.ReactNode;
443
485
  /** 전체 본문을 이 상태로 대체합니다(로딩 아이콘 + `loadingLabel`) -- 필터/정렬
444
486
  * 재조회나 최초 로드처럼 행 전체가 아직 없을 때를 위한 것입니다. `error`/빈 상태
445
487
  * 보다 우선합니다. 인라인 스크롤 로딩 표시기(`onLoadMore`)와는 별개입니다. */
446
488
  loading?: boolean;
447
489
  /** `loading`일 때 스피너 옆에 보이는 텍스트입니다. @default "Loading..." */
448
- loadingLabel?: react.ReactNode;
490
+ loadingLabel?: React.ReactNode;
449
491
  /** 주어지면 행 대신 이 내용을 본문에 렌더링합니다(crisp의 `.crisp-datatable-empty`
450
492
  * 칸 재사용). `loading`보다는 아래, 빈 상태보다는 위 우선순위입니다. */
451
- error?: react.ReactNode;
493
+ error?: React.ReactNode;
452
494
  /** 검색/필터를 거치고도 행이 하나도 없을 때 본문에 렌더링할 내용입니다.
453
495
  * @default "No results." */
454
- empty?: react.ReactNode;
496
+ empty?: React.ReactNode;
455
497
  /**
456
498
  * Attio 스타일 무한 스크롤: 스크롤 컨테이너 바닥 근처의 sentinel 행이 뷰에 들어오면
457
499
  * 호출됩니다. `Promise`를 반환하면 그동안 자동으로 `loadingMore`가 켜집니다(직접
@@ -475,7 +517,7 @@ interface DataTableProps<TRow extends {
475
517
  * `style={{ height: "100%" }}` 같은 바운드를 주는 것만으로도 "전체 높이" 모드가
476
518
  * 됩니다 -- 새 prop 없이 기존 `style` 전달만으로 두 모드 다 지원됩니다.
477
519
  */
478
- scrollProps?: Omit<react.ComponentPropsWithoutRef<"div">, "ref" | "onScroll">;
520
+ scrollProps?: Omit<React.ComponentPropsWithoutRef<"div">, "ref" | "onScroll">;
479
521
  }
480
522
  /**
481
523
  * @see https://seed-design.io/react/components/data-table
@@ -483,8 +525,8 @@ interface DataTableProps<TRow extends {
483
525
  declare const DataTable: <TRow extends {
484
526
  id: string;
485
527
  }>(props: DataTableProps<TRow> & {
486
- ref?: react.ForwardedRef<HTMLDivElement>;
487
- }) => react.ReactElement;
528
+ ref?: React.ForwardedRef<HTMLDivElement>;
529
+ }) => React.ReactElement;
488
530
 
489
531
  interface DataTableViewsControlProps extends UseDataTableViewsProps {
490
532
  /** The trigger's label when no view is active. @default "Views" */
@@ -494,7 +536,7 @@ interface DataTableViewsControlProps extends UseDataTableViewsProps {
494
536
  * meaningful "no view" state to switch back to. */
495
537
  showClearRow?: boolean;
496
538
  /** The clear row's own label, when `showClearRow` is on. @default "label" */
497
- clearLabel?: react.ReactNode;
539
+ clearLabel?: React.ReactNode;
498
540
  /**
499
541
  * Reads the table's CURRENT column order/visibility/widths/pins + toolbar sort/
500
542
  * filter conditions -- called when the user picks "Save as new view" or "Update
@@ -527,10 +569,32 @@ declare namespace DataTableViewsControl {
527
569
  var displayName: string;
528
570
  }
529
571
 
572
+ interface DataTableBulkBarProps {
573
+ /** The clear ("x") button's accessible name. @default "Clear selection" */
574
+ clearLabel?: string;
575
+ /**
576
+ * The consumer's own bulk-action buttons, as a render prop receiving the current
577
+ * selected row ids -- e.g. `<DataTableBulkBar>{(ids) => <ActionButton
578
+ * onClick={() => addToList(ids)}>Add to list</ActionButton>}</DataTableBulkBar>`.
579
+ * Omit for just the bar's own chrome ("N selected" + clear).
580
+ */
581
+ children?: (selectedIds: string[]) => React.ReactNode;
582
+ }
583
+ /**
584
+ * The floating bulk-action pill (gap #4) -- renders nothing while no row is selected
585
+ * (reads `selectedIds` off the table-wide context itself, so a consumer doesn't have
586
+ * to gate this on `selectable`/`selectedIds` on their own). Composed as the LAST
587
+ * child of the table's own root (`DataTable.tsx`), which is `position: relative` for
588
+ * exactly this reason -- see `data-table.ts`'s own `bulkBar` slot comment for why its
589
+ * geometry borrows `contextual-floating-button`'s already-measured vars rather than a
590
+ * guessed literal.
591
+ */
592
+ declare function DataTableBulkBar({ clearLabel, children, }: DataTableBulkBarProps): react_jsx_runtime.JSX.Element | null;
593
+
530
594
  type ResizablePanelSide = "left" | "right";
531
595
 
532
596
  type ResizablePanelHandleVariant = "panel" | "column";
533
- type ResizablePanelProps = Omit<react.ComponentPropsWithoutRef<"div">, "children" | "onResize"> & {
597
+ type ResizablePanelProps = Omit<React.ComponentPropsWithoutRef<"div">, "children" | "onResize"> & {
534
598
  /** Which edge of its container the panel is anchored to. @default "left" */
535
599
  side?: ResizablePanelSide;
536
600
  /** Controlled width, in px. */
@@ -619,9 +683,9 @@ type ResizablePanelProps = Omit<react.ComponentPropsWithoutRef<"div">, "children
619
683
  * observe `animationName` changes on the SAME node that carries
620
684
  * `data-state`/the keyframe animation above.
621
685
  */
622
- panelElementRef?: react.Ref<HTMLDivElement>;
686
+ panelElementRef?: React.Ref<HTMLDivElement>;
623
687
  className?: string;
624
- children?: react.ReactNode;
688
+ children?: React.ReactNode;
625
689
  };
626
690
  /**
627
691
  * An adjustable-panel primitive with two layout models (`floating`'s own doc
@@ -637,7 +701,7 @@ type ResizablePanelProps = Omit<react.ComponentPropsWithoutRef<"div">, "children
637
701
  * lives in `useResizablePanel` (`@seed-design/react-resizable-panel`), this
638
702
  * component owns the DOM + recipe classes on top of it.
639
703
  */
640
- declare const ResizablePanel: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "children" | "onResize"> & {
704
+ declare const ResizablePanel: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "children" | "onResize"> & {
641
705
  /** Which edge of its container the panel is anchored to. @default "left" */
642
706
  side?: ResizablePanelSide;
643
707
  /** Controlled width, in px. */
@@ -726,10 +790,10 @@ declare const ResizablePanel: react.ForwardRefExoticComponent<Omit<Omit<react.De
726
790
  * observe `animationName` changes on the SAME node that carries
727
791
  * `data-state`/the keyframe animation above.
728
792
  */
729
- panelElementRef?: react.Ref<HTMLDivElement>;
793
+ panelElementRef?: React.Ref<HTMLDivElement>;
730
794
  className?: string;
731
- children?: react.ReactNode;
732
- } & react.RefAttributes<HTMLDivElement>>;
795
+ children?: React.ReactNode;
796
+ } & React.RefAttributes<HTMLDivElement>>;
733
797
 
734
798
  /** One Highlights card -- label, value and an optional icon, laid out the way
735
799
  * Attio's own peek panel lays its own out (your-moon/crisp#448, measured
@@ -738,8 +802,8 @@ declare const ResizablePanel: react.ForwardRefExoticComponent<Omit<Omit<react.De
738
802
  type RecordPreviewHighlight = {
739
803
  key: string;
740
804
  label: string;
741
- value: react.ReactNode;
742
- icon?: react.ComponentType<{
805
+ value: React.ReactNode;
806
+ icon?: React.ComponentType<{
743
807
  size?: number;
744
808
  }>;
745
809
  };
@@ -752,7 +816,7 @@ type RecordPreviewSection = {
752
816
  key: string;
753
817
  label: string;
754
818
  count: number;
755
- content?: react.ReactNode;
819
+ content?: React.ReactNode;
756
820
  };
757
821
  /** One tab of the panel's own mini detail view (a "tabs" capability with no
758
822
  * your-moon/crisp equivalent -- crisp's own peek only ever shows Highlights
@@ -764,12 +828,12 @@ type RecordPreviewSection = {
764
828
  * tab has been visited) -- see `Tabs.tsx`. */
765
829
  type RecordPreviewTab = {
766
830
  key: string;
767
- label: react.ReactNode;
768
- content: react.ReactNode;
831
+ label: React.ReactNode;
832
+ content: React.ReactNode;
769
833
  /** Rendered right after `label` inside the tab trigger, e.g. an unread
770
834
  * count -- purely presentational, this component attaches no meaning to
771
835
  * it. */
772
- badge?: react.ReactNode;
836
+ badge?: React.ReactNode;
773
837
  };
774
838
  /** The record this panel previews. Only `name` is read directly here --
775
839
  * everything else the panel shows comes from `highlights`/`activity`/
@@ -781,7 +845,7 @@ type RecordPreviewRecord = {
781
845
  name?: string;
782
846
  [key: string]: unknown;
783
847
  };
784
- type RecordPreviewProps = Omit<react.ComponentPropsWithoutRef<"div">, "children" | "title" | "onResize"> & {
848
+ type RecordPreviewProps = Omit<React.ComponentPropsWithoutRef<"div">, "children" | "title" | "onResize"> & {
785
849
  /** Whether the panel is mounted/visible. */
786
850
  open: boolean;
787
851
  onClose: () => void;
@@ -802,7 +866,7 @@ type RecordPreviewProps = Omit<react.ComponentPropsWithoutRef<"div">, "children"
802
866
  nextRecordLabel?: string;
803
867
  /** "2 of 37 in All Companies" (your-moon/crisp#413) -- a single
804
868
  * pre-formatted string; omit for no counter at all. */
805
- counterLabel?: react.ReactNode;
869
+ counterLabel?: React.ReactNode;
806
870
  /**
807
871
  * Lets a person drag the panel wider or narrower from its own left edge --
808
872
  * this port reuses `ResizablePanel`'s own handle (`side="right"`, whose
@@ -818,7 +882,7 @@ type RecordPreviewProps = Omit<react.ComponentPropsWithoutRef<"div">, "children"
818
882
  minWidth?: number;
819
883
  maxWidth?: number;
820
884
  /** The panel's heading, and so its accessible name. Defaults to `record.name`. */
821
- title?: react.ReactNode;
885
+ title?: React.ReactNode;
822
886
  /** Avatar image URL beside the title. Omit for an initials tile built from
823
887
  * `record.name`'s first character. */
824
888
  avatar?: string;
@@ -827,13 +891,13 @@ type RecordPreviewProps = Omit<react.ComponentPropsWithoutRef<"div">, "children"
827
891
  record: RecordPreviewRecord | null;
828
892
  /** Heading above the highlight cards (default "Highlights"). Omit the
829
893
  * whole section by omitting `highlights`. */
830
- highlightsLabel?: react.ReactNode;
894
+ highlightsLabel?: React.ReactNode;
831
895
  highlights?: RecordPreviewHighlight[];
832
896
  /** Heading above the activity feed (default "Activity"). */
833
- activityLabel?: react.ReactNode;
834
- viewAllActivityLabel?: react.ReactNode;
897
+ activityLabel?: React.ReactNode;
898
+ viewAllActivityLabel?: React.ReactNode;
835
899
  onViewAllActivity?: () => void;
836
- activity?: react.ReactNode;
900
+ activity?: React.ReactNode;
837
901
  /** Collapsed sections below Activity (your-moon/crisp#413). Omit for no
838
902
  * sections at all. */
839
903
  sections?: RecordPreviewSection[];
@@ -859,9 +923,9 @@ type RecordPreviewProps = Omit<react.ComponentPropsWithoutRef<"div">, "children"
859
923
  onTabChange?: (key: string) => void;
860
924
  /** Label for the synthesized overview tab -- see `tabs`'s own doc
861
925
  * comment. @default "Overview" */
862
- overviewTabLabel?: react.ReactNode;
926
+ overviewTabLabel?: React.ReactNode;
863
927
  /** Rendered below the panel's content, e.g. an Edit button. */
864
- footer?: react.ReactNode;
928
+ footer?: React.ReactNode;
865
929
  /**
866
930
  * An optional dimming backdrop behind the panel -- OFF by default (this
867
931
  * is a peek, not a modal: Attio's own peek never dims the table it
@@ -917,5 +981,5 @@ declare namespace RecordPreview {
917
981
  var displayName: string;
918
982
  }
919
983
 
920
- export { DataTable, DataTableViewsControl, RecordPreview, ResizablePanel };
921
- export type { DataTableColumn, DataTableColumnKind, DataTableProps, DataTableView, DataTableViewState, DataTableViewsControlProps, RecordPreviewHighlight, RecordPreviewProps, RecordPreviewRecord, RecordPreviewSection, RecordPreviewTab, ResizablePanelHandleVariant, ResizablePanelProps, ResizablePanelSide, ToolbarFilter, ToolbarFilterOp, ToolbarSort, ToolbarSortDirection };
984
+ export { DataTable, DataTableBulkBar, DataTableViewsControl, RecordPreview, ResizablePanel };
985
+ export type { DataTableBulkBarProps, DataTableCellContextMenuContext, DataTableColumn, DataTableColumnKind, DataTableProps, DataTableView, DataTableViewState, DataTableViewsControlProps, RecordPreviewHighlight, RecordPreviewProps, RecordPreviewRecord, RecordPreviewSection, RecordPreviewTab, ResizablePanelHandleVariant, ResizablePanelProps, ResizablePanelSide, ToolbarFilter, ToolbarFilterOp, ToolbarSort, ToolbarSortDirection };