cursedbelt 5.28.0 → 5.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/react/components/ColorField.d.ts.map +1 -1
- package/dist/react/components/ColorField.js +2 -1
- package/dist/react/components/ColorField.js.map +1 -1
- package/dist/react/components/ComboboxField.d.ts.map +1 -1
- package/dist/react/components/ComboboxField.js +2 -1
- package/dist/react/components/ComboboxField.js.map +1 -1
- package/dist/react/components/ConfirmDialog.d.ts +4 -1
- package/dist/react/components/ConfirmDialog.d.ts.map +1 -1
- package/dist/react/components/ConfirmDialog.js +2 -2
- package/dist/react/components/ConfirmDialog.js.map +1 -1
- package/dist/react/components/DataTable/DataTable.d.ts +39 -2
- package/dist/react/components/DataTable/DataTable.d.ts.map +1 -1
- package/dist/react/components/DataTable/DataTable.js +97 -23
- package/dist/react/components/DataTable/DataTable.js.map +1 -1
- package/dist/react/components/DataTable/ViewOptionsMenu.d.ts.map +1 -1
- package/dist/react/components/DataTable/ViewOptionsMenu.js +20 -7
- package/dist/react/components/DataTable/ViewOptionsMenu.js.map +1 -1
- package/dist/react/components/DataTable/types.d.ts +11 -1
- package/dist/react/components/DataTable/types.d.ts.map +1 -1
- package/dist/react/components/DataTable/types.js +6 -0
- package/dist/react/components/DataTable/types.js.map +1 -1
- package/dist/react/components/DatePicker.d.ts.map +1 -1
- package/dist/react/components/DatePicker.js +2 -1
- package/dist/react/components/DatePicker.js.map +1 -1
- package/dist/react/components/DateTimeField.d.ts.map +1 -1
- package/dist/react/components/DateTimeField.js +2 -1
- package/dist/react/components/DateTimeField.js.map +1 -1
- package/dist/react/components/ExpandableRow.d.ts +56 -0
- package/dist/react/components/ExpandableRow.d.ts.map +1 -0
- package/dist/react/components/ExpandableRow.js +54 -0
- package/dist/react/components/ExpandableRow.js.map +1 -0
- package/dist/react/components/Field.d.ts +20 -1
- package/dist/react/components/Field.d.ts.map +1 -1
- package/dist/react/components/Field.js +24 -11
- package/dist/react/components/Field.js.map +1 -1
- package/dist/react/components/FieldInput.d.ts +15 -0
- package/dist/react/components/FieldInput.d.ts.map +1 -1
- package/dist/react/components/FieldInput.js +20 -0
- package/dist/react/components/FieldInput.js.map +1 -1
- package/dist/react/components/FileDropZone.d.ts +23 -1
- package/dist/react/components/FileDropZone.d.ts.map +1 -1
- package/dist/react/components/FileDropZone.js +56 -8
- package/dist/react/components/FileDropZone.js.map +1 -1
- package/dist/react/components/FormPreviewLayout.d.ts +49 -0
- package/dist/react/components/FormPreviewLayout.d.ts.map +1 -0
- package/dist/react/components/FormPreviewLayout.js +36 -0
- package/dist/react/components/FormPreviewLayout.js.map +1 -0
- package/dist/react/components/Input.d.ts.map +1 -1
- package/dist/react/components/Input.js +3 -1
- package/dist/react/components/Input.js.map +1 -1
- package/dist/react/components/KeyBadge.d.ts +34 -0
- package/dist/react/components/KeyBadge.d.ts.map +1 -0
- package/dist/react/components/KeyBadge.js +24 -0
- package/dist/react/components/KeyBadge.js.map +1 -0
- package/dist/react/components/Modal.d.ts.map +1 -1
- package/dist/react/components/Modal.js +35 -9
- package/dist/react/components/Modal.js.map +1 -1
- package/dist/react/components/NativeSelect.d.ts.map +1 -1
- package/dist/react/components/NativeSelect.js +2 -1
- package/dist/react/components/NativeSelect.js.map +1 -1
- package/dist/react/components/PromptDialog.d.ts +4 -1
- package/dist/react/components/PromptDialog.d.ts.map +1 -1
- package/dist/react/components/PromptDialog.js +2 -2
- package/dist/react/components/PromptDialog.js.map +1 -1
- package/dist/react/components/RenderField.d.ts.map +1 -1
- package/dist/react/components/RenderField.js +2 -2
- package/dist/react/components/RenderField.js.map +1 -1
- package/dist/react/components/RevealAction.d.ts +33 -0
- package/dist/react/components/RevealAction.d.ts.map +1 -0
- package/dist/react/components/RevealAction.js +45 -0
- package/dist/react/components/RevealAction.js.map +1 -0
- package/dist/react/components/SecretInput.d.ts.map +1 -1
- package/dist/react/components/SecretInput.js +2 -1
- package/dist/react/components/SecretInput.js.map +1 -1
- package/dist/react/components/SelectField.d.ts.map +1 -1
- package/dist/react/components/SelectField.js +2 -1
- package/dist/react/components/SelectField.js.map +1 -1
- package/dist/react/components/SettingsStrip.d.ts +22 -0
- package/dist/react/components/SettingsStrip.d.ts.map +1 -0
- package/dist/react/components/SettingsStrip.js +18 -0
- package/dist/react/components/SettingsStrip.js.map +1 -0
- package/dist/react/components/formKit.css +555 -0
- package/dist/react/components/formKit.d.ts +12 -0
- package/dist/react/components/formKit.d.ts.map +1 -0
- package/dist/react/components/formKit.js +14 -0
- package/dist/react/components/formKit.js.map +1 -0
- package/dist/react/file-tree/FileTree.d.ts +26 -1
- package/dist/react/file-tree/FileTree.d.ts.map +1 -1
- package/dist/react/file-tree/FileTree.js +182 -40
- package/dist/react/file-tree/FileTree.js.map +1 -1
- package/dist/react/filter-rail/RailSection.d.ts +2 -2
- package/dist/react/filter-rail/RailSection.d.ts.map +1 -1
- package/dist/react/filter-rail/RailSection.js +6 -61
- package/dist/react/filter-rail/RailSection.js.map +1 -1
- package/dist/react/index.d.ts +8 -3
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +8 -3
- package/dist/react/index.js.map +1 -1
- package/dist/react/lib/field.d.ts +43 -0
- package/dist/react/lib/field.d.ts.map +1 -1
- package/dist/react/lib/field.js +68 -0
- package/dist/react/lib/field.js.map +1 -1
- package/dist/react/media/PlayerStrip.d.ts +9 -1
- package/dist/react/media/PlayerStrip.d.ts.map +1 -1
- package/dist/react/media/PlayerStrip.js +29 -2
- package/dist/react/media/PlayerStrip.js.map +1 -1
- package/dist/react/media-gallery/rememberedPreference.d.ts +2 -0
- package/dist/react/media-gallery/rememberedPreference.d.ts.map +1 -0
- package/dist/react/media-gallery/rememberedPreference.js +75 -0
- package/dist/react/media-gallery/rememberedPreference.js.map +1 -0
- package/dist/scripts/guardrailsEnforce.d.ts +11 -0
- package/dist/scripts/guardrailsEnforce.d.ts.map +1 -1
- package/dist/styles-areas/analytics.css +2 -2
- package/dist/styles-areas/core.css +34 -28
- package/dist/styles-areas/data-table.css +2 -2
- package/dist/styles-areas/fields.css +3 -3
- package/dist/styles-areas/layout-engine.css +2 -2
- package/dist/styles-areas/nav.css +3 -3
- package/dist/styles-areas/wizard.css +2 -2
- package/dist/styles-areas/workbench.css +2 -2
- package/dist/styles-utilities.css +111 -9
- package/dist/testing/index.d.ts +3 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +4 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/objectLeak.d.ts +23 -0
- package/dist/testing/objectLeak.d.ts.map +1 -0
- package/dist/testing/objectLeak.js +37 -0
- package/dist/testing/objectLeak.js.map +1 -0
- package/package.json +18 -5
- package/scripts/guardrails-baseline.json +4 -1
- package/scripts/guardrailsEnforce.spec.ts +163 -6
- package/scripts/guardrailsEnforce.ts +365 -40
- package/scripts/paths.ts +1 -1
- package/scripts/styleAreas.ts +2 -0
- package/src/react/components/ColorField.tsx +3 -1
- package/src/react/components/ComboboxField.tsx +3 -1
- package/src/react/components/ConfirmDialog.tsx +5 -0
- package/src/react/components/DataTable/DataTable.spec.tsx +34 -0
- package/src/react/components/DataTable/DataTable.tsx +141 -23
- package/src/react/components/DataTable/ViewOptionsMenu.tsx +24 -9
- package/src/react/components/DataTable/selection.spec.tsx +57 -1
- package/src/react/components/DataTable/types.ts +12 -1
- package/src/react/components/DataTable/virtualize.spec.tsx +20 -0
- package/src/react/components/DatePicker.tsx +3 -1
- package/src/react/components/DateTimeField.tsx +3 -1
- package/src/react/components/ExpandableRow.tsx +146 -0
- package/src/react/components/Field.tsx +89 -13
- package/src/react/components/Field.width.spec.tsx +162 -0
- package/src/react/components/FieldInput.tsx +30 -0
- package/src/react/components/FileDropZone.spec.tsx +65 -0
- package/src/react/components/FileDropZone.tsx +83 -5
- package/src/react/components/FormPreviewLayout.tsx +94 -0
- package/src/react/components/Input.tsx +4 -1
- package/src/react/components/KeyBadge.tsx +52 -0
- package/src/react/components/Modal.tsx +58 -14
- package/src/react/components/NativeSelect.tsx +3 -1
- package/src/react/components/PromptDialog.spec.tsx +29 -1
- package/src/react/components/PromptDialog.tsx +5 -0
- package/src/react/components/RenderField.tsx +2 -1
- package/src/react/components/RevealAction.tsx +83 -0
- package/src/react/components/SecretInput.tsx +3 -1
- package/src/react/components/SelectField.tsx +3 -1
- package/src/react/components/SettingsStrip.tsx +37 -0
- package/src/react/components/formKit.css +555 -0
- package/src/react/components/formKit.spec.tsx +138 -0
- package/src/react/components/formKit.ts +19 -0
- package/src/react/file-tree/FileTree.spec.tsx +205 -0
- package/src/react/file-tree/FileTree.tsx +220 -38
- package/src/react/filter-rail/RailSection.tsx +6 -65
- package/src/react/index.ts +20 -2
- package/src/react/lib/field.ts +93 -0
- package/src/react/media/PlayerStrip.tsx +65 -20
- package/src/react/media/playerStrip.spec.tsx +23 -0
- package/src/react/media-gallery/rememberedPreference.ts +79 -0
- package/src/styles-areas/analytics.css +2 -2
- package/src/styles-areas/core.css +34 -28
- package/src/styles-areas/data-table.css +2 -2
- package/src/styles-areas/fields.css +3 -3
- package/src/styles-areas/layout-engine.css +2 -2
- package/src/styles-areas/nav.css +3 -3
- package/src/styles-areas/wizard.css +2 -2
- package/src/styles-areas/workbench.css +2 -2
- package/src/styles-utilities.css +111 -9
- package/src/testing/index.ts +3 -0
- package/src/testing/objectLeak.spec.ts +21 -0
- package/src/testing/objectLeak.ts +39 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColorField.d.ts","sourceRoot":"","sources":["../../../src/react/components/ColorField.tsx"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,WAAW,
|
|
1
|
+
{"version":3,"file":"ColorField.d.ts","sourceRoot":"","sources":["../../../src/react/components/ColorField.tsx"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,WAAW,EAAqB,MAAM,iBAAiB,CAAC;AAE5F,MAAM,WAAW,eAAe;IAC9B,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;wBACoB;IACpB,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAID;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,EAAE,EACF,IAAI,EACJ,cAAc,EAAE,WAAW,EAC3B,kBAAkB,EAAE,eAAe,EACnC,SAAS,EACT,IAAW,GACZ,EAAE,eAAe,+BA6CjB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { cn } from '../lib/cn.js';
|
|
3
|
-
import { CONTROL_HEIGHT_CLASS } from '../lib/field.js';
|
|
3
|
+
import { CONTROL_HEIGHT_CLASS, declareFieldWidth } from '../lib/field.js';
|
|
4
4
|
const HEX6 = /^#[0-9a-fA-F]{6}$/;
|
|
5
5
|
/**
|
|
6
6
|
* A color picker: a native `<input type="color">` swatch beside an editable hex
|
|
@@ -25,4 +25,5 @@ export function ColorField({ value, onChange, disabled, id, name, 'aria-invalid'
|
|
|
25
25
|
// the arbitrary hex value the user is choosing, not a theme token.
|
|
26
26
|
placeholder: '#000000', "aria-invalid": ariaInvalid, "aria-describedby": ariaDescribedBy, spellCheck: false, autoComplete: 'off', maxLength: 9, className: 'min-w-0 flex-1 bg-transparent font-mono text-base uppercase text-field-fg outline-none placeholder:text-field-placeholder sm:text-sm' })] }));
|
|
27
27
|
}
|
|
28
|
+
declareFieldWidth(ColorField, 'sm');
|
|
28
29
|
//# sourceMappingURL=ColorField.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColorField.js","sourceRoot":"","sources":["../../../src/react/components/ColorField.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAoB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"ColorField.js","sourceRoot":"","sources":["../../../src/react/components/ColorField.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAoB,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAiB5F,MAAM,IAAI,GAAG,mBAAmB,CAAC;AAEjC;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,EACzB,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,EAAE,EACF,IAAI,EACJ,cAAc,EAAE,WAAW,EAC3B,kBAAkB,EAAE,eAAe,EACnC,SAAS,EACT,IAAI,GAAG,IAAI,GACK;IAChB,qFAAqF;IACrF,+DAA+D;IAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACpD,OAAO,CACL,+BACgB,WAAW,EACzB,SAAS,EAAE,EAAE,CACX,sOAAsO,EACtO,oBAAoB,CAAC,IAAI,CAAC,EAC1B,QAAQ,IAAI,+BAA+B,EAC3C,SAAS,CACV,aAED;gBACE,8EAA8E;gBAC9E,kEAAkE;gBAClE,EAAE,EAAE,EAAE,EACN,IAAI,EAAC,OAAO,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,gBAC9B,cAAc,EACzB,SAAS,EAAC,kHAAkH,GAC5H,EACF;gBACE,8EAA8E;gBAC9E,8DAA8D;gBAC9D,IAAI,EAAE,IAAI,EACV,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBACzC,iFAAiF;gBACjF,mEAAmE;gBACnE,WAAW,EAAC,SAAS,kBACP,WAAW,sBACP,eAAe,EACjC,UAAU,EAAE,KAAK,EACjB,YAAY,EAAC,KAAK,EAClB,SAAS,EAAE,CAAC,EACZ,SAAS,EAAC,sIAAsI,GAChJ,IACE,CACP,CAAC;AACJ,CAAC;AAED,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComboboxField.d.ts","sourceRoot":"","sources":["../../../src/react/components/ComboboxField.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAkD,KAAK,WAAW,
|
|
1
|
+
{"version":3,"file":"ComboboxField.d.ts","sourceRoot":"","sources":["../../../src/react/components/ComboboxField.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAkD,KAAK,WAAW,EAAqB,MAAM,iBAAiB,CAAC;AAKtH,4CAA4C;AAC5C,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,YAAY;IACpB,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B;oEACgE;IAChE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC3D,8EAA8E;IAC9E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;uCAEmC;IACnC,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED,MAAM,WAAW,wBAAyB,SAAQ,YAAY;IAC5D,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC3C;AAED,MAAM,WAAW,uBAAwB,SAAQ,YAAY;IAC3D,QAAQ,EAAE,IAAI,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CACtC;AAED,MAAM,MAAM,kBAAkB,GAAG,wBAAwB,GAAG,uBAAuB,CAAC;AA4EpF;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,+BAqLtD"}
|
|
@@ -4,7 +4,7 @@ import { Combobox } from '@base-ui/react/combobox';
|
|
|
4
4
|
import { Check, ChevronDown, Loader2, Plus, X } from 'lucide-react';
|
|
5
5
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
6
6
|
import { cn } from '../lib/cn.js';
|
|
7
|
-
import { CONTROL_HEIGHT_CLASS, CONTROL_MIN_HEIGHT_CLASS } from '../lib/field.js';
|
|
7
|
+
import { CONTROL_HEIGHT_CLASS, CONTROL_MIN_HEIGHT_CLASS, declareFieldWidth } from '../lib/field.js';
|
|
8
8
|
import { FLOATING_COLLISION_PADDING, FLOATING_CONTENT_BASE, FLOATING_ITEM_BASE } from '../lib/floatingStyles.js';
|
|
9
9
|
import { TAP_TARGET } from '../lib/tapTarget.js';
|
|
10
10
|
const DEBOUNCE_MS = 250;
|
|
@@ -106,4 +106,5 @@ export function ComboboxField(props) {
|
|
|
106
106
|
// guardrails-ignore no-raw-overflow: floating popover panel outside the page's ScrollArea, height-capped by max-h-64 — no keyboard-inset concern.
|
|
107
107
|
'max-h-64 min-w-[var(--anchor-width)] overflow-y-auto p-0', 'transition-[transform,opacity] duration-100', 'data-[starting-style]:scale-95 data-[starting-style]:opacity-0', 'data-[ending-style]:scale-95 data-[ending-style]:opacity-0'), children: _jsx(ComboboxList, { creatable: creatable, query: query, onCreateClick: handleCreate }) }) }) })] }));
|
|
108
108
|
}
|
|
109
|
+
declareFieldWidth(ComboboxField, (props) => (props.multiple ? 'full' : 'md'));
|
|
109
110
|
//# sourceMappingURL=ComboboxField.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComboboxField.js","sourceRoot":"","sources":["../../../src/react/components/ComboboxField.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAoB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"ComboboxField.js","sourceRoot":"","sources":["../../../src/react/components/ComboboxField.tsx"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,9 @@ export interface ConfirmDialogProps {
|
|
|
12
12
|
destructive?: boolean;
|
|
13
13
|
/** Spinner on the confirm button while an async `onConfirm` runs (caller-controlled). */
|
|
14
14
|
loading?: boolean;
|
|
15
|
+
/** Added to the dialog's content box — an app that scopes the belt's preflight under a class
|
|
16
|
+
* (binary-server's admin: `cb-scope`) passes it here, because the dialog portals to <body>. */
|
|
17
|
+
className?: string;
|
|
15
18
|
}
|
|
16
19
|
/**
|
|
17
20
|
* The single confirm/cancel dialog — replaces both cursedbelt's old `ConfirmDialog` and
|
|
@@ -21,5 +24,5 @@ export interface ConfirmDialogProps {
|
|
|
21
24
|
* Focus lands on the confirm button for a normal confirmation (Enter confirms), but on
|
|
22
25
|
* Cancel for a destructive one (so a stray Enter can't fire the irreversible action).
|
|
23
26
|
*/
|
|
24
|
-
export declare function ConfirmDialog({ open, onConfirm, onCancel, title, message, confirmLabel, cancelLabel, destructive, loading, }: ConfirmDialogProps): import("react").JSX.Element;
|
|
27
|
+
export declare function ConfirmDialog({ open, onConfirm, onCancel, title, message, confirmLabel, cancelLabel, destructive, loading, className, }: ConfirmDialogProps): import("react").JSX.Element;
|
|
25
28
|
//# sourceMappingURL=ConfirmDialog.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmDialog.d.ts","sourceRoot":"","sources":["../../../src/react/components/ConfirmDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAU,MAAM,OAAO,CAAC;AAK/C,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;yEACqE;IACrE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,yFAAyF;IACzF,OAAO,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ConfirmDialog.d.ts","sourceRoot":"","sources":["../../../src/react/components/ConfirmDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAU,MAAM,OAAO,CAAC;AAK/C,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;yEACqE;IACrE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,yFAAyF;IACzF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;oGACgG;IAChG,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,KAAK,EACL,OAAO,EACP,YAAwB,EACxB,WAAsB,EACtB,WAAmB,EACnB,OAAe,EACf,SAAS,GACV,EAAE,kBAAkB,+BAkEpB"}
|
|
@@ -11,12 +11,12 @@ import { Dialog, DialogContent, DialogDescription, DialogTitle } from './dialog.
|
|
|
11
11
|
* Focus lands on the confirm button for a normal confirmation (Enter confirms), but on
|
|
12
12
|
* Cancel for a destructive one (so a stray Enter can't fire the irreversible action).
|
|
13
13
|
*/
|
|
14
|
-
export function ConfirmDialog({ open, onConfirm, onCancel, title, message, confirmLabel = 'Confirm', cancelLabel = 'Cancel', destructive = false, loading = false, }) {
|
|
14
|
+
export function ConfirmDialog({ open, onConfirm, onCancel, title, message, confirmLabel = 'Confirm', cancelLabel = 'Cancel', destructive = false, loading = false, className, }) {
|
|
15
15
|
const contentRef = useRef(null);
|
|
16
16
|
return (_jsx(Dialog, { open: open, onOpenChange: (v) => {
|
|
17
17
|
if (!v)
|
|
18
18
|
onCancel();
|
|
19
|
-
}, children: _jsxs(DialogContent, { ref: contentRef, className: cn('fixed top-1/2 left-1/2 flex w-[calc(100vw-2rem)] max-w-sm -translate-x-1/2 -translate-y-1/2 flex-col gap-4', 'rounded-xl border border-border bg-popover p-6 text-popover-foreground shadow-overlay', 'data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95', 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95'),
|
|
19
|
+
}, children: _jsxs(DialogContent, { ref: contentRef, className: cn('fixed top-1/2 left-1/2 flex w-[calc(100vw-2rem)] max-w-sm -translate-x-1/2 -translate-y-1/2 flex-col gap-4', 'rounded-xl border border-border bg-popover p-6 text-popover-foreground shadow-overlay', 'data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95', 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95', className),
|
|
20
20
|
// Land focus on the safe button for destructive actions; otherwise on confirm.
|
|
21
21
|
// Button isn't a forwardRef component, so target it by data attribute.
|
|
22
22
|
onOpenAutoFocus: (e) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmDialog.js","sourceRoot":"","sources":["../../../src/react/components/ConfirmDialog.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAkB,MAAM,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ConfirmDialog.js","sourceRoot":"","sources":["../../../src/react/components/ConfirmDialog.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAkB,MAAM,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAoBpF;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,KAAK,EACL,OAAO,EACP,YAAY,GAAG,SAAS,EACxB,WAAW,GAAG,QAAQ,EACtB,WAAW,GAAG,KAAK,EACnB,OAAO,GAAG,KAAK,EACf,SAAS,GACU;IACnB,MAAM,UAAU,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAEhD,OAAO,CACL,KAAC,MAAM,IACL,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE;YAClB,IAAI,CAAC,CAAC;gBAAE,QAAQ,EAAE,CAAC;QACrB,CAAC,YAED,MAAC,aAAa,IACZ,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,EAAE,CACX,4GAA4G,EAC5G,uFAAuF,EACvF,uFAAuF,EACvF,gGAAgG,EAChG,SAAS,CACV;YACD,+EAA+E;YAC/E,uEAAuE;YACvE,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE;gBACrB,CAAC,CAAC,cAAc,EAAE,CAAC;gBACnB,UAAU,CAAC,OAAO;oBAChB,EAAE,aAAa,CACb,WAAW,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,mBAAmB,CACvD;oBACD,EAAE,KAAK,EAAE,CAAC;YACd,CAAC,aAED,eAAK,SAAS,EAAC,+BAA+B,aAC5C,KAAC,WAAW,IAAC,SAAS,EAAC,iDAAiD,YACrE,KAAK,GACM,EACb,OAAO,CAAC,CAAC,CAAC,CACT,KAAC,iBAAiB,IAAC,SAAS,EAAC,+BAA+B,YACzD,OAAO,GACU,CACrB,CAAC,CAAC,CAAC,IAAI,IACJ,EACN,eAAK,SAAS,EAAC,wBAAwB,aACrC,KAAC,MAAM,4BAEL,OAAO,EAAC,WAAW,EACnB,OAAO,EAAE,QAAQ,EACjB,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,WAAW,YAEnB,WAAW,GACL,EACT,KAAC,MAAM;4BAEL,uEAAuE;4BACvE,0EAA0E;4BAC1E,uEAAuE;4BACvE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,EACtD,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,SAAS,EAAE,EAC/B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,YAAY,YAEpB,YAAY,GACN,IACL,IACQ,GACT,CACV,CAAC;AACJ,CAAC"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { type ColumnFiltersState, type PaginationState, type RowData, type SortingState, useReactTable } from '@tanstack/react-table';
|
|
1
|
+
import { type ColumnFiltersState, type PaginationState, type RowData, type SortingState, useReactTable, type VisibilityState } from '@tanstack/react-table';
|
|
2
2
|
import type { MouseEvent, ReactNode } from 'react';
|
|
3
3
|
import { type Ref } from 'react';
|
|
4
4
|
import type { DropdownMenuItem } from '../DropdownMenu.js';
|
|
5
5
|
import { type FilterQuery } from './filterQuery.js';
|
|
6
6
|
import { type RowDragPayload } from './rowDrag.js';
|
|
7
7
|
import type { ColDef, DataTableHandle, DataTableRowProps, DataTableSelectAll, DataTableServerWindow, TableViewMode } from './types.js';
|
|
8
|
+
import type { TableToolbarProps } from './Toolbar.js';
|
|
8
9
|
/**
|
|
9
10
|
* Load the table's lazy parts — the toolbar, the pager, the row kebab's menu — now,
|
|
10
11
|
* so every table mounted after this resolves draws them on its first render. For a
|
|
@@ -16,6 +17,7 @@ export declare function preloadDataTableParts(): Promise<void>;
|
|
|
16
17
|
declare module '@tanstack/react-table' {
|
|
17
18
|
interface ColumnMeta<TData extends RowData, TValue> {
|
|
18
19
|
label?: string;
|
|
20
|
+
menuLabel?: string;
|
|
19
21
|
align?: 'left' | 'right';
|
|
20
22
|
/** ColDef.width verbatim (px number or CSS string, e.g. `'15%'`) — TanStack's
|
|
21
23
|
* own `size` is number-only, so proportional tracks ride meta instead. */
|
|
@@ -91,6 +93,11 @@ export interface DataTableControls {
|
|
|
91
93
|
labelOf: (id: string) => string;
|
|
92
94
|
viewMode?: TableViewMode;
|
|
93
95
|
setViewMode?: (mode: TableViewMode) => void;
|
|
96
|
+
/** The checkbox column, when the table has one — so the Columns menu can hide it too. */
|
|
97
|
+
selectionColumn?: {
|
|
98
|
+
visible: boolean;
|
|
99
|
+
setVisible: (visible: boolean) => void;
|
|
100
|
+
};
|
|
94
101
|
}
|
|
95
102
|
export interface DataTableProps<TRow extends Record<string, unknown>> {
|
|
96
103
|
columns: ColDef<TRow>[];
|
|
@@ -384,6 +391,17 @@ export interface DataTableProps<TRow extends Record<string, unknown>> {
|
|
|
384
391
|
*/
|
|
385
392
|
searchable?: boolean;
|
|
386
393
|
searchPlaceholder?: string;
|
|
394
|
+
/**
|
|
395
|
+
* Tune the DEFAULT toolbar without composing one — which of its controls to draw, and any
|
|
396
|
+
* extra actions. It stays lazy (a composed `toolbar={(t) => <TableToolbar …/>}` pulls the
|
|
397
|
+
* toolbar into the caller's first chunk). `searchable={false}` still removes the search box
|
|
398
|
+
* but, with this set, not the rest of the line.
|
|
399
|
+
*
|
|
400
|
+
* 🔴 Why (owner, 2026-09-30, music): *"Use the cb table that comes with filtering, checkboxes,
|
|
401
|
+
* and sorting out of the box."* The track list opted out of the whole toolbar because it has
|
|
402
|
+
* its own server-side search box, and so lost the filter builder and the Columns menu with it.
|
|
403
|
+
*/
|
|
404
|
+
toolbarOptions?: Pick<TableToolbarProps<TRow>, 'enableColumnVisibility' | 'enableFilterBuilder' | 'enableSortStack' | 'extraActions'>;
|
|
387
405
|
/**
|
|
388
406
|
* Multi-column sort: each header click puts that column at the FRONT of the
|
|
389
407
|
* stack and keeps the previous keys behind it as tie-breakers, so the owner's
|
|
@@ -452,6 +470,25 @@ export interface DataTableProps<TRow extends Record<string, unknown>> {
|
|
|
452
470
|
* owns the box. The row boxes are unchanged (`selectedIds` / `onSelectionChange`).
|
|
453
471
|
*/
|
|
454
472
|
selectAll?: DataTableSelectAll;
|
|
473
|
+
/**
|
|
474
|
+
* Which columns are shown, CONTROLLED — `{ [ColDef.key]: false }` hides one, and
|
|
475
|
+
* `'__select'` is the checkbox column's key. Omit and the table keeps it
|
|
476
|
+
* internally, seeded from `ColDef.hidden`, exactly as before.
|
|
477
|
+
*
|
|
478
|
+
* 🔴 Why a caller would own it (owner, 2026-09-30, music: *"Allow hiding any column, like
|
|
479
|
+
* the checkbox column"*): a column hidden through the Columns menu that comes back on the
|
|
480
|
+
* next reload was never hidden, it was dismissed. Only the app knows where its per-account
|
|
481
|
+
* preferences live, so the app persists this and hands it back.
|
|
482
|
+
*/
|
|
483
|
+
columnVisibility?: VisibilityState;
|
|
484
|
+
onColumnVisibilityChange?: (next: VisibilityState) => void;
|
|
485
|
+
/**
|
|
486
|
+
* Remember the Columns menu's choices under this key — `localStorage`, announced on the
|
|
487
|
+
* preference bus (`onPreferenceWrite`) and re-read on `seedPreferences`, exactly like a
|
|
488
|
+
* `RailSection`'s `persistKey`, so an app that already carries its rail to the server carries
|
|
489
|
+
* its columns with no code of its own. A controlled {@link columnVisibility} wins over it.
|
|
490
|
+
*/
|
|
491
|
+
columnsPersistKey?: string;
|
|
455
492
|
/**
|
|
456
493
|
* Attributes and handlers for one body ROW, merged onto it after the table's own —
|
|
457
494
|
* `className` joins, `style` spreads, and a handler the table also sets runs AFTER the
|
|
@@ -581,5 +618,5 @@ export declare function mergeRowProps<T extends Record<string, unknown>>(own: T,
|
|
|
581
618
|
* full-width accordion detail row that never breaks column alignment, and an automatic
|
|
582
619
|
* stacked-card layout under `sm` so phones are never handed a clipped grid.
|
|
583
620
|
*/
|
|
584
|
-
export declare function DataTable<TRow extends Record<string, unknown>>({ columns, data, getRowId, onRowClick, onRowEdit, onRowDelete, rowMenu, loading, emptyState, toolbar, pageSize, pageSizeOptions, hidePagination, caption, className, stickyHeader, stickyFirstColumn, renderExpanded, expandedRowId, rowClassName, hideEmptyColumns, fixedLayout, minTableWidth, scrollBody, virtualize, serverWindow, handleRef, scrollClassName, mobileCards, serverSide, pageCount, rowCount, onSortingChange, onColumnFiltersChange, onGlobalFilterChange, onPaginationChange, defaultSort, sorting: sortingProp, enableSortingRemoval, sortDisabledReason, density, viewMode, onViewModeChange, cardMinWidth, searchable, searchPlaceholder, multiSort, filterQuery: filterQueryProp, onFilterQueryChange, getRowDrag, dragSourceId, selectedIds, onSelectionChange, isRowSelectable, unselectableReason, selectionLabel, selectionSummary, selectAll, getRowProps, }: DataTableProps<TRow>): import("react").JSX.Element;
|
|
621
|
+
export declare function DataTable<TRow extends Record<string, unknown>>({ columns, data, getRowId, onRowClick, onRowEdit, onRowDelete, rowMenu, loading, emptyState, toolbar, pageSize, pageSizeOptions, hidePagination, caption, className, stickyHeader, stickyFirstColumn, renderExpanded, expandedRowId, rowClassName, hideEmptyColumns, fixedLayout, minTableWidth, scrollBody, virtualize, serverWindow, handleRef, scrollClassName, mobileCards, serverSide, pageCount, rowCount, onSortingChange, onColumnFiltersChange, onGlobalFilterChange, onPaginationChange, defaultSort, sorting: sortingProp, enableSortingRemoval, sortDisabledReason, density, viewMode, onViewModeChange, cardMinWidth, searchable, searchPlaceholder, toolbarOptions, multiSort, filterQuery: filterQueryProp, onFilterQueryChange, getRowDrag, dragSourceId, selectedIds, onSelectionChange, isRowSelectable, unselectableReason, selectionLabel, selectionSummary, selectAll, getRowProps, columnVisibility: columnVisibilityProp, onColumnVisibilityChange, columnsPersistKey, }: DataTableProps<TRow>): import("react").JSX.Element;
|
|
585
622
|
//# sourceMappingURL=DataTable.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../../src/react/components/DataTable/DataTable.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,kBAAkB,
|
|
1
|
+
{"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../../src/react/components/DataTable/DataTable.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
2
|
+
import { getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable, } from '@tanstack/react-table';
|
|
3
3
|
import { useVirtualizer } from '@tanstack/react-virtual';
|
|
4
4
|
import { Fragment, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
|
|
5
5
|
import { useScrollEdgeFade } from '../../hooks/useScrollEdgeFade.js';
|
|
6
|
+
import { useRememberedPreference } from '../../media-gallery/rememberedPreference.js';
|
|
6
7
|
import { cn } from '../../lib/cn.js';
|
|
7
8
|
import { TAP_TARGET_HEIGHT } from '../../lib/tapTarget.js';
|
|
8
9
|
import { CardTapTarget } from '../CardTapTarget.js';
|
|
@@ -17,7 +18,7 @@ import { EMPTY_FILTER_QUERY, evaluateFilterQuery, filterableText, } from './filt
|
|
|
17
18
|
import { preloadRowMenu, RowActions } from './RowActions.js';
|
|
18
19
|
import { writeRowDrag } from './rowDrag.js';
|
|
19
20
|
import { SortHeader } from './SortHeader.js';
|
|
20
|
-
import { resolveColumnAlign } from './types.js';
|
|
21
|
+
import { resolveColumnAlign, SELECT_COLUMN_ID } from './types.js';
|
|
21
22
|
import { lazyPart } from './lazyPart.js';
|
|
22
23
|
// 🔴 The toolbar and the pager load only when a table DRAWS them (forge task 2309).
|
|
23
24
|
// Between them they reach Radix's Select, Menu and Popover — ~20 kB gzip that a
|
|
@@ -47,6 +48,38 @@ function ToolbarPlaceholder() {
|
|
|
47
48
|
function PaginationPlaceholder() {
|
|
48
49
|
return (_jsx("div", { "data-cb-table-pagination-pending": '', "aria-hidden": true, className: 'border-t border-border px-4 py-2.5', children: _jsx("div", { className: cn('h-8', TAP_TARGET_HEIGHT) }) }));
|
|
49
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* Render a header or cell template by CALLING it — never `flexRender`.
|
|
53
|
+
*
|
|
54
|
+
* 🔴 `flexRender` mounts a function template as a component (`<Template {...ctx} />`), so its
|
|
55
|
+
* identity IS the element type. Our templates are closures rebuilt whenever `columns` changes
|
|
56
|
+
* identity, and a consumer's `columns` memo commonly depends on something that changes often
|
|
57
|
+
* (music's depended on its player: play, pause, every track). Each rebuild was a new component
|
|
58
|
+
* type for every visible cell — React unmounted and remounted the whole body, every `<img>` was
|
|
59
|
+
* recreated, and on an iPhone the list's thumbnails flickered for as long as a song played
|
|
60
|
+
* (2026-09-29). Called as a function, a template returns `<CellRenderer>` / `<SortHeader>`,
|
|
61
|
+
* whose types never change, so a column rebuild is an ordinary re-render. Every template this
|
|
62
|
+
* file builds is hook-free — the hooks live in the components it returns — which is what
|
|
63
|
+
* makes the call sound; keep it so. `DataTable.spec.tsx` → "a columns rebuild keeps the cells".
|
|
64
|
+
*/
|
|
65
|
+
function renderTemplate(template, context) {
|
|
66
|
+
return typeof template === 'function' ? template(context) : (template ?? null);
|
|
67
|
+
}
|
|
68
|
+
/** A remembered column-visibility value, or `null` for anything that is not one — a stored
|
|
69
|
+
* value from an older shape must fall back to the defaults, never throw a table off the page. */
|
|
70
|
+
function parseVisibility(stored) {
|
|
71
|
+
if (!stored)
|
|
72
|
+
return null;
|
|
73
|
+
try {
|
|
74
|
+
const value = JSON.parse(stored);
|
|
75
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
76
|
+
return null;
|
|
77
|
+
return Object.fromEntries(Object.entries(value).filter(([, shown]) => typeof shown === 'boolean'));
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
50
83
|
/** Build an OnChangeFn that updates local state AND notifies an optional listener. */
|
|
51
84
|
function chainUpdater(set, notify) {
|
|
52
85
|
return (updater) => set((prev) => {
|
|
@@ -240,7 +273,7 @@ function isEmptyCellValue(v) {
|
|
|
240
273
|
* full-width accordion detail row that never breaks column alignment, and an automatic
|
|
241
274
|
* stacked-card layout under `sm` so phones are never handed a clipped grid.
|
|
242
275
|
*/
|
|
243
|
-
export function DataTable({ columns, data, getRowId, onRowClick, onRowEdit, onRowDelete, rowMenu, loading, emptyState, toolbar, pageSize = 50, pageSizeOptions, hidePagination, caption, className, stickyHeader, stickyFirstColumn, renderExpanded, expandedRowId, rowClassName, hideEmptyColumns, fixedLayout, minTableWidth, scrollBody, virtualize, serverWindow, handleRef, scrollClassName, mobileCards = true, serverSide, pageCount, rowCount, onSortingChange, onColumnFiltersChange, onGlobalFilterChange, onPaginationChange, defaultSort, sorting: sortingProp, enableSortingRemoval = true, sortDisabledReason, density = 'comfortable', viewMode, onViewModeChange, cardMinWidth, searchable = true, searchPlaceholder, multiSort = true, filterQuery: filterQueryProp, onFilterQueryChange, getRowDrag, dragSourceId, selectedIds, onSelectionChange, isRowSelectable, unselectableReason, selectionLabel, selectionSummary, selectAll, getRowProps, }) {
|
|
276
|
+
export function DataTable({ columns, data, getRowId, onRowClick, onRowEdit, onRowDelete, rowMenu, loading, emptyState, toolbar, pageSize = 50, pageSizeOptions, hidePagination, caption, className, stickyHeader, stickyFirstColumn, renderExpanded, expandedRowId, rowClassName, hideEmptyColumns, fixedLayout, minTableWidth, scrollBody, virtualize, serverWindow, handleRef, scrollClassName, mobileCards = true, serverSide, pageCount, rowCount, onSortingChange, onColumnFiltersChange, onGlobalFilterChange, onPaginationChange, defaultSort, sorting: sortingProp, enableSortingRemoval = true, sortDisabledReason, density = 'comfortable', viewMode, onViewModeChange, cardMinWidth, searchable = true, searchPlaceholder, toolbarOptions, multiSort = true, filterQuery: filterQueryProp, onFilterQueryChange, getRowDrag, dragSourceId, selectedIds, onSelectionChange, isRowSelectable, unselectableReason, selectionLabel, selectionSummary, selectAll, getRowProps, columnVisibility: columnVisibilityProp, onColumnVisibilityChange, columnsPersistKey, }) {
|
|
244
277
|
// Vertical cell padding for the wide grid tier — the one lever the density knob
|
|
245
278
|
// pulls (headers + body cells stay aligned by sharing it).
|
|
246
279
|
const cellPadY = density === 'compact' ? 'py-1.5' : 'py-2.5';
|
|
@@ -251,7 +284,25 @@ export function DataTable({ columns, data, getRowId, onRowClick, onRowEdit, onRo
|
|
|
251
284
|
sortingRef.current = sorting;
|
|
252
285
|
const [columnFilters, setColumnFilters] = useState([]);
|
|
253
286
|
const [globalFilter, setGlobalFilter] = useState('');
|
|
254
|
-
const [
|
|
287
|
+
const [ownColumnVisibility, setOwnColumnVisibility] = useState(() => Object.fromEntries(columns.filter((c) => c.hidden).map((c) => [c.key, false])));
|
|
288
|
+
const [rememberedColumns, setRememberedColumns] = useRememberedPreference(columnsPersistKey);
|
|
289
|
+
const remembered = useMemo(() => parseVisibility(rememberedColumns), [rememberedColumns]);
|
|
290
|
+
const columnVisibility = columnVisibilityProp ?? (remembered ? { ...ownColumnVisibility, ...remembered } : ownColumnVisibility);
|
|
291
|
+
const columnVisibilityRef = useRef(columnVisibility);
|
|
292
|
+
columnVisibilityRef.current = columnVisibility;
|
|
293
|
+
/** Every visibility write — TanStack's own, the Columns menu's, the checkbox column's. Computed
|
|
294
|
+
* outside a state updater for the same reason as `applySorting`: under a controlled value
|
|
295
|
+
* there is no state to update, and a notify inside an updater fires twice in StrictMode. */
|
|
296
|
+
const updateColumnVisibility = useCallback((updater) => {
|
|
297
|
+
const next = typeof updater === 'function' ? updater(columnVisibilityRef.current) : updater;
|
|
298
|
+
columnVisibilityRef.current = next;
|
|
299
|
+
if (columnVisibilityProp === undefined) {
|
|
300
|
+
setOwnColumnVisibility(next);
|
|
301
|
+
if (columnsPersistKey)
|
|
302
|
+
setRememberedColumns(JSON.stringify(next));
|
|
303
|
+
}
|
|
304
|
+
onColumnVisibilityChange?.(next);
|
|
305
|
+
}, [columnVisibilityProp, columnsPersistKey, onColumnVisibilityChange, setRememberedColumns]);
|
|
255
306
|
const [pagination, setPagination] = useState({ pageIndex: 0, pageSize });
|
|
256
307
|
// `null` = every column, and it STAYS null as columns come and go — see SearchBox.
|
|
257
308
|
const [searchScope, setSearchScope] = useState(null);
|
|
@@ -292,9 +343,12 @@ export function DataTable({ columns, data, getRowId, onRowClick, onRowEdit, onRo
|
|
|
292
343
|
* narrows the dataset, the rest narrows what is left, and the sort stack
|
|
293
344
|
* re-applies to whatever survives.
|
|
294
345
|
*/
|
|
295
|
-
const filteredData = useMemo(() =>
|
|
346
|
+
const filteredData = useMemo(() =>
|
|
347
|
+
// A `serverWindow` holds a hundred rows of thousands: narrowing THEM would answer a
|
|
348
|
+
// question about the loaded page, not the list. The server applies it — the table reports.
|
|
349
|
+
serverSide || serverWindow
|
|
296
350
|
? data
|
|
297
|
-
: data.filter((row) => evaluateFilterQuery(row, filterQuery, (r, key) => readPath(r, key))), [data, filterQuery, serverSide]);
|
|
351
|
+
: data.filter((row) => evaluateFilterQuery(row, filterQuery, (r, key) => readPath(r, key))), [data, filterQuery, serverSide, serverWindow]);
|
|
298
352
|
/**
|
|
299
353
|
* Every write to the sort stack goes through here, so a header click, a chip's
|
|
300
354
|
* direction flip and a chip's `×` all take the same page-reset and fire the
|
|
@@ -320,6 +374,7 @@ export function DataTable({ columns, data, getRowId, onRowClick, onRowEdit, onRo
|
|
|
320
374
|
// preference — `resolveColumnAlign` derives it; an explicit `align` overrides.
|
|
321
375
|
meta: {
|
|
322
376
|
label: col.label,
|
|
377
|
+
menuLabel: col.menuLabel,
|
|
323
378
|
align: resolveColumnAlign(col),
|
|
324
379
|
width: col.width,
|
|
325
380
|
minWidth: col.minWidth,
|
|
@@ -358,7 +413,9 @@ export function DataTable({ columns, data, getRowId, onRowClick, onRowEdit, onRo
|
|
|
358
413
|
setFilterQuery,
|
|
359
414
|
// `alwaysVisible` columns are exempt from HIDING, not from filtering — the
|
|
360
415
|
// builder's universe is every column that carries data.
|
|
361
|
-
filterColumns: liveColumns
|
|
416
|
+
filterColumns: liveColumns
|
|
417
|
+
.filter((col) => col.filterable ?? true)
|
|
418
|
+
.map((col) => ({ key: col.key, label: col.label })),
|
|
362
419
|
searchScope,
|
|
363
420
|
setSearchScope,
|
|
364
421
|
searchColumns: liveColumns
|
|
@@ -371,6 +428,12 @@ export function DataTable({ columns, data, getRowId, onRowClick, onRowEdit, onRo
|
|
|
371
428
|
labelOf,
|
|
372
429
|
viewMode,
|
|
373
430
|
setViewMode: onViewModeChange,
|
|
431
|
+
selectionColumn: selectedIds !== undefined
|
|
432
|
+
? {
|
|
433
|
+
visible: columnVisibility[SELECT_COLUMN_ID] !== false,
|
|
434
|
+
setVisible: (visible) => updateColumnVisibility((prev) => ({ ...prev, [SELECT_COLUMN_ID]: visible })),
|
|
435
|
+
}
|
|
436
|
+
: undefined,
|
|
374
437
|
}), [
|
|
375
438
|
applySorting,
|
|
376
439
|
filterQuery,
|
|
@@ -383,6 +446,9 @@ export function DataTable({ columns, data, getRowId, onRowClick, onRowEdit, onRo
|
|
|
383
446
|
setFilterQuery,
|
|
384
447
|
sorting,
|
|
385
448
|
viewMode,
|
|
449
|
+
selectedIds,
|
|
450
|
+
columnVisibility,
|
|
451
|
+
updateColumnVisibility,
|
|
386
452
|
]);
|
|
387
453
|
/*
|
|
388
454
|
* ── Virtualization ────────────────────────────────────────────────────────
|
|
@@ -406,6 +472,10 @@ export function DataTable({ columns, data, getRowId, onRowClick, onRowEdit, onRo
|
|
|
406
472
|
const bodyScrolls = scrollBody || virtualEnabled;
|
|
407
473
|
const paginationHidden = hidePagination || virtualEnabled;
|
|
408
474
|
const selectionEnabled = selectedIds !== undefined;
|
|
475
|
+
/** The checkbox column is ON and not hidden through the Columns menu. Hiding it hides the
|
|
476
|
+
* boxes, never the selection: a row click that selects still does, and the caller's
|
|
477
|
+
* selection bar still counts it. */
|
|
478
|
+
const selectionShown = selectionEnabled && columnVisibility[SELECT_COLUMN_ID] !== false;
|
|
409
479
|
/**
|
|
410
480
|
* Without `getRowId`, TanStack ids a row by its index in the array it was
|
|
411
481
|
* handed — which is `filteredData`, so the builder narrowing the rows would
|
|
@@ -431,7 +501,7 @@ export function DataTable({ columns, data, getRowId, onRowClick, onRowEdit, onRo
|
|
|
431
501
|
const text = typeof next === 'string' ? next : (next?.text ?? '');
|
|
432
502
|
setSearchText(text);
|
|
433
503
|
},
|
|
434
|
-
onColumnVisibilityChange:
|
|
504
|
+
onColumnVisibilityChange: updateColumnVisibility,
|
|
435
505
|
onPaginationChange: chainUpdater(setPagination, onPaginationChange),
|
|
436
506
|
// 🔴 Not `'includesString'` any more. That built-in is `String(value)`, and
|
|
437
507
|
// `String(new Date())` / `String(['rock','80s'])` are not the text the
|
|
@@ -462,7 +532,11 @@ export function DataTable({ columns, data, getRowId, onRowClick, onRowEdit, onRo
|
|
|
462
532
|
getFilteredRowModel: serverSide || serverWindow ? undefined : getFilteredRowModel(),
|
|
463
533
|
// 🔴 `virtualEnabled` too, not only `serverSide`. See the note where the flag is
|
|
464
534
|
// computed: a paginated virtualizer sizes its spacer from one PAGE.
|
|
465
|
-
|
|
535
|
+
// 🔴 And `hidePagination` (forge task 2396): hiding the pager used to leave the paging ON,
|
|
536
|
+
// so a table past `pageSize` rows (50) silently showed its first page with no control to
|
|
537
|
+
// reach the rest — binary-server's run history and station's metric tables among them.
|
|
538
|
+
// A table with no pager shows every row; that is what "no pager" means.
|
|
539
|
+
getPaginationRowModel: serverSide || paginationHidden ? undefined : getPaginationRowModel(),
|
|
466
540
|
// TanStack's built-in auto-reset fires `resetPageIndex()` on EVERY `data`
|
|
467
541
|
// identity change (see `getCoreRowModel`'s memo deps), not just on filter/sort
|
|
468
542
|
// changes — any live-polling table (this one included: rows are re-derived
|
|
@@ -730,8 +804,8 @@ export function DataTable({ columns, data, getRowId, onRowClick, onRowEdit, onRo
|
|
|
730
804
|
// passes its own gets exactly that, and `TableToolbar` reads the same
|
|
731
805
|
// controls off `table.options.meta`, so composing a toolbar is never
|
|
732
806
|
// the thing that costs you the search box.
|
|
733
|
-
(searchable ? (_jsx(ToolbarPart, { table: table, searchPlaceholder: searchPlaceholder, fallback: _jsx(ToolbarPlaceholder, {}) })) : null));
|
|
734
|
-
const visibleColumnCount = table.getVisibleLeafColumns().length + (hasActions ? 1 : 0) + (
|
|
807
|
+
(searchable || toolbarOptions ? (_jsx(ToolbarPart, { table: table, searchPlaceholder: searchPlaceholder, enableSearch: searchable, ...toolbarOptions, fallback: _jsx(ToolbarPlaceholder, {}) })) : null));
|
|
808
|
+
const visibleColumnCount = table.getVisibleLeafColumns().length + (hasActions ? 1 : 0) + (selectionShown ? 1 : 0);
|
|
735
809
|
// Cards track the SAME live visibility state as the grid (ViewOptionsMenu toggles
|
|
736
810
|
// apply to both) — not just the ColDefs' initial `hidden` flags.
|
|
737
811
|
const cardColumns = liveColumns.filter((c) => table.getColumn(c.key)?.getIsVisible() ?? true);
|
|
@@ -744,16 +818,16 @@ export function DataTable({ columns, data, getRowId, onRowClick, onRowEdit, onRo
|
|
|
744
818
|
// columns missing rather than one that scrolls (`useScrollEdgeFade`).
|
|
745
819
|
const gridFade = useScrollEdgeFade();
|
|
746
820
|
const tableMinWidth = fixedLayout
|
|
747
|
-
? Math.max(minTableWidth ?? 0, declaredTrackFloor(cardColumns, hasActions) + (
|
|
821
|
+
? Math.max(minTableWidth ?? 0, declaredTrackFloor(cardColumns, hasActions) + (selectionShown ? SELECT_TRACK_PX : 0))
|
|
748
822
|
: minTableWidth;
|
|
749
823
|
return (_jsxs("div", { className: cn('@container flex min-h-0 flex-col', className), children: [toolbarNode, summaryNode != null ? (_jsx("div", { "data-cb-table-selection-summary": '', "aria-live": 'polite', className: 'flex min-h-11 flex-wrap items-center gap-3 border-b border-border px-4 py-2 text-sm', children: summaryNode })) : null, loading ? (_jsx("div", { className: 'flex flex-col gap-2 p-4', children: Array.from({ length: 5 }).map((_, i) => (_jsx(Skeleton, { className: 'h-10 w-full' }, `dt-skeleton-${i}`))) })) : rows.length === 0 && windowTotal === 0 ? (_jsx("div", { className: 'p-2', children: emptyState ?? _jsx(EmptyState, { title: 'No results' }) })) : (_jsxs("div", { ref: scrollRef, "data-cb-table-scroll": bodyScrolls ? '' : undefined,
|
|
750
824
|
// guardrails-ignore no-raw-overflow: dual-axis table scroll container — sticky header pins to it; ScrollArea cannot own horizontal table scroll.
|
|
751
|
-
className: cn(bodyScrolls && 'min-h-0 flex-1 overflow-auto', scrollClassName), children: [
|
|
825
|
+
className: cn(bodyScrolls && 'min-h-0 flex-1 overflow-auto', scrollClassName), children: [selectionShown && (viewMode === 'card' || mobileCards) ? (_jsx("div", { "data-cb-table-select-all": '', className: cn('flex items-center px-2 py-1', viewMode !== 'card' && '@xl:hidden'), children: headerCheckbox('Select all') })) : null, viewMode === 'card' ? (_jsx(CardView, { columns: cardColumns, data: rows.map((row) => row.original), getRowId: getRowId, onRowClick: onRowClick, dragPropsFor: getRowDrag ? dragPropsFor : undefined, selectFor: selectionShown
|
|
752
826
|
? (_row, index) => {
|
|
753
827
|
const tsRow = rows[index];
|
|
754
828
|
return tsRow ? rowCheckbox(tsRow) : null;
|
|
755
829
|
}
|
|
756
|
-
: undefined, cardMinWidth: cardMinWidth, className: 'p-2' })) : (_jsxs(_Fragment, { children: [mobileCards && (_jsx("div", { "data-cb-table-cards": '', className: 'flex flex-col gap-3 @xl:hidden', children: rows.map((row) => (_jsx(MobileRowCard, { row: row, columns: cardColumns, className: rowClassName?.(row.original), onRowClick: onRowClick, dragProps: mergeRowProps(dragPropsFor(row.original), getRowProps?.(row.original, windowStart + row.index)), select:
|
|
830
|
+
: undefined, cardMinWidth: cardMinWidth, className: 'p-2' })) : (_jsxs(_Fragment, { children: [mobileCards && (_jsx("div", { "data-cb-table-cards": '', className: 'flex flex-col gap-3 @xl:hidden', children: rows.map((row) => (_jsx(MobileRowCard, { row: row, columns: cardColumns, className: rowClassName?.(row.original), onRowClick: onRowClick, dragProps: mergeRowProps(dragPropsFor(row.original), getRowProps?.(row.original, windowStart + row.index)), select: selectionShown ? rowCheckbox(row) : undefined, actions: hasActions ? (_jsx(RowActions, { row: row.original, onEdit: onRowEdit, onDelete: onRowDelete, menu: rowMenu?.(row.original) })) : null, expanded: renderExpanded && expandedRowId != null && row.id === expandedRowId
|
|
757
831
|
? renderExpanded(row.original)
|
|
758
832
|
: null }, row.id))) })), mobileCards && (_jsx("div", { "data-cb-table-list": '', className: 'hidden @xl:block @3xl:hidden', children: (() => {
|
|
759
833
|
const [title, ...rest] = cardColumns;
|
|
@@ -775,19 +849,19 @@ export function DataTable({ columns, data, getRowId, onRowClick, onRowEdit, onRo
|
|
|
775
849
|
// absent (the header) and every preceding lane drifts ~32px off
|
|
776
850
|
// its label — the v4 judge's tablet misalignment finding.
|
|
777
851
|
const template = [
|
|
778
|
-
...(
|
|
852
|
+
...(selectionShown ? ['44px'] : []),
|
|
779
853
|
'minmax(0,1fr)',
|
|
780
854
|
...rest.map(trackOf),
|
|
781
855
|
...(hasActions ? ['32px'] : []),
|
|
782
856
|
].join(' ');
|
|
783
|
-
const header = (_jsxs("div", { "data-cb-table-list-header": '', className: 'grid items-center gap-3 border-b border-border px-4 py-2 text-caption font-bold uppercase tracking-wider text-muted-foreground', style: { gridTemplateColumns: template }, children: [
|
|
857
|
+
const header = (_jsxs("div", { "data-cb-table-list-header": '', className: 'grid items-center gap-3 border-b border-border px-4 py-2 text-caption font-bold uppercase tracking-wider text-muted-foreground', style: { gridTemplateColumns: template }, children: [selectionShown ? _jsx("span", { className: 'flex justify-center', children: headerCheckbox() }) : null, _jsx("span", { children: title?.label ?? '' }), rest.map((col) => (_jsx("span", { className: cn(resolveColumnAlign(col) === 'right' && 'text-right'), children: col.label }, col.key))), hasActions ? _jsx("span", { "aria-hidden": true }) : null] }));
|
|
784
858
|
const body = rows.map((row) => {
|
|
785
859
|
const isExpanded = renderExpanded != null && expandedRowId != null && row.id === expandedRowId;
|
|
786
860
|
return (_jsxs(Fragment, { children: [_jsxs("div", { ...mergeRowProps({
|
|
787
861
|
...dragPropsFor(row.original),
|
|
788
862
|
className: cn('grid items-center gap-3 px-4 py-3 transition-colors hover:bg-muted/40', getRowDrag && 'cursor-grab active:cursor-grabbing', rowClassName?.(row.original)),
|
|
789
863
|
style: { gridTemplateColumns: template },
|
|
790
|
-
}, getRowProps?.(row.original, windowStart + row.index)), children: [
|
|
864
|
+
}, getRowProps?.(row.original, windowStart + row.index)), children: [selectionShown ? (_jsx("div", { ...selectCellProps(row), className: '-my-3 flex self-stretch items-center justify-center', children: rowCheckbox(row) })) : null, _jsx("div", { className: 'min-w-0', children: title ? (_jsx(CellRenderer, { col: title, value: row.original[title.key], row: row.original })) : null }), rest.map((col) => (_jsx("div", { className: cn(resolveColumnAlign(col) === 'right' && 'justify-self-end text-right'), children: _jsx(CellRenderer, { col: col, value: row.original[col.key], row: row.original }) }, col.key))), hasActions ? (_jsx(RowActions, { row: row.original, onEdit: onRowEdit, onDelete: onRowDelete, menu: rowMenu?.(row.original) })) : null] }), isExpanded ? (_jsx("div", { className: 'bg-muted/20 px-4 pt-1 pb-3', children: _jsx(Surface, { level: "raised", pad: "sm", radius: "lg", children: renderExpanded(row.original) }) })) : null] }, row.id));
|
|
791
865
|
});
|
|
792
866
|
return (_jsxs(_Fragment, { children: [header, _jsx("div", { className: 'divide-y divide-border', children: body })] }));
|
|
793
867
|
})() })), _jsx("div", { ref: bodyScrolls ? undefined : gridFade.ref, onScroll: bodyScrolls ? undefined : gridFade.onScroll, style: bodyScrolls ? undefined : gridFade.maskStyle,
|
|
@@ -821,14 +895,14 @@ export function DataTable({ columns, data, getRowId, onRowClick, onRowEdit, onRo
|
|
|
821
895
|
// next header slides over the frozen one. It is opaque
|
|
822
896
|
// for the same reason the body cells are.
|
|
823
897
|
frozen &&
|
|
824
|
-
(
|
|
898
|
+
(selectionShown
|
|
825
899
|
? 'sticky left-11 bg-card shadow-[1px_0_0_0_var(--color-border)]'
|
|
826
900
|
: 'sticky left-0 bg-card shadow-[1px_0_0_0_var(--color-border)]'), frozen && (stickyHeader ? 'z-30' : 'z-20'), meta?.hideBelow && HIDE_BELOW_CLASS[meta.hideBelow]), children: h.isPlaceholder
|
|
827
901
|
? null
|
|
828
|
-
:
|
|
902
|
+
: renderTemplate(h.column.columnDef.header, h.getContext()) }, h.id));
|
|
829
903
|
};
|
|
830
904
|
const isLeading = (h) => h.column.columnDef.meta?.leading === true;
|
|
831
|
-
return (_jsxs(_Fragment, { children: [hg.headers.filter(isLeading).map((h) => renderHeader(h, -1)),
|
|
905
|
+
return (_jsxs(_Fragment, { children: [hg.headers.filter(isLeading).map((h) => renderHeader(h, -1)), selectionShown ? (_jsx("th", { scope: 'col', className: cn('w-11 border-b border-border px-0 text-center', stickyHeader && 'sticky top-0 z-10 bg-card/95 backdrop-blur-sm', stickyFirstColumn && 'sticky left-0 bg-card', stickyFirstColumn && (stickyHeader ? 'z-30' : 'z-20')), children: headerCheckbox() })) : null, hg.headers.filter((h) => !isLeading(h)).map(renderHeader)] }));
|
|
832
906
|
})(), hasActions ? (_jsx("th", { className: cn('w-20 border-b border-border px-2', stickyHeader && 'sticky top-0 z-10 bg-card/95 backdrop-blur-sm'), "aria-label": 'Row actions' })) : null] }, hg.id))) }), _jsxs("tbody", { children: [padTop > 0 ? (_jsx("tr", { "aria-hidden": true, style: { height: padTop }, children: _jsx("td", { colSpan: visibleColumnCount }) })) : null, bodyRows.map((row, sliceIndex) => {
|
|
833
907
|
if (row === null) {
|
|
834
908
|
// A row the server window has not loaded yet: the estimated height, so
|
|
@@ -887,7 +961,7 @@ export function DataTable({ columns, data, getRowId, onRowClick, onRowEdit, onRo
|
|
|
887
961
|
: 'var(--color-card)',
|
|
888
962
|
}
|
|
889
963
|
: undefined, className: cn('px-4 align-middle', cellPadY, frozen &&
|
|
890
|
-
(
|
|
964
|
+
(selectionShown
|
|
891
965
|
? 'sticky left-11 z-10 bg-[var(--cb-frozen-bg)] shadow-[1px_0_0_0_var(--color-border)]'
|
|
892
966
|
: 'sticky left-0 z-10 bg-[var(--cb-frozen-bg)] shadow-[1px_0_0_0_var(--color-border)]'),
|
|
893
967
|
// A rigid track cannot widen for its content, so an
|
|
@@ -898,9 +972,9 @@ export function DataTable({ columns, data, getRowId, onRowClick, onRowEdit, onRo
|
|
|
898
972
|
// `overflow: hidden`: a cell may host a menu/tooltip that
|
|
899
973
|
// has to escape its bounds.
|
|
900
974
|
fixedLayout && '[overflow-wrap:anywhere]', cell.column.columnDef.meta?.align === 'right' && 'text-right', cell.column.columnDef.meta?.hideBelow &&
|
|
901
|
-
HIDE_BELOW_CLASS[cell.column.columnDef.meta.hideBelow]), children:
|
|
975
|
+
HIDE_BELOW_CLASS[cell.column.columnDef.meta.hideBelow]), children: renderTemplate(cell.column.columnDef.cell, cell.getContext()) }, cell.id));
|
|
902
976
|
};
|
|
903
|
-
return (_jsxs(_Fragment, { children: [cells.filter(isLeading).map((cell) => renderCell(cell, -1)),
|
|
977
|
+
return (_jsxs(_Fragment, { children: [cells.filter(isLeading).map((cell) => renderCell(cell, -1)), selectionShown ? (_jsx("td", { ...selectCellProps(row), style: stickyFirstColumn
|
|
904
978
|
? {
|
|
905
979
|
'--cb-frozen-bg': rowIndex % 2 === 1
|
|
906
980
|
? 'color-mix(in srgb, var(--color-muted) 50%, var(--color-card))'
|