eidos-ui 2.0.0 → 3.0.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/README.md +66 -16
- package/dist/Avatar.types-BY-C09Ke.d.cts +23 -0
- package/dist/Avatar.types-BY-C09Ke.d.ts +23 -0
- package/dist/{Header.types-BZi80bWz.d.cts → Header.types-B3QtuiL-.d.cts} +7 -3
- package/dist/{Header.types-DJt-q01P.d.ts → Header.types-C6w0FBY8.d.ts} +7 -3
- package/dist/{Table.types-Cl5gR8r9.d.cts → Table.types-CPj-udMc.d.cts} +95 -0
- package/dist/{Table.types-jhPb7JNU.d.ts → Table.types-CZZ7QWAI.d.ts} +95 -0
- package/dist/ThemeProvider.types-DgXN0gEH.d.cts +88 -0
- package/dist/ThemeProvider.types-DgXN0gEH.d.ts +88 -0
- package/dist/Toolbar.types-DSk8z2iy.d.cts +38 -0
- package/dist/Toolbar.types-RN0klQzu.d.ts +38 -0
- package/dist/alert/index.cjs +4 -4
- package/dist/alert/index.d.cts +2 -1
- package/dist/alert/index.d.ts +2 -1
- package/dist/alert/index.js +3 -3
- package/dist/avatar/index.d.cts +3 -21
- package/dist/avatar/index.d.ts +3 -21
- package/dist/button/index.cjs +3 -3
- package/dist/button/index.js +2 -2
- package/dist/chip/index.cjs +3 -3
- package/dist/chip/index.js +2 -2
- package/dist/chunk-2ZY7M72Q.js +521 -0
- package/dist/chunk-2ZY7M72Q.js.map +1 -0
- package/dist/{chunk-KIXFSXIN.cjs → chunk-3E7TKBQI.cjs} +5 -3
- package/dist/chunk-3E7TKBQI.cjs.map +1 -0
- package/dist/{chunk-ZBKJ3EMK.cjs → chunk-442U3W6R.cjs} +3 -3
- package/dist/{chunk-ZBKJ3EMK.cjs.map → chunk-442U3W6R.cjs.map} +1 -1
- package/dist/{chunk-W6IKHJ76.cjs → chunk-5BX4Q76D.cjs} +134 -126
- package/dist/chunk-5BX4Q76D.cjs.map +1 -0
- package/dist/{chunk-YQLCPKGV.js → chunk-5HUZYY54.js} +6 -4
- package/dist/chunk-5HUZYY54.js.map +1 -0
- package/dist/{chunk-G5IGADJI.cjs → chunk-5VM2256W.cjs} +7 -11
- package/dist/chunk-5VM2256W.cjs.map +1 -0
- package/dist/{chunk-Z4ZY7L7W.js → chunk-5ZL6PYU3.js} +3 -3
- package/dist/{chunk-A3NE2C7C.js → chunk-67RFMV6K.js} +2 -2
- package/dist/{chunk-2U7UJOOB.cjs → chunk-6HUHH6Y4.cjs} +17 -15
- package/dist/chunk-6HUHH6Y4.cjs.map +1 -0
- package/dist/{chunk-5WROPW7Z.js → chunk-A7WQINIG.js} +3 -3
- package/dist/{chunk-DKZTDYH5.cjs → chunk-AAA6TR5I.cjs} +3 -3
- package/dist/{chunk-DKZTDYH5.cjs.map → chunk-AAA6TR5I.cjs.map} +1 -1
- package/dist/{chunk-A7Z2QAFZ.cjs → chunk-APK5OQRV.cjs} +5 -5
- package/dist/{chunk-A7Z2QAFZ.cjs.map → chunk-APK5OQRV.cjs.map} +1 -1
- package/dist/{chunk-ISABZ2VX.cjs → chunk-AXBYJ2OY.cjs} +9 -9
- package/dist/{chunk-ISABZ2VX.cjs.map → chunk-AXBYJ2OY.cjs.map} +1 -1
- package/dist/{chunk-6RGJAQCU.cjs → chunk-B5G5XVFJ.cjs} +5 -5
- package/dist/{chunk-6RGJAQCU.cjs.map → chunk-B5G5XVFJ.cjs.map} +1 -1
- package/dist/{chunk-MW2S7PZ7.cjs → chunk-D5IY2HUV.cjs} +5 -5
- package/dist/{chunk-MW2S7PZ7.cjs.map → chunk-D5IY2HUV.cjs.map} +1 -1
- package/dist/{chunk-FMPXSF3H.cjs → chunk-DAXZRNNO.cjs} +4 -4
- package/dist/{chunk-FMPXSF3H.cjs.map → chunk-DAXZRNNO.cjs.map} +1 -1
- package/dist/{chunk-AJZTVCST.js → chunk-EXITZVB2.js} +24 -9
- package/dist/chunk-EXITZVB2.js.map +1 -0
- package/dist/{chunk-AYMD4D4M.cjs → chunk-EZME5CLK.cjs} +3 -3
- package/dist/{chunk-AYMD4D4M.cjs.map → chunk-EZME5CLK.cjs.map} +1 -1
- package/dist/{chunk-IV4LM3MB.js → chunk-F26VIKNF.js} +9 -11
- package/dist/chunk-F26VIKNF.js.map +1 -0
- package/dist/{chunk-WPTMMOA6.cjs → chunk-G77YR73R.cjs} +10 -13
- package/dist/chunk-G77YR73R.cjs.map +1 -0
- package/dist/chunk-GEHL4LKK.cjs +32 -0
- package/dist/chunk-GEHL4LKK.cjs.map +1 -0
- package/dist/chunk-GGSII6Y2.cjs +921 -0
- package/dist/chunk-GGSII6Y2.cjs.map +1 -0
- package/dist/{chunk-3VRMTWUS.js → chunk-GHQ6SQPI.js} +7 -10
- package/dist/chunk-GHQ6SQPI.js.map +1 -0
- package/dist/{chunk-56B6RLOE.js → chunk-GI6VJYOS.js} +4 -4
- package/dist/{chunk-56B6RLOE.js.map → chunk-GI6VJYOS.js.map} +1 -1
- package/dist/{chunk-UGMONQGH.cjs → chunk-GR2PMCVN.cjs} +10 -12
- package/dist/chunk-GR2PMCVN.cjs.map +1 -0
- package/dist/{chunk-7AHZTHXR.cjs → chunk-GT22EGJP.cjs} +5 -5
- package/dist/{chunk-7AHZTHXR.cjs.map → chunk-GT22EGJP.cjs.map} +1 -1
- package/dist/chunk-H5HWFOWZ.js +390 -0
- package/dist/chunk-H5HWFOWZ.js.map +1 -0
- package/dist/{chunk-ALGX5X4N.js → chunk-IFVT5UCY.js} +3 -3
- package/dist/{chunk-5CLC3FJO.js → chunk-KBG77JHC.js} +13 -2
- package/dist/chunk-KBG77JHC.js.map +1 -0
- package/dist/{chunk-HLNKIAE5.cjs → chunk-KJZUYC4X.cjs} +5 -5
- package/dist/{chunk-HLNKIAE5.cjs.map → chunk-KJZUYC4X.cjs.map} +1 -1
- package/dist/{chunk-JV7Z3D3U.js → chunk-LEMCJW57.js} +134 -126
- package/dist/chunk-LEMCJW57.js.map +1 -0
- package/dist/{chunk-4BQM5F76.cjs → chunk-LFWPQYWX.cjs} +3 -3
- package/dist/{chunk-4BQM5F76.cjs.map → chunk-LFWPQYWX.cjs.map} +1 -1
- package/dist/{chunk-XVSODE4K.cjs → chunk-LIFUHQH5.cjs} +35 -20
- package/dist/chunk-LIFUHQH5.cjs.map +1 -0
- package/dist/{chunk-PJC7NZUV.cjs → chunk-LUL6RZ4M.cjs} +3 -3
- package/dist/{chunk-PJC7NZUV.cjs.map → chunk-LUL6RZ4M.cjs.map} +1 -1
- package/dist/{chunk-4UJ7LG4W.cjs → chunk-N2IGZIEX.cjs} +3 -3
- package/dist/{chunk-4UJ7LG4W.cjs.map → chunk-N2IGZIEX.cjs.map} +1 -1
- package/dist/{chunk-3LHQUOGP.js → chunk-NGVOXM7P.js} +3 -3
- package/dist/{chunk-WTXASLBB.js → chunk-O5WEKLNF.js} +2 -2
- package/dist/{chunk-BOB5JJ7F.js → chunk-P7IQY5YH.js} +2 -2
- package/dist/{chunk-VZYLJSV5.js → chunk-R4PU2TBM.js} +2 -2
- package/dist/{chunk-P2GCAVUZ.js → chunk-RAZRQ57B.js} +2 -2
- package/dist/{chunk-K7IFNKMN.js → chunk-REVK7IGN.js} +2 -2
- package/dist/{chunk-6U2H26A4.cjs → chunk-RHOT7AEI.cjs} +3 -3
- package/dist/{chunk-6U2H26A4.cjs.map → chunk-RHOT7AEI.cjs.map} +1 -1
- package/dist/{chunk-MH2CD2QT.js → chunk-RKA2OJRT.js} +207 -102
- package/dist/chunk-RKA2OJRT.js.map +1 -0
- package/dist/{chunk-JC4WLVBG.js → chunk-RWOX2NJN.js} +2 -2
- package/dist/{chunk-4LM33LDV.js → chunk-S3CT536K.js} +2 -2
- package/dist/chunk-SE7MWOC7.cjs +390 -0
- package/dist/chunk-SE7MWOC7.cjs.map +1 -0
- package/dist/{chunk-4M3LZLOH.js → chunk-SHYSLWQG.js} +2 -2
- package/dist/{chunk-EQEV7GPT.cjs → chunk-SKEWTQJ7.cjs} +5 -5
- package/dist/{chunk-EQEV7GPT.cjs.map → chunk-SKEWTQJ7.cjs.map} +1 -1
- package/dist/{chunk-2ZENLZEQ.cjs → chunk-SKTDGCWJ.cjs} +232 -127
- package/dist/chunk-SKTDGCWJ.cjs.map +1 -0
- package/dist/{chunk-2BXCIWL7.js → chunk-SN6EWQDJ.js} +3 -3
- package/dist/{chunk-DW2YDWGN.js → chunk-TEJIPPZR.js} +2 -2
- package/dist/{chunk-OGKD5PLS.cjs → chunk-TRLBYA5G.cjs} +4 -4
- package/dist/{chunk-OGKD5PLS.cjs.map → chunk-TRLBYA5G.cjs.map} +1 -1
- package/dist/chunk-U5FHQ73U.cjs +521 -0
- package/dist/chunk-U5FHQ73U.cjs.map +1 -0
- package/dist/{chunk-WE5FTQGD.js → chunk-VHMOKXUT.js} +3 -7
- package/dist/chunk-VHMOKXUT.js.map +1 -0
- package/dist/{chunk-S77GR5YQ.cjs → chunk-VHQTDITV.cjs} +3 -3
- package/dist/{chunk-S77GR5YQ.cjs.map → chunk-VHQTDITV.cjs.map} +1 -1
- package/dist/{chunk-3HMKE2GJ.js → chunk-VSTQEHVZ.js} +6 -4
- package/dist/chunk-VSTQEHVZ.js.map +1 -0
- package/dist/{chunk-HNUTV3HR.cjs → chunk-WUBQJVB7.cjs} +3 -3
- package/dist/{chunk-HNUTV3HR.cjs.map → chunk-WUBQJVB7.cjs.map} +1 -1
- package/dist/{chunk-S7TWEVC3.js → chunk-Y53HCLGW.js} +2 -2
- package/dist/{chunk-WIE7HDIM.js → chunk-YJXZR7RL.js} +2 -2
- package/dist/{chunk-IJYYHBZC.cjs → chunk-Z4SLV6WG.cjs} +3 -3
- package/dist/{chunk-IJYYHBZC.cjs.map → chunk-Z4SLV6WG.cjs.map} +1 -1
- package/dist/chunk-ZEZK664O.js +921 -0
- package/dist/chunk-ZEZK664O.js.map +1 -0
- package/dist/{chunk-JMD3P4CY.js → chunk-ZHFPV43D.js} +2 -2
- package/dist/color-picker/index.cjs +2 -2
- package/dist/color-picker/index.js +1 -1
- package/dist/combobox/index.cjs +4 -4
- package/dist/combobox/index.js +3 -3
- package/dist/context-menu/index.cjs +4 -4
- package/dist/context-menu/index.js +3 -3
- package/dist/data-grid/index.cjs +13 -13
- package/dist/data-grid/index.d.cts +49 -3
- package/dist/data-grid/index.d.ts +49 -3
- package/dist/data-grid/index.js +12 -12
- package/dist/date-picker/index.cjs +6 -6
- package/dist/date-picker/index.js +5 -5
- package/dist/drawer/index.cjs +4 -4
- package/dist/drawer/index.d.cts +2 -1
- package/dist/drawer/index.d.ts +2 -1
- package/dist/drawer/index.js +3 -3
- package/dist/empty-state/index.d.cts +2 -2
- package/dist/empty-state/index.d.ts +2 -2
- package/dist/fonts/JetBrains-Mono-OFL.txt +93 -0
- package/dist/fonts/Plus-Jakarta-Sans-OFL.txt +93 -0
- package/dist/fonts/jetbrains-mono-latin-ext-wght-normal.woff2 +0 -0
- package/dist/fonts/jetbrains-mono-latin-wght-normal.woff2 +0 -0
- package/dist/fonts/plus-jakarta-sans-latin-ext-wght-normal.woff2 +0 -0
- package/dist/fonts/plus-jakarta-sans-latin-wght-normal.woff2 +0 -0
- package/dist/fonts.css +32 -0
- package/dist/fonts.css.d.ts +2 -0
- package/dist/header/index.cjs +4 -4
- package/dist/header/index.d.cts +2 -2
- package/dist/header/index.d.ts +2 -2
- package/dist/header/index.js +3 -3
- package/dist/index.cjs +59 -33
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +625 -174
- package/dist/index.d.cts +8 -4
- package/dist/index.d.ts +8 -4
- package/dist/index.js +62 -36
- package/dist/inline-edit/index.cjs +4 -4
- package/dist/inline-edit/index.js +3 -3
- package/dist/input/index.cjs +3 -3
- package/dist/input/index.js +2 -2
- package/dist/menu/index.cjs +3 -3
- package/dist/menu/index.js +2 -2
- package/dist/modal/index.cjs +4 -4
- package/dist/modal/index.d.cts +2 -1
- package/dist/modal/index.d.ts +2 -1
- package/dist/modal/index.js +3 -3
- package/dist/navigation/index.cjs +4 -4
- package/dist/navigation/index.js +3 -3
- package/dist/page-layout/index.cjs +8 -8
- package/dist/page-layout/index.d.cts +3 -2
- package/dist/page-layout/index.d.ts +3 -2
- package/dist/page-layout/index.js +7 -7
- package/dist/pagination/index.cjs +6 -6
- package/dist/pagination/index.js +5 -5
- package/dist/popover/index.cjs +2 -2
- package/dist/popover/index.d.cts +2 -2
- package/dist/popover/index.d.ts +2 -2
- package/dist/popover/index.js +1 -1
- package/dist/segmented-control/index.cjs +3 -3
- package/dist/segmented-control/index.js +2 -2
- package/dist/select/index.cjs +4 -4
- package/dist/select/index.js +3 -3
- package/dist/snackbar/index.cjs +4 -4
- package/dist/snackbar/index.js +3 -3
- package/dist/split-button/index.cjs +4 -4
- package/dist/split-button/index.js +3 -3
- package/dist/table/index.cjs +11 -11
- package/dist/table/index.d.cts +3 -3
- package/dist/table/index.d.ts +3 -3
- package/dist/table/index.js +10 -10
- package/dist/tabs/index.cjs +3 -3
- package/dist/tabs/index.js +2 -2
- package/dist/tag-input/index.cjs +4 -4
- package/dist/tag-input/index.js +3 -3
- package/dist/textarea/index.cjs +3 -3
- package/dist/textarea/index.js +2 -2
- package/dist/theme-editor/index.cjs +22 -0
- package/dist/theme-editor/index.cjs.map +1 -0
- package/dist/theme-editor/index.d.cts +65 -0
- package/dist/theme-editor/index.d.ts +65 -0
- package/dist/theme-editor/index.js +22 -0
- package/dist/theme-editor/index.js.map +1 -0
- package/dist/theme-provider/index.cjs +27 -0
- package/dist/theme-provider/index.cjs.map +1 -0
- package/dist/theme-provider/index.d.cts +123 -0
- package/dist/theme-provider/index.d.ts +123 -0
- package/dist/theme-provider/index.js +27 -0
- package/dist/theme-provider/index.js.map +1 -0
- package/dist/toolbar/index.cjs +5 -5
- package/dist/toolbar/index.d.cts +3 -2
- package/dist/toolbar/index.d.ts +3 -2
- package/dist/toolbar/index.js +4 -4
- package/package.json +17 -6
- package/dist/Toolbar.types-BGD57Uhm.d.ts +0 -22
- package/dist/Toolbar.types-tQkLmPIu.d.cts +0 -22
- package/dist/chunk-2U7UJOOB.cjs.map +0 -1
- package/dist/chunk-2ZENLZEQ.cjs.map +0 -1
- package/dist/chunk-3HMKE2GJ.js.map +0 -1
- package/dist/chunk-3VRMTWUS.js.map +0 -1
- package/dist/chunk-5CLC3FJO.js.map +0 -1
- package/dist/chunk-AJZTVCST.js.map +0 -1
- package/dist/chunk-G5IGADJI.cjs.map +0 -1
- package/dist/chunk-GOR642KK.cjs +0 -21
- package/dist/chunk-GOR642KK.cjs.map +0 -1
- package/dist/chunk-IV4LM3MB.js.map +0 -1
- package/dist/chunk-JV7Z3D3U.js.map +0 -1
- package/dist/chunk-KIXFSXIN.cjs.map +0 -1
- package/dist/chunk-MH2CD2QT.js.map +0 -1
- package/dist/chunk-QONDJ5VM.cjs +0 -744
- package/dist/chunk-QONDJ5VM.cjs.map +0 -1
- package/dist/chunk-UGMONQGH.cjs.map +0 -1
- package/dist/chunk-VSFKM7FE.js +0 -744
- package/dist/chunk-VSFKM7FE.js.map +0 -1
- package/dist/chunk-W6IKHJ76.cjs.map +0 -1
- package/dist/chunk-WE5FTQGD.js.map +0 -1
- package/dist/chunk-WPTMMOA6.cjs.map +0 -1
- package/dist/chunk-XVSODE4K.cjs.map +0 -1
- package/dist/chunk-YQLCPKGV.js.map +0 -1
- /package/dist/{chunk-Z4ZY7L7W.js.map → chunk-5ZL6PYU3.js.map} +0 -0
- /package/dist/{chunk-A3NE2C7C.js.map → chunk-67RFMV6K.js.map} +0 -0
- /package/dist/{chunk-5WROPW7Z.js.map → chunk-A7WQINIG.js.map} +0 -0
- /package/dist/{chunk-ALGX5X4N.js.map → chunk-IFVT5UCY.js.map} +0 -0
- /package/dist/{chunk-3LHQUOGP.js.map → chunk-NGVOXM7P.js.map} +0 -0
- /package/dist/{chunk-WTXASLBB.js.map → chunk-O5WEKLNF.js.map} +0 -0
- /package/dist/{chunk-BOB5JJ7F.js.map → chunk-P7IQY5YH.js.map} +0 -0
- /package/dist/{chunk-VZYLJSV5.js.map → chunk-R4PU2TBM.js.map} +0 -0
- /package/dist/{chunk-P2GCAVUZ.js.map → chunk-RAZRQ57B.js.map} +0 -0
- /package/dist/{chunk-K7IFNKMN.js.map → chunk-REVK7IGN.js.map} +0 -0
- /package/dist/{chunk-JC4WLVBG.js.map → chunk-RWOX2NJN.js.map} +0 -0
- /package/dist/{chunk-4LM33LDV.js.map → chunk-S3CT536K.js.map} +0 -0
- /package/dist/{chunk-4M3LZLOH.js.map → chunk-SHYSLWQG.js.map} +0 -0
- /package/dist/{chunk-2BXCIWL7.js.map → chunk-SN6EWQDJ.js.map} +0 -0
- /package/dist/{chunk-DW2YDWGN.js.map → chunk-TEJIPPZR.js.map} +0 -0
- /package/dist/{chunk-S7TWEVC3.js.map → chunk-Y53HCLGW.js.map} +0 -0
- /package/dist/{chunk-WIE7HDIM.js.map → chunk-YJXZR7RL.js.map} +0 -0
- /package/dist/{chunk-JMD3P4CY.js.map → chunk-ZHFPV43D.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Table/Table.component.tsx"],"sourcesContent":["import { useState, useMemo, useEffect, useLayoutEffect, useRef, useCallback } from 'react';\nimport React from 'react';\nimport {\n ChevronsUpDown,\n ArrowUp,\n ArrowDown,\n Check,\n Download,\n Columns3,\n AlignJustify,\n GripVertical,\n FolderOpen,\n SearchX,\n} from 'lucide-react';\nimport { DndContext, PointerSensor, KeyboardSensor, useSensor, useSensors } from '@dnd-kit/core';\nimport type { DragEndEvent } from '@dnd-kit/core';\nimport {\n SortableContext,\n horizontalListSortingStrategy,\n useSortable,\n sortableKeyboardCoordinates,\n arrayMove,\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { devWarn } from '../../utils';\nimport type { RowKey } from '../../utils';\nimport type { TableColumn, TableProps, TableFilters, FilterValue } from './Table.types';\n\n// `TableColumn<T>` is a discriminated union, so `render` is a union of\n// function types and its parameter type is their intersection. The table\n// walks columns generically and looks values up by a runtime string key, so\n// it widens the renderer once here rather than narrowing the union at the\n// call site - the union is enforced where it matters, at the consumer's.\ntype TableCellRenderer<T> = (value: unknown, item: T) => React.ReactNode;\n\nexport type { TableColumn, TableProps, TableFilters, FilterValue };\nimport { Button } from '../Button';\nimport { Checkbox } from '../Checkbox';\nimport { Dropdown } from '../Dropdown';\nimport { EmptyState } from '../EmptyState';\nimport { Pagination } from '../Pagination';\nimport { SplitButton } from '../SplitButton';\nimport { Spinner } from '../Spinner';\nimport { TableFiltersDropdown } from './TableFiltersDropdown.component';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\n// Minimum usable widths (px) per column, summed into the automatic card-view\n// threshold below so a table with many columns doesn't have to overflow\n// horizontally before `cardViewBreakpoint` (a single, hand-tuned number) is\n// reached. Same values as DataGrid's, so the siblings switch over at the same\n// point.\n//\n// Single-control columns are counted at their real, fixed width rather than as\n// a full data column: they never grow, so charging them 100px each overstated\n// the table's minimum and flipped tables into card view while they still had\n// room to spare. Keep in sync with the widths in Table.scss.\nconst MIN_DATA_COLUMN_WIDTH_PX = 100;\nconst ICON_COLUMN_WIDTH_PX = 48;\nconst CHECKBOX_COLUMN_WIDTH_PX = 40;\n\n// Container width (px) below which the toolbar's own buttons drop their labels\n// and render icon-only (with tooltips). Roughly the point at which the built-in\n// controls stop fitting on one line beside a selection count - measured off the\n// container, not the viewport, so a table in a narrow pane compacts too.\n//\n// This only ever affects the library's own buttons. Everything a consumer puts\n// in the toolbar (`bulkActions`, and `DataGrid`'s `quickFilters`) is rendered\n// as given and relies on the toolbar wrapping instead - which is the part that\n// actually guarantees nothing overlaps, since arbitrary content can always be\n// wider than any threshold. Same value in DataGrid.\nconst COMPACT_TOOLBAR_WIDTH_PX = 560;\n\ntype Density = 'compact' | 'comfortable' | 'spacious';\n\nconst DENSITY_OPTIONS: { value: Density; label: string }[] = [\n { value: 'compact', label: 'Compact' },\n { value: 'comfortable', label: 'Comfortable' },\n { value: 'spacious', label: 'Spacious' },\n];\n\n// ── CSV helpers ───────────────────────────────────────────────────────────────\n\nfunction escapeCsvValue(value: string): string {\n if (value.includes(',') || value.includes('\\n') || value.includes('\"')) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n}\n\n// ── SortableColumnHeader ──────────────────────────────────────────────────────\n// Defined as a standalone component so it can legally call useSortable().\n// Only rendered when draggableColumns=true (inside a DndContext + SortableContext).\n\ninterface SortableThProps {\n id: string;\n column: { label: string };\n isSortable: boolean;\n isCurrentlySorted: boolean;\n sortDirection: 'asc' | 'desc' | null;\n alignment: string;\n columnType: string;\n columnWidth: string | undefined;\n pinnedClass: string;\n stickyStyle: React.CSSProperties;\n onSortClick: () => void;\n}\n\nfunction SortableColumnHeader({\n id,\n column,\n isSortable,\n isCurrentlySorted,\n sortDirection,\n alignment,\n columnType,\n columnWidth,\n pinnedClass,\n stickyStyle,\n onSortClick,\n}: SortableThProps) {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\n id,\n });\n\n const transformStr = CSS.Transform.toString(transform);\n\n const thClassName = [\n 'eidos-table-header-cell',\n `eidos-table-header-cell-${columnType}`,\n isSortable ? 'eidos-table-sortable' : '',\n isCurrentlySorted ? 'eidos-table-sorted' : '',\n `eidos-table-align-${alignment}`,\n pinnedClass,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <th\n ref={setNodeRef as React.LegacyRef<HTMLTableCellElement>}\n className={thClassName}\n style={{\n width: columnWidth,\n ...stickyStyle,\n ...(transformStr ? { transform: transformStr } : {}),\n transition: transition ?? undefined,\n opacity: isDragging ? 0.5 : 1,\n }}\n data-col-key={id}\n onClick={() => isSortable && onSortClick()}\n {...attributes}\n >\n {/* Grip - absolutely positioned in the left padding zone so it never\n displaces the column label or causes layout shift on hover. */}\n <span\n className=\"eidos-table-drag-handle\"\n {...listeners}\n onClick={(e) => e.stopPropagation()}\n title=\"Drag to reorder\"\n >\n <GripVertical size={12} />\n </span>\n <div className={`eidos-table-header-content eidos-table-align-${alignment}`}>\n <span className=\"eidos-table-header-label\">{column.label}</span>\n {isSortable && (\n <div className=\"eidos-table-sort-indicator\">\n {sortDirection === 'asc' && <ArrowUp size={14} />}\n {sortDirection === 'desc' && <ArrowDown size={14} />}\n {!sortDirection && <ChevronsUpDown size={14} />}\n </div>\n )}\n </div>\n </th>\n );\n}\n\n// ── Table ─────────────────────────────────────────────────────────────────────\n\nexport const Table = <T extends object>({\n data,\n columns,\n loading = false,\n emptyMessage = 'No data available',\n onRowClick,\n className,\n showFooter = false,\n totalItems,\n showPagination = false,\n pageSize = 25,\n pageSizeOptions = [10, 25, 50, 100],\n onSortChange,\n currentSort,\n filters = {},\n onFiltersChange,\n defaultFilters,\n showFilters = false,\n // Selection\n selectable = false,\n rowKey,\n selectedRows: controlledSelected,\n defaultSelectedRows = [],\n onSelectionChange,\n selectAllScope = 'all',\n onSelectAllMatching,\n bulkActions = [],\n // New features\n density = 'comfortable',\n showDensity = false,\n showColumnVisibility = false,\n showExport = false,\n draggableColumns = false,\n onColumnReorder,\n // Card view\n hasCardView = true,\n cardViewBreakpoint = 640,\n cardMinWidth = 280,\n}: TableProps<T>) => {\n // ── Column ordering (drag-reorder) ────────────────────────────────────────\n const [columnOrder, setColumnOrder] = useState<string[]>(() => columns.map((c) => String(c.key)));\n\n // Derived-state reset: when the set of column keys changes, reset the order.\n // Calling setState during render is the React-idiomatic way to do this.\n const columnKeysSignature = columns.map((c) => String(c.key)).join('\\0');\n const prevKeysRef = useRef(columnKeysSignature);\n if (prevKeysRef.current !== columnKeysSignature) {\n prevKeysRef.current = columnKeysSignature;\n setColumnOrder(columns.map((c) => String(c.key)));\n }\n\n const orderedColumns = useMemo(() => {\n const orderMap = new Map(columnOrder.map((key, idx) => [key, idx]));\n return [...columns].sort((a, b) => {\n const ai = orderMap.get(String(a.key)) ?? Infinity;\n const bi = orderMap.get(String(b.key)) ?? Infinity;\n return ai - bi;\n });\n }, [columns, columnOrder]);\n\n // ── Density (internal state when showDensity=true) ────────────────────────\n const [internalDensity, setInternalDensity] = useState<Density>(density as Density);\n // When showDensity is true the table owns density; otherwise respect the prop.\n const effectiveDensity: Density = showDensity ? internalDensity : (density as Density);\n\n // ── Column visibility ─────────────────────────────────────────────────────\n const [hiddenColumnKeys, setHiddenColumnKeys] = useState<Set<string>>(() => new Set<string>());\n\n const visibleColumns = useMemo(\n () => orderedColumns.filter((c) => !hiddenColumnKeys.has(String(c.key))),\n [orderedColumns, hiddenColumnKeys],\n );\n\n // ── Card view ─────────────────────────────────────────────────────────────\n // Measured off the table's own container width (not the viewport) via\n // ResizeObserver, so it responds correctly even when the table sits in a\n // narrow sidebar/split-pane on an otherwise wide screen. Starts `null`\n // (unmeasured) rather than 0, so the table is what renders for one frame on\n // mount instead of briefly flashing cards.\n const [containerWidth, setContainerWidth] = useState<number | null>(null);\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n // A callback ref (not `useRef` + a `useLayoutEffect`) so this fires whenever\n // the container node actually becomes available, not just when `hasCardView`\n // changes: the `loading` early-return below renders its own container div, so\n // a consumer whose `loading` starts `true` would otherwise measure nothing on\n // mount and never re-measure once the real container replaces it. Mirrors\n // DataGrid's `setContainerRef`, which has the same constraint.\n // Deliberately NOT gated on `hasCardView`: the same measurement also drives\n // `isCompactToolbar` below, which a table with `hasCardView={false}` still\n // needs - it has a toolbar to fit into a narrow container either way.\n const setContainerRef = useCallback((el: HTMLDivElement | null) => {\n resizeObserverRef.current?.disconnect();\n resizeObserverRef.current = null;\n\n if (!el) return;\n\n const observer = new ResizeObserver((entries) => {\n const width = entries[0]?.contentRect.width;\n if (width != null) setContainerWidth(width);\n });\n observer.observe(el);\n resizeObserverRef.current = observer;\n }, []);\n\n // Narrowest width the table can render at without overflowing - the sum of\n // every visible column's own minimum (see the constants above).\n const minTableWidth = useMemo(\n () =>\n visibleColumns.reduce(\n (total, column) =>\n total +\n (column.type === 'icon' || column.type === 'action'\n ? ICON_COLUMN_WIDTH_PX\n : MIN_DATA_COLUMN_WIDTH_PX),\n selectable ? CHECKBOX_COLUMN_WIDTH_PX : 0,\n ),\n [visibleColumns, selectable],\n );\n\n // Card view kicks in below the explicit `cardViewBreakpoint` OR once the\n // container is too narrow to fit the table at that minimum - the latter\n // means a wide/many-column table auto-switches without the consumer having\n // to hand-calculate a breakpoint for it.\n const isCardView =\n hasCardView &&\n containerWidth !== null &&\n (containerWidth < cardViewBreakpoint || containerWidth < minTableWidth);\n\n // Independent of card view on purpose: card view can also trigger on column\n // count in a container that's still plenty wide for labelled buttons, and a\n // `hasCardView={false}` table still needs its toolbar to fit.\n const isCompactToolbar = containerWidth !== null && containerWidth < COMPACT_TOOLBAR_WIDTH_PX;\n\n // Only the first matching column is honored (see TableColumnCommon.cardHeader\n // / cardSubheader).\n const cardHeaderColumn = useMemo(\n () => visibleColumns.find((c) => c.cardHeader),\n [visibleColumns],\n );\n const cardSubheaderColumn = useMemo(\n () => visibleColumns.find((c) => c.cardSubheader),\n [visibleColumns],\n );\n // `type: 'action'` is the column that exists to hold interactive row\n // controls (a Menu/button - see the <td>'s own stopPropagation below), so in\n // card view it moves to the card's top-right slot rather than rendering as a\n // labelled field. `type: 'icon'` deliberately does NOT: it's used for\n // genuine data glyphs (a status/avatar icon) just as often as for actions.\n const cardActionsColumn = useMemo(\n () => visibleColumns.find((c) => c.type === 'action'),\n [visibleColumns],\n );\n // Everything else renders as a label-above-value field, in column order.\n const cardFieldColumns = useMemo(\n () =>\n visibleColumns.filter(\n (c) => c !== cardHeaderColumn && c !== cardSubheaderColumn && c !== cardActionsColumn,\n ),\n [visibleColumns, cardHeaderColumn, cardSubheaderColumn, cardActionsColumn],\n );\n\n // ── Pinned / sticky columns ────────────────────────────────────────────────\n const theadRef = useRef<HTMLTableSectionElement>(null);\n const [pinnedOffsets, setPinnedOffsets] = useState<\n Map<string, { side: 'left' | 'right'; offset: number }>\n >(new Map());\n\n useLayoutEffect(() => {\n const hasPinned = visibleColumns.some((c) => c.pin);\n if (!hasPinned || !theadRef.current) {\n setPinnedOffsets(new Map());\n return;\n }\n\n const headerRow = theadRef.current.querySelector('tr');\n if (!headerRow) return;\n\n const cells = Array.from(headerRow.querySelectorAll<HTMLTableCellElement>('th[data-col-key]'));\n\n const newOffsets = new Map<string, { side: 'left' | 'right'; offset: number }>();\n\n // Left-pinned: scan left-to-right.\n // Checkbox (when selectable) counts as a left-pinned element.\n let leftAccum = 0;\n for (const cell of cells) {\n const key = cell.dataset.colKey!;\n if (key === '__checkbox__') {\n newOffsets.set(key, { side: 'left', offset: leftAccum });\n leftAccum += cell.offsetWidth;\n } else {\n const col = visibleColumns.find((c) => String(c.key) === key);\n if (col?.pin === 'left') {\n newOffsets.set(key, { side: 'left', offset: leftAccum });\n leftAccum += cell.offsetWidth;\n }\n }\n }\n\n // Right-pinned: scan right-to-left.\n let rightAccum = 0;\n for (let i = cells.length - 1; i >= 0; i--) {\n const cell = cells[i];\n const key = cell.dataset.colKey!;\n const col = visibleColumns.find((c) => String(c.key) === key);\n if (col?.pin === 'right') {\n newOffsets.set(key, { side: 'right', offset: rightAccum });\n rightAccum += cell.offsetWidth;\n }\n }\n\n setPinnedOffsets(newOffsets);\n }, [visibleColumns, selectable]);\n\n // ── Selection state (controlled / uncontrolled) ──────────────────────────\n const isControlledSelection = controlledSelected !== undefined;\n const [internalSelected, setInternalSelected] = useState<string[]>(defaultSelectedRows);\n const selectedSet = useMemo(\n () => new Set(isControlledSelection ? controlledSelected : internalSelected),\n [isControlledSelection, controlledSelected, internalSelected],\n );\n\n /** Stable string key for a row - uses `rowKey` prop, then \"id\", then index. */\n const getRowKey = (item: T, index: number): string => {\n if (rowKey) return String(item[rowKey]);\n if ('id' in item) return String(item.id);\n return String(index);\n };\n\n /** Every row currently in `data`, by key - the freshest copy of each row. */\n const rowsByKey = useMemo(() => {\n const map = new Map<string, T>();\n data.forEach((item, idx) => map.set(getRowKey(item, idx), item));\n return map;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [data, rowKey]);\n\n // Row objects for selected keys, kept across changes to `data`. Filtering\n // `data` alone silently handed `bulkActions` and `onSelectionChange` fewer\n // rows than the selection count claimed, whenever a selected row was no\n // longer in `data` - see `onSelectionChange`'s own docs. Always prefers the\n // copy in `data` over the cached one, so an edited row is never stale.\n const selectedRowCacheRef = useRef(new Map<string, T>());\n\n const rowsForKeys = (keys: string[]): T[] => {\n const cache = selectedRowCacheRef.current;\n return keys\n .map((key) => rowsByKey.get(key) ?? cache.get(key))\n .filter((row): row is T => row !== undefined);\n };\n\n // Prunes as well as fills: an entry only survives while its key is still\n // selected, so the cache can't grow without bound.\n useEffect(() => {\n const cache = selectedRowCacheRef.current;\n const next = new Map<string, T>();\n selectedSet.forEach((key) => {\n const row = rowsByKey.get(key) ?? cache.get(key);\n if (row) next.set(key, row);\n });\n selectedRowCacheRef.current = next;\n }, [rowsByKey, selectedSet]);\n\n const commitSelection = (keys: string[]) => {\n if (!isControlledSelection) setInternalSelected(keys);\n onSelectionChange?.(keys, rowsForKeys(keys));\n };\n\n const toggleRow = (key: string) => {\n const next = selectedSet.has(key)\n ? [...selectedSet].filter((k) => k !== key)\n : [...selectedSet, key];\n commitSelection(next);\n };\n\n // ── Pagination ────────────────────────────────────────────────────────────\n const [currentPage, setCurrentPage] = useState(1);\n const [currentPageSize, setCurrentPageSize] = useState(pageSize);\n\n const displayData = useMemo(() => {\n if (!showPagination) return data;\n const startIndex = (currentPage - 1) * currentPageSize;\n return data.slice(startIndex, startIndex + currentPageSize);\n }, [data, showPagination, currentPage, currentPageSize]);\n\n const totalPages = Math.ceil(data.length / currentPageSize);\n\n // ── Select-all (scope-aware) ──────────────────────────────────────────────\n // Defined after `displayData` because `'page'` scope is exactly that set.\n const selectAllKeys = useMemo(() => {\n if (selectAllScope === 'page') {\n const offset = showPagination ? (currentPage - 1) * currentPageSize : 0;\n return displayData.map((item, idx) => getRowKey(item, offset + idx));\n }\n return data.map((item, idx) => getRowKey(item, idx));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectAllScope, displayData, data, showPagination, currentPage, currentPageSize, rowKey]);\n\n const allSelected =\n selectAllKeys.length > 0 && selectAllKeys.every((key) => selectedSet.has(key));\n const someSelected = !allSelected && selectAllKeys.some((key) => selectedSet.has(key));\n\n // Adds or removes only the keys in scope, so a selection made on another\n // page (or outside `'page'` scope) is never silently dropped by toggling\n // the select-all control.\n const toggleAll = () => {\n const inScope = new Set(selectAllKeys);\n commitSelection(\n allSelected\n ? [...selectedSet].filter((key) => !inScope.has(key))\n : [...new Set([...selectedSet, ...selectAllKeys])],\n );\n };\n\n // Only reachable from the \"all N matching\" state below - the select-all\n // control is what clears an ordinary selection.\n const clearSelection = () => commitSelection([]);\n\n // ── \"Select all N matching\" (see `onSelectAllMatching`) ───────────────────\n // The table can only enumerate the keys it has been given, so selecting\n // everything behind a larger query has to come from the caller.\n const [isSelectingAllMatching, setIsSelectingAllMatching] = useState(false);\n\n const totalItemCount = totalItems ?? data.length;\n const holdsEveryRow = totalItemCount <= data.length;\n const hasSelectedAllMatching = !holdsEveryRow && selectedSet.size >= totalItemCount;\n // Offered once everything the table holds is selected, so the select-all\n // control has nothing left to give - but not once every matching row is\n // already selected, where it would be a no-op sitting next to \"Clear\n // selection\".\n const canSelectAllMatching =\n !!onSelectAllMatching && selectable && !holdsEveryRow && allSelected && !hasSelectedAllMatching;\n\n const selectAllMatching = async () => {\n if (!onSelectAllMatching) return;\n setIsSelectingAllMatching(true);\n try {\n // Replaces rather than merges: the caller is returning the full\n // matching set, so anything not in it is by definition not a match.\n commitSelection(await onSelectAllMatching());\n } catch (error) {\n devWarn(\n 'table-select-all-matching-failed',\n `Table: onSelectAllMatching() rejected, so the selection was left untouched. ${String(error)}`,\n );\n } finally {\n setIsSelectingAllMatching(false);\n }\n };\n\n // `'all'` can only ever select the rows the table holds. `totalItems` is the\n // caller telling us the full set is bigger than `data`, which means the\n // remaining keys are unknowable here - warn rather than quietly selecting a\n // subset and calling it \"all\".\n useEffect(() => {\n if (!selectable || selectAllScope !== 'all') return;\n if (totalItems === undefined || totalItems <= data.length) return;\n devWarn(\n `table-select-all-scope:${data.length}/${totalItems}`,\n `Table: selectAllScope=\"all\" can only select the ${data.length} row(s) in \\`data\\`, but ` +\n `\\`totalItems\\` is ${totalItems}. The keys of rows the table has never received cannot ` +\n 'be known here - pass the full dataset, or use selectAllScope=\"page\" to make the scope ' +\n 'explicit.',\n );\n }, [selectable, selectAllScope, totalItems, data.length]);\n\n const handleSort = (key: string) => {\n const newDirection =\n currentSort?.key === key && currentSort?.direction === 'asc' ? 'desc' : 'asc';\n // `key` came from a rendered column, so it is a field of `T` by\n // construction - the public callback is narrowed for the caller's benefit,\n // which this internal string can't prove on its own.\n onSortChange?.(key as RowKey<T>, newDirection);\n };\n\n const handlePageChange = (page: number) => setCurrentPage(page);\n const handlePageSizeChange = (newPageSize: number) => {\n setCurrentPageSize(newPageSize);\n setCurrentPage(1);\n };\n\n // ── Derived UI state ──────────────────────────────────────────────────────\n const hasSelection = selectedSet.size > 0;\n // In card view the toolbar carries the select-all checkbox (there's no\n // header row to hold it), so it has to be there before anything is\n // selected - unlike table mode, where it only appears with a selection.\n const showToolbar =\n (showFilters && !!onFiltersChange) ||\n showColumnVisibility ||\n showExport ||\n showDensity ||\n (selectable && (hasSelection || isCardView));\n\n const selectedItems = useMemo(\n () => rowsForKeys([...selectedSet]),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [rowsByKey, selectedSet],\n );\n\n // ── Cell values ───────────────────────────────────────────────────────────\n /**\n * Raw value for a column, resolving dotted keys (`'user.name'`) against\n * nested objects. Shared by the table cells, the cards and the CSV export so\n * all three read the same field for a given column.\n */\n const getCellValue = (item: T, column: TableColumn<T>): unknown =>\n typeof column.key === 'string' && column.key.includes('.')\n ? (column.key as string)\n .split('.')\n .reduce(\n (obj: unknown, k: string) => (obj as Record<string, unknown>)?.[k],\n item as unknown,\n )\n : item[column.key as keyof T];\n\n /** Rendered cell content - the column's own `render`, or the stringified value. */\n const renderCellContent = (item: T, column: TableColumn<T>): React.ReactNode => {\n const value = getCellValue(item, column);\n return column.render\n ? (column.render as TableCellRenderer<T>)(value, item)\n : String(value ?? '');\n };\n\n // ── CSV Export ────────────────────────────────────────────────────────────\n const getRawValue = (item: T, column: TableColumn<T>): string =>\n String(getCellValue(item, column) ?? '');\n\n const handleExportCsv = () => {\n const headers = visibleColumns.map((c) => escapeCsvValue(c.label)).join(',');\n const rows = data.map((item) =>\n visibleColumns.map((col) => escapeCsvValue(getRawValue(item, col))).join(','),\n );\n const csv = [headers, ...rows].join('\\n');\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = 'export.csv';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n };\n\n // ── DnD setup ─────────────────────────────────────────────────────────────\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n );\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event;\n if (!over || active.id === over.id) return;\n\n const activeId = String(active.id);\n const overId = String(over.id);\n const oldIndex = columnOrder.indexOf(activeId);\n const newIndex = columnOrder.indexOf(overId);\n if (oldIndex === -1 || newIndex === -1) return;\n\n const newOrder = arrayMove(columnOrder, oldIndex, newIndex);\n setColumnOrder(newOrder);\n\n if (onColumnReorder) {\n const orderMap = new Map(newOrder.map((key, idx) => [key, idx]));\n const reordered = [...columns].sort((a, b) => {\n const ai = orderMap.get(String(a.key)) ?? Infinity;\n const bi = orderMap.get(String(b.key)) ?? Infinity;\n return ai - bi;\n });\n onColumnReorder(reordered);\n }\n };\n\n // ── Helpers ───────────────────────────────────────────────────────────────\n\n /** Returns sticky style + className for body <td> cells (zIndex: 1). */\n const getCellPinnedProps = (\n colKey: string,\n ): { style: React.CSSProperties; className: string } => {\n const pinInfo = pinnedOffsets.get(colKey);\n if (!pinInfo) return { style: {}, className: '' };\n return {\n style: {\n position: 'sticky',\n [pinInfo.side]: pinInfo.offset,\n zIndex: 1,\n },\n className:\n pinInfo.side === 'left'\n ? 'eidos-table-cell--pinned-left'\n : 'eidos-table-cell--pinned-right',\n };\n };\n\n /** Returns sticky style + className for header <th> cells (zIndex: 3). */\n const getHeaderPinnedProps = (\n colKey: string,\n ): { style: React.CSSProperties; className: string } => {\n const pinInfo = pinnedOffsets.get(colKey);\n if (!pinInfo) return { style: {}, className: '' };\n return {\n style: {\n position: 'sticky',\n [pinInfo.side]: pinInfo.offset,\n zIndex: 3,\n },\n className:\n pinInfo.side === 'left'\n ? 'eidos-table-header-cell--pinned-left'\n : 'eidos-table-header-cell--pinned-right',\n };\n };\n\n // ── Density class ─────────────────────────────────────────────────────────\n const densityClass = effectiveDensity !== 'comfortable' ? `eidos-table--${effectiveDensity}` : '';\n\n // Always include the current page size in the options so the Select is never\n // blank - matches DataGrid, which does the same with the same defaults.\n const effectivePageSizeOptions = useMemo(\n () =>\n pageSizeOptions.includes(currentPageSize)\n ? pageSizeOptions\n : [...pageSizeOptions, currentPageSize].sort((a, b) => a - b),\n [pageSizeOptions, currentPageSize],\n );\n\n // ── Loading ───────────────────────────────────────────────────────────────\n // Keeps the container ref attached: without it a table that mounts with\n // `loading` already true would never get measured (see `setContainerRef`).\n if (loading) {\n return (\n <div ref={setContainerRef} className={`eidos-table-container ${className || ''}`}>\n <div className=\"eidos-table-loading\">\n <Spinner size=\"md\" />\n <p>Loading...</p>\n </div>\n </div>\n );\n }\n\n // ── Density panel (Dropdown content) ──────────────────────────────────────\n const densityPanel = (\n <div className=\"eidos-table-menu-panel\">\n {DENSITY_OPTIONS.map((option) => (\n <button\n key={option.value}\n className={[\n 'eidos-table-menu-item',\n effectiveDensity === option.value ? 'eidos-table-menu-item--active' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => setInternalDensity(option.value)}\n >\n <span className=\"eidos-table-menu-item-check\">\n {effectiveDensity === option.value && <Check size={14} />}\n </span>\n <span>{option.label}</span>\n </button>\n ))}\n </div>\n );\n\n // ── Column visibility panel (Dropdown content) ────────────────────────────\n const columnVisibilityPanel = (\n <div className=\"eidos-table-menu-panel\">\n {/* Use orderedColumns so list order mirrors current column order */}\n {orderedColumns.map((col) => {\n const key = String(col.key);\n const isVisible = !hiddenColumnKeys.has(key);\n const isLastVisible = visibleColumns.length === 1 && isVisible;\n return (\n <button\n key={key}\n className={['eidos-table-menu-item', isVisible ? 'eidos-table-menu-item--active' : '']\n .filter(Boolean)\n .join(' ')}\n disabled={isLastVisible}\n onClick={() => {\n setHiddenColumnKeys((prev) => {\n const next = new Set(prev);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n }}\n >\n <Checkbox\n checked={isVisible}\n disabled={isLastVisible}\n size=\"sm\"\n onChange={() => {\n /* click handled by parent button */\n }}\n />\n <span>{col.label}</span>\n </button>\n );\n })}\n </div>\n );\n\n // ── SortableContext items: visible column keys only ───────────────────────\n const sortableItems = visibleColumns.map((c) => String(c.key));\n\n // ── Empty state ───────────────────────────────────────────────────────────\n // Shared by table and card view so both read identically - filtered-to-empty\n // offers a way out, genuinely-empty just explains itself.\n const emptyStateNode =\n Object.keys(filters).length > 0 ? (\n <EmptyState\n icon={<SearchX />}\n title=\"No results found\"\n description=\"Try adjusting your filters or search terms.\"\n action={\n onFiltersChange ? (\n <Button\n size=\"sm\"\n variant=\"outlined\"\n color=\"primary\"\n onClick={() => onFiltersChange({})}\n >\n Clear filters\n </Button>\n ) : undefined\n }\n size=\"sm\"\n />\n ) : (\n <EmptyState\n icon={<FolderOpen />}\n title={emptyMessage}\n description=\"There are no records to display.\"\n size=\"sm\"\n />\n );\n\n // A card with no checkbox, no heading and no actions column has nothing to\n // put in its top bar - rendering it anyway leaves a dead strip and a divider\n // above the first field.\n const hasCardToolbar =\n selectable || !!cardHeaderColumn || !!cardSubheaderColumn || !!cardActionsColumn;\n\n // ── Card view ─────────────────────────────────────────────────────────────\n // Replaces the <table> below the breakpoint - see `isCardView`. Only the row\n // rendering changes: toolbar, filters, sorting, selection and pagination are\n // all rendered by the shared markup around it, exactly as in table mode.\n const cardsContent = (\n <div\n className=\"eidos-table-cards\"\n style={{ '--eidos-table-card-min-width': `${cardMinWidth}px` } as React.CSSProperties}\n >\n {displayData.length > 0 ? (\n displayData.map((item, rowIndex) => {\n const globalIndex = showPagination\n ? (currentPage - 1) * currentPageSize + rowIndex\n : rowIndex;\n const key = getRowKey(item, globalIndex);\n const isSelected = selectedSet.has(key);\n\n return (\n <div\n key={key}\n className={[\n 'eidos-table-card',\n onRowClick ? 'eidos-table-card--clickable' : '',\n isSelected ? 'eidos-table-card--selected' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => onRowClick?.(item)}\n >\n {/* stopPropagation so the checkbox and the row-actions control\n never bubble into `onRowClick` - mirrors the checkbox /\n `type: 'action'` <td>s' own handlers in table mode. */}\n {hasCardToolbar && (\n <div className=\"eidos-table-card-toolbar\" onClick={(e) => e.stopPropagation()}>\n <div className=\"eidos-table-card-toolbar-left\">\n {selectable && (\n <Checkbox\n size=\"sm\"\n checked={isSelected}\n onChange={() => toggleRow(key)}\n aria-label={`Select row ${globalIndex + 1}`}\n />\n )}\n </div>\n\n {/* Always rendered (even empty) so it occupies the toolbar's\n middle grid column - omitting the element would shift the\n right zone into this column instead of the third one. */}\n <div className=\"eidos-table-card-heading\">\n {cardHeaderColumn && (\n <span className=\"eidos-table-card-heading-title\">\n {renderCellContent(item, cardHeaderColumn)}\n </span>\n )}\n {cardSubheaderColumn && (\n <span className=\"eidos-table-card-heading-subtitle\">\n {renderCellContent(item, cardSubheaderColumn)}\n </span>\n )}\n </div>\n\n <div className=\"eidos-table-card-toolbar-right\">\n {cardActionsColumn && renderCellContent(item, cardActionsColumn)}\n </div>\n </div>\n )}\n\n <div className=\"eidos-table-card-fields\">\n {cardFieldColumns.map((column) => (\n <div key={String(column.key)} className=\"eidos-table-card-field\">\n {/* An icon column's label is typically empty - skip the\n label element entirely rather than leaving a gap. */}\n {column.label && (\n <span className=\"eidos-table-card-field-label\">{column.label}</span>\n )}\n <span className=\"eidos-table-card-field-value\">\n {renderCellContent(item, column)}\n </span>\n </div>\n ))}\n </div>\n </div>\n );\n })\n ) : (\n <div className=\"eidos-table-card-empty\">{emptyStateNode}</div>\n )}\n </div>\n );\n\n // ── Main JSX ──────────────────────────────────────────────────────────────\n const tableContent = (\n <div\n ref={setContainerRef}\n className={['eidos-table-container', densityClass, className].filter(Boolean).join(' ')}\n >\n {/* ── Toolbar ───────────────────────────────────────────────────────── */}\n {showToolbar && (\n <div className=\"eidos-table-toolbar\">\n {/* Left - bulk actions / selection info */}\n <div className=\"eidos-table-toolbar-left\">\n {/* Card view's stand-in for the header checkbox, which doesn't\n exist without a header row. Also the way out of selection\n mode there: clicking it while checked clears the selection,\n exactly as the header checkbox does in table mode. */}\n {selectable && isCardView && (\n <Checkbox\n size=\"sm\"\n checked={allSelected}\n indeterminate={someSelected}\n onChange={toggleAll}\n // Labelled even in the compact toolbar, unlike the buttons\n // beside it: those keep a recognisable icon, whereas a bare\n // checkbox floating in a toolbar says nothing about what it\n // selects - and a tooltip is no help on touch.\n label=\"Select all\"\n aria-label=\"Select all rows\"\n />\n )}\n\n {selectable && hasSelection && (\n <>\n <span className=\"eidos-table-selection-count\">{selectedSet.size} selected</span>\n\n {/* The select-all control can only reach the rows in `data`,\n so reaching past them is an explicit action - and undoing\n it has to be explicit too: with more rows selected than\n that control's own scope, toggling it would strip the\n in-scope keys and leave the rest selected, which reads as\n a no-op. */}\n {canSelectAllMatching && (\n <Button\n variant=\"text\"\n size=\"sm\"\n loading={isSelectingAllMatching}\n onClick={() => void selectAllMatching()}\n >\n {`Select all ${totalItemCount}`}\n </Button>\n )}\n\n {hasSelectedAllMatching && (\n <Button variant=\"text\" size=\"sm\" color=\"secondary\" onClick={clearSelection}>\n Clear selection\n </Button>\n )}\n\n {bulkActions.length > 0 && (\n <div className=\"eidos-table-bulk-actions\">\n {bulkActions.map((action) => {\n const isDisabled =\n typeof action.disabled === 'function'\n ? action.disabled(selectedItems)\n : (action.disabled ?? false);\n\n if (action.type === 'split-button') {\n return (\n <SplitButton\n key={action.id}\n size=\"sm\"\n variant={action.variant ?? 'outlined'}\n color={action.color ?? 'secondary'}\n preIcon={action.icon}\n disabled={isDisabled}\n label={action.label}\n onClick={() => action.onClick(selectedItems)}\n options={action.options.map((option) => ({\n id: option.id,\n label: option.label,\n icon: option.icon,\n disabled: option.disabled,\n onClick: () => option.onClick(selectedItems),\n }))}\n />\n );\n }\n\n return action.label ? (\n <Button\n key={action.id}\n size=\"sm\"\n variant={action.variant ?? 'outlined'}\n color={action.color ?? 'secondary'}\n preIcon={action.icon}\n posIcon={action.posIcon}\n disabled={isDisabled}\n onClick={() => action.onClick(selectedItems)}\n >\n {action.label}\n </Button>\n ) : action.icon ? (\n <Button\n key={action.id}\n size=\"sm\"\n variant={action.variant ?? 'outlined'}\n color={action.color ?? 'secondary'}\n icon={action.icon}\n disabled={isDisabled}\n onClick={() => action.onClick(selectedItems)}\n />\n ) : null;\n })}\n </div>\n )}\n </>\n )}\n </div>\n\n {/* Right - density, column visibility, export, filter */}\n <div className=\"eidos-table-toolbar-right\">\n {/* Icon-only below `COMPACT_TOOLBAR_WIDTH_PX`, with the label moved\n into a tooltip so the control stays identifiable. */}\n {showDensity && (\n <Dropdown\n placement=\"bottom\"\n align=\"end\"\n autoWidth={false}\n trigger={\n isCompactToolbar ? (\n <Button variant=\"text\" size=\"sm\" icon={AlignJustify} tooltip=\"Density\" />\n ) : (\n <Button variant=\"text\" size=\"sm\" preIcon={AlignJustify}>\n Density\n </Button>\n )\n }\n content={densityPanel}\n />\n )}\n\n {showColumnVisibility && (\n <Dropdown\n placement=\"bottom\"\n align=\"end\"\n autoWidth={false}\n trigger={\n isCompactToolbar ? (\n <Button variant=\"text\" size=\"sm\" icon={Columns3} tooltip=\"Columns\" />\n ) : (\n <Button variant=\"text\" size=\"sm\" preIcon={Columns3}>\n Columns\n </Button>\n )\n }\n content={columnVisibilityPanel}\n />\n )}\n\n {showExport && (\n <Button\n variant=\"text\"\n size=\"sm\"\n icon={Download}\n onClick={handleExportCsv}\n tooltip=\"Export CSV\"\n />\n )}\n\n {showFilters && onFiltersChange && (\n <TableFiltersDropdown\n columns={columns}\n filters={filters}\n onFiltersChange={onFiltersChange}\n defaultFilters={defaultFilters}\n />\n )}\n </div>\n </div>\n )}\n\n {/* ── Rows: cards below the breakpoint, otherwise the table ─────────── */}\n {isCardView ? (\n cardsContent\n ) : (\n /* Table wrapped for horizontal scroll */\n <div className=\"eidos-table-scroll\">\n <table\n className={[\n 'eidos-table',\n densityClass,\n draggableColumns ? 'eidos-table--draggable-columns' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <thead ref={theadRef}>\n <tr>\n {selectable && (\n <th\n className={[\n 'eidos-table-header-cell',\n 'eidos-table-checkbox-cell',\n getHeaderPinnedProps('__checkbox__').className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={getHeaderPinnedProps('__checkbox__').style}\n data-col-key=\"__checkbox__\"\n >\n <Checkbox\n size=\"sm\"\n checked={allSelected}\n indeterminate={someSelected}\n onChange={toggleAll}\n aria-label=\"Select all rows\"\n />\n </th>\n )}\n\n {/* ── Headers: draggable or plain ──────────────────────────── */}\n {draggableColumns\n ? visibleColumns.map((column) => {\n const colKey = String(column.key);\n const columnType = column.type || 'data';\n // `icon`/`action` columns get their fixed width from\n // their own class in Table.scss, so `column.width` is\n // the only thing that needs to reach the element - and\n // it now actually applies to those columns instead of\n // being overwritten by a hardcoded value here.\n const columnWidth = column.width;\n const isSortable = !!column.sortable;\n const isCurrentlySorted = currentSort?.key === colKey;\n const sortDirection = isCurrentlySorted\n ? (currentSort!.direction as 'asc' | 'desc')\n : null;\n const alignment = column.align || 'left';\n const { style: pinnedStyle, className: pinnedClass } =\n getHeaderPinnedProps(colKey);\n\n return (\n <SortableColumnHeader\n key={colKey}\n id={colKey}\n column={column}\n isSortable={isSortable}\n isCurrentlySorted={!!isCurrentlySorted}\n sortDirection={sortDirection}\n alignment={alignment}\n columnType={columnType}\n columnWidth={columnWidth}\n pinnedClass={pinnedClass}\n stickyStyle={pinnedStyle}\n onSortClick={() => handleSort(colKey)}\n />\n );\n })\n : visibleColumns.map((column, index) => {\n const colKey = String(column.key);\n const columnType = column.type || 'data';\n // `icon`/`action` columns get their fixed width from\n // their own class in Table.scss, so `column.width` is\n // the only thing that needs to reach the element - and\n // it now actually applies to those columns instead of\n // being overwritten by a hardcoded value here.\n const columnWidth = column.width;\n const isSortable = column.sortable;\n const isCurrentlySorted = currentSort?.key === colKey;\n const sortDirection = isCurrentlySorted ? currentSort!.direction : null;\n const alignment = column.align || 'left';\n const alignmentClass = `eidos-table-align-${alignment}`;\n const { style: pinnedStyle, className: pinnedClass } =\n getHeaderPinnedProps(colKey);\n\n return (\n <th\n key={index}\n className={[\n 'eidos-table-header-cell',\n `eidos-table-header-cell-${columnType}`,\n isSortable ? 'eidos-table-sortable' : '',\n isCurrentlySorted ? 'eidos-table-sorted' : '',\n alignmentClass,\n pinnedClass,\n ]\n .filter(Boolean)\n .join(' ')}\n style={{ width: columnWidth, ...pinnedStyle }}\n data-col-key={colKey}\n onClick={() => isSortable && handleSort(colKey)}\n >\n <div className={`eidos-table-header-content ${alignmentClass}`}>\n <span>{column.label}</span>\n {isSortable && (\n <div className=\"eidos-table-sort-indicator\">\n {sortDirection === 'asc' && <ArrowUp size={14} />}\n {sortDirection === 'desc' && <ArrowDown size={14} />}\n {!sortDirection && <ChevronsUpDown size={14} />}\n </div>\n )}\n </div>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {displayData.length > 0 ? (\n displayData.map((item, rowIndex) => {\n const globalIndex = showPagination\n ? (currentPage - 1) * currentPageSize + rowIndex\n : rowIndex;\n const key = getRowKey(item, globalIndex);\n const isSelected = selectedSet.has(key);\n\n return (\n <tr\n key={key}\n className={[\n 'eidos-table-row',\n onRowClick ? 'eidos-table-clickable' : '',\n isSelected ? 'eidos-table-row--selected' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => onRowClick?.(item)}\n >\n {selectable && (\n <td\n className={[\n 'eidos-table-cell',\n 'eidos-table-checkbox-cell',\n getCellPinnedProps('__checkbox__').className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={getCellPinnedProps('__checkbox__').style}\n onClick={(e) => {\n e.stopPropagation();\n toggleRow(key);\n }}\n >\n {/* Wrap in a span so Checkbox click-events don't\n bubble to the <td> and cause a double-toggle.\n The <td> onClick handles toggling when the user\n clicks the cell margin outside the checkbox. */}\n <span onClick={(e) => e.stopPropagation()}>\n <Checkbox\n size=\"sm\"\n checked={isSelected}\n onChange={() => toggleRow(key)}\n aria-label={`Select row ${globalIndex + 1}`}\n />\n </span>\n </td>\n )}\n {visibleColumns.map((column, colIndex) => {\n const colKey = String(column.key);\n const columnType = column.type || 'data';\n // Fixed widths for `icon`/`action` come from their\n // own class in Table.scss - see the header above.\n const columnWidth = column.width;\n const alignment = column.align || 'left';\n const alignmentClass = `eidos-table-align-${alignment}`;\n const { style: pinnedStyle, className: pinnedClass } =\n getCellPinnedProps(colKey);\n\n return (\n <td\n key={colIndex}\n className={[\n 'eidos-table-cell',\n `eidos-table-cell-${columnType}`,\n alignmentClass,\n pinnedClass,\n ]\n .filter(Boolean)\n .join(' ')}\n style={{ width: columnWidth, ...pinnedStyle }}\n // `type: 'action'` cells exist specifically to hold\n // interactive controls (a row-actions Menu/button,\n // typically) - without this, clicking them bubbles\n // straight into `onRowClick` on the <tr> below,\n // e.g. opening a details drawer at the same time as\n // (or instead of) the action itself. Mirrors the\n // selectable checkbox cell's own stopPropagation\n // above, for the same reason.\n onClick={\n columnType === 'action' ? (e) => e.stopPropagation() : undefined\n }\n >\n {renderCellContent(item, column)}\n </td>\n );\n })}\n </tr>\n );\n })\n ) : (\n <tr className=\"eidos-table-empty-row\">\n <td\n colSpan={selectable ? visibleColumns.length + 1 : visibleColumns.length}\n className=\"eidos-table-cell eidos-table-empty-cell\"\n >\n {emptyStateNode}\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n )}\n\n {/* ── Footer / Pagination ───────────────────────────────────────────── */}\n {showFooter && (\n <div className=\"eidos-table-footer\">\n <div className=\"eidos-table-footer-content\">\n {showPagination && data.length > 0 ? (\n <Pagination\n page={currentPage}\n totalPages={totalPages}\n onChange={handlePageChange}\n totalItems={totalItems ?? data.length}\n pageSize={currentPageSize}\n onPageSizeChange={handlePageSizeChange}\n pageSizeOptions={effectivePageSizeOptions}\n size=\"sm\"\n />\n ) : (\n <span className=\"eidos-table-results-info\">\n Showing {data.length} of {totalItems ?? data.length} results\n </span>\n )}\n </div>\n </div>\n )}\n </div>\n );\n\n // ── Wrap with DnD context when draggableColumns=true ─────────────────────\n if (draggableColumns) {\n return (\n <DndContext sensors={sensors} onDragEnd={handleDragEnd}>\n <SortableContext items={sortableItems} strategy={horizontalListSortingStrategy}>\n {tableContent}\n </SortableContext>\n </DndContext>\n );\n }\n\n return tableContent;\n};\n"],"mappings":"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","names":[]}
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
} from "./chunk-LYH3EKKQ.js";
|
|
7
7
|
import {
|
|
8
8
|
renderIcon
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-KBG77JHC.js";
|
|
10
10
|
import {
|
|
11
11
|
Tooltip
|
|
12
12
|
} from "./chunk-YV57RSPD.js";
|
|
@@ -122,4 +122,4 @@ export {
|
|
|
122
122
|
MenuPanel,
|
|
123
123
|
Menu
|
|
124
124
|
};
|
|
125
|
-
//# sourceMappingURL=chunk-
|
|
125
|
+
//# sourceMappingURL=chunk-ZHFPV43D.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunk5BX4Q76Dcjs = require('../chunk-5BX4Q76D.cjs');
|
|
4
4
|
require('../chunk-FRUOA2QU.cjs');
|
|
5
5
|
require('../chunk-DZUJEN5N.cjs');
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
exports.ColorPicker =
|
|
8
|
+
exports.ColorPicker = _chunk5BX4Q76Dcjs.ColorPicker;
|
|
9
9
|
//# sourceMappingURL=index.cjs.map
|
package/dist/combobox/index.cjs
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('../chunk-
|
|
3
|
+
var _chunkWUBQJVB7cjs = require('../chunk-WUBQJVB7.cjs');
|
|
4
|
+
require('../chunk-5VM2256W.cjs');
|
|
5
5
|
require('../chunk-FRUOA2QU.cjs');
|
|
6
|
-
require('../chunk-
|
|
6
|
+
require('../chunk-GEHL4LKK.cjs');
|
|
7
7
|
require('../chunk-Z5U4NJTW.cjs');
|
|
8
8
|
require('../chunk-DZUJEN5N.cjs');
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
exports.Combobox =
|
|
11
|
+
exports.Combobox = _chunkWUBQJVB7cjs.Combobox;
|
|
12
12
|
//# sourceMappingURL=index.cjs.map
|
package/dist/combobox/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Combobox
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
3
|
+
} from "../chunk-TEJIPPZR.js";
|
|
4
|
+
import "../chunk-VHMOKXUT.js";
|
|
5
5
|
import "../chunk-4BKTBV2I.js";
|
|
6
|
-
import "../chunk-
|
|
6
|
+
import "../chunk-KBG77JHC.js";
|
|
7
7
|
import "../chunk-YV57RSPD.js";
|
|
8
8
|
import "../chunk-5WRI5ZAA.js";
|
|
9
9
|
export {
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('../chunk-
|
|
3
|
+
var _chunkLFWPQYWXcjs = require('../chunk-LFWPQYWX.cjs');
|
|
4
|
+
require('../chunk-DAXZRNNO.cjs');
|
|
5
5
|
require('../chunk-FRUOA2QU.cjs');
|
|
6
6
|
require('../chunk-KVIL4EP4.cjs');
|
|
7
|
-
require('../chunk-
|
|
7
|
+
require('../chunk-GEHL4LKK.cjs');
|
|
8
8
|
require('../chunk-Z5U4NJTW.cjs');
|
|
9
9
|
require('../chunk-DZUJEN5N.cjs');
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
exports.ContextMenu =
|
|
12
|
+
exports.ContextMenu = _chunkLFWPQYWXcjs.ContextMenu;
|
|
13
13
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ContextMenu
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
3
|
+
} from "../chunk-Y53HCLGW.js";
|
|
4
|
+
import "../chunk-ZHFPV43D.js";
|
|
5
5
|
import "../chunk-4BKTBV2I.js";
|
|
6
6
|
import "../chunk-LYH3EKKQ.js";
|
|
7
|
-
import "../chunk-
|
|
7
|
+
import "../chunk-KBG77JHC.js";
|
|
8
8
|
import "../chunk-YV57RSPD.js";
|
|
9
9
|
import "../chunk-5WRI5ZAA.js";
|
|
10
10
|
export {
|
package/dist/data-grid/index.cjs
CHANGED
|
@@ -1,31 +1,31 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('../chunk-
|
|
3
|
+
var _chunkSKTDGCWJcjs = require('../chunk-SKTDGCWJ.cjs');
|
|
4
|
+
require('../chunk-LIFUHQH5.cjs');
|
|
5
5
|
require('../chunk-TROYIUDH.cjs');
|
|
6
|
-
require('../chunk-
|
|
7
|
-
require('../chunk-
|
|
8
|
-
require('../chunk-
|
|
6
|
+
require('../chunk-SKEWTQJ7.cjs');
|
|
7
|
+
require('../chunk-AXBYJ2OY.cjs');
|
|
8
|
+
require('../chunk-AAA6TR5I.cjs');
|
|
9
9
|
require('../chunk-SJDTFR3I.cjs');
|
|
10
10
|
require('../chunk-I44YNYI6.cjs');
|
|
11
|
-
require('../chunk-
|
|
12
|
-
require('../chunk-
|
|
11
|
+
require('../chunk-6HUHH6Y4.cjs');
|
|
12
|
+
require('../chunk-KJZUYC4X.cjs');
|
|
13
13
|
require('../chunk-XJAXKENE.cjs');
|
|
14
14
|
require('../chunk-KV3V2CPH.cjs');
|
|
15
15
|
require('../chunk-IJ4DXG7D.cjs');
|
|
16
|
-
require('../chunk-
|
|
17
|
-
require('../chunk-
|
|
18
|
-
require('../chunk-
|
|
16
|
+
require('../chunk-WUBQJVB7.cjs');
|
|
17
|
+
require('../chunk-5VM2256W.cjs');
|
|
18
|
+
require('../chunk-DAXZRNNO.cjs');
|
|
19
19
|
require('../chunk-FRUOA2QU.cjs');
|
|
20
20
|
require('../chunk-KVIL4EP4.cjs');
|
|
21
21
|
require('../chunk-3ETWFS2N.cjs');
|
|
22
22
|
require('../chunk-EACNRR3C.cjs');
|
|
23
|
-
require('../chunk-
|
|
23
|
+
require('../chunk-APK5OQRV.cjs');
|
|
24
24
|
require('../chunk-I6UOIS4J.cjs');
|
|
25
|
-
require('../chunk-
|
|
25
|
+
require('../chunk-GEHL4LKK.cjs');
|
|
26
26
|
require('../chunk-Z5U4NJTW.cjs');
|
|
27
27
|
require('../chunk-DZUJEN5N.cjs');
|
|
28
28
|
|
|
29
29
|
|
|
30
|
-
exports.DataGrid =
|
|
30
|
+
exports.DataGrid = _chunkSKTDGCWJcjs.DataGrid;
|
|
31
31
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React__default from 'react';
|
|
2
2
|
import { I as IconType } from '../renderIcon-C2lEMMzb.cjs';
|
|
3
|
-
import { R as RowKey, e as TableFilters, B as BulkAction } from '../Table.types-
|
|
4
|
-
export { a as BulkActionButton, b as BulkActionSplitButton, c as BulkActionSplitOption } from '../Table.types-
|
|
3
|
+
import { R as RowKey, e as TableFilters, B as BulkAction } from '../Table.types-CPj-udMc.cjs';
|
|
4
|
+
export { a as BulkActionButton, b as BulkActionSplitButton, c as BulkActionSplitOption } from '../Table.types-CPj-udMc.cjs';
|
|
5
5
|
import { C as ComboboxOption } from '../Combobox.types-B7ozlnA9.cjs';
|
|
6
6
|
import { b as MenuItemType } from '../Menu.types-DwcuCZM7.cjs';
|
|
7
7
|
import { S as SelectOption } from '../Select.types-CAkT2ACt.cjs';
|
|
@@ -324,7 +324,53 @@ interface DataGridProps<T extends object = Record<string, unknown>> {
|
|
|
324
324
|
/** Controlled selected row keys. */
|
|
325
325
|
selectedRows?: string[];
|
|
326
326
|
defaultSelectedRows?: string[];
|
|
327
|
+
/**
|
|
328
|
+
* Fires with every selected key, plus the row object for each of those keys.
|
|
329
|
+
*
|
|
330
|
+
* `selectedKeys` is authoritative; `selectedRows` is best-effort. The row
|
|
331
|
+
* for each selected key is cached, so a row selected on a previous page
|
|
332
|
+
* still comes back after `data` has moved on (which is what makes selection
|
|
333
|
+
* usable with server-side pagination) - but a key that was selected before
|
|
334
|
+
* the grid ever saw its row (seeded via `defaultSelectedRows`, say) has no
|
|
335
|
+
* row to hand back.
|
|
336
|
+
*/
|
|
327
337
|
onSelectionChange?: (selectedKeys: string[], selectedRows: T[]) => void;
|
|
338
|
+
/**
|
|
339
|
+
* What the select-all control acts on - the header checkbox in table mode,
|
|
340
|
+
* or the toolbar checkbox in card view (where there is no header row):
|
|
341
|
+
*
|
|
342
|
+
* - `'all'` - every row in `data`, across pages.
|
|
343
|
+
* - `'page'` - only the rows currently rendered.
|
|
344
|
+
*
|
|
345
|
+
* Either way it only ever adds to or removes from the rows in its own
|
|
346
|
+
* scope, so a selection made on another page survives.
|
|
347
|
+
*
|
|
348
|
+
* `'all'` can only reach the rows the grid actually holds. Under
|
|
349
|
+
* server-side pagination (`onPageChange` + `totalRows`) that is a single
|
|
350
|
+
* page: the grid cannot know the keys of rows it has never received, so
|
|
351
|
+
* "all" means "all 20 loaded", not "all 1000 matching", and it says so with
|
|
352
|
+
* a dev-only warning. Matches `Table.selectAllScope`.
|
|
353
|
+
*
|
|
354
|
+
* @default 'all'
|
|
355
|
+
*/
|
|
356
|
+
selectAllScope?: 'all' | 'page';
|
|
357
|
+
/**
|
|
358
|
+
* Resolves the keys of **every** row matching the current query - the rows
|
|
359
|
+
* the grid cannot see, not just the loaded page. Supplying it adds a
|
|
360
|
+
* "Select all N" action to the toolbar once everything the grid does hold is
|
|
361
|
+
* selected, which is the only way to express "all 1000" when the grid only
|
|
362
|
+
* ever receives 20 of them.
|
|
363
|
+
*
|
|
364
|
+
* Called with no arguments and may be async (the action shows a loading
|
|
365
|
+
* state while it resolves); whatever it returns replaces the selection. It
|
|
366
|
+
* is up to you to apply the current filters/sort when resolving - the grid
|
|
367
|
+
* does not pass them, because in server-side mode you already own that
|
|
368
|
+
* query.
|
|
369
|
+
*
|
|
370
|
+
* Only rendered when the grid can tell it is holding a subset, i.e. when
|
|
371
|
+
* `totalRows` exceeds the number of loaded rows.
|
|
372
|
+
*/
|
|
373
|
+
onSelectAllMatching?: () => string[] | Promise<string[]>;
|
|
328
374
|
bulkActions?: BulkAction<T>[];
|
|
329
375
|
/**
|
|
330
376
|
* Renders a chevron column (table mode) / toolbar toggle (card mode) that
|
|
@@ -389,7 +435,7 @@ type EditingCell<T extends object = Record<string, unknown>> = {
|
|
|
389
435
|
colKey: RowKey<T>;
|
|
390
436
|
} | null;
|
|
391
437
|
|
|
392
|
-
declare function DataGridInner<T extends object>({ columns: columnsProp, data, rowKey, onChange, onRowAdd, editable, loading, emptyText, className, stickyHeader, maxHeight, showRowNumbers, draggableRows, onRowReorder, currentSort, onSortChange, showFilters, filterConfig, filters, onFiltersChange, quickFilters, showPagination, pageSize, pageSizeOptions, totalRows: totalRowsProp, onPageChange, selectable, selectedRows: controlledSelectedRows, defaultSelectedRows, onSelectionChange, bulkActions, expandable, renderExpandedContent, isRowExpandable, expandMultiple, expandedRows: controlledExpandedRows, defaultExpandedRows, onExpandedRowsChange, density, showDensity, hasCardView, cardViewBreakpoint, cardMinWidth, }: DataGridProps<T>): React__default.ReactElement;
|
|
438
|
+
declare function DataGridInner<T extends object>({ columns: columnsProp, data, rowKey, onChange, onRowAdd, editable, loading, emptyText, className, stickyHeader, maxHeight, showRowNumbers, draggableRows, onRowReorder, currentSort, onSortChange, showFilters, filterConfig, filters, onFiltersChange, quickFilters, showPagination, pageSize, pageSizeOptions, totalRows: totalRowsProp, onPageChange, selectable, selectedRows: controlledSelectedRows, defaultSelectedRows, onSelectionChange, selectAllScope, onSelectAllMatching, bulkActions, expandable, renderExpandedContent, isRowExpandable, expandMultiple, expandedRows: controlledExpandedRows, defaultExpandedRows, onExpandedRowsChange, density, showDensity, hasCardView, cardViewBreakpoint, cardMinWidth, }: DataGridProps<T>): React__default.ReactElement;
|
|
393
439
|
declare const DataGrid: typeof DataGridInner & {
|
|
394
440
|
displayName: string;
|
|
395
441
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React__default from 'react';
|
|
2
2
|
import { I as IconType } from '../renderIcon-C2lEMMzb.js';
|
|
3
|
-
import { R as RowKey, e as TableFilters, B as BulkAction } from '../Table.types-
|
|
4
|
-
export { a as BulkActionButton, b as BulkActionSplitButton, c as BulkActionSplitOption } from '../Table.types-
|
|
3
|
+
import { R as RowKey, e as TableFilters, B as BulkAction } from '../Table.types-CZZ7QWAI.js';
|
|
4
|
+
export { a as BulkActionButton, b as BulkActionSplitButton, c as BulkActionSplitOption } from '../Table.types-CZZ7QWAI.js';
|
|
5
5
|
import { C as ComboboxOption } from '../Combobox.types-DkigkEh2.js';
|
|
6
6
|
import { b as MenuItemType } from '../Menu.types-DNIpjSAK.js';
|
|
7
7
|
import { S as SelectOption } from '../Select.types-B4kDpkGB.js';
|
|
@@ -324,7 +324,53 @@ interface DataGridProps<T extends object = Record<string, unknown>> {
|
|
|
324
324
|
/** Controlled selected row keys. */
|
|
325
325
|
selectedRows?: string[];
|
|
326
326
|
defaultSelectedRows?: string[];
|
|
327
|
+
/**
|
|
328
|
+
* Fires with every selected key, plus the row object for each of those keys.
|
|
329
|
+
*
|
|
330
|
+
* `selectedKeys` is authoritative; `selectedRows` is best-effort. The row
|
|
331
|
+
* for each selected key is cached, so a row selected on a previous page
|
|
332
|
+
* still comes back after `data` has moved on (which is what makes selection
|
|
333
|
+
* usable with server-side pagination) - but a key that was selected before
|
|
334
|
+
* the grid ever saw its row (seeded via `defaultSelectedRows`, say) has no
|
|
335
|
+
* row to hand back.
|
|
336
|
+
*/
|
|
327
337
|
onSelectionChange?: (selectedKeys: string[], selectedRows: T[]) => void;
|
|
338
|
+
/**
|
|
339
|
+
* What the select-all control acts on - the header checkbox in table mode,
|
|
340
|
+
* or the toolbar checkbox in card view (where there is no header row):
|
|
341
|
+
*
|
|
342
|
+
* - `'all'` - every row in `data`, across pages.
|
|
343
|
+
* - `'page'` - only the rows currently rendered.
|
|
344
|
+
*
|
|
345
|
+
* Either way it only ever adds to or removes from the rows in its own
|
|
346
|
+
* scope, so a selection made on another page survives.
|
|
347
|
+
*
|
|
348
|
+
* `'all'` can only reach the rows the grid actually holds. Under
|
|
349
|
+
* server-side pagination (`onPageChange` + `totalRows`) that is a single
|
|
350
|
+
* page: the grid cannot know the keys of rows it has never received, so
|
|
351
|
+
* "all" means "all 20 loaded", not "all 1000 matching", and it says so with
|
|
352
|
+
* a dev-only warning. Matches `Table.selectAllScope`.
|
|
353
|
+
*
|
|
354
|
+
* @default 'all'
|
|
355
|
+
*/
|
|
356
|
+
selectAllScope?: 'all' | 'page';
|
|
357
|
+
/**
|
|
358
|
+
* Resolves the keys of **every** row matching the current query - the rows
|
|
359
|
+
* the grid cannot see, not just the loaded page. Supplying it adds a
|
|
360
|
+
* "Select all N" action to the toolbar once everything the grid does hold is
|
|
361
|
+
* selected, which is the only way to express "all 1000" when the grid only
|
|
362
|
+
* ever receives 20 of them.
|
|
363
|
+
*
|
|
364
|
+
* Called with no arguments and may be async (the action shows a loading
|
|
365
|
+
* state while it resolves); whatever it returns replaces the selection. It
|
|
366
|
+
* is up to you to apply the current filters/sort when resolving - the grid
|
|
367
|
+
* does not pass them, because in server-side mode you already own that
|
|
368
|
+
* query.
|
|
369
|
+
*
|
|
370
|
+
* Only rendered when the grid can tell it is holding a subset, i.e. when
|
|
371
|
+
* `totalRows` exceeds the number of loaded rows.
|
|
372
|
+
*/
|
|
373
|
+
onSelectAllMatching?: () => string[] | Promise<string[]>;
|
|
328
374
|
bulkActions?: BulkAction<T>[];
|
|
329
375
|
/**
|
|
330
376
|
* Renders a chevron column (table mode) / toolbar toggle (card mode) that
|
|
@@ -389,7 +435,7 @@ type EditingCell<T extends object = Record<string, unknown>> = {
|
|
|
389
435
|
colKey: RowKey<T>;
|
|
390
436
|
} | null;
|
|
391
437
|
|
|
392
|
-
declare function DataGridInner<T extends object>({ columns: columnsProp, data, rowKey, onChange, onRowAdd, editable, loading, emptyText, className, stickyHeader, maxHeight, showRowNumbers, draggableRows, onRowReorder, currentSort, onSortChange, showFilters, filterConfig, filters, onFiltersChange, quickFilters, showPagination, pageSize, pageSizeOptions, totalRows: totalRowsProp, onPageChange, selectable, selectedRows: controlledSelectedRows, defaultSelectedRows, onSelectionChange, bulkActions, expandable, renderExpandedContent, isRowExpandable, expandMultiple, expandedRows: controlledExpandedRows, defaultExpandedRows, onExpandedRowsChange, density, showDensity, hasCardView, cardViewBreakpoint, cardMinWidth, }: DataGridProps<T>): React__default.ReactElement;
|
|
438
|
+
declare function DataGridInner<T extends object>({ columns: columnsProp, data, rowKey, onChange, onRowAdd, editable, loading, emptyText, className, stickyHeader, maxHeight, showRowNumbers, draggableRows, onRowReorder, currentSort, onSortChange, showFilters, filterConfig, filters, onFiltersChange, quickFilters, showPagination, pageSize, pageSizeOptions, totalRows: totalRowsProp, onPageChange, selectable, selectedRows: controlledSelectedRows, defaultSelectedRows, onSelectionChange, selectAllScope, onSelectAllMatching, bulkActions, expandable, renderExpandedContent, isRowExpandable, expandMultiple, expandedRows: controlledExpandedRows, defaultExpandedRows, onExpandedRowsChange, density, showDensity, hasCardView, cardViewBreakpoint, cardMinWidth, }: DataGridProps<T>): React__default.ReactElement;
|
|
393
439
|
declare const DataGrid: typeof DataGridInner & {
|
|
394
440
|
displayName: string;
|
|
395
441
|
};
|
package/dist/data-grid/index.js
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
import {
|
|
2
2
|
DataGrid
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
3
|
+
} from "../chunk-RKA2OJRT.js";
|
|
4
|
+
import "../chunk-EXITZVB2.js";
|
|
5
5
|
import "../chunk-6ZAT5CGB.js";
|
|
6
|
-
import "../chunk-
|
|
7
|
-
import "../chunk-
|
|
8
|
-
import "../chunk-
|
|
6
|
+
import "../chunk-NGVOXM7P.js";
|
|
7
|
+
import "../chunk-GI6VJYOS.js";
|
|
8
|
+
import "../chunk-P7IQY5YH.js";
|
|
9
9
|
import "../chunk-KGXGTWUL.js";
|
|
10
10
|
import "../chunk-6NZXWKUE.js";
|
|
11
|
-
import "../chunk-
|
|
12
|
-
import "../chunk-
|
|
11
|
+
import "../chunk-VSTQEHVZ.js";
|
|
12
|
+
import "../chunk-A7WQINIG.js";
|
|
13
13
|
import "../chunk-DI2VKKLW.js";
|
|
14
14
|
import "../chunk-3TUCQAYL.js";
|
|
15
15
|
import "../chunk-H6CWTMAH.js";
|
|
16
|
-
import "../chunk-
|
|
17
|
-
import "../chunk-
|
|
18
|
-
import "../chunk-
|
|
16
|
+
import "../chunk-TEJIPPZR.js";
|
|
17
|
+
import "../chunk-VHMOKXUT.js";
|
|
18
|
+
import "../chunk-ZHFPV43D.js";
|
|
19
19
|
import "../chunk-4BKTBV2I.js";
|
|
20
20
|
import "../chunk-LYH3EKKQ.js";
|
|
21
21
|
import "../chunk-3SKI6FXB.js";
|
|
22
22
|
import "../chunk-N5JDL4VE.js";
|
|
23
|
-
import "../chunk-
|
|
23
|
+
import "../chunk-YJXZR7RL.js";
|
|
24
24
|
import "../chunk-66R54X6R.js";
|
|
25
|
-
import "../chunk-
|
|
25
|
+
import "../chunk-KBG77JHC.js";
|
|
26
26
|
import "../chunk-YV57RSPD.js";
|
|
27
27
|
import "../chunk-5WRI5ZAA.js";
|
|
28
28
|
export {
|
|
@@ -2,18 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
var
|
|
6
|
-
require('../chunk-
|
|
7
|
-
require('../chunk-
|
|
5
|
+
var _chunk6HUHH6Y4cjs = require('../chunk-6HUHH6Y4.cjs');
|
|
6
|
+
require('../chunk-KJZUYC4X.cjs');
|
|
7
|
+
require('../chunk-5VM2256W.cjs');
|
|
8
8
|
require('../chunk-FRUOA2QU.cjs');
|
|
9
|
-
require('../chunk-
|
|
9
|
+
require('../chunk-APK5OQRV.cjs');
|
|
10
10
|
require('../chunk-I6UOIS4J.cjs');
|
|
11
|
-
require('../chunk-
|
|
11
|
+
require('../chunk-GEHL4LKK.cjs');
|
|
12
12
|
require('../chunk-Z5U4NJTW.cjs');
|
|
13
13
|
require('../chunk-DZUJEN5N.cjs');
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
exports.Calendar =
|
|
18
|
+
exports.Calendar = _chunk6HUHH6Y4cjs.Calendar; exports.DatePicker = _chunk6HUHH6Y4cjs.DatePicker; exports.TimeInput = _chunk6HUHH6Y4cjs.TimeInput;
|
|
19
19
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -2,13 +2,13 @@ import {
|
|
|
2
2
|
Calendar,
|
|
3
3
|
DatePicker,
|
|
4
4
|
TimeInput
|
|
5
|
-
} from "../chunk-
|
|
6
|
-
import "../chunk-
|
|
7
|
-
import "../chunk-
|
|
5
|
+
} from "../chunk-VSTQEHVZ.js";
|
|
6
|
+
import "../chunk-A7WQINIG.js";
|
|
7
|
+
import "../chunk-VHMOKXUT.js";
|
|
8
8
|
import "../chunk-4BKTBV2I.js";
|
|
9
|
-
import "../chunk-
|
|
9
|
+
import "../chunk-YJXZR7RL.js";
|
|
10
10
|
import "../chunk-66R54X6R.js";
|
|
11
|
-
import "../chunk-
|
|
11
|
+
import "../chunk-KBG77JHC.js";
|
|
12
12
|
import "../chunk-YV57RSPD.js";
|
|
13
13
|
import "../chunk-5WRI5ZAA.js";
|
|
14
14
|
export {
|
package/dist/drawer/index.cjs
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkLUL6RZ4Mcjs = require('../chunk-LUL6RZ4M.cjs');
|
|
4
4
|
require('../chunk-EACNRR3C.cjs');
|
|
5
|
-
require('../chunk-
|
|
5
|
+
require('../chunk-APK5OQRV.cjs');
|
|
6
6
|
require('../chunk-I6UOIS4J.cjs');
|
|
7
|
-
require('../chunk-
|
|
7
|
+
require('../chunk-GEHL4LKK.cjs');
|
|
8
8
|
require('../chunk-Z5U4NJTW.cjs');
|
|
9
9
|
require('../chunk-DZUJEN5N.cjs');
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
exports.Drawer =
|
|
12
|
+
exports.Drawer = _chunkLUL6RZ4Mcjs.Drawer;
|
|
13
13
|
//# sourceMappingURL=index.cjs.map
|
package/dist/drawer/index.d.cts
CHANGED
|
@@ -19,7 +19,8 @@ interface DrawerProps {
|
|
|
19
19
|
onClose: () => void;
|
|
20
20
|
/** Side from which the drawer slides in. Default: 'right'. */
|
|
21
21
|
placement?: DrawerPlacement;
|
|
22
|
-
|
|
22
|
+
/** Panel heading. Accepts inline nodes alongside the text, not just a string. */
|
|
23
|
+
title?: ReactNode;
|
|
23
24
|
children: ReactNode;
|
|
24
25
|
/** Footer action buttons. */
|
|
25
26
|
actions?: DrawerAction[];
|