@jameskabz/nextcraft-ui 0.8.3 → 0.8.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.
@@ -48,7 +48,7 @@ function CraftDataTableHeader({
48
48
  "div",
49
49
  {
50
50
  className: (0, import_cn.cn)(
51
- "flex flex-wrap items-start justify-between gap-4",
51
+ "flex flex-wrap items-start justify-between gap-4 rounded-3xl",
52
52
  paddingClasses[padding],
53
53
  variantClasses[variant],
54
54
  className
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/craft-data-table-header.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 CraftDataTableHeaderProps = {\n title?: React.ReactNode;\n description?: React.ReactNode;\n actions?: React.ReactNode;\n filters?: React.ReactNode;\n tone?: ThemeName;\n variant?: \"default\" | \"minimal\";\n padding?: \"compact\" | \"normal\" | \"comfortable\";\n className?: string;\n};\n\nconst paddingClasses: Record<NonNullable<CraftDataTableHeaderProps[\"padding\"]>, string> = {\n compact: \"px-4 py-3\",\n normal: \"px-6 py-4\",\n comfortable: \"px-8 py-5\",\n};\n\nconst variantClasses: Record<NonNullable<CraftDataTableHeaderProps[\"variant\"]>, string> = {\n default:\n \"border-b border-[rgb(var(--nc-accent-1)/0.25)] bg-linear-to-r from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)]\",\n minimal: \"border-b border-[rgb(var(--nc-border)/0.25)] bg-transparent\",\n};\n\nexport function CraftDataTableHeader({\n title,\n description,\n actions,\n filters,\n tone,\n variant = \"default\",\n padding = \"normal\",\n className,\n}: CraftDataTableHeaderProps) {\n if (!title && !description && !actions && !filters) return null;\n\n return (\n <div\n className={cn(\n \"flex flex-wrap items-start justify-between gap-4\",\n paddingClasses[padding],\n variantClasses[variant],\n className\n )}\n data-nc-theme={tone}\n >\n <div className=\"space-y-1\">\n {title ? <h3 className=\"text-lg font-semibold\">{title}</h3> : null}\n {description ? (\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">{description}</p>\n ) : null}\n </div>\n <div className=\"flex flex-wrap items-center gap-3\">\n {filters}\n {actions}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAoDM;AAhDN,gBAAmB;AAcnB,MAAM,iBAAoF;AAAA,EACxF,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,aAAa;AACf;AAEA,MAAM,iBAAoF;AAAA,EACxF,SACE;AAAA,EACF,SAAS;AACX;AAEO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AAAA,EACV;AACF,GAA8B;AAC5B,MAAI,CAAC,SAAS,CAAC,eAAe,CAAC,WAAW,CAAC,QAAS,QAAO;AAE3D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,QACT;AAAA,QACA,eAAe,OAAO;AAAA,QACtB,eAAe,OAAO;AAAA,QACtB;AAAA,MACF;AAAA,MACA,iBAAe;AAAA,MAEf;AAAA,qDAAC,SAAI,WAAU,aACZ;AAAA,kBAAQ,4CAAC,QAAG,WAAU,yBAAyB,iBAAM,IAAQ;AAAA,UAC7D,cACC,4CAAC,OAAE,WAAU,0CAA0C,uBAAY,IACjE;AAAA,WACN;AAAA,QACA,6CAAC,SAAI,WAAU,qCACZ;AAAA;AAAA,UACA;AAAA,WACH;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/craft-data-table-header.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 CraftDataTableHeaderProps = {\n title?: React.ReactNode;\n description?: React.ReactNode;\n actions?: React.ReactNode;\n filters?: React.ReactNode;\n tone?: ThemeName;\n variant?: \"default\" | \"minimal\";\n padding?: \"compact\" | \"normal\" | \"comfortable\";\n className?: string;\n};\n\nconst paddingClasses: Record<NonNullable<CraftDataTableHeaderProps[\"padding\"]>, string> = {\n compact: \"px-4 py-3\",\n normal: \"px-6 py-4\",\n comfortable: \"px-8 py-5\",\n};\n\nconst variantClasses: Record<NonNullable<CraftDataTableHeaderProps[\"variant\"]>, string> = {\n default:\n \"border-b border-[rgb(var(--nc-accent-1)/0.25)] bg-linear-to-r from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)]\",\n minimal: \"border-b border-[rgb(var(--nc-border)/0.25)] bg-transparent\",\n};\n\nexport function CraftDataTableHeader({\n title,\n description,\n actions,\n filters,\n tone,\n variant = \"default\",\n padding = \"normal\",\n className,\n}: CraftDataTableHeaderProps) {\n if (!title && !description && !actions && !filters) return null;\n\n return (\n <div\n className={cn(\n \"flex flex-wrap items-start justify-between gap-4 rounded-3xl\",\n paddingClasses[padding],\n variantClasses[variant],\n className\n )}\n data-nc-theme={tone}\n >\n <div className=\"space-y-1\">\n {title ? <h3 className=\"text-lg font-semibold\">{title}</h3> : null}\n {description ? (\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">{description}</p>\n ) : null}\n </div>\n <div className=\"flex flex-wrap items-center gap-3\">\n {filters}\n {actions}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAoDM;AAhDN,gBAAmB;AAcnB,MAAM,iBAAoF;AAAA,EACxF,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,aAAa;AACf;AAEA,MAAM,iBAAoF;AAAA,EACxF,SACE;AAAA,EACF,SAAS;AACX;AAEO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AAAA,EACV;AACF,GAA8B;AAC5B,MAAI,CAAC,SAAS,CAAC,eAAe,CAAC,WAAW,CAAC,QAAS,QAAO;AAE3D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,QACT;AAAA,QACA,eAAe,OAAO;AAAA,QACtB,eAAe,OAAO;AAAA,QACtB;AAAA,MACF;AAAA,MACA,iBAAe;AAAA,MAEf;AAAA,qDAAC,SAAI,WAAU,aACZ;AAAA,kBAAQ,4CAAC,QAAG,WAAU,yBAAyB,iBAAM,IAAQ;AAAA,UAC7D,cACC,4CAAC,OAAE,WAAU,0CAA0C,uBAAY,IACjE;AAAA,WACN;AAAA,QACA,6CAAC,SAAI,WAAU,qCACZ;AAAA;AAAA,UACA;AAAA,WACH;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -25,7 +25,7 @@ function CraftDataTableHeader({
25
25
  "div",
26
26
  {
27
27
  className: cn(
28
- "flex flex-wrap items-start justify-between gap-4",
28
+ "flex flex-wrap items-start justify-between gap-4 rounded-3xl",
29
29
  paddingClasses[padding],
30
30
  variantClasses[variant],
31
31
  className
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/craft-data-table-header.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 CraftDataTableHeaderProps = {\n title?: React.ReactNode;\n description?: React.ReactNode;\n actions?: React.ReactNode;\n filters?: React.ReactNode;\n tone?: ThemeName;\n variant?: \"default\" | \"minimal\";\n padding?: \"compact\" | \"normal\" | \"comfortable\";\n className?: string;\n};\n\nconst paddingClasses: Record<NonNullable<CraftDataTableHeaderProps[\"padding\"]>, string> = {\n compact: \"px-4 py-3\",\n normal: \"px-6 py-4\",\n comfortable: \"px-8 py-5\",\n};\n\nconst variantClasses: Record<NonNullable<CraftDataTableHeaderProps[\"variant\"]>, string> = {\n default:\n \"border-b border-[rgb(var(--nc-accent-1)/0.25)] bg-linear-to-r from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)]\",\n minimal: \"border-b border-[rgb(var(--nc-border)/0.25)] bg-transparent\",\n};\n\nexport function CraftDataTableHeader({\n title,\n description,\n actions,\n filters,\n tone,\n variant = \"default\",\n padding = \"normal\",\n className,\n}: CraftDataTableHeaderProps) {\n if (!title && !description && !actions && !filters) return null;\n\n return (\n <div\n className={cn(\n \"flex flex-wrap items-start justify-between gap-4\",\n paddingClasses[padding],\n variantClasses[variant],\n className\n )}\n data-nc-theme={tone}\n >\n <div className=\"space-y-1\">\n {title ? <h3 className=\"text-lg font-semibold\">{title}</h3> : null}\n {description ? (\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">{description}</p>\n ) : null}\n </div>\n <div className=\"flex flex-wrap items-center gap-3\">\n {filters}\n {actions}\n </div>\n </div>\n );\n}\n"],"mappings":";AAoDM,SACW,KADX;AAhDN,SAAS,UAAU;AAcnB,MAAM,iBAAoF;AAAA,EACxF,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,aAAa;AACf;AAEA,MAAM,iBAAoF;AAAA,EACxF,SACE;AAAA,EACF,SAAS;AACX;AAEO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AAAA,EACV;AACF,GAA8B;AAC5B,MAAI,CAAC,SAAS,CAAC,eAAe,CAAC,WAAW,CAAC,QAAS,QAAO;AAE3D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,eAAe,OAAO;AAAA,QACtB,eAAe,OAAO;AAAA,QACtB;AAAA,MACF;AAAA,MACA,iBAAe;AAAA,MAEf;AAAA,6BAAC,SAAI,WAAU,aACZ;AAAA,kBAAQ,oBAAC,QAAG,WAAU,yBAAyB,iBAAM,IAAQ;AAAA,UAC7D,cACC,oBAAC,OAAE,WAAU,0CAA0C,uBAAY,IACjE;AAAA,WACN;AAAA,QACA,qBAAC,SAAI,WAAU,qCACZ;AAAA;AAAA,UACA;AAAA,WACH;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/craft-data-table-header.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 CraftDataTableHeaderProps = {\n title?: React.ReactNode;\n description?: React.ReactNode;\n actions?: React.ReactNode;\n filters?: React.ReactNode;\n tone?: ThemeName;\n variant?: \"default\" | \"minimal\";\n padding?: \"compact\" | \"normal\" | \"comfortable\";\n className?: string;\n};\n\nconst paddingClasses: Record<NonNullable<CraftDataTableHeaderProps[\"padding\"]>, string> = {\n compact: \"px-4 py-3\",\n normal: \"px-6 py-4\",\n comfortable: \"px-8 py-5\",\n};\n\nconst variantClasses: Record<NonNullable<CraftDataTableHeaderProps[\"variant\"]>, string> = {\n default:\n \"border-b border-[rgb(var(--nc-accent-1)/0.25)] bg-linear-to-r from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)]\",\n minimal: \"border-b border-[rgb(var(--nc-border)/0.25)] bg-transparent\",\n};\n\nexport function CraftDataTableHeader({\n title,\n description,\n actions,\n filters,\n tone,\n variant = \"default\",\n padding = \"normal\",\n className,\n}: CraftDataTableHeaderProps) {\n if (!title && !description && !actions && !filters) return null;\n\n return (\n <div\n className={cn(\n \"flex flex-wrap items-start justify-between gap-4 rounded-3xl\",\n paddingClasses[padding],\n variantClasses[variant],\n className\n )}\n data-nc-theme={tone}\n >\n <div className=\"space-y-1\">\n {title ? <h3 className=\"text-lg font-semibold\">{title}</h3> : null}\n {description ? (\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">{description}</p>\n ) : null}\n </div>\n <div className=\"flex flex-wrap items-center gap-3\">\n {filters}\n {actions}\n </div>\n </div>\n );\n}\n"],"mappings":";AAoDM,SACW,KADX;AAhDN,SAAS,UAAU;AAcnB,MAAM,iBAAoF;AAAA,EACxF,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,aAAa;AACf;AAEA,MAAM,iBAAoF;AAAA,EACxF,SACE;AAAA,EACF,SAAS;AACX;AAEO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AAAA,EACV;AACF,GAA8B;AAC5B,MAAI,CAAC,SAAS,CAAC,eAAe,CAAC,WAAW,CAAC,QAAS,QAAO;AAE3D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,eAAe,OAAO;AAAA,QACtB,eAAe,OAAO;AAAA,QACtB;AAAA,MACF;AAAA,MACA,iBAAe;AAAA,MAEf;AAAA,6BAAC,SAAI,WAAU,aACZ;AAAA,kBAAQ,oBAAC,QAAG,WAAU,yBAAyB,iBAAM,IAAQ;AAAA,UAC7D,cACC,oBAAC,OAAE,WAAU,0CAA0C,uBAAY,IACjE;AAAA,WACN;AAAA,QACA,qBAAC,SAAI,WAAU,qCACZ;AAAA;AAAA,UACA;AAAA,WACH;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -364,7 +364,7 @@ function CraftDataTable({
364
364
  variant: headerVariant,
