@crispy-seed/data-table 0.12.0 → 0.13.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.
@@ -538,6 +538,9 @@ tr:hover .seed-data-table__entityActions {
538
538
  .seed-data-table__footerCell:last-child {
539
539
  border-inline-end: none;
540
540
  }
541
+ .seed-data-table__footerCell[data-sticky] {
542
+ z-index: 3;
543
+ }
541
544
  .seed-data-table__footerCell .seed-data-table-column-calc-trigger {
542
545
  display: flex;
543
546
  align-items: center;
@@ -678,6 +681,9 @@ tr:hover .seed-data-table__entityActions {
678
681
  font-weight: var(--seed-font-weight-medium);
679
682
  white-space: nowrap;
680
683
  }
684
+ .seed-data-table__bulkBar[data-above-footer] {
685
+ bottom: calc(var(--seed-dimension-x4) + var(--seed-dimension-x9));
686
+ }
681
687
  .seed-data-table__bulkBarCount {
682
688
  flex-shrink: 0;
683
689
  color: var(--seed-color-fg-neutral);
@@ -603,6 +603,10 @@
603
603
  border-inline-end: none;
604
604
  }
605
605
 
606
+ .seed-data-table__footerCell[data-sticky] {
607
+ z-index: 3;
608
+ }
609
+
606
610
  .seed-data-table__footerCell .seed-data-table-column-calc-trigger {
607
611
  align-items: center;
608
612
  gap: var(--seed-dimension-x1_5);
@@ -760,6 +764,10 @@
760
764
  transform: translateX(-50%);
761
765
  }
762
766
 
767
+ .seed-data-table__bulkBar[data-above-footer] {
768
+ bottom: calc(var(--seed-dimension-x4) + var(--seed-dimension-x9));
769
+ }
770
+
763
771
  .seed-data-table__bulkBarCount {
764
772
  color: var(--seed-color-fg-neutral);
765
773
  font-variant-numeric: tabular-nums;
package/dist/index.cjs CHANGED
@@ -1187,7 +1187,7 @@ function isStringArray(value) {
1187
1187
  // per-row measurement, no ResizeObserver per row.
1188
1188
  /** The recipe's own row height (`--seed-dimension-x9` = 36px, `row.height`). */ const DEFAULT_VIRTUAL_ROW_HEIGHT = 36;
1189
1189
  /** Rows rendered beyond each edge of the viewport, so a fast scroll never outruns the
1190
- * render and flashes an empty gap. */ const DEFAULT_VIRTUAL_OVERSCAN = 8;
1190
+ * render and flashes an empty gap. */ const DEFAULT_VIRTUAL_OVERSCAN = 16;
1191
1191
  /** Distance from the bottom (px) at which `onLoadMore` fires in virtualized mode --
1192
1192
  * the same 160px look-ahead the IntersectionObserver's rootMargin gives a non-
1193
1193
  * virtualized table. */ const LOAD_MORE_THRESHOLD = 160;
@@ -1340,13 +1340,15 @@ const EMPTY_RECORD = {};
1340
1340
  })), [
1341
1341
  setColumnWidths
1342
1342
  ]);
