@crisp-ui-kit/crisp 0.54.11 → 0.55.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/badge.css +1 -1
  2. package/dist/badge.layered.css +1 -1
  3. package/dist/cjs/components/badge/badge.recipe.js +10 -5
  4. package/dist/cjs/components/datatable/countries.js +73 -0
  5. package/dist/cjs/components/datatable/datatable.js +318 -40
  6. package/dist/cjs/components/datatable/datatable.recipe.js +18 -1
  7. package/dist/cjs/components/resizablepanel/resizablepanel.js +10 -1
  8. package/dist/cjs/components/table/table.js +8 -1
  9. package/dist/cjs/components/tabletoolbar/tabletoolbar.js +110 -27
  10. package/dist/cjs/index.js +0 -2
  11. package/dist/cjs/product/recordpage/index.js +6 -1
  12. package/dist/cjs/product/recordpage/recordpage.js +20 -4
  13. package/dist/datatable.css +141 -102
  14. package/dist/datatable.layered.css +141 -102
  15. package/dist/esm/components/badge/badge.recipe.js +10 -5
  16. package/dist/esm/components/datatable/countries.js +68 -0
  17. package/dist/esm/components/datatable/datatable.js +319 -41
  18. package/dist/esm/components/datatable/datatable.recipe.js +18 -1
  19. package/dist/esm/components/resizablepanel/resizablepanel.js +10 -1
  20. package/dist/esm/components/table/table.js +8 -1
  21. package/dist/esm/components/tabletoolbar/tabletoolbar.js +111 -28
  22. package/dist/esm/index.js +0 -2
  23. package/dist/esm/product/recordpage/index.js +2 -0
  24. package/dist/esm/product/recordpage/recordpage.js +20 -4
  25. package/dist/styles.css +142 -375
  26. package/dist/styles.layered.css +142 -375
  27. package/dist/types/components/badge/badge.recipe.d.ts +3 -1
  28. package/dist/types/components/datatable/countries.d.ts +12 -0
  29. package/dist/types/components/datatable/datatable.d.ts +27 -3
  30. package/dist/types/components/table/table.d.ts +14 -0
  31. package/dist/types/index.d.ts +0 -2
  32. package/dist/types/product/recordpage/index.d.ts +2 -0
  33. package/package.json +2 -12
  34. package/dist/cjs/product/recordstable/company-logos.js +0 -29
  35. package/dist/cjs/product/recordstable/index.js +0 -13
  36. package/dist/cjs/product/recordstable/recordstable.js +0 -1362
  37. package/dist/cjs/product/recordstable/recordstable.recipe.js +0 -175
  38. package/dist/cjs/product/recordstable/recordstable.tag.js +0 -26
  39. package/dist/cjs/product/taskstable/index.js +0 -7
  40. package/dist/cjs/product/taskstable/taskstable.js +0 -32
  41. package/dist/cjs/product/taskstable/taskstable.recipe.js +0 -56
  42. package/dist/esm/product/recordstable/company-logos.js +0 -26
  43. package/dist/esm/product/recordstable/index.js +0 -3
  44. package/dist/esm/product/recordstable/recordstable.js +0 -1322
  45. package/dist/esm/product/recordstable/recordstable.recipe.js +0 -172
  46. package/dist/esm/product/recordstable/recordstable.tag.js +0 -23
  47. package/dist/esm/product/taskstable/index.js +0 -2
  48. package/dist/esm/product/taskstable/taskstable.js +0 -29
  49. package/dist/esm/product/taskstable/taskstable.recipe.js +0 -53
  50. package/dist/recordstable.css +0 -240
  51. package/dist/recordstable.d.ts +0 -7
  52. package/dist/recordstable.layered.css +0 -242
  53. package/dist/taskstable.css +0 -30
  54. package/dist/taskstable.d.ts +0 -7
  55. package/dist/taskstable.layered.css +0 -32
  56. package/dist/types/product/recordstable/company-logos.d.ts +0 -1
  57. package/dist/types/product/recordstable/index.d.ts +0 -3
  58. package/dist/types/product/recordstable/recordstable.d.ts +0 -294
  59. package/dist/types/product/recordstable/recordstable.recipe.d.ts +0 -5
  60. package/dist/types/product/recordstable/recordstable.tag.d.ts +0 -15
  61. package/dist/types/product/taskstable/index.d.ts +0 -2
  62. package/dist/types/product/taskstable/taskstable.d.ts +0 -59
  63. package/dist/types/product/taskstable/taskstable.recipe.d.ts +0 -3