365
365
  padding: headerPadding,
366
366
  tone,
367
- filters: resolvedShowGlobalFilter ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("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))]", children: [
367
+ filters: resolvedShowGlobalFilter ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2 rounded-3xl 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))]", children: [
368
368
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_craft_icon.CraftIcon, { name: "search", className: "h-4 w-4 text-[rgb(var(--nc-fg-muted))]" }),
369
369
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
370
370
  "input",
@@ -388,7 +388,7 @@ function CraftDataTable({
388
388
  children: "Columns"
389
389
  }
390
390
  ),
391
- showColumns && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("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", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "grid gap-2", children: columns.map((column) => {
391
+ showColumns && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "absolute right-0 top-12 z-20 w-56 rounded-3xl 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", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "grid gap-2", children: columns.map((column) => {
392
392
  var _a, _b;
393
393
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
394
394
  "label",
@@ -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 = \"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 \"relative 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\"\n ? \"border-transparent bg-transparent shadow-none\"\n : cn(\n \"border-[rgb(var(--nc-accent-1)/0.35)]\",\n \"bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)]\"\n )\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-linear-to-r from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)] 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\" tone={tone}>\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 \"relative 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\"\n ? \"border-transparent bg-transparent shadow-none\"\n : cn(\n \"border-[rgb(var(--nc-accent-1)/0.35)]\",\n \"bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)]\"\n )\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-3xl 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-3xl 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-linear-to-r from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)] 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\" tone={tone}>\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"]}
@@ -331,7 +331,7 @@ function CraftDataTable({
331
331
  variant: headerVariant,
332
332
  padding: headerPadding,
333
333
  tone,
334
- filters: resolvedShowGlobalFilter ? /* @__PURE__ */ jsxs("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))]", children: [
334
+ filters: resolvedShowGlobalFilter ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 rounded-3xl 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))]", children: [
335
335
  /* @__PURE__ */ jsx(CraftIcon, { name: "search", className: "h-4 w-4 text-[rgb(var(--nc-fg-muted))]" }),
336
336
  /* @__PURE__ */ jsx(
337
337
  "input",
@@ -355,7 +355,7 @@ function CraftDataTable({
355
355
  children: "Columns"
356
356
  }
357
357
  ),
358
- showColumns && /* @__PURE__ */ jsx("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", children: /* @__PURE__ */ jsx("div", { className: "grid gap-2", children: columns.map((column) => {
358
+ showColumns && /* @__PURE__ */ jsx("div", { className: "absolute right-0 top-12 z-20 w-56 rounded-3xl 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", children: /* @__PURE__ */ jsx("div", { className: "grid gap-2", children: columns.map((column) => {
359
359
  var _a, _b;
360
360
  return /* @__PURE__ */ jsxs(
361
361
  "label",
@@ -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 = \"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 \"relative 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\"\n ? \"border-transparent bg-transparent shadow-none\"\n : cn(\n \"border-[rgb(var(--nc-accent-1)/0.35)]\",\n \"bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)]\"\n )\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-linear-to-r from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)] 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\" tone={tone}>\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 \"relative 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\"\n ? \"border-transparent bg-transparent shadow-none\"\n : cn(\n \"border-[rgb(var(--nc-accent-1)/0.35)]\",\n \"bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)]\"\n )\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-3xl 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-3xl 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-linear-to-r from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)] 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\" tone={tone}>\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 = "rgb(var(--nc-accent-soft)/0.7)",
153
+ backgroundColor = "rgba(0, 0, 0, 0.75)",
154
154
  tone,
155
155
  className
156
156
  }) {
@@ -178,13 +178,29 @@ function CraftLoader({
178
178
  }
179
179
  );
180
180
  if (!overlay) return content;
181
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
181
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
182
182
  "div",
183
183
  {
184
- className: "absolute inset-0 z-10 flex items-center justify-center",
184
+ className: "fixed inset-0 z-50 flex items-center justify-center overflow-hidden backdrop-blur-md",
185
185
  style: { backgroundColor },
186
186
  "data-nc-theme": tone,
187
- children: content
187
+ children: [
188
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
189
+ "span",
190
+ {
191
+ className: "pointer-events-none absolute inset-0 bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.12)] via-transparent to-[rgb(var(--nc-accent-3)/0.12)]",
192
+ "aria-hidden": "true"
193
+ }
194
+ ),
195
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
196
+ "span",
197
+ {
198
+ className: "pointer-events-none absolute -left-1/4 -top-1/3 h-full w-[120%] rotate-6 bg-white/10 blur-2xl opacity-40",
199
+ "aria-hidden": "true"
200
+ }
201
+ ),
202
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "relative z-10", children: content })
203
+ ]
188
204
  }
189
205
  );
190
206
  }
@@ -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 = \"rgb(var(--nc-accent-soft)/0.7)\",\n tone,\n className,\n}: CraftLoaderProps) {\n if (!loading) return null;\n\n const px = sizeMap[size];\n\n const content = (\n <div\n className={cn(\n \"flex flex-col items-center justify-center gap-3\",\n textPosition === \"top\" && \"flex-col-reverse\",\n className\n )}\n data-nc-theme={tone}\n >\n {type === \"spin\" && <Spinner size={px} color={color} />}\n {type === \"dots\" && <Dots size={px} color={color} />}\n {type === \"bars\" && <Bars size={px} color={color} />}\n {type === \"pulse\" && <Pulse size={px} color={color} />}\n {type === \"ripple\" && <Ripple size={px} color={color} />}\n {type === \"ring\" && <Ring size={px} color={color} />}\n {type === \"bounce\" && <Bounce size={px} color={color} />}\n {text ? <span className=\"text-xs text-[rgb(var(--nc-fg-muted))]\">{text}</span> : null}\n </div>\n );\n\n if (!overlay) return content;\n\n return (\n <div\n className=\"absolute inset-0 z-10 flex items-center justify-center\"\n style={{ backgroundColor }}\n data-nc-theme={tone}\n >\n {content}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"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.75)\",\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=\"fixed inset-0 z-50 flex items-center justify-center overflow-hidden backdrop-blur-md\"\n style={{ backgroundColor }}\n data-nc-theme={tone}\n >\n <span\n className=\"pointer-events-none absolute inset-0 bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.12)] via-transparent to-[rgb(var(--nc-accent-3)/0.12)]\"\n aria-hidden=\"true\"\n />\n <span\n className=\"pointer-events-none absolute -left-1/4 -top-1/3 h-full w-[120%] rotate-6 bg-white/10 blur-2xl opacity-40\"\n aria-hidden=\"true\"\n />\n <div className=\"relative z-10\">{content}</div>\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 = "rgb(var(--nc-accent-soft)/0.7)",
130
+ backgroundColor = "rgba(0, 0, 0, 0.75)",
131
131
  tone,
132
132
  className
133
133
  }) {
@@ -155,13 +155,29 @@ function CraftLoader({
155
155
  }
156
156
  );
157
157
  if (!overlay) return content;
158
- return /* @__PURE__ */ jsx(
158
+ return /* @__PURE__ */ jsxs(
159
159
  "div",
160
160
  {
161
- className: "absolute inset-0 z-10 flex items-center justify-center",
161
+ className: "fixed inset-0 z-50 flex items-center justify-center overflow-hidden backdrop-blur-md",
162
162
  style: { backgroundColor },
163
163
  "data-nc-theme": tone,
164
- children: content
164
+ children: [
165
+ /* @__PURE__ */ jsx(
166
+ "span",
167
+ {
168
+ className: "pointer-events-none absolute inset-0 bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.12)] via-transparent to-[rgb(var(--nc-accent-3)/0.12)]",
169
+ "aria-hidden": "true"
170
+ }
171
+ ),
172
+ /* @__PURE__ */ jsx(
173
+ "span",
174
+ {
175
+ className: "pointer-events-none absolute -left-1/4 -top-1/3 h-full w-[120%] rotate-6 bg-white/10 blur-2xl opacity-40",
176
+ "aria-hidden": "true"
177
+ }
178
+ ),
179
+ /* @__PURE__ */ jsx("div", { className: "relative z-10", children: content })
180
+ ]
165
181
  }
166
182
  );
167
183
  }
@@ -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 = \"rgb(var(--nc-accent-soft)/0.7)\",\n tone,\n className,\n}: CraftLoaderProps) {\n if (!loading) return null;\n\n const px = sizeMap[size];\n\n const content = (\n <div\n className={cn(\n \"flex flex-col items-center justify-center gap-3\",\n textPosition === \"top\" && \"flex-col-reverse\",\n className\n )}\n data-nc-theme={tone}\n >\n {type === \"spin\" && <Spinner size={px} color={color} />}\n {type === \"dots\" && <Dots size={px} color={color} />}\n {type === \"bars\" && <Bars size={px} color={color} />}\n {type === \"pulse\" && <Pulse size={px} color={color} />}\n {type === \"ripple\" && <Ripple size={px} color={color} />}\n {type === \"ring\" && <Ring size={px} color={color} />}\n {type === \"bounce\" && <Bounce size={px} color={color} />}\n {text ? <span className=\"text-xs text-[rgb(var(--nc-fg-muted))]\">{text}</span> : null}\n </div>\n );\n\n if (!overlay) return content;\n\n return (\n <div\n className=\"absolute inset-0 z-10 flex items-center justify-center\"\n style={{ backgroundColor }}\n data-nc-theme={tone}\n >\n {content}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"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.75)\",\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=\"fixed inset-0 z-50 flex items-center justify-center overflow-hidden backdrop-blur-md\"\n style={{ backgroundColor }}\n data-nc-theme={tone}\n >\n <span\n className=\"pointer-events-none absolute inset-0 bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.12)] via-transparent to-[rgb(var(--nc-accent-3)/0.12)]\"\n aria-hidden=\"true\"\n />\n <span\n className=\"pointer-events-none absolute -left-1/4 -top-1/3 h-full w-[120%] rotate-6 bg-white/10 blur-2xl opacity-40\"\n aria-hidden=\"true\"\n />\n <div className=\"relative z-10\">{content}</div>\n </div>\n );\n}\n"],"mappings":";AAwCI,SAQE,KARF;AApCJ,SAAS,UAAU;AA2BnB,MAAM,UAA2C;AAAA,EAC/C,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,IAAI;AACN;AAEA,SAAS,QAAQ,EAAE,MAAM,MAAM,GAAoC;AACjE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,eAAY;AAAA,MAEZ;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,IAAG;AAAA,YACH,GAAE;AAAA,YACF,QAAQ;AAAA,YACR,aAAY;AAAA,YACZ,WAAU;AAAA;AAAA,QACZ;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,QAAQ;AAAA,YACR,aAAY;AAAA,YACZ,eAAc;AAAA,YACd,WAAU;AAAA;AAAA,QACZ;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,KAAK,EAAE,MAAM,MAAM,GAAoC;AAC9D,QAAM,UAAU,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,CAAC,CAAC;AAChD,SACE,oBAAC,SAAI,WAAU,2BACZ,WAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,UACd;AAAA,IAAC;AAAA;AAAA,MAEC,WAAU;AAAA,MACV,OAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,iBAAiB;AAAA,QACjB,gBAAgB,GAAG,QAAQ,GAAG;AAAA,MAChC;AAAA;AAAA,IAPK;AAAA,EAQP,CACD,GACH;AAEJ;AAEA,SAAS,KAAK,EAAE,MAAM,MAAM,GAAoC;AAC9D,QAAM,YAAY;AAClB,QAAM,WAAW,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,CAAC,CAAC;AACjD,SACE,oBAAC,SAAI,WAAU,wBACZ,WAAC,GAAG,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,UACjB;AAAA,IAAC;AAAA;AAAA,MAEC,WAAU;AAAA,MACV,OAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,YAAY,QAAQ;AAAA,QAC5B,iBAAiB;AAAA,QACjB,gBAAgB,GAAG,QAAQ,GAAG;AAAA,MAChC;AAAA;AAAA,IAPK;AAAA,EAQP,CACD,GACH;AAEJ;AAEA,SAAS,MAAM,EAAE,MAAM,MAAM,GAAoC;AAC/D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,OAAO,MAAM,QAAQ,MAAM,iBAAiB,MAAM;AAAA;AAAA,EAC7D;AAEJ;AAEA,SAAS,OAAO,EAAE,MAAM,MAAM,GAAoC;AAChE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,OAAO,MAAM,QAAQ,MAAM,aAAa,MAAM;AAAA;AAAA,EACzD;AAEJ;AAEA,SAAS,KAAK,EAAE,MAAM,MAAM,GAAoC;AAC9D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,OAAO,MAAM,QAAQ,MAAM,aAAa,MAAM;AAAA;AAAA,EACzD;AAEJ;AAEA,SAAS,OAAO,EAAE,MAAM,MAAM,GAAoC;AAChE,QAAM,UAAU,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,CAAC,CAAC;AAChD,SACE,oBAAC,SAAI,WAAU,2BACZ,WAAC,GAAG,CAAC,EAAE,IAAI,CAAC,UACX;AAAA,IAAC;AAAA;AAAA,MAEC,WAAU;AAAA,MACV,OAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,iBAAiB;AAAA,QACjB,gBAAgB,GAAG,QAAQ,GAAG;AAAA,MAChC;AAAA;AAAA,IAPK;AAAA,EAQP,CACD,GACH;AAEJ;AAEO,SAAS,YAAY;AAAA,EAC1B,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV;AAAA,EACA,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB;AAAA,EACA;AACF,GAAqB;AACnB,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,KAAK,QAAQ,IAAI;AAEvB,QAAM,UACJ;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,iBAAiB,SAAS;AAAA,QAC1B;AAAA,MACF;AAAA,MACA,iBAAe;AAAA,MAEd;AAAA,iBAAS,UAAU,oBAAC,WAAQ,MAAM,IAAI,OAAc;AAAA,QACpD,SAAS,UAAU,oBAAC,QAAK,MAAM,IAAI,OAAc;AAAA,QACjD,SAAS,UAAU,oBAAC,QAAK,MAAM,IAAI,OAAc;AAAA,QACjD,SAAS,WAAW,oBAAC,SAAM,MAAM,IAAI,OAAc;AAAA,QACnD,SAAS,YAAY,oBAAC,UAAO,MAAM,IAAI,OAAc;AAAA,QACrD,SAAS,UAAU,oBAAC,QAAK,MAAM,IAAI,OAAc;AAAA,QACjD,SAAS,YAAY,oBAAC,UAAO,MAAM,IAAI,OAAc;AAAA,QACrD,OAAO,oBAAC,UAAK,WAAU,0CAA0C,gBAAK,IAAU;AAAA;AAAA;AAAA,EACnF;AAGF,MAAI,CAAC,QAAS,QAAO;AAErB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,gBAAgB;AAAA,MACzB,iBAAe;AAAA,MAEf;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,eAAY;AAAA;AAAA,QACd;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,eAAY;AAAA;AAAA,QACd;AAAA,QACA,oBAAC,SAAI,WAAU,iBAAiB,mBAAQ;AAAA;AAAA;AAAA,EAC1C;AAEJ;","names":[]}
package/dist/styles.css CHANGED
@@ -245,6 +245,9 @@
245
245
  .inset-0 {
246
246
  inset: calc(var(--spacing) * 0);
247
247
  }
248
+ .-top-1\/3 {
249
+ top: calc(calc(1/3 * 100%) * -1);
250
+ }
248
251
  .top-0 {
249
252
  top: calc(var(--spacing) * 0);
250
253
  }
@@ -275,6 +278,9 @@
275
278
  .bottom-full {
276
279
  bottom: 100%;
277
280
  }
281
+ .-left-1\/4 {
282
+ left: calc(calc(1/4 * 100%) * -1);
283
+ }
278
284
  .left-0 {
279
285
  left: calc(var(--spacing) * 0);
280
286
  }
@@ -467,6 +473,9 @@
467
473
  .w-56 {
468
474
  width: calc(var(--spacing) * 56);
469
475
  }
476
+ .w-\[120\%\] {
477
+ width: 120%;
478
+ }
470
479
  .w-full {
471
480
  width: 100%;
472
481
  }
@@ -556,6 +565,9 @@
556
565
  --tw-translate-y: calc(var(--spacing) * 2);
557
566
  translate: var(--tw-translate-x) var(--tw-translate-y);
558
567
  }
568
+ .rotate-6 {
569
+ rotate: 6deg;
570
+ }
559
571
  .transform {
560
572
  transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);
561
573
  }
@@ -994,6 +1006,10 @@
994
1006
  --tw-gradient-from: rgb(var(--nc-accent-1)/0.08);
995
1007
  --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));
996
1008
  }