1343
- const moveColumn = React.useCallback((key, direction)=>setRawOrder((current)=>moveColumnKey(current ?? columnKeys, key, direction)), [
1343
+ const moveColumn = React.useCallback((key, direction)=>setRawOrder((current)=>moveColumnKey(reconcileColumnOrder(current ?? columnKeys, columnKeys, actionsColumnKey), key, direction)), [
1344
1344
  setRawOrder,
1345
- columnKeys
1345
+ columnKeys,
1346
+ actionsColumnKey
1346
1347
  ]);
1347
- const reorderColumn = React.useCallback((dragKey, dropKey)=>setRawOrder((current)=>reorderColumnKey(current ?? columnKeys, dragKey, dropKey)), [
1348
+ const reorderColumn = React.useCallback((dragKey, dropKey)=>setRawOrder((current)=>reorderColumnKey(reconcileColumnOrder(current ?? columnKeys, columnKeys, actionsColumnKey), dragKey, dropKey)), [
1348
1349
  setRawOrder,
1349
- columnKeys
1350
+ columnKeys,
1351
+ actionsColumnKey
1350
1352
  ]);
1351
1353
  // -- drag-to-reorder ---------------------------------------------------------------
1352
1354
  // Live state only (which column is currently being dragged) -- the styled layer's
@@ -1514,11 +1516,11 @@ function sameCell(a, id, key) {
1514
1516
  key
1515
1517
  });
1516
1518
  result.then(()=>{
1517
- setPendingCell(null);
1518
- setEditingCell(null);
1519
+ setPendingCell((c)=>sameCell(c, id, key) ? null : c);
1520
+ setEditingCell((c)=>sameCell(c, id, key) ? null : c);
1519
1521
  }, (err)=>{
1520
- setPendingCell(null);
1521
- setEditingCell(null);
1522
+ setPendingCell((c)=>sameCell(c, id, key) ? null : c);
1523
+ setEditingCell((c)=>sameCell(c, id, key) ? null : c);
1522
1524
  setEditError({
1523
1525
  id,
1524
1526
  key,
@@ -2444,9 +2446,20 @@ DataTableCell$1.displayName = "DataTableCell";
2444
2446
 
2445
2447
  const EMPTY_VIEWS = [];
2446
2448
  function readStoredViews(storageKey) {
2447
- if (!storageKey || typeof window === "undefined") return EMPTY_VIEWS;
2449
+ if (!storageKey || typeof window === "undefined") return null;
2448
2450
  try {
2449
- return deserializeDataTableViews(window.localStorage.getItem(storageKey));
2451
+ const raw = window.localStorage.getItem(storageKey);
2452
+ if (raw === null) return null;
2453
+ // Only a well-formed array counts as "stored" -- `[]` is a real answer (the user
2454
+ // deleted every view), whereas garbage/non-array JSON is treated as absent so the
2455
+ // defaults still seed.
2456
+ let parsed;
2457
+ try {
2458
+ parsed = JSON.parse(raw);
2459
+ } catch {
2460
+ return null;
2461
+ }
2462
+ return Array.isArray(parsed) ? deserializeDataTableViews(raw) : null;
2450
2463
  } catch {
2451
2464
  // A private-browsing tab / blocked storage throws on access, not just on quota --
2452
2465
  // this hook degrades to in-memory-only rather than crash the table over it.
@@ -2484,7 +2497,7 @@ function readStoredViews(storageKey) {
2484
2497
  // Nothing in storage yet (first run, or no `storageKey` at all) -- seed from
2485
2498
  // `defaultViews` instead of an empty list, matching every other hook's own
2486
2499
  // `defaultProp` semantics.
2487
- initialViewsRef.current = stored.length > 0 ? stored : defaultViews;
2500
+ initialViewsRef.current = stored !== null ? stored : defaultViews;
2488
2501
  }
2489
2502
  }
2490
2503
  const [views = EMPTY_VIEWS, setViews] = useControllableState$1({
@@ -4126,7 +4139,7 @@ const TextFieldTextarea = /*#__PURE__*/ React.forwardRef(({ className, autoresiz
4126
4139
  });
4127
4140
  TextFieldTextarea.displayName = "TextFieldTextarea";
4128
4141
 
4129
- __insertCSS(".seed-data-table__root{box-sizing:border-box;position:relative;display:flex;flex-direction:column;width:100%;border-width:1px;border-style:solid;font-family:Inter,-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif}.seed-data-table__table{width:100%;border-collapse:separate;border-spacing:0;table-layout:fixed}.seed-data-table__headerCell{box-sizing:border-box;position:sticky;top:0;z-index:2;vertical-align:middle;text-align:start;padding:0;height:var(--seed-dimension-x10);background-color:var(--seed-color-bg-layer-default);border-top:1px solid var(--seed-color-stroke-neutral-muted);border-bottom:1px solid var(--seed-color-stroke-neutral-muted);border-inline-end:1px solid var(--seed-color-stroke-neutral-muted);border-inline-start:none;color:var(--seed-color-fg-neutral);font-size:var(--seed-font-size-t4);line-height:var(--seed-line-height-t4);font-weight:var(--seed-font-weight-medium);letter-spacing:-.14px}.seed-data-table__headerCell:last-child{border-inline-end:none}.seed-data-table__headerCell[data-sortable]{cursor:pointer;user-select:none}.seed-data-table__headerCell [data-chevron]{opacity:0;transition:opacity .12s}.seed-data-table__headerCell[data-sortable]:hover [data-chevron]{opacity:.6}.seed-data-table__headerCell[data-sorted] [data-chevron]{opacity:1;color:var(--seed-color-fg-neutral)}.seed-data-table__headerCell:hover [data-column-menu]{opacity:1}.seed-data-table__headerCell [data-column-menu]:focus-visible,.seed-data-table__headerCell [data-column-menu][data-open]{opacity:1}.seed-data-table__headerCell[data-dragging]{opacity:.5}.seed-data-table__headerCell[data-sticky]{position:sticky;z-index:3;background-color:var(--seed-color-bg-layer-default)}.seed-data-table__headerCell{outline:var(--seed-dimension-x0_5) solid transparent;outline-offset:calc(var(--seed-dimension-x0_5) * -1)}.seed-data-table__headerCell:is(:focus-visible,[data-focus-visible]){outline:var(--seed-dimension-x0_5) solid var(--seed-color-stroke-focus-ring);outline-offset:calc(var(--seed-dimension-x0_5) * -1)}.seed-data-table__headerCell .seed-data-table-resize-handle{position:absolute;top:0;inset-inline-end:calc(7px / -2);width:7px;height:100%;z-index:4;display:flex;align-items:center;justify-content:center;cursor:col-resize;touch-action:none}.seed-data-table__headerCell .seed-data-table-resize-handle-inner{width:3px;height:100%;border-radius:3px;background-color:#0298d9;opacity:0;transition:opacity .1s}.seed-data-table__headerCell .seed-data-table-resize-handle:hover .seed-data-table-resize-handle-inner,.seed-data-table__headerCell .seed-data-table-resize-handle[data-resizing] .seed-data-table-resize-handle-inner{opacity:1}.seed-data-table__headerCellInner{box-sizing:border-box;display:flex;align-items:center;width:100%;height:100%;min-width:0;gap:var(--seed-dimension-x1_5);padding-inline:var(--seed-dimension-x3)}.seed-data-table__headerCellLabel{min-width:0;flex:1 1 0%;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__headerCellIcon{flex-shrink:0;margin-inline-start:auto;display:inline-flex;align-items:center;justify-content:center;width:var(--seed-dimension-x4);height:var(--seed-dimension-x4);color:var(--seed-color-fg-neutral-subtle);border:none;background:0 0;padding:0;font:inherit;cursor:pointer}.seed-data-table__headerCellIcon[data-active]{color:var(--seed-color-fg-neutral)}.seed-data-table__headerCellIcon[data-column-menu]{opacity:0;transition:opacity .12s}.seed-data-table__row{position:relative;background-color:var(--seed-color-bg-layer-default);--seed-data-table-row-bg:var(--seed-color-bg-layer-default)}.seed-data-table__row[data-clickable]{cursor:pointer}.seed-data-table__row:is([aria-selected=true],[data-selected]){background-color:color-mix(in srgb,#0298d9 10%,var(--seed-color-bg-layer-default));--seed-data-table-row-bg:color-mix(in srgb, #0298d9 10%, var(--seed-color-bg-layer-default))}.seed-data-table__row:is([aria-selected=true],[data-selected]):is(:hover,[data-hover]){background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 3%,color-mix(in srgb,#0298d9 10%,var(--seed-color-bg-layer-default)));--seed-data-table-row-bg:color-mix(in srgb, var(--seed-color-fg-neutral) 3%, color-mix(in srgb, #0298d9 10%, var(--seed-color-bg-layer-default)))}.seed-data-table__cell{box-sizing:border-box;position:relative;vertical-align:middle;text-align:start;height:var(--seed-dimension-x9);border-bottom:1px solid var(--seed-color-stroke-neutral-muted);border-inline-end:1px solid var(--seed-color-stroke-neutral-muted);border-top:none;border-inline-start:none;padding-block:0;padding-inline:var(--seed-dimension-x3);color:var(--seed-color-fg-neutral);font-size:var(--seed-font-size-t4);line-height:var(--seed-line-height-t4);font-weight:var(--seed-font-weight-regular);letter-spacing:-.14px;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__cell:not([data-editable]){user-select:none}.seed-data-table__cell:last-child{border-inline-end:none}tbody tr:last-child .seed-data-table__cell{border-bottom:none}.seed-data-table__cell[data-numeric]{text-align:end;font-variant-numeric:tabular-nums}.seed-data-table__cell[data-sticky]{position:sticky;z-index:1;background-color:var(--seed-data-table-row-bg)}.seed-data-table__cell[data-overlay-open]{overflow:visible;z-index:20}.seed-data-table__cell[data-editable]{cursor:default}.seed-data-table__cell .seed-data-table-edit-picker{display:flex;align-items:center;gap:var(--seed-dimension-x1_5);min-width:0}.seed-data-table__cell .seed-data-table-edit-pending{flex-shrink:0;color:var(--seed-color-fg-neutral-subtle);animation:rotate .6s linear infinite}.seed-data-table__cell .seed-data-table-edit-error{position:absolute;top:100%;inset-inline-start:var(--seed-dimension-x3);inset-inline-end:var(--seed-dimension-x3);z-index:2;padding-top:2px;font-size:12px;line-height:1.3;color:var(--seed-color-fg-critical);overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__entity{display:flex;align-items:center;min-width:0;gap:var(--seed-dimension-x1_5)}.seed-data-table__entityName{min-width:0;font-weight:var(--seed-font-weight-medium);overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__entityName[data-clickable]{cursor:pointer;border:none;background:0 0;padding:0;margin:0;font-family:inherit;font-size:inherit;line-height:inherit;color:inherit;text-align:start}.seed-data-table__entityName[data-clickable]:is(:hover,[data-hover]){text-decoration:underline}.seed-data-table__tagList{display:flex;align-items:center;gap:var(--seed-dimension-x1_5);overflow:hidden;min-width:0}.seed-data-table__entityActions{display:flex;align-items:center;gap:6px;margin-inline-start:auto;flex-shrink:0;opacity:0;transition:opacity .15s}tr:hover .seed-data-table__entityActions{opacity:1}.seed-data-table__entityActions:focus-within{opacity:1}.seed-data-table__entityAction{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;margin:0;padding:2px;border:none;border-radius:6px;background:0 0;font-family:inherit;color:color-mix(in srgb,var(--seed-color-fg-neutral) 55%,transparent);cursor:pointer;flex-shrink:0;transition:background-color .2s,color .2s,box-shadow .2s}.seed-data-table__entityAction:hover{background:color-mix(in srgb,var(--seed-color-fg-neutral) 4%,transparent);color:var(--seed-color-fg-neutral)}.seed-data-table__link{color:var(--seed-color-fg-neutral);text-decoration:none;min-width:0;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__link:is(:hover,[data-hover]){text-decoration:underline}.seed-data-table__chip{box-sizing:border-box;display:inline-flex;align-items:center;flex-shrink:0;max-width:100%;height:22px;padding:0 4px;border-radius:7px;font-size:13px;font-weight:var(--seed-font-weight-medium);line-height:15px;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__chipList{position:relative;display:flex;align-items:center;flex-wrap:nowrap;gap:3px;overflow:hidden;min-width:0;width:100%}.seed-data-table__chipOverflow{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;height:20px;padding:0 4px;border-radius:6px;background-color:#f6f7f7;color:#000;font-size:10px;font-weight:var(--seed-font-weight-regular);line-height:15px;white-space:nowrap}.seed-data-table__chipListEditor{display:flex;align-items:center;flex-wrap:wrap;gap:3px;min-width:0;width:100%}.seed-data-table__chipRemove{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:12px;height:12px;margin:0;margin-inline-start:2px;padding:0;border:none;border-radius:999px;background:0 0;color:inherit;opacity:.6;cursor:pointer;transition:opacity .12s,background-color .12s}.seed-data-table__chipRemove:hover{opacity:1;background-color:rgba(0,0,0,.08)}.seed-data-table__chipInput{flex:1 1 auto;min-width:40px;height:22px;margin:0;padding:0;border:none;outline:0;background:0 0;font-family:inherit;font-size:var(--seed-font-size-t4);color:var(--seed-color-fg-neutral);letter-spacing:-.14px}.seed-data-table__expandOverlay{box-sizing:border-box;position:absolute;top:-1px;inset-inline-start:-1px;inset-inline-end:-1px;z-index:10;min-height:calc(100% + 2px);display:flex;align-items:flex-start;padding-inline:var(--seed-dimension-x3);padding-block:var(--seed-dimension-x3);background-color:var(--seed-color-bg-layer-floating);border-radius:4px;box-shadow:none;border:1px solid #266df0;color:var(--seed-color-fg-neutral);font-size:var(--seed-font-size-t4);line-height:var(--seed-line-height-t4);letter-spacing:-.14px;cursor:default}.seed-data-table__expandOverlayText{width:100%;min-width:0;white-space:normal;word-break:break-word}.seed-data-table__cellSuffixRow{display:flex;align-items:center;gap:4px;min-width:0;width:100%}.seed-data-table__cellSuffixText{flex:1 1 0%;min-width:0;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__cellSuffixIcon{flex-shrink:0;display:inline-flex;align-items:center;color:color-mix(in srgb,var(--seed-color-fg-neutral) 55%,transparent)}.seed-data-table__toolbar{box-sizing:border-box;display:flex;align-items:center;width:100%;flex-shrink:0;min-height:49px;gap:var(--seed-dimension-x2);padding-inline:var(--seed-dimension-x3);border-top:1px solid var(--seed-color-stroke-neutral-muted)}.seed-data-table__search{position:relative;display:inline-flex;align-items:center;flex:1 1 0%;max-width:280px}.seed-data-table__search svg{position:absolute;inset-inline-start:var(--seed-dimension-x2);width:var(--seed-dimension-x4);height:var(--seed-dimension-x4);color:var(--seed-color-fg-neutral-muted);pointer-events:none}.seed-data-table__search input{width:100%;height:var(--seed-dimension-x8);padding-inline-start:var(--seed-dimension-x7);padding-inline-end:var(--seed-dimension-x2);border:none;border-radius:var(--seed-radius-r2);background-color:var(--seed-color-bg-layer-default);box-shadow:inset 0 0 0 1px var(--seed-color-stroke-neutral-weak);font-family:inherit;font-size:var(--seed-font-size-t4);color:var(--seed-color-fg-neutral);outline:0;transition:box-shadow .1s var(--seed-timing-function-easing)}.seed-data-table__search input::placeholder{color:var(--seed-color-fg-neutral-subtle)}.seed-data-table__search input:focus{box-shadow:inset 0 0 0 2px var(--seed-color-stroke-neutral-contrast)}.seed-data-table__count{flex-shrink:0;color:var(--seed-color-fg-neutral-subtle);font-size:var(--seed-font-size-t3);font-variant-numeric:tabular-nums}.seed-data-table__toolbarEnd{flex-shrink:0;margin-inline-start:auto;display:inline-flex;align-items:center;gap:var(--seed-dimension-x2)}.seed-data-table__scrollArea{position:relative;display:flex;flex-direction:column;width:100%;min-width:0;flex:1 1 auto;min-height:0;overflow-x:auto;overflow-y:auto}.seed-data-table__scrollArea[data-scrolled-start] [data-sticky-edge]{clip-path:inset(0 -38px 0 0);box-shadow:6px 0 16px 4px rgba(0,0,0,.12)}.seed-data-table__scrollArea[data-scrolled-end] [data-sticky-edge-end]{clip-path:inset(0 0 0 -38px);box-shadow:-6px 0 16px 4px rgba(0,0,0,.12)}.seed-data-table__footerCell{box-sizing:border-box;position:sticky;bottom:0;z-index:2;vertical-align:middle;padding:0;height:var(--seed-dimension-x9);background-color:var(--seed-color-bg-layer-default);border-top:1px solid var(--seed-color-stroke-neutral-muted);border-inline-end:1px solid var(--seed-color-stroke-neutral-muted);border-inline-start:none}.seed-data-table__footerCell:last-child{border-inline-end:none}.seed-data-table__footerCell .seed-data-table-column-calc-trigger{display:flex;align-items:center;gap:var(--seed-dimension-x1_5);width:100%;height:100%;min-width:0;margin:0;padding:0 var(--seed-dimension-x3);border:none;background:0 0;color:var(--seed-color-fg-neutral-subtle);font-family:inherit;font-size:var(--seed-font-size-t4);font-weight:var(--seed-font-weight-medium);white-space:nowrap;overflow:clip;cursor:pointer;transition:background-color .12s,color .12s}.seed-data-table__footerCell .seed-data-table-column-calc-trigger:hover{background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 4%,transparent);color:var(--seed-color-fg-neutral)}.seed-data-table__footerCell .seed-data-table-column-calc-trigger[data-align=right]{justify-content:flex-end}.seed-data-table__footerCell .seed-data-table-column-calc-trigger svg{flex-shrink:0;opacity:.7}.seed-data-table__footerCell .seed-data-table-column-calc-placeholder{overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__footerCell .seed-data-table-column-calc-value{min-width:0;flex-shrink:1;color:var(--seed-color-fg-neutral);font-variant-numeric:tabular-nums;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__footerCell .seed-data-table-column-calc-op{min-width:0;flex-shrink:1;color:color-mix(in srgb,var(--seed-color-fg-neutral) 63%,transparent);overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__emptyState{box-sizing:border-box;text-align:center;padding-block:var(--seed-dimension-x8);padding-inline:var(--seed-dimension-x3);color:var(--seed-color-fg-neutral-subtle);font-size:var(--seed-font-size-t4)}.seed-data-table__loadingState{box-sizing:border-box;display:flex;align-items:center;justify-content:center;gap:10px;padding-block:var(--seed-dimension-x8);padding-inline:var(--seed-dimension-x3);color:color-mix(in srgb,var(--seed-color-fg-neutral) 63%,transparent);font-size:var(--seed-font-size-t4);line-height:var(--seed-line-height-t4);font-weight:var(--seed-font-weight-medium)}.seed-data-table__loadingState[data-inline]{padding-block:0;padding-inline:0;height:var(--seed-dimension-x9)}.seed-data-table__loadingState .seed-data-table-loading-spinner{flex-shrink:0;color:color-mix(in srgb,var(--seed-color-fg-neutral) 63%,transparent);animation:rotate .6s linear infinite}.seed-data-table__addRowCell{box-sizing:border-box;padding:0;border-top:none}.seed-data-table__addRow{box-sizing:border-box;display:flex;align-items:center;width:100%;margin:0;border:none;border-top:1px solid var(--seed-color-stroke-neutral-muted);background-color:var(--seed-color-bg-layer-default);height:var(--seed-dimension-x9);gap:var(--seed-dimension-x2);padding-inline:var(--seed-dimension-x2);color:var(--seed-color-fg-neutral-subtle);font-family:inherit;font-size:var(--seed-font-size-t4);cursor:pointer;transition:background-color .12s,color .12s}.seed-data-table__addRow:hover{background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 4%,var(--seed-color-bg-layer-default));color:var(--seed-color-fg-neutral)}.seed-data-table__addRow svg{flex-shrink:0}.seed-data-table__selectionCell{text-align:center;padding:0}.seed-data-table__bulkBar{box-sizing:border-box;position:absolute;inset-inline-start:50%;transform:translateX(-50%);bottom:var(--seed-dimension-x4);z-index:30;display:flex;align-items:center;gap:var(--seed-dimension-x3);min-height:36px;padding-inline:var(--seed-dimension-x3_5);padding-block:var(--seed-dimension-x2);border-radius:var(--seed-radius-full);box-shadow:var(--seed-shadow-s3);background-color:var(--seed-color-bg-layer-floating);color:var(--seed-color-fg-neutral);font-family:inherit;font-size:var(--seed-font-size-t4);font-weight:var(--seed-font-weight-medium);white-space:nowrap}.seed-data-table__bulkBarCount{flex-shrink:0;color:var(--seed-color-fg-neutral);font-variant-numeric:tabular-nums}.seed-data-table__bulkBarClear{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:20px;height:20px;margin:0;padding:2px;border:none;border-radius:6px;background:0 0;font-family:inherit;color:color-mix(in srgb,var(--seed-color-fg-neutral) 55%,transparent);cursor:pointer;transition:background-color .2s,color .2s}.seed-data-table__bulkBarClear:hover{background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 8%,transparent);color:var(--seed-color-fg-neutral)}.seed-data-table__bulkBarActions{display:flex;align-items:center;flex-shrink:0;gap:var(--seed-dimension-x3);padding-inline-start:var(--seed-dimension-x3);border-inline-start:1px solid color-mix(in srgb,var(--seed-color-fg-neutral) 16%,transparent)}.seed-data-table__root--surface_card{border-color:var(--seed-color-stroke-neutral-muted);background-color:var(--seed-color-bg-layer-default);border-radius:var(--seed-radius-r3)}.seed-data-table__root--surface_bleed{border-color:var(--seed-color-bg-transparent);background-color:var(--seed-color-bg-transparent)}.seed-data-table__row--interactive_true{transition:background-color .12s}.seed-data-table__row--interactive_true:is(:hover,[data-hover]){background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 3%,transparent);--seed-data-table-row-bg:color-mix(in srgb, var(--seed-color-fg-neutral) 3%, var(--seed-color-bg-layer-default))}");
4142
+ __insertCSS(".seed-data-table__root{box-sizing:border-box;position:relative;display:flex;flex-direction:column;width:100%;border-width:1px;border-style:solid;font-family:Inter,-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif}.seed-data-table__table{width:100%;border-collapse:separate;border-spacing:0;table-layout:fixed}.seed-data-table__headerCell{box-sizing:border-box;position:sticky;top:0;z-index:2;vertical-align:middle;text-align:start;padding:0;height:var(--seed-dimension-x10);background-color:var(--seed-color-bg-layer-default);border-top:1px solid var(--seed-color-stroke-neutral-muted);border-bottom:1px solid var(--seed-color-stroke-neutral-muted);border-inline-end:1px solid var(--seed-color-stroke-neutral-muted);border-inline-start:none;color:var(--seed-color-fg-neutral);font-size:var(--seed-font-size-t4);line-height:var(--seed-line-height-t4);font-weight:var(--seed-font-weight-medium);letter-spacing:-.14px}.seed-data-table__headerCell:last-child{border-inline-end:none}.seed-data-table__headerCell[data-sortable]{cursor:pointer;user-select:none}.seed-data-table__headerCell [data-chevron]{opacity:0;transition:opacity .12s}.seed-data-table__headerCell[data-sortable]:hover [data-chevron]{opacity:.6}.seed-data-table__headerCell[data-sorted] [data-chevron]{opacity:1;color:var(--seed-color-fg-neutral)}.seed-data-table__headerCell:hover [data-column-menu]{opacity:1}.seed-data-table__headerCell [data-column-menu]:focus-visible,.seed-data-table__headerCell [data-column-menu][data-open]{opacity:1}.seed-data-table__headerCell[data-dragging]{opacity:.5}.seed-data-table__headerCell[data-sticky]{position:sticky;z-index:3;background-color:var(--seed-color-bg-layer-default)}.seed-data-table__headerCell{outline:var(--seed-dimension-x0_5) solid transparent;outline-offset:calc(var(--seed-dimension-x0_5) * -1)}.seed-data-table__headerCell:is(:focus-visible,[data-focus-visible]){outline:var(--seed-dimension-x0_5) solid var(--seed-color-stroke-focus-ring);outline-offset:calc(var(--seed-dimension-x0_5) * -1)}.seed-data-table__headerCell .seed-data-table-resize-handle{position:absolute;top:0;inset-inline-end:calc(7px / -2);width:7px;height:100%;z-index:4;display:flex;align-items:center;justify-content:center;cursor:col-resize;touch-action:none}.seed-data-table__headerCell .seed-data-table-resize-handle-inner{width:3px;height:100%;border-radius:3px;background-color:#0298d9;opacity:0;transition:opacity .1s}.seed-data-table__headerCell .seed-data-table-resize-handle:hover .seed-data-table-resize-handle-inner,.seed-data-table__headerCell .seed-data-table-resize-handle[data-resizing] .seed-data-table-resize-handle-inner{opacity:1}.seed-data-table__headerCellInner{box-sizing:border-box;display:flex;align-items:center;width:100%;height:100%;min-width:0;gap:var(--seed-dimension-x1_5);padding-inline:var(--seed-dimension-x3)}.seed-data-table__headerCellLabel{min-width:0;flex:1 1 0%;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__headerCellIcon{flex-shrink:0;margin-inline-start:auto;display:inline-flex;align-items:center;justify-content:center;width:var(--seed-dimension-x4);height:var(--seed-dimension-x4);color:var(--seed-color-fg-neutral-subtle);border:none;background:0 0;padding:0;font:inherit;cursor:pointer}.seed-data-table__headerCellIcon[data-active]{color:var(--seed-color-fg-neutral)}.seed-data-table__headerCellIcon[data-column-menu]{opacity:0;transition:opacity .12s}.seed-data-table__row{position:relative;background-color:var(--seed-color-bg-layer-default);--seed-data-table-row-bg:var(--seed-color-bg-layer-default)}.seed-data-table__row[data-clickable]{cursor:pointer}.seed-data-table__row:is([aria-selected=true],[data-selected]){background-color:color-mix(in srgb,#0298d9 10%,var(--seed-color-bg-layer-default));--seed-data-table-row-bg:color-mix(in srgb, #0298d9 10%, var(--seed-color-bg-layer-default))}.seed-data-table__row:is([aria-selected=true],[data-selected]):is(:hover,[data-hover]){background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 3%,color-mix(in srgb,#0298d9 10%,var(--seed-color-bg-layer-default)));--seed-data-table-row-bg:color-mix(in srgb, var(--seed-color-fg-neutral) 3%, color-mix(in srgb, #0298d9 10%, var(--seed-color-bg-layer-default)))}.seed-data-table__cell{box-sizing:border-box;position:relative;vertical-align:middle;text-align:start;height:var(--seed-dimension-x9);border-bottom:1px solid var(--seed-color-stroke-neutral-muted);border-inline-end:1px solid var(--seed-color-stroke-neutral-muted);border-top:none;border-inline-start:none;padding-block:0;padding-inline:var(--seed-dimension-x3);color:var(--seed-color-fg-neutral);font-size:var(--seed-font-size-t4);line-height:var(--seed-line-height-t4);font-weight:var(--seed-font-weight-regular);letter-spacing:-.14px;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__cell:not([data-editable]){user-select:none}.seed-data-table__cell:last-child{border-inline-end:none}tbody tr:last-child .seed-data-table__cell{border-bottom:none}.seed-data-table__cell[data-numeric]{text-align:end;font-variant-numeric:tabular-nums}.seed-data-table__cell[data-sticky]{position:sticky;z-index:1;background-color:var(--seed-data-table-row-bg)}.seed-data-table__cell[data-overlay-open]{overflow:visible;z-index:20}.seed-data-table__cell[data-editable]{cursor:default}.seed-data-table__cell .seed-data-table-edit-picker{display:flex;align-items:center;gap:var(--seed-dimension-x1_5);min-width:0}.seed-data-table__cell .seed-data-table-edit-pending{flex-shrink:0;color:var(--seed-color-fg-neutral-subtle);animation:rotate .6s linear infinite}.seed-data-table__cell .seed-data-table-edit-error{position:absolute;top:100%;inset-inline-start:var(--seed-dimension-x3);inset-inline-end:var(--seed-dimension-x3);z-index:2;padding-top:2px;font-size:12px;line-height:1.3;color:var(--seed-color-fg-critical);overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__entity{display:flex;align-items:center;min-width:0;gap:var(--seed-dimension-x1_5)}.seed-data-table__entityName{min-width:0;font-weight:var(--seed-font-weight-medium);overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__entityName[data-clickable]{cursor:pointer;border:none;background:0 0;padding:0;margin:0;font-family:inherit;font-size:inherit;line-height:inherit;color:inherit;text-align:start}.seed-data-table__entityName[data-clickable]:is(:hover,[data-hover]){text-decoration:underline}.seed-data-table__tagList{display:flex;align-items:center;gap:var(--seed-dimension-x1_5);overflow:hidden;min-width:0}.seed-data-table__entityActions{display:flex;align-items:center;gap:6px;margin-inline-start:auto;flex-shrink:0;opacity:0;transition:opacity .15s}tr:hover .seed-data-table__entityActions{opacity:1}.seed-data-table__entityActions:focus-within{opacity:1}.seed-data-table__entityAction{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;margin:0;padding:2px;border:none;border-radius:6px;background:0 0;font-family:inherit;color:color-mix(in srgb,var(--seed-color-fg-neutral) 55%,transparent);cursor:pointer;flex-shrink:0;transition:background-color .2s,color .2s,box-shadow .2s}.seed-data-table__entityAction:hover{background:color-mix(in srgb,var(--seed-color-fg-neutral) 4%,transparent);color:var(--seed-color-fg-neutral)}.seed-data-table__link{color:var(--seed-color-fg-neutral);text-decoration:none;min-width:0;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__link:is(:hover,[data-hover]){text-decoration:underline}.seed-data-table__chip{box-sizing:border-box;display:inline-flex;align-items:center;flex-shrink:0;max-width:100%;height:22px;padding:0 4px;border-radius:7px;font-size:13px;font-weight:var(--seed-font-weight-medium);line-height:15px;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__chipList{position:relative;display:flex;align-items:center;flex-wrap:nowrap;gap:3px;overflow:hidden;min-width:0;width:100%}.seed-data-table__chipOverflow{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;height:20px;padding:0 4px;border-radius:6px;background-color:#f6f7f7;color:#000;font-size:10px;font-weight:var(--seed-font-weight-regular);line-height:15px;white-space:nowrap}.seed-data-table__chipListEditor{display:flex;align-items:center;flex-wrap:wrap;gap:3px;min-width:0;width:100%}.seed-data-table__chipRemove{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:12px;height:12px;margin:0;margin-inline-start:2px;padding:0;border:none;border-radius:999px;background:0 0;color:inherit;opacity:.6;cursor:pointer;transition:opacity .12s,background-color .12s}.seed-data-table__chipRemove:hover{opacity:1;background-color:rgba(0,0,0,.08)}.seed-data-table__chipInput{flex:1 1 auto;min-width:40px;height:22px;margin:0;padding:0;border:none;outline:0;background:0 0;font-family:inherit;font-size:var(--seed-font-size-t4);color:var(--seed-color-fg-neutral);letter-spacing:-.14px}.seed-data-table__expandOverlay{box-sizing:border-box;position:absolute;top:-1px;inset-inline-start:-1px;inset-inline-end:-1px;z-index:10;min-height:calc(100% + 2px);display:flex;align-items:flex-start;padding-inline:var(--seed-dimension-x3);padding-block:var(--seed-dimension-x3);background-color:var(--seed-color-bg-layer-floating);border-radius:4px;box-shadow:none;border:1px solid #266df0;color:var(--seed-color-fg-neutral);font-size:var(--seed-font-size-t4);line-height:var(--seed-line-height-t4);letter-spacing:-.14px;cursor:default}.seed-data-table__expandOverlayText{width:100%;min-width:0;white-space:normal;word-break:break-word}.seed-data-table__cellSuffixRow{display:flex;align-items:center;gap:4px;min-width:0;width:100%}.seed-data-table__cellSuffixText{flex:1 1 0%;min-width:0;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__cellSuffixIcon{flex-shrink:0;display:inline-flex;align-items:center;color:color-mix(in srgb,var(--seed-color-fg-neutral) 55%,transparent)}.seed-data-table__toolbar{box-sizing:border-box;display:flex;align-items:center;width:100%;flex-shrink:0;min-height:49px;gap:var(--seed-dimension-x2);padding-inline:var(--seed-dimension-x3);border-top:1px solid var(--seed-color-stroke-neutral-muted)}.seed-data-table__search{position:relative;display:inline-flex;align-items:center;flex:1 1 0%;max-width:280px}.seed-data-table__search svg{position:absolute;inset-inline-start:var(--seed-dimension-x2);width:var(--seed-dimension-x4);height:var(--seed-dimension-x4);color:var(--seed-color-fg-neutral-muted);pointer-events:none}.seed-data-table__search input{width:100%;height:var(--seed-dimension-x8);padding-inline-start:var(--seed-dimension-x7);padding-inline-end:var(--seed-dimension-x2);border:none;border-radius:var(--seed-radius-r2);background-color:var(--seed-color-bg-layer-default);box-shadow:inset 0 0 0 1px var(--seed-color-stroke-neutral-weak);font-family:inherit;font-size:var(--seed-font-size-t4);color:var(--seed-color-fg-neutral);outline:0;transition:box-shadow .1s var(--seed-timing-function-easing)}.seed-data-table__search input::placeholder{color:var(--seed-color-fg-neutral-subtle)}.seed-data-table__search input:focus{box-shadow:inset 0 0 0 2px var(--seed-color-stroke-neutral-contrast)}.seed-data-table__count{flex-shrink:0;color:var(--seed-color-fg-neutral-subtle);font-size:var(--seed-font-size-t3);font-variant-numeric:tabular-nums}.seed-data-table__toolbarEnd{flex-shrink:0;margin-inline-start:auto;display:inline-flex;align-items:center;gap:var(--seed-dimension-x2)}.seed-data-table__scrollArea{position:relative;display:flex;flex-direction:column;width:100%;min-width:0;flex:1 1 auto;min-height:0;overflow-x:auto;overflow-y:auto}.seed-data-table__scrollArea[data-scrolled-start] [data-sticky-edge]{clip-path:inset(0 -38px 0 0);box-shadow:6px 0 16px 4px rgba(0,0,0,.12)}.seed-data-table__scrollArea[data-scrolled-end] [data-sticky-edge-end]{clip-path:inset(0 0 0 -38px);box-shadow:-6px 0 16px 4px rgba(0,0,0,.12)}.seed-data-table__footerCell{box-sizing:border-box;position:sticky;bottom:0;z-index:2;vertical-align:middle;padding:0;height:var(--seed-dimension-x9);background-color:var(--seed-color-bg-layer-default);border-top:1px solid var(--seed-color-stroke-neutral-muted);border-inline-end:1px solid var(--seed-color-stroke-neutral-muted);border-inline-start:none}.seed-data-table__footerCell:last-child{border-inline-end:none}.seed-data-table__footerCell[data-sticky]{z-index:3}.seed-data-table__footerCell .seed-data-table-column-calc-trigger{display:flex;align-items:center;gap:var(--seed-dimension-x1_5);width:100%;height:100%;min-width:0;margin:0;padding:0 var(--seed-dimension-x3);border:none;background:0 0;color:var(--seed-color-fg-neutral-subtle);font-family:inherit;font-size:var(--seed-font-size-t4);font-weight:var(--seed-font-weight-medium);white-space:nowrap;overflow:clip;cursor:pointer;transition:background-color .12s,color .12s}.seed-data-table__footerCell .seed-data-table-column-calc-trigger:hover{background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 4%,transparent);color:var(--seed-color-fg-neutral)}.seed-data-table__footerCell .seed-data-table-column-calc-trigger[data-align=right]{justify-content:flex-end}.seed-data-table__footerCell .seed-data-table-column-calc-trigger svg{flex-shrink:0;opacity:.7}.seed-data-table__footerCell .seed-data-table-column-calc-placeholder{overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__footerCell .seed-data-table-column-calc-value{min-width:0;flex-shrink:1;color:var(--seed-color-fg-neutral);font-variant-numeric:tabular-nums;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__footerCell .seed-data-table-column-calc-op{min-width:0;flex-shrink:1;color:color-mix(in srgb,var(--seed-color-fg-neutral) 63%,transparent);overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__emptyState{box-sizing:border-box;text-align:center;padding-block:var(--seed-dimension-x8);padding-inline:var(--seed-dimension-x3);color:var(--seed-color-fg-neutral-subtle);font-size:var(--seed-font-size-t4)}.seed-data-table__loadingState{box-sizing:border-box;display:flex;align-items:center;justify-content:center;gap:10px;padding-block:var(--seed-dimension-x8);padding-inline:var(--seed-dimension-x3);color:color-mix(in srgb,var(--seed-color-fg-neutral) 63%,transparent);font-size:var(--seed-font-size-t4);line-height:var(--seed-line-height-t4);font-weight:var(--seed-font-weight-medium)}.seed-data-table__loadingState[data-inline]{padding-block:0;padding-inline:0;height:var(--seed-dimension-x9)}.seed-data-table__loadingState .seed-data-table-loading-spinner{flex-shrink:0;color:color-mix(in srgb,var(--seed-color-fg-neutral) 63%,transparent);animation:rotate .6s linear infinite}.seed-data-table__addRowCell{box-sizing:border-box;padding:0;border-top:none}.seed-data-table__addRow{box-sizing:border-box;display:flex;align-items:center;width:100%;margin:0;border:none;border-top:1px solid var(--seed-color-stroke-neutral-muted);background-color:var(--seed-color-bg-layer-default);height:var(--seed-dimension-x9);gap:var(--seed-dimension-x2);padding-inline:var(--seed-dimension-x2);color:var(--seed-color-fg-neutral-subtle);font-family:inherit;font-size:var(--seed-font-size-t4);cursor:pointer;transition:background-color .12s,color .12s}.seed-data-table__addRow:hover{background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 4%,var(--seed-color-bg-layer-default));color:var(--seed-color-fg-neutral)}.seed-data-table__addRow svg{flex-shrink:0}.seed-data-table__selectionCell{text-align:center;padding:0}.seed-data-table__bulkBar{box-sizing:border-box;position:absolute;inset-inline-start:50%;transform:translateX(-50%);bottom:var(--seed-dimension-x4);z-index:30;display:flex;align-items:center;gap:var(--seed-dimension-x3);min-height:36px;padding-inline:var(--seed-dimension-x3_5);padding-block:var(--seed-dimension-x2);border-radius:var(--seed-radius-full);box-shadow:var(--seed-shadow-s3);background-color:var(--seed-color-bg-layer-floating);color:var(--seed-color-fg-neutral);font-family:inherit;font-size:var(--seed-font-size-t4);font-weight:var(--seed-font-weight-medium);white-space:nowrap}.seed-data-table__bulkBar[data-above-footer]{bottom:calc(var(--seed-dimension-x4) + var(--seed-dimension-x9))}.seed-data-table__bulkBarCount{flex-shrink:0;color:var(--seed-color-fg-neutral);font-variant-numeric:tabular-nums}.seed-data-table__bulkBarClear{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:20px;height:20px;margin:0;padding:2px;border:none;border-radius:6px;background:0 0;font-family:inherit;color:color-mix(in srgb,var(--seed-color-fg-neutral) 55%,transparent);cursor:pointer;transition:background-color .2s,color .2s}.seed-data-table__bulkBarClear:hover{background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 8%,transparent);color:var(--seed-color-fg-neutral)}.seed-data-table__bulkBarActions{display:flex;align-items:center;flex-shrink:0;gap:var(--seed-dimension-x3);padding-inline-start:var(--seed-dimension-x3);border-inline-start:1px solid color-mix(in srgb,var(--seed-color-fg-neutral) 16%,transparent)}.seed-data-table__root--surface_card{border-color:var(--seed-color-stroke-neutral-muted);background-color:var(--seed-color-bg-layer-default);border-radius:var(--seed-radius-r3)}.seed-data-table__root--surface_bleed{border-color:var(--seed-color-bg-transparent);background-color:var(--seed-color-bg-transparent)}.seed-data-table__row--interactive_true{transition:background-color .12s}.seed-data-table__row--interactive_true:is(:hover,[data-hover]){background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 3%,transparent);--seed-data-table-row-bg:color-mix(in srgb, var(--seed-color-fg-neutral) 3%, var(--seed-color-bg-layer-default))}");
4130
4143
 
4131
4144
  const createClassName = (className, variants, compoundVariants = [])=>{
4132
4145
  const variantKeys = Object.keys(variants);
@@ -4480,6 +4493,10 @@ const { ClassNamesProvider, withContext: withContext$1, useClassNames } = create
4480
4493
  });
4481
4494
  }
4482
4495
 
4496
+ /** Attribute on the floating-ui-portaled option list of the `select`/`reference`/`actor`
4497
+ * editors. The portal lands in `document.body`, outside the cell and its expand overlay,
4498
+ * so `body-cells.tsx`'s outside-click detector checks for this marker to avoid reading an
4499
+ * option click as "outside" and cancelling the edit before it commits. */ const EDITOR_PORTAL_ATTR = "data-datatable-editor-portal";
4483
4500
  /** The raw value a live editor reads, distinct from `DataTableColumn.value` (the
4484
4501
  * accessor sort/search/filter/export share): `editValue` returns whatever TYPE the
4485
4502
  * editor itself expects -- a real `boolean` for `editor: "switch"`/`type:
@@ -4628,6 +4645,7 @@ function SelectEditor({ column, value, pending, onCommit, onCancel }) {
4628
4645
  ]
4629
4646
  }),
4630
4647
  /*#__PURE__*/ jsxRuntime.jsx(SelectPositioner, {
4648
+ [EDITOR_PORTAL_ATTR]: "",
4631
4649
  children: /*#__PURE__*/ jsxRuntime.jsxs(SelectContent, {
4632
4650
  children: [
4633
4651
  searchable && /*#__PURE__*/ jsxRuntime.jsx(SelectSearchField, {
@@ -4703,6 +4721,7 @@ function ReferenceEditor({ column, value, pending, onCommit, onCancel }) {
4703
4721
  ]
4704
4722
  }),
4705
4723
  /*#__PURE__*/ jsxRuntime.jsx(SelectPositioner, {
4724
+ [EDITOR_PORTAL_ATTR]: "",
4706
4725
  children: /*#__PURE__*/ jsxRuntime.jsxs(SelectContent, {
4707
4726
  children: [
4708
4727
  /*#__PURE__*/ jsxRuntime.jsx(SelectSearchField, {
@@ -5318,8 +5337,14 @@ function ColumnBodyCells({ columns, row, classNames, locale, selectable, stickyF
5318
5337
  function isInside(target) {
5319
5338
  return (cellRef.current?.contains(target) ?? false) || (popoverRef.current?.contains(target) ?? false) || (expandOverlayRef.current?.contains(target) ?? false);
5320
5339
  }
5340
+ // The select/reference/actor editor's option list is portaled to `document.body` by
5341
+ // floating-ui, outside both `cellRef` and `expandOverlayRef`; `editors.tsx` marks its
5342
+ // positioner with `EDITOR_PORTAL_ATTR`, so a click on an option is not an outside click.
5343
+ function isInsideEditorPortal(target) {
5344
+ return target instanceof Element && target.closest(`[${EDITOR_PORTAL_ATTR}]`) != null;
5345
+ }
5321
5346
  function handlePointerDown(event) {
5322
- if (!isInside(event.target)) {
5347
+ if (!isInside(event.target) && !isInsideEditorPortal(event.target)) {
5323
5348
  setOverlayOpen(false);
5324
5349
  setPopoverStyle(null);
5325
5350
  closePeek();
@@ -5658,13 +5683,14 @@ const DataTableBulkBarClear = withContext$1(Primitive.button, "bulkBarClear");
5658
5683
  * exactly this reason -- see `data-table.ts`'s own `bulkBar` slot comment for why its
5659
5684
  * geometry borrows `contextual-floating-button`'s already-measured vars rather than a
5660
5685
  * guessed literal.
5661
- */ function DataTableBulkBar({ clearLabel = "Clear selection", children }) {
5686
+ */ function DataTableBulkBar({ clearLabel = "Clear selection", aboveFooter, children }) {
5662
5687
  const { selectedIds, clearSelection } = useDataTableContext();
5663
5688
  if (selectedIds.length === 0) return null;
5664
5689
  return /*#__PURE__*/ jsxRuntime.jsxs(DataTableBulkBarRoot, {
5665
5690
  role: "toolbar",
5666
5691
  "aria-label": "Bulk actions",
5667
5692
  "aria-orientation": "horizontal",
5693
+ "data-above-footer": aboveFooter ? "" : undefined,
5668
5694
  children: [
5669
5695
  /*#__PURE__*/ jsxRuntime.jsxs(DataTableBulkBarCount, {
5670
5696
  "aria-live": "polite",
@@ -5924,7 +5950,11 @@ const DEFAULT_SORT_ICON = {
5924
5950
  * component (not inlined in `DataTableInner`'s render) so it alone re-renders when
5925
5951
  * `visibleColumnOrder`/labels/widths change, without also re-deriving `sortedData`'s
5926
5952
  * render above it. */ function ColumnHeaderCells({ columns, columnMenu, reorderable, resizable, sortIcon, selectable, stickyFirst, stickyLast }) {
5927
- const { draggingColumnKey, beginColumnDrag, dragOverColumn, endColumnDrag } = useDataTableContext();
5953
+ const { draggingColumnKey, beginColumnDrag, dragOverColumn, endColumnDrag, visibleColumnOrder } = useDataTableContext();
5954
+ // Move left/right operate on the visible order, but never across the `actions`
5955
+ // column (the raw order re-pins it last, so a move onto/past it is a silent no-op).
5956
+ const actionsKey = columns.find((column)=>column.actions)?.key;
5957
+ const movableKeys = visibleColumnOrder.filter((key)=>key !== actionsKey);
5928
5958
  const effective = useEffectiveColumns(columns, {
5929
5959
  selectable,
5930
5960
  stickyFirst
@@ -5972,6 +6002,8 @@ const DEFAULT_SORT_ICON = {
5972
6002
  columnMenu && /*#__PURE__*/ jsxRuntime.jsx(ColumnMenu, {
5973
6003
  column: column,
5974
6004
  label: label,
6005
+ canMoveLeft: movableKeys.indexOf(column.key) > 0,
6006
+ canMoveRight: movableKeys.indexOf(column.key) !== -1 && movableKeys.indexOf(column.key) < movableKeys.length - 1,
5975
6007
  onRename: ()=>setRenamingKey(column.key)
5976
6008
  })
5977
6009
  ]
@@ -6063,8 +6095,8 @@ function ColumnRenameInput({ column, initialLabel, onDone }) {
6063
6095
  * `data-table.ts`) -- crisp's own header shows the trigger only on hover, not
6064
6096
  * permanently, so this one carries its own marker attribute distinct from that
6065
6097
  * slot's OTHER occupants (the sort chevron, the filter trigger), which stay visible
6066
- * under their own separate rules regardless of hover. */ function ColumnMenu({ column, label, onRename }) {
6067
- const { moveColumn, hideColumn, isColumnPinned, togglePinColumn, sort, clearSort } = useDataTableContext();
6098
+ * under their own separate rules regardless of hover. */ function ColumnMenu({ column, label, canMoveLeft, canMoveRight, onRename }) {
6099
+ const { moveColumn, hideColumn, isColumnPinned, togglePinColumn, sort, setSort, clearSort } = useDataTableContext();
6068
6100
  const columnLabel = typeof label === "string" ? label : column.key;
6069
6101
  const pinned = isColumnPinned(column.key);
6070
6102
  // Attio/GRC's "Remove sort" (live-review fix D) -- the header's own click-to-sort
@@ -6115,40 +6147,68 @@ function ColumnRenameInput({ column, initialLabel, onDone }) {
6115
6147
  },
6116
6148
  children: /*#__PURE__*/ jsxRuntime.jsxs(MenuScrollArea, {
6117
6149
  children: [
6118
- /*#__PURE__*/ jsxRuntime.jsx(MenuItem, {
6119
- onClick: onRename,
6120
- children: /*#__PURE__*/ jsxRuntime.jsx(MenuItemLabel, {
6121
- children: "Rename"
6122
- })
6150
+ column.sortable && /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
6151
+ children: [
6152
+ /*#__PURE__*/ jsxRuntime.jsx(MenuItem, {
6153
+ role: "menuitemradio",
6154
+ "aria-checked": isSorted && sort?.dir === "asc",
6155
+ onClick: ()=>setSort({
6156
+ key: column.key,
6157
+ dir: "asc"
6158
+ }),
6159
+ children: /*#__PURE__*/ jsxRuntime.jsx(MenuItemLabel, {
6160
+ children: "Sort ascending"
6161
+ })
6162
+ }),
6163
+ /*#__PURE__*/ jsxRuntime.jsx(MenuItem, {
6164
+ role: "menuitemradio",
6165
+ "aria-checked": isSorted && sort?.dir === "desc",
6166
+ onClick: ()=>setSort({
6167
+ key: column.key,
6168
+ dir: "desc"
6169
+ }),
6170
+ children: /*#__PURE__*/ jsxRuntime.jsx(MenuItemLabel, {
6171
+ children: "Sort descending"
6172
+ })
6173
+ }),
6174
+ isSorted && /*#__PURE__*/ jsxRuntime.jsx(MenuItem, {
6175
+ onClick: clearSort,
6176
+ children: /*#__PURE__*/ jsxRuntime.jsx(MenuItemLabel, {
6177
+ children: "Clear sort"
6178
+ })
6179
+ })
6180
+ ]
6123
6181
  }),
6124
6182
  /*#__PURE__*/ jsxRuntime.jsx(MenuItem, {
6183
+ disabled: !canMoveLeft,
6125
6184
  onClick: ()=>moveColumn(column.key, "left"),
6126
6185
  children: /*#__PURE__*/ jsxRuntime.jsx(MenuItemLabel, {
6127
6186
  children: "Move left"
6128
6187
  })
6129
6188
  }),
6130
6189
  /*#__PURE__*/ jsxRuntime.jsx(MenuItem, {
6190
+ disabled: !canMoveRight,
6131
6191
  onClick: ()=>moveColumn(column.key, "right"),
6132
6192
  children: /*#__PURE__*/ jsxRuntime.jsx(MenuItemLabel, {
6133
6193
  children: "Move right"
6134
6194
  })
6135
6195
  }),
6136
- isSorted && /*#__PURE__*/ jsxRuntime.jsx(MenuItem, {
6137
- onClick: clearSort,
6196
+ /*#__PURE__*/ jsxRuntime.jsx(MenuItem, {
6197
+ onClick: ()=>togglePinColumn(column.key),
6138
6198
  children: /*#__PURE__*/ jsxRuntime.jsx(MenuItemLabel, {
6139
- children: "Clear sort"
6199
+ children: pinned ? "Unpin column" : "Pin column"
6140
6200
  })
6141
6201
  }),
6142
6202
  /*#__PURE__*/ jsxRuntime.jsx(MenuItem, {
6143
- onClick: ()=>togglePinColumn(column.key),
6203
+ onClick: onRename,
6144
6204
  children: /*#__PURE__*/ jsxRuntime.jsx(MenuItemLabel, {
6145
- children: pinned ? "Unpin column" : "Pin column"
6205
+ children: "Edit column label"
6146
6206
  })
6147
6207
  }),
6148
6208
  /*#__PURE__*/ jsxRuntime.jsx(MenuItem, {
6149
6209
  onClick: ()=>hideColumn(column.key),
6150
6210
  children: /*#__PURE__*/ jsxRuntime.jsx(MenuItemLabel, {
6151
- children: "Hide column"
6211
+ children: "Hide from view"
6152
6212
  })
6153
6213
  })
6154
6214
  ]
@@ -11193,7 +11253,13 @@ const toDateOrNull = (v)=>{
11193
11253
  return f.op === "before" ? d < cd : d > cd;
11194
11254
  }
11195
11255
  const t = asText(raw).toLowerCase();
11196
- if (f.op === "isanyof") return (f.values ?? []).some((v)=>v.toLowerCase() === t);
11256
+ if (f.op === "isanyof") {
11257
+ const wanted = (f.values ?? []).map((v)=>v.toLowerCase());
11258
+ const cells = Array.isArray(raw) ? raw.map((x)=>asText(x).toLowerCase()) : [
11259
+ t
11260
+ ];
11261
+ return cells.some((c)=>wanted.includes(c));
11262
+ }
11197
11263
  const v = f.value.trim().toLowerCase();
11198
11264
  if (f.op === "contains") return t.includes(v);
11199
11265
  if (f.op === "doesnotcontain") return !t.includes(v);
@@ -12186,6 +12252,7 @@ function DataTableInner(props, ref) {
12186
12252
  }),
12187
12253
  selectable && /*#__PURE__*/ jsxRuntime.jsx(DataTableBulkBar, {
12188
12254
  clearLabel: clearSelectionLabel,
12255
+ aboveFooter: showFooter || !!onAddRow,
12189
12256
  children: bulkActions
12190
12257
  })
12191
12258
  ]
package/dist/index.d.ts CHANGED
@@ -546,7 +546,7 @@ interface DataTableProps<TRow extends {
546
546
  /** `virtualized`일 때 한 행의 높이(px)입니다. 레시피의 행 높이(36px)와 일치해야 합니다.
547
547
  * @default 36 */
548
548
  rowHeight?: number;
549
- /** `virtualized`일 때 뷰포트 위/아래로 추가 렌더링할 행 수입니다. @default 8 */
549
+ /** `virtualized`일 때 뷰포트 위/아래로 추가 렌더링할 행 수입니다. @default 16 */
550
550
  overscan?: number;
551
551
  }
552
552
  /**
@@ -602,6 +602,8 @@ declare namespace DataTableViewsControl {
602
602
  interface DataTableBulkBarProps {
603
603
  /** The clear ("x") button's accessible name. @default "Clear selection" */
604
604
  clearLabel?: string;
605
+ /** Lift the pill above a sticky footer (calc row / add-row) instead of overlapping it. */
606
+ aboveFooter?: boolean;
605
607
  /**
606
608
  * The consumer's own bulk-action buttons, as a render prop receiving the current
607
609
  * selected row ids -- e.g. `<DataTableBulkBar>{(ids) => <ActionButton
@@ -619,7 +621,7 @@ interface DataTableBulkBarProps {
619
621
  * geometry borrows `contextual-floating-button`'s already-measured vars rather than a
620
622
  * guessed literal.
621
623
  */
622
- declare function DataTableBulkBar({ clearLabel, children, }: DataTableBulkBarProps): react_jsx_runtime.JSX.Element | null;
624
+ declare function DataTableBulkBar({ clearLabel, aboveFooter, children, }: DataTableBulkBarProps): react_jsx_runtime.JSX.Element | null;
623
625
 
624
626
  type ResizablePanelSide = "left" | "right";
625
627
 
package/dist/index.js CHANGED
@@ -1168,7 +1168,7 @@ function isStringArray(value) {
1168
1168
  // per-row measurement, no ResizeObserver per row.
1169
1169
  /** The recipe's own row height (`--seed-dimension-x9` = 36px, `row.height`). */ const DEFAULT_VIRTUAL_ROW_HEIGHT = 36;
1170
1170
  /** Rows rendered beyond each edge of the viewport, so a fast scroll never outruns the
1171
- * render and flashes an empty gap. */ const DEFAULT_VIRTUAL_OVERSCAN = 8;
1171
+ * render and flashes an empty gap. */ const DEFAULT_VIRTUAL_OVERSCAN = 16;
1172
1172
  /** Distance from the bottom (px) at which `onLoadMore` fires in virtualized mode --
1173
1173
  * the same 160px look-ahead the IntersectionObserver's rootMargin gives a non-
1174
1174
  * virtualized table. */ const LOAD_MORE_THRESHOLD = 160;
@@ -1321,13 +1321,15 @@ const EMPTY_RECORD = {};
1321
1321
  })), [
1322
1322
  setColumnWidths
1323
1323
  ]);
1324
- const moveColumn = useCallback((key, direction)=>setRawOrder((current)=>moveColumnKey(current ?? columnKeys, key, direction)), [
1324
+ const moveColumn = useCallback((key, direction)=>setRawOrder((current)=>moveColumnKey(reconcileColumnOrder(current ?? columnKeys, columnKeys, actionsColumnKey), key, direction)), [
1325
1325
  setRawOrder,
1326
- columnKeys
1326
+ columnKeys,
1327
+ actionsColumnKey
1327
1328
  ]);
1328
- const reorderColumn = useCallback((dragKey, dropKey)=>setRawOrder((current)=>reorderColumnKey(current ?? columnKeys, dragKey, dropKey)), [
1329
+ const reorderColumn = useCallback((dragKey, dropKey)=>setRawOrder((current)=>reorderColumnKey(reconcileColumnOrder(current ?? columnKeys, columnKeys, actionsColumnKey), dragKey, dropKey)), [
1329
1330
  setRawOrder,
1330
- columnKeys
1331
+ columnKeys,
1332
+ actionsColumnKey
1331
1333
  ]);
1332
1334
  // -- drag-to-reorder ---------------------------------------------------------------
1333
1335
  // Live state only (which column is currently being dragged) -- the styled layer's
@@ -1495,11 +1497,11 @@ function sameCell(a, id, key) {
1495
1497
  key
1496
1498
  });
1497
1499
  result.then(()=>{
1498
- setPendingCell(null);
1499
- setEditingCell(null);
1500
+ setPendingCell((c)=>sameCell(c, id, key) ? null : c);
1501
+ setEditingCell((c)=>sameCell(c, id, key) ? null : c);
1500
1502
  }, (err)=>{
1501
- setPendingCell(null);
1502
- setEditingCell(null);
1503
+ setPendingCell((c)=>sameCell(c, id, key) ? null : c);
1504
+ setEditingCell((c)=>sameCell(c, id, key) ? null : c);
1503
1505
  setEditError({
1504
1506
  id,
1505
1507
  key,
@@ -2425,9 +2427,20 @@ DataTableCell$1.displayName = "DataTableCell";
2425
2427
 
2426
2428
  const EMPTY_VIEWS = [];
2427
2429
  function readStoredViews(storageKey) {
2428
- if (!storageKey || typeof window === "undefined") return EMPTY_VIEWS;
2430
+ if (!storageKey || typeof window === "undefined") return null;
2429
2431
  try {
2430
- return deserializeDataTableViews(window.localStorage.getItem(storageKey));
2432
+ const raw = window.localStorage.getItem(storageKey);
2433
+ if (raw === null) return null;
2434
+ // Only a well-formed array counts as "stored" -- `[]` is a real answer (the user
2435
+ // deleted every view), whereas garbage/non-array JSON is treated as absent so the
2436
+ // defaults still seed.
2437
+ let parsed;
2438
+ try {
2439
+ parsed = JSON.parse(raw);
2440
+ } catch {
2441
+ return null;
2442
+ }
2443
+ return Array.isArray(parsed) ? deserializeDataTableViews(raw) : null;
2431
2444
  } catch {
2432
2445
  // A private-browsing tab / blocked storage throws on access, not just on quota --
2433
2446
  // this hook degrades to in-memory-only rather than crash the table over it.
@@ -2465,7 +2478,7 @@ function readStoredViews(storageKey) {
2465
2478
  // Nothing in storage yet (first run, or no `storageKey` at all) -- seed from
2466
2479
  // `defaultViews` instead of an empty list, matching every other hook's own
2467
2480
  // `defaultProp` semantics.
2468
- initialViewsRef.current = stored.length > 0 ? stored : defaultViews;
2481
+ initialViewsRef.current = stored !== null ? stored : defaultViews;
2469
2482
  }
2470
2483
  }
2471
2484
  const [views = EMPTY_VIEWS, setViews] = useControllableState$1({
@@ -4107,7 +4120,7 @@ const TextFieldTextarea = /*#__PURE__*/ forwardRef(({ className, autoresize = tr
4107
4120
  });
4108
4121
  TextFieldTextarea.displayName = "TextFieldTextarea";
4109
4122
 
4110
- __insertCSS(".seed-data-table__root{box-sizing:border-box;position:relative;display:flex;flex-direction:column;width:100%;border-width:1px;border-style:solid;font-family:Inter,-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif}.seed-data-table__table{width:100%;border-collapse:separate;border-spacing:0;table-layout:fixed}.seed-data-table__headerCell{box-sizing:border-box;position:sticky;top:0;z-index:2;vertical-align:middle;text-align:start;padding:0;height:var(--seed-dimension-x10);background-color:var(--seed-color-bg-layer-default);border-top:1px solid var(--seed-color-stroke-neutral-muted);border-bottom:1px solid var(--seed-color-stroke-neutral-muted);border-inline-end:1px solid var(--seed-color-stroke-neutral-muted);border-inline-start:none;color:var(--seed-color-fg-neutral);font-size:var(--seed-font-size-t4);line-height:var(--seed-line-height-t4);font-weight:var(--seed-font-weight-medium);letter-spacing:-.14px}.seed-data-table__headerCell:last-child{border-inline-end:none}.seed-data-table__headerCell[data-sortable]{cursor:pointer;user-select:none}.seed-data-table__headerCell [data-chevron]{opacity:0;transition:opacity .12s}.seed-data-table__headerCell[data-sortable]:hover [data-chevron]{opacity:.6}.seed-data-table__headerCell[data-sorted] [data-chevron]{opacity:1;color:var(--seed-color-fg-neutral)}.seed-data-table__headerCell:hover [data-column-menu]{opacity:1}.seed-data-table__headerCell [data-column-menu]:focus-visible,.seed-data-table__headerCell [data-column-menu][data-open]{opacity:1}.seed-data-table__headerCell[data-dragging]{opacity:.5}.seed-data-table__headerCell[data-sticky]{position:sticky;z-index:3;background-color:var(--seed-color-bg-layer-default)}.seed-data-table__headerCell{outline:var(--seed-dimension-x0_5) solid transparent;outline-offset:calc(var(--seed-dimension-x0_5) * -1)}.seed-data-table__headerCell:is(:focus-visible,[data-focus-visible]){outline:var(--seed-dimension-x0_5) solid var(--seed-color-stroke-focus-ring);outline-offset:calc(var(--seed-dimension-x0_5) * -1)}.seed-data-table__headerCell .seed-data-table-resize-handle{position:absolute;top:0;inset-inline-end:calc(7px / -2);width:7px;height:100%;z-index:4;display:flex;align-items:center;justify-content:center;cursor:col-resize;touch-action:none}.seed-data-table__headerCell .seed-data-table-resize-handle-inner{width:3px;height:100%;border-radius:3px;background-color:#0298d9;opacity:0;transition:opacity .1s}.seed-data-table__headerCell .seed-data-table-resize-handle:hover .seed-data-table-resize-handle-inner,.seed-data-table__headerCell .seed-data-table-resize-handle[data-resizing] .seed-data-table-resize-handle-inner{opacity:1}.seed-data-table__headerCellInner{box-sizing:border-box;display:flex;align-items:center;width:100%;height:100%;min-width:0;gap:var(--seed-dimension-x1_5);padding-inline:var(--seed-dimension-x3)}.seed-data-table__headerCellLabel{min-width:0;flex:1 1 0%;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__headerCellIcon{flex-shrink:0;margin-inline-start:auto;display:inline-flex;align-items:center;justify-content:center;width:var(--seed-dimension-x4);height:var(--seed-dimension-x4);color:var(--seed-color-fg-neutral-subtle);border:none;background:0 0;padding:0;font:inherit;cursor:pointer}.seed-data-table__headerCellIcon[data-active]{color:var(--seed-color-fg-neutral)}.seed-data-table__headerCellIcon[data-column-menu]{opacity:0;transition:opacity .12s}.seed-data-table__row{position:relative;background-color:var(--seed-color-bg-layer-default);--seed-data-table-row-bg:var(--seed-color-bg-layer-default)}.seed-data-table__row[data-clickable]{cursor:pointer}.seed-data-table__row:is([aria-selected=true],[data-selected]){background-color:color-mix(in srgb,#0298d9 10%,var(--seed-color-bg-layer-default));--seed-data-table-row-bg:color-mix(in srgb, #0298d9 10%, var(--seed-color-bg-layer-default))}.seed-data-table__row:is([aria-selected=true],[data-selected]):is(:hover,[data-hover]){background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 3%,color-mix(in srgb,#0298d9 10%,var(--seed-color-bg-layer-default)));--seed-data-table-row-bg:color-mix(in srgb, var(--seed-color-fg-neutral) 3%, color-mix(in srgb, #0298d9 10%, var(--seed-color-bg-layer-default)))}.seed-data-table__cell{box-sizing:border-box;position:relative;vertical-align:middle;text-align:start;height:var(--seed-dimension-x9);border-bottom:1px solid var(--seed-color-stroke-neutral-muted);border-inline-end:1px solid var(--seed-color-stroke-neutral-muted);border-top:none;border-inline-start:none;padding-block:0;padding-inline:var(--seed-dimension-x3);color:var(--seed-color-fg-neutral);font-size:var(--seed-font-size-t4);line-height:var(--seed-line-height-t4);font-weight:var(--seed-font-weight-regular);letter-spacing:-.14px;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__cell:not([data-editable]){user-select:none}.seed-data-table__cell:last-child{border-inline-end:none}tbody tr:last-child .seed-data-table__cell{border-bottom:none}.seed-data-table__cell[data-numeric]{text-align:end;font-variant-numeric:tabular-nums}.seed-data-table__cell[data-sticky]{position:sticky;z-index:1;background-color:var(--seed-data-table-row-bg)}.seed-data-table__cell[data-overlay-open]{overflow:visible;z-index:20}.seed-data-table__cell[data-editable]{cursor:default}.seed-data-table__cell .seed-data-table-edit-picker{display:flex;align-items:center;gap:var(--seed-dimension-x1_5);min-width:0}.seed-data-table__cell .seed-data-table-edit-pending{flex-shrink:0;color:var(--seed-color-fg-neutral-subtle);animation:rotate .6s linear infinite}.seed-data-table__cell .seed-data-table-edit-error{position:absolute;top:100%;inset-inline-start:var(--seed-dimension-x3);inset-inline-end:var(--seed-dimension-x3);z-index:2;padding-top:2px;font-size:12px;line-height:1.3;color:var(--seed-color-fg-critical);overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__entity{display:flex;align-items:center;min-width:0;gap:var(--seed-dimension-x1_5)}.seed-data-table__entityName{min-width:0;font-weight:var(--seed-font-weight-medium);overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__entityName[data-clickable]{cursor:pointer;border:none;background:0 0;padding:0;margin:0;font-family:inherit;font-size:inherit;line-height:inherit;color:inherit;text-align:start}.seed-data-table__entityName[data-clickable]:is(:hover,[data-hover]){text-decoration:underline}.seed-data-table__tagList{display:flex;align-items:center;gap:var(--seed-dimension-x1_5);overflow:hidden;min-width:0}.seed-data-table__entityActions{display:flex;align-items:center;gap:6px;margin-inline-start:auto;flex-shrink:0;opacity:0;transition:opacity .15s}tr:hover .seed-data-table__entityActions{opacity:1}.seed-data-table__entityActions:focus-within{opacity:1}.seed-data-table__entityAction{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;margin:0;padding:2px;border:none;border-radius:6px;background:0 0;font-family:inherit;color:color-mix(in srgb,var(--seed-color-fg-neutral) 55%,transparent);cursor:pointer;flex-shrink:0;transition:background-color .2s,color .2s,box-shadow .2s}.seed-data-table__entityAction:hover{background:color-mix(in srgb,var(--seed-color-fg-neutral) 4%,transparent);color:var(--seed-color-fg-neutral)}.seed-data-table__link{color:var(--seed-color-fg-neutral);text-decoration:none;min-width:0;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__link:is(:hover,[data-hover]){text-decoration:underline}.seed-data-table__chip{box-sizing:border-box;display:inline-flex;align-items:center;flex-shrink:0;max-width:100%;height:22px;padding:0 4px;border-radius:7px;font-size:13px;font-weight:var(--seed-font-weight-medium);line-height:15px;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__chipList{position:relative;display:flex;align-items:center;flex-wrap:nowrap;gap:3px;overflow:hidden;min-width:0;width:100%}.seed-data-table__chipOverflow{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;height:20px;padding:0 4px;border-radius:6px;background-color:#f6f7f7;color:#000;font-size:10px;font-weight:var(--seed-font-weight-regular);line-height:15px;white-space:nowrap}.seed-data-table__chipListEditor{display:flex;align-items:center;flex-wrap:wrap;gap:3px;min-width:0;width:100%}.seed-data-table__chipRemove{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:12px;height:12px;margin:0;margin-inline-start:2px;padding:0;border:none;border-radius:999px;background:0 0;color:inherit;opacity:.6;cursor:pointer;transition:opacity .12s,background-color .12s}.seed-data-table__chipRemove:hover{opacity:1;background-color:rgba(0,0,0,.08)}.seed-data-table__chipInput{flex:1 1 auto;min-width:40px;height:22px;margin:0;padding:0;border:none;outline:0;background:0 0;font-family:inherit;font-size:var(--seed-font-size-t4);color:var(--seed-color-fg-neutral);letter-spacing:-.14px}.seed-data-table__expandOverlay{box-sizing:border-box;position:absolute;top:-1px;inset-inline-start:-1px;inset-inline-end:-1px;z-index:10;min-height:calc(100% + 2px);display:flex;align-items:flex-start;padding-inline:var(--seed-dimension-x3);padding-block:var(--seed-dimension-x3);background-color:var(--seed-color-bg-layer-floating);border-radius:4px;box-shadow:none;border:1px solid #266df0;color:var(--seed-color-fg-neutral);font-size:var(--seed-font-size-t4);line-height:var(--seed-line-height-t4);letter-spacing:-.14px;cursor:default}.seed-data-table__expandOverlayText{width:100%;min-width:0;white-space:normal;word-break:break-word}.seed-data-table__cellSuffixRow{display:flex;align-items:center;gap:4px;min-width:0;width:100%}.seed-data-table__cellSuffixText{flex:1 1 0%;min-width:0;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__cellSuffixIcon{flex-shrink:0;display:inline-flex;align-items:center;color:color-mix(in srgb,var(--seed-color-fg-neutral) 55%,transparent)}.seed-data-table__toolbar{box-sizing:border-box;display:flex;align-items:center;width:100%;flex-shrink:0;min-height:49px;gap:var(--seed-dimension-x2);padding-inline:var(--seed-dimension-x3);border-top:1px solid var(--seed-color-stroke-neutral-muted)}.seed-data-table__search{position:relative;display:inline-flex;align-items:center;flex:1 1 0%;max-width:280px}.seed-data-table__search svg{position:absolute;inset-inline-start:var(--seed-dimension-x2);width:var(--seed-dimension-x4);height:var(--seed-dimension-x4);color:var(--seed-color-fg-neutral-muted);pointer-events:none}.seed-data-table__search input{width:100%;height:var(--seed-dimension-x8);padding-inline-start:var(--seed-dimension-x7);padding-inline-end:var(--seed-dimension-x2);border:none;border-radius:var(--seed-radius-r2);background-color:var(--seed-color-bg-layer-default);box-shadow:inset 0 0 0 1px var(--seed-color-stroke-neutral-weak);font-family:inherit;font-size:var(--seed-font-size-t4);color:var(--seed-color-fg-neutral);outline:0;transition:box-shadow .1s var(--seed-timing-function-easing)}.seed-data-table__search input::placeholder{color:var(--seed-color-fg-neutral-subtle)}.seed-data-table__search input:focus{box-shadow:inset 0 0 0 2px var(--seed-color-stroke-neutral-contrast)}.seed-data-table__count{flex-shrink:0;color:var(--seed-color-fg-neutral-subtle);font-size:var(--seed-font-size-t3);font-variant-numeric:tabular-nums}.seed-data-table__toolbarEnd{flex-shrink:0;margin-inline-start:auto;display:inline-flex;align-items:center;gap:var(--seed-dimension-x2)}.seed-data-table__scrollArea{position:relative;display:flex;flex-direction:column;width:100%;min-width:0;flex:1 1 auto;min-height:0;overflow-x:auto;overflow-y:auto}.seed-data-table__scrollArea[data-scrolled-start] [data-sticky-edge]{clip-path:inset(0 -38px 0 0);box-shadow:6px 0 16px 4px rgba(0,0,0,.12)}.seed-data-table__scrollArea[data-scrolled-end] [data-sticky-edge-end]{clip-path:inset(0 0 0 -38px);box-shadow:-6px 0 16px 4px rgba(0,0,0,.12)}.seed-data-table__footerCell{box-sizing:border-box;position:sticky;bottom:0;z-index:2;vertical-align:middle;padding:0;height:var(--seed-dimension-x9);background-color:var(--seed-color-bg-layer-default);border-top:1px solid var(--seed-color-stroke-neutral-muted);border-inline-end:1px solid var(--seed-color-stroke-neutral-muted);border-inline-start:none}.seed-data-table__footerCell:last-child{border-inline-end:none}.seed-data-table__footerCell .seed-data-table-column-calc-trigger{display:flex;align-items:center;gap:var(--seed-dimension-x1_5);width:100%;height:100%;min-width:0;margin:0;padding:0 var(--seed-dimension-x3);border:none;background:0 0;color:var(--seed-color-fg-neutral-subtle);font-family:inherit;font-size:var(--seed-font-size-t4);font-weight:var(--seed-font-weight-medium);white-space:nowrap;overflow:clip;cursor:pointer;transition:background-color .12s,color .12s}.seed-data-table__footerCell .seed-data-table-column-calc-trigger:hover{background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 4%,transparent);color:var(--seed-color-fg-neutral)}.seed-data-table__footerCell .seed-data-table-column-calc-trigger[data-align=right]{justify-content:flex-end}.seed-data-table__footerCell .seed-data-table-column-calc-trigger svg{flex-shrink:0;opacity:.7}.seed-data-table__footerCell .seed-data-table-column-calc-placeholder{overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__footerCell .seed-data-table-column-calc-value{min-width:0;flex-shrink:1;color:var(--seed-color-fg-neutral);font-variant-numeric:tabular-nums;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__footerCell .seed-data-table-column-calc-op{min-width:0;flex-shrink:1;color:color-mix(in srgb,var(--seed-color-fg-neutral) 63%,transparent);overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__emptyState{box-sizing:border-box;text-align:center;padding-block:var(--seed-dimension-x8);padding-inline:var(--seed-dimension-x3);color:var(--seed-color-fg-neutral-subtle);font-size:var(--seed-font-size-t4)}.seed-data-table__loadingState{box-sizing:border-box;display:flex;align-items:center;justify-content:center;gap:10px;padding-block:var(--seed-dimension-x8);padding-inline:var(--seed-dimension-x3);color:color-mix(in srgb,var(--seed-color-fg-neutral) 63%,transparent);font-size:var(--seed-font-size-t4);line-height:var(--seed-line-height-t4);font-weight:var(--seed-font-weight-medium)}.seed-data-table__loadingState[data-inline]{padding-block:0;padding-inline:0;height:var(--seed-dimension-x9)}.seed-data-table__loadingState .seed-data-table-loading-spinner{flex-shrink:0;color:color-mix(in srgb,var(--seed-color-fg-neutral) 63%,transparent);animation:rotate .6s linear infinite}.seed-data-table__addRowCell{box-sizing:border-box;padding:0;border-top:none}.seed-data-table__addRow{box-sizing:border-box;display:flex;align-items:center;width:100%;margin:0;border:none;border-top:1px solid var(--seed-color-stroke-neutral-muted);background-color:var(--seed-color-bg-layer-default);height:var(--seed-dimension-x9);gap:var(--seed-dimension-x2);padding-inline:var(--seed-dimension-x2);color:var(--seed-color-fg-neutral-subtle);font-family:inherit;font-size:var(--seed-font-size-t4);cursor:pointer;transition:background-color .12s,color .12s}.seed-data-table__addRow:hover{background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 4%,var(--seed-color-bg-layer-default));color:var(--seed-color-fg-neutral)}.seed-data-table__addRow svg{flex-shrink:0}.seed-data-table__selectionCell{text-align:center;padding:0}.seed-data-table__bulkBar{box-sizing:border-box;position:absolute;inset-inline-start:50%;transform:translateX(-50%);bottom:var(--seed-dimension-x4);z-index:30;display:flex;align-items:center;gap:var(--seed-dimension-x3);min-height:36px;padding-inline:var(--seed-dimension-x3_5);padding-block:var(--seed-dimension-x2);border-radius:var(--seed-radius-full);box-shadow:var(--seed-shadow-s3);background-color:var(--seed-color-bg-layer-floating);color:var(--seed-color-fg-neutral);font-family:inherit;font-size:var(--seed-font-size-t4);font-weight:var(--seed-font-weight-medium);white-space:nowrap}.seed-data-table__bulkBarCount{flex-shrink:0;color:var(--seed-color-fg-neutral);font-variant-numeric:tabular-nums}.seed-data-table__bulkBarClear{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:20px;height:20px;margin:0;padding:2px;border:none;border-radius:6px;background:0 0;font-family:inherit;color:color-mix(in srgb,var(--seed-color-fg-neutral) 55%,transparent);cursor:pointer;transition:background-color .2s,color .2s}.seed-data-table__bulkBarClear:hover{background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 8%,transparent);color:var(--seed-color-fg-neutral)}.seed-data-table__bulkBarActions{display:flex;align-items:center;flex-shrink:0;gap:var(--seed-dimension-x3);padding-inline-start:var(--seed-dimension-x3);border-inline-start:1px solid color-mix(in srgb,var(--seed-color-fg-neutral) 16%,transparent)}.seed-data-table__root--surface_card{border-color:var(--seed-color-stroke-neutral-muted);background-color:var(--seed-color-bg-layer-default);border-radius:var(--seed-radius-r3)}.seed-data-table__root--surface_bleed{border-color:var(--seed-color-bg-transparent);background-color:var(--seed-color-bg-transparent)}.seed-data-table__row--interactive_true{transition:background-color .12s}.seed-data-table__row--interactive_true:is(:hover,[data-hover]){background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 3%,transparent);--seed-data-table-row-bg:color-mix(in srgb, var(--seed-color-fg-neutral) 3%, var(--seed-color-bg-layer-default))}");
4123
+ __insertCSS(".seed-data-table__root{box-sizing:border-box;position:relative;display:flex;flex-direction:column;width:100%;border-width:1px;border-style:solid;font-family:Inter,-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif}.seed-data-table__table{width:100%;border-collapse:separate;border-spacing:0;table-layout:fixed}.seed-data-table__headerCell{box-sizing:border-box;position:sticky;top:0;z-index:2;vertical-align:middle;text-align:start;padding:0;height:var(--seed-dimension-x10);background-color:var(--seed-color-bg-layer-default);border-top:1px solid var(--seed-color-stroke-neutral-muted);border-bottom:1px solid var(--seed-color-stroke-neutral-muted);border-inline-end:1px solid var(--seed-color-stroke-neutral-muted);border-inline-start:none;color:var(--seed-color-fg-neutral);font-size:var(--seed-font-size-t4);line-height:var(--seed-line-height-t4);font-weight:var(--seed-font-weight-medium);letter-spacing:-.14px}.seed-data-table__headerCell:last-child{border-inline-end:none}.seed-data-table__headerCell[data-sortable]{cursor:pointer;user-select:none}.seed-data-table__headerCell [data-chevron]{opacity:0;transition:opacity .12s}.seed-data-table__headerCell[data-sortable]:hover [data-chevron]{opacity:.6}.seed-data-table__headerCell[data-sorted] [data-chevron]{opacity:1;color:var(--seed-color-fg-neutral)}.seed-data-table__headerCell:hover [data-column-menu]{opacity:1}.seed-data-table__headerCell [data-column-menu]:focus-visible,.seed-data-table__headerCell [data-column-menu][data-open]{opacity:1}.seed-data-table__headerCell[data-dragging]{opacity:.5}.seed-data-table__headerCell[data-sticky]{position:sticky;z-index:3;background-color:var(--seed-color-bg-layer-default)}.seed-data-table__headerCell{outline:var(--seed-dimension-x0_5) solid transparent;outline-offset:calc(var(--seed-dimension-x0_5) * -1)}.seed-data-table__headerCell:is(:focus-visible,[data-focus-visible]){outline:var(--seed-dimension-x0_5) solid var(--seed-color-stroke-focus-ring);outline-offset:calc(var(--seed-dimension-x0_5) * -1)}.seed-data-table__headerCell .seed-data-table-resize-handle{position:absolute;top:0;inset-inline-end:calc(7px / -2);width:7px;height:100%;z-index:4;display:flex;align-items:center;justify-content:center;cursor:col-resize;touch-action:none}.seed-data-table__headerCell .seed-data-table-resize-handle-inner{width:3px;height:100%;border-radius:3px;background-color:#0298d9;opacity:0;transition:opacity .1s}.seed-data-table__headerCell .seed-data-table-resize-handle:hover .seed-data-table-resize-handle-inner,.seed-data-table__headerCell .seed-data-table-resize-handle[data-resizing] .seed-data-table-resize-handle-inner{opacity:1}.seed-data-table__headerCellInner{box-sizing:border-box;display:flex;align-items:center;width:100%;height:100%;min-width:0;gap:var(--seed-dimension-x1_5);padding-inline:var(--seed-dimension-x3)}.seed-data-table__headerCellLabel{min-width:0;flex:1 1 0%;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__headerCellIcon{flex-shrink:0;margin-inline-start:auto;display:inline-flex;align-items:center;justify-content:center;width:var(--seed-dimension-x4);height:var(--seed-dimension-x4);color:var(--seed-color-fg-neutral-subtle);border:none;background:0 0;padding:0;font:inherit;cursor:pointer}.seed-data-table__headerCellIcon[data-active]{color:var(--seed-color-fg-neutral)}.seed-data-table__headerCellIcon[data-column-menu]{opacity:0;transition:opacity .12s}.seed-data-table__row{position:relative;background-color:var(--seed-color-bg-layer-default);--seed-data-table-row-bg:var(--seed-color-bg-layer-default)}.seed-data-table__row[data-clickable]{cursor:pointer}.seed-data-table__row:is([aria-selected=true],[data-selected]){background-color:color-mix(in srgb,#0298d9 10%,var(--seed-color-bg-layer-default));--seed-data-table-row-bg:color-mix(in srgb, #0298d9 10%, var(--seed-color-bg-layer-default))}.seed-data-table__row:is([aria-selected=true],[data-selected]):is(:hover,[data-hover]){background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 3%,color-mix(in srgb,#0298d9 10%,var(--seed-color-bg-layer-default)));--seed-data-table-row-bg:color-mix(in srgb, var(--seed-color-fg-neutral) 3%, color-mix(in srgb, #0298d9 10%, var(--seed-color-bg-layer-default)))}.seed-data-table__cell{box-sizing:border-box;position:relative;vertical-align:middle;text-align:start;height:var(--seed-dimension-x9);border-bottom:1px solid var(--seed-color-stroke-neutral-muted);border-inline-end:1px solid var(--seed-color-stroke-neutral-muted);border-top:none;border-inline-start:none;padding-block:0;padding-inline:var(--seed-dimension-x3);color:var(--seed-color-fg-neutral);font-size:var(--seed-font-size-t4);line-height:var(--seed-line-height-t4);font-weight:var(--seed-font-weight-regular);letter-spacing:-.14px;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__cell:not([data-editable]){user-select:none}.seed-data-table__cell:last-child{border-inline-end:none}tbody tr:last-child .seed-data-table__cell{border-bottom:none}.seed-data-table__cell[data-numeric]{text-align:end;font-variant-numeric:tabular-nums}.seed-data-table__cell[data-sticky]{position:sticky;z-index:1;background-color:var(--seed-data-table-row-bg)}.seed-data-table__cell[data-overlay-open]{overflow:visible;z-index:20}.seed-data-table__cell[data-editable]{cursor:default}.seed-data-table__cell .seed-data-table-edit-picker{display:flex;align-items:center;gap:var(--seed-dimension-x1_5);min-width:0}.seed-data-table__cell .seed-data-table-edit-pending{flex-shrink:0;color:var(--seed-color-fg-neutral-subtle);animation:rotate .6s linear infinite}.seed-data-table__cell .seed-data-table-edit-error{position:absolute;top:100%;inset-inline-start:var(--seed-dimension-x3);inset-inline-end:var(--seed-dimension-x3);z-index:2;padding-top:2px;font-size:12px;line-height:1.3;color:var(--seed-color-fg-critical);overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__entity{display:flex;align-items:center;min-width:0;gap:var(--seed-dimension-x1_5)}.seed-data-table__entityName{min-width:0;font-weight:var(--seed-font-weight-medium);overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__entityName[data-clickable]{cursor:pointer;border:none;background:0 0;padding:0;margin:0;font-family:inherit;font-size:inherit;line-height:inherit;color:inherit;text-align:start}.seed-data-table__entityName[data-clickable]:is(:hover,[data-hover]){text-decoration:underline}.seed-data-table__tagList{display:flex;align-items:center;gap:var(--seed-dimension-x1_5);overflow:hidden;min-width:0}.seed-data-table__entityActions{display:flex;align-items:center;gap:6px;margin-inline-start:auto;flex-shrink:0;opacity:0;transition:opacity .15s}tr:hover .seed-data-table__entityActions{opacity:1}.seed-data-table__entityActions:focus-within{opacity:1}.seed-data-table__entityAction{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;margin:0;padding:2px;border:none;border-radius:6px;background:0 0;font-family:inherit;color:color-mix(in srgb,var(--seed-color-fg-neutral) 55%,transparent);cursor:pointer;flex-shrink:0;transition:background-color .2s,color .2s,box-shadow .2s}.seed-data-table__entityAction:hover{background:color-mix(in srgb,var(--seed-color-fg-neutral) 4%,transparent);color:var(--seed-color-fg-neutral)}.seed-data-table__link{color:var(--seed-color-fg-neutral);text-decoration:none;min-width:0;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__link:is(:hover,[data-hover]){text-decoration:underline}.seed-data-table__chip{box-sizing:border-box;display:inline-flex;align-items:center;flex-shrink:0;max-width:100%;height:22px;padding:0 4px;border-radius:7px;font-size:13px;font-weight:var(--seed-font-weight-medium);line-height:15px;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__chipList{position:relative;display:flex;align-items:center;flex-wrap:nowrap;gap:3px;overflow:hidden;min-width:0;width:100%}.seed-data-table__chipOverflow{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;height:20px;padding:0 4px;border-radius:6px;background-color:#f6f7f7;color:#000;font-size:10px;font-weight:var(--seed-font-weight-regular);line-height:15px;white-space:nowrap}.seed-data-table__chipListEditor{display:flex;align-items:center;flex-wrap:wrap;gap:3px;min-width:0;width:100%}.seed-data-table__chipRemove{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:12px;height:12px;margin:0;margin-inline-start:2px;padding:0;border:none;border-radius:999px;background:0 0;color:inherit;opacity:.6;cursor:pointer;transition:opacity .12s,background-color .12s}.seed-data-table__chipRemove:hover{opacity:1;background-color:rgba(0,0,0,.08)}.seed-data-table__chipInput{flex:1 1 auto;min-width:40px;height:22px;margin:0;padding:0;border:none;outline:0;background:0 0;font-family:inherit;font-size:var(--seed-font-size-t4);color:var(--seed-color-fg-neutral);letter-spacing:-.14px}.seed-data-table__expandOverlay{box-sizing:border-box;position:absolute;top:-1px;inset-inline-start:-1px;inset-inline-end:-1px;z-index:10;min-height:calc(100% + 2px);display:flex;align-items:flex-start;padding-inline:var(--seed-dimension-x3);padding-block:var(--seed-dimension-x3);background-color:var(--seed-color-bg-layer-floating);border-radius:4px;box-shadow:none;border:1px solid #266df0;color:var(--seed-color-fg-neutral);font-size:var(--seed-font-size-t4);line-height:var(--seed-line-height-t4);letter-spacing:-.14px;cursor:default}.seed-data-table__expandOverlayText{width:100%;min-width:0;white-space:normal;word-break:break-word}.seed-data-table__cellSuffixRow{display:flex;align-items:center;gap:4px;min-width:0;width:100%}.seed-data-table__cellSuffixText{flex:1 1 0%;min-width:0;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__cellSuffixIcon{flex-shrink:0;display:inline-flex;align-items:center;color:color-mix(in srgb,var(--seed-color-fg-neutral) 55%,transparent)}.seed-data-table__toolbar{box-sizing:border-box;display:flex;align-items:center;width:100%;flex-shrink:0;min-height:49px;gap:var(--seed-dimension-x2);padding-inline:var(--seed-dimension-x3);border-top:1px solid var(--seed-color-stroke-neutral-muted)}.seed-data-table__search{position:relative;display:inline-flex;align-items:center;flex:1 1 0%;max-width:280px}.seed-data-table__search svg{position:absolute;inset-inline-start:var(--seed-dimension-x2);width:var(--seed-dimension-x4);height:var(--seed-dimension-x4);color:var(--seed-color-fg-neutral-muted);pointer-events:none}.seed-data-table__search input{width:100%;height:var(--seed-dimension-x8);padding-inline-start:var(--seed-dimension-x7);padding-inline-end:var(--seed-dimension-x2);border:none;border-radius:var(--seed-radius-r2);background-color:var(--seed-color-bg-layer-default);box-shadow:inset 0 0 0 1px var(--seed-color-stroke-neutral-weak);font-family:inherit;font-size:var(--seed-font-size-t4);color:var(--seed-color-fg-neutral);outline:0;transition:box-shadow .1s var(--seed-timing-function-easing)}.seed-data-table__search input::placeholder{color:var(--seed-color-fg-neutral-subtle)}.seed-data-table__search input:focus{box-shadow:inset 0 0 0 2px var(--seed-color-stroke-neutral-contrast)}.seed-data-table__count{flex-shrink:0;color:var(--seed-color-fg-neutral-subtle);font-size:var(--seed-font-size-t3);font-variant-numeric:tabular-nums}.seed-data-table__toolbarEnd{flex-shrink:0;margin-inline-start:auto;display:inline-flex;align-items:center;gap:var(--seed-dimension-x2)}.seed-data-table__scrollArea{position:relative;display:flex;flex-direction:column;width:100%;min-width:0;flex:1 1 auto;min-height:0;overflow-x:auto;overflow-y:auto}.seed-data-table__scrollArea[data-scrolled-start] [data-sticky-edge]{clip-path:inset(0 -38px 0 0);box-shadow:6px 0 16px 4px rgba(0,0,0,.12)}.seed-data-table__scrollArea[data-scrolled-end] [data-sticky-edge-end]{clip-path:inset(0 0 0 -38px);box-shadow:-6px 0 16px 4px rgba(0,0,0,.12)}.seed-data-table__footerCell{box-sizing:border-box;position:sticky;bottom:0;z-index:2;vertical-align:middle;padding:0;height:var(--seed-dimension-x9);background-color:var(--seed-color-bg-layer-default);border-top:1px solid var(--seed-color-stroke-neutral-muted);border-inline-end:1px solid var(--seed-color-stroke-neutral-muted);border-inline-start:none}.seed-data-table__footerCell:last-child{border-inline-end:none}.seed-data-table__footerCell[data-sticky]{z-index:3}.seed-data-table__footerCell .seed-data-table-column-calc-trigger{display:flex;align-items:center;gap:var(--seed-dimension-x1_5);width:100%;height:100%;min-width:0;margin:0;padding:0 var(--seed-dimension-x3);border:none;background:0 0;color:var(--seed-color-fg-neutral-subtle);font-family:inherit;font-size:var(--seed-font-size-t4);font-weight:var(--seed-font-weight-medium);white-space:nowrap;overflow:clip;cursor:pointer;transition:background-color .12s,color .12s}.seed-data-table__footerCell .seed-data-table-column-calc-trigger:hover{background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 4%,transparent);color:var(--seed-color-fg-neutral)}.seed-data-table__footerCell .seed-data-table-column-calc-trigger[data-align=right]{justify-content:flex-end}.seed-data-table__footerCell .seed-data-table-column-calc-trigger svg{flex-shrink:0;opacity:.7}.seed-data-table__footerCell .seed-data-table-column-calc-placeholder{overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__footerCell .seed-data-table-column-calc-value{min-width:0;flex-shrink:1;color:var(--seed-color-fg-neutral);font-variant-numeric:tabular-nums;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__footerCell .seed-data-table-column-calc-op{min-width:0;flex-shrink:1;color:color-mix(in srgb,var(--seed-color-fg-neutral) 63%,transparent);overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__emptyState{box-sizing:border-box;text-align:center;padding-block:var(--seed-dimension-x8);padding-inline:var(--seed-dimension-x3);color:var(--seed-color-fg-neutral-subtle);font-size:var(--seed-font-size-t4)}.seed-data-table__loadingState{box-sizing:border-box;display:flex;align-items:center;justify-content:center;gap:10px;padding-block:var(--seed-dimension-x8);padding-inline:var(--seed-dimension-x3);color:color-mix(in srgb,var(--seed-color-fg-neutral) 63%,transparent);font-size:var(--seed-font-size-t4);line-height:var(--seed-line-height-t4);font-weight:var(--seed-font-weight-medium)}.seed-data-table__loadingState[data-inline]{padding-block:0;padding-inline:0;height:var(--seed-dimension-x9)}.seed-data-table__loadingState .seed-data-table-loading-spinner{flex-shrink:0;color:color-mix(in srgb,var(--seed-color-fg-neutral) 63%,transparent);animation:rotate .6s linear infinite}.seed-data-table__addRowCell{box-sizing:border-box;padding:0;border-top:none}.seed-data-table__addRow{box-sizing:border-box;display:flex;align-items:center;width:100%;margin:0;border:none;border-top:1px solid var(--seed-color-stroke-neutral-muted);background-color:var(--seed-color-bg-layer-default);height:var(--seed-dimension-x9);gap:var(--seed-dimension-x2);padding-inline:var(--seed-dimension-x2);color:var(--seed-color-fg-neutral-subtle);font-family:inherit;font-size:var(--seed-font-size-t4);cursor:pointer;transition:background-color .12s,color .12s}.seed-data-table__addRow:hover{background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 4%,var(--seed-color-bg-layer-default));color:var(--seed-color-fg-neutral)}.seed-data-table__addRow svg{flex-shrink:0}.seed-data-table__selectionCell{text-align:center;padding:0}.seed-data-table__bulkBar{box-sizing:border-box;position:absolute;inset-inline-start:50%;transform:translateX(-50%);bottom:var(--seed-dimension-x4);z-index:30;display:flex;align-items:center;gap:var(--seed-dimension-x3);min-height:36px;padding-inline:var(--seed-dimension-x3_5);padding-block:var(--seed-dimension-x2);border-radius:var(--seed-radius-full);box-shadow:var(--seed-shadow-s3);background-color:var(--seed-color-bg-layer-floating);color:var(--seed-color-fg-neutral);font-family:inherit;font-size:var(--seed-font-size-t4);font-weight:var(--seed-font-weight-medium);white-space:nowrap}.seed-data-table__bulkBar[data-above-footer]{bottom:calc(var(--seed-dimension-x4) + var(--seed-dimension-x9))}.seed-data-table__bulkBarCount{flex-shrink:0;color:var(--seed-color-fg-neutral);font-variant-numeric:tabular-nums}.seed-data-table__bulkBarClear{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:20px;height:20px;margin:0;padding:2px;border:none;border-radius:6px;background:0 0;font-family:inherit;color:color-mix(in srgb,var(--seed-color-fg-neutral) 55%,transparent);cursor:pointer;transition:background-color .2s,color .2s}.seed-data-table__bulkBarClear:hover{background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 8%,transparent);color:var(--seed-color-fg-neutral)}.seed-data-table__bulkBarActions{display:flex;align-items:center;flex-shrink:0;gap:var(--seed-dimension-x3);padding-inline-start:var(--seed-dimension-x3);border-inline-start:1px solid color-mix(in srgb,var(--seed-color-fg-neutral) 16%,transparent)}.seed-data-table__root--surface_card{border-color:var(--seed-color-stroke-neutral-muted);background-color:var(--seed-color-bg-layer-default);border-radius:var(--seed-radius-r3)}.seed-data-table__root--surface_bleed{border-color:var(--seed-color-bg-transparent);background-color:var(--seed-color-bg-transparent)}.seed-data-table__row--interactive_true{transition:background-color .12s}.seed-data-table__row--interactive_true:is(:hover,[data-hover]){background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 3%,transparent);--seed-data-table-row-bg:color-mix(in srgb, var(--seed-color-fg-neutral) 3%, var(--seed-color-bg-layer-default))}");
4111
4124
 
4112
4125
  const createClassName = (className, variants, compoundVariants = [])=>{
4113
4126
  const variantKeys = Object.keys(variants);
@@ -4461,6 +4474,10 @@ const { ClassNamesProvider, withContext: withContext$1, useClassNames } = create
4461
4474
  });
4462
4475
  }
4463
4476
 
4477
+ /** Attribute on the floating-ui-portaled option list of the `select`/`reference`/`actor`
4478
+ * editors. The portal lands in `document.body`, outside the cell and its expand overlay,
4479
+ * so `body-cells.tsx`'s outside-click detector checks for this marker to avoid reading an
4480
+ * option click as "outside" and cancelling the edit before it commits. */ const EDITOR_PORTAL_ATTR = "data-datatable-editor-portal";
4464
4481
  /** The raw value a live editor reads, distinct from `DataTableColumn.value` (the
4465
4482
  * accessor sort/search/filter/export share): `editValue` returns whatever TYPE the
4466
4483
  * editor itself expects -- a real `boolean` for `editor: "switch"`/`type:
@@ -4609,6 +4626,7 @@ function SelectEditor({ column, value, pending, onCommit, onCancel }) {
4609
4626
  ]
4610
4627
  }),
4611
4628
  /*#__PURE__*/ jsx(SelectPositioner, {
4629
+ [EDITOR_PORTAL_ATTR]: "",
4612
4630
  children: /*#__PURE__*/ jsxs(SelectContent, {
4613
4631
  children: [
4614
4632
  searchable && /*#__PURE__*/ jsx(SelectSearchField, {
@@ -4684,6 +4702,7 @@ function ReferenceEditor({ column, value, pending, onCommit, onCancel }) {
4684
4702
  ]
4685
4703
  }),
4686
4704
  /*#__PURE__*/ jsx(SelectPositioner, {
4705
+ [EDITOR_PORTAL_ATTR]: "",
4687
4706
  children: /*#__PURE__*/ jsxs(SelectContent, {
4688
4707
  children: [
4689
4708
  /*#__PURE__*/ jsx(SelectSearchField, {
@@ -5299,8 +5318,14 @@ function ColumnBodyCells({ columns, row, classNames, locale, selectable, stickyF
5299
5318
  function isInside(target) {
5300
5319
  return (cellRef.current?.contains(target) ?? false) || (popoverRef.current?.contains(target) ?? false) || (expandOverlayRef.current?.contains(target) ?? false);
5301
5320
  }
5321
+ // The select/reference/actor editor's option list is portaled to `document.body` by
5322
+ // floating-ui, outside both `cellRef` and `expandOverlayRef`; `editors.tsx` marks its
5323
+ // positioner with `EDITOR_PORTAL_ATTR`, so a click on an option is not an outside click.
5324
+ function isInsideEditorPortal(target) {
5325
+ return target instanceof Element && target.closest(`[${EDITOR_PORTAL_ATTR}]`) != null;
5326
+ }
5302
5327
  function handlePointerDown(event) {
5303
- if (!isInside(event.target)) {
5328
+ if (!isInside(event.target) && !isInsideEditorPortal(event.target)) {
5304
5329
  setOverlayOpen(false);
5305
5330
  setPopoverStyle(null);
5306
5331
  closePeek();
@@ -5639,13 +5664,14 @@ const DataTableBulkBarClear = withContext$1(Primitive.button, "bulkBarClear");
5639
5664
  * exactly this reason -- see `data-table.ts`'s own `bulkBar` slot comment for why its
5640
5665
  * geometry borrows `contextual-floating-button`'s already-measured vars rather than a
5641
5666
  * guessed literal.
5642
- */ function DataTableBulkBar({ clearLabel = "Clear selection", children }) {
5667
+ */ function DataTableBulkBar({ clearLabel = "Clear selection", aboveFooter, children }) {
5643
5668
  const { selectedIds, clearSelection } = useDataTableContext();
5644
5669
  if (selectedIds.length === 0) return null;
5645
5670
  return /*#__PURE__*/ jsxs(DataTableBulkBarRoot, {
5646
5671
  role: "toolbar",
5647
5672
  "aria-label": "Bulk actions",
5648
5673
  "aria-orientation": "horizontal",
5674
+ "data-above-footer": aboveFooter ? "" : undefined,
5649
5675
  children: [
5650
5676
  /*#__PURE__*/ jsxs(DataTableBulkBarCount, {
5651
5677
  "aria-live": "polite",
@@ -5905,7 +5931,11 @@ const DEFAULT_SORT_ICON = {
5905
5931
  * component (not inlined in `DataTableInner`'s render) so it alone re-renders when
5906
5932
  * `visibleColumnOrder`/labels/widths change, without also re-deriving `sortedData`'s
5907
5933
  * render above it. */ function ColumnHeaderCells({ columns, columnMenu, reorderable, resizable, sortIcon, selectable, stickyFirst, stickyLast }) {
5908
- const { draggingColumnKey, beginColumnDrag, dragOverColumn, endColumnDrag } = useDataTableContext();
5934
+ const { draggingColumnKey, beginColumnDrag, dragOverColumn, endColumnDrag, visibleColumnOrder } = useDataTableContext();
5935
+ // Move left/right operate on the visible order, but never across the `actions`
5936
+ // column (the raw order re-pins it last, so a move onto/past it is a silent no-op).
5937
+ const actionsKey = columns.find((column)=>column.actions)?.key;
5938
+ const movableKeys = visibleColumnOrder.filter((key)=>key !== actionsKey);
5909
5939
  const effective = useEffectiveColumns(columns, {
5910
5940
  selectable,
5911
5941
  stickyFirst
@@ -5953,6 +5983,8 @@ const DEFAULT_SORT_ICON = {
5953
5983
  columnMenu && /*#__PURE__*/ jsx(ColumnMenu, {
5954
5984
  column: column,
5955
5985
  label: label,
5986
+ canMoveLeft: movableKeys.indexOf(column.key) > 0,
5987
+ canMoveRight: movableKeys.indexOf(column.key) !== -1 && movableKeys.indexOf(column.key) < movableKeys.length - 1,
5956
5988
  onRename: ()=>setRenamingKey(column.key)
5957
5989
  })
5958
5990
  ]
@@ -6044,8 +6076,8 @@ function ColumnRenameInput({ column, initialLabel, onDone }) {
6044
6076
  * `data-table.ts`) -- crisp's own header shows the trigger only on hover, not
6045
6077
  * permanently, so this one carries its own marker attribute distinct from that
6046
6078
  * slot's OTHER occupants (the sort chevron, the filter trigger), which stay visible
6047
- * under their own separate rules regardless of hover. */ function ColumnMenu({ column, label, onRename }) {
6048
- const { moveColumn, hideColumn, isColumnPinned, togglePinColumn, sort, clearSort } = useDataTableContext();
6079
+ * under their own separate rules regardless of hover. */ function ColumnMenu({ column, label, canMoveLeft, canMoveRight, onRename }) {
6080
+ const { moveColumn, hideColumn, isColumnPinned, togglePinColumn, sort, setSort, clearSort } = useDataTableContext();
6049
6081
  const columnLabel = typeof label === "string" ? label : column.key;
6050
6082
  const pinned = isColumnPinned(column.key);
6051
6083
  // Attio/GRC's "Remove sort" (live-review fix D) -- the header's own click-to-sort
@@ -6096,40 +6128,68 @@ function ColumnRenameInput({ column, initialLabel, onDone }) {
6096
6128
  },
6097
6129
  children: /*#__PURE__*/ jsxs(MenuScrollArea, {
6098
6130
  children: [
6099
- /*#__PURE__*/ jsx(MenuItem, {
6100
- onClick: onRename,
6101
- children: /*#__PURE__*/ jsx(MenuItemLabel, {
6102
- children: "Rename"
6103
- })
6131
+ column.sortable && /*#__PURE__*/ jsxs(Fragment, {
6132
+ children: [
6133
+ /*#__PURE__*/ jsx(MenuItem, {
6134
+ role: "menuitemradio",
6135
+ "aria-checked": isSorted && sort?.dir === "asc",
6136
+ onClick: ()=>setSort({
6137
+ key: column.key,
6138
+ dir: "asc"
6139
+ }),
6140
+ children: /*#__PURE__*/ jsx(MenuItemLabel, {
6141
+ children: "Sort ascending"
6142
+ })
6143
+ }),
6144
+ /*#__PURE__*/ jsx(MenuItem, {
6145
+ role: "menuitemradio",
6146
+ "aria-checked": isSorted && sort?.dir === "desc",
6147
+ onClick: ()=>setSort({
6148
+ key: column.key,
6149
+ dir: "desc"
6150
+ }),
6151
+ children: /*#__PURE__*/ jsx(MenuItemLabel, {
6152
+ children: "Sort descending"
6153
+ })
6154
+ }),
6155
+ isSorted && /*#__PURE__*/ jsx(MenuItem, {
6156
+ onClick: clearSort,
6157
+ children: /*#__PURE__*/ jsx(MenuItemLabel, {
6158
+ children: "Clear sort"
6159
+ })
6160
+ })
6161
+ ]
6104
6162
  }),
6105
6163
  /*#__PURE__*/ jsx(MenuItem, {
6164
+ disabled: !canMoveLeft,
6106
6165
  onClick: ()=>moveColumn(column.key, "left"),
6107
6166
  children: /*#__PURE__*/ jsx(MenuItemLabel, {
6108
6167
  children: "Move left"
6109
6168
  })
6110
6169
  }),
6111
6170
  /*#__PURE__*/ jsx(MenuItem, {
6171
+ disabled: !canMoveRight,
6112
6172
  onClick: ()=>moveColumn(column.key, "right"),
6113
6173
  children: /*#__PURE__*/ jsx(MenuItemLabel, {
6114
6174
  children: "Move right"
6115
6175
  })
6116
6176
  }),
6117
- isSorted && /*#__PURE__*/ jsx(MenuItem, {
6118
- onClick: clearSort,
6177
+ /*#__PURE__*/ jsx(MenuItem, {
6178
+ onClick: ()=>togglePinColumn(column.key),
6119
6179
  children: /*#__PURE__*/ jsx(MenuItemLabel, {
6120
- children: "Clear sort"
6180
+ children: pinned ? "Unpin column" : "Pin column"
6121
6181
  })
6122
6182
  }),
6123
6183
  /*#__PURE__*/ jsx(MenuItem, {
6124
- onClick: ()=>togglePinColumn(column.key),
6184
+ onClick: onRename,
6125
6185
  children: /*#__PURE__*/ jsx(MenuItemLabel, {
6126
- children: pinned ? "Unpin column" : "Pin column"
6186
+ children: "Edit column label"
6127
6187
  })
6128
6188
  }),
6129
6189
  /*#__PURE__*/ jsx(MenuItem, {
6130
6190
  onClick: ()=>hideColumn(column.key),
6131
6191
  children: /*#__PURE__*/ jsx(MenuItemLabel, {
6132
- children: "Hide column"
6192
+ children: "Hide from view"
6133
6193
  })
6134
6194
  })
6135
6195
  ]
@@ -11174,7 +11234,13 @@ const toDateOrNull = (v)=>{
11174
11234
  return f.op === "before" ? d < cd : d > cd;
11175
11235
  }
11176
11236
  const t = asText(raw).toLowerCase();
11177
- if (f.op === "isanyof") return (f.values ?? []).some((v)=>v.toLowerCase() === t);
11237
+ if (f.op === "isanyof") {
11238
+ const wanted = (f.values ?? []).map((v)=>v.toLowerCase());
11239
+ const cells = Array.isArray(raw) ? raw.map((x)=>asText(x).toLowerCase()) : [
11240
+ t
11241
+ ];
11242
+ return cells.some((c)=>wanted.includes(c));
11243
+ }
11178
11244
  const v = f.value.trim().toLowerCase();
11179
11245
  if (f.op === "contains") return t.includes(v);
11180
11246
  if (f.op === "doesnotcontain") return !t.includes(v);
@@ -12167,6 +12233,7 @@ function DataTableInner(props, ref) {
12167
12233
  }),
12168
12234
  selectable && /*#__PURE__*/ jsx(DataTableBulkBar, {
12169
12235
  clearLabel: clearSelectionLabel,
12236
+ aboveFooter: showFooter || !!onAddRow,
12170
12237
  children: bulkActions
12171
12238
  })
12172
12239
  ]
package/dist/styles.css CHANGED
@@ -5262,6 +5262,10 @@ tr:hover .seed-data-table__entityActions, .seed-data-table__entityActions:focus-
5262
5262
  border-inline-end: none;
5263
5263
  }
5264
5264
 
5265
+ .seed-data-table__footerCell[data-sticky] {
5266
+ z-index: 3;
5267
+ }
5268
+
5265
5269
  .seed-data-table__footerCell .seed-data-table-column-calc-trigger {
5266
5270
  align-items: center;
5267
5271
  gap: var(--seed-dimension-x1_5);
@@ -5419,6 +5423,10 @@ tr:hover .seed-data-table__entityActions, .seed-data-table__entityActions:focus-
5419
5423
  transform: translateX(-50%);
5420
5424
  }
5421
5425
 
5426
+ .seed-data-table__bulkBar[data-above-footer] {
5427
+ bottom: calc(var(--seed-dimension-x4) + var(--seed-dimension-x9));
5428
+ }
5429
+
5422
5430
  .seed-data-table__bulkBarCount {
5423
5431
  color: var(--seed-color-fg-neutral);
5424
5432
  font-variant-numeric: tabular-nums;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crispy-seed/data-table",
3
- "version": "0.12.0",
3
+ "version": "0.13.0",
4
4
  "description": "Self-contained, publishable build of seed-design's Attio-measured DataTable, ResizablePanel and RecordPreview — one install, one CSS import.",
5
5
  "repository": {
6
6
  "type": "git",