@@ -451,6 +451,12 @@ function TableToolbar({ columns, sortColumns: sortColumnsProp, filterColumns: fi
451
451
  React.useEffect(() => {
452
452
  setImportExportTarget(importExportRef?.current ?? null);
453
453
  }, [importExportRef]);
454
+ const rootRef = React.useRef(null);
455
+ const viewSettingsTriggerRef = React.useRef(null);
456
+ const viewSettingsContentRef = React.useRef(null);
457
+ const [viewSettingsPos, setViewSettingsPos] = React.useState({});
458
+ const importExportTriggerRef = React.useRef(null);
459
+ const [importExportPos, setImportExportPos] = React.useState({});
454
460
  const [openMenu, setOpenMenu] = React.useState(null);
455
461
  const [dragSort, setDragSort] = React.useState(null);
456
462
  const [filterQuery, setFilterQuery] = React.useState("");
@@ -478,6 +484,65 @@ function TableToolbar({ columns, sortColumns: sortColumnsProp, filterColumns: fi
478
484
  // built here -- hiding an attribute is a trailing control instead, see
479
485
  // the hide button below).
480
486
  const [addingAttribute, setAddingAttribute] = React.useState(false);
487
+ // crisp/#807: `viewSettingsRef`/`importExportRef` (#766) relocate the
488
+ // TRIGGER out of this toolbar's own row, but their POPOVERS stayed
489
+ // `position: absolute` inside the (now relocated) trigger's own
490
+ // `.crisp-tabletoolbar-toolgroup` -- correct chrome-wise (#772 already
491
+ // fixed that), but its stacking is trapped inside whatever DOM branch the
492
+ // consumer's own `viewSettingsRef` slot lives in. A consumer header
493
+ // sitting in an EARLIER sibling branch than the toolbar/grid below it
494
+ // (GRC's own layout) has that later branch simply paint over the popover
495
+ // regardless of its own z-index: 30, because z-index only orders siblings
496
+ // WITHIN the same stacking context, and the two branches aren't one.
497
+ // Fixed the same way `Menu`/`Select`/`Popover` already solve this: the
498
+ // popover content itself portals to `document.body` (`FloatingPortal`),
499
+ // positioned with `placeFloating` against the trigger's own rect (a real
500
+ // `position: fixed` box, anchored by viewport coordinates, escapes ANY
501
+ // ancestor's stacking context) -- not just relocated alongside the
502
+ // trigger. Wrapped in its own `tabletoolbarRecipe()` span (the same
503
+ // reason `ViewBarSlot` wraps the trigger) so every nested
504
+ // `.crisp-tabletoolbar-*` class inside the popover still resolves once
505
+ // portaled outside the toolbar's own root. Sort/Filter's own popovers
506
+ // are untouched -- they never relocate, so they were never trapped.
507
+ const placeViewSettingsMenu = () => {
508
+ const rect = viewSettingsTriggerRef.current?.getBoundingClientRect();
509
+ if (!rect)
510
+ return;
511
+ const { style } = (0, core_1.placeFloating)({
512
+ rect,
513
+ gap: 4,
514
+ flipBelow: 280,
515
+ anchor: viewSettingsTriggerRef.current,
516
+ });
517
+ setViewSettingsPos(style);
518
+ };
519
+ // biome-ignore lint/correctness/useExhaustiveDependencies: reposition each time it opens (and when its own screen changes, since the two screens differ in height)
520
+ React.useLayoutEffect(() => {
521
+ if (openMenu === "viewsettings")
522
+ placeViewSettingsMenu();
523
+ }, [openMenu, addingAttribute]);
524
+ React.useEffect(() => {
525
+ if (openMenu !== "viewsettings" || !viewSettingsContentRef.current)
526
+ return;
527
+ return (0, core_1.registerFloatingLayer)(viewSettingsContentRef.current);
528
+ }, [openMenu]);
529
+ const placeImportExportMenu = () => {
530
+ const rect = importExportTriggerRef.current?.getBoundingClientRect();
531
+ if (!rect)
532
+ return;
533
+ const { style } = (0, core_1.placeFloating)({
534
+ rect,
535
+ gap: 4,
536
+ flipBelow: 280,
537
+ anchor: importExportTriggerRef.current,
538
+ });
539
+ setImportExportPos(style);
540
+ };
541
+ // biome-ignore lint/correctness/useExhaustiveDependencies: reposition each time it opens
542
+ React.useLayoutEffect(() => {
543
+ if (openMenu === "importexport")
544
+ placeImportExportMenu();
545
+ }, [openMenu]);
481
546
  // close any open menu on outside click (anything not inside a menu or its
482
547
  // trigger) or Escape
483
548
  React.useEffect(() => {
@@ -628,6 +693,13 @@ function TableToolbar({ columns, sortColumns: sortColumnsProp, filterColumns: fi
628
693
  close: () => setOpenMenu(null),
629
694
  contentRef: importExportMenuRef,
630
695
  });
696
+ // crisp/#807: registers the (now-portaled) Import/Export menu on the
697
+ // shared floating-layer stack, the same reason `Menu` itself does.
698
+ React.useEffect(() => {
699
+ if (openMenu !== "importexport" || !importExportMenuRef.current)
700
+ return;
701
+ return (0, core_1.registerFloatingLayer)(importExportMenuRef.current);
702
+ }, [openMenu]);
631
703
  // #754: generalized from the Filter-only `filterFieldPicker` (#592) to
632
704
  // also drive Sort's own field picker and View settings' add-attribute
633
705
  // screen — all three offer the identical nested-drill-down construct on
@@ -700,7 +772,7 @@ function TableToolbar({ columns, sortColumns: sortColumnsProp, filterColumns: fi
700
772
  : sorts.length
701
773
  ? `${crispMessages["Sorted by"] ?? "Sorted by"} ${sortField}${sorts.length > 1 ? ` +${sorts.length - 1}` : ""}`
702
774
  : sortLabel;
703
- return ((0, jsx_runtime_1.jsx)("div", { className: (0, tabletoolbar_recipe_1.tabletoolbarRecipe)({ className }), ...rest, children: (0, jsx_runtime_1.jsxs)("div", { className: "crisp-tabletoolbar-toolbar", "data-inline": inline ? "" : undefined, children: [showSort && ((0, jsx_runtime_1.jsxs)("span", { className: "crisp-tabletoolbar-toolgroup", children: [(0, jsx_runtime_1.jsxs)("button", { type: "button", className: `crisp-tabletoolbar-tool${sorts.length ? " crisp-tabletoolbar-tool--active" : " crisp-tabletoolbar-tool--dashed"}`, onClick: () => setOpenMenu(openMenu === "sort" ? null : "sort"), "aria-haspopup": "dialog", "aria-expanded": openMenu === "sort", "data-menu-trigger": true, children: [(0, jsx_runtime_1.jsx)(lucide_react_1.ArrowUpDown, { size: 14, strokeWidth: 1.75, "aria-hidden": "true" }), sortTriggerLabel || !sorts.length ? (sortedLabel) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("span", { className: "crisp-tabletoolbar-sorted-prefix", children: crispMessages["Sorted by"] ?? "Sorted by" }), " ", (0, jsx_runtime_1.jsx)("span", { className: "crisp-tabletoolbar-sorted-field", children: sortField }), sorts.length > 1 && ((0, jsx_runtime_1.jsxs)("span", { className: "crisp-tabletoolbar-sorted-count", children: [" ", "+", sorts.length - 1] }))] }))] }), openMenu === "sort" && ((0, jsx_runtime_1.jsxs)("div", { ref: sortListRef, className: "crisp-tabletoolbar-menu crisp-tabletoolbar-sortpop", role: "dialog", "aria-label": sortLabel, children: [sorts.length === 0 ? ((0, jsx_runtime_1.jsx)("div", { className: "crisp-tabletoolbar-sort-empty", children: noSortsLabel })) : (sorts.map((s, i) => ((0, jsx_runtime_1.jsxs)("div", { className: "crisp-tabletoolbar-sort-row", onDragOver: (e) => {
775
+ return ((0, jsx_runtime_1.jsx)("div", { ref: rootRef, className: (0, tabletoolbar_recipe_1.tabletoolbarRecipe)({ className }), ...rest, children: (0, jsx_runtime_1.jsxs)("div", { className: "crisp-tabletoolbar-toolbar", "data-inline": inline ? "" : undefined, children: [showSort && ((0, jsx_runtime_1.jsxs)("span", { className: "crisp-tabletoolbar-toolgroup", children: [(0, jsx_runtime_1.jsxs)("button", { type: "button", className: `crisp-tabletoolbar-tool${sorts.length ? " crisp-tabletoolbar-tool--active" : " crisp-tabletoolbar-tool--dashed"}`, onClick: () => setOpenMenu(openMenu === "sort" ? null : "sort"), "aria-haspopup": "dialog", "aria-expanded": openMenu === "sort", "data-menu-trigger": true, children: [(0, jsx_runtime_1.jsx)(lucide_react_1.ArrowUpDown, { size: 14, strokeWidth: 1.75, "aria-hidden": "true" }), sortTriggerLabel || !sorts.length ? (sortedLabel) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("span", { className: "crisp-tabletoolbar-sorted-prefix", children: crispMessages["Sorted by"] ?? "Sorted by" }), " ", (0, jsx_runtime_1.jsx)("span", { className: "crisp-tabletoolbar-sorted-field", children: sortField }), sorts.length > 1 && ((0, jsx_runtime_1.jsxs)("span", { className: "crisp-tabletoolbar-sorted-count", children: [" ", "+", sorts.length - 1] }))] }))] }), openMenu === "sort" && ((0, jsx_runtime_1.jsxs)("div", { ref: sortListRef, className: "crisp-tabletoolbar-menu crisp-tabletoolbar-sortpop", role: "dialog", "aria-label": sortLabel, children: [sorts.length === 0 ? ((0, jsx_runtime_1.jsx)("div", { className: "crisp-tabletoolbar-sort-empty", children: noSortsLabel })) : (sorts.map((s, i) => ((0, jsx_runtime_1.jsxs)("div", { className: "crisp-tabletoolbar-sort-row", onDragOver: (e) => {
704
776
  if (dragSort !== null)
705
777
  e.preventDefault();
706
778
  }, onDrop: () => {
@@ -836,7 +908,7 @@ function TableToolbar({ columns, sortColumns: sortColumnsProp, filterColumns: fi
836
908
  }, children: label }, label))) })] })) : ((0, jsx_runtime_1.jsx)("input", { className: "crisp-tabletoolbar-menu-input", type: col?.type === "number" ? "number" : "text", placeholder: filterValuePlaceholder, "aria-label": `${col?.label} filter value`,
837
909
  // biome-ignore lint/a11y/noAutofocus: focus the value field
838
910
  autoFocus: true, value: cond.value, onChange: (e) => patchFilter(cond.id, { value: e.target.value }) })) }))] }, cond.id));
839
- }), showViewSettings && !viewSettingsTarget && ((0, jsx_runtime_1.jsx)("span", { className: "crisp-tabletoolbar-divider", "aria-hidden": "true" })), showViewSettings && ((0, jsx_runtime_1.jsx)(ViewBarSlot, { target: viewSettingsTarget, children: (0, jsx_runtime_1.jsxs)("span", { className: "crisp-tabletoolbar-toolgroup", children: [(0, jsx_runtime_1.jsxs)("button", { type: "button", className: "crisp-tabletoolbar-tool crisp-tabletoolbar-tool--raised", onClick: () => {
911
+ }), showViewSettings && !viewSettingsTarget && ((0, jsx_runtime_1.jsx)("span", { className: "crisp-tabletoolbar-divider", "aria-hidden": "true" })), showViewSettings && ((0, jsx_runtime_1.jsx)(ViewBarSlot, { target: viewSettingsTarget, children: (0, jsx_runtime_1.jsxs)("span", { className: "crisp-tabletoolbar-toolgroup", children: [(0, jsx_runtime_1.jsxs)("button", { ref: viewSettingsTriggerRef, type: "button", className: "crisp-tabletoolbar-tool crisp-tabletoolbar-tool--raised", onClick: () => {
840
912
  if (openMenu === "viewsettings") {
841
913
  setOpenMenu(null);
842
914
  }
@@ -846,33 +918,44 @@ function TableToolbar({ columns, sortColumns: sortColumnsProp, filterColumns: fi
846
918
  setFilterQuery("");
847
919
  setOpenMenu("viewsettings");
848
920
  }
849
- }, "aria-haspopup": "dialog", "aria-expanded": openMenu === "viewsettings", "data-menu-trigger": true, children: [(0, jsx_runtime_1.jsx)(lucide_react_1.SlidersHorizontal, { size: 14, strokeWidth: 1.75, "aria-hidden": "true" }), viewSettingsLabel, (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronDown, { size: 14, strokeWidth: 1.75, "aria-hidden": "true" })] }), openMenu === "viewsettings" &&
850
- (addingAttribute ? ((0, jsx_runtime_1.jsx)("div", { className: "crisp-tabletoolbar-menu", role: "dialog", "aria-label": addAttributeToViewLabel, children: nestedFieldPicker(hiddenAttrs, showAttr, searchAttributesPlaceholder, searchAttributesPlaceholder) })) : ((0, jsx_runtime_1.jsxs)("div", { className: "crisp-tabletoolbar-menu crisp-tabletoolbar-sortpop", role: "dialog", "aria-label": viewSettingsLabel, children: [shownAttrs.map((col, i) => ((0, jsx_runtime_1.jsxs)("div", { className: "crisp-tabletoolbar-sort-row", onDragOver: (e) => {
851
- if (dragAttr !== null)
852
- e.preventDefault();
853
- }, onDrop: () => {
854
- if (dragAttr !== null)
855
- moveAttr(dragAttr, i);
856
- setDragAttr(null);
857
- }, children: [(0, jsx_runtime_1.jsx)("button", { type: "button", className: "crisp-tabletoolbar-sort-grip", "aria-label": reorderAttributeLabel, draggable: true, onDragStart: () => setDragAttr(i), onDragEnd: () => setDragAttr(null), children: (0, jsx_runtime_1.jsx)(lucide_react_1.GripVertical, { size: 15, strokeWidth: 1.75 }) }), (0, jsx_runtime_1.jsxs)("span", { className: "crisp-tabletoolbar-sort-optlabel crisp-tabletoolbar-sort-field", children: [col.icon ? ((0, jsx_runtime_1.jsx)(col.icon, { size: 15, strokeWidth: 1.75 })) : null, col.label] }), (0, jsx_runtime_1.jsx)("button", { type: "button", className: "crisp-tabletoolbar-sort-remove", onClick: () => hideAttr(col.key), "aria-label": hideAttributeLabel?.(col.label) ??
858
- `${crispMessages.Hide ?? "Hide"} ${col.label} ${crispMessages["from view"] ?? "from view"}`, children: (0, jsx_runtime_1.jsx)(lucide_react_1.X, { size: 15, strokeWidth: 1.75 }) })] }, col.key))), (0, jsx_runtime_1.jsx)("div", { className: "crisp-tabletoolbar-sort-addrow", children: (0, jsx_runtime_1.jsxs)("button", { type: "button", className: "crisp-tabletoolbar-sort-add", onClick: () => {
859
- setAddingAttribute(true);
860
- setFieldPickerPath([]);
861
- setFilterQuery("");
862
- }, children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Plus, { size: 15, strokeWidth: 1.75 }), addAttributeToViewLabel] }) })] })))] }) })), (onImportCsv ||
921
+ }, "aria-haspopup": "dialog", "aria-expanded": openMenu === "viewsettings", "data-menu-trigger": true, children: [(0, jsx_runtime_1.jsx)(lucide_react_1.SlidersHorizontal, { size: 14, strokeWidth: 1.75, "aria-hidden": "true" }), viewSettingsLabel, (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronDown, { size: 14, strokeWidth: 1.75, "aria-hidden": "true" })] }), openMenu === "viewsettings" && ((0, jsx_runtime_1.jsx)(core_1.FloatingPortal, { sourceRef: rootRef, children: (0, jsx_runtime_1.jsx)("span", { className: (0, tabletoolbar_recipe_1.tabletoolbarRecipe)(), children: addingAttribute ? ((0, jsx_runtime_1.jsx)("div", { ref: viewSettingsContentRef, className: "crisp-tabletoolbar-menu", role: "dialog", "aria-label": addAttributeToViewLabel, style: {
922
+ position: "fixed",
923
+ zIndex: 70,
924
+ ...viewSettingsPos,
925
+ }, children: nestedFieldPicker(hiddenAttrs, showAttr, searchAttributesPlaceholder, searchAttributesPlaceholder) })) : ((0, jsx_runtime_1.jsxs)("div", { ref: viewSettingsContentRef, className: "crisp-tabletoolbar-menu crisp-tabletoolbar-sortpop", role: "dialog", "aria-label": viewSettingsLabel, style: {
926
+ position: "fixed",
927
+ zIndex: 70,
928
+ ...viewSettingsPos,
929
+ }, children: [shownAttrs.map((col, i) => ((0, jsx_runtime_1.jsxs)("div", { className: "crisp-tabletoolbar-sort-row", onDragOver: (e) => {
930
+ if (dragAttr !== null)
931
+ e.preventDefault();
932
+ }, onDrop: () => {
933
+ if (dragAttr !== null)
934
+ moveAttr(dragAttr, i);
935
+ setDragAttr(null);
936
+ }, children: [(0, jsx_runtime_1.jsx)("button", { type: "button", className: "crisp-tabletoolbar-sort-grip", "aria-label": reorderAttributeLabel, draggable: true, onDragStart: () => setDragAttr(i), onDragEnd: () => setDragAttr(null), children: (0, jsx_runtime_1.jsx)(lucide_react_1.GripVertical, { size: 15, strokeWidth: 1.75 }) }), (0, jsx_runtime_1.jsxs)("span", { className: "crisp-tabletoolbar-sort-optlabel crisp-tabletoolbar-sort-field", children: [col.icon ? ((0, jsx_runtime_1.jsx)(col.icon, { size: 15, strokeWidth: 1.75 })) : null, col.label] }), (0, jsx_runtime_1.jsx)("button", { type: "button", className: "crisp-tabletoolbar-sort-remove", onClick: () => hideAttr(col.key), "aria-label": hideAttributeLabel?.(col.label) ??
937
+ `${crispMessages.Hide ?? "Hide"} ${col.label} ${crispMessages["from view"] ?? "from view"}`, children: (0, jsx_runtime_1.jsx)(lucide_react_1.X, { size: 15, strokeWidth: 1.75 }) })] }, col.key))), (0, jsx_runtime_1.jsx)("div", { className: "crisp-tabletoolbar-sort-addrow", children: (0, jsx_runtime_1.jsxs)("button", { type: "button", className: "crisp-tabletoolbar-sort-add", onClick: () => {
938
+ setAddingAttribute(true);
939
+ setFieldPickerPath([]);
940
+ setFilterQuery("");
941
+ }, children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Plus, { size: 15, strokeWidth: 1.75 }), addAttributeToViewLabel] }) })] })) }) }))] }) })), (onImportCsv ||
863
942
  onExportCsv ||
864
943
  onExportExcel ||
865
- importExportHelpHref) && ((0, jsx_runtime_1.jsx)(ViewBarSlot, { target: importExportTarget, children: (0, jsx_runtime_1.jsxs)("span", { className: "crisp-tabletoolbar-toolgroup", children: [(0, jsx_runtime_1.jsxs)("button", { type: "button", className: "crisp-tabletoolbar-tool crisp-tabletoolbar-tool--raised", onClick: () => setOpenMenu(openMenu === "importexport" ? null : "importexport"), "aria-haspopup": "menu", "aria-expanded": openMenu === "importexport", "data-menu-trigger": true, children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Upload, { size: 14, strokeWidth: 1.75, "aria-hidden": "true" }), importExportLabel, (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronDown, { size: 14, strokeWidth: 1.75, "aria-hidden": "true" })] }), openMenu === "importexport" && ((0, jsx_runtime_1.jsxs)("div", { ref: importExportMenuRef, className: "crisp-tabletoolbar-menu", role: "menu", "aria-label": importExportLabel, onKeyDown: onImportExportKeyDown, children: [onImportCsv && ((0, jsx_runtime_1.jsxs)("button", { type: "button", role: "menuitem", className: "crisp-tabletoolbar-menu-item", onClick: () => {
866
- onImportCsv();
867
- setOpenMenu(null);
868
- }, children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Upload, { size: 15, strokeWidth: 1.75 }), importCsvLabel] })), onImportCsv && (onExportCsv || onExportExcel) && ((0, jsx_runtime_1.jsx)("hr", { className: "crisp-tabletoolbar-menu-sep" })), onExportCsv && ((0, jsx_runtime_1.jsxs)("button", { type: "button", role: "menuitem", className: "crisp-tabletoolbar-menu-item", onClick: () => {
869
- onExportCsv();
870
- setOpenMenu(null);
871
- }, children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Download, { size: 15, strokeWidth: 1.75 }), exportCsvLabel] })), onExportExcel && ((0, jsx_runtime_1.jsxs)("button", { type: "button", role: "menuitem", className: "crisp-tabletoolbar-menu-item", onClick: () => {
872
- onExportExcel();
873
- setOpenMenu(null);
874
- }, children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Download, { size: 15, strokeWidth: 1.75 }), exportExcelLabel] })), importExportHelpHref &&
875
- (onImportCsv || onExportCsv || onExportExcel) && ((0, jsx_runtime_1.jsx)("hr", { className: "crisp-tabletoolbar-menu-sep" })), importExportHelpHref && ((0, jsx_runtime_1.jsxs)("a", { className: "crisp-tabletoolbar-menu-item", role: "menuitem", href: importExportHelpHref, target: "_blank", rel: "noreferrer", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.CircleHelp, { size: 15, strokeWidth: 1.75 }), learnImportExportLabel] }))] }))] }) })), (0, jsx_runtime_1.jsx)("span", { className: "crisp-tabletoolbar-spacer" }), count != null && ((0, jsx_runtime_1.jsx)("span", { className: "crisp-tabletoolbar-count", children: count })), children] }) }));
944
+ importExportHelpHref) && ((0, jsx_runtime_1.jsx)(ViewBarSlot, { target: importExportTarget, children: (0, jsx_runtime_1.jsxs)("span", { className: "crisp-tabletoolbar-toolgroup", children: [(0, jsx_runtime_1.jsxs)("button", { ref: importExportTriggerRef, type: "button", className: "crisp-tabletoolbar-tool crisp-tabletoolbar-tool--raised", onClick: () => setOpenMenu(openMenu === "importexport" ? null : "importexport"), "aria-haspopup": "menu", "aria-expanded": openMenu === "importexport", "data-menu-trigger": true, children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Upload, { size: 14, strokeWidth: 1.75, "aria-hidden": "true" }), importExportLabel, (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronDown, { size: 14, strokeWidth: 1.75, "aria-hidden": "true" })] }), openMenu === "importexport" && ((0, jsx_runtime_1.jsx)(core_1.FloatingPortal, { sourceRef: rootRef, children: (0, jsx_runtime_1.jsx)("span", { className: (0, tabletoolbar_recipe_1.tabletoolbarRecipe)(), children: (0, jsx_runtime_1.jsxs)("div", { ref: importExportMenuRef, className: "crisp-tabletoolbar-menu", role: "menu", "aria-label": importExportLabel, onKeyDown: onImportExportKeyDown, style: {
945
+ position: "fixed",
946
+ zIndex: 70,
947
+ ...importExportPos,
948
+ }, children: [onImportCsv && ((0, jsx_runtime_1.jsxs)("button", { type: "button", role: "menuitem", className: "crisp-tabletoolbar-menu-item", onClick: () => {
949
+ onImportCsv();
950
+ setOpenMenu(null);
951
+ }, children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Upload, { size: 15, strokeWidth: 1.75 }), importCsvLabel] })), onImportCsv && (onExportCsv || onExportExcel) && ((0, jsx_runtime_1.jsx)("hr", { className: "crisp-tabletoolbar-menu-sep" })), onExportCsv && ((0, jsx_runtime_1.jsxs)("button", { type: "button", role: "menuitem", className: "crisp-tabletoolbar-menu-item", onClick: () => {
952
+ onExportCsv();
953
+ setOpenMenu(null);
954
+ }, children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Download, { size: 15, strokeWidth: 1.75 }), exportCsvLabel] })), onExportExcel && ((0, jsx_runtime_1.jsxs)("button", { type: "button", role: "menuitem", className: "crisp-tabletoolbar-menu-item", onClick: () => {
955
+ onExportExcel();
956
+ setOpenMenu(null);
957
+ }, children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Download, { size: 15, strokeWidth: 1.75 }), exportExcelLabel] })), importExportHelpHref &&
958
+ (onImportCsv || onExportCsv || onExportExcel) && ((0, jsx_runtime_1.jsx)("hr", { className: "crisp-tabletoolbar-menu-sep" })), importExportHelpHref && ((0, jsx_runtime_1.jsxs)("a", { className: "crisp-tabletoolbar-menu-item", role: "menuitem", href: importExportHelpHref, target: "_blank", rel: "noreferrer", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.CircleHelp, { size: 15, strokeWidth: 1.75 }), learnImportExportLabel] }))] }) }) }))] }) })), (0, jsx_runtime_1.jsx)("span", { className: "crisp-tabletoolbar-spacer" }), count != null && ((0, jsx_runtime_1.jsx)("span", { className: "crisp-tabletoolbar-count", children: count })), children] }) }));
876
959
  }
