tembro 1.0.3 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/components/data-table/data-table.cjs +1 -1
- package/dist/components/data-table/data-table.js +68 -68
- package/dist/components/display/smart-card.d.ts +8 -8
- package/dist/components/patterns/index.cjs +1 -1
- package/dist/components/patterns/index.js +4 -4
- package/dist/components/patterns/public.cjs +1 -1
- package/dist/components/patterns/public.js +4 -4
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +19 -38
- package/dist/showcase/index.cjs +1 -1
- package/dist/showcase/index.d.ts +0 -1
- package/dist/showcase/index.js +36 -38
- package/dist/showcase/package-meta.cjs +1 -1
- package/dist/showcase/package-meta.d.ts +2 -2
- package/dist/showcase/package-meta.js +1 -1
- package/dist/showcase/premium/accordion/mock.cjs +4 -4
- package/dist/showcase/premium/accordion/mock.js +1 -1
- package/dist/showcase/{families/data-table/types.d.ts → premium/data-table-parts/data.d.ts} +4 -0
- package/dist/showcase/{families/data-table → premium/data-table-parts}/data.js +1 -1
- package/dist/showcase/premium/data-table-parts/showcase.cjs +1 -1
- package/dist/showcase/premium/data-table-parts/showcase.js +1 -1
- package/dist/showcase/site-data.cjs +1 -1
- package/dist/showcase/site-data.d.ts +6 -6
- package/dist/showcase/site-data.js +414 -451
- package/dist/showcase/tembro-registry.json.cjs +1 -1
- package/dist/showcase/tembro-registry.json.js +1 -1
- package/package.json +2 -13
- package/packages/cli/dist/index.cjs +17 -17
- package/packages/cli/vendor/src/components/data-table/data-table.tsx +22 -13
- package/packages/cli/vendor/src/components/display/smart-card.tsx +8 -8
- package/packages/cli/vendor/src/index.ts +3 -4
- package/packages/cli/vendor/src/showcase/index.ts +5 -6
- package/packages/cli/vendor/src/showcase/package-meta.ts +1 -1
- package/packages/cli/vendor/src/showcase/premium/accordion/mock.ts +4 -4
- package/packages/cli/vendor/src/showcase/{families/data-table → premium/data-table-parts}/data.ts +25 -1
- package/packages/cli/vendor/src/showcase/premium/data-table-parts/showcase.tsx +1 -2
- package/packages/cli/vendor/src/showcase/site-data.tsx +151 -216
- package/packages/cli/vendor/src/showcase/tembro-registry.json +1 -1
- package/registry.json +1 -1
- package/dist/families/badge-family.cjs +0 -1
- package/dist/families/badge-family.d.ts +0 -5
- package/dist/families/badge-family.js +0 -5
- package/dist/families/card-family.cjs +0 -1
- package/dist/families/card-family.d.ts +0 -16
- package/dist/families/card-family.js +0 -21
- package/dist/families/catalog.cjs +0 -1
- package/dist/families/catalog.d.ts +0 -11
- package/dist/families/catalog.js +0 -140
- package/dist/families/data-table-family.cjs +0 -1
- package/dist/families/data-table-family.d.ts +0 -18
- package/dist/families/data-table-family.js +0 -29
- package/dist/families/docs-adoption.cjs +0 -1
- package/dist/families/docs-adoption.d.ts +0 -16
- package/dist/families/docs-adoption.js +0 -53
- package/dist/families/docs-groups.cjs +0 -1
- package/dist/families/docs-groups.d.ts +0 -18
- package/dist/families/docs-groups.js +0 -262
- package/dist/families/docs-queries.cjs +0 -1
- package/dist/families/docs-queries.d.ts +0 -37
- package/dist/families/docs-queries.js +0 -50
- package/dist/families/docs-routing.cjs +0 -1
- package/dist/families/docs-routing.d.ts +0 -17
- package/dist/families/docs-routing.js +0 -49
- package/dist/families/form-family.cjs +0 -1
- package/dist/families/form-family.d.ts +0 -20
- package/dist/families/form-family.js +0 -35
- package/dist/families/index.cjs +0 -1
- package/dist/families/index.d.ts +0 -19
- package/dist/families/index.js +0 -20
- package/dist/families/input-family.cjs +0 -1
- package/dist/families/input-family.d.ts +0 -32
- package/dist/families/input-family.js +0 -56
- package/dist/families/member-metadata.cjs +0 -1
- package/dist/families/member-metadata.d.ts +0 -11
- package/dist/families/member-metadata.js +0 -1013
- package/dist/families/member-queries.cjs +0 -1
- package/dist/families/member-queries.d.ts +0 -6
- package/dist/families/member-queries.js +0 -14
- package/dist/families/member-snippet-queries.cjs +0 -1
- package/dist/families/member-snippet-queries.d.ts +0 -8
- package/dist/families/member-snippet-queries.js +0 -30
- package/dist/families/member-snippets.cjs +0 -484
- package/dist/families/member-snippets.d.ts +0 -11
- package/dist/families/member-snippets.js +0 -1061
- package/dist/families/migration-map.cjs +0 -1
- package/dist/families/migration-map.d.ts +0 -10
- package/dist/families/migration-map.js +0 -787
- package/dist/families/overlay-family.cjs +0 -1
- package/dist/families/overlay-family.d.ts +0 -22
- package/dist/families/overlay-family.js +0 -29
- package/dist/families/public-surface-rationalization.cjs +0 -1
- package/dist/families/public-surface-rationalization.d.ts +0 -169
- package/dist/families/public-surface-rationalization.js +0 -296
- package/dist/families/queries.cjs +0 -1
- package/dist/families/queries.d.ts +0 -12
- package/dist/families/queries.js +0 -162
- package/dist/families/select-family.cjs +0 -1
- package/dist/families/select-family.d.ts +0 -22
- package/dist/families/select-family.js +0 -27
- package/dist/families/views.cjs +0 -1
- package/dist/families/views.d.ts +0 -26
- package/dist/families/views.js +0 -45
- package/dist/showcase/families/actions/index.cjs +0 -1
- package/dist/showcase/families/actions/index.d.ts +0 -2
- package/dist/showcase/families/actions/index.js +0 -3
- package/dist/showcase/families/actions/mock.cjs +0 -5
- package/dist/showcase/families/actions/mock.d.ts +0 -2
- package/dist/showcase/families/actions/mock.js +0 -40
- package/dist/showcase/families/actions/showcase.cjs +0 -1
- package/dist/showcase/families/actions/showcase.d.ts +0 -2
- package/dist/showcase/families/actions/showcase.js +0 -53
- package/dist/showcase/families/calendar/index.cjs +0 -1
- package/dist/showcase/families/calendar/index.d.ts +0 -2
- package/dist/showcase/families/calendar/index.js +0 -3
- package/dist/showcase/families/calendar/mock.cjs +0 -5
- package/dist/showcase/families/calendar/mock.d.ts +0 -2
- package/dist/showcase/families/calendar/mock.js +0 -40
- package/dist/showcase/families/calendar/showcase.cjs +0 -1
- package/dist/showcase/families/calendar/showcase.d.ts +0 -2
- package/dist/showcase/families/calendar/showcase.js +0 -60
- package/dist/showcase/families/command/index.cjs +0 -1
- package/dist/showcase/families/command/index.d.ts +0 -2
- package/dist/showcase/families/command/index.js +0 -3
- package/dist/showcase/families/command/mock.cjs +0 -5
- package/dist/showcase/families/command/mock.d.ts +0 -2
- package/dist/showcase/families/command/mock.js +0 -40
- package/dist/showcase/families/command/showcase.cjs +0 -1
- package/dist/showcase/families/command/showcase.d.ts +0 -2
- package/dist/showcase/families/command/showcase.js +0 -40
- package/dist/showcase/families/data-table/data.d.ts +0 -5
- package/dist/showcase/families/data-table/index.cjs +0 -1
- package/dist/showcase/families/data-table/index.d.ts +0 -4
- package/dist/showcase/families/data-table/index.js +0 -4
- package/dist/showcase/families/data-table/mock.cjs +0 -24
- package/dist/showcase/families/data-table/mock.d.ts +0 -2
- package/dist/showcase/families/data-table/mock.js +0 -48
- package/dist/showcase/families/data-table/showcase.cjs +0 -1
- package/dist/showcase/families/data-table/showcase.d.ts +0 -3
- package/dist/showcase/families/data-table/showcase.js +0 -751
- package/dist/showcase/families/data-table/types.cjs +0 -1
- package/dist/showcase/families/data-table/types.js +0 -0
- package/dist/showcase/families/display/data.cjs +0 -1
- package/dist/showcase/families/display/data.d.ts +0 -6
- package/dist/showcase/families/display/data.js +0 -24
- package/dist/showcase/families/display/index.cjs +0 -1
- package/dist/showcase/families/display/index.d.ts +0 -2
- package/dist/showcase/families/display/index.js +0 -3
- package/dist/showcase/families/display/mock.cjs +0 -5
- package/dist/showcase/families/display/mock.d.ts +0 -2
- package/dist/showcase/families/display/mock.js +0 -40
- package/dist/showcase/families/display/showcase.cjs +0 -1
- package/dist/showcase/families/display/showcase.d.ts +0 -2
- package/dist/showcase/families/display/showcase.js +0 -201
- package/dist/showcase/families/filters/data.cjs +0 -1
- package/dist/showcase/families/filters/data.d.ts +0 -31
- package/dist/showcase/families/filters/data.js +0 -61
- package/dist/showcase/families/filters/index.cjs +0 -1
- package/dist/showcase/families/filters/index.d.ts +0 -2
- package/dist/showcase/families/filters/index.js +0 -3
- package/dist/showcase/families/filters/mock.cjs +0 -5
- package/dist/showcase/families/filters/mock.d.ts +0 -2
- package/dist/showcase/families/filters/mock.js +0 -40
- package/dist/showcase/families/filters/showcase.cjs +0 -1
- package/dist/showcase/families/filters/showcase.d.ts +0 -3
- package/dist/showcase/families/filters/showcase.js +0 -213
- package/dist/showcase/families/form/data.cjs +0 -1
- package/dist/showcase/families/form/data.d.ts +0 -22
- package/dist/showcase/families/form/data.js +0 -53
- package/dist/showcase/families/form/index.cjs +0 -1
- package/dist/showcase/families/form/index.d.ts +0 -4
- package/dist/showcase/families/form/index.js +0 -4
- package/dist/showcase/families/form/mock.cjs +0 -12
- package/dist/showcase/families/form/mock.d.ts +0 -2
- package/dist/showcase/families/form/mock.js +0 -40
- package/dist/showcase/families/form/showcase.cjs +0 -1
- package/dist/showcase/families/form/showcase.d.ts +0 -3
- package/dist/showcase/families/form/showcase.js +0 -318
- package/dist/showcase/families/form/types.cjs +0 -1
- package/dist/showcase/families/form/types.d.ts +0 -9
- package/dist/showcase/families/form/types.js +0 -0
- package/dist/showcase/families/index.cjs +0 -1
- package/dist/showcase/families/index.d.ts +0 -3
- package/dist/showcase/families/index.js +0 -96
- package/dist/showcase/families/inputs/data.cjs +0 -1
- package/dist/showcase/families/inputs/data.d.ts +0 -24
- package/dist/showcase/families/inputs/data.js +0 -90
- package/dist/showcase/families/inputs/index.cjs +0 -1
- package/dist/showcase/families/inputs/index.d.ts +0 -2
- package/dist/showcase/families/inputs/index.js +0 -3
- package/dist/showcase/families/inputs/mock.cjs +0 -5
- package/dist/showcase/families/inputs/mock.d.ts +0 -2
- package/dist/showcase/families/inputs/mock.js +0 -40
- package/dist/showcase/families/inputs/showcase.cjs +0 -1
- package/dist/showcase/families/inputs/showcase.d.ts +0 -3
- package/dist/showcase/families/inputs/showcase.js +0 -404
- package/dist/showcase/families/layout/index.cjs +0 -1
- package/dist/showcase/families/layout/index.d.ts +0 -2
- package/dist/showcase/families/layout/index.js +0 -3
- package/dist/showcase/families/layout/mock.cjs +0 -5
- package/dist/showcase/families/layout/mock.d.ts +0 -2
- package/dist/showcase/families/layout/mock.js +0 -40
- package/dist/showcase/families/layout/showcase.cjs +0 -1
- package/dist/showcase/families/layout/showcase.d.ts +0 -2
- package/dist/showcase/families/layout/showcase.js +0 -88
- package/dist/showcase/families/navigation/index.cjs +0 -1
- package/dist/showcase/families/navigation/index.d.ts +0 -2
- package/dist/showcase/families/navigation/index.js +0 -3
- package/dist/showcase/families/navigation/mock.cjs +0 -5
- package/dist/showcase/families/navigation/mock.d.ts +0 -2
- package/dist/showcase/families/navigation/mock.js +0 -40
- package/dist/showcase/families/navigation/showcase.cjs +0 -1
- package/dist/showcase/families/navigation/showcase.d.ts +0 -2
- package/dist/showcase/families/navigation/showcase.js +0 -49
- package/dist/showcase/families/notifications/index.cjs +0 -1
- package/dist/showcase/families/notifications/index.d.ts +0 -2
- package/dist/showcase/families/notifications/index.js +0 -3
- package/dist/showcase/families/notifications/mock.cjs +0 -5
- package/dist/showcase/families/notifications/mock.d.ts +0 -2
- package/dist/showcase/families/notifications/mock.js +0 -40
- package/dist/showcase/families/notifications/showcase.cjs +0 -1
- package/dist/showcase/families/notifications/showcase.d.ts +0 -1
- package/dist/showcase/families/notifications/showcase.js +0 -50
- package/dist/showcase/families/overlay/index.cjs +0 -1
- package/dist/showcase/families/overlay/index.d.ts +0 -2
- package/dist/showcase/families/overlay/index.js +0 -3
- package/dist/showcase/families/overlay/mock.cjs +0 -5
- package/dist/showcase/families/overlay/mock.d.ts +0 -2
- package/dist/showcase/families/overlay/mock.js +0 -40
- package/dist/showcase/families/overlay/showcase.cjs +0 -1
- package/dist/showcase/families/overlay/showcase.d.ts +0 -1
- package/dist/showcase/families/overlay/showcase.js +0 -38
- package/dist/showcase/families/patterns/index.cjs +0 -1
- package/dist/showcase/families/patterns/index.d.ts +0 -2
- package/dist/showcase/families/patterns/index.js +0 -3
- package/dist/showcase/families/patterns/mock.cjs +0 -5
- package/dist/showcase/families/patterns/mock.d.ts +0 -2
- package/dist/showcase/families/patterns/mock.js +0 -40
- package/dist/showcase/families/patterns/showcase.cjs +0 -1
- package/dist/showcase/families/patterns/showcase.d.ts +0 -1
- package/dist/showcase/families/patterns/showcase.js +0 -38
- package/dist/showcase/families/types.cjs +0 -1
- package/dist/showcase/families/types.d.ts +0 -29
- package/dist/showcase/families/types.js +0 -10
- package/dist/showcase/families/upload/data.cjs +0 -1
- package/dist/showcase/families/upload/data.d.ts +0 -1
- package/dist/showcase/families/upload/data.js +0 -10
- package/dist/showcase/families/upload/index.cjs +0 -1
- package/dist/showcase/families/upload/index.d.ts +0 -2
- package/dist/showcase/families/upload/index.js +0 -3
- package/dist/showcase/families/upload/mock.cjs +0 -5
- package/dist/showcase/families/upload/mock.d.ts +0 -2
- package/dist/showcase/families/upload/mock.js +0 -40
- package/dist/showcase/families/upload/showcase.cjs +0 -1
- package/dist/showcase/families/upload/showcase.d.ts +0 -3
- package/dist/showcase/families/upload/showcase.js +0 -133
- package/dist/showcase/families/wizard/index.cjs +0 -1
- package/dist/showcase/families/wizard/index.d.ts +0 -2
- package/dist/showcase/families/wizard/index.js +0 -3
- package/dist/showcase/families/wizard/mock.cjs +0 -5
- package/dist/showcase/families/wizard/mock.d.ts +0 -2
- package/dist/showcase/families/wizard/mock.js +0 -40
- package/dist/showcase/families/wizard/showcase.cjs +0 -1
- package/dist/showcase/families/wizard/showcase.d.ts +0 -2
- package/dist/showcase/families/wizard/showcase.js +0 -56
- package/packages/cli/vendor/src/families/badge-family.ts +0 -7
- package/packages/cli/vendor/src/families/card-family.ts +0 -26
- package/packages/cli/vendor/src/families/catalog.ts +0 -125
- package/packages/cli/vendor/src/families/data-table-family.ts +0 -31
- package/packages/cli/vendor/src/families/docs-adoption.ts +0 -103
- package/packages/cli/vendor/src/families/docs-groups.ts +0 -248
- package/packages/cli/vendor/src/families/docs-queries.ts +0 -84
- package/packages/cli/vendor/src/families/docs-routing.ts +0 -89
- package/packages/cli/vendor/src/families/form-family.ts +0 -37
- package/packages/cli/vendor/src/families/index.ts +0 -19
- package/packages/cli/vendor/src/families/input-family.ts +0 -61
- package/packages/cli/vendor/src/families/member-metadata.ts +0 -1033
- package/packages/cli/vendor/src/families/member-queries.ts +0 -28
- package/packages/cli/vendor/src/families/member-snippet-queries.ts +0 -54
- package/packages/cli/vendor/src/families/member-snippets.ts +0 -1563
- package/packages/cli/vendor/src/families/migration-map.ts +0 -161
- package/packages/cli/vendor/src/families/overlay-family.ts +0 -31
- package/packages/cli/vendor/src/families/public-surface-rationalization.ts +0 -206
- package/packages/cli/vendor/src/families/queries.ts +0 -131
- package/packages/cli/vendor/src/families/select-family.ts +0 -33
- package/packages/cli/vendor/src/families/views.ts +0 -85
- package/packages/cli/vendor/src/showcase/families/actions/index.ts +0 -2
- package/packages/cli/vendor/src/showcase/families/actions/mock.ts +0 -18
- package/packages/cli/vendor/src/showcase/families/actions/showcase.tsx +0 -36
- package/packages/cli/vendor/src/showcase/families/calendar/index.ts +0 -2
- package/packages/cli/vendor/src/showcase/families/calendar/mock.ts +0 -18
- package/packages/cli/vendor/src/showcase/families/calendar/showcase.tsx +0 -33
- package/packages/cli/vendor/src/showcase/families/command/index.ts +0 -2
- package/packages/cli/vendor/src/showcase/families/command/mock.ts +0 -18
- package/packages/cli/vendor/src/showcase/families/command/showcase.tsx +0 -33
- package/packages/cli/vendor/src/showcase/families/data-table/index.ts +0 -4
- package/packages/cli/vendor/src/showcase/families/data-table/mock.ts +0 -42
- package/packages/cli/vendor/src/showcase/families/data-table/showcase.tsx +0 -507
- package/packages/cli/vendor/src/showcase/families/data-table/types.ts +0 -25
- package/packages/cli/vendor/src/showcase/families/display/data.ts +0 -11
- package/packages/cli/vendor/src/showcase/families/display/index.ts +0 -2
- package/packages/cli/vendor/src/showcase/families/display/mock.ts +0 -18
- package/packages/cli/vendor/src/showcase/families/display/showcase.tsx +0 -113
- package/packages/cli/vendor/src/showcase/families/filters/data.ts +0 -18
- package/packages/cli/vendor/src/showcase/families/filters/index.ts +0 -2
- package/packages/cli/vendor/src/showcase/families/filters/mock.ts +0 -18
- package/packages/cli/vendor/src/showcase/families/filters/showcase.tsx +0 -137
- package/packages/cli/vendor/src/showcase/families/form/data.ts +0 -37
- package/packages/cli/vendor/src/showcase/families/form/index.ts +0 -4
- package/packages/cli/vendor/src/showcase/families/form/mock.ts +0 -18
- package/packages/cli/vendor/src/showcase/families/form/showcase.tsx +0 -230
- package/packages/cli/vendor/src/showcase/families/form/types.ts +0 -10
- package/packages/cli/vendor/src/showcase/families/index.ts +0 -37
- package/packages/cli/vendor/src/showcase/families/inputs/data.ts +0 -40
- package/packages/cli/vendor/src/showcase/families/inputs/index.ts +0 -2
- package/packages/cli/vendor/src/showcase/families/inputs/mock.ts +0 -18
- package/packages/cli/vendor/src/showcase/families/inputs/showcase.tsx +0 -294
- package/packages/cli/vendor/src/showcase/families/layout/index.ts +0 -2
- package/packages/cli/vendor/src/showcase/families/layout/mock.ts +0 -18
- package/packages/cli/vendor/src/showcase/families/layout/showcase.tsx +0 -57
- package/packages/cli/vendor/src/showcase/families/navigation/index.ts +0 -2
- package/packages/cli/vendor/src/showcase/families/navigation/mock.ts +0 -18
- package/packages/cli/vendor/src/showcase/families/navigation/showcase.tsx +0 -31
- package/packages/cli/vendor/src/showcase/families/notifications/index.ts +0 -2
- package/packages/cli/vendor/src/showcase/families/notifications/mock.ts +0 -18
- package/packages/cli/vendor/src/showcase/families/notifications/showcase.tsx +0 -24
- package/packages/cli/vendor/src/showcase/families/overlay/index.ts +0 -2
- package/packages/cli/vendor/src/showcase/families/overlay/mock.ts +0 -18
- package/packages/cli/vendor/src/showcase/families/overlay/showcase.tsx +0 -23
- package/packages/cli/vendor/src/showcase/families/patterns/index.ts +0 -2
- package/packages/cli/vendor/src/showcase/families/patterns/mock.ts +0 -18
- package/packages/cli/vendor/src/showcase/families/patterns/showcase.tsx +0 -23
- package/packages/cli/vendor/src/showcase/families/types.ts +0 -40
- package/packages/cli/vendor/src/showcase/families/upload/data.ts +0 -7
- package/packages/cli/vendor/src/showcase/families/upload/index.ts +0 -2
- package/packages/cli/vendor/src/showcase/families/upload/mock.ts +0 -18
- package/packages/cli/vendor/src/showcase/families/upload/showcase.tsx +0 -86
- package/packages/cli/vendor/src/showcase/families/wizard/index.ts +0 -2
- package/packages/cli/vendor/src/showcase/families/wizard/mock.ts +0 -18
- package/packages/cli/vendor/src/showcase/families/wizard/showcase.tsx +0 -39
- /package/dist/showcase/{families/data-table → premium/data-table-parts}/data.cjs +0 -0
|
@@ -1,507 +0,0 @@
|
|
|
1
|
-
import * as React from "react"
|
|
2
|
-
import type { ColumnDef, RowSelectionState, SortingState, Table, VisibilityState } from "@tanstack/react-table"
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
Badge,
|
|
6
|
-
Button,
|
|
7
|
-
DataTable,
|
|
8
|
-
DataTableBulkActions,
|
|
9
|
-
DataTableColumnVisibilityMenu,
|
|
10
|
-
DataTableSortableHeader,
|
|
11
|
-
DataTableViewPresets,
|
|
12
|
-
SheetShell,
|
|
13
|
-
SearchInput,
|
|
14
|
-
createDataTableActionsColumn,
|
|
15
|
-
createDataTableSelectColumn,
|
|
16
|
-
} from "@/index"
|
|
17
|
-
|
|
18
|
-
import type { FamilyDemoProps } from "../types"
|
|
19
|
-
|
|
20
|
-
import { dataTableDemoPresets, dataTableDemoRows, dataTableToolbarActions } from "./data"
|
|
21
|
-
import type { DataTableDemoRow } from "./types"
|
|
22
|
-
|
|
23
|
-
export function DataTableFamilyShowcase({ state, setState }: FamilyDemoProps) {
|
|
24
|
-
const [rowSelection, setRowSelection] = React.useState<RowSelectionState>({})
|
|
25
|
-
const [sorting, setSorting] = React.useState<SortingState>([])
|
|
26
|
-
const [columnVisibility, setColumnVisibility] = React.useState<VisibilityState>({})
|
|
27
|
-
const [activeInvoice, setActiveInvoice] = React.useState<string>(dataTableDemoRows[0]?.invoice ?? "")
|
|
28
|
-
const [detailOpen, setDetailOpen] = React.useState(false)
|
|
29
|
-
const [loading, setLoading] = React.useState(false)
|
|
30
|
-
const [empty, setEmpty] = React.useState(false)
|
|
31
|
-
const [error, setError] = React.useState(false)
|
|
32
|
-
const [view, setView] = React.useState<"all" | "finance" | "at-risk">("all")
|
|
33
|
-
const [loadingVariant, setLoadingVariant] = React.useState<"skeleton" | "state">("skeleton")
|
|
34
|
-
const [serverMode, setServerMode] = React.useState<"client" | "server">("client")
|
|
35
|
-
const [pageSize, setPageSize] = React.useState(3)
|
|
36
|
-
const [pageIndex, setPageIndex] = React.useState(0)
|
|
37
|
-
|
|
38
|
-
const queryRows = React.useMemo(() => {
|
|
39
|
-
const search = state.search.trim().toLowerCase()
|
|
40
|
-
let rows = dataTableDemoRows
|
|
41
|
-
|
|
42
|
-
if (view === "finance") rows = rows.filter((row) => row.status === "Paid" || row.status === "Review")
|
|
43
|
-
if (view === "at-risk") rows = rows.filter((row) => row.status === "Draft" || row.status === "Overdue")
|
|
44
|
-
|
|
45
|
-
if (empty) return []
|
|
46
|
-
if (!search) return rows
|
|
47
|
-
|
|
48
|
-
return rows.filter((row) =>
|
|
49
|
-
[row.invoice, row.order, row.customer, row.owner, row.channel, row.status, row.amount, row.items].join(" ").toLowerCase().includes(search)
|
|
50
|
-
)
|
|
51
|
-
}, [empty, state.search, view])
|
|
52
|
-
|
|
53
|
-
const visibleRows = queryRows
|
|
54
|
-
const pageCount = Math.max(Math.ceil(visibleRows.length / pageSize), 1)
|
|
55
|
-
const safePageIndex = Math.min(pageIndex, Math.max(pageCount - 1, 0))
|
|
56
|
-
const pagedRows = React.useMemo(
|
|
57
|
-
() => visibleRows.slice(safePageIndex * pageSize, safePageIndex * pageSize + pageSize),
|
|
58
|
-
[pageSize, safePageIndex, visibleRows]
|
|
59
|
-
)
|
|
60
|
-
|
|
61
|
-
const selectedRows = React.useMemo(() => dataTableDemoRows.filter((_, index) => rowSelection[index]), [rowSelection])
|
|
62
|
-
const activeRow = dataTableDemoRows.find((row) => row.invoice === activeInvoice) ?? pagedRows[0]
|
|
63
|
-
const paidAmount = visibleRows.filter((row) => row.status === "Paid").reduce((total, row) => total + row.amountValue, 0)
|
|
64
|
-
const isBusy = loading
|
|
65
|
-
|
|
66
|
-
const columns = React.useMemo<ColumnDef<DataTableDemoRow>[]>(
|
|
67
|
-
() => [
|
|
68
|
-
createDataTableSelectColumn<DataTableDemoRow>(),
|
|
69
|
-
{
|
|
70
|
-
accessorKey: "invoice",
|
|
71
|
-
header: ({ column }) => <DataTableSortableHeader column={column}>Invoice</DataTableSortableHeader>,
|
|
72
|
-
cell: ({ row }) => (
|
|
73
|
-
<div className="min-w-[132px]">
|
|
74
|
-
<p className="aui-text-strong font-medium">{row.original.invoice}</p>
|
|
75
|
-
<p className="aui-text-muted mt-1 text-xs">{row.original.order}</p>
|
|
76
|
-
</div>
|
|
77
|
-
),
|
|
78
|
-
},
|
|
79
|
-
{
|
|
80
|
-
accessorKey: "customer",
|
|
81
|
-
header: ({ column }) => <DataTableSortableHeader column={column}>Customer</DataTableSortableHeader>,
|
|
82
|
-
cell: ({ row }) => (
|
|
83
|
-
<div className="min-w-[180px]">
|
|
84
|
-
<p className="aui-text-strong font-medium">{row.original.customer}</p>
|
|
85
|
-
<p className="aui-text-muted mt-1 text-xs">{row.original.owner} • {row.original.channel}</p>
|
|
86
|
-
</div>
|
|
87
|
-
),
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
accessorKey: "status",
|
|
91
|
-
header: "Status",
|
|
92
|
-
cell: ({ row }) => (
|
|
93
|
-
<Badge
|
|
94
|
-
variant={
|
|
95
|
-
row.original.status === "Paid"
|
|
96
|
-
? "secondary"
|
|
97
|
-
: row.original.status === "Review"
|
|
98
|
-
? "outline"
|
|
99
|
-
: "destructive"
|
|
100
|
-
}
|
|
101
|
-
>
|
|
102
|
-
{row.original.status}
|
|
103
|
-
</Badge>
|
|
104
|
-
),
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
accessorKey: "items",
|
|
108
|
-
header: ({ column }) => <DataTableSortableHeader column={column}>Items</DataTableSortableHeader>,
|
|
109
|
-
cell: ({ row }) => <span className="aui-text-strong font-medium">{row.original.items}</span>,
|
|
110
|
-
},
|
|
111
|
-
{
|
|
112
|
-
accessorKey: "stock",
|
|
113
|
-
header: ({ column }) => <DataTableSortableHeader column={column}>Stock</DataTableSortableHeader>,
|
|
114
|
-
},
|
|
115
|
-
{
|
|
116
|
-
accessorKey: "amount",
|
|
117
|
-
header: ({ column }) => <DataTableSortableHeader column={column}>Amount</DataTableSortableHeader>,
|
|
118
|
-
cell: ({ row }) => (
|
|
119
|
-
<div className="min-w-[116px]">
|
|
120
|
-
<p className="aui-text-strong font-medium">{row.original.amount}</p>
|
|
121
|
-
<p className={`mt-1 text-xs ${row.original.trend === "up" ? "text-emerald-600" : row.original.trend === "down" ? "text-rose-600" : "aui-text-muted"}`}>
|
|
122
|
-
{row.original.trend === "up" ? "Trending up" : row.original.trend === "down" ? "Needs attention" : "Stable"}
|
|
123
|
-
</p>
|
|
124
|
-
</div>
|
|
125
|
-
),
|
|
126
|
-
},
|
|
127
|
-
{
|
|
128
|
-
accessorKey: "updatedAt",
|
|
129
|
-
header: "Updated",
|
|
130
|
-
cell: ({ row }) => (
|
|
131
|
-
<div>
|
|
132
|
-
<p className="aui-text-strong font-medium">{row.original.updatedAt}</p>
|
|
133
|
-
<p className="aui-text-muted mt-1 text-xs">{row.original.status === "Draft" ? "Editing locked" : "Live sync"}</p>
|
|
134
|
-
</div>
|
|
135
|
-
),
|
|
136
|
-
},
|
|
137
|
-
createDataTableActionsColumn<DataTableDemoRow>({
|
|
138
|
-
getActions: (_row, original) => [
|
|
139
|
-
{
|
|
140
|
-
key: "view",
|
|
141
|
-
label: "Open detail",
|
|
142
|
-
onSelect: () => {
|
|
143
|
-
setActiveInvoice(original.invoice)
|
|
144
|
-
setDetailOpen(true)
|
|
145
|
-
},
|
|
146
|
-
},
|
|
147
|
-
{ key: "follow-up", label: "Create follow-up", onSelect: () => setState({ notes: `Follow-up prepared for ${original.customer}` }) },
|
|
148
|
-
{ key: "archive", label: "Archive", destructive: true, onSelect: () => setState({ notes: `${original.invoice} marked for archive review` }) },
|
|
149
|
-
],
|
|
150
|
-
}),
|
|
151
|
-
],
|
|
152
|
-
[setState]
|
|
153
|
-
)
|
|
154
|
-
|
|
155
|
-
return (
|
|
156
|
-
<div className="space-y-4">
|
|
157
|
-
<div className="rounded-[22px] border border-[color:var(--aui-surface-border)] bg-[color:var(--aui-surface)] p-4">
|
|
158
|
-
<div className="flex flex-col gap-4 xl:flex-row xl:items-start xl:justify-between">
|
|
159
|
-
<div className="space-y-3">
|
|
160
|
-
<div className="flex flex-wrap items-center gap-2">
|
|
161
|
-
<Badge variant="outline">{selectedRows.length} selected</Badge>
|
|
162
|
-
<Badge variant="outline">{view === "all" ? "All invoices" : view === "finance" ? "Finance review" : "At risk"}</Badge>
|
|
163
|
-
<Badge variant="outline">{visibleRows.length} rows</Badge>
|
|
164
|
-
<Badge variant="outline">{loadingVariant}</Badge>
|
|
165
|
-
<Badge variant="outline">{serverMode === "server" ? "Manual server-state" : "Client state"}</Badge>
|
|
166
|
-
</div>
|
|
167
|
-
<div>
|
|
168
|
-
<p className="aui-text-strong text-sm font-medium">Reusable DataTable flow</p>
|
|
169
|
-
<p className="aui-text-muted mt-1 text-sm leading-6">Selection, column visibility, mobile cards, manual server-state, detail sheet, disabled rows and pagination in one compact surface.</p>
|
|
170
|
-
</div>
|
|
171
|
-
</div>
|
|
172
|
-
|
|
173
|
-
<div className="flex flex-wrap items-center gap-2">
|
|
174
|
-
<Button variant={serverMode === "client" ? "default" : "outline"} size="sm" onClick={() => { setServerMode("client"); setLoading(false); }}>Client</Button>
|
|
175
|
-
<Button variant={serverMode === "server" ? "default" : "outline"} size="sm" onClick={() => { setServerMode("server"); setLoading(false); }}>Server</Button>
|
|
176
|
-
<Button variant={state.density === "compact" ? "default" : "outline"} size="sm" onClick={() => setState({ density: "compact" })}>Compact</Button>
|
|
177
|
-
<Button variant={state.density === "comfortable" ? "default" : "outline"} size="sm" onClick={() => setState({ density: "comfortable" })}>Comfortable</Button>
|
|
178
|
-
<Button variant={loadingVariant === "skeleton" ? "default" : "outline"} size="sm" onClick={() => setLoadingVariant((current) => current === "skeleton" ? "state" : "skeleton")}>
|
|
179
|
-
{loadingVariant === "skeleton" ? "Skeleton" : "State"}
|
|
180
|
-
</Button>
|
|
181
|
-
<Button variant={loading ? "default" : "outline"} size="sm" onClick={() => setLoading((current) => !current)}>Loading</Button>
|
|
182
|
-
<Button variant={error ? "default" : "outline"} size="sm" onClick={() => setError((current) => !current)}>Error</Button>
|
|
183
|
-
<Button variant={empty ? "default" : "outline"} size="sm" onClick={() => setEmpty((current) => !current)}>Empty</Button>
|
|
184
|
-
<Button
|
|
185
|
-
variant="outline"
|
|
186
|
-
size="sm"
|
|
187
|
-
onClick={() => {
|
|
188
|
-
setState({ search: "" })
|
|
189
|
-
setView("all")
|
|
190
|
-
setLoading(false)
|
|
191
|
-
setError(false)
|
|
192
|
-
setEmpty(false)
|
|
193
|
-
setLoadingVariant("skeleton")
|
|
194
|
-
setServerMode("client")
|
|
195
|
-
setPageIndex(0)
|
|
196
|
-
setRowSelection({})
|
|
197
|
-
setColumnVisibility({})
|
|
198
|
-
setDetailOpen(false)
|
|
199
|
-
}}
|
|
200
|
-
>
|
|
201
|
-
Reset
|
|
202
|
-
</Button>
|
|
203
|
-
</div>
|
|
204
|
-
</div>
|
|
205
|
-
|
|
206
|
-
<div className="mt-4 flex flex-col gap-3 xl:flex-row xl:items-center xl:justify-between">
|
|
207
|
-
<DataTableViewPresets
|
|
208
|
-
value={view}
|
|
209
|
-
onValueChange={(value) => {
|
|
210
|
-
setView((value as typeof view | undefined) ?? "all")
|
|
211
|
-
setPageIndex(0)
|
|
212
|
-
}}
|
|
213
|
-
presets={dataTableDemoPresets}
|
|
214
|
-
size="sm"
|
|
215
|
-
/>
|
|
216
|
-
<div className="w-full max-w-[320px]">
|
|
217
|
-
<SearchInput value={state.search} onValueChange={(value: string) => setState({ search: value })} placeholder="Search invoice, customer, owner..." />
|
|
218
|
-
</div>
|
|
219
|
-
</div>
|
|
220
|
-
</div>
|
|
221
|
-
|
|
222
|
-
<div className="rounded-[22px] border border-[color:var(--aui-surface-border)] bg-[color:var(--aui-surface)] p-4">
|
|
223
|
-
<DataTable
|
|
224
|
-
columns={columns}
|
|
225
|
-
data={pagedRows}
|
|
226
|
-
getRowId={(row) => row.invoice}
|
|
227
|
-
rowSelection={rowSelection}
|
|
228
|
-
onRowSelectionChange={setRowSelection}
|
|
229
|
-
sorting={sorting}
|
|
230
|
-
onSortingChange={setSorting}
|
|
231
|
-
columnVisibility={columnVisibility}
|
|
232
|
-
onColumnVisibilityChange={setColumnVisibility}
|
|
233
|
-
enableRowSelection
|
|
234
|
-
density={state.density === "comfortable" ? "comfortable" : "compact"}
|
|
235
|
-
striped
|
|
236
|
-
bordered
|
|
237
|
-
stickyHeader
|
|
238
|
-
isLoading={isBusy}
|
|
239
|
-
isError={error}
|
|
240
|
-
loadingVariant={loadingVariant}
|
|
241
|
-
loadingState={{
|
|
242
|
-
label: serverMode === "server" ? "Fetching invoices" : "Loading invoices",
|
|
243
|
-
description: serverMode === "server" ? "Manual mode simulates server-side filtering, sorting and pagination." : "Reusable DataTable loading state.",
|
|
244
|
-
}}
|
|
245
|
-
errorState={{ title: "Invoice table failed", description: "Force error state to inspect resilient UI." }}
|
|
246
|
-
emptyState={{ title: "No rows found", description: "Current view or search does not match any invoice." }}
|
|
247
|
-
getRowDisabled={(row) => row.original.status === "Draft"}
|
|
248
|
-
onRowClick={(row) => setActiveInvoice(row.original.invoice)}
|
|
249
|
-
onRowDoubleClick={(row) => {
|
|
250
|
-
setActiveInvoice(row.original.invoice)
|
|
251
|
-
setDetailOpen(true)
|
|
252
|
-
setState({ notes: `${row.original.invoice} opened from double click` })
|
|
253
|
-
}}
|
|
254
|
-
renderMobileCard={(row) => (
|
|
255
|
-
<button
|
|
256
|
-
key={row.id}
|
|
257
|
-
type="button"
|
|
258
|
-
onClick={() => {
|
|
259
|
-
setActiveInvoice(row.original.invoice)
|
|
260
|
-
setDetailOpen(true)
|
|
261
|
-
}}
|
|
262
|
-
className={activeInvoice === row.original.invoice ? "rounded-[20px] aui-surface-strong border-[color:var(--aui-surface-strong)] p-4 text-left" : "rounded-[20px] border border-[color:var(--aui-surface-border)] bg-[color:var(--aui-surface)] p-4 text-left"}
|
|
263
|
-
>
|
|
264
|
-
<div className="flex items-center justify-between gap-3">
|
|
265
|
-
<div>
|
|
266
|
-
<p className="font-medium">{row.original.invoice}</p>
|
|
267
|
-
<p className={activeInvoice === row.original.invoice ? "mt-1 text-sm text-[color:color-mix(in_oklch,var(--aui-surface-strong-foreground)_72%,transparent)]" : "aui-text-muted mt-1 text-sm"}>{row.original.customer} • {row.original.owner}</p>
|
|
268
|
-
</div>
|
|
269
|
-
<Badge variant={row.original.status === "Paid" ? "secondary" : row.original.status === "Review" ? "outline" : "destructive"}>{row.original.status}</Badge>
|
|
270
|
-
</div>
|
|
271
|
-
<div className="mt-4 grid grid-cols-2 gap-3 text-sm">
|
|
272
|
-
<div>
|
|
273
|
-
<p className={activeInvoice === row.original.invoice ? "text-[color:color-mix(in_oklch,var(--aui-surface-strong-foreground)_60%,transparent)]" : "aui-text-muted"}>Amount</p>
|
|
274
|
-
<p className="mt-1 font-semibold">{row.original.amount}</p>
|
|
275
|
-
</div>
|
|
276
|
-
<div>
|
|
277
|
-
<p className={activeInvoice === row.original.invoice ? "text-[color:color-mix(in_oklch,var(--aui-surface-strong-foreground)_60%,transparent)]" : "aui-text-muted"}>Updated</p>
|
|
278
|
-
<p className="mt-1 font-semibold">{row.original.updatedAt}</p>
|
|
279
|
-
</div>
|
|
280
|
-
<div>
|
|
281
|
-
<p className={activeInvoice === row.original.invoice ? "text-[color:color-mix(in_oklch,var(--aui-surface-strong-foreground)_60%,transparent)]" : "aui-text-muted"}>Items</p>
|
|
282
|
-
<p className="mt-1 font-semibold">{row.original.items}</p>
|
|
283
|
-
</div>
|
|
284
|
-
<div>
|
|
285
|
-
<p className={activeInvoice === row.original.invoice ? "text-[color:color-mix(in_oklch,var(--aui-surface-strong-foreground)_60%,transparent)]" : "aui-text-muted"}>Channel</p>
|
|
286
|
-
<p className="mt-1 font-semibold">{row.original.channel}</p>
|
|
287
|
-
</div>
|
|
288
|
-
</div>
|
|
289
|
-
</button>
|
|
290
|
-
)}
|
|
291
|
-
toolbarProps={(table: Table<DataTableDemoRow>) => ({
|
|
292
|
-
title: "Invoices",
|
|
293
|
-
description: "Primary reusable data-table API for finance, ops and admin surfaces.",
|
|
294
|
-
search: (
|
|
295
|
-
<div className="flex flex-wrap items-center gap-2">
|
|
296
|
-
<Badge variant="outline">{view === "all" ? "All" : view === "finance" ? "Finance" : "At risk"}</Badge>
|
|
297
|
-
{(state.search || view !== "all") ? (
|
|
298
|
-
<Button
|
|
299
|
-
variant="ghost"
|
|
300
|
-
size="sm"
|
|
301
|
-
onClick={() => {
|
|
302
|
-
setState({ search: "" })
|
|
303
|
-
setView("all")
|
|
304
|
-
setPageIndex(0)
|
|
305
|
-
}}
|
|
306
|
-
>
|
|
307
|
-
Clear filters
|
|
308
|
-
</Button>
|
|
309
|
-
) : null}
|
|
310
|
-
</div>
|
|
311
|
-
),
|
|
312
|
-
actions: (
|
|
313
|
-
<div className="flex items-center gap-2">
|
|
314
|
-
<DataTableColumnVisibilityMenu table={table} />
|
|
315
|
-
{dataTableToolbarActions.map((action) => (
|
|
316
|
-
<Button
|
|
317
|
-
key={action.label}
|
|
318
|
-
variant={action.variant}
|
|
319
|
-
size="sm"
|
|
320
|
-
onClick={() => setState({ notes: `${action.label} prepared for ${visibleRows.length} visible rows` })}
|
|
321
|
-
>
|
|
322
|
-
{action.label}
|
|
323
|
-
</Button>
|
|
324
|
-
))}
|
|
325
|
-
</div>
|
|
326
|
-
),
|
|
327
|
-
selectionActions: (
|
|
328
|
-
<div className="flex flex-wrap items-center gap-2">
|
|
329
|
-
<DataTableBulkActions
|
|
330
|
-
rows={table.getSelectedRowModel().rows.map((row) => row.original)}
|
|
331
|
-
actions={[
|
|
332
|
-
{
|
|
333
|
-
key: "export",
|
|
334
|
-
label: "Export selected",
|
|
335
|
-
onSelect: (rows) => setState({ notes: `${rows.length} rows prepared for export` }),
|
|
336
|
-
},
|
|
337
|
-
{
|
|
338
|
-
key: "archive",
|
|
339
|
-
label: "Archive selected",
|
|
340
|
-
destructive: true,
|
|
341
|
-
onSelect: (rows) => setState({ notes: `${rows.length} rows sent to archive flow` }),
|
|
342
|
-
},
|
|
343
|
-
]}
|
|
344
|
-
onClearSelection={() => setRowSelection({})}
|
|
345
|
-
/>
|
|
346
|
-
</div>
|
|
347
|
-
),
|
|
348
|
-
})}
|
|
349
|
-
pagination={{
|
|
350
|
-
manual: true,
|
|
351
|
-
pageIndex: safePageIndex,
|
|
352
|
-
pageSize,
|
|
353
|
-
rowCount: visibleRows.length,
|
|
354
|
-
pageCount,
|
|
355
|
-
pageSizeOptions: [3, 5, 10],
|
|
356
|
-
showPageSize: true,
|
|
357
|
-
labels: {
|
|
358
|
-
rowsPerPage: "Rows per page",
|
|
359
|
-
pageInfo: (page: number, pageCount: number, rowCount?: number) => `${page + 1} / ${pageCount}${rowCount ? ` • ${rowCount} rows` : ""}`,
|
|
360
|
-
first: "First",
|
|
361
|
-
previous: "Previous",
|
|
362
|
-
next: "Next",
|
|
363
|
-
last: "Last",
|
|
364
|
-
page: (page: number) => `Page ${page}`,
|
|
365
|
-
},
|
|
366
|
-
onPageChange: setPageIndex,
|
|
367
|
-
onPageSizeChange: (nextPageSize) => {
|
|
368
|
-
setPageSize(nextPageSize)
|
|
369
|
-
setPageIndex(0)
|
|
370
|
-
},
|
|
371
|
-
}}
|
|
372
|
-
/>
|
|
373
|
-
</div>
|
|
374
|
-
|
|
375
|
-
<div className="grid gap-4 lg:grid-cols-[1.3fr_0.7fr]">
|
|
376
|
-
<div className="rounded-[22px] border border-[color:var(--aui-surface-border)] bg-[color:var(--aui-surface)] p-4">
|
|
377
|
-
<div className="flex flex-wrap items-center gap-2">
|
|
378
|
-
<Badge variant="outline">Row click focuses detail</Badge>
|
|
379
|
-
<Badge variant="outline">Checkbox stays isolated</Badge>
|
|
380
|
-
<Badge variant="outline">Action menu stays isolated</Badge>
|
|
381
|
-
<Badge variant="outline">Bulk actions use real selection</Badge>
|
|
382
|
-
</div>
|
|
383
|
-
<div className="mt-4 grid gap-3 md:grid-cols-3">
|
|
384
|
-
<div className="rounded-[18px] border border-[color:var(--aui-surface-border)] bg-[color:var(--aui-page-bg)] px-4 py-3">
|
|
385
|
-
<p className="aui-text-muted text-xs uppercase tracking-[0.18em]">Step 1</p>
|
|
386
|
-
<p className="aui-text-strong mt-2 text-sm font-medium">Click row body</p>
|
|
387
|
-
<p className="aui-text-subtle mt-2 text-sm leading-6">Focus shifts to the invoice summary card below without opening unrelated controls.</p>
|
|
388
|
-
</div>
|
|
389
|
-
<div className="rounded-[18px] border border-[color:var(--aui-surface-border)] bg-[color:var(--aui-page-bg)] px-4 py-3">
|
|
390
|
-
<p className="aui-text-muted text-xs uppercase tracking-[0.18em]">Step 2</p>
|
|
391
|
-
<p className="aui-text-strong mt-2 text-sm font-medium">Use select checkbox</p>
|
|
392
|
-
<p className="aui-text-subtle mt-2 text-sm leading-6">Selection updates bulk actions only. It does not trigger row focus or open detail.</p>
|
|
393
|
-
</div>
|
|
394
|
-
<div className="rounded-[18px] border border-[color:var(--aui-surface-border)] bg-[color:var(--aui-page-bg)] px-4 py-3">
|
|
395
|
-
<p className="aui-text-muted text-xs uppercase tracking-[0.18em]">Step 3</p>
|
|
396
|
-
<p className="aui-text-strong mt-2 text-sm font-medium">Open row actions</p>
|
|
397
|
-
<p className="aui-text-subtle mt-2 text-sm leading-6">Action menu dispatches row-specific commands and keeps parent row click untouched.</p>
|
|
398
|
-
</div>
|
|
399
|
-
</div>
|
|
400
|
-
</div>
|
|
401
|
-
|
|
402
|
-
<div className="rounded-[22px] border border-[color:var(--aui-surface-border)] bg-[color:var(--aui-surface)] p-4">
|
|
403
|
-
<p className="aui-text-muted text-sm">Interaction proof</p>
|
|
404
|
-
<div className="mt-3 space-y-3">
|
|
405
|
-
<div className="rounded-[18px] border border-[color:var(--aui-surface-border)] bg-[color:var(--aui-page-bg)] px-4 py-3">
|
|
406
|
-
<p className="aui-text-strong text-sm font-medium">{activeRow?.invoice ?? "No active invoice"}</p>
|
|
407
|
-
<p className="aui-text-subtle mt-1 text-sm">Active focus row</p>
|
|
408
|
-
</div>
|
|
409
|
-
<div className="rounded-[18px] border border-[color:var(--aui-surface-border)] bg-[color:var(--aui-page-bg)] px-4 py-3">
|
|
410
|
-
<p className="aui-text-strong text-sm font-medium">{selectedRows.length} selected</p>
|
|
411
|
-
<p className="aui-text-subtle mt-1 text-sm">Selection state stays independent from row detail state.</p>
|
|
412
|
-
</div>
|
|
413
|
-
<div className="rounded-[18px] border border-[color:var(--aui-surface-border)] bg-[color:var(--aui-page-bg)] px-4 py-3">
|
|
414
|
-
<p className="aui-text-strong text-sm font-medium">{detailOpen ? "Detail sheet open" : "Detail sheet closed"}</p>
|
|
415
|
-
<p className="aui-text-subtle mt-1 text-sm">Double click and menu actions can open the same reusable detail surface.</p>
|
|
416
|
-
</div>
|
|
417
|
-
</div>
|
|
418
|
-
</div>
|
|
419
|
-
</div>
|
|
420
|
-
|
|
421
|
-
<div className="grid gap-4 md:grid-cols-4">
|
|
422
|
-
<div className="rounded-[22px] border border-[color:var(--aui-surface-border)] bg-[color:var(--aui-surface)] p-4">
|
|
423
|
-
<p className="aui-text-muted text-sm">Focused row</p>
|
|
424
|
-
<p className="aui-text-strong mt-2 text-lg font-semibold">{activeRow?.invoice ?? "No row"}</p>
|
|
425
|
-
<p className="aui-text-subtle mt-2 text-sm">{activeRow ? `${activeRow.customer} • ${activeRow.owner} • ${activeRow.channel}` : "Select a row to inspect actions."}</p>
|
|
426
|
-
</div>
|
|
427
|
-
<div className="rounded-[22px] border border-[color:var(--aui-surface-border)] bg-[color:var(--aui-surface)] p-4">
|
|
428
|
-
<p className="aui-text-muted text-sm">Selection</p>
|
|
429
|
-
<p className="aui-text-strong mt-2 text-lg font-semibold">{selectedRows.length} rows active</p>
|
|
430
|
-
<p className="aui-text-subtle mt-2 text-sm">Bulk export and archive stay attached to the real selected rows.</p>
|
|
431
|
-
</div>
|
|
432
|
-
<div className="rounded-[22px] border border-[color:var(--aui-surface-border)] bg-[color:var(--aui-surface)] p-4">
|
|
433
|
-
<p className="aui-text-muted text-sm">Finance signal</p>
|
|
434
|
-
<p className="aui-text-strong mt-2 text-lg font-semibold">${paidAmount.toLocaleString()}</p>
|
|
435
|
-
<p className="aui-text-subtle mt-2 text-sm">Paid invoices total in the current filtered view.</p>
|
|
436
|
-
</div>
|
|
437
|
-
<div className="rounded-[22px] border border-[color:var(--aui-surface-border)] bg-[color:var(--aui-surface)] p-4">
|
|
438
|
-
<p className="aui-text-muted text-sm">Data mode</p>
|
|
439
|
-
<p className="aui-text-strong mt-2 text-lg font-semibold">{serverMode === "server" ? "Manual server" : "Client only"}</p>
|
|
440
|
-
<p className="aui-text-subtle mt-2 text-sm">{serverMode === "server" ? "Query changes pass through simulated fetch state." : "Filters resolve immediately in memory."}</p>
|
|
441
|
-
</div>
|
|
442
|
-
</div>
|
|
443
|
-
|
|
444
|
-
<SheetShell
|
|
445
|
-
open={detailOpen}
|
|
446
|
-
onOpenChange={setDetailOpen}
|
|
447
|
-
side="right"
|
|
448
|
-
title={activeRow ? `${activeRow.invoice} detail` : "Invoice detail"}
|
|
449
|
-
description="Row click, double click and action menu all converge into one reusable detail surface."
|
|
450
|
-
contentClassName="sm:max-w-xl"
|
|
451
|
-
bodyClassName="space-y-6"
|
|
452
|
-
footer={
|
|
453
|
-
<>
|
|
454
|
-
<Button variant="outline" onClick={() => setDetailOpen(false)}>Close</Button>
|
|
455
|
-
<Button onClick={() => setState({ notes: `${activeRow?.invoice ?? "Invoice"} sent to finance review` })}>Send to review</Button>
|
|
456
|
-
</>
|
|
457
|
-
}
|
|
458
|
-
>
|
|
459
|
-
{activeRow ? (
|
|
460
|
-
<>
|
|
461
|
-
<div className="grid gap-4 sm:grid-cols-2">
|
|
462
|
-
<div className="rounded-[20px] border border-[color:var(--aui-surface-border)] bg-[color:var(--aui-surface)] p-4">
|
|
463
|
-
<p className="aui-text-muted text-sm">Customer</p>
|
|
464
|
-
<p className="aui-text-strong mt-2 text-lg font-semibold">{activeRow.customer}</p>
|
|
465
|
-
<p className="aui-text-subtle mt-1 text-sm">{activeRow.owner} • {activeRow.channel}</p>
|
|
466
|
-
</div>
|
|
467
|
-
<div className="rounded-[20px] border border-[color:var(--aui-surface-border)] bg-[color:var(--aui-surface)] p-4">
|
|
468
|
-
<p className="aui-text-muted text-sm">Order value</p>
|
|
469
|
-
<p className="aui-text-strong mt-2 text-lg font-semibold">{activeRow.amount}</p>
|
|
470
|
-
<p className={`mt-1 text-sm ${activeRow.trend === "up" ? "text-emerald-600" : activeRow.trend === "down" ? "text-rose-600" : "aui-text-muted"}`}>
|
|
471
|
-
{activeRow.trend === "up" ? "Revenue is climbing" : activeRow.trend === "down" ? "Revenue trend needs attention" : "Revenue is stable"}
|
|
472
|
-
</p>
|
|
473
|
-
</div>
|
|
474
|
-
</div>
|
|
475
|
-
|
|
476
|
-
<div className="grid gap-3">
|
|
477
|
-
{[
|
|
478
|
-
["Status", activeRow.status],
|
|
479
|
-
["Items", String(activeRow.items)],
|
|
480
|
-
["Stock", String(activeRow.stock)],
|
|
481
|
-
["Updated", activeRow.updatedAt],
|
|
482
|
-
].map(([label, value]) => (
|
|
483
|
-
<div key={label} className="flex items-center justify-between rounded-[18px] border border-[color:var(--aui-surface-border)] bg-[color:var(--aui-surface)] px-4 py-3">
|
|
484
|
-
<span className="aui-text-muted text-sm">{label}</span>
|
|
485
|
-
<span className="aui-text-strong text-sm font-medium">{value}</span>
|
|
486
|
-
</div>
|
|
487
|
-
))}
|
|
488
|
-
</div>
|
|
489
|
-
|
|
490
|
-
<div className="rounded-[20px] border border-[color:var(--aui-surface-border)] bg-[color:var(--aui-surface)] p-4">
|
|
491
|
-
<p className="aui-text-muted text-sm">Interaction coverage</p>
|
|
492
|
-
<div className="mt-3 flex flex-wrap gap-2">
|
|
493
|
-
<Badge variant="outline">Row click</Badge>
|
|
494
|
-
<Badge variant="outline">Double click</Badge>
|
|
495
|
-
<Badge variant="outline">Action menu</Badge>
|
|
496
|
-
<Badge variant="outline">Mobile card</Badge>
|
|
497
|
-
</div>
|
|
498
|
-
<p className="aui-text-subtle mt-3 text-sm leading-6">
|
|
499
|
-
This sheet shows a reusable row-detail pattern. The DataTable stays generic while the surrounding flow remains app-owned.
|
|
500
|
-
</p>
|
|
501
|
-
</div>
|
|
502
|
-
</>
|
|
503
|
-
) : null}
|
|
504
|
-
</SheetShell>
|
|
505
|
-
</div>
|
|
506
|
-
)
|
|
507
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
export type DataTableDemoRow = {
|
|
2
|
-
invoice: string
|
|
3
|
-
order: string
|
|
4
|
-
customer: string
|
|
5
|
-
owner: string
|
|
6
|
-
channel: string
|
|
7
|
-
status: "Paid" | "Review" | "Draft" | "Overdue"
|
|
8
|
-
stock: number
|
|
9
|
-
items: number
|
|
10
|
-
amount: string
|
|
11
|
-
amountValue: number
|
|
12
|
-
trend: "up" | "down" | "steady"
|
|
13
|
-
updatedAt: string
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export type DataTableDemoToolbarAction = {
|
|
17
|
-
label: string
|
|
18
|
-
variant: "default" | "outline"
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export type DataTableDemoPreset = {
|
|
22
|
-
value: "all" | "finance" | "at-risk"
|
|
23
|
-
label: string
|
|
24
|
-
description: string
|
|
25
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export const metricCards = [
|
|
2
|
-
{ label: "Revenue", value: "$24,780", note: "+12.8% from last week" },
|
|
3
|
-
{ label: "Customers", value: "1,429", note: "84 new this cycle" },
|
|
4
|
-
{ label: "Growth", value: "+12.8%", note: "Healthy activation curve" },
|
|
5
|
-
]
|
|
6
|
-
|
|
7
|
-
export const activityItems = [
|
|
8
|
-
"Design system tokens updated",
|
|
9
|
-
"Table presets synchronized",
|
|
10
|
-
"Release note draft created",
|
|
11
|
-
]
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { FamilyDemoMock } from "../types"
|
|
2
|
-
|
|
3
|
-
export const displayFamilyMock: FamilyDemoMock = {
|
|
4
|
-
code: `import { MetricGrid, Timeline, ActivityFeed, Avatar } from "tembro"\n\nexport function Example() {\n return <MetricGrid />\n}`,
|
|
5
|
-
highlights: ["Metric grids", "Timelines", "Activity feeds", "Status legends"],
|
|
6
|
-
scenarios: [
|
|
7
|
-
{ title: "KPI dashboards", description: "Present summary metrics with clear information hierarchy." },
|
|
8
|
-
{ title: "Audit trails", description: "Track updates and system events in timeline form." },
|
|
9
|
-
{ title: "Context cards", description: "Pair avatar, status and description surfaces together." },
|
|
10
|
-
],
|
|
11
|
-
metrics: [
|
|
12
|
-
{ label: "Exports", value: "10" },
|
|
13
|
-
{ label: "Display types", value: "5+" },
|
|
14
|
-
{ label: "Status", value: "Stable" },
|
|
15
|
-
],
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
|