1009
+ .from-\[rgb\(var\(--nc-accent-1\)\/0\.12\)\] {
1010
+ --tw-gradient-from: rgb(var(--nc-accent-1)/0.12);
1011
+ --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));
1012
+ }
997
1013
  .from-\[rgb\(var\(--nc-accent-1\)\/0\.15\)\] {
998
1014
  --tw-gradient-from: rgb(var(--nc-accent-1)/0.15);
999
1015
  --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));
@@ -1013,6 +1029,11 @@
1013
1029
  --tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);
1014
1030
  --tw-gradient-stops: var(--tw-gradient-via-stops);
1015
1031
  }
1032
+ .via-transparent {
1033
+ --tw-gradient-via: transparent;
1034
+ --tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);
1035
+ --tw-gradient-stops: var(--tw-gradient-via-stops);
1036
+ }
1016
1037
  .to-\[rgb\(var\(--nc-accent-3\)\)\] {
1017
1038
  --tw-gradient-to: rgb(var(--nc-accent-3));
1018
1039
  --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));
@@ -1021,6 +1042,10 @@
1021
1042
  --tw-gradient-to: rgb(var(--nc-accent-3)/0.08);
1022
1043
  --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));
1023
1044
  }
1045
+ .to-\[rgb\(var\(--nc-accent-3\)\/0\.12\)\] {
1046
+ --tw-gradient-to: rgb(var(--nc-accent-3)/0.12);
1047
+ --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));
1048
+ }
1024
1049
  .to-\[rgb\(var\(--nc-accent-3\)\/0\.15\)\] {
1025
1050
  --tw-gradient-to: rgb(var(--nc-accent-3)/0.15);
1026
1051
  --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));
@@ -1398,6 +1423,10 @@
1398
1423
  --tw-blur: blur(8px);
1399
1424
  filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
1400
1425
  }
1426
+ .blur-2xl {
1427
+ --tw-blur: blur(var(--blur-2xl));
1428
+ filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
1429
+ }
1401
1430
  .filter {
1402
1431
  filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
1403
1432
  }
@@ -2323,6 +2352,12 @@
2323
2352
  :root {
2324
2353
  --background: #0a0a0a;
2325
2354
  --foreground: #ededed;
2355
+ --nc-fg: 255 255 255;
2356
+ --nc-fg-muted: 226 232 240;
2357
+ --nc-fg-soft: 148 163 184;
2358
+ --nc-surface: 15 23 42;
2359
+ --nc-surface-muted: 30 41 59;
2360
+ --nc-border: 148 163 184;
2326
2361
  }
2327
2362
  }
2328
2363
  [data-nc-mode="light"] {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jameskabz/nextcraft-ui",
3
- "version": "0.8.3",
3
+ "version": "0.8.5",
4
4
  "description": "Next.js + Tailwind UI components with a bold, crafted aesthetic.",
5
5
  "private": false,
6
6
  "license": "MIT",