877
960
  /**
878
961
  * The Sort/Filter chip's own chrome (`.crisp-tabletoolbar-tool`), standalone
package/dist/cjs/index.js CHANGED
@@ -102,7 +102,6 @@ __exportStar(require("./product/objectsettings"), exports);
102
102
  __exportStar(require("./product/onboarding"), exports);
103
103
  __exportStar(require("./product/recordpage"), exports);
104
104
  __exportStar(require("./product/recordpanel"), exports);
105
- __exportStar(require("./product/recordstable"), exports);
106
105
  __exportStar(require("./product/richtext"), exports);
107
106
  __exportStar(require("./product/savedviews"), exports);
108
107
  __exportStar(require("./product/settingssection"), exports);
@@ -110,7 +109,6 @@ __exportStar(require("./product/settingsshell"), exports);
110
109
  __exportStar(require("./product/sidebar"), exports);
111
110
  __exportStar(require("./product/statlist"), exports);
112
111
  __exportStar(require("./product/tasklist"), exports);
113
- __exportStar(require("./product/taskstable"), exports);
114
112
  __exportStar(require("./product/themepicker"), exports);
115
113
  __exportStar(require("./product/trialbanner"), exports);
116
114
  __exportStar(require("./product/viewtoggle"), exports);
@@ -1,6 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.recordpageRecipe = exports.recordPageLabels = exports.RecordPage = exports.RecordDetails = void 0;
3
+ exports.recordpageRecipe = exports.recordPageLabels = exports.RecordPage = exports.RecordDetails = exports.useEditableField = exports.editableInputType = exports.tagTone = void 0;
4
+ var column_1 = require("./column");
5
+ Object.defineProperty(exports, "tagTone", { enumerable: true, get: function () { return column_1.tagTone; } });
6
+ var editable_field_1 = require("./editable-field");
7
+ Object.defineProperty(exports, "editableInputType", { enumerable: true, get: function () { return editable_field_1.editableInputType; } });
8
+ Object.defineProperty(exports, "useEditableField", { enumerable: true, get: function () { return editable_field_1.useEditableField; } });
4
9
  var recordpage_1 = require("./recordpage");
5
10
  Object.defineProperty(exports, "RecordDetails", { enumerable: true, get: function () { return recordpage_1.RecordDetails; } });
6
11
  Object.defineProperty(exports, "RecordPage", { enumerable: true, get: function () { return recordpage_1.RecordPage; } });
@@ -50,6 +50,20 @@ const core_1 = require("../../core");
50
50
  const column_1 = require("./column");
51
51
  const editable_field_1 = require("./editable-field");
52
52
  const recordpage_recipe_1 = require("./recordpage.recipe");
53
+ // crisp/#798: the details column's own drag clamp -- re-measured live on
54
+ // Attio's own record page (a real drag test, not a source read): min 619px,
55
+ // max 1170px, default (also the double-click-reset target) 734px. These
56
+ // replace an earlier, much narrower 300/560/320 that was never actually
57
+ // checked against Attio and turned out roughly half the real max. Confirmed
58
+ // live these are literal px, not a viewport ratio: at a narrower emulated
59
+ // width the already-dragged-to-max column shrank below 1170px, but its OWN
60
+ // `getComputedStyle(...).width` still read a plain px number the whole
61
+ // time (not a `%`) — that shrink is ordinary flex-shrink (both panels
62
+ // share `flex: 1 1 auto` and can't both keep their preferred width once the
63
+ // window is too narrow), not the clamp itself changing with viewport width.
64
+ const DETAILS_MIN_W = 619;
65
+ const DETAILS_MAX_W = 1170;
66
+ const DETAILS_DEFAULT_W = 734;
53
67
  function valueEmpty(v) {
54
68
  return v == null || v === "" || (Array.isArray(v) && v.length === 0);
55
69
  }
@@ -457,7 +471,7 @@ function RecordPage({ record, columns, collection = "Records", labels, onBack, o
457
471
  const tasks = tasksProp ?? internalTasks;
458
472
  const [showAllActivity, setShowAllActivity] = React.useState(false);
459
473
  // Drag-resizable left details column.
460
- const [detailsW, setDetailsW] = React.useState(320);
474
+ const [detailsW, setDetailsW] = React.useState(DETAILS_DEFAULT_W);
461
475
  const [resizing, setResizing] = React.useState(false);
462
476
  const dragRef = React.useRef(null);
463
477
  const onResizeDown = (e) => {
@@ -475,7 +489,7 @@ function RecordPage({ record, columns, collection = "Records", labels, onBack, o
475
489
  if (!dragRef.current)
476
490
  return;
477
491
  const next = dragRef.current.w + dragRef.current.dir * (e.clientX - dragRef.current.x);
478
- setDetailsW(Math.max(300, Math.min(560, next)));
492
+ setDetailsW(Math.max(DETAILS_MIN_W, Math.min(DETAILS_MAX_W, next)));
479
493
  };
480
494
  const onResizeUp = (e) => {
481
495
  dragRef.current = null;
@@ -660,7 +674,7 @@ function RecordPage({ record, columns, collection = "Records", labels, onBack, o
660
674
  const effectivePanel = tabsProp
661
675
  ? (active) => tabsProp.find((tb) => tb.id === active)?.render()
662
676
  : builtinPanel;
663
- return ((0, jsx_runtime_1.jsxs)("div", { className: (0, recordpage_recipe_1.recordpageRecipe)({ className }), ...rest, children: [(0, jsx_runtime_1.jsxs)("div", { className: "crisp-recordpage-topbar", children: [(0, jsx_runtime_1.jsxs)("nav", { className: "crisp-recordpage-crumbs", "aria-label": t.breadcrumb, children: [(0, jsx_runtime_1.jsx)("button", { type: "button", className: "crisp-recordpage-crumb", onClick: onBack, "aria-label": `Back to ${collection}`, children: collection }), (0, jsx_runtime_1.jsx)("span", { className: "crisp-recordpage-crumb-sep", children: "/" }), (0, jsx_runtime_1.jsx)("span", { className: "crisp-recordpage-crumb-name", children: name })] }), (0, jsx_runtime_1.jsxs)("div", { className: "crisp-recordpage-actions", children: [(0, jsx_runtime_1.jsxs)("button", { type: "button", className: "crisp-recordpage-action crisp-recordpage-action--ghost", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Sparkles, { size: 14, strokeWidth: 1.75, color: "var(--crisp-bg-brand-solid)" }), t.askAttio] }), onToggleFull && ((0, jsx_runtime_1.jsx)("button", { type: "button", className: "crisp-recordpage-action crisp-recordpage-action--icon", onClick: onToggleFull, "aria-label": full ? t.exitFullScreen : t.fullScreen, children: full ? ((0, jsx_runtime_1.jsx)(lucide_react_1.Minimize2, { size: 15, strokeWidth: 1.75 })) : ((0, jsx_runtime_1.jsx)(lucide_react_1.Maximize2, { size: 15, strokeWidth: 1.75 })) })), (0, jsx_runtime_1.jsxs)(menu_1.Menu, { align: "end", "aria-label": t.recordActions, trigger: (0, jsx_runtime_1.jsx)("button", { type: "button", className: "crisp-recordpage-action crisp-recordpage-action--icon", "aria-label": t.recordActions, children: (0, jsx_runtime_1.jsx)(lucide_react_1.MoreHorizontal, { size: 16, strokeWidth: 1.75 }) }), children: [(0, jsx_runtime_1.jsx)(menu_1.MenuItem, { icon: (0, jsx_runtime_1.jsx)(lucide_react_1.Copy, { size: 15, strokeWidth: 1.75 }), shortcut: "\u2318C", children: t.copyRecordLink }), (0, jsx_runtime_1.jsx)(menu_1.MenuItem, { icon: (0, jsx_runtime_1.jsx)(lucide_react_1.Plus, { size: 15, strokeWidth: 1.75 }), children: t.addToList }), (0, jsx_runtime_1.jsx)(menu_1.MenuItem, { icon: (0, jsx_runtime_1.jsx)(lucide_react_1.Star, { size: 15, strokeWidth: 1.75 }), onSelect: () => setFavorite((f) => !f), children: favorite ? t.removeFromFavourites : t.addToFavourites }), (0, jsx_runtime_1.jsx)(menu_1.MenuSeparator, {}), (0, jsx_runtime_1.jsx)(menu_1.MenuItem, { icon: (0, jsx_runtime_1.jsx)(lucide_react_1.Trash2, { size: 15, strokeWidth: 1.75 }), danger: true, shortcut: "\u232B", children: t.deleteRecord })] })] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "crisp-recordpage-body", children: [(0, jsx_runtime_1.jsxs)("aside", { className: "crisp-recordpage-details", style: { width: detailsW }, children: [(0, jsx_runtime_1.jsxs)("div", { className: "crisp-recordpage-entity", children: [entity?.avatar ? ((0, jsx_runtime_1.jsx)("img", { className: "crisp-recordpage-entity-logo", src: entity.avatar, alt: "" })) : ((0, jsx_runtime_1.jsx)(avatar_1.Avatar, { size: "lg", shape: "rounded", tone: "brand", children: name.charAt(0) })), (0, jsx_runtime_1.jsx)("span", { className: "crisp-recordpage-entity-name", children: name }), (0, jsx_runtime_1.jsx)("button", { type: "button", className: "crisp-recordpage-entity-iconbtn", "aria-label": t.editRecord, children: (0, jsx_runtime_1.jsx)(lucide_react_1.Pencil, { size: 15, strokeWidth: 1.75 }) }), (0, jsx_runtime_1.jsx)("button", { type: "button", className: "crisp-recordpage-entity-iconbtn", "data-active": favorite ? "" : undefined, "aria-pressed": favorite, onClick: () => setFavorite((f) => !f), "aria-label": favorite ? t.removeFromFavourites : t.addToFavourites, children: (0, jsx_runtime_1.jsx)(lucide_react_1.Star, { size: 15, strokeWidth: 1.75 }) })] }), (0, jsx_runtime_1.jsxs)("div", { className: "crisp-recordpage-quickactions", children: [(0, jsx_runtime_1.jsxs)("button", { type: "button", className: "crisp-recordpage-compose", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Mail, { size: 16, strokeWidth: 1.75 }), t.composeEmail] }), (0, jsx_runtime_1.jsx)("button", { type: "button", className: "crisp-recordpage-quickbtn", "aria-label": t.copyRecordLink, children: (0, jsx_runtime_1.jsx)(lucide_react_1.Copy, { size: 15, strokeWidth: 1.75 }) }), (0, jsx_runtime_1.jsx)("button", { type: "button", className: "crisp-recordpage-quickbtn", "aria-label": t.logANote, children: (0, jsx_runtime_1.jsx)(lucide_react_1.FileText, { size: 15, strokeWidth: 1.75 }) }), (0, jsx_runtime_1.jsx)("button", { type: "button", className: "crisp-recordpage-quickbtn", "aria-label": t.linkRecords, children: (0, jsx_runtime_1.jsx)(lucide_react_1.Share2, { size: 15, strokeWidth: 1.75 }) }), (0, jsx_runtime_1.jsx)("button", { type: "button", className: "crisp-recordpage-quickbtn", "aria-label": t.createATask, children: (0, jsx_runtime_1.jsx)(lucide_react_1.SquareCheck, { size: 15, strokeWidth: 1.75 }) })] }), (0, jsx_runtime_1.jsx)(RecordDetails, { record: record, columns: columns, sections: sections, onEdit: onEdit, labels: labels }), (0, jsx_runtime_1.jsxs)("div", { className: "crisp-recordpage-section", children: [(0, jsx_runtime_1.jsx)(SectionHead, { title: t.tabs.lists, action: (0, jsx_runtime_1.jsxs)("button", { type: "button", className: "crisp-recordpage-addbtn", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Plus, { size: 14, strokeWidth: 2 }), t.addToList] }) }), (0, jsx_runtime_1.jsx)("div", { className: "crisp-recordpage-emptystate", children: t.noLists })] })] }), (0, jsx_runtime_1.jsx)("div", { className: "crisp-recordpage-resizer", "data-active": resizing ? "" : undefined, role: "separator", "aria-orientation": "vertical", "aria-label": t.resizeDetails, "aria-valuenow": Math.round(detailsW), "aria-valuemin": 300, "aria-valuemax": 560, tabIndex: 0, onPointerDown: onResizeDown, onPointerMove: onResizeMove, onPointerUp: onResizeUp, onKeyDown: (e) => {
677
+ return ((0, jsx_runtime_1.jsxs)("div", { className: (0, recordpage_recipe_1.recordpageRecipe)({ className }), ...rest, children: [(0, jsx_runtime_1.jsxs)("div", { className: "crisp-recordpage-topbar", children: [(0, jsx_runtime_1.jsxs)("nav", { className: "crisp-recordpage-crumbs", "aria-label": t.breadcrumb, children: [(0, jsx_runtime_1.jsx)("button", { type: "button", className: "crisp-recordpage-crumb", onClick: onBack, "aria-label": `Back to ${collection}`, children: collection }), (0, jsx_runtime_1.jsx)("span", { className: "crisp-recordpage-crumb-sep", children: "/" }), (0, jsx_runtime_1.jsx)("span", { className: "crisp-recordpage-crumb-name", children: name })] }), (0, jsx_runtime_1.jsxs)("div", { className: "crisp-recordpage-actions", children: [(0, jsx_runtime_1.jsxs)("button", { type: "button", className: "crisp-recordpage-action crisp-recordpage-action--ghost", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Sparkles, { size: 14, strokeWidth: 1.75, color: "var(--crisp-bg-brand-solid)" }), t.askAttio] }), onToggleFull && ((0, jsx_runtime_1.jsx)("button", { type: "button", className: "crisp-recordpage-action crisp-recordpage-action--icon", onClick: onToggleFull, "aria-label": full ? t.exitFullScreen : t.fullScreen, children: full ? ((0, jsx_runtime_1.jsx)(lucide_react_1.Minimize2, { size: 15, strokeWidth: 1.75 })) : ((0, jsx_runtime_1.jsx)(lucide_react_1.Maximize2, { size: 15, strokeWidth: 1.75 })) })), (0, jsx_runtime_1.jsxs)(menu_1.Menu, { align: "end", "aria-label": t.recordActions, trigger: (0, jsx_runtime_1.jsx)("button", { type: "button", className: "crisp-recordpage-action crisp-recordpage-action--icon", "aria-label": t.recordActions, children: (0, jsx_runtime_1.jsx)(lucide_react_1.MoreHorizontal, { size: 16, strokeWidth: 1.75 }) }), children: [(0, jsx_runtime_1.jsx)(menu_1.MenuItem, { icon: (0, jsx_runtime_1.jsx)(lucide_react_1.Copy, { size: 15, strokeWidth: 1.75 }), shortcut: "\u2318C", children: t.copyRecordLink }), (0, jsx_runtime_1.jsx)(menu_1.MenuItem, { icon: (0, jsx_runtime_1.jsx)(lucide_react_1.Plus, { size: 15, strokeWidth: 1.75 }), children: t.addToList }), (0, jsx_runtime_1.jsx)(menu_1.MenuItem, { icon: (0, jsx_runtime_1.jsx)(lucide_react_1.Star, { size: 15, strokeWidth: 1.75 }), onSelect: () => setFavorite((f) => !f), children: favorite ? t.removeFromFavourites : t.addToFavourites }), (0, jsx_runtime_1.jsx)(menu_1.MenuSeparator, {}), (0, jsx_runtime_1.jsx)(menu_1.MenuItem, { icon: (0, jsx_runtime_1.jsx)(lucide_react_1.Trash2, { size: 15, strokeWidth: 1.75 }), danger: true, shortcut: "\u232B", children: t.deleteRecord })] })] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "crisp-recordpage-body", children: [(0, jsx_runtime_1.jsxs)("aside", { className: "crisp-recordpage-details", style: { width: detailsW }, children: [(0, jsx_runtime_1.jsxs)("div", { className: "crisp-recordpage-entity", children: [entity?.avatar ? ((0, jsx_runtime_1.jsx)("img", { className: "crisp-recordpage-entity-logo", src: entity.avatar, alt: "" })) : ((0, jsx_runtime_1.jsx)(avatar_1.Avatar, { size: "lg", shape: "rounded", tone: "brand", children: name.charAt(0) })), (0, jsx_runtime_1.jsx)("span", { className: "crisp-recordpage-entity-name", children: name }), (0, jsx_runtime_1.jsx)("button", { type: "button", className: "crisp-recordpage-entity-iconbtn", "aria-label": t.editRecord, children: (0, jsx_runtime_1.jsx)(lucide_react_1.Pencil, { size: 15, strokeWidth: 1.75 }) }), (0, jsx_runtime_1.jsx)("button", { type: "button", className: "crisp-recordpage-entity-iconbtn", "data-active": favorite ? "" : undefined, "aria-pressed": favorite, onClick: () => setFavorite((f) => !f), "aria-label": favorite ? t.removeFromFavourites : t.addToFavourites, children: (0, jsx_runtime_1.jsx)(lucide_react_1.Star, { size: 15, strokeWidth: 1.75 }) })] }), (0, jsx_runtime_1.jsxs)("div", { className: "crisp-recordpage-quickactions", children: [(0, jsx_runtime_1.jsxs)("button", { type: "button", className: "crisp-recordpage-compose", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Mail, { size: 16, strokeWidth: 1.75 }), t.composeEmail] }), (0, jsx_runtime_1.jsx)("button", { type: "button", className: "crisp-recordpage-quickbtn", "aria-label": t.copyRecordLink, children: (0, jsx_runtime_1.jsx)(lucide_react_1.Copy, { size: 15, strokeWidth: 1.75 }) }), (0, jsx_runtime_1.jsx)("button", { type: "button", className: "crisp-recordpage-quickbtn", "aria-label": t.logANote, children: (0, jsx_runtime_1.jsx)(lucide_react_1.FileText, { size: 15, strokeWidth: 1.75 }) }), (0, jsx_runtime_1.jsx)("button", { type: "button", className: "crisp-recordpage-quickbtn", "aria-label": t.linkRecords, children: (0, jsx_runtime_1.jsx)(lucide_react_1.Share2, { size: 15, strokeWidth: 1.75 }) }), (0, jsx_runtime_1.jsx)("button", { type: "button", className: "crisp-recordpage-quickbtn", "aria-label": t.createATask, children: (0, jsx_runtime_1.jsx)(lucide_react_1.SquareCheck, { size: 15, strokeWidth: 1.75 }) })] }), (0, jsx_runtime_1.jsx)(RecordDetails, { record: record, columns: columns, sections: sections, onEdit: onEdit, labels: labels }), (0, jsx_runtime_1.jsxs)("div", { className: "crisp-recordpage-section", children: [(0, jsx_runtime_1.jsx)(SectionHead, { title: t.tabs.lists, action: (0, jsx_runtime_1.jsxs)("button", { type: "button", className: "crisp-recordpage-addbtn", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Plus, { size: 14, strokeWidth: 2 }), t.addToList] }) }), (0, jsx_runtime_1.jsx)("div", { className: "crisp-recordpage-emptystate", children: t.noLists })] })] }), (0, jsx_runtime_1.jsx)("div", { className: "crisp-recordpage-resizer", "data-active": resizing ? "" : undefined, role: "separator", "aria-orientation": "vertical", "aria-label": t.resizeDetails, "aria-valuenow": Math.round(detailsW), "aria-valuemin": DETAILS_MIN_W, "aria-valuemax": DETAILS_MAX_W, tabIndex: 0, onPointerDown: onResizeDown, onPointerMove: onResizeMove, onPointerUp: onResizeUp, onKeyDown: (e) => {
664
678
  if (e.key !== "ArrowLeft" && e.key !== "ArrowRight")
665
679
  return;
666
680
  // The pointer drag learned its direction in #212; this did not.
@@ -669,7 +683,9 @@ function RecordPage({ record, columns, collection = "Records", labels, onBack, o
669
683
  // half-conversion the drag had, one handler away (#255).
670
684
  const rtl = (0, core_1.isRtlElement)(e.currentTarget);
671
685
  const grow = e.key === (rtl ? "ArrowLeft" : "ArrowRight");
672
- setDetailsW((w) => grow ? Math.min(560, w + 16) : Math.max(300, w - 16));
686
+ setDetailsW((w) => grow
687
+ ? Math.min(DETAILS_MAX_W, w + 16)
688
+ : Math.max(DETAILS_MIN_W, w - 16));
673
689
  } }), (0, jsx_runtime_1.jsx)("main", { className: "crisp-recordpage-main", children: (0, jsx_runtime_1.jsx)(tabs_1.Tabs, { tabs: effectiveTabs, defaultValue: tabsProp ? defaultTab : "overview", "aria-label": `${name} record`, children: effectivePanel }) })] })] }));
674
690
  }
675
691
  RecordPage.displayName = "RecordPage";