@jameskabz/nextcraft-ui 0.7.3 → 0.7.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/craft-card.cjs +2 -2
- package/dist/components/craft-card.cjs.map +1 -1
- package/dist/components/craft-card.js +2 -2
- package/dist/components/craft-card.js.map +1 -1
- package/dist/components/craft-data-table.cjs +4 -4
- package/dist/components/craft-data-table.cjs.map +1 -1
- package/dist/components/craft-data-table.js +4 -4
- package/dist/components/craft-data-table.js.map +1 -1
- package/dist/components/craft-loader.cjs +1 -1
- package/dist/components/craft-loader.cjs.map +1 -1
- package/dist/components/craft-loader.js +1 -1
- package/dist/components/craft-loader.js.map +1 -1
- package/dist/components/layout/sidebar.cjs +1 -1
- package/dist/components/layout/sidebar.cjs.map +1 -1
- package/dist/components/layout/sidebar.js +1 -1
- package/dist/components/layout/sidebar.js.map +1 -1
- package/dist/styles.css +28 -0
- package/package.json +1 -1
|
@@ -45,8 +45,8 @@ function CraftCard({
|
|
|
45
45
|
intensityClasses[intensity],
|
|
46
46
|
"bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.15)] via-[rgb(var(--nc-accent-2)/0.10)] to-[rgb(var(--nc-accent-3)/0.15)]",
|
|
47
47
|
bordered ? "border-2 border-[rgb(var(--nc-accent-1)/0.3)]" : "border-0",
|
|
48
|
-
elevated ? "shadow-[0_8px_32px_rgba(0,0,0,0.3)] hover:shadow-[0_8px_40px_rgba(0,0,0,0.
|
|
49
|
-
"before:absolute before:inset-0 before:bg-linear-to-br before:from-white/
|
|
48
|
+
elevated ? "shadow-[0_8px_32px_rgba(0,0,0,0.3)] hover:shadow-[0_8px_40px_rgba(0,0,0,0.6)]" : "shadow-none",
|
|
49
|
+
"before:absolute before:inset-0 before:bg-linear-to-br before:from-white/4 before:to-transparent before:opacity-0 hover:before:opacity-40 before:transition-opacity before:duration-300",
|
|
50
50
|
"transition-all duration-300",
|
|
51
51
|
className
|
|
52
52
|
),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/craft-card.tsx"],"sourcesContent":["import { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftCardProps = React.HTMLAttributes<HTMLDivElement> & {\n tone?: ThemeName;\n elevated?: boolean;\n intensity?: \"subtle\" | \"medium\" | \"strong\";\n bordered?: boolean;\n};\n\nconst intensityClasses: Record<NonNullable<CraftCardProps[\"intensity\"]>, string> = {\n subtle: \"backdrop-blur-md bg-opacity-50\",\n medium: \"backdrop-blur-xl bg-opacity-70\",\n strong: \"backdrop-blur-2xl bg-opacity-90\",\n};\n\nexport function CraftCard({\n className,\n tone,\n elevated = true,\n intensity = \"medium\",\n bordered = true,\n children,\n ...props\n}: CraftCardProps) {\n return (\n <div\n className={cn(\n \"relative overflow-hidden rounded-3xl p-6 text-[rgb(var(--nc-fg))]\",\n intensityClasses[intensity],\n \"bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.15)] via-[rgb(var(--nc-accent-2)/0.10)] to-[rgb(var(--nc-accent-3)/0.15)]\",\n bordered ? \"border-2 border-[rgb(var(--nc-accent-1)/0.3)]\" : \"border-0\",\n elevated\n ? \"shadow-[0_8px_32px_rgba(0,0,0,0.3)] hover:shadow-[0_8px_40px_rgba(0,0,0,0.
|
|
1
|
+
{"version":3,"sources":["../../src/components/craft-card.tsx"],"sourcesContent":["import { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftCardProps = React.HTMLAttributes<HTMLDivElement> & {\n tone?: ThemeName;\n elevated?: boolean;\n intensity?: \"subtle\" | \"medium\" | \"strong\";\n bordered?: boolean;\n};\n\nconst intensityClasses: Record<NonNullable<CraftCardProps[\"intensity\"]>, string> = {\n subtle: \"backdrop-blur-md bg-opacity-50\",\n medium: \"backdrop-blur-xl bg-opacity-70\",\n strong: \"backdrop-blur-2xl bg-opacity-90\",\n};\n\nexport function CraftCard({\n className,\n tone,\n elevated = true,\n intensity = \"medium\",\n bordered = true,\n children,\n ...props\n}: CraftCardProps) {\n return (\n <div\n className={cn(\n \"relative overflow-hidden rounded-3xl p-6 text-[rgb(var(--nc-fg))]\",\n intensityClasses[intensity],\n \"bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.15)] via-[rgb(var(--nc-accent-2)/0.10)] to-[rgb(var(--nc-accent-3)/0.15)]\",\n bordered ? \"border-2 border-[rgb(var(--nc-accent-1)/0.3)]\" : \"border-0\",\n elevated\n ? \"shadow-[0_8px_32px_rgba(0,0,0,0.3)] hover:shadow-[0_8px_40px_rgba(0,0,0,0.6)]\"\n : \"shadow-none\",\n \"before:absolute before:inset-0 before:bg-linear-to-br before:from-white/4 before:to-transparent before:opacity-0 hover:before:opacity-40 before:transition-opacity before:duration-300\",\n \"transition-all duration-300\",\n className\n )}\n data-nc-theme={tone}\n {...props}\n >\n <div className=\"relative z-10\">{children}</div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA0CM;AA1CN,gBAAmB;AAUnB,MAAM,mBAA6E;AAAA,EACjF,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACL,GAAmB;AACjB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,QACT;AAAA,QACA,iBAAiB,SAAS;AAAA,QAC1B;AAAA,QACA,WAAW,kDAAkD;AAAA,QAC7D,WACI,kFACA;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,iBAAe;AAAA,MACd,GAAG;AAAA,MAEJ,sDAAC,SAAI,WAAU,iBAAiB,UAAS;AAAA;AAAA,EAC3C;AAEJ;","names":[]}
|
|
@@ -22,8 +22,8 @@ function CraftCard({
|
|
|
22
22
|
intensityClasses[intensity],
|
|
23
23
|
"bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.15)] via-[rgb(var(--nc-accent-2)/0.10)] to-[rgb(var(--nc-accent-3)/0.15)]",
|
|
24
24
|
bordered ? "border-2 border-[rgb(var(--nc-accent-1)/0.3)]" : "border-0",
|
|
25
|
-
elevated ? "shadow-[0_8px_32px_rgba(0,0,0,0.3)] hover:shadow-[0_8px_40px_rgba(0,0,0,0.
|
|
26
|
-
"before:absolute before:inset-0 before:bg-linear-to-br before:from-white/
|
|
25
|
+
elevated ? "shadow-[0_8px_32px_rgba(0,0,0,0.3)] hover:shadow-[0_8px_40px_rgba(0,0,0,0.6)]" : "shadow-none",
|
|
26
|
+
"before:absolute before:inset-0 before:bg-linear-to-br before:from-white/4 before:to-transparent before:opacity-0 hover:before:opacity-40 before:transition-opacity before:duration-300",
|
|
27
27
|
"transition-all duration-300",
|
|
28
28
|
className
|
|
29
29
|
),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/craft-card.tsx"],"sourcesContent":["import { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftCardProps = React.HTMLAttributes<HTMLDivElement> & {\n tone?: ThemeName;\n elevated?: boolean;\n intensity?: \"subtle\" | \"medium\" | \"strong\";\n bordered?: boolean;\n};\n\nconst intensityClasses: Record<NonNullable<CraftCardProps[\"intensity\"]>, string> = {\n subtle: \"backdrop-blur-md bg-opacity-50\",\n medium: \"backdrop-blur-xl bg-opacity-70\",\n strong: \"backdrop-blur-2xl bg-opacity-90\",\n};\n\nexport function CraftCard({\n className,\n tone,\n elevated = true,\n intensity = \"medium\",\n bordered = true,\n children,\n ...props\n}: CraftCardProps) {\n return (\n <div\n className={cn(\n \"relative overflow-hidden rounded-3xl p-6 text-[rgb(var(--nc-fg))]\",\n intensityClasses[intensity],\n \"bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.15)] via-[rgb(var(--nc-accent-2)/0.10)] to-[rgb(var(--nc-accent-3)/0.15)]\",\n bordered ? \"border-2 border-[rgb(var(--nc-accent-1)/0.3)]\" : \"border-0\",\n elevated\n ? \"shadow-[0_8px_32px_rgba(0,0,0,0.3)] hover:shadow-[0_8px_40px_rgba(0,0,0,0.
|
|
1
|
+
{"version":3,"sources":["../../src/components/craft-card.tsx"],"sourcesContent":["import { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftCardProps = React.HTMLAttributes<HTMLDivElement> & {\n tone?: ThemeName;\n elevated?: boolean;\n intensity?: \"subtle\" | \"medium\" | \"strong\";\n bordered?: boolean;\n};\n\nconst intensityClasses: Record<NonNullable<CraftCardProps[\"intensity\"]>, string> = {\n subtle: \"backdrop-blur-md bg-opacity-50\",\n medium: \"backdrop-blur-xl bg-opacity-70\",\n strong: \"backdrop-blur-2xl bg-opacity-90\",\n};\n\nexport function CraftCard({\n className,\n tone,\n elevated = true,\n intensity = \"medium\",\n bordered = true,\n children,\n ...props\n}: CraftCardProps) {\n return (\n <div\n className={cn(\n \"relative overflow-hidden rounded-3xl p-6 text-[rgb(var(--nc-fg))]\",\n intensityClasses[intensity],\n \"bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.15)] via-[rgb(var(--nc-accent-2)/0.10)] to-[rgb(var(--nc-accent-3)/0.15)]\",\n bordered ? \"border-2 border-[rgb(var(--nc-accent-1)/0.3)]\" : \"border-0\",\n elevated\n ? \"shadow-[0_8px_32px_rgba(0,0,0,0.3)] hover:shadow-[0_8px_40px_rgba(0,0,0,0.6)]\"\n : \"shadow-none\",\n \"before:absolute before:inset-0 before:bg-linear-to-br before:from-white/4 before:to-transparent before:opacity-0 hover:before:opacity-40 before:transition-opacity before:duration-300\",\n \"transition-all duration-300\",\n className\n )}\n data-nc-theme={tone}\n {...props}\n >\n <div className=\"relative z-10\">{children}</div>\n </div>\n );\n}\n"],"mappings":"AA0CM;AA1CN,SAAS,UAAU;AAUnB,MAAM,mBAA6E;AAAA,EACjF,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACL,GAAmB;AACjB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,iBAAiB,SAAS;AAAA,QAC1B;AAAA,QACA,WAAW,kDAAkD;AAAA,QAC7D,WACI,kFACA;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,iBAAe;AAAA,MACd,GAAG;AAAA,MAEJ,8BAAC,SAAI,WAAU,iBAAiB,UAAS;AAAA;AAAA,EAC3C;AAEJ;","names":[]}
|
|
@@ -148,7 +148,7 @@ function CraftDataTable({
|
|
|
148
148
|
loadingColor = "rgb(var(--nc-accent-1))",
|
|
149
149
|
loadingText = "Loading...",
|
|
150
150
|
loadingTextPosition = "bottom",
|
|
151
|
-
loadingBackground = "
|
|
151
|
+
loadingBackground = "rgb(var(--nc-accent-soft)/0.1)",
|
|
152
152
|
showSkeleton = true,
|
|
153
153
|
skeletonRows = 5,
|
|
154
154
|
truncateWords = 10,
|
|
@@ -332,14 +332,14 @@ function CraftDataTable({
|
|
|
332
332
|
variant === "bordered" && "border-b border-[rgb(var(--nc-border)/0.2)]",
|
|
333
333
|
variant === "minimal" && "border-b border-[rgb(var(--nc-border)/0.15)]",
|
|
334
334
|
striped && index % 2 === 1 && "bg-[rgb(var(--nc-surface)/0.04)]",
|
|
335
|
-
hoverable && !clickableRows && "hover:bg-[rgb(var(--nc-surface)
|
|
336
|
-
clickableRows && "cursor-pointer hover:bg-[rgb(var(--nc-surface)/0.
|
|
335
|
+
hoverable && !clickableRows && "hover:bg-[rgb(var(--nc-surface)]",
|
|
336
|
+
clickableRows && "cursor-pointer hover:bg-[rgb(var(--nc-surface)/0.1)]",
|
|
337
337
|
isSelected && "bg-[rgb(var(--nc-accent-1)/0.12)]",
|
|
338
338
|
rowLoading[rowId] && "opacity-60"
|
|
339
339
|
);
|
|
340
340
|
const containerClasses = (0, import_cn.cn)(
|
|
341
341
|
"overflow-hidden rounded-3xl border border-[rgb(var(--nc-border)/0.3)]",
|
|
342
|
-
"
|
|
342
|
+
" shadow-[0_18px_50px_rgba(0,0,0,0.35)] backdrop-blur-2xl",
|
|
343
343
|
variant === "minimal" && "border-transparent bg-transparent shadow-none"
|
|
344
344
|
);
|
|
345
345
|
const openModal = (content) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/craft-data-table.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\nimport { CraftButton } from \"@/components/craft-button\";\nimport { CraftCheckbox } from \"@/components/craft-checkbox\";\nimport { CraftIcon } from \"@/components/craft-icon\";\nimport { CraftModal } from \"@/components/craft-modal\";\nimport { CraftTooltip } from \"@/components/craft-tooltip\";\nimport { CraftLoader } from \"@/components/craft-loader\";\nimport { CraftDataTableHeader } from \"@/components/craft-data-table-header\";\nimport { CraftDataTablePagination } from \"@/components/craft-data-table-pagination\";\n\nexport type CraftDataTableColumn<T> = {\n id: string;\n header?: React.ReactNode;\n label?: React.ReactNode;\n accessor?: keyof T | ((row: T) => unknown);\n cell?: (row: T) => React.ReactNode;\n formatter?: (value: unknown, row: T) => React.ReactNode;\n sortable?: boolean;\n filterable?: boolean;\n width?: string | number;\n align?: \"left\" | \"center\" | \"right\";\n hidden?: boolean;\n headerClassName?: string;\n cellClassName?: string;\n truncate?: boolean;\n maxWords?: number;\n};\n\nexport type CraftDataTableSort = {\n id: string;\n desc?: boolean;\n};\n\nexport type CraftDataTableAction<T> = {\n key: string;\n label?: React.ReactNode;\n icon?: string | React.ReactNode;\n variant?:\n | \"solid\"\n | \"outline\"\n | \"ghost\"\n | \"gradient\"\n | \"default\"\n | \"primary\"\n | \"secondary\"\n | \"danger\"\n | \"success\"\n | \"warning\"\n | \"info\"\n | \"subtle\"\n | \"dark\"\n | \"light\"\n | \"primaryOutline\"\n | \"dangerOutline\"\n | \"successOutline\"\n | \"link\";\n permission?: boolean | ((item: T) => boolean);\n visible?: boolean | ((item: T) => boolean);\n disabled?: boolean | ((item: T) => boolean);\n tooltip?: React.ReactNode | ((item: T) => React.ReactNode);\n onClick?: (item: T) => void;\n className?: string | ((item: T) => string);\n};\n\nexport type CraftDataTableProps<T> = {\n data: T[];\n columns: CraftDataTableColumn<T>[];\n title?: React.ReactNode;\n description?: React.ReactNode;\n tone?: ThemeName;\n className?: string;\n toolbar?: React.ReactNode;\n emptyState?: React.ReactNode;\n actions?: CraftDataTableAction<T>[];\n showActionsColumn?: boolean;\n selectable?: boolean;\n enableRowSelection?: boolean;\n selectedRowIds?: Record<string, boolean>;\n onRowSelectionChange?: (selection: Record<string, boolean>) => void;\n getRowId?: (row: T, index: number) => string;\n rowKey?: keyof T | string;\n enableSorting?: boolean;\n enableFiltering?: boolean;\n enableColumnVisibility?: boolean;\n enablePagination?: boolean;\n showGlobalFilter?: boolean;\n manualSorting?: boolean;\n manualFiltering?: boolean;\n manualPagination?: boolean;\n sortBy?: CraftDataTableSort | null;\n onSortChange?: (sort: CraftDataTableSort | null) => void;\n filters?: Record<string, string>;\n onFiltersChange?: (filters: Record<string, string>) => void;\n globalFilter?: string;\n onGlobalFilterChange?: (value: string) => void;\n columnVisibility?: Record<string, boolean>;\n onColumnVisibilityChange?: (visibility: Record<string, boolean>) => void;\n pageIndex?: number;\n pageSize?: number;\n pageCount?: number;\n onPageChange?: (pageIndex: number) => void;\n onPageSizeChange?: (size: number) => void;\n striped?: boolean;\n hoverable?: boolean;\n clickableRows?: boolean;\n emptyText?: string;\n emptySubtitle?: string;\n variant?: \"default\" | \"bordered\" | \"minimal\";\n density?: \"compact\" | \"normal\" | \"comfortable\";\n headerVariant?: \"default\" | \"minimal\";\n headerPadding?: \"compact\" | \"normal\" | \"comfortable\";\n paginationVariant?: \"default\" | \"minimal\";\n paginationPadding?: \"compact\" | \"normal\" | \"comfortable\";\n loading?: boolean;\n dataLoading?: boolean;\n sortLoading?: boolean;\n paginationLoading?: boolean;\n bulkLoading?: boolean;\n rowLoading?: Record<string, boolean>;\n loadingType?: \"spin\" | \"pulse\" | \"bounce\" | \"ripple\" | \"bars\" | \"dots\" | \"ring\";\n loadingSize?: \"small\" | \"medium\" | \"large\" | \"xl\";\n loadingColor?: string;\n loadingText?: string;\n loadingTextPosition?: \"top\" | \"bottom\";\n loadingBackground?: string;\n showSkeleton?: boolean;\n skeletonRows?: number;\n truncateWords?: number;\n enableTextModal?: boolean;\n onRowClick?: (payload: { item: T; index: number }) => void;\n};\n\nfunction getColumnValue<T>(column: CraftDataTableColumn<T>, row: T) {\n if (typeof column.accessor === \"function\") return column.accessor(row);\n const record = row as Record<string, unknown>;\n if (typeof column.accessor === \"string\") return record[column.accessor];\n return record[column.id];\n}\n\nfunction normalizeValue(value: unknown) {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") return value.toLowerCase();\n if (value instanceof Date) return value.getTime();\n return String(value).toLowerCase();\n}\n\nfunction truncateText(text: string, maxWords: number) {\n const words = text.split(\" \");\n if (words.length <= maxWords) return text;\n return `${words.slice(0, maxWords).join(\" \")}...`;\n}\n\nfunction resolveActionVariant(\n variant: CraftDataTableAction<unknown>[\"variant\"]\n): \"solid\" | \"outline\" | \"ghost\" | \"gradient\" {\n switch (variant) {\n case \"solid\":\n case \"default\":\n case \"primary\":\n return \"solid\";\n case \"gradient\":\n return \"gradient\";\n case \"outline\":\n case \"primaryOutline\":\n case \"dangerOutline\":\n case \"successOutline\":\n return \"outline\";\n case \"ghost\":\n case \"link\":\n case \"secondary\":\n case \"danger\":\n case \"success\":\n case \"warning\":\n case \"info\":\n case \"subtle\":\n case \"dark\":\n case \"light\":\n default:\n return \"ghost\";\n }\n}\n\nexport function CraftDataTable<T>({\n data,\n columns,\n title,\n description,\n tone,\n className,\n toolbar,\n emptyState,\n actions = [],\n showActionsColumn = true,\n selectable,\n enableRowSelection = true,\n selectedRowIds,\n onRowSelectionChange,\n getRowId,\n rowKey,\n enableSorting = true,\n enableFiltering = true,\n enableColumnVisibility = true,\n enablePagination = true,\n showGlobalFilter,\n manualSorting = false,\n manualFiltering = false,\n manualPagination = false,\n sortBy,\n onSortChange,\n filters,\n onFiltersChange,\n globalFilter,\n onGlobalFilterChange,\n columnVisibility,\n onColumnVisibilityChange,\n pageIndex,\n pageSize = 10,\n pageCount,\n onPageChange,\n onPageSizeChange,\n striped = false,\n hoverable = true,\n clickableRows = false,\n emptyText = \"No data available\",\n emptySubtitle = \"Try adjusting your search or filter criteria\",\n variant = \"default\",\n density = \"normal\",\n headerVariant = \"default\",\n headerPadding = \"normal\",\n paginationVariant = \"default\",\n paginationPadding = \"normal\",\n loading = false,\n dataLoading = false,\n sortLoading = false,\n paginationLoading = false,\n bulkLoading = false,\n rowLoading = {},\n loadingType = \"dots\",\n loadingSize = \"medium\",\n loadingColor = \"rgb(var(--nc-accent-1))\",\n loadingText = \"Loading...\",\n loadingTextPosition = \"bottom\",\n loadingBackground = \"rgba(0, 0, 0, 0.35)\",\n showSkeleton = true,\n skeletonRows = 5,\n truncateWords = 10,\n enableTextModal = true,\n onRowClick,\n}: CraftDataTableProps<T>) {\n const [internalSort, setInternalSort] = React.useState<CraftDataTableSort | null>(null);\n const [internalFilters, setInternalFilters] = React.useState<Record<string, string>>({});\n const [internalGlobalFilter, setInternalGlobalFilter] = React.useState(\"\");\n const [internalVisibility, setInternalVisibility] = React.useState<Record<string, boolean>>(() =>\n columns.reduce((acc, column) => {\n acc[column.id] = !column.hidden;\n return acc;\n }, {} as Record<string, boolean>)\n );\n const [internalSelection, setInternalSelection] = React.useState<Record<string, boolean>>({});\n const [internalPageIndex, setInternalPageIndex] = React.useState(0);\n const [showColumns, setShowColumns] = React.useState(false);\n const [showModal, setShowModal] = React.useState(false);\n const [modalContent, setModalContent] = React.useState<string>(\"\");\n\n const resolvedSort = sortBy ?? internalSort;\n const resolvedFilters = filters ?? internalFilters;\n const resolvedGlobalFilter = globalFilter ?? internalGlobalFilter;\n const resolvedVisibility = columnVisibility ?? internalVisibility;\n const resolvedSelection = selectedRowIds ?? internalSelection;\n const resolvedPageIndex = pageIndex ?? internalPageIndex;\n const resolvedSelectable = selectable ?? enableRowSelection;\n\n const setSort = (next: CraftDataTableSort | null) => {\n if (sortBy === undefined) setInternalSort(next);\n onSortChange?.(next);\n };\n\n const setFilters = (next: Record<string, string>) => {\n if (filters === undefined) setInternalFilters(next);\n onFiltersChange?.(next);\n };\n\n const setVisibility = (next: Record<string, boolean>) => {\n if (columnVisibility === undefined) setInternalVisibility(next);\n onColumnVisibilityChange?.(next);\n };\n\n const setSelection = (next: Record<string, boolean>) => {\n if (selectedRowIds === undefined) setInternalSelection(next);\n onRowSelectionChange?.(next);\n };\n\n const setPageIndex = React.useCallback(\n (next: number) => {\n if (pageIndex === undefined) setInternalPageIndex(next);\n onPageChange?.(next);\n },\n [pageIndex, onPageChange]\n );\n\n const visibleColumns = columns.filter(\n (column) => resolvedVisibility[column.id] !== false\n );\n\n const filteredData = React.useMemo(() => {\n if (manualFiltering) return data;\n const globalValue = resolvedGlobalFilter.trim();\n return data.filter((row) => {\n if (globalValue) {\n const matchesGlobal = columns.some((column) => {\n const value = normalizeValue(getColumnValue(column, row));\n return String(value).includes(globalValue.toLowerCase());\n });\n if (!matchesGlobal) return false;\n }\n\n return Object.entries(resolvedFilters).every(([columnId, value]) => {\n if (!value) return true;\n const column = columns.find((col) => col.id === columnId);\n if (!column) return true;\n const cellValue = normalizeValue(getColumnValue(column, row));\n return String(cellValue).includes(value.toLowerCase());\n });\n });\n }, [columns, data, manualFiltering, resolvedFilters, resolvedGlobalFilter]);\n\n const sortedData = React.useMemo(() => {\n if (manualSorting || !resolvedSort) return filteredData;\n const column = columns.find((col) => col.id === resolvedSort.id);\n if (!column) return filteredData;\n const sorted = [...filteredData].sort((a, b) => {\n const valueA = normalizeValue(getColumnValue(column, a));\n const valueB = normalizeValue(getColumnValue(column, b));\n if (typeof valueA === \"number\" && typeof valueB === \"number\") {\n return valueA - valueB;\n }\n return String(valueA).localeCompare(String(valueB));\n });\n return resolvedSort.desc ? sorted.reverse() : sorted;\n }, [columns, filteredData, manualSorting, resolvedSort]);\n\n const resolvedPageCount = manualPagination\n ? Math.max(pageCount ?? 1, 1)\n : Math.max(Math.ceil(sortedData.length / pageSize), 1);\n\n React.useEffect(() => {\n if (resolvedPageIndex > resolvedPageCount - 1) {\n setPageIndex(Math.max(resolvedPageCount - 1, 0));\n }\n }, [resolvedPageCount, resolvedPageIndex, setPageIndex]);\n\n const pagedData = React.useMemo(() => {\n if (!enablePagination || manualPagination) return sortedData;\n const start = resolvedPageIndex * pageSize;\n return sortedData.slice(start, start + pageSize);\n }, [enablePagination, manualPagination, pageSize, resolvedPageIndex, sortedData]);\n\n const rowIdFor = React.useCallback(\n (row: T, index: number) => {\n if (getRowId) return getRowId(row, index);\n if (rowKey) return String((row as Record<string, unknown>)[rowKey as string] ?? index);\n return String(index);\n },\n [getRowId, rowKey]\n );\n\n const pageStartIndex =\n enablePagination && !manualPagination ? resolvedPageIndex * pageSize : 0;\n const pageRowIds = pagedData.map((row: T, index: number) =>\n rowIdFor(row, pageStartIndex + index)\n );\n const allSelected =\n pageRowIds.length > 0 && pageRowIds.every((id) => resolvedSelection[id]);\n const someSelected = pageRowIds.some((id) => resolvedSelection[id]);\n const headerCheckboxRef = React.useRef<HTMLInputElement | null>(null);\n\n React.useEffect(() => {\n if (headerCheckboxRef.current) {\n headerCheckboxRef.current.indeterminate = someSelected && !allSelected;\n }\n }, [someSelected, allSelected]);\n\n const toggleSort = (column: CraftDataTableColumn<T>) => {\n if (!enableSorting || column.sortable === false) return;\n const current = resolvedSort;\n if (!current || current.id !== column.id) {\n setSort({ id: column.id, desc: false });\n return;\n }\n if (!current.desc) {\n setSort({ id: column.id, desc: true });\n return;\n }\n setSort(null);\n };\n\n const resolvedShowGlobalFilter =\n showGlobalFilter ?? (enableFiltering && !toolbar);\n\n const setGlobalFilter = (next: string) => {\n if (globalFilter === undefined) setInternalGlobalFilter(next);\n onGlobalFilterChange?.(next);\n };\n\n const shouldShowActionsColumn = React.useMemo(() => {\n if (!showActionsColumn) return false;\n if (!actions || actions.length === 0) return false;\n return actions.some((action) => {\n if (action.permission === undefined) return true;\n if (typeof action.permission === \"boolean\") return action.permission;\n return true;\n });\n }, [actions, showActionsColumn]);\n\n const getVisibleActions = (item: T) =>\n actions.filter((action) => {\n if (action.permission !== undefined) {\n if (typeof action.permission === \"boolean\" && !action.permission) return false;\n if (typeof action.permission === \"function\" && !action.permission(item)) return false;\n }\n if (action.visible && typeof action.visible === \"function\") {\n return action.visible(item);\n }\n if (typeof action.visible === \"boolean\") return action.visible;\n return true;\n });\n\n const isActionDisabled = (action: CraftDataTableAction<T>, item: T) => {\n if (action.disabled && typeof action.disabled === \"function\") return action.disabled(item);\n if (typeof action.disabled === \"boolean\") return action.disabled;\n return false;\n };\n\n const handleActionClick = (action: CraftDataTableAction<T>, item: T) => {\n if (isActionDisabled(action, item)) return;\n action.onClick?.(item);\n };\n\n const totalColumns =\n visibleColumns.length +\n (resolvedSelectable ? 1 : 0) +\n (shouldShowActionsColumn ? 1 : 0);\n\n const densityPadding = {\n compact: \"px-4 py-2\",\n normal: \"px-6 py-4\",\n comfortable: \"px-8 py-6\",\n } as const;\n\n const headerPaddingClasses = {\n compact: \"px-4 py-2\",\n normal: \"px-6 py-3\",\n comfortable: \"px-8 py-4\",\n } as const;\n\n const rowClassNames = (isSelected: boolean, rowId: string, index: number) =>\n cn(\n \"transition-colors\",\n variant === \"bordered\" && \"border-b border-[rgb(var(--nc-border)/0.2)]\",\n variant === \"minimal\" && \"border-b border-[rgb(var(--nc-border)/0.15)]\",\n striped && index % 2 === 1 && \"bg-[rgb(var(--nc-surface)/0.04)]\",\n hoverable && !clickableRows && \"hover:bg-[rgb(var(--nc-surface)/0.12)]\",\n clickableRows && \"cursor-pointer hover:bg-[rgb(var(--nc-surface)/0.16)]\",\n isSelected && \"bg-[rgb(var(--nc-accent-1)/0.12)]\",\n rowLoading[rowId] && \"opacity-60\"\n );\n\n const containerClasses = cn(\n \"overflow-hidden rounded-3xl border border-[rgb(var(--nc-border)/0.3)]\",\n \"bg-[rgb(var(--nc-surface)/0.08)] shadow-[0_18px_50px_rgba(0,0,0,0.35)] backdrop-blur-2xl\",\n variant === \"minimal\" && \"border-transparent bg-transparent shadow-none\"\n );\n\n const openModal = (content: string) => {\n if (!enableTextModal) return;\n setModalContent(content);\n setShowModal(true);\n };\n\n const closeModal = () => {\n setShowModal(false);\n setModalContent(\"\");\n };\n\n return (\n <div className={cn(\"space-y-4\", className)} data-nc-theme={tone}>\n {toolbar}\n\n <CraftDataTableHeader\n title={title}\n description={description}\n variant={headerVariant}\n padding={headerPadding}\n tone={tone}\n filters={\n resolvedShowGlobalFilter ? (\n <div className=\"flex items-center gap-2 rounded-2xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-2 text-xs text-[rgb(var(--nc-fg))]\">\n <CraftIcon name=\"search\" className=\"h-4 w-4 text-[rgb(var(--nc-fg-muted))]\" />\n <input\n type=\"search\"\n value={resolvedGlobalFilter}\n onChange={(event) => setGlobalFilter(event.target.value)}\n placeholder=\"Search all columns...\"\n className=\"w-full max-w-xs bg-transparent text-xs text-[rgb(var(--nc-fg))] placeholder:text-[rgb(var(--nc-fg-muted))] focus:outline-none\"\n />\n </div>\n ) : null\n }\n actions={\n enableColumnVisibility ? (\n <div className=\"relative\">\n <CraftButton\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowColumns((prev) => !prev)}\n >\n Columns\n </CraftButton>\n {showColumns && (\n <div className=\"absolute right-0 top-12 z-20 w-56 rounded-2xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.2)] p-3 shadow-[0_12px_30px_rgba(0,0,0,0.35)] backdrop-blur-2xl\">\n <div className=\"grid gap-2\">\n {columns.map((column) => (\n <label\n key={column.id}\n className=\"flex items-center gap-2 text-xs text-[rgb(var(--nc-fg))]\"\n >\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 accent-[rgb(var(--nc-accent-1))]\"\n checked={resolvedVisibility[column.id] !== false}\n onChange={(event) =>\n setVisibility({\n ...resolvedVisibility,\n [column.id]: event.target.checked,\n })\n }\n />\n {column.header ?? column.label ?? column.id}\n </label>\n ))}\n </div>\n </div>\n )}\n </div>\n ) : null\n }\n />\n\n <div className={containerClasses}>\n <div className=\"relative\">\n <CraftLoader\n loading={loading || dataLoading}\n type={loadingType}\n size={loadingSize}\n color={loadingColor}\n overlay\n text={loadingText}\n textPosition={loadingTextPosition}\n backgroundColor={loadingBackground}\n />\n\n <div className={cn(\"overflow-x-auto\", (loading || dataLoading) && \"opacity-60\")}>\n <table className=\"min-w-full border-collapse text-left text-sm\">\n <thead className=\"bg-[rgb(var(--nc-surface)/0.12)] text-[rgb(var(--nc-fg-muted))]\">\n <tr>\n {resolvedSelectable && (\n <th className={cn(\"w-12\", headerPaddingClasses[density])}>\n <div className=\"flex items-center justify-center\">\n {bulkLoading ? (\n <CraftLoader loading type=\"spin\" size=\"small\" color={loadingColor} />\n ) : (\n <CraftCheckbox\n ref={headerCheckboxRef}\n checked={allSelected}\n onChange={(event) => {\n const next = { ...resolvedSelection };\n pageRowIds.forEach((id) => {\n next[id] = event.target.checked;\n });\n setSelection(next);\n }}\n />\n )}\n </div>\n </th>\n )}\n {visibleColumns.map((column) => {\n const headerLabel = column.header ?? column.label ?? column.id;\n return (\n <th\n key={column.id}\n className={cn(\n headerPaddingClasses[density],\n \"text-xs font-semibold uppercase tracking-[0.2em]\",\n column.headerClassName\n )}\n style={{ width: column.width }}\n >\n <button\n type=\"button\"\n className={cn(\n \"flex w-full items-center gap-2\",\n enableSorting && column.sortable !== false\n ? \"cursor-pointer\"\n : \"cursor-default\"\n )}\n onClick={() => toggleSort(column)}\n >\n <span>{headerLabel}</span>\n {sortLoading && resolvedSort?.id === column.id ? (\n <CraftLoader loading type=\"spin\" size=\"small\" color={loadingColor} />\n ) : null}\n {resolvedSort?.id === column.id && !sortLoading ? (\n <span className=\"text-[rgb(var(--nc-accent-1))]\">\n {resolvedSort.desc ? \"↓\" : \"↑\"}\n </span>\n ) : null}\n </button>\n {enableFiltering && column.filterable !== false && (\n <input\n type=\"text\"\n value={resolvedFilters[column.id] ?? \"\"}\n onChange={(event) =>\n setFilters({\n ...resolvedFilters,\n [column.id]: event.target.value,\n })\n }\n placeholder=\"Filter\"\n className=\"mt-2 w-full rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.18)] px-2 py-1 text-xs text-[rgb(var(--nc-fg))]\"\n />\n )}\n </th>\n );\n })}\n {shouldShowActionsColumn && (\n <th className={cn(headerPaddingClasses[density], \"text-xs uppercase\")}>Actions</th>\n )}\n </tr>\n </thead>\n <tbody className=\"text-[rgb(var(--nc-fg))]\">\n {showSkeleton && (loading || dataLoading) ? (\n Array.from({ length: skeletonRows }).map((_, rowIndex) => (\n <tr key={`skeleton-${rowIndex}`} className=\"animate-pulse\">\n {resolvedSelectable && (\n <td className={cn(headerPaddingClasses[density], \"w-12\")}> \n <div className=\"h-4 w-4 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n </td>\n )}\n {visibleColumns.map((column) => (\n <td key={column.id} className={cn(densityPadding[density])}>\n <div className=\"h-4 w-3/4 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n </td>\n ))}\n {shouldShowActionsColumn && (\n <td className={cn(densityPadding[density])}>\n <div className=\"flex items-center justify-center gap-2\">\n <div className=\"h-6 w-6 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n <div className=\"h-6 w-6 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n </div>\n </td>\n )}\n </tr>\n ))\n ) : pagedData.length === 0 ? (\n <tr>\n <td colSpan={totalColumns} className={cn(densityPadding[density], \"py-12\")}> \n {emptyState ?? (\n <div className=\"flex flex-col items-center justify-center text-center\">\n <CraftIcon\n name=\"search\"\n className=\"mb-4 h-12 w-12 text-[rgb(var(--nc-fg-muted))]\"\n />\n <p className=\"text-base font-semibold text-[rgb(var(--nc-fg))]\">\n {emptyText}\n </p>\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">\n {emptySubtitle}\n </p>\n </div>\n )}\n </td>\n </tr>\n ) : (\n pagedData.map((row: T, rowIndex: number) => {\n const rowId = rowIdFor(row, pageStartIndex + rowIndex);\n const isSelected = Boolean(resolvedSelection[rowId]);\n return (\n <tr\n key={rowId}\n className={rowClassNames(isSelected, rowId, rowIndex)}\n onClick={() => {\n if (!clickableRows) return;\n onRowClick?.({ item: row, index: rowIndex });\n }}\n >\n {resolvedSelectable && (\n <td className={cn(densityPadding[density], \"w-12\")}> \n <CraftCheckbox\n checked={isSelected}\n onChange={(event) =>\n setSelection({\n ...resolvedSelection,\n [rowId]: event.target.checked,\n })\n }\n />\n </td>\n )}\n {visibleColumns.map((column) => {\n const rawValue = getColumnValue(column, row);\n const formatted = column.formatter\n ? column.formatter(rawValue, row)\n : rawValue;\n const content = column.cell\n ? column.cell(row)\n : formatted ?? \"\";\n\n if (\n enableTextModal &&\n !column.cell &&\n typeof formatted === \"string\" &&\n (column.truncate ?? true) &&\n formatted.split(\" \").length > (column.maxWords ?? truncateWords)\n ) {\n const maxWords = column.maxWords ?? truncateWords;\n return (\n <td\n key={column.id}\n className={cn(\n densityPadding[density],\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n column.cellClassName\n )}\n >\n <button\n type=\"button\"\n className=\"text-[rgb(var(--nc-accent-1))] hover:text-[rgb(var(--nc-accent-2))]\"\n onClick={() => openModal(formatted)}\n >\n {truncateText(formatted, maxWords)}\n </button>\n </td>\n );\n }\n\n return (\n <td\n key={column.id}\n className={cn(\n densityPadding[density],\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n column.cellClassName\n )}\n >\n {content as React.ReactNode}\n </td>\n );\n })}\n {shouldShowActionsColumn && (\n <td className={cn(densityPadding[density])}>\n <div className=\"flex items-center justify-center gap-2\">\n {getVisibleActions(row).map((action) => {\n const tooltip =\n typeof action.tooltip === \"function\"\n ? action.tooltip(row)\n : action.tooltip;\n const className =\n typeof action.className === \"function\"\n ? action.className(row)\n : action.className;\n const button = (\n <CraftButton\n type=\"button\"\n size=\"sm\"\n variant={resolveActionVariant(action.variant)}\n disabled={isActionDisabled(action, row)}\n className={cn(\"h-8 w-8 p-0\", className)}\n onClick={(event) => {\n event.stopPropagation();\n handleActionClick(action, row);\n }}\n >\n {action.icon ? (\n typeof action.icon === \"string\" ? (\n <CraftIcon name={action.icon} className=\"h-4 w-4\" />\n ) : (\n action.icon\n )\n ) : action.label ? (\n <span className=\"text-[11px]\">{action.label}</span>\n ) : null}\n </CraftButton>\n );\n\n if (tooltip) {\n return (\n <CraftTooltip key={action.key} content={tooltip}>\n {button}\n </CraftTooltip>\n );\n }\n\n return <React.Fragment key={action.key}>{button}</React.Fragment>;\n })}\n </div>\n </td>\n )}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n </div>\n\n <CraftDataTablePagination\n currentPage={resolvedPageIndex}\n totalPages={resolvedPageCount}\n total={filteredData.length}\n pageSize={pageSize}\n selectable={Boolean(resolvedSelectable)}\n selectedCount={Object.values(resolvedSelection).filter(Boolean).length}\n showPagination={enablePagination}\n loading={paginationLoading}\n disabled={loading || dataLoading}\n onPageChange={setPageIndex}\n onPageSizeChange={onPageSizeChange}\n variant={paginationVariant}\n padding={paginationPadding}\n tone={tone}\n />\n </div>\n\n <CraftModal open={showModal} onOpenChange={setShowModal} title=\"Full Text\">\n <div className=\"space-y-3\">\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">Full content</p>\n <div className=\"text-sm text-[rgb(var(--nc-fg))] whitespace-pre-wrap wrap-break-words\">\n {modalContent}\n </div>\n <div className=\"flex justify-end\">\n <CraftButton type=\"button\" variant=\"ghost\" onClick={closeModal}>\n Close\n </CraftButton>\n </div>\n </div>\n </CraftModal>\n </div>\n );\n}\n"],"mappings":"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","names":["className"]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/craft-data-table.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\nimport { CraftButton } from \"@/components/craft-button\";\nimport { CraftCheckbox } from \"@/components/craft-checkbox\";\nimport { CraftIcon } from \"@/components/craft-icon\";\nimport { CraftModal } from \"@/components/craft-modal\";\nimport { CraftTooltip } from \"@/components/craft-tooltip\";\nimport { CraftLoader } from \"@/components/craft-loader\";\nimport { CraftDataTableHeader } from \"@/components/craft-data-table-header\";\nimport { CraftDataTablePagination } from \"@/components/craft-data-table-pagination\";\n\nexport type CraftDataTableColumn<T> = {\n id: string;\n header?: React.ReactNode;\n label?: React.ReactNode;\n accessor?: keyof T | ((row: T) => unknown);\n cell?: (row: T) => React.ReactNode;\n formatter?: (value: unknown, row: T) => React.ReactNode;\n sortable?: boolean;\n filterable?: boolean;\n width?: string | number;\n align?: \"left\" | \"center\" | \"right\";\n hidden?: boolean;\n headerClassName?: string;\n cellClassName?: string;\n truncate?: boolean;\n maxWords?: number;\n};\n\nexport type CraftDataTableSort = {\n id: string;\n desc?: boolean;\n};\n\nexport type CraftDataTableAction<T> = {\n key: string;\n label?: React.ReactNode;\n icon?: string | React.ReactNode;\n variant?:\n | \"solid\"\n | \"outline\"\n | \"ghost\"\n | \"gradient\"\n | \"default\"\n | \"primary\"\n | \"secondary\"\n | \"danger\"\n | \"success\"\n | \"warning\"\n | \"info\"\n | \"subtle\"\n | \"dark\"\n | \"light\"\n | \"primaryOutline\"\n | \"dangerOutline\"\n | \"successOutline\"\n | \"link\";\n permission?: boolean | ((item: T) => boolean);\n visible?: boolean | ((item: T) => boolean);\n disabled?: boolean | ((item: T) => boolean);\n tooltip?: React.ReactNode | ((item: T) => React.ReactNode);\n onClick?: (item: T) => void;\n className?: string | ((item: T) => string);\n};\n\nexport type CraftDataTableProps<T> = {\n data: T[];\n columns: CraftDataTableColumn<T>[];\n title?: React.ReactNode;\n description?: React.ReactNode;\n tone?: ThemeName;\n className?: string;\n toolbar?: React.ReactNode;\n emptyState?: React.ReactNode;\n actions?: CraftDataTableAction<T>[];\n showActionsColumn?: boolean;\n selectable?: boolean;\n enableRowSelection?: boolean;\n selectedRowIds?: Record<string, boolean>;\n onRowSelectionChange?: (selection: Record<string, boolean>) => void;\n getRowId?: (row: T, index: number) => string;\n rowKey?: keyof T | string;\n enableSorting?: boolean;\n enableFiltering?: boolean;\n enableColumnVisibility?: boolean;\n enablePagination?: boolean;\n showGlobalFilter?: boolean;\n manualSorting?: boolean;\n manualFiltering?: boolean;\n manualPagination?: boolean;\n sortBy?: CraftDataTableSort | null;\n onSortChange?: (sort: CraftDataTableSort | null) => void;\n filters?: Record<string, string>;\n onFiltersChange?: (filters: Record<string, string>) => void;\n globalFilter?: string;\n onGlobalFilterChange?: (value: string) => void;\n columnVisibility?: Record<string, boolean>;\n onColumnVisibilityChange?: (visibility: Record<string, boolean>) => void;\n pageIndex?: number;\n pageSize?: number;\n pageCount?: number;\n onPageChange?: (pageIndex: number) => void;\n onPageSizeChange?: (size: number) => void;\n striped?: boolean;\n hoverable?: boolean;\n clickableRows?: boolean;\n emptyText?: string;\n emptySubtitle?: string;\n variant?: \"default\" | \"bordered\" | \"minimal\";\n density?: \"compact\" | \"normal\" | \"comfortable\";\n headerVariant?: \"default\" | \"minimal\";\n headerPadding?: \"compact\" | \"normal\" | \"comfortable\";\n paginationVariant?: \"default\" | \"minimal\";\n paginationPadding?: \"compact\" | \"normal\" | \"comfortable\";\n loading?: boolean;\n dataLoading?: boolean;\n sortLoading?: boolean;\n paginationLoading?: boolean;\n bulkLoading?: boolean;\n rowLoading?: Record<string, boolean>;\n loadingType?: \"spin\" | \"pulse\" | \"bounce\" | \"ripple\" | \"bars\" | \"dots\" | \"ring\";\n loadingSize?: \"small\" | \"medium\" | \"large\" | \"xl\";\n loadingColor?: string;\n loadingText?: string;\n loadingTextPosition?: \"top\" | \"bottom\";\n loadingBackground?: string;\n showSkeleton?: boolean;\n skeletonRows?: number;\n truncateWords?: number;\n enableTextModal?: boolean;\n onRowClick?: (payload: { item: T; index: number }) => void;\n};\n\nfunction getColumnValue<T>(column: CraftDataTableColumn<T>, row: T) {\n if (typeof column.accessor === \"function\") return column.accessor(row);\n const record = row as Record<string, unknown>;\n if (typeof column.accessor === \"string\") return record[column.accessor];\n return record[column.id];\n}\n\nfunction normalizeValue(value: unknown) {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") return value.toLowerCase();\n if (value instanceof Date) return value.getTime();\n return String(value).toLowerCase();\n}\n\nfunction truncateText(text: string, maxWords: number) {\n const words = text.split(\" \");\n if (words.length <= maxWords) return text;\n return `${words.slice(0, maxWords).join(\" \")}...`;\n}\n\nfunction resolveActionVariant(\n variant: CraftDataTableAction<unknown>[\"variant\"]\n): \"solid\" | \"outline\" | \"ghost\" | \"gradient\" {\n switch (variant) {\n case \"solid\":\n case \"default\":\n case \"primary\":\n return \"solid\";\n case \"gradient\":\n return \"gradient\";\n case \"outline\":\n case \"primaryOutline\":\n case \"dangerOutline\":\n case \"successOutline\":\n return \"outline\";\n case \"ghost\":\n case \"link\":\n case \"secondary\":\n case \"danger\":\n case \"success\":\n case \"warning\":\n case \"info\":\n case \"subtle\":\n case \"dark\":\n case \"light\":\n default:\n return \"ghost\";\n }\n}\n\nexport function CraftDataTable<T>({\n data,\n columns,\n title,\n description,\n tone,\n className,\n toolbar,\n emptyState,\n actions = [],\n showActionsColumn = true,\n selectable,\n enableRowSelection = true,\n selectedRowIds,\n onRowSelectionChange,\n getRowId,\n rowKey,\n enableSorting = true,\n enableFiltering = true,\n enableColumnVisibility = true,\n enablePagination = true,\n showGlobalFilter,\n manualSorting = false,\n manualFiltering = false,\n manualPagination = false,\n sortBy,\n onSortChange,\n filters,\n onFiltersChange,\n globalFilter,\n onGlobalFilterChange,\n columnVisibility,\n onColumnVisibilityChange,\n pageIndex,\n pageSize = 10,\n pageCount,\n onPageChange,\n onPageSizeChange,\n striped = false,\n hoverable = true,\n clickableRows = false,\n emptyText = \"No data available\",\n emptySubtitle = \"Try adjusting your search or filter criteria\",\n variant = \"default\",\n density = \"normal\",\n headerVariant = \"default\",\n headerPadding = \"normal\",\n paginationVariant = \"default\",\n paginationPadding = \"normal\",\n loading = false,\n dataLoading = false,\n sortLoading = false,\n paginationLoading = false,\n bulkLoading = false,\n rowLoading = {},\n loadingType = \"dots\",\n loadingSize = \"medium\",\n loadingColor = \"rgb(var(--nc-accent-1))\",\n loadingText = \"Loading...\",\n loadingTextPosition = \"bottom\",\n loadingBackground = \"rgb(var(--nc-accent-soft)/0.1)\",\n showSkeleton = true,\n skeletonRows = 5,\n truncateWords = 10,\n enableTextModal = true,\n onRowClick,\n}: CraftDataTableProps<T>) {\n const [internalSort, setInternalSort] = React.useState<CraftDataTableSort | null>(null);\n const [internalFilters, setInternalFilters] = React.useState<Record<string, string>>({});\n const [internalGlobalFilter, setInternalGlobalFilter] = React.useState(\"\");\n const [internalVisibility, setInternalVisibility] = React.useState<Record<string, boolean>>(() =>\n columns.reduce((acc, column) => {\n acc[column.id] = !column.hidden;\n return acc;\n }, {} as Record<string, boolean>)\n );\n const [internalSelection, setInternalSelection] = React.useState<Record<string, boolean>>({});\n const [internalPageIndex, setInternalPageIndex] = React.useState(0);\n const [showColumns, setShowColumns] = React.useState(false);\n const [showModal, setShowModal] = React.useState(false);\n const [modalContent, setModalContent] = React.useState<string>(\"\");\n\n const resolvedSort = sortBy ?? internalSort;\n const resolvedFilters = filters ?? internalFilters;\n const resolvedGlobalFilter = globalFilter ?? internalGlobalFilter;\n const resolvedVisibility = columnVisibility ?? internalVisibility;\n const resolvedSelection = selectedRowIds ?? internalSelection;\n const resolvedPageIndex = pageIndex ?? internalPageIndex;\n const resolvedSelectable = selectable ?? enableRowSelection;\n\n const setSort = (next: CraftDataTableSort | null) => {\n if (sortBy === undefined) setInternalSort(next);\n onSortChange?.(next);\n };\n\n const setFilters = (next: Record<string, string>) => {\n if (filters === undefined) setInternalFilters(next);\n onFiltersChange?.(next);\n };\n\n const setVisibility = (next: Record<string, boolean>) => {\n if (columnVisibility === undefined) setInternalVisibility(next);\n onColumnVisibilityChange?.(next);\n };\n\n const setSelection = (next: Record<string, boolean>) => {\n if (selectedRowIds === undefined) setInternalSelection(next);\n onRowSelectionChange?.(next);\n };\n\n const setPageIndex = React.useCallback(\n (next: number) => {\n if (pageIndex === undefined) setInternalPageIndex(next);\n onPageChange?.(next);\n },\n [pageIndex, onPageChange]\n );\n\n const visibleColumns = columns.filter(\n (column) => resolvedVisibility[column.id] !== false\n );\n\n const filteredData = React.useMemo(() => {\n if (manualFiltering) return data;\n const globalValue = resolvedGlobalFilter.trim();\n return data.filter((row) => {\n if (globalValue) {\n const matchesGlobal = columns.some((column) => {\n const value = normalizeValue(getColumnValue(column, row));\n return String(value).includes(globalValue.toLowerCase());\n });\n if (!matchesGlobal) return false;\n }\n\n return Object.entries(resolvedFilters).every(([columnId, value]) => {\n if (!value) return true;\n const column = columns.find((col) => col.id === columnId);\n if (!column) return true;\n const cellValue = normalizeValue(getColumnValue(column, row));\n return String(cellValue).includes(value.toLowerCase());\n });\n });\n }, [columns, data, manualFiltering, resolvedFilters, resolvedGlobalFilter]);\n\n const sortedData = React.useMemo(() => {\n if (manualSorting || !resolvedSort) return filteredData;\n const column = columns.find((col) => col.id === resolvedSort.id);\n if (!column) return filteredData;\n const sorted = [...filteredData].sort((a, b) => {\n const valueA = normalizeValue(getColumnValue(column, a));\n const valueB = normalizeValue(getColumnValue(column, b));\n if (typeof valueA === \"number\" && typeof valueB === \"number\") {\n return valueA - valueB;\n }\n return String(valueA).localeCompare(String(valueB));\n });\n return resolvedSort.desc ? sorted.reverse() : sorted;\n }, [columns, filteredData, manualSorting, resolvedSort]);\n\n const resolvedPageCount = manualPagination\n ? Math.max(pageCount ?? 1, 1)\n : Math.max(Math.ceil(sortedData.length / pageSize), 1);\n\n React.useEffect(() => {\n if (resolvedPageIndex > resolvedPageCount - 1) {\n setPageIndex(Math.max(resolvedPageCount - 1, 0));\n }\n }, [resolvedPageCount, resolvedPageIndex, setPageIndex]);\n\n const pagedData = React.useMemo(() => {\n if (!enablePagination || manualPagination) return sortedData;\n const start = resolvedPageIndex * pageSize;\n return sortedData.slice(start, start + pageSize);\n }, [enablePagination, manualPagination, pageSize, resolvedPageIndex, sortedData]);\n\n const rowIdFor = React.useCallback(\n (row: T, index: number) => {\n if (getRowId) return getRowId(row, index);\n if (rowKey) return String((row as Record<string, unknown>)[rowKey as string] ?? index);\n return String(index);\n },\n [getRowId, rowKey]\n );\n\n const pageStartIndex =\n enablePagination && !manualPagination ? resolvedPageIndex * pageSize : 0;\n const pageRowIds = pagedData.map((row: T, index: number) =>\n rowIdFor(row, pageStartIndex + index)\n );\n const allSelected =\n pageRowIds.length > 0 && pageRowIds.every((id) => resolvedSelection[id]);\n const someSelected = pageRowIds.some((id) => resolvedSelection[id]);\n const headerCheckboxRef = React.useRef<HTMLInputElement | null>(null);\n\n React.useEffect(() => {\n if (headerCheckboxRef.current) {\n headerCheckboxRef.current.indeterminate = someSelected && !allSelected;\n }\n }, [someSelected, allSelected]);\n\n const toggleSort = (column: CraftDataTableColumn<T>) => {\n if (!enableSorting || column.sortable === false) return;\n const current = resolvedSort;\n if (!current || current.id !== column.id) {\n setSort({ id: column.id, desc: false });\n return;\n }\n if (!current.desc) {\n setSort({ id: column.id, desc: true });\n return;\n }\n setSort(null);\n };\n\n const resolvedShowGlobalFilter =\n showGlobalFilter ?? (enableFiltering && !toolbar);\n\n const setGlobalFilter = (next: string) => {\n if (globalFilter === undefined) setInternalGlobalFilter(next);\n onGlobalFilterChange?.(next);\n };\n\n const shouldShowActionsColumn = React.useMemo(() => {\n if (!showActionsColumn) return false;\n if (!actions || actions.length === 0) return false;\n return actions.some((action) => {\n if (action.permission === undefined) return true;\n if (typeof action.permission === \"boolean\") return action.permission;\n return true;\n });\n }, [actions, showActionsColumn]);\n\n const getVisibleActions = (item: T) =>\n actions.filter((action) => {\n if (action.permission !== undefined) {\n if (typeof action.permission === \"boolean\" && !action.permission) return false;\n if (typeof action.permission === \"function\" && !action.permission(item)) return false;\n }\n if (action.visible && typeof action.visible === \"function\") {\n return action.visible(item);\n }\n if (typeof action.visible === \"boolean\") return action.visible;\n return true;\n });\n\n const isActionDisabled = (action: CraftDataTableAction<T>, item: T) => {\n if (action.disabled && typeof action.disabled === \"function\") return action.disabled(item);\n if (typeof action.disabled === \"boolean\") return action.disabled;\n return false;\n };\n\n const handleActionClick = (action: CraftDataTableAction<T>, item: T) => {\n if (isActionDisabled(action, item)) return;\n action.onClick?.(item);\n };\n\n const totalColumns =\n visibleColumns.length +\n (resolvedSelectable ? 1 : 0) +\n (shouldShowActionsColumn ? 1 : 0);\n\n const densityPadding = {\n compact: \"px-4 py-2\",\n normal: \"px-6 py-4\",\n comfortable: \"px-8 py-6\",\n } as const;\n\n const headerPaddingClasses = {\n compact: \"px-4 py-2\",\n normal: \"px-6 py-3\",\n comfortable: \"px-8 py-4\",\n } as const;\n\n const rowClassNames = (isSelected: boolean, rowId: string, index: number) =>\n cn(\n \"transition-colors\",\n variant === \"bordered\" && \"border-b border-[rgb(var(--nc-border)/0.2)]\",\n variant === \"minimal\" && \"border-b border-[rgb(var(--nc-border)/0.15)]\",\n striped && index % 2 === 1 && \"bg-[rgb(var(--nc-surface)/0.04)]\",\n hoverable && !clickableRows && \"hover:bg-[rgb(var(--nc-surface)]\",\n clickableRows && \"cursor-pointer hover:bg-[rgb(var(--nc-surface)/0.1)]\",\n isSelected && \"bg-[rgb(var(--nc-accent-1)/0.12)]\",\n rowLoading[rowId] && \"opacity-60\"\n );\n\n const containerClasses = cn(\n \"overflow-hidden rounded-3xl border border-[rgb(var(--nc-border)/0.3)]\",\n \" shadow-[0_18px_50px_rgba(0,0,0,0.35)] backdrop-blur-2xl\",\n variant === \"minimal\" && \"border-transparent bg-transparent shadow-none\"\n );\n\n const openModal = (content: string) => {\n if (!enableTextModal) return;\n setModalContent(content);\n setShowModal(true);\n };\n\n const closeModal = () => {\n setShowModal(false);\n setModalContent(\"\");\n };\n\n return (\n <div className={cn(\"space-y-4\", className)} data-nc-theme={tone}>\n {toolbar}\n\n <CraftDataTableHeader\n title={title}\n description={description}\n variant={headerVariant}\n padding={headerPadding}\n tone={tone}\n filters={\n resolvedShowGlobalFilter ? (\n <div className=\"flex items-center gap-2 rounded-2xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-2 text-xs text-[rgb(var(--nc-fg))]\">\n <CraftIcon name=\"search\" className=\"h-4 w-4 text-[rgb(var(--nc-fg-muted))]\" />\n <input\n type=\"search\"\n value={resolvedGlobalFilter}\n onChange={(event) => setGlobalFilter(event.target.value)}\n placeholder=\"Search all columns...\"\n className=\"w-full max-w-xs bg-transparent text-xs text-[rgb(var(--nc-fg))] placeholder:text-[rgb(var(--nc-fg-muted))] focus:outline-none\"\n />\n </div>\n ) : null\n }\n actions={\n enableColumnVisibility ? (\n <div className=\"relative\">\n <CraftButton\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowColumns((prev) => !prev)}\n >\n Columns\n </CraftButton>\n {showColumns && (\n <div className=\"absolute right-0 top-12 z-20 w-56 rounded-2xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.2)] p-3 shadow-[0_12px_30px_rgba(0,0,0,0.35)] backdrop-blur-2xl\">\n <div className=\"grid gap-2\">\n {columns.map((column) => (\n <label\n key={column.id}\n className=\"flex items-center gap-2 text-xs text-[rgb(var(--nc-fg))]\"\n >\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 accent-[rgb(var(--nc-accent-1))]\"\n checked={resolvedVisibility[column.id] !== false}\n onChange={(event) =>\n setVisibility({\n ...resolvedVisibility,\n [column.id]: event.target.checked,\n })\n }\n />\n {column.header ?? column.label ?? column.id}\n </label>\n ))}\n </div>\n </div>\n )}\n </div>\n ) : null\n }\n />\n\n <div className={containerClasses}>\n <div className=\"relative\">\n <CraftLoader\n loading={loading || dataLoading}\n type={loadingType}\n size={loadingSize}\n color={loadingColor}\n overlay\n text={loadingText}\n textPosition={loadingTextPosition}\n backgroundColor={loadingBackground}\n />\n\n <div className={cn(\"overflow-x-auto\", (loading || dataLoading) && \"opacity-60\")}>\n <table className=\"min-w-full border-collapse text-left text-sm\">\n <thead className=\"bg-[rgb(var(--nc-surface)/0.12)] text-[rgb(var(--nc-fg-muted))]\">\n <tr>\n {resolvedSelectable && (\n <th className={cn(\"w-12\", headerPaddingClasses[density])}>\n <div className=\"flex items-center justify-center\">\n {bulkLoading ? (\n <CraftLoader loading type=\"spin\" size=\"small\" color={loadingColor} />\n ) : (\n <CraftCheckbox\n ref={headerCheckboxRef}\n checked={allSelected}\n onChange={(event) => {\n const next = { ...resolvedSelection };\n pageRowIds.forEach((id) => {\n next[id] = event.target.checked;\n });\n setSelection(next);\n }}\n />\n )}\n </div>\n </th>\n )}\n {visibleColumns.map((column) => {\n const headerLabel = column.header ?? column.label ?? column.id;\n return (\n <th\n key={column.id}\n className={cn(\n headerPaddingClasses[density],\n \"text-xs font-semibold uppercase tracking-[0.2em]\",\n column.headerClassName\n )}\n style={{ width: column.width }}\n >\n <button\n type=\"button\"\n className={cn(\n \"flex w-full items-center gap-2\",\n enableSorting && column.sortable !== false\n ? \"cursor-pointer\"\n : \"cursor-default\"\n )}\n onClick={() => toggleSort(column)}\n >\n <span>{headerLabel}</span>\n {sortLoading && resolvedSort?.id === column.id ? (\n <CraftLoader loading type=\"spin\" size=\"small\" color={loadingColor} />\n ) : null}\n {resolvedSort?.id === column.id && !sortLoading ? (\n <span className=\"text-[rgb(var(--nc-accent-1))]\">\n {resolvedSort.desc ? \"↓\" : \"↑\"}\n </span>\n ) : null}\n </button>\n {enableFiltering && column.filterable !== false && (\n <input\n type=\"text\"\n value={resolvedFilters[column.id] ?? \"\"}\n onChange={(event) =>\n setFilters({\n ...resolvedFilters,\n [column.id]: event.target.value,\n })\n }\n placeholder=\"Filter\"\n className=\"mt-2 w-full rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.18)] px-2 py-1 text-xs text-[rgb(var(--nc-fg))]\"\n />\n )}\n </th>\n );\n })}\n {shouldShowActionsColumn && (\n <th className={cn(headerPaddingClasses[density], \"text-xs uppercase\")}>Actions</th>\n )}\n </tr>\n </thead>\n <tbody className=\"text-[rgb(var(--nc-fg))]\">\n {showSkeleton && (loading || dataLoading) ? (\n Array.from({ length: skeletonRows }).map((_, rowIndex) => (\n <tr key={`skeleton-${rowIndex}`} className=\"animate-pulse\">\n {resolvedSelectable && (\n <td className={cn(headerPaddingClasses[density], \"w-12\")}> \n <div className=\"h-4 w-4 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n </td>\n )}\n {visibleColumns.map((column) => (\n <td key={column.id} className={cn(densityPadding[density])}>\n <div className=\"h-4 w-3/4 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n </td>\n ))}\n {shouldShowActionsColumn && (\n <td className={cn(densityPadding[density])}>\n <div className=\"flex items-center justify-center gap-2\">\n <div className=\"h-6 w-6 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n <div className=\"h-6 w-6 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n </div>\n </td>\n )}\n </tr>\n ))\n ) : pagedData.length === 0 ? (\n <tr>\n <td colSpan={totalColumns} className={cn(densityPadding[density], \"py-12\")}> \n {emptyState ?? (\n <div className=\"flex flex-col items-center justify-center text-center\">\n <CraftIcon\n name=\"search\"\n className=\"mb-4 h-12 w-12 text-[rgb(var(--nc-fg-muted))]\"\n />\n <p className=\"text-base font-semibold text-[rgb(var(--nc-fg))]\">\n {emptyText}\n </p>\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">\n {emptySubtitle}\n </p>\n </div>\n )}\n </td>\n </tr>\n ) : (\n pagedData.map((row: T, rowIndex: number) => {\n const rowId = rowIdFor(row, pageStartIndex + rowIndex);\n const isSelected = Boolean(resolvedSelection[rowId]);\n return (\n <tr\n key={rowId}\n className={rowClassNames(isSelected, rowId, rowIndex)}\n onClick={() => {\n if (!clickableRows) return;\n onRowClick?.({ item: row, index: rowIndex });\n }}\n >\n {resolvedSelectable && (\n <td className={cn(densityPadding[density], \"w-12\")}> \n <CraftCheckbox\n checked={isSelected}\n onChange={(event) =>\n setSelection({\n ...resolvedSelection,\n [rowId]: event.target.checked,\n })\n }\n />\n </td>\n )}\n {visibleColumns.map((column) => {\n const rawValue = getColumnValue(column, row);\n const formatted = column.formatter\n ? column.formatter(rawValue, row)\n : rawValue;\n const content = column.cell\n ? column.cell(row)\n : formatted ?? \"\";\n\n if (\n enableTextModal &&\n !column.cell &&\n typeof formatted === \"string\" &&\n (column.truncate ?? true) &&\n formatted.split(\" \").length > (column.maxWords ?? truncateWords)\n ) {\n const maxWords = column.maxWords ?? truncateWords;\n return (\n <td\n key={column.id}\n className={cn(\n densityPadding[density],\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n column.cellClassName\n )}\n >\n <button\n type=\"button\"\n className=\"text-[rgb(var(--nc-accent-1))] hover:text-[rgb(var(--nc-accent-2))]\"\n onClick={() => openModal(formatted)}\n >\n {truncateText(formatted, maxWords)}\n </button>\n </td>\n );\n }\n\n return (\n <td\n key={column.id}\n className={cn(\n densityPadding[density],\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n column.cellClassName\n )}\n >\n {content as React.ReactNode}\n </td>\n );\n })}\n {shouldShowActionsColumn && (\n <td className={cn(densityPadding[density])}>\n <div className=\"flex items-center justify-center gap-2\">\n {getVisibleActions(row).map((action) => {\n const tooltip =\n typeof action.tooltip === \"function\"\n ? action.tooltip(row)\n : action.tooltip;\n const className =\n typeof action.className === \"function\"\n ? action.className(row)\n : action.className;\n const button = (\n <CraftButton\n type=\"button\"\n size=\"sm\"\n variant={resolveActionVariant(action.variant)}\n disabled={isActionDisabled(action, row)}\n className={cn(\"h-8 w-8 p-0\", className)}\n onClick={(event) => {\n event.stopPropagation();\n handleActionClick(action, row);\n }}\n >\n {action.icon ? (\n typeof action.icon === \"string\" ? (\n <CraftIcon name={action.icon} className=\"h-4 w-4\" />\n ) : (\n action.icon\n )\n ) : action.label ? (\n <span className=\"text-[11px]\">{action.label}</span>\n ) : null}\n </CraftButton>\n );\n\n if (tooltip) {\n return (\n <CraftTooltip key={action.key} content={tooltip}>\n {button}\n </CraftTooltip>\n );\n }\n\n return <React.Fragment key={action.key}>{button}</React.Fragment>;\n })}\n </div>\n </td>\n )}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n </div>\n\n <CraftDataTablePagination\n currentPage={resolvedPageIndex}\n totalPages={resolvedPageCount}\n total={filteredData.length}\n pageSize={pageSize}\n selectable={Boolean(resolvedSelectable)}\n selectedCount={Object.values(resolvedSelection).filter(Boolean).length}\n showPagination={enablePagination}\n loading={paginationLoading}\n disabled={loading || dataLoading}\n onPageChange={setPageIndex}\n onPageSizeChange={onPageSizeChange}\n variant={paginationVariant}\n padding={paginationPadding}\n tone={tone}\n />\n </div>\n\n <CraftModal open={showModal} onOpenChange={setShowModal} title=\"Full Text\">\n <div className=\"space-y-3\">\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">Full content</p>\n <div className=\"text-sm text-[rgb(var(--nc-fg))] whitespace-pre-wrap wrap-break-words\">\n {modalContent}\n </div>\n <div className=\"flex justify-end\">\n <CraftButton type=\"button\" variant=\"ghost\" onClick={closeModal}>\n Close\n </CraftButton>\n </div>\n </div>\n </CraftModal>\n </div>\n );\n}\n"],"mappings":"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","names":["className"]}
|
|
@@ -115,7 +115,7 @@ function CraftDataTable({
|
|
|
115
115
|
loadingColor = "rgb(var(--nc-accent-1))",
|
|
116
116
|
loadingText = "Loading...",
|
|
117
117
|
loadingTextPosition = "bottom",
|
|
118
|
-
loadingBackground = "
|
|
118
|
+
loadingBackground = "rgb(var(--nc-accent-soft)/0.1)",
|
|
119
119
|
showSkeleton = true,
|
|
120
120
|
skeletonRows = 5,
|
|
121
121
|
truncateWords = 10,
|
|
@@ -299,14 +299,14 @@ function CraftDataTable({
|
|
|
299
299
|
variant === "bordered" && "border-b border-[rgb(var(--nc-border)/0.2)]",
|
|
300
300
|
variant === "minimal" && "border-b border-[rgb(var(--nc-border)/0.15)]",
|
|
301
301
|
striped && index % 2 === 1 && "bg-[rgb(var(--nc-surface)/0.04)]",
|
|
302
|
-
hoverable && !clickableRows && "hover:bg-[rgb(var(--nc-surface)
|
|
303
|
-
clickableRows && "cursor-pointer hover:bg-[rgb(var(--nc-surface)/0.
|
|
302
|
+
hoverable && !clickableRows && "hover:bg-[rgb(var(--nc-surface)]",
|
|
303
|
+
clickableRows && "cursor-pointer hover:bg-[rgb(var(--nc-surface)/0.1)]",
|
|
304
304
|
isSelected && "bg-[rgb(var(--nc-accent-1)/0.12)]",
|
|
305
305
|
rowLoading[rowId] && "opacity-60"
|
|
306
306
|
);
|
|
307
307
|
const containerClasses = cn(
|
|
308
308
|
"overflow-hidden rounded-3xl border border-[rgb(var(--nc-border)/0.3)]",
|
|
309
|
-
"
|
|
309
|
+
" shadow-[0_18px_50px_rgba(0,0,0,0.35)] backdrop-blur-2xl",
|
|
310
310
|
variant === "minimal" && "border-transparent bg-transparent shadow-none"
|
|
311
311
|
);
|
|
312
312
|
const openModal = (content) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/craft-data-table.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\nimport { CraftButton } from \"@/components/craft-button\";\nimport { CraftCheckbox } from \"@/components/craft-checkbox\";\nimport { CraftIcon } from \"@/components/craft-icon\";\nimport { CraftModal } from \"@/components/craft-modal\";\nimport { CraftTooltip } from \"@/components/craft-tooltip\";\nimport { CraftLoader } from \"@/components/craft-loader\";\nimport { CraftDataTableHeader } from \"@/components/craft-data-table-header\";\nimport { CraftDataTablePagination } from \"@/components/craft-data-table-pagination\";\n\nexport type CraftDataTableColumn<T> = {\n id: string;\n header?: React.ReactNode;\n label?: React.ReactNode;\n accessor?: keyof T | ((row: T) => unknown);\n cell?: (row: T) => React.ReactNode;\n formatter?: (value: unknown, row: T) => React.ReactNode;\n sortable?: boolean;\n filterable?: boolean;\n width?: string | number;\n align?: \"left\" | \"center\" | \"right\";\n hidden?: boolean;\n headerClassName?: string;\n cellClassName?: string;\n truncate?: boolean;\n maxWords?: number;\n};\n\nexport type CraftDataTableSort = {\n id: string;\n desc?: boolean;\n};\n\nexport type CraftDataTableAction<T> = {\n key: string;\n label?: React.ReactNode;\n icon?: string | React.ReactNode;\n variant?:\n | \"solid\"\n | \"outline\"\n | \"ghost\"\n | \"gradient\"\n | \"default\"\n | \"primary\"\n | \"secondary\"\n | \"danger\"\n | \"success\"\n | \"warning\"\n | \"info\"\n | \"subtle\"\n | \"dark\"\n | \"light\"\n | \"primaryOutline\"\n | \"dangerOutline\"\n | \"successOutline\"\n | \"link\";\n permission?: boolean | ((item: T) => boolean);\n visible?: boolean | ((item: T) => boolean);\n disabled?: boolean | ((item: T) => boolean);\n tooltip?: React.ReactNode | ((item: T) => React.ReactNode);\n onClick?: (item: T) => void;\n className?: string | ((item: T) => string);\n};\n\nexport type CraftDataTableProps<T> = {\n data: T[];\n columns: CraftDataTableColumn<T>[];\n title?: React.ReactNode;\n description?: React.ReactNode;\n tone?: ThemeName;\n className?: string;\n toolbar?: React.ReactNode;\n emptyState?: React.ReactNode;\n actions?: CraftDataTableAction<T>[];\n showActionsColumn?: boolean;\n selectable?: boolean;\n enableRowSelection?: boolean;\n selectedRowIds?: Record<string, boolean>;\n onRowSelectionChange?: (selection: Record<string, boolean>) => void;\n getRowId?: (row: T, index: number) => string;\n rowKey?: keyof T | string;\n enableSorting?: boolean;\n enableFiltering?: boolean;\n enableColumnVisibility?: boolean;\n enablePagination?: boolean;\n showGlobalFilter?: boolean;\n manualSorting?: boolean;\n manualFiltering?: boolean;\n manualPagination?: boolean;\n sortBy?: CraftDataTableSort | null;\n onSortChange?: (sort: CraftDataTableSort | null) => void;\n filters?: Record<string, string>;\n onFiltersChange?: (filters: Record<string, string>) => void;\n globalFilter?: string;\n onGlobalFilterChange?: (value: string) => void;\n columnVisibility?: Record<string, boolean>;\n onColumnVisibilityChange?: (visibility: Record<string, boolean>) => void;\n pageIndex?: number;\n pageSize?: number;\n pageCount?: number;\n onPageChange?: (pageIndex: number) => void;\n onPageSizeChange?: (size: number) => void;\n striped?: boolean;\n hoverable?: boolean;\n clickableRows?: boolean;\n emptyText?: string;\n emptySubtitle?: string;\n variant?: \"default\" | \"bordered\" | \"minimal\";\n density?: \"compact\" | \"normal\" | \"comfortable\";\n headerVariant?: \"default\" | \"minimal\";\n headerPadding?: \"compact\" | \"normal\" | \"comfortable\";\n paginationVariant?: \"default\" | \"minimal\";\n paginationPadding?: \"compact\" | \"normal\" | \"comfortable\";\n loading?: boolean;\n dataLoading?: boolean;\n sortLoading?: boolean;\n paginationLoading?: boolean;\n bulkLoading?: boolean;\n rowLoading?: Record<string, boolean>;\n loadingType?: \"spin\" | \"pulse\" | \"bounce\" | \"ripple\" | \"bars\" | \"dots\" | \"ring\";\n loadingSize?: \"small\" | \"medium\" | \"large\" | \"xl\";\n loadingColor?: string;\n loadingText?: string;\n loadingTextPosition?: \"top\" | \"bottom\";\n loadingBackground?: string;\n showSkeleton?: boolean;\n skeletonRows?: number;\n truncateWords?: number;\n enableTextModal?: boolean;\n onRowClick?: (payload: { item: T; index: number }) => void;\n};\n\nfunction getColumnValue<T>(column: CraftDataTableColumn<T>, row: T) {\n if (typeof column.accessor === \"function\") return column.accessor(row);\n const record = row as Record<string, unknown>;\n if (typeof column.accessor === \"string\") return record[column.accessor];\n return record[column.id];\n}\n\nfunction normalizeValue(value: unknown) {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") return value.toLowerCase();\n if (value instanceof Date) return value.getTime();\n return String(value).toLowerCase();\n}\n\nfunction truncateText(text: string, maxWords: number) {\n const words = text.split(\" \");\n if (words.length <= maxWords) return text;\n return `${words.slice(0, maxWords).join(\" \")}...`;\n}\n\nfunction resolveActionVariant(\n variant: CraftDataTableAction<unknown>[\"variant\"]\n): \"solid\" | \"outline\" | \"ghost\" | \"gradient\" {\n switch (variant) {\n case \"solid\":\n case \"default\":\n case \"primary\":\n return \"solid\";\n case \"gradient\":\n return \"gradient\";\n case \"outline\":\n case \"primaryOutline\":\n case \"dangerOutline\":\n case \"successOutline\":\n return \"outline\";\n case \"ghost\":\n case \"link\":\n case \"secondary\":\n case \"danger\":\n case \"success\":\n case \"warning\":\n case \"info\":\n case \"subtle\":\n case \"dark\":\n case \"light\":\n default:\n return \"ghost\";\n }\n}\n\nexport function CraftDataTable<T>({\n data,\n columns,\n title,\n description,\n tone,\n className,\n toolbar,\n emptyState,\n actions = [],\n showActionsColumn = true,\n selectable,\n enableRowSelection = true,\n selectedRowIds,\n onRowSelectionChange,\n getRowId,\n rowKey,\n enableSorting = true,\n enableFiltering = true,\n enableColumnVisibility = true,\n enablePagination = true,\n showGlobalFilter,\n manualSorting = false,\n manualFiltering = false,\n manualPagination = false,\n sortBy,\n onSortChange,\n filters,\n onFiltersChange,\n globalFilter,\n onGlobalFilterChange,\n columnVisibility,\n onColumnVisibilityChange,\n pageIndex,\n pageSize = 10,\n pageCount,\n onPageChange,\n onPageSizeChange,\n striped = false,\n hoverable = true,\n clickableRows = false,\n emptyText = \"No data available\",\n emptySubtitle = \"Try adjusting your search or filter criteria\",\n variant = \"default\",\n density = \"normal\",\n headerVariant = \"default\",\n headerPadding = \"normal\",\n paginationVariant = \"default\",\n paginationPadding = \"normal\",\n loading = false,\n dataLoading = false,\n sortLoading = false,\n paginationLoading = false,\n bulkLoading = false,\n rowLoading = {},\n loadingType = \"dots\",\n loadingSize = \"medium\",\n loadingColor = \"rgb(var(--nc-accent-1))\",\n loadingText = \"Loading...\",\n loadingTextPosition = \"bottom\",\n loadingBackground = \"rgba(0, 0, 0, 0.35)\",\n showSkeleton = true,\n skeletonRows = 5,\n truncateWords = 10,\n enableTextModal = true,\n onRowClick,\n}: CraftDataTableProps<T>) {\n const [internalSort, setInternalSort] = React.useState<CraftDataTableSort | null>(null);\n const [internalFilters, setInternalFilters] = React.useState<Record<string, string>>({});\n const [internalGlobalFilter, setInternalGlobalFilter] = React.useState(\"\");\n const [internalVisibility, setInternalVisibility] = React.useState<Record<string, boolean>>(() =>\n columns.reduce((acc, column) => {\n acc[column.id] = !column.hidden;\n return acc;\n }, {} as Record<string, boolean>)\n );\n const [internalSelection, setInternalSelection] = React.useState<Record<string, boolean>>({});\n const [internalPageIndex, setInternalPageIndex] = React.useState(0);\n const [showColumns, setShowColumns] = React.useState(false);\n const [showModal, setShowModal] = React.useState(false);\n const [modalContent, setModalContent] = React.useState<string>(\"\");\n\n const resolvedSort = sortBy ?? internalSort;\n const resolvedFilters = filters ?? internalFilters;\n const resolvedGlobalFilter = globalFilter ?? internalGlobalFilter;\n const resolvedVisibility = columnVisibility ?? internalVisibility;\n const resolvedSelection = selectedRowIds ?? internalSelection;\n const resolvedPageIndex = pageIndex ?? internalPageIndex;\n const resolvedSelectable = selectable ?? enableRowSelection;\n\n const setSort = (next: CraftDataTableSort | null) => {\n if (sortBy === undefined) setInternalSort(next);\n onSortChange?.(next);\n };\n\n const setFilters = (next: Record<string, string>) => {\n if (filters === undefined) setInternalFilters(next);\n onFiltersChange?.(next);\n };\n\n const setVisibility = (next: Record<string, boolean>) => {\n if (columnVisibility === undefined) setInternalVisibility(next);\n onColumnVisibilityChange?.(next);\n };\n\n const setSelection = (next: Record<string, boolean>) => {\n if (selectedRowIds === undefined) setInternalSelection(next);\n onRowSelectionChange?.(next);\n };\n\n const setPageIndex = React.useCallback(\n (next: number) => {\n if (pageIndex === undefined) setInternalPageIndex(next);\n onPageChange?.(next);\n },\n [pageIndex, onPageChange]\n );\n\n const visibleColumns = columns.filter(\n (column) => resolvedVisibility[column.id] !== false\n );\n\n const filteredData = React.useMemo(() => {\n if (manualFiltering) return data;\n const globalValue = resolvedGlobalFilter.trim();\n return data.filter((row) => {\n if (globalValue) {\n const matchesGlobal = columns.some((column) => {\n const value = normalizeValue(getColumnValue(column, row));\n return String(value).includes(globalValue.toLowerCase());\n });\n if (!matchesGlobal) return false;\n }\n\n return Object.entries(resolvedFilters).every(([columnId, value]) => {\n if (!value) return true;\n const column = columns.find((col) => col.id === columnId);\n if (!column) return true;\n const cellValue = normalizeValue(getColumnValue(column, row));\n return String(cellValue).includes(value.toLowerCase());\n });\n });\n }, [columns, data, manualFiltering, resolvedFilters, resolvedGlobalFilter]);\n\n const sortedData = React.useMemo(() => {\n if (manualSorting || !resolvedSort) return filteredData;\n const column = columns.find((col) => col.id === resolvedSort.id);\n if (!column) return filteredData;\n const sorted = [...filteredData].sort((a, b) => {\n const valueA = normalizeValue(getColumnValue(column, a));\n const valueB = normalizeValue(getColumnValue(column, b));\n if (typeof valueA === \"number\" && typeof valueB === \"number\") {\n return valueA - valueB;\n }\n return String(valueA).localeCompare(String(valueB));\n });\n return resolvedSort.desc ? sorted.reverse() : sorted;\n }, [columns, filteredData, manualSorting, resolvedSort]);\n\n const resolvedPageCount = manualPagination\n ? Math.max(pageCount ?? 1, 1)\n : Math.max(Math.ceil(sortedData.length / pageSize), 1);\n\n React.useEffect(() => {\n if (resolvedPageIndex > resolvedPageCount - 1) {\n setPageIndex(Math.max(resolvedPageCount - 1, 0));\n }\n }, [resolvedPageCount, resolvedPageIndex, setPageIndex]);\n\n const pagedData = React.useMemo(() => {\n if (!enablePagination || manualPagination) return sortedData;\n const start = resolvedPageIndex * pageSize;\n return sortedData.slice(start, start + pageSize);\n }, [enablePagination, manualPagination, pageSize, resolvedPageIndex, sortedData]);\n\n const rowIdFor = React.useCallback(\n (row: T, index: number) => {\n if (getRowId) return getRowId(row, index);\n if (rowKey) return String((row as Record<string, unknown>)[rowKey as string] ?? index);\n return String(index);\n },\n [getRowId, rowKey]\n );\n\n const pageStartIndex =\n enablePagination && !manualPagination ? resolvedPageIndex * pageSize : 0;\n const pageRowIds = pagedData.map((row: T, index: number) =>\n rowIdFor(row, pageStartIndex + index)\n );\n const allSelected =\n pageRowIds.length > 0 && pageRowIds.every((id) => resolvedSelection[id]);\n const someSelected = pageRowIds.some((id) => resolvedSelection[id]);\n const headerCheckboxRef = React.useRef<HTMLInputElement | null>(null);\n\n React.useEffect(() => {\n if (headerCheckboxRef.current) {\n headerCheckboxRef.current.indeterminate = someSelected && !allSelected;\n }\n }, [someSelected, allSelected]);\n\n const toggleSort = (column: CraftDataTableColumn<T>) => {\n if (!enableSorting || column.sortable === false) return;\n const current = resolvedSort;\n if (!current || current.id !== column.id) {\n setSort({ id: column.id, desc: false });\n return;\n }\n if (!current.desc) {\n setSort({ id: column.id, desc: true });\n return;\n }\n setSort(null);\n };\n\n const resolvedShowGlobalFilter =\n showGlobalFilter ?? (enableFiltering && !toolbar);\n\n const setGlobalFilter = (next: string) => {\n if (globalFilter === undefined) setInternalGlobalFilter(next);\n onGlobalFilterChange?.(next);\n };\n\n const shouldShowActionsColumn = React.useMemo(() => {\n if (!showActionsColumn) return false;\n if (!actions || actions.length === 0) return false;\n return actions.some((action) => {\n if (action.permission === undefined) return true;\n if (typeof action.permission === \"boolean\") return action.permission;\n return true;\n });\n }, [actions, showActionsColumn]);\n\n const getVisibleActions = (item: T) =>\n actions.filter((action) => {\n if (action.permission !== undefined) {\n if (typeof action.permission === \"boolean\" && !action.permission) return false;\n if (typeof action.permission === \"function\" && !action.permission(item)) return false;\n }\n if (action.visible && typeof action.visible === \"function\") {\n return action.visible(item);\n }\n if (typeof action.visible === \"boolean\") return action.visible;\n return true;\n });\n\n const isActionDisabled = (action: CraftDataTableAction<T>, item: T) => {\n if (action.disabled && typeof action.disabled === \"function\") return action.disabled(item);\n if (typeof action.disabled === \"boolean\") return action.disabled;\n return false;\n };\n\n const handleActionClick = (action: CraftDataTableAction<T>, item: T) => {\n if (isActionDisabled(action, item)) return;\n action.onClick?.(item);\n };\n\n const totalColumns =\n visibleColumns.length +\n (resolvedSelectable ? 1 : 0) +\n (shouldShowActionsColumn ? 1 : 0);\n\n const densityPadding = {\n compact: \"px-4 py-2\",\n normal: \"px-6 py-4\",\n comfortable: \"px-8 py-6\",\n } as const;\n\n const headerPaddingClasses = {\n compact: \"px-4 py-2\",\n normal: \"px-6 py-3\",\n comfortable: \"px-8 py-4\",\n } as const;\n\n const rowClassNames = (isSelected: boolean, rowId: string, index: number) =>\n cn(\n \"transition-colors\",\n variant === \"bordered\" && \"border-b border-[rgb(var(--nc-border)/0.2)]\",\n variant === \"minimal\" && \"border-b border-[rgb(var(--nc-border)/0.15)]\",\n striped && index % 2 === 1 && \"bg-[rgb(var(--nc-surface)/0.04)]\",\n hoverable && !clickableRows && \"hover:bg-[rgb(var(--nc-surface)/0.12)]\",\n clickableRows && \"cursor-pointer hover:bg-[rgb(var(--nc-surface)/0.16)]\",\n isSelected && \"bg-[rgb(var(--nc-accent-1)/0.12)]\",\n rowLoading[rowId] && \"opacity-60\"\n );\n\n const containerClasses = cn(\n \"overflow-hidden rounded-3xl border border-[rgb(var(--nc-border)/0.3)]\",\n \"bg-[rgb(var(--nc-surface)/0.08)] shadow-[0_18px_50px_rgba(0,0,0,0.35)] backdrop-blur-2xl\",\n variant === \"minimal\" && \"border-transparent bg-transparent shadow-none\"\n );\n\n const openModal = (content: string) => {\n if (!enableTextModal) return;\n setModalContent(content);\n setShowModal(true);\n };\n\n const closeModal = () => {\n setShowModal(false);\n setModalContent(\"\");\n };\n\n return (\n <div className={cn(\"space-y-4\", className)} data-nc-theme={tone}>\n {toolbar}\n\n <CraftDataTableHeader\n title={title}\n description={description}\n variant={headerVariant}\n padding={headerPadding}\n tone={tone}\n filters={\n resolvedShowGlobalFilter ? (\n <div className=\"flex items-center gap-2 rounded-2xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-2 text-xs text-[rgb(var(--nc-fg))]\">\n <CraftIcon name=\"search\" className=\"h-4 w-4 text-[rgb(var(--nc-fg-muted))]\" />\n <input\n type=\"search\"\n value={resolvedGlobalFilter}\n onChange={(event) => setGlobalFilter(event.target.value)}\n placeholder=\"Search all columns...\"\n className=\"w-full max-w-xs bg-transparent text-xs text-[rgb(var(--nc-fg))] placeholder:text-[rgb(var(--nc-fg-muted))] focus:outline-none\"\n />\n </div>\n ) : null\n }\n actions={\n enableColumnVisibility ? (\n <div className=\"relative\">\n <CraftButton\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowColumns((prev) => !prev)}\n >\n Columns\n </CraftButton>\n {showColumns && (\n <div className=\"absolute right-0 top-12 z-20 w-56 rounded-2xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.2)] p-3 shadow-[0_12px_30px_rgba(0,0,0,0.35)] backdrop-blur-2xl\">\n <div className=\"grid gap-2\">\n {columns.map((column) => (\n <label\n key={column.id}\n className=\"flex items-center gap-2 text-xs text-[rgb(var(--nc-fg))]\"\n >\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 accent-[rgb(var(--nc-accent-1))]\"\n checked={resolvedVisibility[column.id] !== false}\n onChange={(event) =>\n setVisibility({\n ...resolvedVisibility,\n [column.id]: event.target.checked,\n })\n }\n />\n {column.header ?? column.label ?? column.id}\n </label>\n ))}\n </div>\n </div>\n )}\n </div>\n ) : null\n }\n />\n\n <div className={containerClasses}>\n <div className=\"relative\">\n <CraftLoader\n loading={loading || dataLoading}\n type={loadingType}\n size={loadingSize}\n color={loadingColor}\n overlay\n text={loadingText}\n textPosition={loadingTextPosition}\n backgroundColor={loadingBackground}\n />\n\n <div className={cn(\"overflow-x-auto\", (loading || dataLoading) && \"opacity-60\")}>\n <table className=\"min-w-full border-collapse text-left text-sm\">\n <thead className=\"bg-[rgb(var(--nc-surface)/0.12)] text-[rgb(var(--nc-fg-muted))]\">\n <tr>\n {resolvedSelectable && (\n <th className={cn(\"w-12\", headerPaddingClasses[density])}>\n <div className=\"flex items-center justify-center\">\n {bulkLoading ? (\n <CraftLoader loading type=\"spin\" size=\"small\" color={loadingColor} />\n ) : (\n <CraftCheckbox\n ref={headerCheckboxRef}\n checked={allSelected}\n onChange={(event) => {\n const next = { ...resolvedSelection };\n pageRowIds.forEach((id) => {\n next[id] = event.target.checked;\n });\n setSelection(next);\n }}\n />\n )}\n </div>\n </th>\n )}\n {visibleColumns.map((column) => {\n const headerLabel = column.header ?? column.label ?? column.id;\n return (\n <th\n key={column.id}\n className={cn(\n headerPaddingClasses[density],\n \"text-xs font-semibold uppercase tracking-[0.2em]\",\n column.headerClassName\n )}\n style={{ width: column.width }}\n >\n <button\n type=\"button\"\n className={cn(\n \"flex w-full items-center gap-2\",\n enableSorting && column.sortable !== false\n ? \"cursor-pointer\"\n : \"cursor-default\"\n )}\n onClick={() => toggleSort(column)}\n >\n <span>{headerLabel}</span>\n {sortLoading && resolvedSort?.id === column.id ? (\n <CraftLoader loading type=\"spin\" size=\"small\" color={loadingColor} />\n ) : null}\n {resolvedSort?.id === column.id && !sortLoading ? (\n <span className=\"text-[rgb(var(--nc-accent-1))]\">\n {resolvedSort.desc ? \"↓\" : \"↑\"}\n </span>\n ) : null}\n </button>\n {enableFiltering && column.filterable !== false && (\n <input\n type=\"text\"\n value={resolvedFilters[column.id] ?? \"\"}\n onChange={(event) =>\n setFilters({\n ...resolvedFilters,\n [column.id]: event.target.value,\n })\n }\n placeholder=\"Filter\"\n className=\"mt-2 w-full rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.18)] px-2 py-1 text-xs text-[rgb(var(--nc-fg))]\"\n />\n )}\n </th>\n );\n })}\n {shouldShowActionsColumn && (\n <th className={cn(headerPaddingClasses[density], \"text-xs uppercase\")}>Actions</th>\n )}\n </tr>\n </thead>\n <tbody className=\"text-[rgb(var(--nc-fg))]\">\n {showSkeleton && (loading || dataLoading) ? (\n Array.from({ length: skeletonRows }).map((_, rowIndex) => (\n <tr key={`skeleton-${rowIndex}`} className=\"animate-pulse\">\n {resolvedSelectable && (\n <td className={cn(headerPaddingClasses[density], \"w-12\")}> \n <div className=\"h-4 w-4 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n </td>\n )}\n {visibleColumns.map((column) => (\n <td key={column.id} className={cn(densityPadding[density])}>\n <div className=\"h-4 w-3/4 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n </td>\n ))}\n {shouldShowActionsColumn && (\n <td className={cn(densityPadding[density])}>\n <div className=\"flex items-center justify-center gap-2\">\n <div className=\"h-6 w-6 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n <div className=\"h-6 w-6 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n </div>\n </td>\n )}\n </tr>\n ))\n ) : pagedData.length === 0 ? (\n <tr>\n <td colSpan={totalColumns} className={cn(densityPadding[density], \"py-12\")}> \n {emptyState ?? (\n <div className=\"flex flex-col items-center justify-center text-center\">\n <CraftIcon\n name=\"search\"\n className=\"mb-4 h-12 w-12 text-[rgb(var(--nc-fg-muted))]\"\n />\n <p className=\"text-base font-semibold text-[rgb(var(--nc-fg))]\">\n {emptyText}\n </p>\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">\n {emptySubtitle}\n </p>\n </div>\n )}\n </td>\n </tr>\n ) : (\n pagedData.map((row: T, rowIndex: number) => {\n const rowId = rowIdFor(row, pageStartIndex + rowIndex);\n const isSelected = Boolean(resolvedSelection[rowId]);\n return (\n <tr\n key={rowId}\n className={rowClassNames(isSelected, rowId, rowIndex)}\n onClick={() => {\n if (!clickableRows) return;\n onRowClick?.({ item: row, index: rowIndex });\n }}\n >\n {resolvedSelectable && (\n <td className={cn(densityPadding[density], \"w-12\")}> \n <CraftCheckbox\n checked={isSelected}\n onChange={(event) =>\n setSelection({\n ...resolvedSelection,\n [rowId]: event.target.checked,\n })\n }\n />\n </td>\n )}\n {visibleColumns.map((column) => {\n const rawValue = getColumnValue(column, row);\n const formatted = column.formatter\n ? column.formatter(rawValue, row)\n : rawValue;\n const content = column.cell\n ? column.cell(row)\n : formatted ?? \"\";\n\n if (\n enableTextModal &&\n !column.cell &&\n typeof formatted === \"string\" &&\n (column.truncate ?? true) &&\n formatted.split(\" \").length > (column.maxWords ?? truncateWords)\n ) {\n const maxWords = column.maxWords ?? truncateWords;\n return (\n <td\n key={column.id}\n className={cn(\n densityPadding[density],\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n column.cellClassName\n )}\n >\n <button\n type=\"button\"\n className=\"text-[rgb(var(--nc-accent-1))] hover:text-[rgb(var(--nc-accent-2))]\"\n onClick={() => openModal(formatted)}\n >\n {truncateText(formatted, maxWords)}\n </button>\n </td>\n );\n }\n\n return (\n <td\n key={column.id}\n className={cn(\n densityPadding[density],\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n column.cellClassName\n )}\n >\n {content as React.ReactNode}\n </td>\n );\n })}\n {shouldShowActionsColumn && (\n <td className={cn(densityPadding[density])}>\n <div className=\"flex items-center justify-center gap-2\">\n {getVisibleActions(row).map((action) => {\n const tooltip =\n typeof action.tooltip === \"function\"\n ? action.tooltip(row)\n : action.tooltip;\n const className =\n typeof action.className === \"function\"\n ? action.className(row)\n : action.className;\n const button = (\n <CraftButton\n type=\"button\"\n size=\"sm\"\n variant={resolveActionVariant(action.variant)}\n disabled={isActionDisabled(action, row)}\n className={cn(\"h-8 w-8 p-0\", className)}\n onClick={(event) => {\n event.stopPropagation();\n handleActionClick(action, row);\n }}\n >\n {action.icon ? (\n typeof action.icon === \"string\" ? (\n <CraftIcon name={action.icon} className=\"h-4 w-4\" />\n ) : (\n action.icon\n )\n ) : action.label ? (\n <span className=\"text-[11px]\">{action.label}</span>\n ) : null}\n </CraftButton>\n );\n\n if (tooltip) {\n return (\n <CraftTooltip key={action.key} content={tooltip}>\n {button}\n </CraftTooltip>\n );\n }\n\n return <React.Fragment key={action.key}>{button}</React.Fragment>;\n })}\n </div>\n </td>\n )}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n </div>\n\n <CraftDataTablePagination\n currentPage={resolvedPageIndex}\n totalPages={resolvedPageCount}\n total={filteredData.length}\n pageSize={pageSize}\n selectable={Boolean(resolvedSelectable)}\n selectedCount={Object.values(resolvedSelection).filter(Boolean).length}\n showPagination={enablePagination}\n loading={paginationLoading}\n disabled={loading || dataLoading}\n onPageChange={setPageIndex}\n onPageSizeChange={onPageSizeChange}\n variant={paginationVariant}\n padding={paginationPadding}\n tone={tone}\n />\n </div>\n\n <CraftModal open={showModal} onOpenChange={setShowModal} title=\"Full Text\">\n <div className=\"space-y-3\">\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">Full content</p>\n <div className=\"text-sm text-[rgb(var(--nc-fg))] whitespace-pre-wrap wrap-break-words\">\n {modalContent}\n </div>\n <div className=\"flex justify-end\">\n <CraftButton type=\"button\" variant=\"ghost\" onClick={closeModal}>\n Close\n </CraftButton>\n </div>\n </div>\n </CraftModal>\n </div>\n );\n}\n"],"mappings":"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","names":["className"]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/craft-data-table.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\nimport { CraftButton } from \"@/components/craft-button\";\nimport { CraftCheckbox } from \"@/components/craft-checkbox\";\nimport { CraftIcon } from \"@/components/craft-icon\";\nimport { CraftModal } from \"@/components/craft-modal\";\nimport { CraftTooltip } from \"@/components/craft-tooltip\";\nimport { CraftLoader } from \"@/components/craft-loader\";\nimport { CraftDataTableHeader } from \"@/components/craft-data-table-header\";\nimport { CraftDataTablePagination } from \"@/components/craft-data-table-pagination\";\n\nexport type CraftDataTableColumn<T> = {\n id: string;\n header?: React.ReactNode;\n label?: React.ReactNode;\n accessor?: keyof T | ((row: T) => unknown);\n cell?: (row: T) => React.ReactNode;\n formatter?: (value: unknown, row: T) => React.ReactNode;\n sortable?: boolean;\n filterable?: boolean;\n width?: string | number;\n align?: \"left\" | \"center\" | \"right\";\n hidden?: boolean;\n headerClassName?: string;\n cellClassName?: string;\n truncate?: boolean;\n maxWords?: number;\n};\n\nexport type CraftDataTableSort = {\n id: string;\n desc?: boolean;\n};\n\nexport type CraftDataTableAction<T> = {\n key: string;\n label?: React.ReactNode;\n icon?: string | React.ReactNode;\n variant?:\n | \"solid\"\n | \"outline\"\n | \"ghost\"\n | \"gradient\"\n | \"default\"\n | \"primary\"\n | \"secondary\"\n | \"danger\"\n | \"success\"\n | \"warning\"\n | \"info\"\n | \"subtle\"\n | \"dark\"\n | \"light\"\n | \"primaryOutline\"\n | \"dangerOutline\"\n | \"successOutline\"\n | \"link\";\n permission?: boolean | ((item: T) => boolean);\n visible?: boolean | ((item: T) => boolean);\n disabled?: boolean | ((item: T) => boolean);\n tooltip?: React.ReactNode | ((item: T) => React.ReactNode);\n onClick?: (item: T) => void;\n className?: string | ((item: T) => string);\n};\n\nexport type CraftDataTableProps<T> = {\n data: T[];\n columns: CraftDataTableColumn<T>[];\n title?: React.ReactNode;\n description?: React.ReactNode;\n tone?: ThemeName;\n className?: string;\n toolbar?: React.ReactNode;\n emptyState?: React.ReactNode;\n actions?: CraftDataTableAction<T>[];\n showActionsColumn?: boolean;\n selectable?: boolean;\n enableRowSelection?: boolean;\n selectedRowIds?: Record<string, boolean>;\n onRowSelectionChange?: (selection: Record<string, boolean>) => void;\n getRowId?: (row: T, index: number) => string;\n rowKey?: keyof T | string;\n enableSorting?: boolean;\n enableFiltering?: boolean;\n enableColumnVisibility?: boolean;\n enablePagination?: boolean;\n showGlobalFilter?: boolean;\n manualSorting?: boolean;\n manualFiltering?: boolean;\n manualPagination?: boolean;\n sortBy?: CraftDataTableSort | null;\n onSortChange?: (sort: CraftDataTableSort | null) => void;\n filters?: Record<string, string>;\n onFiltersChange?: (filters: Record<string, string>) => void;\n globalFilter?: string;\n onGlobalFilterChange?: (value: string) => void;\n columnVisibility?: Record<string, boolean>;\n onColumnVisibilityChange?: (visibility: Record<string, boolean>) => void;\n pageIndex?: number;\n pageSize?: number;\n pageCount?: number;\n onPageChange?: (pageIndex: number) => void;\n onPageSizeChange?: (size: number) => void;\n striped?: boolean;\n hoverable?: boolean;\n clickableRows?: boolean;\n emptyText?: string;\n emptySubtitle?: string;\n variant?: \"default\" | \"bordered\" | \"minimal\";\n density?: \"compact\" | \"normal\" | \"comfortable\";\n headerVariant?: \"default\" | \"minimal\";\n headerPadding?: \"compact\" | \"normal\" | \"comfortable\";\n paginationVariant?: \"default\" | \"minimal\";\n paginationPadding?: \"compact\" | \"normal\" | \"comfortable\";\n loading?: boolean;\n dataLoading?: boolean;\n sortLoading?: boolean;\n paginationLoading?: boolean;\n bulkLoading?: boolean;\n rowLoading?: Record<string, boolean>;\n loadingType?: \"spin\" | \"pulse\" | \"bounce\" | \"ripple\" | \"bars\" | \"dots\" | \"ring\";\n loadingSize?: \"small\" | \"medium\" | \"large\" | \"xl\";\n loadingColor?: string;\n loadingText?: string;\n loadingTextPosition?: \"top\" | \"bottom\";\n loadingBackground?: string;\n showSkeleton?: boolean;\n skeletonRows?: number;\n truncateWords?: number;\n enableTextModal?: boolean;\n onRowClick?: (payload: { item: T; index: number }) => void;\n};\n\nfunction getColumnValue<T>(column: CraftDataTableColumn<T>, row: T) {\n if (typeof column.accessor === \"function\") return column.accessor(row);\n const record = row as Record<string, unknown>;\n if (typeof column.accessor === \"string\") return record[column.accessor];\n return record[column.id];\n}\n\nfunction normalizeValue(value: unknown) {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") return value.toLowerCase();\n if (value instanceof Date) return value.getTime();\n return String(value).toLowerCase();\n}\n\nfunction truncateText(text: string, maxWords: number) {\n const words = text.split(\" \");\n if (words.length <= maxWords) return text;\n return `${words.slice(0, maxWords).join(\" \")}...`;\n}\n\nfunction resolveActionVariant(\n variant: CraftDataTableAction<unknown>[\"variant\"]\n): \"solid\" | \"outline\" | \"ghost\" | \"gradient\" {\n switch (variant) {\n case \"solid\":\n case \"default\":\n case \"primary\":\n return \"solid\";\n case \"gradient\":\n return \"gradient\";\n case \"outline\":\n case \"primaryOutline\":\n case \"dangerOutline\":\n case \"successOutline\":\n return \"outline\";\n case \"ghost\":\n case \"link\":\n case \"secondary\":\n case \"danger\":\n case \"success\":\n case \"warning\":\n case \"info\":\n case \"subtle\":\n case \"dark\":\n case \"light\":\n default:\n return \"ghost\";\n }\n}\n\nexport function CraftDataTable<T>({\n data,\n columns,\n title,\n description,\n tone,\n className,\n toolbar,\n emptyState,\n actions = [],\n showActionsColumn = true,\n selectable,\n enableRowSelection = true,\n selectedRowIds,\n onRowSelectionChange,\n getRowId,\n rowKey,\n enableSorting = true,\n enableFiltering = true,\n enableColumnVisibility = true,\n enablePagination = true,\n showGlobalFilter,\n manualSorting = false,\n manualFiltering = false,\n manualPagination = false,\n sortBy,\n onSortChange,\n filters,\n onFiltersChange,\n globalFilter,\n onGlobalFilterChange,\n columnVisibility,\n onColumnVisibilityChange,\n pageIndex,\n pageSize = 10,\n pageCount,\n onPageChange,\n onPageSizeChange,\n striped = false,\n hoverable = true,\n clickableRows = false,\n emptyText = \"No data available\",\n emptySubtitle = \"Try adjusting your search or filter criteria\",\n variant = \"default\",\n density = \"normal\",\n headerVariant = \"default\",\n headerPadding = \"normal\",\n paginationVariant = \"default\",\n paginationPadding = \"normal\",\n loading = false,\n dataLoading = false,\n sortLoading = false,\n paginationLoading = false,\n bulkLoading = false,\n rowLoading = {},\n loadingType = \"dots\",\n loadingSize = \"medium\",\n loadingColor = \"rgb(var(--nc-accent-1))\",\n loadingText = \"Loading...\",\n loadingTextPosition = \"bottom\",\n loadingBackground = \"rgb(var(--nc-accent-soft)/0.1)\",\n showSkeleton = true,\n skeletonRows = 5,\n truncateWords = 10,\n enableTextModal = true,\n onRowClick,\n}: CraftDataTableProps<T>) {\n const [internalSort, setInternalSort] = React.useState<CraftDataTableSort | null>(null);\n const [internalFilters, setInternalFilters] = React.useState<Record<string, string>>({});\n const [internalGlobalFilter, setInternalGlobalFilter] = React.useState(\"\");\n const [internalVisibility, setInternalVisibility] = React.useState<Record<string, boolean>>(() =>\n columns.reduce((acc, column) => {\n acc[column.id] = !column.hidden;\n return acc;\n }, {} as Record<string, boolean>)\n );\n const [internalSelection, setInternalSelection] = React.useState<Record<string, boolean>>({});\n const [internalPageIndex, setInternalPageIndex] = React.useState(0);\n const [showColumns, setShowColumns] = React.useState(false);\n const [showModal, setShowModal] = React.useState(false);\n const [modalContent, setModalContent] = React.useState<string>(\"\");\n\n const resolvedSort = sortBy ?? internalSort;\n const resolvedFilters = filters ?? internalFilters;\n const resolvedGlobalFilter = globalFilter ?? internalGlobalFilter;\n const resolvedVisibility = columnVisibility ?? internalVisibility;\n const resolvedSelection = selectedRowIds ?? internalSelection;\n const resolvedPageIndex = pageIndex ?? internalPageIndex;\n const resolvedSelectable = selectable ?? enableRowSelection;\n\n const setSort = (next: CraftDataTableSort | null) => {\n if (sortBy === undefined) setInternalSort(next);\n onSortChange?.(next);\n };\n\n const setFilters = (next: Record<string, string>) => {\n if (filters === undefined) setInternalFilters(next);\n onFiltersChange?.(next);\n };\n\n const setVisibility = (next: Record<string, boolean>) => {\n if (columnVisibility === undefined) setInternalVisibility(next);\n onColumnVisibilityChange?.(next);\n };\n\n const setSelection = (next: Record<string, boolean>) => {\n if (selectedRowIds === undefined) setInternalSelection(next);\n onRowSelectionChange?.(next);\n };\n\n const setPageIndex = React.useCallback(\n (next: number) => {\n if (pageIndex === undefined) setInternalPageIndex(next);\n onPageChange?.(next);\n },\n [pageIndex, onPageChange]\n );\n\n const visibleColumns = columns.filter(\n (column) => resolvedVisibility[column.id] !== false\n );\n\n const filteredData = React.useMemo(() => {\n if (manualFiltering) return data;\n const globalValue = resolvedGlobalFilter.trim();\n return data.filter((row) => {\n if (globalValue) {\n const matchesGlobal = columns.some((column) => {\n const value = normalizeValue(getColumnValue(column, row));\n return String(value).includes(globalValue.toLowerCase());\n });\n if (!matchesGlobal) return false;\n }\n\n return Object.entries(resolvedFilters).every(([columnId, value]) => {\n if (!value) return true;\n const column = columns.find((col) => col.id === columnId);\n if (!column) return true;\n const cellValue = normalizeValue(getColumnValue(column, row));\n return String(cellValue).includes(value.toLowerCase());\n });\n });\n }, [columns, data, manualFiltering, resolvedFilters, resolvedGlobalFilter]);\n\n const sortedData = React.useMemo(() => {\n if (manualSorting || !resolvedSort) return filteredData;\n const column = columns.find((col) => col.id === resolvedSort.id);\n if (!column) return filteredData;\n const sorted = [...filteredData].sort((a, b) => {\n const valueA = normalizeValue(getColumnValue(column, a));\n const valueB = normalizeValue(getColumnValue(column, b));\n if (typeof valueA === \"number\" && typeof valueB === \"number\") {\n return valueA - valueB;\n }\n return String(valueA).localeCompare(String(valueB));\n });\n return resolvedSort.desc ? sorted.reverse() : sorted;\n }, [columns, filteredData, manualSorting, resolvedSort]);\n\n const resolvedPageCount = manualPagination\n ? Math.max(pageCount ?? 1, 1)\n : Math.max(Math.ceil(sortedData.length / pageSize), 1);\n\n React.useEffect(() => {\n if (resolvedPageIndex > resolvedPageCount - 1) {\n setPageIndex(Math.max(resolvedPageCount - 1, 0));\n }\n }, [resolvedPageCount, resolvedPageIndex, setPageIndex]);\n\n const pagedData = React.useMemo(() => {\n if (!enablePagination || manualPagination) return sortedData;\n const start = resolvedPageIndex * pageSize;\n return sortedData.slice(start, start + pageSize);\n }, [enablePagination, manualPagination, pageSize, resolvedPageIndex, sortedData]);\n\n const rowIdFor = React.useCallback(\n (row: T, index: number) => {\n if (getRowId) return getRowId(row, index);\n if (rowKey) return String((row as Record<string, unknown>)[rowKey as string] ?? index);\n return String(index);\n },\n [getRowId, rowKey]\n );\n\n const pageStartIndex =\n enablePagination && !manualPagination ? resolvedPageIndex * pageSize : 0;\n const pageRowIds = pagedData.map((row: T, index: number) =>\n rowIdFor(row, pageStartIndex + index)\n );\n const allSelected =\n pageRowIds.length > 0 && pageRowIds.every((id) => resolvedSelection[id]);\n const someSelected = pageRowIds.some((id) => resolvedSelection[id]);\n const headerCheckboxRef = React.useRef<HTMLInputElement | null>(null);\n\n React.useEffect(() => {\n if (headerCheckboxRef.current) {\n headerCheckboxRef.current.indeterminate = someSelected && !allSelected;\n }\n }, [someSelected, allSelected]);\n\n const toggleSort = (column: CraftDataTableColumn<T>) => {\n if (!enableSorting || column.sortable === false) return;\n const current = resolvedSort;\n if (!current || current.id !== column.id) {\n setSort({ id: column.id, desc: false });\n return;\n }\n if (!current.desc) {\n setSort({ id: column.id, desc: true });\n return;\n }\n setSort(null);\n };\n\n const resolvedShowGlobalFilter =\n showGlobalFilter ?? (enableFiltering && !toolbar);\n\n const setGlobalFilter = (next: string) => {\n if (globalFilter === undefined) setInternalGlobalFilter(next);\n onGlobalFilterChange?.(next);\n };\n\n const shouldShowActionsColumn = React.useMemo(() => {\n if (!showActionsColumn) return false;\n if (!actions || actions.length === 0) return false;\n return actions.some((action) => {\n if (action.permission === undefined) return true;\n if (typeof action.permission === \"boolean\") return action.permission;\n return true;\n });\n }, [actions, showActionsColumn]);\n\n const getVisibleActions = (item: T) =>\n actions.filter((action) => {\n if (action.permission !== undefined) {\n if (typeof action.permission === \"boolean\" && !action.permission) return false;\n if (typeof action.permission === \"function\" && !action.permission(item)) return false;\n }\n if (action.visible && typeof action.visible === \"function\") {\n return action.visible(item);\n }\n if (typeof action.visible === \"boolean\") return action.visible;\n return true;\n });\n\n const isActionDisabled = (action: CraftDataTableAction<T>, item: T) => {\n if (action.disabled && typeof action.disabled === \"function\") return action.disabled(item);\n if (typeof action.disabled === \"boolean\") return action.disabled;\n return false;\n };\n\n const handleActionClick = (action: CraftDataTableAction<T>, item: T) => {\n if (isActionDisabled(action, item)) return;\n action.onClick?.(item);\n };\n\n const totalColumns =\n visibleColumns.length +\n (resolvedSelectable ? 1 : 0) +\n (shouldShowActionsColumn ? 1 : 0);\n\n const densityPadding = {\n compact: \"px-4 py-2\",\n normal: \"px-6 py-4\",\n comfortable: \"px-8 py-6\",\n } as const;\n\n const headerPaddingClasses = {\n compact: \"px-4 py-2\",\n normal: \"px-6 py-3\",\n comfortable: \"px-8 py-4\",\n } as const;\n\n const rowClassNames = (isSelected: boolean, rowId: string, index: number) =>\n cn(\n \"transition-colors\",\n variant === \"bordered\" && \"border-b border-[rgb(var(--nc-border)/0.2)]\",\n variant === \"minimal\" && \"border-b border-[rgb(var(--nc-border)/0.15)]\",\n striped && index % 2 === 1 && \"bg-[rgb(var(--nc-surface)/0.04)]\",\n hoverable && !clickableRows && \"hover:bg-[rgb(var(--nc-surface)]\",\n clickableRows && \"cursor-pointer hover:bg-[rgb(var(--nc-surface)/0.1)]\",\n isSelected && \"bg-[rgb(var(--nc-accent-1)/0.12)]\",\n rowLoading[rowId] && \"opacity-60\"\n );\n\n const containerClasses = cn(\n \"overflow-hidden rounded-3xl border border-[rgb(var(--nc-border)/0.3)]\",\n \" shadow-[0_18px_50px_rgba(0,0,0,0.35)] backdrop-blur-2xl\",\n variant === \"minimal\" && \"border-transparent bg-transparent shadow-none\"\n );\n\n const openModal = (content: string) => {\n if (!enableTextModal) return;\n setModalContent(content);\n setShowModal(true);\n };\n\n const closeModal = () => {\n setShowModal(false);\n setModalContent(\"\");\n };\n\n return (\n <div className={cn(\"space-y-4\", className)} data-nc-theme={tone}>\n {toolbar}\n\n <CraftDataTableHeader\n title={title}\n description={description}\n variant={headerVariant}\n padding={headerPadding}\n tone={tone}\n filters={\n resolvedShowGlobalFilter ? (\n <div className=\"flex items-center gap-2 rounded-2xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-2 text-xs text-[rgb(var(--nc-fg))]\">\n <CraftIcon name=\"search\" className=\"h-4 w-4 text-[rgb(var(--nc-fg-muted))]\" />\n <input\n type=\"search\"\n value={resolvedGlobalFilter}\n onChange={(event) => setGlobalFilter(event.target.value)}\n placeholder=\"Search all columns...\"\n className=\"w-full max-w-xs bg-transparent text-xs text-[rgb(var(--nc-fg))] placeholder:text-[rgb(var(--nc-fg-muted))] focus:outline-none\"\n />\n </div>\n ) : null\n }\n actions={\n enableColumnVisibility ? (\n <div className=\"relative\">\n <CraftButton\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowColumns((prev) => !prev)}\n >\n Columns\n </CraftButton>\n {showColumns && (\n <div className=\"absolute right-0 top-12 z-20 w-56 rounded-2xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.2)] p-3 shadow-[0_12px_30px_rgba(0,0,0,0.35)] backdrop-blur-2xl\">\n <div className=\"grid gap-2\">\n {columns.map((column) => (\n <label\n key={column.id}\n className=\"flex items-center gap-2 text-xs text-[rgb(var(--nc-fg))]\"\n >\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 accent-[rgb(var(--nc-accent-1))]\"\n checked={resolvedVisibility[column.id] !== false}\n onChange={(event) =>\n setVisibility({\n ...resolvedVisibility,\n [column.id]: event.target.checked,\n })\n }\n />\n {column.header ?? column.label ?? column.id}\n </label>\n ))}\n </div>\n </div>\n )}\n </div>\n ) : null\n }\n />\n\n <div className={containerClasses}>\n <div className=\"relative\">\n <CraftLoader\n loading={loading || dataLoading}\n type={loadingType}\n size={loadingSize}\n color={loadingColor}\n overlay\n text={loadingText}\n textPosition={loadingTextPosition}\n backgroundColor={loadingBackground}\n />\n\n <div className={cn(\"overflow-x-auto\", (loading || dataLoading) && \"opacity-60\")}>\n <table className=\"min-w-full border-collapse text-left text-sm\">\n <thead className=\"bg-[rgb(var(--nc-surface)/0.12)] text-[rgb(var(--nc-fg-muted))]\">\n <tr>\n {resolvedSelectable && (\n <th className={cn(\"w-12\", headerPaddingClasses[density])}>\n <div className=\"flex items-center justify-center\">\n {bulkLoading ? (\n <CraftLoader loading type=\"spin\" size=\"small\" color={loadingColor} />\n ) : (\n <CraftCheckbox\n ref={headerCheckboxRef}\n checked={allSelected}\n onChange={(event) => {\n const next = { ...resolvedSelection };\n pageRowIds.forEach((id) => {\n next[id] = event.target.checked;\n });\n setSelection(next);\n }}\n />\n )}\n </div>\n </th>\n )}\n {visibleColumns.map((column) => {\n const headerLabel = column.header ?? column.label ?? column.id;\n return (\n <th\n key={column.id}\n className={cn(\n headerPaddingClasses[density],\n \"text-xs font-semibold uppercase tracking-[0.2em]\",\n column.headerClassName\n )}\n style={{ width: column.width }}\n >\n <button\n type=\"button\"\n className={cn(\n \"flex w-full items-center gap-2\",\n enableSorting && column.sortable !== false\n ? \"cursor-pointer\"\n : \"cursor-default\"\n )}\n onClick={() => toggleSort(column)}\n >\n <span>{headerLabel}</span>\n {sortLoading && resolvedSort?.id === column.id ? (\n <CraftLoader loading type=\"spin\" size=\"small\" color={loadingColor} />\n ) : null}\n {resolvedSort?.id === column.id && !sortLoading ? (\n <span className=\"text-[rgb(var(--nc-accent-1))]\">\n {resolvedSort.desc ? \"↓\" : \"↑\"}\n </span>\n ) : null}\n </button>\n {enableFiltering && column.filterable !== false && (\n <input\n type=\"text\"\n value={resolvedFilters[column.id] ?? \"\"}\n onChange={(event) =>\n setFilters({\n ...resolvedFilters,\n [column.id]: event.target.value,\n })\n }\n placeholder=\"Filter\"\n className=\"mt-2 w-full rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.18)] px-2 py-1 text-xs text-[rgb(var(--nc-fg))]\"\n />\n )}\n </th>\n );\n })}\n {shouldShowActionsColumn && (\n <th className={cn(headerPaddingClasses[density], \"text-xs uppercase\")}>Actions</th>\n )}\n </tr>\n </thead>\n <tbody className=\"text-[rgb(var(--nc-fg))]\">\n {showSkeleton && (loading || dataLoading) ? (\n Array.from({ length: skeletonRows }).map((_, rowIndex) => (\n <tr key={`skeleton-${rowIndex}`} className=\"animate-pulse\">\n {resolvedSelectable && (\n <td className={cn(headerPaddingClasses[density], \"w-12\")}> \n <div className=\"h-4 w-4 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n </td>\n )}\n {visibleColumns.map((column) => (\n <td key={column.id} className={cn(densityPadding[density])}>\n <div className=\"h-4 w-3/4 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n </td>\n ))}\n {shouldShowActionsColumn && (\n <td className={cn(densityPadding[density])}>\n <div className=\"flex items-center justify-center gap-2\">\n <div className=\"h-6 w-6 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n <div className=\"h-6 w-6 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n </div>\n </td>\n )}\n </tr>\n ))\n ) : pagedData.length === 0 ? (\n <tr>\n <td colSpan={totalColumns} className={cn(densityPadding[density], \"py-12\")}> \n {emptyState ?? (\n <div className=\"flex flex-col items-center justify-center text-center\">\n <CraftIcon\n name=\"search\"\n className=\"mb-4 h-12 w-12 text-[rgb(var(--nc-fg-muted))]\"\n />\n <p className=\"text-base font-semibold text-[rgb(var(--nc-fg))]\">\n {emptyText}\n </p>\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">\n {emptySubtitle}\n </p>\n </div>\n )}\n </td>\n </tr>\n ) : (\n pagedData.map((row: T, rowIndex: number) => {\n const rowId = rowIdFor(row, pageStartIndex + rowIndex);\n const isSelected = Boolean(resolvedSelection[rowId]);\n return (\n <tr\n key={rowId}\n className={rowClassNames(isSelected, rowId, rowIndex)}\n onClick={() => {\n if (!clickableRows) return;\n onRowClick?.({ item: row, index: rowIndex });\n }}\n >\n {resolvedSelectable && (\n <td className={cn(densityPadding[density], \"w-12\")}> \n <CraftCheckbox\n checked={isSelected}\n onChange={(event) =>\n setSelection({\n ...resolvedSelection,\n [rowId]: event.target.checked,\n })\n }\n />\n </td>\n )}\n {visibleColumns.map((column) => {\n const rawValue = getColumnValue(column, row);\n const formatted = column.formatter\n ? column.formatter(rawValue, row)\n : rawValue;\n const content = column.cell\n ? column.cell(row)\n : formatted ?? \"\";\n\n if (\n enableTextModal &&\n !column.cell &&\n typeof formatted === \"string\" &&\n (column.truncate ?? true) &&\n formatted.split(\" \").length > (column.maxWords ?? truncateWords)\n ) {\n const maxWords = column.maxWords ?? truncateWords;\n return (\n <td\n key={column.id}\n className={cn(\n densityPadding[density],\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n column.cellClassName\n )}\n >\n <button\n type=\"button\"\n className=\"text-[rgb(var(--nc-accent-1))] hover:text-[rgb(var(--nc-accent-2))]\"\n onClick={() => openModal(formatted)}\n >\n {truncateText(formatted, maxWords)}\n </button>\n </td>\n );\n }\n\n return (\n <td\n key={column.id}\n className={cn(\n densityPadding[density],\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n column.cellClassName\n )}\n >\n {content as React.ReactNode}\n </td>\n );\n })}\n {shouldShowActionsColumn && (\n <td className={cn(densityPadding[density])}>\n <div className=\"flex items-center justify-center gap-2\">\n {getVisibleActions(row).map((action) => {\n const tooltip =\n typeof action.tooltip === \"function\"\n ? action.tooltip(row)\n : action.tooltip;\n const className =\n typeof action.className === \"function\"\n ? action.className(row)\n : action.className;\n const button = (\n <CraftButton\n type=\"button\"\n size=\"sm\"\n variant={resolveActionVariant(action.variant)}\n disabled={isActionDisabled(action, row)}\n className={cn(\"h-8 w-8 p-0\", className)}\n onClick={(event) => {\n event.stopPropagation();\n handleActionClick(action, row);\n }}\n >\n {action.icon ? (\n typeof action.icon === \"string\" ? (\n <CraftIcon name={action.icon} className=\"h-4 w-4\" />\n ) : (\n action.icon\n )\n ) : action.label ? (\n <span className=\"text-[11px]\">{action.label}</span>\n ) : null}\n </CraftButton>\n );\n\n if (tooltip) {\n return (\n <CraftTooltip key={action.key} content={tooltip}>\n {button}\n </CraftTooltip>\n );\n }\n\n return <React.Fragment key={action.key}>{button}</React.Fragment>;\n })}\n </div>\n </td>\n )}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n </div>\n\n <CraftDataTablePagination\n currentPage={resolvedPageIndex}\n totalPages={resolvedPageCount}\n total={filteredData.length}\n pageSize={pageSize}\n selectable={Boolean(resolvedSelectable)}\n selectedCount={Object.values(resolvedSelection).filter(Boolean).length}\n showPagination={enablePagination}\n loading={paginationLoading}\n disabled={loading || dataLoading}\n onPageChange={setPageIndex}\n onPageSizeChange={onPageSizeChange}\n variant={paginationVariant}\n padding={paginationPadding}\n tone={tone}\n />\n </div>\n\n <CraftModal open={showModal} onOpenChange={setShowModal} title=\"Full Text\">\n <div className=\"space-y-3\">\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">Full content</p>\n <div className=\"text-sm text-[rgb(var(--nc-fg))] whitespace-pre-wrap wrap-break-words\">\n {modalContent}\n </div>\n <div className=\"flex justify-end\">\n <CraftButton type=\"button\" variant=\"ghost\" onClick={closeModal}>\n Close\n </CraftButton>\n </div>\n </div>\n </CraftModal>\n </div>\n );\n}\n"],"mappings":"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","names":["className"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/craft-loader.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftLoaderType =\n | \"spin\"\n | \"pulse\"\n | \"bounce\"\n | \"ripple\"\n | \"bars\"\n | \"dots\"\n | \"ring\";\n\nexport type CraftLoaderSize = \"small\" | \"medium\" | \"large\" | \"xl\";\n\nexport type CraftLoaderProps = {\n loading?: boolean;\n type?: CraftLoaderType;\n size?: CraftLoaderSize;\n color?: string;\n overlay?: boolean;\n text?: React.ReactNode;\n textPosition?: \"top\" | \"bottom\";\n backgroundColor?: string;\n tone?: ThemeName;\n className?: string;\n};\n\nconst sizeMap: Record<CraftLoaderSize, number> = {\n small: 16,\n medium: 24,\n large: 32,\n xl: 40,\n};\n\nfunction Spinner({ size, color }: { size: number; color: string }) {\n return (\n <svg\n className=\"animate-spin\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke={color}\n strokeWidth=\"4\"\n className=\"opacity-25\"\n />\n <path\n d=\"M4 12a8 8 0 018-8\"\n stroke={color}\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n className=\"opacity-75\"\n />\n </svg>\n );\n}\n\nfunction Dots({ size, color }: { size: number; color: string }) {\n const dotSize = Math.max(4, Math.floor(size / 6));\n return (\n <div className=\"flex items-center gap-2\">\n {[0, 1, 2].map((index) => (\n <span\n key={index}\n className=\"inline-flex animate-bounce rounded-full\"\n style={{\n width: dotSize,\n height: dotSize,\n backgroundColor: color,\n animationDelay: `${index * 120}ms`,\n }}\n />\n ))}\n </div>\n );\n}\n\nfunction Bars({ size, color }: { size: number; color: string }) {\n const barHeight = size;\n const barWidth = Math.max(3, Math.floor(size / 6));\n return (\n <div className=\"flex items-end gap-1\">\n {[0, 1, 2, 3].map((index) => (\n <span\n key={index}\n className=\"inline-flex animate-pulse rounded-sm\"\n style={{\n width: barWidth,\n height: barHeight - index * 4,\n backgroundColor: color,\n animationDelay: `${index * 100}ms`,\n }}\n />\n ))}\n </div>\n );\n}\n\nfunction Pulse({ size, color }: { size: number; color: string }) {\n return (\n <span\n className=\"inline-flex animate-pulse rounded-full\"\n style={{ width: size, height: size, backgroundColor: color }}\n />\n );\n}\n\nfunction Ripple({ size, color }: { size: number; color: string }) {\n return (\n <span\n className=\"inline-flex rounded-full border-2 animate-ping\"\n style={{ width: size, height: size, borderColor: color }}\n />\n );\n}\n\nfunction Ring({ size, color }: { size: number; color: string }) {\n return (\n <span\n className=\"inline-flex animate-spin rounded-full border-2 border-t-transparent\"\n style={{ width: size, height: size, borderColor: color }}\n />\n );\n}\n\nfunction Bounce({ size, color }: { size: number; color: string }) {\n const dotSize = Math.max(4, Math.floor(size / 5));\n return (\n <div className=\"flex items-center gap-2\">\n {[0, 1].map((index) => (\n <span\n key={index}\n className=\"inline-flex animate-bounce rounded-full\"\n style={{\n width: dotSize,\n height: dotSize,\n backgroundColor: color,\n animationDelay: `${index * 140}ms`,\n }}\n />\n ))}\n </div>\n );\n}\n\nexport function CraftLoader({\n loading = false,\n type = \"dots\",\n size = \"medium\",\n color = \"rgb(var(--nc-accent-1))\",\n overlay = false,\n text,\n textPosition = \"bottom\",\n backgroundColor = \"
|
|
1
|
+
{"version":3,"sources":["../../src/components/craft-loader.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftLoaderType =\n | \"spin\"\n | \"pulse\"\n | \"bounce\"\n | \"ripple\"\n | \"bars\"\n | \"dots\"\n | \"ring\";\n\nexport type CraftLoaderSize = \"small\" | \"medium\" | \"large\" | \"xl\";\n\nexport type CraftLoaderProps = {\n loading?: boolean;\n type?: CraftLoaderType;\n size?: CraftLoaderSize;\n color?: string;\n overlay?: boolean;\n text?: React.ReactNode;\n textPosition?: \"top\" | \"bottom\";\n backgroundColor?: string;\n tone?: ThemeName;\n className?: string;\n};\n\nconst sizeMap: Record<CraftLoaderSize, number> = {\n small: 16,\n medium: 24,\n large: 32,\n xl: 40,\n};\n\nfunction Spinner({ size, color }: { size: number; color: string }) {\n return (\n <svg\n className=\"animate-spin\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke={color}\n strokeWidth=\"4\"\n className=\"opacity-25\"\n />\n <path\n d=\"M4 12a8 8 0 018-8\"\n stroke={color}\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n className=\"opacity-75\"\n />\n </svg>\n );\n}\n\nfunction Dots({ size, color }: { size: number; color: string }) {\n const dotSize = Math.max(4, Math.floor(size / 6));\n return (\n <div className=\"flex items-center gap-2\">\n {[0, 1, 2].map((index) => (\n <span\n key={index}\n className=\"inline-flex animate-bounce rounded-full\"\n style={{\n width: dotSize,\n height: dotSize,\n backgroundColor: color,\n animationDelay: `${index * 120}ms`,\n }}\n />\n ))}\n </div>\n );\n}\n\nfunction Bars({ size, color }: { size: number; color: string }) {\n const barHeight = size;\n const barWidth = Math.max(3, Math.floor(size / 6));\n return (\n <div className=\"flex items-end gap-1\">\n {[0, 1, 2, 3].map((index) => (\n <span\n key={index}\n className=\"inline-flex animate-pulse rounded-sm\"\n style={{\n width: barWidth,\n height: barHeight - index * 4,\n backgroundColor: color,\n animationDelay: `${index * 100}ms`,\n }}\n />\n ))}\n </div>\n );\n}\n\nfunction Pulse({ size, color }: { size: number; color: string }) {\n return (\n <span\n className=\"inline-flex animate-pulse rounded-full\"\n style={{ width: size, height: size, backgroundColor: color }}\n />\n );\n}\n\nfunction Ripple({ size, color }: { size: number; color: string }) {\n return (\n <span\n className=\"inline-flex rounded-full border-2 animate-ping\"\n style={{ width: size, height: size, borderColor: color }}\n />\n );\n}\n\nfunction Ring({ size, color }: { size: number; color: string }) {\n return (\n <span\n className=\"inline-flex animate-spin rounded-full border-2 border-t-transparent\"\n style={{ width: size, height: size, borderColor: color }}\n />\n );\n}\n\nfunction Bounce({ size, color }: { size: number; color: string }) {\n const dotSize = Math.max(4, Math.floor(size / 5));\n return (\n <div className=\"flex items-center gap-2\">\n {[0, 1].map((index) => (\n <span\n key={index}\n className=\"inline-flex animate-bounce rounded-full\"\n style={{\n width: dotSize,\n height: dotSize,\n backgroundColor: color,\n animationDelay: `${index * 140}ms`,\n }}\n />\n ))}\n </div>\n );\n}\n\nexport function CraftLoader({\n loading = false,\n type = \"dots\",\n size = \"medium\",\n color = \"rgb(var(--nc-accent-1))\",\n overlay = false,\n text,\n textPosition = \"bottom\",\n backgroundColor = \"rgb(var(--nc-accent-soft)/0.7)\",\n tone,\n className,\n}: CraftLoaderProps) {\n if (!loading) return null;\n\n const px = sizeMap[size];\n\n const content = (\n <div\n className={cn(\n \"flex flex-col items-center justify-center gap-3\",\n textPosition === \"top\" && \"flex-col-reverse\",\n className\n )}\n data-nc-theme={tone}\n >\n {type === \"spin\" && <Spinner size={px} color={color} />}\n {type === \"dots\" && <Dots size={px} color={color} />}\n {type === \"bars\" && <Bars size={px} color={color} />}\n {type === \"pulse\" && <Pulse size={px} color={color} />}\n {type === \"ripple\" && <Ripple size={px} color={color} />}\n {type === \"ring\" && <Ring size={px} color={color} />}\n {type === \"bounce\" && <Bounce size={px} color={color} />}\n {text ? <span className=\"text-xs text-[rgb(var(--nc-fg-muted))]\">{text}</span> : null}\n </div>\n );\n\n if (!overlay) return content;\n\n return (\n <div\n className=\"absolute inset-0 z-10 flex items-center justify-center\"\n style={{ backgroundColor }}\n data-nc-theme={tone}\n >\n {content}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/craft-loader.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftLoaderType =\n | \"spin\"\n | \"pulse\"\n | \"bounce\"\n | \"ripple\"\n | \"bars\"\n | \"dots\"\n | \"ring\";\n\nexport type CraftLoaderSize = \"small\" | \"medium\" | \"large\" | \"xl\";\n\nexport type CraftLoaderProps = {\n loading?: boolean;\n type?: CraftLoaderType;\n size?: CraftLoaderSize;\n color?: string;\n overlay?: boolean;\n text?: React.ReactNode;\n textPosition?: \"top\" | \"bottom\";\n backgroundColor?: string;\n tone?: ThemeName;\n className?: string;\n};\n\nconst sizeMap: Record<CraftLoaderSize, number> = {\n small: 16,\n medium: 24,\n large: 32,\n xl: 40,\n};\n\nfunction Spinner({ size, color }: { size: number; color: string }) {\n return (\n <svg\n className=\"animate-spin\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke={color}\n strokeWidth=\"4\"\n className=\"opacity-25\"\n />\n <path\n d=\"M4 12a8 8 0 018-8\"\n stroke={color}\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n className=\"opacity-75\"\n />\n </svg>\n );\n}\n\nfunction Dots({ size, color }: { size: number; color: string }) {\n const dotSize = Math.max(4, Math.floor(size / 6));\n return (\n <div className=\"flex items-center gap-2\">\n {[0, 1, 2].map((index) => (\n <span\n key={index}\n className=\"inline-flex animate-bounce rounded-full\"\n style={{\n width: dotSize,\n height: dotSize,\n backgroundColor: color,\n animationDelay: `${index * 120}ms`,\n }}\n />\n ))}\n </div>\n );\n}\n\nfunction Bars({ size, color }: { size: number; color: string }) {\n const barHeight = size;\n const barWidth = Math.max(3, Math.floor(size / 6));\n return (\n <div className=\"flex items-end gap-1\">\n {[0, 1, 2, 3].map((index) => (\n <span\n key={index}\n className=\"inline-flex animate-pulse rounded-sm\"\n style={{\n width: barWidth,\n height: barHeight - index * 4,\n backgroundColor: color,\n animationDelay: `${index * 100}ms`,\n }}\n />\n ))}\n </div>\n );\n}\n\nfunction Pulse({ size, color }: { size: number; color: string }) {\n return (\n <span\n className=\"inline-flex animate-pulse rounded-full\"\n style={{ width: size, height: size, backgroundColor: color }}\n />\n );\n}\n\nfunction Ripple({ size, color }: { size: number; color: string }) {\n return (\n <span\n className=\"inline-flex rounded-full border-2 animate-ping\"\n style={{ width: size, height: size, borderColor: color }}\n />\n );\n}\n\nfunction Ring({ size, color }: { size: number; color: string }) {\n return (\n <span\n className=\"inline-flex animate-spin rounded-full border-2 border-t-transparent\"\n style={{ width: size, height: size, borderColor: color }}\n />\n );\n}\n\nfunction Bounce({ size, color }: { size: number; color: string }) {\n const dotSize = Math.max(4, Math.floor(size / 5));\n return (\n <div className=\"flex items-center gap-2\">\n {[0, 1].map((index) => (\n <span\n key={index}\n className=\"inline-flex animate-bounce rounded-full\"\n style={{\n width: dotSize,\n height: dotSize,\n backgroundColor: color,\n animationDelay: `${index * 140}ms`,\n }}\n />\n ))}\n </div>\n );\n}\n\nexport function CraftLoader({\n loading = false,\n type = \"dots\",\n size = \"medium\",\n color = \"rgb(var(--nc-accent-1))\",\n overlay = false,\n text,\n textPosition = \"bottom\",\n backgroundColor = \"
|
|
1
|
+
{"version":3,"sources":["../../src/components/craft-loader.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftLoaderType =\n | \"spin\"\n | \"pulse\"\n | \"bounce\"\n | \"ripple\"\n | \"bars\"\n | \"dots\"\n | \"ring\";\n\nexport type CraftLoaderSize = \"small\" | \"medium\" | \"large\" | \"xl\";\n\nexport type CraftLoaderProps = {\n loading?: boolean;\n type?: CraftLoaderType;\n size?: CraftLoaderSize;\n color?: string;\n overlay?: boolean;\n text?: React.ReactNode;\n textPosition?: \"top\" | \"bottom\";\n backgroundColor?: string;\n tone?: ThemeName;\n className?: string;\n};\n\nconst sizeMap: Record<CraftLoaderSize, number> = {\n small: 16,\n medium: 24,\n large: 32,\n xl: 40,\n};\n\nfunction Spinner({ size, color }: { size: number; color: string }) {\n return (\n <svg\n className=\"animate-spin\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke={color}\n strokeWidth=\"4\"\n className=\"opacity-25\"\n />\n <path\n d=\"M4 12a8 8 0 018-8\"\n stroke={color}\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n className=\"opacity-75\"\n />\n </svg>\n );\n}\n\nfunction Dots({ size, color }: { size: number; color: string }) {\n const dotSize = Math.max(4, Math.floor(size / 6));\n return (\n <div className=\"flex items-center gap-2\">\n {[0, 1, 2].map((index) => (\n <span\n key={index}\n className=\"inline-flex animate-bounce rounded-full\"\n style={{\n width: dotSize,\n height: dotSize,\n backgroundColor: color,\n animationDelay: `${index * 120}ms`,\n }}\n />\n ))}\n </div>\n );\n}\n\nfunction Bars({ size, color }: { size: number; color: string }) {\n const barHeight = size;\n const barWidth = Math.max(3, Math.floor(size / 6));\n return (\n <div className=\"flex items-end gap-1\">\n {[0, 1, 2, 3].map((index) => (\n <span\n key={index}\n className=\"inline-flex animate-pulse rounded-sm\"\n style={{\n width: barWidth,\n height: barHeight - index * 4,\n backgroundColor: color,\n animationDelay: `${index * 100}ms`,\n }}\n />\n ))}\n </div>\n );\n}\n\nfunction Pulse({ size, color }: { size: number; color: string }) {\n return (\n <span\n className=\"inline-flex animate-pulse rounded-full\"\n style={{ width: size, height: size, backgroundColor: color }}\n />\n );\n}\n\nfunction Ripple({ size, color }: { size: number; color: string }) {\n return (\n <span\n className=\"inline-flex rounded-full border-2 animate-ping\"\n style={{ width: size, height: size, borderColor: color }}\n />\n );\n}\n\nfunction Ring({ size, color }: { size: number; color: string }) {\n return (\n <span\n className=\"inline-flex animate-spin rounded-full border-2 border-t-transparent\"\n style={{ width: size, height: size, borderColor: color }}\n />\n );\n}\n\nfunction Bounce({ size, color }: { size: number; color: string }) {\n const dotSize = Math.max(4, Math.floor(size / 5));\n return (\n <div className=\"flex items-center gap-2\">\n {[0, 1].map((index) => (\n <span\n key={index}\n className=\"inline-flex animate-bounce rounded-full\"\n style={{\n width: dotSize,\n height: dotSize,\n backgroundColor: color,\n animationDelay: `${index * 140}ms`,\n }}\n />\n ))}\n </div>\n );\n}\n\nexport function CraftLoader({\n loading = false,\n type = \"dots\",\n size = \"medium\",\n color = \"rgb(var(--nc-accent-1))\",\n overlay = false,\n text,\n textPosition = \"bottom\",\n backgroundColor = \"rgb(var(--nc-accent-soft)/0.7)\",\n tone,\n className,\n}: CraftLoaderProps) {\n if (!loading) return null;\n\n const px = sizeMap[size];\n\n const content = (\n <div\n className={cn(\n \"flex flex-col items-center justify-center gap-3\",\n textPosition === \"top\" && \"flex-col-reverse\",\n className\n )}\n data-nc-theme={tone}\n >\n {type === \"spin\" && <Spinner size={px} color={color} />}\n {type === \"dots\" && <Dots size={px} color={color} />}\n {type === \"bars\" && <Bars size={px} color={color} />}\n {type === \"pulse\" && <Pulse size={px} color={color} />}\n {type === \"ripple\" && <Ripple size={px} color={color} />}\n {type === \"ring\" && <Ring size={px} color={color} />}\n {type === \"bounce\" && <Bounce size={px} color={color} />}\n {text ? <span className=\"text-xs text-[rgb(var(--nc-fg-muted))]\">{text}</span> : null}\n </div>\n );\n\n if (!overlay) return content;\n\n return (\n <div\n className=\"absolute inset-0 z-10 flex items-center justify-center\"\n style={{ backgroundColor }}\n data-nc-theme={tone}\n >\n {content}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -125,7 +125,7 @@ function Sidebar({
|
|
|
125
125
|
item.active ? "bg-[rgb(var(--nc-accent-1)/0.18)] text-[rgb(var(--nc-fg))] shadow-[inset_0_0_0_1px_rgb(var(--nc-accent-1)/0.25)]" : "text-[rgb(var(--nc-fg-muted))] hover:bg-[rgb(var(--nc-surface)/0.1)] hover:text-[rgb(var(--nc-fg))]"
|
|
126
126
|
),
|
|
127
127
|
children: [
|
|
128
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex shrink-0 items-center justify-center transition-all duration-300 ease-in-out", children: typeof item.icon === "string" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_craft_icon.CraftIcon, { name: item.icon, size: "
|
|
128
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex shrink-0 items-center justify-center transition-all duration-300 ease-in-out", children: typeof item.icon === "string" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_craft_icon.CraftIcon, { name: item.icon, size: "2xl" }) : item.icon }),
|
|
129
129
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
130
130
|
"span",
|
|
131
131
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/layout/sidebar.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport Link from \"next/link\";\n\nimport { CraftIcon } from \"@/components/craft-icon\";\nimport { cn } from \"@/utils/cn\";\n\nexport type SidebarItem = {\n label: React.ReactNode;\n href?: string;\n icon?: React.ReactNode | string;\n active?: boolean;\n};\n\nexport type SidebarProps = React.HTMLAttributes<HTMLElement> & {\n title?: React.ReactNode;\n items: SidebarItem[];\n footer?: React.ReactNode;\n hoverExpand?: boolean;\n expanded?: boolean;\n onExpandedChange?: (expanded: boolean) => void;\n defaultExpanded?: boolean;\n collapsedWidth?: string;\n expandedWidth?: string;\n};\n\nexport function Sidebar({\n className,\n title,\n items,\n footer,\n hoverExpand = true,\n expanded,\n onExpandedChange,\n defaultExpanded = false,\n collapsedWidth = \"72px\",\n expandedWidth = \"224px\",\n ...props\n}: SidebarProps) {\n const [internalExpanded, setInternalExpanded] = React.useState(defaultExpanded);\n const isExpanded = expanded ?? internalExpanded;\n\n const toggleSidebar = () => {\n const next = !isExpanded;\n if (expanded === undefined) setInternalExpanded(next);\n onExpandedChange?.(next);\n };\n\n return (\n <aside\n className={cn(\n \"group flex h-full flex-col gap-4 rounded-2xl border border-[rgb(var(--nc-border)/0.2)] bg-[rgb(var(--nc-surface)/0.04)] p-3 text-[rgb(var(--nc-fg))] backdrop-blur-xl transition-all duration-300 ease-in-out\",\n \"w-(--nc-sidebar-width)\",\n hoverExpand && !isExpanded ? \"hover:w-(--nc-sidebar-expanded)\" : \"\",\n hoverExpand\n ? \"fixed left-0 top-0 z-50 shadow-[0_16px_40px_rgba(0,0,0,0.18)]\"\n : \"relative\",\n className\n )}\n style={\n {\n \"--nc-sidebar-width\": isExpanded ? expandedWidth : collapsedWidth,\n \"--nc-sidebar-expanded\": expandedWidth,\n } as React.CSSProperties\n }\n {...props}\n >\n {title && (\n <div className=\"flex items-center gap-3 px-1\">\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-xl bg-[rgb(var(--nc-accent-1)/0.18)] text-2xl font-semibold\">\n {typeof title === \"string\" ? title.slice(0, 1) : title}\n </div>\n <span\n className={cn(\n \"truncate text-sm font-semibold transition-all duration-300 ease-in-out\",\n hoverExpand && !isExpanded\n ? \"max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100\"\n : \"max-w-40 opacity-100\"\n )}\n >\n {title}\n </span>\n </div>\n )}\n\n {hoverExpand && (\n <button\n onClick={toggleSidebar}\n className={cn(\n \"flex items-center rounded-xl text-sm transition-all duration-300 ease-in-out\",\n !isExpanded\n ? \"justify-center px-0.5 py-2 group-hover:justify-start group-hover:gap-3 group-hover:px-0.5\"\n : \"justify-start gap-3 px-0.5 py-2\",\n \"hover:bg-[rgb(var(--nc-surface)/0.1)]\",\n isExpanded\n ? \"text-[rgb(var(--nc-fg))] bg-[rgb(var(--nc-surface)/0.08)]\"\n : \"text-[rgb(var(--nc-fg-muted))]\"\n )}\n aria-label={isExpanded ? \"Collapse sidebar\" : \"Expand sidebar\"}\n aria-expanded={isExpanded}\n >\n <div className=\"flex shrink-0 items-center justify-center transition-all duration-300 ease-in-out\">\n <CraftIcon name=\"bars\" size=\"4xl\" />\n </div>\n <span\n className={cn(\n \"truncate whitespace-nowrap transition-all duration-300 ease-in-out\",\n !isExpanded\n ? \"max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100\"\n : \"max-w-40 opacity-100\"\n )}\n >\n {isExpanded ? \"Collapse\" : \"Expand\"}\n </span>\n </button>\n )}\n\n <nav className=\"flex flex-col gap-2.5\">\n {items.map((item, index) => (\n <Link\n key={`${item.label}-${index}`}\n href={item.href ?? \"#\"}\n className={cn(\n \"flex items-center rounded-xl text-sm transition-all duration-300 ease-in-out\",\n !isExpanded\n ? \"justify-center px-2 py-2 group-hover:justify-start group-hover:gap-3 group-hover:px-3\"\n : \"justify-start gap-3 px-3 py-2\",\n item.active\n ? \"bg-[rgb(var(--nc-accent-1)/0.18)] text-[rgb(var(--nc-fg))] shadow-[inset_0_0_0_1px_rgb(var(--nc-accent-1)/0.25)]\"\n : \"text-[rgb(var(--nc-fg-muted))] hover:bg-[rgb(var(--nc-surface)/0.1)] hover:text-[rgb(var(--nc-fg))]\"\n )}\n >\n <div className=\"flex shrink-0 items-center justify-center transition-all duration-300 ease-in-out\">\n {typeof item.icon === \"string\" ? (\n <CraftIcon name={item.icon} size=\"
|
|
1
|
+
{"version":3,"sources":["../../../src/components/layout/sidebar.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport Link from \"next/link\";\n\nimport { CraftIcon } from \"@/components/craft-icon\";\nimport { cn } from \"@/utils/cn\";\n\nexport type SidebarItem = {\n label: React.ReactNode;\n href?: string;\n icon?: React.ReactNode | string;\n active?: boolean;\n};\n\nexport type SidebarProps = React.HTMLAttributes<HTMLElement> & {\n title?: React.ReactNode;\n items: SidebarItem[];\n footer?: React.ReactNode;\n hoverExpand?: boolean;\n expanded?: boolean;\n onExpandedChange?: (expanded: boolean) => void;\n defaultExpanded?: boolean;\n collapsedWidth?: string;\n expandedWidth?: string;\n};\n\nexport function Sidebar({\n className,\n title,\n items,\n footer,\n hoverExpand = true,\n expanded,\n onExpandedChange,\n defaultExpanded = false,\n collapsedWidth = \"72px\",\n expandedWidth = \"224px\",\n ...props\n}: SidebarProps) {\n const [internalExpanded, setInternalExpanded] = React.useState(defaultExpanded);\n const isExpanded = expanded ?? internalExpanded;\n\n const toggleSidebar = () => {\n const next = !isExpanded;\n if (expanded === undefined) setInternalExpanded(next);\n onExpandedChange?.(next);\n };\n\n return (\n <aside\n className={cn(\n \"group flex h-full flex-col gap-4 rounded-2xl border border-[rgb(var(--nc-border)/0.2)] bg-[rgb(var(--nc-surface)/0.04)] p-3 text-[rgb(var(--nc-fg))] backdrop-blur-xl transition-all duration-300 ease-in-out\",\n \"w-(--nc-sidebar-width)\",\n hoverExpand && !isExpanded ? \"hover:w-(--nc-sidebar-expanded)\" : \"\",\n hoverExpand\n ? \"fixed left-0 top-0 z-50 shadow-[0_16px_40px_rgba(0,0,0,0.18)]\"\n : \"relative\",\n className\n )}\n style={\n {\n \"--nc-sidebar-width\": isExpanded ? expandedWidth : collapsedWidth,\n \"--nc-sidebar-expanded\": expandedWidth,\n } as React.CSSProperties\n }\n {...props}\n >\n {title && (\n <div className=\"flex items-center gap-3 px-1\">\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-xl bg-[rgb(var(--nc-accent-1)/0.18)] text-2xl font-semibold\">\n {typeof title === \"string\" ? title.slice(0, 1) : title}\n </div>\n <span\n className={cn(\n \"truncate text-sm font-semibold transition-all duration-300 ease-in-out\",\n hoverExpand && !isExpanded\n ? \"max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100\"\n : \"max-w-40 opacity-100\"\n )}\n >\n {title}\n </span>\n </div>\n )}\n\n {hoverExpand && (\n <button\n onClick={toggleSidebar}\n className={cn(\n \"flex items-center rounded-xl text-sm transition-all duration-300 ease-in-out\",\n !isExpanded\n ? \"justify-center px-0.5 py-2 group-hover:justify-start group-hover:gap-3 group-hover:px-0.5\"\n : \"justify-start gap-3 px-0.5 py-2\",\n \"hover:bg-[rgb(var(--nc-surface)/0.1)]\",\n isExpanded\n ? \"text-[rgb(var(--nc-fg))] bg-[rgb(var(--nc-surface)/0.08)]\"\n : \"text-[rgb(var(--nc-fg-muted))]\"\n )}\n aria-label={isExpanded ? \"Collapse sidebar\" : \"Expand sidebar\"}\n aria-expanded={isExpanded}\n >\n <div className=\"flex shrink-0 items-center justify-center transition-all duration-300 ease-in-out\">\n <CraftIcon name=\"bars\" size=\"4xl\" />\n </div>\n <span\n className={cn(\n \"truncate whitespace-nowrap transition-all duration-300 ease-in-out\",\n !isExpanded\n ? \"max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100\"\n : \"max-w-40 opacity-100\"\n )}\n >\n {isExpanded ? \"Collapse\" : \"Expand\"}\n </span>\n </button>\n )}\n\n <nav className=\"flex flex-col gap-2.5\">\n {items.map((item, index) => (\n <Link\n key={`${item.label}-${index}`}\n href={item.href ?? \"#\"}\n className={cn(\n \"flex items-center rounded-xl text-sm transition-all duration-300 ease-in-out\",\n !isExpanded\n ? \"justify-center px-2 py-2 group-hover:justify-start group-hover:gap-3 group-hover:px-3\"\n : \"justify-start gap-3 px-3 py-2\",\n item.active\n ? \"bg-[rgb(var(--nc-accent-1)/0.18)] text-[rgb(var(--nc-fg))] shadow-[inset_0_0_0_1px_rgb(var(--nc-accent-1)/0.25)]\"\n : \"text-[rgb(var(--nc-fg-muted))] hover:bg-[rgb(var(--nc-surface)/0.1)] hover:text-[rgb(var(--nc-fg))]\"\n )}\n >\n <div className=\"flex shrink-0 items-center justify-center transition-all duration-300 ease-in-out\">\n {typeof item.icon === \"string\" ? (\n <CraftIcon name={item.icon} size=\"2xl\" /> //change icon size\n ) : (\n item.icon\n )}\n </div>\n <span\n className={cn(\n \"truncate whitespace-nowrap transition-all duration-300 ease-in-out\",\n !isExpanded\n ? \"max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100\"\n : \"max-w-40 opacity-100\"\n )}\n >\n {item.label}\n </span>\n </Link>\n ))}\n </nav>\n\n {footer && (\n <div\n className={cn(\n \"mt-auto px-2 pt-3 text-xs text-[rgb(var(--nc-fg-muted))] transition-all duration-300 ease-in-out\",\n !isExpanded\n ? \"max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100\"\n : \"max-w-40 opacity-100\"\n )}\n >\n {footer}\n </div>\n )}\n </aside>\n );\n}"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAqEQ;AAnER,YAAuB;AACvB,kBAAiB;AAEjB,wBAA0B;AAC1B,gBAAmB;AAqBZ,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,GAAG;AACL,GAAiB;AACf,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,MAAM,SAAS,eAAe;AAC9E,QAAM,aAAa,8BAAY;AAE/B,QAAM,gBAAgB,MAAM;AAC1B,UAAM,OAAO,CAAC;AACd,QAAI,aAAa,OAAW,qBAAoB,IAAI;AACpD,yDAAmB;AAAA,EACrB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA,eAAe,CAAC,aAAa,oCAAoC;AAAA,QACjE,cACI,kEACA;AAAA,QACJ;AAAA,MACF;AAAA,MACA,OACE;AAAA,QACE,sBAAsB,aAAa,gBAAgB;AAAA,QACnD,yBAAyB;AAAA,MAC3B;AAAA,MAED,GAAG;AAAA,MAEH;AAAA,iBACC,6CAAC,SAAI,WAAU,gCACb;AAAA,sDAAC,SAAI,WAAU,yHACZ,iBAAO,UAAU,WAAW,MAAM,MAAM,GAAG,CAAC,IAAI,OACnD;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,eAAW;AAAA,gBACT;AAAA,gBACA,eAAe,CAAC,aACZ,mEACA;AAAA,cACN;AAAA,cAEC;AAAA;AAAA,UACH;AAAA,WACF;AAAA,QAGD,eACC;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,eAAW;AAAA,cACT;AAAA,cACA,CAAC,aACG,8FACA;AAAA,cACJ;AAAA,cACA,aACI,8DACA;AAAA,YACN;AAAA,YACA,cAAY,aAAa,qBAAqB;AAAA,YAC9C,iBAAe;AAAA,YAEf;AAAA,0DAAC,SAAI,WAAU,qFACb,sDAAC,+BAAU,MAAK,QAAO,MAAK,OAAM,GACpC;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,eAAW;AAAA,oBACT;AAAA,oBACA,CAAC,aACG,mEACA;AAAA,kBACN;AAAA,kBAEC,uBAAa,aAAa;AAAA;AAAA,cAC7B;AAAA;AAAA;AAAA,QACF;AAAA,QAGF,4CAAC,SAAI,WAAU,yBACZ,gBAAM,IAAI,CAAC,MAAM,UAAO;AAvHjC;AAwHU;AAAA,YAAC,YAAAA;AAAA,YAAA;AAAA,cAEC,OAAM,UAAK,SAAL,YAAa;AAAA,cACnB,eAAW;AAAA,gBACT;AAAA,gBACA,CAAC,aACG,0FACA;AAAA,gBACJ,KAAK,SACD,qHACA;AAAA,cACN;AAAA,cAEA;AAAA,4DAAC,SAAI,WAAU,qFACZ,iBAAO,KAAK,SAAS,WACpB,4CAAC,+BAAU,MAAM,KAAK,MAAM,MAAK,OAAM,IAEvC,KAAK,MAET;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,eAAW;AAAA,sBACT;AAAA,sBACA,CAAC,aACG,mEACA;AAAA,oBACN;AAAA,oBAEC,eAAK;AAAA;AAAA,gBACR;AAAA;AAAA;AAAA,YA5BK,GAAG,KAAK,KAAK,IAAI,KAAK;AAAA,UA6B7B;AAAA,SACD,GACH;AAAA,QAEC,UACC;AAAA,UAAC;AAAA;AAAA,YACC,eAAW;AAAA,cACT;AAAA,cACA,CAAC,aACG,mEACA;AAAA,YACN;AAAA,YAEC;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;","names":["Link"]}
|
|
@@ -92,7 +92,7 @@ function Sidebar({
|
|
|
92
92
|
item.active ? "bg-[rgb(var(--nc-accent-1)/0.18)] text-[rgb(var(--nc-fg))] shadow-[inset_0_0_0_1px_rgb(var(--nc-accent-1)/0.25)]" : "text-[rgb(var(--nc-fg-muted))] hover:bg-[rgb(var(--nc-surface)/0.1)] hover:text-[rgb(var(--nc-fg))]"
|
|
93
93
|
),
|
|
94
94
|
children: [
|
|
95
|
-
/* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center justify-center transition-all duration-300 ease-in-out", children: typeof item.icon === "string" ? /* @__PURE__ */ jsx(CraftIcon, { name: item.icon, size: "
|
|
95
|
+
/* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center justify-center transition-all duration-300 ease-in-out", children: typeof item.icon === "string" ? /* @__PURE__ */ jsx(CraftIcon, { name: item.icon, size: "2xl" }) : item.icon }),
|
|
96
96
|
/* @__PURE__ */ jsx(
|
|
97
97
|
"span",
|
|
98
98
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/layout/sidebar.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport Link from \"next/link\";\n\nimport { CraftIcon } from \"@/components/craft-icon\";\nimport { cn } from \"@/utils/cn\";\n\nexport type SidebarItem = {\n label: React.ReactNode;\n href?: string;\n icon?: React.ReactNode | string;\n active?: boolean;\n};\n\nexport type SidebarProps = React.HTMLAttributes<HTMLElement> & {\n title?: React.ReactNode;\n items: SidebarItem[];\n footer?: React.ReactNode;\n hoverExpand?: boolean;\n expanded?: boolean;\n onExpandedChange?: (expanded: boolean) => void;\n defaultExpanded?: boolean;\n collapsedWidth?: string;\n expandedWidth?: string;\n};\n\nexport function Sidebar({\n className,\n title,\n items,\n footer,\n hoverExpand = true,\n expanded,\n onExpandedChange,\n defaultExpanded = false,\n collapsedWidth = \"72px\",\n expandedWidth = \"224px\",\n ...props\n}: SidebarProps) {\n const [internalExpanded, setInternalExpanded] = React.useState(defaultExpanded);\n const isExpanded = expanded ?? internalExpanded;\n\n const toggleSidebar = () => {\n const next = !isExpanded;\n if (expanded === undefined) setInternalExpanded(next);\n onExpandedChange?.(next);\n };\n\n return (\n <aside\n className={cn(\n \"group flex h-full flex-col gap-4 rounded-2xl border border-[rgb(var(--nc-border)/0.2)] bg-[rgb(var(--nc-surface)/0.04)] p-3 text-[rgb(var(--nc-fg))] backdrop-blur-xl transition-all duration-300 ease-in-out\",\n \"w-(--nc-sidebar-width)\",\n hoverExpand && !isExpanded ? \"hover:w-(--nc-sidebar-expanded)\" : \"\",\n hoverExpand\n ? \"fixed left-0 top-0 z-50 shadow-[0_16px_40px_rgba(0,0,0,0.18)]\"\n : \"relative\",\n className\n )}\n style={\n {\n \"--nc-sidebar-width\": isExpanded ? expandedWidth : collapsedWidth,\n \"--nc-sidebar-expanded\": expandedWidth,\n } as React.CSSProperties\n }\n {...props}\n >\n {title && (\n <div className=\"flex items-center gap-3 px-1\">\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-xl bg-[rgb(var(--nc-accent-1)/0.18)] text-2xl font-semibold\">\n {typeof title === \"string\" ? title.slice(0, 1) : title}\n </div>\n <span\n className={cn(\n \"truncate text-sm font-semibold transition-all duration-300 ease-in-out\",\n hoverExpand && !isExpanded\n ? \"max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100\"\n : \"max-w-40 opacity-100\"\n )}\n >\n {title}\n </span>\n </div>\n )}\n\n {hoverExpand && (\n <button\n onClick={toggleSidebar}\n className={cn(\n \"flex items-center rounded-xl text-sm transition-all duration-300 ease-in-out\",\n !isExpanded\n ? \"justify-center px-0.5 py-2 group-hover:justify-start group-hover:gap-3 group-hover:px-0.5\"\n : \"justify-start gap-3 px-0.5 py-2\",\n \"hover:bg-[rgb(var(--nc-surface)/0.1)]\",\n isExpanded\n ? \"text-[rgb(var(--nc-fg))] bg-[rgb(var(--nc-surface)/0.08)]\"\n : \"text-[rgb(var(--nc-fg-muted))]\"\n )}\n aria-label={isExpanded ? \"Collapse sidebar\" : \"Expand sidebar\"}\n aria-expanded={isExpanded}\n >\n <div className=\"flex shrink-0 items-center justify-center transition-all duration-300 ease-in-out\">\n <CraftIcon name=\"bars\" size=\"4xl\" />\n </div>\n <span\n className={cn(\n \"truncate whitespace-nowrap transition-all duration-300 ease-in-out\",\n !isExpanded\n ? \"max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100\"\n : \"max-w-40 opacity-100\"\n )}\n >\n {isExpanded ? \"Collapse\" : \"Expand\"}\n </span>\n </button>\n )}\n\n <nav className=\"flex flex-col gap-2.5\">\n {items.map((item, index) => (\n <Link\n key={`${item.label}-${index}`}\n href={item.href ?? \"#\"}\n className={cn(\n \"flex items-center rounded-xl text-sm transition-all duration-300 ease-in-out\",\n !isExpanded\n ? \"justify-center px-2 py-2 group-hover:justify-start group-hover:gap-3 group-hover:px-3\"\n : \"justify-start gap-3 px-3 py-2\",\n item.active\n ? \"bg-[rgb(var(--nc-accent-1)/0.18)] text-[rgb(var(--nc-fg))] shadow-[inset_0_0_0_1px_rgb(var(--nc-accent-1)/0.25)]\"\n : \"text-[rgb(var(--nc-fg-muted))] hover:bg-[rgb(var(--nc-surface)/0.1)] hover:text-[rgb(var(--nc-fg))]\"\n )}\n >\n <div className=\"flex shrink-0 items-center justify-center transition-all duration-300 ease-in-out\">\n {typeof item.icon === \"string\" ? (\n <CraftIcon name={item.icon} size=\"
|
|
1
|
+
{"version":3,"sources":["../../../src/components/layout/sidebar.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport Link from \"next/link\";\n\nimport { CraftIcon } from \"@/components/craft-icon\";\nimport { cn } from \"@/utils/cn\";\n\nexport type SidebarItem = {\n label: React.ReactNode;\n href?: string;\n icon?: React.ReactNode | string;\n active?: boolean;\n};\n\nexport type SidebarProps = React.HTMLAttributes<HTMLElement> & {\n title?: React.ReactNode;\n items: SidebarItem[];\n footer?: React.ReactNode;\n hoverExpand?: boolean;\n expanded?: boolean;\n onExpandedChange?: (expanded: boolean) => void;\n defaultExpanded?: boolean;\n collapsedWidth?: string;\n expandedWidth?: string;\n};\n\nexport function Sidebar({\n className,\n title,\n items,\n footer,\n hoverExpand = true,\n expanded,\n onExpandedChange,\n defaultExpanded = false,\n collapsedWidth = \"72px\",\n expandedWidth = \"224px\",\n ...props\n}: SidebarProps) {\n const [internalExpanded, setInternalExpanded] = React.useState(defaultExpanded);\n const isExpanded = expanded ?? internalExpanded;\n\n const toggleSidebar = () => {\n const next = !isExpanded;\n if (expanded === undefined) setInternalExpanded(next);\n onExpandedChange?.(next);\n };\n\n return (\n <aside\n className={cn(\n \"group flex h-full flex-col gap-4 rounded-2xl border border-[rgb(var(--nc-border)/0.2)] bg-[rgb(var(--nc-surface)/0.04)] p-3 text-[rgb(var(--nc-fg))] backdrop-blur-xl transition-all duration-300 ease-in-out\",\n \"w-(--nc-sidebar-width)\",\n hoverExpand && !isExpanded ? \"hover:w-(--nc-sidebar-expanded)\" : \"\",\n hoverExpand\n ? \"fixed left-0 top-0 z-50 shadow-[0_16px_40px_rgba(0,0,0,0.18)]\"\n : \"relative\",\n className\n )}\n style={\n {\n \"--nc-sidebar-width\": isExpanded ? expandedWidth : collapsedWidth,\n \"--nc-sidebar-expanded\": expandedWidth,\n } as React.CSSProperties\n }\n {...props}\n >\n {title && (\n <div className=\"flex items-center gap-3 px-1\">\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-xl bg-[rgb(var(--nc-accent-1)/0.18)] text-2xl font-semibold\">\n {typeof title === \"string\" ? title.slice(0, 1) : title}\n </div>\n <span\n className={cn(\n \"truncate text-sm font-semibold transition-all duration-300 ease-in-out\",\n hoverExpand && !isExpanded\n ? \"max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100\"\n : \"max-w-40 opacity-100\"\n )}\n >\n {title}\n </span>\n </div>\n )}\n\n {hoverExpand && (\n <button\n onClick={toggleSidebar}\n className={cn(\n \"flex items-center rounded-xl text-sm transition-all duration-300 ease-in-out\",\n !isExpanded\n ? \"justify-center px-0.5 py-2 group-hover:justify-start group-hover:gap-3 group-hover:px-0.5\"\n : \"justify-start gap-3 px-0.5 py-2\",\n \"hover:bg-[rgb(var(--nc-surface)/0.1)]\",\n isExpanded\n ? \"text-[rgb(var(--nc-fg))] bg-[rgb(var(--nc-surface)/0.08)]\"\n : \"text-[rgb(var(--nc-fg-muted))]\"\n )}\n aria-label={isExpanded ? \"Collapse sidebar\" : \"Expand sidebar\"}\n aria-expanded={isExpanded}\n >\n <div className=\"flex shrink-0 items-center justify-center transition-all duration-300 ease-in-out\">\n <CraftIcon name=\"bars\" size=\"4xl\" />\n </div>\n <span\n className={cn(\n \"truncate whitespace-nowrap transition-all duration-300 ease-in-out\",\n !isExpanded\n ? \"max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100\"\n : \"max-w-40 opacity-100\"\n )}\n >\n {isExpanded ? \"Collapse\" : \"Expand\"}\n </span>\n </button>\n )}\n\n <nav className=\"flex flex-col gap-2.5\">\n {items.map((item, index) => (\n <Link\n key={`${item.label}-${index}`}\n href={item.href ?? \"#\"}\n className={cn(\n \"flex items-center rounded-xl text-sm transition-all duration-300 ease-in-out\",\n !isExpanded\n ? \"justify-center px-2 py-2 group-hover:justify-start group-hover:gap-3 group-hover:px-3\"\n : \"justify-start gap-3 px-3 py-2\",\n item.active\n ? \"bg-[rgb(var(--nc-accent-1)/0.18)] text-[rgb(var(--nc-fg))] shadow-[inset_0_0_0_1px_rgb(var(--nc-accent-1)/0.25)]\"\n : \"text-[rgb(var(--nc-fg-muted))] hover:bg-[rgb(var(--nc-surface)/0.1)] hover:text-[rgb(var(--nc-fg))]\"\n )}\n >\n <div className=\"flex shrink-0 items-center justify-center transition-all duration-300 ease-in-out\">\n {typeof item.icon === \"string\" ? (\n <CraftIcon name={item.icon} size=\"2xl\" /> //change icon size\n ) : (\n item.icon\n )}\n </div>\n <span\n className={cn(\n \"truncate whitespace-nowrap transition-all duration-300 ease-in-out\",\n !isExpanded\n ? \"max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100\"\n : \"max-w-40 opacity-100\"\n )}\n >\n {item.label}\n </span>\n </Link>\n ))}\n </nav>\n\n {footer && (\n <div\n className={cn(\n \"mt-auto px-2 pt-3 text-xs text-[rgb(var(--nc-fg-muted))] transition-all duration-300 ease-in-out\",\n !isExpanded\n ? \"max-w-0 opacity-0 group-hover:max-w-40 group-hover:opacity-100\"\n : \"max-w-40 opacity-100\"\n )}\n >\n {footer}\n </div>\n )}\n </aside>\n );\n}"],"mappings":";AAqEQ,SACE,KADF;AAnER,YAAY,WAAW;AACvB,OAAO,UAAU;AAEjB,SAAS,iBAAiB;AAC1B,SAAS,UAAU;AAqBZ,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,GAAG;AACL,GAAiB;AACf,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,MAAM,SAAS,eAAe;AAC9E,QAAM,aAAa,8BAAY;AAE/B,QAAM,gBAAgB,MAAM;AAC1B,UAAM,OAAO,CAAC;AACd,QAAI,aAAa,OAAW,qBAAoB,IAAI;AACpD,yDAAmB;AAAA,EACrB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA,eAAe,CAAC,aAAa,oCAAoC;AAAA,QACjE,cACI,kEACA;AAAA,QACJ;AAAA,MACF;AAAA,MACA,OACE;AAAA,QACE,sBAAsB,aAAa,gBAAgB;AAAA,QACnD,yBAAyB;AAAA,MAC3B;AAAA,MAED,GAAG;AAAA,MAEH;AAAA,iBACC,qBAAC,SAAI,WAAU,gCACb;AAAA,8BAAC,SAAI,WAAU,yHACZ,iBAAO,UAAU,WAAW,MAAM,MAAM,GAAG,CAAC,IAAI,OACnD;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,eAAe,CAAC,aACZ,mEACA;AAAA,cACN;AAAA,cAEC;AAAA;AAAA,UACH;AAAA,WACF;AAAA,QAGD,eACC;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,WAAW;AAAA,cACT;AAAA,cACA,CAAC,aACG,8FACA;AAAA,cACJ;AAAA,cACA,aACI,8DACA;AAAA,YACN;AAAA,YACA,cAAY,aAAa,qBAAqB;AAAA,YAC9C,iBAAe;AAAA,YAEf;AAAA,kCAAC,SAAI,WAAU,qFACb,8BAAC,aAAU,MAAK,QAAO,MAAK,OAAM,GACpC;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW;AAAA,oBACT;AAAA,oBACA,CAAC,aACG,mEACA;AAAA,kBACN;AAAA,kBAEC,uBAAa,aAAa;AAAA;AAAA,cAC7B;AAAA;AAAA;AAAA,QACF;AAAA,QAGF,oBAAC,SAAI,WAAU,yBACZ,gBAAM,IAAI,CAAC,MAAM,UAAO;AAvHjC;AAwHU;AAAA,YAAC;AAAA;AAAA,cAEC,OAAM,UAAK,SAAL,YAAa;AAAA,cACnB,WAAW;AAAA,gBACT;AAAA,gBACA,CAAC,aACG,0FACA;AAAA,gBACJ,KAAK,SACD,qHACA;AAAA,cACN;AAAA,cAEA;AAAA,oCAAC,SAAI,WAAU,qFACZ,iBAAO,KAAK,SAAS,WACpB,oBAAC,aAAU,MAAM,KAAK,MAAM,MAAK,OAAM,IAEvC,KAAK,MAET;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAW;AAAA,sBACT;AAAA,sBACA,CAAC,aACG,mEACA;AAAA,oBACN;AAAA,oBAEC,eAAK;AAAA;AAAA,gBACR;AAAA;AAAA;AAAA,YA5BK,GAAG,KAAK,KAAK,IAAI,KAAK;AAAA,UA6B7B;AAAA,SACD,GACH;AAAA,QAEC,UACC;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,CAAC,aACG,mEACA;AAAA,YACN;AAAA,YAEC;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;","names":[]}
|
package/dist/styles.css
CHANGED
|
@@ -1665,6 +1665,16 @@
|
|
|
1665
1665
|
--tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
|
|
1666
1666
|
}
|
|
1667
1667
|
}
|
|
1668
|
+
.before\:from-white\/4 {
|
|
1669
|
+
&::before {
|
|
1670
|
+
content: var(--tw-content);
|
|
1671
|
+
--tw-gradient-from: color-mix(in srgb, #fff 4%, transparent);
|
|
1672
|
+
@supports (color: color-mix(in lab, red, red)) {
|
|
1673
|
+
--tw-gradient-from: color-mix(in oklab, var(--color-white) 4%, transparent);
|
|
1674
|
+
}
|
|
1675
|
+
--tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
|
|
1676
|
+
}
|
|
1677
|
+
}
|
|
1668
1678
|
.before\:from-white\/10 {
|
|
1669
1679
|
&::before {
|
|
1670
1680
|
content: var(--tw-content);
|
|
@@ -1971,6 +1981,14 @@
|
|
|
1971
1981
|
}
|
|
1972
1982
|
}
|
|
1973
1983
|
}
|
|
1984
|
+
.hover\:shadow-\[0_8px_40px_rgba\(0\,0\,0\,0\.6\)\] {
|
|
1985
|
+
&:hover {
|
|
1986
|
+
@media (hover: hover) {
|
|
1987
|
+
--tw-shadow: 0 8px 40px var(--tw-shadow-color, rgba(0,0,0,0.6));
|
|
1988
|
+
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
1989
|
+
}
|
|
1990
|
+
}
|
|
1991
|
+
}
|
|
1974
1992
|
.hover\:shadow-\[0_16px_36px_rgb\(var\(--nc-accent-1\)\/0\.5\)\] {
|
|
1975
1993
|
&:hover {
|
|
1976
1994
|
@media (hover: hover) {
|
|
@@ -1995,6 +2013,16 @@
|
|
|
1995
2013
|
}
|
|
1996
2014
|
}
|
|
1997
2015
|
}
|
|
2016
|
+
.hover\:before\:opacity-40 {
|
|
2017
|
+
&:hover {
|
|
2018
|
+
@media (hover: hover) {
|
|
2019
|
+
&::before {
|
|
2020
|
+
content: var(--tw-content);
|
|
2021
|
+
opacity: 40%;
|
|
2022
|
+
}
|
|
2023
|
+
}
|
|
2024
|
+
}
|
|
2025
|
+
}
|
|
1998
2026
|
.hover\:before\:opacity-100 {
|
|
1999
2027
|
&:hover {
|
|
2000
2028
|
@media (hover: hover) {
|