@devalok/shilp-sutra 0.56.0 → 0.59.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/MIGRATION.md +198 -0
- package/dist/_chunks/badge-group.js +75 -174
- package/dist/_chunks/badge-group.js.map +1 -1
- package/dist/_chunks/chat.js +270 -253
- package/dist/_chunks/chat.js.map +1 -1
- package/dist/_chunks/document-preview.js +1 -1
- package/dist/_chunks/document-preview.js.map +1 -1
- package/dist/_chunks/emoji-suggestion.js +1 -1
- package/dist/_chunks/emoji-suggestion.js.map +1 -1
- package/dist/_chunks/image-preview.js +71 -70
- package/dist/_chunks/image-preview.js.map +1 -1
- package/dist/_chunks/mention-suggestion.js +2 -2
- package/dist/_chunks/mention-suggestion.js.map +1 -1
- package/dist/_chunks/motion-preference.js +15 -0
- package/dist/_chunks/motion-preference.js.map +1 -0
- package/dist/_chunks/motion-provider.js +1 -1
- package/dist/_chunks/motion-provider.js.map +1 -1
- package/dist/_chunks/oauth-button.js +1 -1
- package/dist/_chunks/oauth-button.js.map +1 -1
- package/dist/_chunks/popover.js +50 -49
- package/dist/_chunks/popover.js.map +1 -1
- package/dist/_chunks/primitives-internal.js +29 -29
- package/dist/_chunks/primitives-internal.js.map +1 -1
- package/dist/_chunks/shared.js +48 -47
- package/dist/_chunks/shared.js.map +1 -1
- package/dist/_chunks/success.js +36 -36
- package/dist/_chunks/success.js.map +1 -1
- package/dist/_chunks/tree-view.js +1 -1
- package/dist/_chunks/tree-view.js.map +1 -1
- package/dist/_chunks/use-calendar.js +4 -4
- package/dist/_chunks/use-calendar.js.map +1 -1
- package/dist/ai/block-renderer.js +8 -8
- package/dist/ai/blocks/text.js +1 -1
- package/dist/ai/blocks/text.js.map +1 -1
- package/dist/ai/command-bar.js +67 -67
- package/dist/ai/command-bar.js.map +1 -1
- package/dist/ai/conversation.js +35 -35
- package/dist/ai/conversation.js.map +1 -1
- package/dist/ai/index.js +4 -4
- package/dist/composed/activity-feed.d.ts.map +1 -1
- package/dist/composed/activity-feed.js +109 -108
- package/dist/composed/activity-feed.js.map +1 -1
- package/dist/composed/avatar-group.d.ts +7 -2
- package/dist/composed/avatar-group.d.ts.map +1 -1
- package/dist/composed/avatar-group.js +3 -3
- package/dist/composed/avatar-group.js.map +1 -1
- package/dist/composed/command-palette.js +137 -137
- package/dist/composed/command-palette.js.map +1 -1
- package/dist/composed/content-card.js +2 -2
- package/dist/composed/content-card.js.map +1 -1
- package/dist/composed/date-picker/index.js +9 -9
- package/dist/composed/date-picker/index.js.map +1 -1
- package/dist/composed/diff.d.ts +23 -2
- package/dist/composed/diff.d.ts.map +1 -1
- package/dist/composed/diff.js +341 -260
- package/dist/composed/diff.js.map +1 -1
- package/dist/composed/emoji-picker.js +3 -3
- package/dist/composed/emoji-picker.js.map +1 -1
- package/dist/composed/empty-state.js +4 -4
- package/dist/composed/error-boundary.js +2 -2
- package/dist/composed/error-boundary.js.map +1 -1
- package/dist/composed/file-preview/image-preview.d.ts.map +1 -1
- package/dist/composed/file-preview/shared.d.ts.map +1 -1
- package/dist/composed/file-preview/video-preview.d.ts.map +1 -1
- package/dist/composed/file-preview.js +152 -151
- package/dist/composed/file-preview.js.map +1 -1
- package/dist/composed/filter-bar.d.ts.map +1 -1
- package/dist/composed/filter-bar.js +53 -52
- package/dist/composed/filter-bar.js.map +1 -1
- package/dist/composed/form-section.d.ts.map +1 -1
- package/dist/composed/form-section.js +38 -37
- package/dist/composed/form-section.js.map +1 -1
- package/dist/composed/inline-edit.js +1 -1
- package/dist/composed/inline-edit.js.map +1 -1
- package/dist/composed/loading-skeleton.js +3 -3
- package/dist/composed/loading-skeleton.js.map +1 -1
- package/dist/composed/master-detail.d.ts.map +1 -1
- package/dist/composed/master-detail.js +1 -1
- package/dist/composed/master-detail.js.map +1 -1
- package/dist/composed/member-picker.js +1 -1
- package/dist/composed/member-picker.js.map +1 -1
- package/dist/composed/multi-select-popover.d.ts.map +1 -1
- package/dist/composed/multi-select-popover.js +109 -108
- package/dist/composed/multi-select-popover.js.map +1 -1
- package/dist/composed/page-skeletons.js +4 -4
- package/dist/composed/page-skeletons.js.map +1 -1
- package/dist/composed/responsive-modal.js +1 -1
- package/dist/composed/responsive-modal.js.map +1 -1
- package/dist/composed/rich-chat-input/attachment-strip.d.ts.map +1 -1
- package/dist/composed/rich-chat-input/reply-banner.d.ts.map +1 -1
- package/dist/composed/rich-chat-input/schedule-send.d.ts.map +1 -1
- package/dist/composed/rich-chat-input.d.ts.map +1 -1
- package/dist/composed/rich-chat-input.js +473 -472
- package/dist/composed/rich-chat-input.js.map +1 -1
- package/dist/composed/rich-text-editor.js +6 -6
- package/dist/composed/rich-text-editor.js.map +1 -1
- package/dist/composed/schedule-view.js +5 -5
- package/dist/composed/schedule-view.js.map +1 -1
- package/dist/composed/status-badge.d.ts.map +1 -1
- package/dist/composed/status-badge.js +29 -28
- package/dist/composed/status-badge.js.map +1 -1
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +4 -3
- package/dist/hooks/use-container-size.d.ts +18 -0
- package/dist/hooks/use-container-size.d.ts.map +1 -0
- package/dist/hooks/use-container-size.js +28 -0
- package/dist/hooks/use-container-size.js.map +1 -0
- package/dist/motion/index.d.ts +1 -0
- package/dist/motion/index.d.ts.map +1 -1
- package/dist/motion/index.js +2 -15
- package/dist/motion/motion-preference.d.ts +36 -0
- package/dist/motion/motion-preference.d.ts.map +1 -0
- package/dist/motion/motion-provider.d.ts +2 -1
- package/dist/motion/motion-provider.d.ts.map +1 -1
- package/dist/motion/primitives-index.js +103 -102
- package/dist/motion/primitives-index.js.map +1 -1
- package/dist/motion/primitives.d.ts.map +1 -1
- package/dist/shell/app-shell.d.ts +101 -0
- package/dist/shell/app-shell.d.ts.map +1 -0
- package/dist/shell/app-shell.js +76 -0
- package/dist/shell/app-shell.js.map +1 -0
- package/dist/shell/bottom-navbar.js +21 -21
- package/dist/shell/bottom-navbar.js.map +1 -1
- package/dist/shell/index.d.ts +2 -1
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/index.js +6 -5
- package/dist/shell/notification-center.d.ts +17 -0
- package/dist/shell/notification-center.d.ts.map +1 -1
- package/dist/shell/notification-center.js +110 -105
- package/dist/shell/notification-center.js.map +1 -1
- package/dist/shell/notification-preferences.js +1 -1
- package/dist/shell/notification-preferences.js.map +1 -1
- package/dist/shell/top-bar.js +7 -7
- package/dist/shell/top-bar.js.map +1 -1
- package/dist/tokens/generate-scale.d.ts +49 -0
- package/dist/tokens/generate-scale.d.ts.map +1 -1
- package/dist/tokens/index.css +1 -0
- package/dist/tokens/palettes.css +292 -0
- package/dist/tokens/primitives.css +29 -26
- package/dist/tokens/semantic.css +170 -47
- package/dist/tokens/shilp-sutra.css +1 -0
- package/dist/tokens/utilities.css +10 -7
- package/dist/tokens/variants.css +1 -1
- package/dist/ui/accordion.d.ts.map +1 -1
- package/dist/ui/accordion.js +27 -26
- package/dist/ui/accordion.js.map +1 -1
- package/dist/ui/alert-dialog.d.ts.map +1 -1
- package/dist/ui/alert-dialog.js +60 -59
- package/dist/ui/alert-dialog.js.map +1 -1
- package/dist/ui/alert.d.ts.map +1 -1
- package/dist/ui/alert.js +55 -113
- package/dist/ui/alert.js.map +1 -1
- package/dist/ui/autocomplete.js +80 -80
- package/dist/ui/autocomplete.js.map +1 -1
- package/dist/ui/avatar.d.ts.map +1 -1
- package/dist/ui/avatar.js +71 -70
- package/dist/ui/avatar.js.map +1 -1
- package/dist/ui/badge-indicator.d.ts +4 -8
- package/dist/ui/badge-indicator.d.ts.map +1 -1
- package/dist/ui/badge-indicator.js +3 -8
- package/dist/ui/badge-indicator.js.map +1 -1
- package/dist/ui/badge.d.ts +55 -34
- package/dist/ui/badge.d.ts.map +1 -1
- package/dist/ui/banner.d.ts.map +1 -1
- package/dist/ui/banner.js +43 -41
- package/dist/ui/banner.js.map +1 -1
- package/dist/ui/button-group.d.ts.map +1 -1
- package/dist/ui/button-group.js +3 -23
- package/dist/ui/button-group.js.map +1 -1
- package/dist/ui/button.d.ts +10 -1
- package/dist/ui/button.d.ts.map +1 -1
- package/dist/ui/button.js +79 -212
- package/dist/ui/button.js.map +1 -1
- package/dist/ui/card.d.ts.map +1 -1
- package/dist/ui/card.js +78 -75
- package/dist/ui/card.js.map +1 -1
- package/dist/ui/charts/radar-chart.d.ts.map +1 -1
- package/dist/ui/charts/radar-chart.js +1 -1
- package/dist/ui/charts/radar-chart.js.map +1 -1
- package/dist/ui/chat/date-separator.d.ts +8 -1
- package/dist/ui/chat/date-separator.d.ts.map +1 -1
- package/dist/ui/chat/message-list.d.ts.map +1 -1
- package/dist/ui/chat/message.d.ts.map +1 -1
- package/dist/ui/chat/typing-indicator.d.ts.map +1 -1
- package/dist/ui/checkbox.js +1 -1
- package/dist/ui/checkbox.js.map +1 -1
- package/dist/ui/code.js +2 -2
- package/dist/ui/code.js.map +1 -1
- package/dist/ui/color-input.d.ts.map +1 -1
- package/dist/ui/color-input.js +151 -150
- package/dist/ui/color-input.js.map +1 -1
- package/dist/ui/combobox.d.ts +14 -0
- package/dist/ui/combobox.d.ts.map +1 -1
- package/dist/ui/combobox.js +156 -152
- package/dist/ui/combobox.js.map +1 -1
- package/dist/ui/context-menu.d.ts.map +1 -1
- package/dist/ui/context-menu.js +70 -69
- package/dist/ui/context-menu.js.map +1 -1
- package/dist/ui/data-table-body.d.ts +3 -1
- package/dist/ui/data-table-body.d.ts.map +1 -1
- package/dist/ui/data-table-body.js +93 -92
- package/dist/ui/data-table-body.js.map +1 -1
- package/dist/ui/data-table-bulk-actions.d.ts +7 -1
- package/dist/ui/data-table-bulk-actions.d.ts.map +1 -1
- package/dist/ui/data-table-bulk-actions.js +14 -8
- package/dist/ui/data-table-bulk-actions.js.map +1 -1
- package/dist/ui/data-table-card.d.ts.map +1 -1
- package/dist/ui/data-table-card.js +66 -47
- package/dist/ui/data-table-card.js.map +1 -1
- package/dist/ui/data-table-context.d.ts +4 -0
- package/dist/ui/data-table-context.d.ts.map +1 -1
- package/dist/ui/data-table-context.js +2 -2
- package/dist/ui/data-table-context.js.map +1 -1
- package/dist/ui/data-table-header.d.ts.map +1 -1
- package/dist/ui/data-table-header.js +50 -46
- package/dist/ui/data-table-header.js.map +1 -1
- package/dist/ui/data-table-pagination.js +3 -3
- package/dist/ui/data-table-pagination.js.map +1 -1
- package/dist/ui/data-table-toolbar.d.ts +11 -1
- package/dist/ui/data-table-toolbar.d.ts.map +1 -1
- package/dist/ui/data-table-toolbar.js +7 -7
- package/dist/ui/data-table-toolbar.js.map +1 -1
- package/dist/ui/data-table.d.ts +52 -5
- package/dist/ui/data-table.d.ts.map +1 -1
- package/dist/ui/data-table.js +181 -169
- package/dist/ui/data-table.js.map +1 -1
- package/dist/ui/dialog.d.ts.map +1 -1
- package/dist/ui/dialog.js +62 -61
- package/dist/ui/dialog.js.map +1 -1
- package/dist/ui/dot.d.ts.map +1 -1
- package/dist/ui/dot.js +10 -41
- package/dist/ui/dot.js.map +1 -1
- package/dist/ui/dropdown-menu.d.ts.map +1 -1
- package/dist/ui/dropdown-menu.js +79 -78
- package/dist/ui/dropdown-menu.js.map +1 -1
- package/dist/ui/file-upload.d.ts.map +1 -1
- package/dist/ui/file-upload.js +117 -116
- package/dist/ui/file-upload.js.map +1 -1
- package/dist/ui/form.d.ts.map +1 -1
- package/dist/ui/form.js +27 -26
- package/dist/ui/form.js.map +1 -1
- package/dist/ui/hover-card.d.ts.map +1 -1
- package/dist/ui/hover-card.js +26 -25
- package/dist/ui/hover-card.js.map +1 -1
- package/dist/ui/icon.js +7 -7
- package/dist/ui/index.d.ts +2 -2
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +3 -3
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/input-otp.js +1 -1
- package/dist/ui/input-otp.js.map +1 -1
- package/dist/ui/input.js +8 -8
- package/dist/ui/input.js.map +1 -1
- package/dist/ui/menubar.d.ts.map +1 -1
- package/dist/ui/menubar.js +73 -72
- package/dist/ui/menubar.js.map +1 -1
- package/dist/ui/navigation-menu.d.ts.map +1 -1
- package/dist/ui/navigation-menu.js +80 -79
- package/dist/ui/navigation-menu.js.map +1 -1
- package/dist/ui/number-input.js +3 -3
- package/dist/ui/number-input.js.map +1 -1
- package/dist/ui/pagination.js +1 -1
- package/dist/ui/pagination.js.map +1 -1
- package/dist/ui/popover.d.ts.map +1 -1
- package/dist/ui/progress-ring.js +2 -2
- package/dist/ui/progress-ring.js.map +1 -1
- package/dist/ui/progress.d.ts.map +1 -1
- package/dist/ui/progress.js +82 -74
- package/dist/ui/progress.js.map +1 -1
- package/dist/ui/radio.d.ts.map +1 -1
- package/dist/ui/radio.js +32 -31
- package/dist/ui/radio.js.map +1 -1
- package/dist/ui/search-input.d.ts.map +1 -1
- package/dist/ui/search-input.js +28 -27
- package/dist/ui/search-input.js.map +1 -1
- package/dist/ui/select.d.ts.map +1 -1
- package/dist/ui/select.js +67 -66
- package/dist/ui/select.js.map +1 -1
- package/dist/ui/sheet.js +1 -1
- package/dist/ui/sheet.js.map +1 -1
- package/dist/ui/sidebar.d.ts.map +1 -1
- package/dist/ui/sidebar.js +14 -14
- package/dist/ui/sidebar.js.map +1 -1
- package/dist/ui/slider.d.ts +63 -9
- package/dist/ui/slider.d.ts.map +1 -1
- package/dist/ui/slider.js +75 -33
- package/dist/ui/slider.js.map +1 -1
- package/dist/ui/split-button.d.ts +8 -2
- package/dist/ui/split-button.d.ts.map +1 -1
- package/dist/ui/split-button.js +49 -95
- package/dist/ui/split-button.js.map +1 -1
- package/dist/ui/stat-card.d.ts.map +1 -1
- package/dist/ui/stat-card.js +89 -88
- package/dist/ui/stat-card.js.map +1 -1
- package/dist/ui/stat-flash.js +16 -16
- package/dist/ui/stepper.d.ts.map +1 -1
- package/dist/ui/stepper.js +63 -62
- package/dist/ui/stepper.js.map +1 -1
- package/dist/ui/surface.d.ts.map +1 -1
- package/dist/ui/surface.js +2 -2
- package/dist/ui/surface.js.map +1 -1
- package/dist/ui/switch.js +1 -1
- package/dist/ui/switch.js.map +1 -1
- package/dist/ui/table.js +3 -3
- package/dist/ui/table.js.map +1 -1
- package/dist/ui/tabs.d.ts.map +1 -1
- package/dist/ui/tabs.js +68 -67
- package/dist/ui/tabs.js.map +1 -1
- package/dist/ui/textarea.js +5 -5
- package/dist/ui/textarea.js.map +1 -1
- package/dist/ui/toast.d.ts.map +1 -1
- package/dist/ui/toast.js +196 -195
- package/dist/ui/toast.js.map +1 -1
- package/dist/ui/toggle.d.ts.map +1 -1
- package/dist/ui/toggle.js +26 -24
- package/dist/ui/toggle.js.map +1 -1
- package/dist/ui/tooltip.d.ts.map +1 -1
- package/dist/ui/tooltip.js +37 -36
- package/dist/ui/tooltip.js.map +1 -1
- package/dist/ui/tree-view/tree-item.d.ts.map +1 -1
- package/docs/components/composed/avatar-group.md +4 -4
- package/docs/components/composed/diff.md +10 -2
- package/docs/components/composed/schedule-view.md +1 -1
- package/docs/components/shell/app-shell.md +132 -0
- package/docs/components/ui/avatar.md +1 -1
- package/docs/components/ui/button.md +1 -1
- package/docs/components/ui/chat.md +7 -1
- package/docs/components/ui/color-swatch.md +1 -1
- package/docs/components/ui/data-table-toolbar.md +6 -2
- package/docs/components/ui/data-table.md +41 -7
- package/docs/components/ui/dot.md +1 -1
- package/docs/components/ui/progress.md +1 -0
- package/docs/components/ui/surface.md +3 -3
- package/docs/components/ui/table.md +2 -2
- package/docs/recipes/customize-brand.md +58 -0
- package/docs/recipes/install-astro.md +1 -0
- package/docs/recipes/install-next-app-router.md +1 -0
- package/docs/recipes/install-next-pages.md +22 -1
- package/docs/recipes/install-remix.md +1 -0
- package/docs/recipes/install-tanstack-start.md +1 -0
- package/docs/recipes/install-vite.md +2 -0
- package/docs/recipes/server-components.md +7 -4
- package/docs/recipes/troubleshoot.md +1 -0
- package/llms.txt +2 -1
- package/make-kit/Guidelines.md +2 -2
- package/make-kit/components/button.md +1 -1
- package/make-kit/components/card.md +6 -6
- package/make-kit/components/surface.md +4 -4
- package/make-kit/foundations/color.md +4 -4
- package/make-kit/foundations/dark-mode.md +1 -1
- package/make-kit/foundations/radius.md +1 -1
- package/make-kit/foundations/surfaces.md +9 -9
- package/mcp-manifest.json +358 -35
- package/package.json +8 -4
- package/skill/SKILL.md +12 -6
- package/skill/references/components.md +2 -1
- package/skill/references/customize-brand.md +58 -0
- package/skill/references/server-components.md +7 -4
- package/skill/references/setup-astro.md +1 -0
- package/skill/references/setup-next-app-router.md +1 -0
- package/skill/references/setup-next-pages.md +22 -1
- package/skill/references/setup-remix.md +1 -0
- package/skill/references/setup-tanstack-start.md +1 -0
- package/skill/references/setup-vite.md +2 -0
- package/skill/references/troubleshoot.md +1 -0
- package/dist/motion/check-motion-provider.d.ts +0 -2
- package/dist/motion/check-motion-provider.d.ts.map +0 -1
- package/dist/motion/index.js.map +0 -1
- package/dist/primitives/react-toast.d.ts +0 -120
- package/dist/ui/charts/_internal/scales.d.ts +0 -5
- package/dist/ui/charts/_internal/scales.d.ts.map +0 -1
- package/dist/ui/lib/slot.d.ts +0 -8
- package/dist/ui/lib/slot.d.ts.map +0 -1
package/dist/ui/data-table.js
CHANGED
|
@@ -10,71 +10,71 @@ import { DataTableCards as ne } from "./data-table-card.js";
|
|
|
10
10
|
import { DataTableHeader as re } from "./data-table-header.js";
|
|
11
11
|
import { DataTablePagination as ie } from "./data-table-pagination.js";
|
|
12
12
|
import { DataTableToolbar as ae } from "./data-table-toolbar.js";
|
|
13
|
-
import { useCallback as a, useEffect as o, useMemo as
|
|
14
|
-
import { jsx as
|
|
15
|
-
import { IconChevronRight as
|
|
16
|
-
import { getCoreRowModel as
|
|
17
|
-
import { useVirtualizer as
|
|
13
|
+
import { useCallback as a, useEffect as o, useMemo as oe, useRef as s, useState as c } from "react";
|
|
14
|
+
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
15
|
+
import { IconChevronRight as se, IconSearch as ce } from "@tabler/icons-react";
|
|
16
|
+
import { getCoreRowModel as le, getExpandedRowModel as ue, getFilteredRowModel as de, getPaginationRowModel as fe, getSortedRowModel as pe, useReactTable as me } from "@tanstack/react-table";
|
|
17
|
+
import { useVirtualizer as he } from "@tanstack/react-virtual";
|
|
18
18
|
//#region src/ui/data-table.tsx
|
|
19
|
-
function
|
|
20
|
-
let [
|
|
19
|
+
function d({ columns: d, data: f, className: ge, noResultsText: p, sortable: m = !1, filterable: h = !1, globalFilter: g = !1, paginated: _e = !1, pageSize: _, pageSizeOptions: ve, selectable: v = !1, onSelectionChange: y, toolbar: ye = !1, density: be = "standard", columnPinning: xe, editable: Se = !1, onCellEdit: Ce, expandable: b = !1, renderExpanded: x, virtualRows: S = !1, virtualRowHeight: we = 48, maxHeight: Te = 600, onSort: C, emptyState: w, loading: T = !1, selectedIds: E, selectableFilter: D, getRowId: O, pagination: k, singleExpand: A = !1, stickyHeader: Ee = !1, onRowClick: j, bulkActions: M, bulkActionsPosition: De = "bottom", mobileView: N = "table", enableExport: Oe, onExport: ke, filterableColumns: P, rowClassName: F }) {
|
|
20
|
+
let [Ae, I] = c(!1);
|
|
21
21
|
o(() => {
|
|
22
|
-
let e = window.matchMedia("(max-width: 639px)"), t = () =>
|
|
23
|
-
return e.addEventListener("change", t),
|
|
22
|
+
let e = window.matchMedia("(max-width: 639px)"), t = () => I(e.matches);
|
|
23
|
+
return e.addEventListener("change", t), I(e.matches), () => e.removeEventListener("change", t);
|
|
24
24
|
}, []);
|
|
25
|
-
let
|
|
26
|
-
pageIndex:
|
|
27
|
-
pageSize:
|
|
28
|
-
}), [
|
|
29
|
-
left:
|
|
30
|
-
right:
|
|
31
|
-
}), [
|
|
25
|
+
let je = N === "card" && Ae, [Me, L] = c([]), [Ne, Pe] = c([]), [R, z] = c(""), [Fe, B] = c({
|
|
26
|
+
pageIndex: k ? k.page - 1 : 0,
|
|
27
|
+
pageSize: k?.pageSize ?? _ ?? 10
|
|
28
|
+
}), [V, Ie] = c({}), [Le, Re] = c({}), [H, ze] = c({
|
|
29
|
+
left: xe?.left ?? [],
|
|
30
|
+
right: xe?.right ?? []
|
|
31
|
+
}), [Be, Ve] = c(be), [He, Ue] = c(null), [We, Ge] = c({}), Ke = s(null), U = s(!1), qe = s(!0);
|
|
32
32
|
o(() => {
|
|
33
|
-
if (
|
|
34
|
-
|
|
33
|
+
if (E) {
|
|
34
|
+
U.current = !0;
|
|
35
35
|
let e = {};
|
|
36
|
-
|
|
36
|
+
E.forEach((t) => {
|
|
37
37
|
e[t] = !0;
|
|
38
|
-
}),
|
|
38
|
+
}), Ie(e);
|
|
39
39
|
}
|
|
40
|
-
}, [
|
|
41
|
-
|
|
40
|
+
}, [E]), o(() => {
|
|
41
|
+
k && B((e) => ({
|
|
42
42
|
...e,
|
|
43
|
-
pageIndex:
|
|
44
|
-
pageSize:
|
|
43
|
+
pageIndex: k.page - 1,
|
|
44
|
+
pageSize: k.pageSize
|
|
45
45
|
}));
|
|
46
|
-
}, [
|
|
47
|
-
let
|
|
48
|
-
|
|
46
|
+
}, [k?.page, k?.pageSize]);
|
|
47
|
+
let Je = a((e) => {
|
|
48
|
+
L((t) => {
|
|
49
49
|
let n = typeof e == "function" ? e(t) : e;
|
|
50
|
-
return
|
|
50
|
+
return C && (n.length === 0 && t.length > 0 ? C(t[0].id, !1) : n.length > 0 && C(n[0].id, n[0].desc ? "desc" : "asc")), n;
|
|
51
51
|
});
|
|
52
|
-
}, [
|
|
53
|
-
|
|
52
|
+
}, [C]), Ye = a((e) => {
|
|
53
|
+
Ge((t) => {
|
|
54
54
|
let n = typeof e == "function" ? e(t) : e;
|
|
55
|
-
if (!
|
|
55
|
+
if (!A || n === !0 || typeof n != "object") return n;
|
|
56
56
|
let r = typeof t == "object" ? Object.keys(t).filter((e) => t[e]) : [], i = Object.keys(n).filter((e) => n[e]).filter((e) => !r.includes(e));
|
|
57
57
|
return i.length > 0 ? { [i[i.length - 1]]: !0 } : n;
|
|
58
58
|
});
|
|
59
|
-
}, [
|
|
59
|
+
}, [A]), W = s(k?.onPageChange);
|
|
60
60
|
o(() => {
|
|
61
|
-
|
|
62
|
-
}, [
|
|
63
|
-
let
|
|
64
|
-
|
|
61
|
+
W.current = k?.onPageChange;
|
|
62
|
+
}, [k?.onPageChange]);
|
|
63
|
+
let Xe = a((e) => {
|
|
64
|
+
B((t) => {
|
|
65
65
|
let n = typeof e == "function" ? e(t) : e;
|
|
66
|
-
return
|
|
66
|
+
return W.current && n.pageIndex !== t.pageIndex && W.current(n.pageIndex + 1), n;
|
|
67
67
|
});
|
|
68
|
-
}, []),
|
|
68
|
+
}, []), Ze = {
|
|
69
69
|
id: "_select",
|
|
70
|
-
header: ({ table: e }) => /* @__PURE__ */
|
|
70
|
+
header: ({ table: e }) => /* @__PURE__ */ l(n, {
|
|
71
71
|
size: "sm",
|
|
72
72
|
checked: e.getIsAllPageRowsSelected(),
|
|
73
73
|
indeterminate: e.getIsSomePageRowsSelected(),
|
|
74
74
|
onCheckedChange: (t) => e.toggleAllPageRowsSelected(!!t),
|
|
75
75
|
"aria-label": "Select all rows"
|
|
76
76
|
}),
|
|
77
|
-
cell: ({ row: e }) => /* @__PURE__ */
|
|
77
|
+
cell: ({ row: e }) => /* @__PURE__ */ l(n, {
|
|
78
78
|
size: "sm",
|
|
79
79
|
checked: e.getIsSelected(),
|
|
80
80
|
disabled: !e.getCanSelect(),
|
|
@@ -84,20 +84,20 @@ function f({ columns: f, data: p, className: he, noResultsText: m, sortable: h =
|
|
|
84
84
|
enableSorting: !1,
|
|
85
85
|
enableColumnFilter: !1,
|
|
86
86
|
enableHiding: !1
|
|
87
|
-
},
|
|
87
|
+
}, Qe = {
|
|
88
88
|
id: "_expand",
|
|
89
|
-
header: () => /* @__PURE__ */
|
|
89
|
+
header: () => /* @__PURE__ */ l("span", {
|
|
90
90
|
className: "sr-only",
|
|
91
91
|
children: "Expand rows"
|
|
92
92
|
}),
|
|
93
|
-
cell: ({ row: n }) => /* @__PURE__ */
|
|
93
|
+
cell: ({ row: n }) => /* @__PURE__ */ l("button", {
|
|
94
94
|
type: "button",
|
|
95
95
|
onClick: () => n.toggleExpanded(),
|
|
96
96
|
"aria-expanded": n.getIsExpanded(),
|
|
97
97
|
"aria-label": n.getIsExpanded() ? "Collapse row" : "Expand row",
|
|
98
|
-
className: "flex items-center justify-center p-ds-01 rounded-control-inner hover:bg-surface-
|
|
99
|
-
children: /* @__PURE__ */
|
|
100
|
-
icon:
|
|
98
|
+
className: "flex items-center justify-center p-ds-01 rounded-control-inner hover:bg-surface-panel-hover transition-colors",
|
|
99
|
+
children: /* @__PURE__ */ l(t, {
|
|
100
|
+
icon: se,
|
|
101
101
|
size: "sm",
|
|
102
102
|
className: e("transition-transform duration-fast-02 ease-productive-standard", n.getIsExpanded() && "rotate-90")
|
|
103
103
|
})
|
|
@@ -105,182 +105,194 @@ function f({ columns: f, data: p, className: he, noResultsText: m, sortable: h =
|
|
|
105
105
|
enableSorting: !1,
|
|
106
106
|
enableColumnFilter: !1,
|
|
107
107
|
enableHiding: !1
|
|
108
|
-
},
|
|
109
|
-
...
|
|
110
|
-
...
|
|
111
|
-
...
|
|
112
|
-
],
|
|
113
|
-
columnVisibility:
|
|
108
|
+
}, G = [
|
|
109
|
+
...v ? [Ze] : [],
|
|
110
|
+
...b ? [Qe] : [],
|
|
111
|
+
...d
|
|
112
|
+
], K = !!k, q = _e || K, J = {
|
|
113
|
+
columnVisibility: Le,
|
|
114
114
|
columnPinning: H
|
|
115
115
|
};
|
|
116
|
-
|
|
117
|
-
let
|
|
118
|
-
data:
|
|
119
|
-
columns:
|
|
120
|
-
state:
|
|
121
|
-
onColumnVisibilityChange:
|
|
122
|
-
onColumnPinningChange:
|
|
123
|
-
getCoreRowModel:
|
|
124
|
-
...
|
|
125
|
-
onSortingChange:
|
|
126
|
-
...
|
|
116
|
+
m && (J.sorting = Me), (h || g) && (J.columnFilters = Ne, J.globalFilter = R), q && (J.pagination = Fe), v && (J.rowSelection = V), b && (J.expanded = We);
|
|
117
|
+
let Y = m && !!C, X = me({
|
|
118
|
+
data: f,
|
|
119
|
+
columns: G,
|
|
120
|
+
state: J,
|
|
121
|
+
onColumnVisibilityChange: Re,
|
|
122
|
+
onColumnPinningChange: ze,
|
|
123
|
+
getCoreRowModel: le(),
|
|
124
|
+
...m && {
|
|
125
|
+
onSortingChange: Y ? Je : L,
|
|
126
|
+
...Y ? { manualSorting: !0 } : { getSortedRowModel: pe() }
|
|
127
127
|
},
|
|
128
|
-
...(
|
|
129
|
-
onColumnFiltersChange:
|
|
130
|
-
onGlobalFilterChange:
|
|
131
|
-
getFilteredRowModel:
|
|
128
|
+
...(h || g) && {
|
|
129
|
+
onColumnFiltersChange: Pe,
|
|
130
|
+
onGlobalFilterChange: z,
|
|
131
|
+
getFilteredRowModel: de()
|
|
132
132
|
},
|
|
133
|
-
...
|
|
134
|
-
onPaginationChange:
|
|
135
|
-
...
|
|
133
|
+
...q && {
|
|
134
|
+
onPaginationChange: K ? Xe : B,
|
|
135
|
+
...K ? {
|
|
136
136
|
manualPagination: !0,
|
|
137
|
-
pageCount: Math.ceil(
|
|
138
|
-
} : { getPaginationRowModel:
|
|
137
|
+
pageCount: Math.ceil(k.total / k.pageSize)
|
|
138
|
+
} : { getPaginationRowModel: fe() }
|
|
139
139
|
},
|
|
140
|
-
...
|
|
141
|
-
onRowSelectionChange:
|
|
142
|
-
enableRowSelection:
|
|
140
|
+
...v && {
|
|
141
|
+
onRowSelectionChange: Ie,
|
|
142
|
+
enableRowSelection: D ? (e) => D(e.original) : !0
|
|
143
143
|
},
|
|
144
|
-
...
|
|
145
|
-
onExpandedChange:
|
|
146
|
-
getExpandedRowModel:
|
|
144
|
+
...b && {
|
|
145
|
+
onExpandedChange: A ? Ye : Ge,
|
|
146
|
+
getExpandedRowModel: ue()
|
|
147
147
|
},
|
|
148
|
-
...
|
|
149
|
-
}), Z =
|
|
148
|
+
...O && { getRowId: (e) => O(e) }
|
|
149
|
+
}), Z = s(y), Q = s(O);
|
|
150
150
|
o(() => {
|
|
151
|
-
Z.current =
|
|
152
|
-
}, [
|
|
153
|
-
if (
|
|
154
|
-
|
|
151
|
+
Z.current = y, Q.current = O;
|
|
152
|
+
}, [y, O]), o(() => {
|
|
153
|
+
if (qe.current) {
|
|
154
|
+
qe.current = !1;
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
if (U.current) {
|
|
158
|
+
U.current = !1;
|
|
155
159
|
return;
|
|
156
160
|
}
|
|
157
161
|
if (!Z.current) return;
|
|
158
|
-
let e = Object.keys(
|
|
159
|
-
let r = Q.current ? Q.current(
|
|
162
|
+
let e = Object.keys(V).filter((e) => V[e]), t = f.filter((t, n) => {
|
|
163
|
+
let r = Q.current ? Q.current(f[n]) : String(n);
|
|
160
164
|
return e.includes(r);
|
|
161
165
|
});
|
|
162
|
-
Z.current(t);
|
|
163
|
-
}, [
|
|
164
|
-
let
|
|
165
|
-
count:
|
|
166
|
-
getScrollElement: () =>
|
|
167
|
-
estimateSize: () =>
|
|
166
|
+
Z.current(t, new Set(e));
|
|
167
|
+
}, [V, f]);
|
|
168
|
+
let $e = X.getRowModel().rows, $ = he({
|
|
169
|
+
count: S ? $e.length : 0,
|
|
170
|
+
getScrollElement: () => Ke.current,
|
|
171
|
+
estimateSize: () => we,
|
|
168
172
|
overscan: 10
|
|
169
|
-
}),
|
|
170
|
-
if (!
|
|
171
|
-
let e = Object.keys(
|
|
172
|
-
return
|
|
173
|
-
let r =
|
|
173
|
+
}), et = k?.pageSize ?? _ ?? 5, tt = oe(() => {
|
|
174
|
+
if (!M || !v) return [];
|
|
175
|
+
let e = Object.keys(V).filter((e) => V[e]);
|
|
176
|
+
return f.filter((t, n) => {
|
|
177
|
+
let r = O ? O(f[n]) : String(n);
|
|
174
178
|
return e.includes(r);
|
|
175
179
|
});
|
|
176
180
|
}, [
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
]),
|
|
181
|
+
M,
|
|
182
|
+
v,
|
|
183
|
+
V,
|
|
184
|
+
f,
|
|
185
|
+
O
|
|
186
|
+
]), nt = tt.length > 0, rt = K ? k.total : X.getFilteredRowModel().rows.length, it = oe(() => ({
|
|
183
187
|
table: X,
|
|
184
|
-
allColumns:
|
|
188
|
+
allColumns: G.map((e) => ({
|
|
185
189
|
id: e.id,
|
|
186
190
|
header: e.header
|
|
187
191
|
})),
|
|
188
192
|
columnPinningState: H,
|
|
189
|
-
sortable:
|
|
190
|
-
filterable:
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
193
|
+
sortable: m,
|
|
194
|
+
filterable: h,
|
|
195
|
+
filterableColumns: P,
|
|
196
|
+
editable: Se,
|
|
197
|
+
expandable: b,
|
|
198
|
+
virtualRows: S,
|
|
199
|
+
selectable: v,
|
|
200
|
+
mobileView: N,
|
|
201
|
+
editingCell: He,
|
|
202
|
+
setEditingCell: Ue,
|
|
203
|
+
onCellEdit: Ce,
|
|
204
|
+
renderExpanded: x,
|
|
205
|
+
onRowClick: j,
|
|
206
|
+
rowClassName: F
|
|
201
207
|
}), [
|
|
202
208
|
X,
|
|
203
|
-
|
|
209
|
+
G.length,
|
|
204
210
|
H,
|
|
211
|
+
m,
|
|
205
212
|
h,
|
|
206
|
-
g,
|
|
207
|
-
xe,
|
|
208
|
-
x,
|
|
209
|
-
C,
|
|
210
|
-
y,
|
|
211
213
|
P,
|
|
212
|
-
Ie,
|
|
213
214
|
Se,
|
|
215
|
+
b,
|
|
214
216
|
S,
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
217
|
+
v,
|
|
218
|
+
N,
|
|
219
|
+
He,
|
|
220
|
+
Ce,
|
|
221
|
+
x,
|
|
222
|
+
j,
|
|
223
|
+
F
|
|
224
|
+
]), at = S ? $.getVirtualItems() : void 0, ot = S ? $.getTotalSize() : void 0, st = $.measureElement, ct = /* @__PURE__ */ u(i, {
|
|
225
|
+
density: Be,
|
|
226
|
+
"aria-busy": T || void 0,
|
|
227
|
+
children: [/* @__PURE__ */ l(re, { stickyHeader: Ee }), /* @__PURE__ */ l(ee, {
|
|
228
|
+
loading: T,
|
|
229
|
+
skeletonRowCount: et,
|
|
230
|
+
noResultsText: p,
|
|
231
|
+
emptyState: w,
|
|
232
|
+
virtualItems: at,
|
|
233
|
+
totalVirtualSize: ot,
|
|
234
|
+
measureRow: st
|
|
226
235
|
})]
|
|
227
236
|
});
|
|
228
|
-
return /* @__PURE__ */
|
|
229
|
-
value:
|
|
230
|
-
children: /* @__PURE__ */
|
|
231
|
-
className: e(
|
|
237
|
+
return /* @__PURE__ */ l(r, {
|
|
238
|
+
value: it,
|
|
239
|
+
children: /* @__PURE__ */ u("div", {
|
|
240
|
+
className: e(ge),
|
|
232
241
|
children: [
|
|
233
|
-
|
|
242
|
+
ye && /* @__PURE__ */ l(ae, {
|
|
234
243
|
table: X,
|
|
235
|
-
globalFilter:
|
|
236
|
-
globalFilterValue:
|
|
237
|
-
onGlobalFilterChange:
|
|
238
|
-
density:
|
|
239
|
-
onDensityChange:
|
|
244
|
+
globalFilter: g,
|
|
245
|
+
globalFilterValue: R,
|
|
246
|
+
onGlobalFilterChange: z,
|
|
247
|
+
density: Be,
|
|
248
|
+
onDensityChange: Ve,
|
|
249
|
+
enableExport: Oe ?? !0,
|
|
250
|
+
onExport: ke
|
|
240
251
|
}),
|
|
241
|
-
|
|
252
|
+
g && !ye && /* @__PURE__ */ u("div", {
|
|
242
253
|
className: "flex items-center gap-ds-03 pb-ds-04 border-b border-surface-border mb-ds-04",
|
|
243
|
-
children: [/* @__PURE__ */
|
|
244
|
-
icon:
|
|
254
|
+
children: [/* @__PURE__ */ l(t, {
|
|
255
|
+
icon: ce,
|
|
245
256
|
size: "sm",
|
|
246
257
|
className: "text-surface-fg-subtle"
|
|
247
|
-
}), /* @__PURE__ */
|
|
258
|
+
}), /* @__PURE__ */ l("input", {
|
|
248
259
|
type: "text",
|
|
249
|
-
value:
|
|
250
|
-
onChange: (e) =>
|
|
260
|
+
value: R,
|
|
261
|
+
onChange: (e) => z(e.target.value),
|
|
251
262
|
placeholder: "Search all columns...",
|
|
252
263
|
"aria-label": "Search all columns",
|
|
253
264
|
className: e("flex-1 bg-transparent text-body-md", "text-surface-fg placeholder:text-surface-fg-subtle", "outline-hidden")
|
|
254
265
|
})]
|
|
255
266
|
}),
|
|
256
|
-
|
|
257
|
-
loading:
|
|
258
|
-
skeletonRowCount:
|
|
259
|
-
noResultsText:
|
|
260
|
-
emptyState:
|
|
261
|
-
}) :
|
|
262
|
-
ref:
|
|
267
|
+
je ? /* @__PURE__ */ l(ne, {
|
|
268
|
+
loading: T,
|
|
269
|
+
skeletonRowCount: et,
|
|
270
|
+
noResultsText: p,
|
|
271
|
+
emptyState: w
|
|
272
|
+
}) : S ? /* @__PURE__ */ l("div", {
|
|
273
|
+
ref: Ke,
|
|
263
274
|
style: {
|
|
264
|
-
maxHeight: `${
|
|
275
|
+
maxHeight: `${Te}px`,
|
|
265
276
|
overflowY: "auto"
|
|
266
277
|
},
|
|
267
|
-
children:
|
|
268
|
-
}) :
|
|
269
|
-
|
|
278
|
+
children: ct
|
|
279
|
+
}) : ct,
|
|
280
|
+
q && /* @__PURE__ */ l(ie, {
|
|
270
281
|
table: X,
|
|
271
|
-
totalRowCount:
|
|
272
|
-
useServerPagination:
|
|
273
|
-
pageSizeOptions:
|
|
282
|
+
totalRowCount: rt,
|
|
283
|
+
useServerPagination: K,
|
|
284
|
+
pageSizeOptions: ve
|
|
274
285
|
}),
|
|
275
|
-
|
|
286
|
+
M && v && nt && /* @__PURE__ */ l(te, {
|
|
276
287
|
table: X,
|
|
277
|
-
selectedRows:
|
|
278
|
-
bulkActions:
|
|
288
|
+
selectedRows: tt,
|
|
289
|
+
bulkActions: M,
|
|
290
|
+
position: De
|
|
279
291
|
})
|
|
280
292
|
]
|
|
281
293
|
})
|
|
282
294
|
});
|
|
283
295
|
}
|
|
284
|
-
|
|
296
|
+
d.displayName = "DataTable";
|
|
285
297
|
//#endregion
|
|
286
|
-
export {
|
|
298
|
+
export { d as DataTable };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-table.js","names":[],"sources":["../../src/ui/data-table.tsx"],"sourcesContent":["'use client'\n\nimport { IconChevronRight, IconSearch } from '@tabler/icons-react'\nimport {\n type ColumnDef,\n type ColumnFiltersState,\n type ColumnPinningState,\n type ExpandedState,\n getCoreRowModel,\n getExpandedRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n type PaginationState,\n type Row,\n type RowData,\n type RowSelectionState,\n type SortingState,\n type TableState,\n type Updater,\n useReactTable,\n type VisibilityState,\n} from '@tanstack/react-table'\nimport { useVirtualizer } from '@tanstack/react-virtual'\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\nimport { Checkbox } from './checkbox'\nimport { DataTableBody } from './data-table-body'\nimport { type BulkAction,DataTableBulkActions } from './data-table-bulk-actions'\nimport { DataTableCards } from './data-table-card'\nimport {\n DataTableProvider,\n type EditingCell,\n} from './data-table-context'\nimport { DataTableHeader } from './data-table-header'\nimport { DataTablePagination } from './data-table-pagination'\nimport { DataTableToolbar, type Density } from './data-table-toolbar'\nimport { Icon } from './icon'\nimport { cn } from './lib/utils'\nimport { Table } from './table'\n\n// Re-export public types so consumers' imports don't break\nexport type { BulkAction } from './data-table-bulk-actions'\n\ndeclare module '@tanstack/react-table' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface ColumnMeta<TData extends RowData, TValue> {\n align?: 'left' | 'center' | 'right'\n hideBelow?: 'sm' | 'md' | 'lg'\n }\n}\n\n/**\n * Props for DataTable — a feature-rich TanStack Table wrapper supporting sorting, filtering,\n * pagination, row selection, inline editing, row expansion, column pinning, and virtualization.\n *\n * All features are opt-in via boolean flags. The component manages its own internal state for\n * sorting, filtering, pagination, and selection — just pass `columns` and `data`.\n *\n * **Feature flags:** `sortable` | `filterable` | `globalFilter` | `paginated` | `selectable` |\n * `toolbar` | `editable` | `expandable` | `virtualRows`\n *\n * **Columns:** Use TanStack Table's `ColumnDef<TData, TValue>` type. Set\n * `meta: { enableEditing: false }` on a column to disable cell editing for that column.\n *\n * @example\n * // Minimal read-only table:\n * const columns: ColumnDef<User, string>[] = [\n * { accessorKey: 'name', header: 'Name' },\n * { accessorKey: 'email', header: 'Email' },\n * ]\n * <DataTable columns={columns} data={users} />\n *\n * @example\n * // Full-featured admin table with sorting, pagination, and selection:\n * <DataTable\n * columns={projectColumns}\n * data={projects}\n * sortable\n * paginated\n * pageSize={20}\n * selectable\n * onSelectionChange={(rows) => setSelectedProjects(rows)}\n * toolbar\n * />\n *\n * @example\n * // Virtualized table for large datasets (10k+ rows):\n * <DataTable\n * columns={logColumns}\n * data={allLogs}\n * virtualRows\n * virtualRowHeight={40}\n * maxHeight={500}\n * />\n *\n * @example\n * // Table with expandable rows for nested detail:\n * <DataTable\n * columns={orderColumns}\n * data={orders}\n * expandable\n * renderExpanded={(order) => <OrderLineItems items={order.lineItems} />}\n * />\n * // These are just a few ways — feel free to combine props creatively!\n */\n/**\n * A full-featured data table built on TanStack Table with sorting, filtering,\n * pagination, row selection, inline cell editing, expandable rows, column pinning,\n * a toolbar with density/export controls, and optional row virtualization.\n */\nexport interface DataTableProps<TData, TValue> {\n /** Column definitions passed to TanStack Table. */\n columns: ColumnDef<TData, TValue>[]\n /** Row data */\n data: TData[]\n /** Additional class name for the wrapper div */\n className?: string\n /** Text shown when the table has no rows */\n noResultsText?: string\n /** Enable column sorting (click headers to sort) */\n sortable?: boolean\n /** Enable per-column filter inputs below headers */\n filterable?: boolean\n /** Enable a global search input above the table */\n globalFilter?: boolean\n /** Enable pagination controls below the table */\n paginated?: boolean\n /** Number of rows per page when paginated (default 10) */\n pageSize?: number\n /** Options for the page size selector dropdown (default [10, 20, 50, 100]) */\n pageSizeOptions?: number[]\n /** Enable row selection with checkboxes */\n selectable?: boolean\n /** Callback when row selection changes */\n onSelectionChange?: (selectedRows: TData[]) => void\n /** Show toolbar above the table with column visibility, density, and export controls */\n toolbar?: boolean\n /** Row density — controls cell vertical padding */\n density?: Density\n /** Initial column pinning configuration */\n columnPinning?: { left?: string[]; right?: string[] }\n\n // --- Cell Editing ---\n /** Enable inline cell editing (double-click to edit) */\n editable?: boolean\n /** Callback when a cell value is edited */\n onCellEdit?: (rowIndex: number, columnId: string, value: unknown) => void\n\n // --- Row Expansion ---\n /** Enable expandable rows with detail panels */\n expandable?: boolean\n /** Render function for expanded row content */\n renderExpanded?: (row: TData) => React.ReactNode\n\n // --- Virtualization ---\n /** Enable row virtualization for large datasets */\n virtualRows?: boolean\n /** Height of each virtual row in pixels (default 48) */\n virtualRowHeight?: number\n /** Maximum height of the scrollable container in pixels (default 600) */\n maxHeight?: number\n\n // --- Server-side sorting ---\n /** Callback for server-side sorting. When provided, sorting is manual (no client-side sort). */\n onSort?: (key: string, direction: 'asc' | 'desc' | false) => void\n\n // --- Empty state ---\n /** Custom ReactNode to render when data is empty (replaces noResultsText) */\n emptyState?: React.ReactNode\n\n // --- Loading ---\n /** Show shimmer skeleton rows instead of data */\n loading?: boolean\n\n // --- Controlled selection ---\n /** Controlled set of selected row IDs — syncs internal selection state */\n selectedIds?: Set<string>\n /** Per-row filter to determine if a row is selectable */\n selectableFilter?: (row: TData) => boolean\n /** Custom row ID getter */\n getRowId?: (row: TData) => string\n\n // --- Server-side pagination ---\n /** Server-side pagination config. When provided, pagination is manual. */\n pagination?: {\n page: number\n pageSize: number\n total: number\n onPageChange: (page: number) => void\n }\n\n // --- Single-expand mode ---\n /** When true, only one row can be expanded at a time */\n singleExpand?: boolean\n\n // --- Sticky header ---\n /** When true, the table header sticks to the top on scroll */\n stickyHeader?: boolean\n\n // --- Row click ---\n /** Callback when a row is clicked (not fired from interactive elements) */\n onRowClick?: (row: TData) => void\n\n // --- Bulk actions ---\n /** Actions shown in a floating bar when rows are selected */\n bulkActions?: BulkAction<TData>[]\n\n // --- Mobile view ---\n /** Render rows as stacked cards on small screens (below sm breakpoint). Default 'table'. */\n mobileView?: 'card' | 'table'\n}\n\nexport function DataTable<TData, TValue>({\n columns,\n data,\n className,\n noResultsText,\n sortable = false,\n filterable = false,\n globalFilter = false,\n paginated = false,\n pageSize: initialPageSize,\n pageSizeOptions,\n selectable = false,\n onSelectionChange,\n toolbar = false,\n density: initialDensity = 'standard',\n columnPinning: initialColumnPinning,\n editable = false,\n onCellEdit,\n expandable = false,\n renderExpanded,\n virtualRows = false,\n virtualRowHeight = 48,\n maxHeight = 600,\n onSort,\n emptyState,\n loading = false,\n selectedIds,\n selectableFilter,\n getRowId: getRowIdProp,\n pagination: serverPagination,\n singleExpand = false,\n stickyHeader = false,\n onRowClick,\n bulkActions,\n mobileView = 'table',\n}: DataTableProps<TData, TValue>) {\n // Detect below-sm viewport (640px) for card mode — separate from useIsMobile (768px)\n const [isBelowSm, setIsBelowSm] = useState(false)\n useEffect(() => {\n const mql = window.matchMedia('(max-width: 639px)')\n const onChange = () => setIsBelowSm(mql.matches)\n mql.addEventListener('change', onChange)\n setIsBelowSm(mql.matches)\n return () => mql.removeEventListener('change', onChange)\n }, [])\n\n const showCards = mobileView === 'card' && isBelowSm\n\n const [sorting, setSorting] = useState<SortingState>([])\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([])\n const [globalFilterValue, setGlobalFilterValue] = useState('')\n const [paginationState, setPaginationState] = useState<PaginationState>({\n pageIndex: serverPagination ? serverPagination.page - 1 : 0,\n pageSize: serverPagination?.pageSize ?? initialPageSize ?? 10,\n })\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({})\n const [columnVisibility, setColumnVisibility] = useState<VisibilityState>({})\n const [columnPinningState, setColumnPinningState] =\n useState<ColumnPinningState>({\n left: initialColumnPinning?.left ?? [],\n right: initialColumnPinning?.right ?? [],\n })\n const [density, setDensity] = useState<Density>(initialDensity)\n const [editingCell, setEditingCell] = useState<EditingCell>(null)\n const [expanded, setExpanded] = useState<ExpandedState>({})\n\n // Ref for the virtual scroll container\n const scrollContainerRef = useRef<HTMLDivElement>(null)\n\n // Guard to prevent onSelectionChange firing when syncing from selectedIds prop\n const isSyncingFromPropRef = useRef(false)\n\n // Sync controlled selectedIds to internal rowSelection\n useEffect(() => {\n if (selectedIds) {\n isSyncingFromPropRef.current = true\n const newSelection: RowSelectionState = {}\n selectedIds.forEach((id) => {\n newSelection[id] = true\n })\n setRowSelection(newSelection)\n }\n }, [selectedIds])\n\n // Sync server pagination page to internal state\n useEffect(() => {\n if (serverPagination) {\n setPaginationState((prev) => ({\n ...prev,\n pageIndex: serverPagination.page - 1,\n pageSize: serverPagination.pageSize,\n }))\n }\n }, [serverPagination?.page, serverPagination?.pageSize]) // eslint-disable-line react-hooks/exhaustive-deps\n\n // Server-side sorting handler\n const handleSortingChange = useCallback(\n (updater: Updater<SortingState>) => {\n setSorting((prev) => {\n const next = typeof updater === 'function' ? updater(prev) : updater\n if (onSort) {\n if (next.length === 0 && prev.length > 0) {\n // Sorting cleared\n onSort(prev[0].id, false)\n } else if (next.length > 0) {\n onSort(next[0].id, next[0].desc ? 'desc' : 'asc')\n }\n }\n return next\n })\n },\n [onSort],\n )\n\n // Single-expand handler\n const handleExpandedChange = useCallback(\n (updater: Updater<ExpandedState>) => {\n setExpanded((prev) => {\n const next = typeof updater === 'function' ? updater(prev) : updater\n if (!singleExpand) return next\n // If next is boolean true (expand all), just use it\n if (next === true) return next\n if (typeof next !== 'object') return next\n // Determine which row was just toggled on\n const prevKeys = typeof prev === 'object' ? Object.keys(prev).filter((k) => (prev as Record<string, boolean>)[k]) : []\n const nextKeys = Object.keys(next).filter((k) => (next as Record<string, boolean>)[k])\n // Find newly expanded row\n const newlyExpanded = nextKeys.filter((k) => !prevKeys.includes(k))\n if (newlyExpanded.length > 0) {\n // Keep only the most recently expanded row\n return { [newlyExpanded[newlyExpanded.length - 1]]: true } as ExpandedState\n }\n // If no new rows, means a row was collapsed — return as-is\n return next\n })\n },\n [singleExpand],\n )\n\n // Stable ref for server pagination callback to avoid useCallback invalidation\n const onPageChangeRef = useRef(serverPagination?.onPageChange)\n useEffect(() => {\n onPageChangeRef.current = serverPagination?.onPageChange\n }, [serverPagination?.onPageChange])\n\n // Server-side pagination handler\n const handlePaginationChange = useCallback(\n (updater: Updater<PaginationState>) => {\n setPaginationState((prev) => {\n const next = typeof updater === 'function' ? updater(prev) : updater\n if (onPageChangeRef.current) {\n // Only call onPageChange if the page actually changed\n if (next.pageIndex !== prev.pageIndex) {\n onPageChangeRef.current(next.pageIndex + 1)\n }\n }\n return next\n })\n },\n [],\n )\n\n // Checkbox column prepended when selectable is enabled\n const selectColumn: ColumnDef<TData, unknown> = {\n id: '_select',\n header: ({ table: t }) => (\n <Checkbox\n size=\"sm\"\n checked={t.getIsAllPageRowsSelected()}\n indeterminate={t.getIsSomePageRowsSelected()}\n onCheckedChange={(v) => t.toggleAllPageRowsSelected(!!v)}\n aria-label=\"Select all rows\"\n />\n ),\n cell: ({ row }) => (\n <Checkbox\n size=\"sm\"\n checked={row.getIsSelected()}\n disabled={!row.getCanSelect()}\n onCheckedChange={(v) => row.toggleSelected(!!v)}\n aria-label=\"Select row\"\n />\n ),\n enableSorting: false,\n enableColumnFilter: false,\n enableHiding: false,\n }\n\n // Expand toggle column — aria-expanded lives on the BUTTON (not the row),\n // in a dedicated column with a visually-hidden header (Roselli expando spec).\n const expandColumn: ColumnDef<TData, unknown> = {\n id: '_expand',\n header: () => <span className=\"sr-only\">Expand rows</span>,\n cell: ({ row }) => (\n <button\n type=\"button\"\n onClick={() => row.toggleExpanded()}\n aria-expanded={row.getIsExpanded()}\n aria-label={row.getIsExpanded() ? 'Collapse row' : 'Expand row'}\n className=\"flex items-center justify-center p-ds-01 rounded-control-inner hover:bg-surface-raised-hover transition-colors\"\n >\n <Icon\n icon={IconChevronRight}\n size=\"sm\"\n className={cn(\n 'transition-transform duration-fast-02 ease-productive-standard',\n row.getIsExpanded() && 'rotate-90',\n )}\n />\n </button>\n ),\n enableSorting: false,\n enableColumnFilter: false,\n enableHiding: false,\n }\n\n // Assemble all columns in order: select?, expand?, ...user columns\n const allColumns = [\n ...(selectable ? [selectColumn] : []),\n ...(expandable ? [expandColumn] : []),\n ...columns,\n ]\n\n // Determine if using server-side pagination\n const useServerPagination = !!serverPagination\n const showPagination = paginated || useServerPagination\n\n // Build state object once — sorting and filtering contribute independently\n const tableState: Partial<TableState> = {\n columnVisibility,\n columnPinning: columnPinningState,\n }\n if (sortable) tableState.sorting = sorting\n if (filterable || globalFilter) {\n tableState.columnFilters = columnFilters\n tableState.globalFilter = globalFilterValue\n }\n if (showPagination) tableState.pagination = paginationState\n if (selectable) tableState.rowSelection = rowSelection\n if (expandable) tableState.expanded = expanded\n\n // Determine server-side sort mode\n const isServerSort = sortable && !!onSort\n\n const table = useReactTable({\n data,\n columns: allColumns,\n state: tableState,\n onColumnVisibilityChange: setColumnVisibility,\n onColumnPinningChange: setColumnPinningState,\n getCoreRowModel: getCoreRowModel(),\n ...(sortable && {\n onSortingChange: isServerSort ? handleSortingChange : setSorting,\n ...(isServerSort\n ? { manualSorting: true }\n : { getSortedRowModel: getSortedRowModel() }),\n }),\n ...((filterable || globalFilter) && {\n onColumnFiltersChange: setColumnFilters,\n onGlobalFilterChange: setGlobalFilterValue,\n getFilteredRowModel: getFilteredRowModel(),\n }),\n ...(showPagination && {\n onPaginationChange: useServerPagination\n ? handlePaginationChange\n : setPaginationState,\n ...(useServerPagination\n ? {\n manualPagination: true,\n pageCount: Math.ceil(\n serverPagination!.total / serverPagination!.pageSize,\n ),\n }\n : { getPaginationRowModel: getPaginationRowModel() }),\n }),\n ...(selectable && {\n onRowSelectionChange: setRowSelection,\n enableRowSelection: selectableFilter\n ? (row: Row<TData>) => selectableFilter(row.original)\n : true,\n }),\n ...(expandable && {\n onExpandedChange: singleExpand ? handleExpandedChange : setExpanded,\n getExpandedRowModel: getExpandedRowModel(),\n }),\n ...(getRowIdProp && {\n getRowId: (row: TData) => getRowIdProp(row),\n }),\n })\n\n // Stable refs to avoid effect re-fires from inline callbacks\n const onSelectionChangeRef = useRef(onSelectionChange)\n const getRowIdRef = useRef(getRowIdProp)\n useEffect(() => {\n onSelectionChangeRef.current = onSelectionChange\n getRowIdRef.current = getRowIdProp\n }, [onSelectionChange, getRowIdProp])\n\n // Fire selection callback when row selection changes (skip when syncing from prop)\n useEffect(() => {\n if (isSyncingFromPropRef.current) {\n isSyncingFromPropRef.current = false\n return\n }\n if (!onSelectionChangeRef.current) return\n const selectedRowIds = Object.keys(rowSelection).filter((k) => rowSelection[k])\n const selected = data.filter((_, i) => {\n const id = getRowIdRef.current ? getRowIdRef.current(data[i]) : String(i)\n return selectedRowIds.includes(id)\n })\n onSelectionChangeRef.current(selected)\n }, [rowSelection, data])\n\n const rows = table.getRowModel().rows\n\n // Virtualizer — always called but only active when virtualRows is true\n const virtualizer = useVirtualizer({\n count: virtualRows ? rows.length : 0,\n getScrollElement: () => scrollContainerRef.current,\n estimateSize: () => virtualRowHeight,\n overscan: 10,\n })\n\n // Number of skeleton rows for loading state\n const skeletonRowCount = serverPagination?.pageSize ?? initialPageSize ?? 5\n\n // Get selected rows for bulk actions (derived from rowSelection + data, not table instance)\n const selectedRows = useMemo(() => {\n if (!bulkActions || !selectable) return []\n const selectedRowIds = Object.keys(rowSelection).filter((k) => rowSelection[k])\n return data.filter((_, i) => {\n const id = getRowIdProp ? getRowIdProp(data[i]) : String(i)\n return selectedRowIds.includes(id)\n })\n }, [bulkActions, selectable, rowSelection, data, getRowIdProp])\n\n const hasSelectedRows = selectedRows.length > 0\n\n // Total rows for pagination display\n const totalRowCount = useServerPagination\n ? serverPagination!.total\n : table.getFilteredRowModel().rows.length\n\n // Build context value for sub-components\n const contextValue = useMemo(\n () => ({\n table,\n allColumns: allColumns.map((col) => ({\n id: (col as { id?: string }).id,\n header: (col as { header?: unknown }).header,\n })),\n columnPinningState,\n sortable,\n filterable,\n editable,\n expandable,\n virtualRows,\n selectable,\n mobileView,\n editingCell,\n setEditingCell,\n onCellEdit,\n renderExpanded,\n onRowClick,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n table,\n allColumns.length,\n columnPinningState,\n sortable,\n filterable,\n editable,\n expandable,\n virtualRows,\n selectable,\n mobileView,\n editingCell,\n onCellEdit,\n renderExpanded,\n onRowClick,\n ],\n )\n\n // Virtual items for body\n const virtualItems = virtualRows ? virtualizer.getVirtualItems() : undefined\n const totalVirtualSize = virtualRows ? virtualizer.getTotalSize() : undefined\n\n // Determine if we need a scroll wrapper for virtualization\n const tableContent = (\n <Table density={density} aria-busy={loading || undefined}>\n <DataTableHeader stickyHeader={stickyHeader} />\n <DataTableBody\n loading={loading}\n skeletonRowCount={skeletonRowCount}\n noResultsText={noResultsText}\n emptyState={emptyState}\n virtualItems={virtualItems}\n totalVirtualSize={totalVirtualSize}\n />\n </Table>\n )\n\n return (\n <DataTableProvider value={contextValue}>\n <div className={cn(className)}>\n {/* Toolbar */}\n {toolbar && (\n <DataTableToolbar\n table={table}\n globalFilter={globalFilter}\n globalFilterValue={globalFilterValue}\n onGlobalFilterChange={setGlobalFilterValue}\n density={density}\n onDensityChange={setDensity}\n />\n )}\n\n {/* Global search input — only show standalone when toolbar is disabled */}\n {globalFilter && !toolbar && (\n <div className=\"flex items-center gap-ds-03 pb-ds-04 border-b border-surface-border mb-ds-04\">\n <Icon icon={IconSearch} size=\"sm\" className=\"text-surface-fg-subtle\" />\n <input\n type=\"text\"\n value={globalFilterValue}\n onChange={(e) => setGlobalFilterValue(e.target.value)}\n placeholder=\"Search all columns...\"\n aria-label=\"Search all columns\"\n className={cn(\n 'flex-1 bg-transparent text-body-md',\n 'text-surface-fg placeholder:text-surface-fg-subtle',\n 'outline-hidden',\n )}\n />\n </div>\n )}\n\n {/* Card view on small screens, or standard table */}\n {showCards ? (\n <DataTableCards\n loading={loading}\n skeletonRowCount={skeletonRowCount}\n noResultsText={noResultsText}\n emptyState={emptyState}\n />\n ) : virtualRows ? (\n <div\n ref={scrollContainerRef}\n style={{ maxHeight: `${maxHeight}px`, overflowY: 'auto' }}\n >\n {tableContent}\n </div>\n ) : (\n tableContent\n )}\n\n {/* Pagination controls */}\n {showPagination && (\n <DataTablePagination\n table={table}\n totalRowCount={totalRowCount}\n useServerPagination={useServerPagination}\n pageSizeOptions={pageSizeOptions}\n />\n )}\n\n {/* Bulk action bar */}\n {bulkActions && selectable && hasSelectedRows && (\n <DataTableBulkActions\n table={table}\n selectedRows={selectedRows}\n bulkActions={bulkActions}\n />\n )}\n </div>\n </DataTableProvider>\n )\n}\nDataTable.displayName = 'DataTable'\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"data-table.js","names":[],"sources":["../../src/ui/data-table.tsx"],"sourcesContent":["'use client'\n\nimport { IconChevronRight, IconSearch } from '@tabler/icons-react'\nimport {\n type ColumnDef,\n type ColumnFiltersState,\n type ColumnPinningState,\n type ExpandedState,\n getCoreRowModel,\n getExpandedRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n type PaginationState,\n type Row,\n type RowData,\n type RowSelectionState,\n type SortingState,\n type TableState,\n type Updater,\n useReactTable,\n type VisibilityState,\n} from '@tanstack/react-table'\nimport { useVirtualizer } from '@tanstack/react-virtual'\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\nimport { Checkbox } from './checkbox'\nimport { DataTableBody } from './data-table-body'\nimport { type BulkAction,type BulkActionsPosition, DataTableBulkActions } from './data-table-bulk-actions'\nimport { DataTableCards } from './data-table-card'\nimport {\n DataTableProvider,\n type EditingCell,\n} from './data-table-context'\nimport { DataTableHeader } from './data-table-header'\nimport { DataTablePagination } from './data-table-pagination'\nimport { DataTableToolbar, type Density } from './data-table-toolbar'\nimport { Icon } from './icon'\nimport { cn } from './lib/utils'\nimport { Table } from './table'\n\n// Re-export public types so consumers' imports don't break\nexport type { BulkAction } from './data-table-bulk-actions'\n\ndeclare module '@tanstack/react-table' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface ColumnMeta<TData extends RowData, TValue> {\n align?: 'left' | 'center' | 'right'\n hideBelow?: 'sm' | 'md' | 'lg'\n }\n}\n\n/**\n * Props for DataTable — a feature-rich TanStack Table wrapper supporting sorting, filtering,\n * pagination, row selection, inline editing, row expansion, column pinning, and virtualization.\n *\n * All features are opt-in via boolean flags. The component manages its own internal state for\n * sorting, filtering, pagination, and selection — just pass `columns` and `data`.\n *\n * **Feature flags:** `sortable` | `filterable` | `globalFilter` | `paginated` | `selectable` |\n * `toolbar` | `editable` | `expandable` | `virtualRows`\n *\n * **Columns:** Use TanStack Table's `ColumnDef<TData, TValue>` type. Set\n * `meta: { enableEditing: false }` on a column to disable cell editing for that column.\n *\n * @example\n * // Minimal read-only table:\n * const columns: ColumnDef<User, string>[] = [\n * { accessorKey: 'name', header: 'Name' },\n * { accessorKey: 'email', header: 'Email' },\n * ]\n * <DataTable columns={columns} data={users} />\n *\n * @example\n * // Full-featured admin table with sorting, pagination, and selection:\n * <DataTable\n * columns={projectColumns}\n * data={projects}\n * sortable\n * paginated\n * pageSize={20}\n * selectable\n * onSelectionChange={(rows) => setSelectedProjects(rows)}\n * toolbar\n * />\n *\n * @example\n * // Virtualized table for large datasets (10k+ rows):\n * <DataTable\n * columns={logColumns}\n * data={allLogs}\n * virtualRows\n * virtualRowHeight={40}\n * maxHeight={500}\n * />\n *\n * @example\n * // Table with expandable rows for nested detail:\n * <DataTable\n * columns={orderColumns}\n * data={orders}\n * expandable\n * renderExpanded={(order) => <OrderLineItems items={order.lineItems} />}\n * />\n * // These are just a few ways — feel free to combine props creatively!\n */\n/**\n * A full-featured data table built on TanStack Table with sorting, filtering,\n * pagination, row selection, inline cell editing, expandable rows, column pinning,\n * a toolbar with density/export controls, and optional row virtualization.\n */\nexport interface DataTableProps<TData, TValue> {\n /** Column definitions passed to TanStack Table. */\n columns: ColumnDef<TData, TValue>[]\n /** Row data */\n data: TData[]\n /** Additional class name for the wrapper div */\n className?: string\n /** Text shown when the table has no rows */\n noResultsText?: string\n /** Enable column sorting (click headers to sort) */\n sortable?: boolean\n /** Enable per-column filter inputs below headers */\n filterable?: boolean\n /** Enable a global search input above the table */\n globalFilter?: boolean\n /** Enable pagination controls below the table */\n paginated?: boolean\n /** Number of rows per page when paginated (default 10) */\n pageSize?: number\n /** Options for the page size selector dropdown (default [10, 20, 50, 100]) */\n pageSizeOptions?: number[]\n /** Enable row selection with checkboxes */\n selectable?: boolean\n /**\n * Callback when row selection changes.\n * Second argument `selectedIds` is the set of selected row IDs — the natural\n * complement of the `selectedIds` controlled prop, so you never have to\n * re-derive them yourself.\n */\n onSelectionChange?: (selectedRows: TData[], selectedIds: Set<string>) => void\n /** Show toolbar above the table with column visibility, density, and export controls */\n toolbar?: boolean\n /** Row density — controls cell vertical padding */\n density?: Density\n /** Initial column pinning configuration */\n columnPinning?: { left?: string[]; right?: string[] }\n\n // --- Cell Editing ---\n /** Enable inline cell editing (double-click to edit) */\n editable?: boolean\n /** Callback when a cell value is edited */\n onCellEdit?: (rowIndex: number, columnId: string, value: unknown) => void\n\n // --- Row Expansion ---\n /** Enable expandable rows with detail panels */\n expandable?: boolean\n /** Render function for expanded row content */\n renderExpanded?: (row: TData) => React.ReactNode\n\n // --- Virtualization ---\n /** Enable row virtualization for large datasets */\n virtualRows?: boolean\n /**\n * Estimated height of each virtual row in pixels (default 48). Real heights are\n * measured after mount, so this only has to be close — it decides the initial\n * scroll extent and how many rows render before the first measurement pass.\n */\n virtualRowHeight?: number\n /** Maximum height of the scrollable container in pixels (default 600) */\n maxHeight?: number\n\n // --- Server-side sorting ---\n /** Callback for server-side sorting. When provided, sorting is manual (no client-side sort). */\n onSort?: (key: string, direction: 'asc' | 'desc' | false) => void\n\n // --- Empty state ---\n /** Custom ReactNode to render when data is empty (replaces noResultsText) */\n emptyState?: React.ReactNode\n\n // --- Loading ---\n /** Show shimmer skeleton rows instead of data */\n loading?: boolean\n\n // --- Controlled selection ---\n /** Controlled set of selected row IDs — syncs internal selection state */\n selectedIds?: Set<string>\n /** Per-row filter to determine if a row is selectable */\n selectableFilter?: (row: TData) => boolean\n /** Custom row ID getter */\n getRowId?: (row: TData) => string\n\n // --- Server-side pagination ---\n /** Server-side pagination config. When provided, pagination is manual. */\n pagination?: {\n page: number\n pageSize: number\n total: number\n onPageChange: (page: number) => void\n }\n\n // --- Single-expand mode ---\n /** When true, only one row can be expanded at a time */\n singleExpand?: boolean\n\n // --- Sticky header ---\n /** When true, the table header sticks to the top on scroll */\n stickyHeader?: boolean\n\n // --- Row click ---\n /** Callback when a row is clicked (not fired from interactive elements) */\n onRowClick?: (row: TData) => void\n\n // --- Bulk actions ---\n /** Actions shown in a floating bar when rows are selected */\n bulkActions?: BulkAction<TData>[]\n /** Where the bulk-actions bar renders. @default 'bottom' */\n bulkActionsPosition?: BulkActionsPosition\n\n // --- Mobile view ---\n /** Render rows as stacked cards on small screens (below sm breakpoint). Default 'table'. */\n mobileView?: 'card' | 'table'\n\n // --- Toolbar export ---\n /**\n * Whether to show the Export CSV button in the toolbar. Defaults to `true`\n * (the button has always rendered whenever `toolbar` is on). Pass `false` to\n * hide it — worth doing with server-side `pagination`, where the built-in CSV\n * export can only see the current page's rows; `onExport` is the other answer\n * there, since it lets you fetch the full set yourself.\n */\n enableExport?: boolean\n /**\n * Override the default client-side CSV export. Receives the currently visible\n * (filtered) rows so you can trigger a server-side full export or apply custom\n * formatting. When provided, the built-in CSV logic is skipped entirely.\n */\n onExport?: (visibleRows: TData[]) => void\n\n // --- Per-column filter control ---\n /**\n * Restrict filter inputs to specific column IDs. Only effective when\n * `filterable` is true. When omitted, all columns without\n * `enableColumnFilter: false` in their `ColumnDef` get a filter input\n * (existing behaviour). When provided, only the listed columns get inputs.\n *\n * @example\n * // Show filter inputs only for name and email columns\n * <DataTable filterable filterableColumns={['name', 'email']} />\n */\n filterableColumns?: string[]\n\n // --- Conditional row styling ---\n /**\n * Return a className string for a given row — applied to the `<tr>` in table\n * layout and to the `Card` in `mobileView=\"card\"` layout.\n *\n * The return value is passed through `cn()` verbatim, so an invented class\n * silently does nothing. Use real token steps (`bg-error-3`, `bg-warning-3`).\n *\n * @example\n * rowClassName={(row) => row.status === 'overdue' ? 'bg-error-3' : undefined}\n */\n rowClassName?: (row: TData) => string | undefined\n}\n\nexport function DataTable<TData, TValue>({\n columns,\n data,\n className,\n noResultsText,\n sortable = false,\n filterable = false,\n globalFilter = false,\n paginated = false,\n pageSize: initialPageSize,\n pageSizeOptions,\n selectable = false,\n onSelectionChange,\n toolbar = false,\n density: initialDensity = 'standard',\n columnPinning: initialColumnPinning,\n editable = false,\n onCellEdit,\n expandable = false,\n renderExpanded,\n virtualRows = false,\n virtualRowHeight = 48,\n maxHeight = 600,\n onSort,\n emptyState,\n loading = false,\n selectedIds,\n selectableFilter,\n getRowId: getRowIdProp,\n pagination: serverPagination,\n singleExpand = false,\n stickyHeader = false,\n onRowClick,\n bulkActions,\n bulkActionsPosition = 'bottom',\n mobileView = 'table',\n enableExport,\n onExport,\n filterableColumns,\n rowClassName,\n}: DataTableProps<TData, TValue>) {\n // Detect below-sm viewport (640px) for card mode — separate from useIsMobile (768px)\n const [isBelowSm, setIsBelowSm] = useState(false)\n useEffect(() => {\n const mql = window.matchMedia('(max-width: 639px)')\n const onChange = () => setIsBelowSm(mql.matches)\n mql.addEventListener('change', onChange)\n setIsBelowSm(mql.matches)\n return () => mql.removeEventListener('change', onChange)\n }, [])\n\n const showCards = mobileView === 'card' && isBelowSm\n\n const [sorting, setSorting] = useState<SortingState>([])\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([])\n const [globalFilterValue, setGlobalFilterValue] = useState('')\n const [paginationState, setPaginationState] = useState<PaginationState>({\n pageIndex: serverPagination ? serverPagination.page - 1 : 0,\n pageSize: serverPagination?.pageSize ?? initialPageSize ?? 10,\n })\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({})\n const [columnVisibility, setColumnVisibility] = useState<VisibilityState>({})\n const [columnPinningState, setColumnPinningState] =\n useState<ColumnPinningState>({\n left: initialColumnPinning?.left ?? [],\n right: initialColumnPinning?.right ?? [],\n })\n const [density, setDensity] = useState<Density>(initialDensity)\n const [editingCell, setEditingCell] = useState<EditingCell>(null)\n const [expanded, setExpanded] = useState<ExpandedState>({})\n\n // Ref for the virtual scroll container\n const scrollContainerRef = useRef<HTMLDivElement>(null)\n\n // Guard to prevent onSelectionChange firing when syncing from selectedIds prop\n const isSyncingFromPropRef = useRef(false)\n // Guard to prevent onSelectionChange firing on mount (initial empty selection)\n const isFirstRenderRef = useRef(true)\n\n // Sync controlled selectedIds to internal rowSelection\n useEffect(() => {\n if (selectedIds) {\n isSyncingFromPropRef.current = true\n const newSelection: RowSelectionState = {}\n selectedIds.forEach((id) => {\n newSelection[id] = true\n })\n setRowSelection(newSelection)\n }\n }, [selectedIds])\n\n // Sync server pagination page to internal state\n useEffect(() => {\n if (serverPagination) {\n setPaginationState((prev) => ({\n ...prev,\n pageIndex: serverPagination.page - 1,\n pageSize: serverPagination.pageSize,\n }))\n }\n }, [serverPagination?.page, serverPagination?.pageSize]) // eslint-disable-line react-hooks/exhaustive-deps\n\n // Server-side sorting handler\n const handleSortingChange = useCallback(\n (updater: Updater<SortingState>) => {\n setSorting((prev) => {\n const next = typeof updater === 'function' ? updater(prev) : updater\n if (onSort) {\n if (next.length === 0 && prev.length > 0) {\n // Sorting cleared\n onSort(prev[0].id, false)\n } else if (next.length > 0) {\n onSort(next[0].id, next[0].desc ? 'desc' : 'asc')\n }\n }\n return next\n })\n },\n [onSort],\n )\n\n // Single-expand handler\n const handleExpandedChange = useCallback(\n (updater: Updater<ExpandedState>) => {\n setExpanded((prev) => {\n const next = typeof updater === 'function' ? updater(prev) : updater\n if (!singleExpand) return next\n // If next is boolean true (expand all), just use it\n if (next === true) return next\n if (typeof next !== 'object') return next\n // Determine which row was just toggled on\n const prevKeys = typeof prev === 'object' ? Object.keys(prev).filter((k) => (prev as Record<string, boolean>)[k]) : []\n const nextKeys = Object.keys(next).filter((k) => (next as Record<string, boolean>)[k])\n // Find newly expanded row\n const newlyExpanded = nextKeys.filter((k) => !prevKeys.includes(k))\n if (newlyExpanded.length > 0) {\n // Keep only the most recently expanded row\n return { [newlyExpanded[newlyExpanded.length - 1]]: true } as ExpandedState\n }\n // If no new rows, means a row was collapsed — return as-is\n return next\n })\n },\n [singleExpand],\n )\n\n // Stable ref for server pagination callback to avoid useCallback invalidation\n const onPageChangeRef = useRef(serverPagination?.onPageChange)\n useEffect(() => {\n onPageChangeRef.current = serverPagination?.onPageChange\n }, [serverPagination?.onPageChange])\n\n // Server-side pagination handler\n const handlePaginationChange = useCallback(\n (updater: Updater<PaginationState>) => {\n setPaginationState((prev) => {\n const next = typeof updater === 'function' ? updater(prev) : updater\n if (onPageChangeRef.current) {\n // Only call onPageChange if the page actually changed\n if (next.pageIndex !== prev.pageIndex) {\n onPageChangeRef.current(next.pageIndex + 1)\n }\n }\n return next\n })\n },\n [],\n )\n\n // Checkbox column prepended when selectable is enabled\n const selectColumn: ColumnDef<TData, unknown> = {\n id: '_select',\n header: ({ table: t }) => (\n <Checkbox\n size=\"sm\"\n checked={t.getIsAllPageRowsSelected()}\n indeterminate={t.getIsSomePageRowsSelected()}\n onCheckedChange={(v) => t.toggleAllPageRowsSelected(!!v)}\n aria-label=\"Select all rows\"\n />\n ),\n cell: ({ row }) => (\n <Checkbox\n size=\"sm\"\n checked={row.getIsSelected()}\n disabled={!row.getCanSelect()}\n onCheckedChange={(v) => row.toggleSelected(!!v)}\n aria-label=\"Select row\"\n />\n ),\n enableSorting: false,\n enableColumnFilter: false,\n enableHiding: false,\n }\n\n // Expand toggle column — aria-expanded lives on the BUTTON (not the row),\n // in a dedicated column with a visually-hidden header (Roselli expando spec).\n const expandColumn: ColumnDef<TData, unknown> = {\n id: '_expand',\n header: () => <span className=\"sr-only\">Expand rows</span>,\n cell: ({ row }) => (\n <button\n type=\"button\"\n onClick={() => row.toggleExpanded()}\n aria-expanded={row.getIsExpanded()}\n aria-label={row.getIsExpanded() ? 'Collapse row' : 'Expand row'}\n className=\"flex items-center justify-center p-ds-01 rounded-control-inner hover:bg-surface-panel-hover transition-colors\"\n >\n <Icon\n icon={IconChevronRight}\n size=\"sm\"\n className={cn(\n 'transition-transform duration-fast-02 ease-productive-standard',\n row.getIsExpanded() && 'rotate-90',\n )}\n />\n </button>\n ),\n enableSorting: false,\n enableColumnFilter: false,\n enableHiding: false,\n }\n\n // Assemble all columns in order: select?, expand?, ...user columns\n const allColumns = [\n ...(selectable ? [selectColumn] : []),\n ...(expandable ? [expandColumn] : []),\n ...columns,\n ]\n\n // Determine if using server-side pagination\n const useServerPagination = !!serverPagination\n const showPagination = paginated || useServerPagination\n\n // Build state object once — sorting and filtering contribute independently\n const tableState: Partial<TableState> = {\n columnVisibility,\n columnPinning: columnPinningState,\n }\n if (sortable) tableState.sorting = sorting\n if (filterable || globalFilter) {\n tableState.columnFilters = columnFilters\n tableState.globalFilter = globalFilterValue\n }\n if (showPagination) tableState.pagination = paginationState\n if (selectable) tableState.rowSelection = rowSelection\n if (expandable) tableState.expanded = expanded\n\n // Determine server-side sort mode\n const isServerSort = sortable && !!onSort\n\n const table = useReactTable({\n data,\n columns: allColumns,\n state: tableState,\n onColumnVisibilityChange: setColumnVisibility,\n onColumnPinningChange: setColumnPinningState,\n getCoreRowModel: getCoreRowModel(),\n ...(sortable && {\n onSortingChange: isServerSort ? handleSortingChange : setSorting,\n ...(isServerSort\n ? { manualSorting: true }\n : { getSortedRowModel: getSortedRowModel() }),\n }),\n ...((filterable || globalFilter) && {\n onColumnFiltersChange: setColumnFilters,\n onGlobalFilterChange: setGlobalFilterValue,\n getFilteredRowModel: getFilteredRowModel(),\n }),\n ...(showPagination && {\n onPaginationChange: useServerPagination\n ? handlePaginationChange\n : setPaginationState,\n ...(useServerPagination\n ? {\n manualPagination: true,\n pageCount: Math.ceil(\n serverPagination!.total / serverPagination!.pageSize,\n ),\n }\n : { getPaginationRowModel: getPaginationRowModel() }),\n }),\n ...(selectable && {\n onRowSelectionChange: setRowSelection,\n enableRowSelection: selectableFilter\n ? (row: Row<TData>) => selectableFilter(row.original)\n : true,\n }),\n ...(expandable && {\n onExpandedChange: singleExpand ? handleExpandedChange : setExpanded,\n getExpandedRowModel: getExpandedRowModel(),\n }),\n ...(getRowIdProp && {\n getRowId: (row: TData) => getRowIdProp(row),\n }),\n })\n\n // Stable refs to avoid effect re-fires from inline callbacks\n const onSelectionChangeRef = useRef(onSelectionChange)\n const getRowIdRef = useRef(getRowIdProp)\n useEffect(() => {\n onSelectionChangeRef.current = onSelectionChange\n getRowIdRef.current = getRowIdProp\n }, [onSelectionChange, getRowIdProp])\n\n // Fire selection callback when row selection changes (skip on mount and when syncing from prop)\n useEffect(() => {\n // Skip the very first render — rowSelection starts as {} and firing here\n // would send an empty array to every handler on mount, causing spurious\n // refetches, query invalidations, and route refreshes in real apps.\n if (isFirstRenderRef.current) {\n isFirstRenderRef.current = false\n return\n }\n if (isSyncingFromPropRef.current) {\n isSyncingFromPropRef.current = false\n return\n }\n if (!onSelectionChangeRef.current) return\n const selectedRowIds = Object.keys(rowSelection).filter((k) => rowSelection[k])\n const selected = data.filter((_, i) => {\n const id = getRowIdRef.current ? getRowIdRef.current(data[i]) : String(i)\n return selectedRowIds.includes(id)\n })\n // Pass selected IDs as second arg — the natural complement of the `selectedIds`\n // controlled prop so consumers never have to re-derive them.\n onSelectionChangeRef.current(selected, new Set(selectedRowIds))\n }, [rowSelection, data])\n\n const rows = table.getRowModel().rows\n\n // Virtualizer — always called but only active when virtualRows is true.\n // `virtualRowHeight` is only the ESTIMATE: each rendered row group carries\n // `virtualizer.measureElement` as its ref, so real heights (including an\n // expanded row's detail panel) are measured and folded into `getTotalSize()`.\n // Without that, an expanded panel and the row after it resolve to the same\n // offset and paint on top of each other.\n const virtualizer = useVirtualizer<HTMLDivElement, HTMLTableSectionElement>({\n count: virtualRows ? rows.length : 0,\n getScrollElement: () => scrollContainerRef.current,\n estimateSize: () => virtualRowHeight,\n overscan: 10,\n })\n\n // Number of skeleton rows for loading state\n const skeletonRowCount = serverPagination?.pageSize ?? initialPageSize ?? 5\n\n // Get selected rows for bulk actions (derived from rowSelection + data, not table instance)\n const selectedRows = useMemo(() => {\n if (!bulkActions || !selectable) return []\n const selectedRowIds = Object.keys(rowSelection).filter((k) => rowSelection[k])\n return data.filter((_, i) => {\n const id = getRowIdProp ? getRowIdProp(data[i]) : String(i)\n return selectedRowIds.includes(id)\n })\n }, [bulkActions, selectable, rowSelection, data, getRowIdProp])\n\n const hasSelectedRows = selectedRows.length > 0\n\n // Total rows for pagination display\n const totalRowCount = useServerPagination\n ? serverPagination!.total\n : table.getFilteredRowModel().rows.length\n\n // Build context value for sub-components\n const contextValue = useMemo(\n () => ({\n table,\n allColumns: allColumns.map((col) => ({\n id: (col as { id?: string }).id,\n header: (col as { header?: unknown }).header,\n })),\n columnPinningState,\n sortable,\n filterable,\n filterableColumns,\n editable,\n expandable,\n virtualRows,\n selectable,\n mobileView,\n editingCell,\n setEditingCell,\n onCellEdit,\n renderExpanded,\n onRowClick,\n rowClassName,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n table,\n allColumns.length,\n columnPinningState,\n sortable,\n filterable,\n filterableColumns,\n editable,\n expandable,\n virtualRows,\n selectable,\n mobileView,\n editingCell,\n onCellEdit,\n renderExpanded,\n onRowClick,\n rowClassName,\n ],\n )\n\n // Virtual items for body\n const virtualItems = virtualRows ? virtualizer.getVirtualItems() : undefined\n const totalVirtualSize = virtualRows ? virtualizer.getTotalSize() : undefined\n const measureRow = virtualizer.measureElement\n\n // Determine if we need a scroll wrapper for virtualization\n const tableContent = (\n <Table density={density} aria-busy={loading || undefined}>\n <DataTableHeader stickyHeader={stickyHeader} />\n <DataTableBody\n loading={loading}\n skeletonRowCount={skeletonRowCount}\n noResultsText={noResultsText}\n emptyState={emptyState}\n virtualItems={virtualItems}\n totalVirtualSize={totalVirtualSize}\n measureRow={measureRow}\n />\n </Table>\n )\n\n return (\n <DataTableProvider value={contextValue}>\n <div className={cn(className)}>\n {/* Toolbar */}\n {toolbar && (\n <DataTableToolbar\n table={table}\n globalFilter={globalFilter}\n globalFilterValue={globalFilterValue}\n onGlobalFilterChange={setGlobalFilterValue}\n density={density}\n onDensityChange={setDensity}\n // Defaults to true — the Export button has shipped unconditionally\n // since the toolbar existed, so defaulting it off (even only for\n // server pagination) would silently delete a live affordance from\n // every consumer on upgrade. Opt out with enableExport={false}.\n enableExport={enableExport ?? true}\n onExport={onExport}\n />\n )}\n\n {/* Global search input — only show standalone when toolbar is disabled */}\n {globalFilter && !toolbar && (\n <div className=\"flex items-center gap-ds-03 pb-ds-04 border-b border-surface-border mb-ds-04\">\n <Icon icon={IconSearch} size=\"sm\" className=\"text-surface-fg-subtle\" />\n <input\n type=\"text\"\n value={globalFilterValue}\n onChange={(e) => setGlobalFilterValue(e.target.value)}\n placeholder=\"Search all columns...\"\n aria-label=\"Search all columns\"\n className={cn(\n 'flex-1 bg-transparent text-body-md',\n 'text-surface-fg placeholder:text-surface-fg-subtle',\n 'outline-hidden',\n )}\n />\n </div>\n )}\n\n {/* Card view on small screens, or standard table */}\n {showCards ? (\n <DataTableCards\n loading={loading}\n skeletonRowCount={skeletonRowCount}\n noResultsText={noResultsText}\n emptyState={emptyState}\n />\n ) : virtualRows ? (\n <div\n ref={scrollContainerRef}\n style={{ maxHeight: `${maxHeight}px`, overflowY: 'auto' }}\n >\n {tableContent}\n </div>\n ) : (\n tableContent\n )}\n\n {/* Pagination controls */}\n {showPagination && (\n <DataTablePagination\n table={table}\n totalRowCount={totalRowCount}\n useServerPagination={useServerPagination}\n pageSizeOptions={pageSizeOptions}\n />\n )}\n\n {/* Bulk action bar */}\n {bulkActions && selectable && hasSelectedRows && (\n <DataTableBulkActions\n table={table}\n selectedRows={selectedRows}\n bulkActions={bulkActions}\n position={bulkActionsPosition}\n />\n )}\n </div>\n </DataTableProvider>\n )\n}\nDataTable.displayName = 'DataTable'\n"],"mappings":"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"}
|
package/dist/ui/dialog.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dialog.d.ts","sourceRoot":"","sources":["../../src/ui/dialog.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,eAAe,MAAM,0BAA0B,CAAA;AAG3D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"dialog.d.ts","sourceRoot":"","sources":["../../src/ui/dialog.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,eAAe,MAAM,0BAA0B,CAAA;AAG3D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAe9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,QAAA,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,CAejF,CAAA;AAGD,QAAA,MAAM,aAAa,8GAA0B,CAAA;AAE7C,QAAA,MAAM,YAAY,6CAAyB,CAAA;AAE3C,QAAA,MAAM,WAAW,4GAAwB,CAAA;AAEzC,QAAA,MAAM,aAAa,8JAajB,CAAA;AAGF,UAAU,kBAAmB,SAAQ,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,OAAO,CAAC;IACjG,+GAA+G;IAC/G,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,QAAA,MAAM,aAAa,2FAuDjB,CAAA;AAGF;;;;;GAKG;AACH,QAAA,MAAM,gBAAgB,8JASpB,CAAA;AAGF,QAAA,MAAM,YAAY,6GAWjB,CAAA;AAGD,QAAA,MAAM,YAAY,6GAWjB,CAAA;AAGD,QAAA,MAAM,WAAW,oKAYf,CAAA;AAGF,QAAA,MAAM,iBAAiB,8KASrB,CAAA;AAGF,YAAY,EAAE,kBAAkB,EAAE,CAAA;AAClC,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,CAAA;AAE3F,OAAO,EACL,MAAM,EACN,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACX,aAAa,GACd,CAAA"}
|