@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.
@@ -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.4)]" : "shadow-none",
49
- "before:absolute before:inset-0 before:bg-linear-to-br before:from-white/10 before:to-transparent before:opacity-0 hover:before:opacity-100 before:transition-opacity before:duration-300",
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.4)]\"\n : \"shadow-none\",\n \"before:absolute before:inset-0 before:bg-linear-to-br before:from-white/10 before:to-transparent before:opacity-0 hover:before:opacity-100 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":[]}
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.4)]" : "shadow-none",
26
- "before:absolute before:inset-0 before:bg-linear-to-br before:from-white/10 before:to-transparent before:opacity-0 hover:before:opacity-100 before:transition-opacity before:duration-300",
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.4)]\"\n : \"shadow-none\",\n \"before:absolute before:inset-0 before:bg-linear-to-br before:from-white/10 before:to-transparent before:opacity-0 hover:before:opacity-100 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":[]}
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 = "rgba(0, 0, 0, 0.35)",
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)/0.12)]",
336
- clickableRows && "cursor-pointer hover:bg-[rgb(var(--nc-surface)/0.16)]",
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
- "bg-[rgb(var(--nc-surface)/0.08)] shadow-[0_18px_50px_rgba(0,0,0,0.35)] backdrop-blur-2xl",
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 = "rgba(0, 0, 0, 0.35)",
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)/0.12)]",
303
- clickableRows && "cursor-pointer hover:bg-[rgb(var(--nc-surface)/0.16)]",
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
- "bg-[rgb(var(--nc-surface)/0.08)] shadow-[0_18px_50px_rgba(0,0,0,0.35)] backdrop-blur-2xl",
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"]}
@@ -150,7 +150,7 @@ function CraftLoader({
150
150
  overlay = false,
151
151
  text,
152
152
  textPosition = "bottom",
153
- backgroundColor = "rgba(0, 0, 0, 0.35)",
153
+ backgroundColor = "rgb(var(--nc-accent-soft)/0.7)",
154
154
  tone,
155
155
  className
156
156
  }) {
@@ -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 = \"rgba(0, 0, 0, 0.35)\",\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
+ {"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":[]}
@@ -127,7 +127,7 @@ function CraftLoader({
127
127
  overlay = false,
128
128
  text,
129
129
  textPosition = "bottom",
130
- backgroundColor = "rgba(0, 0, 0, 0.35)",
130
+ backgroundColor = "rgb(var(--nc-accent-soft)/0.7)",
131
131
  tone,
132
132
  className
133
133
  }) {
@@ -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 = \"rgba(0, 0, 0, 0.35)\",\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
+ {"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: "3xl" }) : item.icon }),
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=\"3xl\" />\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"]}
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: "3xl" }) : item.icon }),
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=\"3xl\" />\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":[]}
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) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jameskabz/nextcraft-ui",
3
- "version": "0.7.3",
3
+ "version": "0.7.5",
4
4
  "description": "Next.js + Tailwind UI components with a bold, crafted aesthetic.",
5
5
  "private": false,
6
6
  "license": "MIT",