@jameskabz/nextcraft-ui 0.6.16 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -3
- package/dist/components/craft-button.cjs +64 -4
- package/dist/components/craft-button.cjs.map +1 -1
- package/dist/components/craft-button.d.cts +5 -2
- package/dist/components/craft-button.d.ts +5 -2
- package/dist/components/craft-button.js +65 -5
- package/dist/components/craft-button.js.map +1 -1
- package/dist/components/craft-checkbox.cjs +2 -2
- package/dist/components/craft-checkbox.cjs.map +1 -1
- package/dist/components/craft-checkbox.js +2 -2
- package/dist/components/craft-checkbox.js.map +1 -1
- package/dist/components/craft-create-edit-drawer.cjs +5 -3
- package/dist/components/craft-create-edit-drawer.cjs.map +1 -1
- package/dist/components/craft-create-edit-drawer.js +5 -3
- package/dist/components/craft-create-edit-drawer.js.map +1 -1
- package/dist/components/craft-data-table-header.cjs +74 -0
- package/dist/components/craft-data-table-header.cjs.map +1 -0
- package/dist/components/craft-data-table-header.d.cts +17 -0
- package/dist/components/craft-data-table-header.d.ts +17 -0
- package/dist/components/craft-data-table-header.js +50 -0
- package/dist/components/craft-data-table-header.js.map +1 -0
- package/dist/components/craft-data-table-pagination.cjs +107 -0
- package/dist/components/craft-data-table-pagination.cjs.map +1 -0
- package/dist/components/craft-data-table-pagination.d.cts +25 -0
- package/dist/components/craft-data-table-pagination.d.ts +25 -0
- package/dist/components/craft-data-table-pagination.js +83 -0
- package/dist/components/craft-data-table-pagination.js.map +1 -0
- package/dist/components/craft-data-table.cjs +424 -192
- package/dist/components/craft-data-table.cjs.map +1 -1
- package/dist/components/craft-data-table.d.cts +61 -9
- package/dist/components/craft-data-table.d.ts +61 -9
- package/dist/components/craft-data-table.js +424 -192
- package/dist/components/craft-data-table.js.map +1 -1
- package/dist/components/craft-form-field.cjs +67 -11
- package/dist/components/craft-form-field.cjs.map +1 -1
- package/dist/components/craft-form-field.d.cts +4 -1
- package/dist/components/craft-form-field.d.ts +4 -1
- package/dist/components/craft-form-field.js +57 -11
- package/dist/components/craft-form-field.js.map +1 -1
- package/dist/components/craft-form-modal.cjs +29 -28
- package/dist/components/craft-form-modal.cjs.map +1 -1
- package/dist/components/craft-form-modal.js +29 -28
- package/dist/components/craft-form-modal.js.map +1 -1
- package/dist/components/craft-form.cjs +5 -3
- package/dist/components/craft-form.cjs.map +1 -1
- package/dist/components/craft-form.js +5 -3
- package/dist/components/craft-form.js.map +1 -1
- package/dist/components/craft-icon.cjs +26 -32
- package/dist/components/craft-icon.cjs.map +1 -1
- package/dist/components/craft-icon.d.cts +1 -2
- package/dist/components/craft-icon.d.ts +1 -2
- package/dist/components/craft-icon.js +36 -32
- package/dist/components/craft-icon.js.map +1 -1
- package/dist/components/craft-loader.cjs +195 -0
- package/dist/components/craft-loader.cjs.map +1 -0
- package/dist/components/craft-loader.d.cts +21 -0
- package/dist/components/craft-loader.d.ts +21 -0
- package/dist/components/craft-loader.js +171 -0
- package/dist/components/craft-loader.js.map +1 -0
- package/dist/components/layout/app-template.cjs +2 -3
- package/dist/components/layout/app-template.cjs.map +1 -1
- package/dist/components/layout/app-template.d.cts +1 -2
- package/dist/components/layout/app-template.d.ts +1 -2
- package/dist/components/layout/app-template.js +2 -3
- package/dist/components/layout/app-template.js.map +1 -1
- package/dist/index.cjs +9 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -2
- package/dist/index.d.ts +4 -2
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/styles.css +164 -12
- package/package.json +11 -10
|
@@ -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 { CraftPagination } from \"@/components/craft-pagination\";\n\nexport type CraftDataTableColumn<T> = {\n id: string;\n header: React.ReactNode;\n accessor?: keyof T | ((row: T) => unknown);\n cell?: (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};\n\nexport type CraftDataTableSort = {\n id: string;\n desc?: boolean;\n};\n\nexport type CraftDataTableProps<T> = {\n data: T[];\n columns: CraftDataTableColumn<T>[];\n tone?: ThemeName;\n className?: string;\n loading?: boolean;\n emptyState?: React.ReactNode;\n toolbar?: React.ReactNode;\n enableSorting?: boolean;\n enableFiltering?: boolean;\n enableColumnVisibility?: boolean;\n enableRowSelection?: 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 selectedRowIds?: Record<string, boolean>;\n onRowSelectionChange?: (selection: Record<string, boolean>) => void;\n getRowId?: (row: T, index: number) => string;\n pageIndex?: number;\n pageSize?: number;\n pageCount?: number;\n onPageChange?: (pageIndex: number) => void;\n onPageSizeChange?: (size: 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\nexport function CraftDataTable<T>({\n data,\n columns,\n tone,\n className,\n loading = false,\n emptyState,\n toolbar,\n enableSorting = true,\n enableFiltering = true,\n enableColumnVisibility = true,\n enableRowSelection = 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 selectedRowIds,\n onRowSelectionChange,\n getRowId,\n pageIndex,\n pageSize = 10,\n pageCount,\n onPageChange,\n onPageSizeChange,\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\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\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) => getRowId?.(row, index) ?? String(index),\n [getRowId]\n );\n\n const pageStartIndex =\n enablePagination && !manualPagination ? resolvedPageIndex * pageSize : 0;\n const pageRowIds = pagedData.map((row, index) =>\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 emptyContent = emptyState ?? (\n <div className=\"text-center text-sm text-[rgb(var(--nc-fg-muted))]\">\n No results found.\n </div>\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 return (\n <div className={cn(\"space-y-4\", className)} data-nc-theme={tone}>\n {toolbar}\n\n {resolvedShowGlobalFilter && (\n <div className=\"flex items-center justify-between gap-3 rounded-2xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-2 text-sm text-[rgb(var(--nc-fg))]\">\n <span className=\"text-xs text-[rgb(var(--nc-fg-muted))]\">Global filter</span>\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 rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.18)] px-3 py-2 text-xs text-[rgb(var(--nc-fg))]\"\n />\n </div>\n )}\n\n {enableColumnVisibility && (\n <div className=\"relative flex justify-end\">\n <button\n type=\"button\"\n className=\"rounded-xl 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))] transition hover:bg-[rgb(var(--nc-surface)/0.2)]\"\n onClick={() => setShowColumns((prev) => !prev)}\n >\n Columns\n </button>\n {showColumns && (\n <div className=\"absolute right-0 top-10 z-20 w-48 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}\n </label>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n\n <div className=\"overflow-hidden rounded-3xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.08)] shadow-[0_18px_50px_rgba(0,0,0,0.35)] backdrop-blur-2xl\">\n <table className=\"w-full border-collapse text-left text-sm\">\n <thead className=\"bg-[rgb(var(--nc-surface)/0.12)] text-[rgb(var(--nc-fg-muted))]\">\n <tr>\n {enableRowSelection && (\n <th className=\"w-12 px-4 py-3\">\n <input\n ref={headerCheckboxRef}\n type=\"checkbox\"\n className=\"h-4 w-4 accent-[rgb(var(--nc-accent-1))]\"\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 </th>\n )}\n {visibleColumns.map((column) => (\n <th\n key={column.id}\n className={cn(\n \"px-4 py-3 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 items-center gap-2\",\n enableSorting && column.sortable !== false\n ? \"cursor-pointer\"\n : \"cursor-default\"\n )}\n onClick={() => toggleSort(column)}\n >\n <span>{column.header}</span>\n {resolvedSort?.id === column.id && (\n <span className=\"text-[rgb(var(--nc-accent-1))]\">\n {resolvedSort.desc ? \"↓\" : \"↑\"}\n </span>\n )}\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 </tr>\n </thead>\n <tbody className=\"text-[rgb(var(--nc-fg))]\">\n {loading && (\n <tr>\n <td\n colSpan={visibleColumns.length + (enableRowSelection ? 1 : 0)}\n className=\"px-4 py-10 text-center text-sm text-[rgb(var(--nc-fg-muted))]\"\n >\n <span className=\"inline-flex items-center gap-2\">\n <span className=\"h-4 w-4 animate-spin rounded-full border-2 border-[rgb(var(--nc-fg-muted))] border-t-transparent\" />\n Loading data...\n </span>\n </td>\n </tr>\n )}\n {!loading && pagedData.length === 0 && (\n <tr>\n <td\n colSpan={visibleColumns.length + (enableRowSelection ? 1 : 0)}\n className=\"px-4 py-10\"\n >\n {emptyContent}\n </td>\n </tr>\n )}\n {!loading &&\n pagedData.map((row, rowIndex) => {\n const rowId = rowIdFor(row, pageStartIndex + rowIndex);\n const isSelected = resolvedSelection[rowId];\n return (\n <tr\n key={rowId}\n className={cn(\n \"border-t border-[rgb(var(--nc-border)/0.15)]\",\n isSelected && \"bg-[rgb(var(--nc-accent-1)/0.08)]\"\n )}\n >\n {enableRowSelection && (\n <td className=\"px-4 py-4\">\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 accent-[rgb(var(--nc-accent-1))]\"\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 <td\n key={column.id}\n className={cn(\n \"px-4 py-4\",\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n column.cellClassName\n )}\n >\n {column.cell\n ? column.cell(row)\n : String(getColumnValue(column, row) ?? \"\")}\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n\n {enablePagination && (\n <CraftPagination\n pageIndex={resolvedPageIndex}\n pageCount={resolvedPageCount}\n onPageChange={setPageIndex}\n pageSize={pageSize}\n onPageSizeChange={onPageSizeChange}\n tone={tone}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/craft-data-table.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\nimport { CraftButton } from \"@/components/craft-button\";\nimport { CraftCheckbox } from \"@/components/craft-checkbox\";\nimport { CraftIcon } from \"@/components/craft-icon\";\nimport { CraftModal } from \"@/components/craft-modal\";\nimport { CraftTooltip } from \"@/components/craft-tooltip\";\nimport { CraftLoader } from \"@/components/craft-loader\";\nimport { CraftDataTableHeader } from \"@/components/craft-data-table-header\";\nimport { CraftDataTablePagination } from \"@/components/craft-data-table-pagination\";\n\nexport type CraftDataTableColumn<T> = {\n id: string;\n header?: React.ReactNode;\n label?: React.ReactNode;\n accessor?: keyof T | ((row: T) => unknown);\n cell?: (row: T) => React.ReactNode;\n formatter?: (value: unknown, row: T) => React.ReactNode;\n sortable?: boolean;\n filterable?: boolean;\n width?: string | number;\n align?: \"left\" | \"center\" | \"right\";\n hidden?: boolean;\n headerClassName?: string;\n cellClassName?: string;\n truncate?: boolean;\n maxWords?: number;\n};\n\nexport type CraftDataTableSort = {\n id: string;\n desc?: boolean;\n};\n\nexport type CraftDataTableAction<T> = {\n key: string;\n label?: React.ReactNode;\n icon?: string | React.ReactNode;\n variant?:\n | \"solid\"\n | \"outline\"\n | \"ghost\"\n | \"gradient\"\n | \"default\"\n | \"primary\"\n | \"secondary\"\n | \"danger\"\n | \"success\"\n | \"warning\"\n | \"info\"\n | \"subtle\"\n | \"dark\"\n | \"light\"\n | \"primaryOutline\"\n | \"dangerOutline\"\n | \"successOutline\"\n | \"link\";\n permission?: boolean | ((item: T) => boolean);\n visible?: boolean | ((item: T) => boolean);\n disabled?: boolean | ((item: T) => boolean);\n tooltip?: React.ReactNode | ((item: T) => React.ReactNode);\n onClick?: (item: T) => void;\n className?: string | ((item: T) => string);\n};\n\nexport type CraftDataTableProps<T> = {\n data: T[];\n columns: CraftDataTableColumn<T>[];\n title?: React.ReactNode;\n description?: React.ReactNode;\n tone?: ThemeName;\n className?: string;\n toolbar?: React.ReactNode;\n emptyState?: React.ReactNode;\n actions?: CraftDataTableAction<T>[];\n showActionsColumn?: boolean;\n selectable?: boolean;\n enableRowSelection?: boolean;\n selectedRowIds?: Record<string, boolean>;\n onRowSelectionChange?: (selection: Record<string, boolean>) => void;\n getRowId?: (row: T, index: number) => string;\n rowKey?: keyof T | string;\n enableSorting?: boolean;\n enableFiltering?: boolean;\n enableColumnVisibility?: boolean;\n enablePagination?: boolean;\n showGlobalFilter?: boolean;\n manualSorting?: boolean;\n manualFiltering?: boolean;\n manualPagination?: boolean;\n sortBy?: CraftDataTableSort | null;\n onSortChange?: (sort: CraftDataTableSort | null) => void;\n filters?: Record<string, string>;\n onFiltersChange?: (filters: Record<string, string>) => void;\n globalFilter?: string;\n onGlobalFilterChange?: (value: string) => void;\n columnVisibility?: Record<string, boolean>;\n onColumnVisibilityChange?: (visibility: Record<string, boolean>) => void;\n pageIndex?: number;\n pageSize?: number;\n pageCount?: number;\n onPageChange?: (pageIndex: number) => void;\n onPageSizeChange?: (size: number) => void;\n striped?: boolean;\n hoverable?: boolean;\n clickableRows?: boolean;\n emptyText?: string;\n emptySubtitle?: string;\n variant?: \"default\" | \"bordered\" | \"minimal\";\n density?: \"compact\" | \"normal\" | \"comfortable\";\n headerVariant?: \"default\" | \"minimal\";\n headerPadding?: \"compact\" | \"normal\" | \"comfortable\";\n paginationVariant?: \"default\" | \"minimal\";\n paginationPadding?: \"compact\" | \"normal\" | \"comfortable\";\n loading?: boolean;\n dataLoading?: boolean;\n sortLoading?: boolean;\n paginationLoading?: boolean;\n bulkLoading?: boolean;\n rowLoading?: Record<string, boolean>;\n loadingType?: \"spin\" | \"pulse\" | \"bounce\" | \"ripple\" | \"bars\" | \"dots\" | \"ring\";\n loadingSize?: \"small\" | \"medium\" | \"large\" | \"xl\";\n loadingColor?: string;\n loadingText?: string;\n loadingTextPosition?: \"top\" | \"bottom\";\n loadingBackground?: string;\n showSkeleton?: boolean;\n skeletonRows?: number;\n truncateWords?: number;\n enableTextModal?: boolean;\n onRowClick?: (payload: { item: T; index: number }) => void;\n};\n\nfunction getColumnValue<T>(column: CraftDataTableColumn<T>, row: T) {\n if (typeof column.accessor === \"function\") return column.accessor(row);\n const record = row as Record<string, unknown>;\n if (typeof column.accessor === \"string\") return record[column.accessor];\n return record[column.id];\n}\n\nfunction normalizeValue(value: unknown) {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") return value.toLowerCase();\n if (value instanceof Date) return value.getTime();\n return String(value).toLowerCase();\n}\n\nfunction truncateText(text: string, maxWords: number) {\n const words = text.split(\" \");\n if (words.length <= maxWords) return text;\n return `${words.slice(0, maxWords).join(\" \")}...`;\n}\n\nfunction resolveActionVariant(\n variant: CraftDataTableAction<unknown>[\"variant\"]\n): \"solid\" | \"outline\" | \"ghost\" | \"gradient\" {\n switch (variant) {\n case \"solid\":\n case \"default\":\n case \"primary\":\n return \"solid\";\n case \"gradient\":\n return \"gradient\";\n case \"outline\":\n case \"primaryOutline\":\n case \"dangerOutline\":\n case \"successOutline\":\n return \"outline\";\n case \"ghost\":\n case \"link\":\n case \"secondary\":\n case \"danger\":\n case \"success\":\n case \"warning\":\n case \"info\":\n case \"subtle\":\n case \"dark\":\n case \"light\":\n default:\n return \"ghost\";\n }\n}\n\nexport function CraftDataTable<T>({\n data,\n columns,\n title,\n description,\n tone,\n className,\n toolbar,\n emptyState,\n actions = [],\n showActionsColumn = true,\n selectable,\n enableRowSelection = true,\n selectedRowIds,\n onRowSelectionChange,\n getRowId,\n rowKey,\n enableSorting = true,\n enableFiltering = true,\n enableColumnVisibility = true,\n enablePagination = true,\n showGlobalFilter,\n manualSorting = false,\n manualFiltering = false,\n manualPagination = false,\n sortBy,\n onSortChange,\n filters,\n onFiltersChange,\n globalFilter,\n onGlobalFilterChange,\n columnVisibility,\n onColumnVisibilityChange,\n pageIndex,\n pageSize = 10,\n pageCount,\n onPageChange,\n onPageSizeChange,\n striped = false,\n hoverable = true,\n clickableRows = false,\n emptyText = \"No data available\",\n emptySubtitle = \"Try adjusting your search or filter criteria\",\n variant = \"default\",\n density = \"normal\",\n headerVariant = \"default\",\n headerPadding = \"normal\",\n paginationVariant = \"default\",\n paginationPadding = \"normal\",\n loading = false,\n dataLoading = false,\n sortLoading = false,\n paginationLoading = false,\n bulkLoading = false,\n rowLoading = {},\n loadingType = \"dots\",\n loadingSize = \"medium\",\n loadingColor = \"rgb(var(--nc-accent-1))\",\n loadingText = \"Loading...\",\n loadingTextPosition = \"bottom\",\n loadingBackground = \"rgba(0, 0, 0, 0.35)\",\n showSkeleton = true,\n skeletonRows = 5,\n truncateWords = 10,\n enableTextModal = true,\n onRowClick,\n}: CraftDataTableProps<T>) {\n const [internalSort, setInternalSort] = React.useState<CraftDataTableSort | null>(null);\n const [internalFilters, setInternalFilters] = React.useState<Record<string, string>>({});\n const [internalGlobalFilter, setInternalGlobalFilter] = React.useState(\"\");\n const [internalVisibility, setInternalVisibility] = React.useState<Record<string, boolean>>(() =>\n columns.reduce((acc, column) => {\n acc[column.id] = !column.hidden;\n return acc;\n }, {} as Record<string, boolean>)\n );\n const [internalSelection, setInternalSelection] = React.useState<Record<string, boolean>>({});\n const [internalPageIndex, setInternalPageIndex] = React.useState(0);\n const [showColumns, setShowColumns] = React.useState(false);\n const [showModal, setShowModal] = React.useState(false);\n const [modalContent, setModalContent] = React.useState<string>(\"\");\n\n const resolvedSort = sortBy ?? internalSort;\n const resolvedFilters = filters ?? internalFilters;\n const resolvedGlobalFilter = globalFilter ?? internalGlobalFilter;\n const resolvedVisibility = columnVisibility ?? internalVisibility;\n const resolvedSelection = selectedRowIds ?? internalSelection;\n const resolvedPageIndex = pageIndex ?? internalPageIndex;\n const resolvedSelectable = selectable ?? enableRowSelection;\n\n const setSort = (next: CraftDataTableSort | null) => {\n if (sortBy === undefined) setInternalSort(next);\n onSortChange?.(next);\n };\n\n const setFilters = (next: Record<string, string>) => {\n if (filters === undefined) setInternalFilters(next);\n onFiltersChange?.(next);\n };\n\n const setVisibility = (next: Record<string, boolean>) => {\n if (columnVisibility === undefined) setInternalVisibility(next);\n onColumnVisibilityChange?.(next);\n };\n\n const setSelection = (next: Record<string, boolean>) => {\n if (selectedRowIds === undefined) setInternalSelection(next);\n onRowSelectionChange?.(next);\n };\n\n const setPageIndex = React.useCallback(\n (next: number) => {\n if (pageIndex === undefined) setInternalPageIndex(next);\n onPageChange?.(next);\n },\n [pageIndex, onPageChange]\n );\n\n const visibleColumns = columns.filter(\n (column) => resolvedVisibility[column.id] !== false\n );\n\n const filteredData = React.useMemo(() => {\n if (manualFiltering) return data;\n const globalValue = resolvedGlobalFilter.trim();\n return data.filter((row) => {\n if (globalValue) {\n const matchesGlobal = columns.some((column) => {\n const value = normalizeValue(getColumnValue(column, row));\n return String(value).includes(globalValue.toLowerCase());\n });\n if (!matchesGlobal) return false;\n }\n\n return Object.entries(resolvedFilters).every(([columnId, value]) => {\n if (!value) return true;\n const column = columns.find((col) => col.id === columnId);\n if (!column) return true;\n const cellValue = normalizeValue(getColumnValue(column, row));\n return String(cellValue).includes(value.toLowerCase());\n });\n });\n }, [columns, data, manualFiltering, resolvedFilters, resolvedGlobalFilter]);\n\n const sortedData = React.useMemo(() => {\n if (manualSorting || !resolvedSort) return filteredData;\n const column = columns.find((col) => col.id === resolvedSort.id);\n if (!column) return filteredData;\n const sorted = [...filteredData].sort((a, b) => {\n const valueA = normalizeValue(getColumnValue(column, a));\n const valueB = normalizeValue(getColumnValue(column, b));\n if (typeof valueA === \"number\" && typeof valueB === \"number\") {\n return valueA - valueB;\n }\n return String(valueA).localeCompare(String(valueB));\n });\n return resolvedSort.desc ? sorted.reverse() : sorted;\n }, [columns, filteredData, manualSorting, resolvedSort]);\n\n const resolvedPageCount = manualPagination\n ? Math.max(pageCount ?? 1, 1)\n : Math.max(Math.ceil(sortedData.length / pageSize), 1);\n\n React.useEffect(() => {\n if (resolvedPageIndex > resolvedPageCount - 1) {\n setPageIndex(Math.max(resolvedPageCount - 1, 0));\n }\n }, [resolvedPageCount, resolvedPageIndex, setPageIndex]);\n\n const pagedData = React.useMemo(() => {\n if (!enablePagination || manualPagination) return sortedData;\n const start = resolvedPageIndex * pageSize;\n return sortedData.slice(start, start + pageSize);\n }, [enablePagination, manualPagination, pageSize, resolvedPageIndex, sortedData]);\n\n const rowIdFor = React.useCallback(\n (row: T, index: number) => {\n if (getRowId) return getRowId(row, index);\n if (rowKey) return String((row as Record<string, unknown>)[rowKey as string] ?? index);\n return String(index);\n },\n [getRowId, rowKey]\n );\n\n const pageStartIndex =\n enablePagination && !manualPagination ? resolvedPageIndex * pageSize : 0;\n const pageRowIds = pagedData.map((row: T, index: number) =>\n rowIdFor(row, pageStartIndex + index)\n );\n const allSelected =\n pageRowIds.length > 0 && pageRowIds.every((id) => resolvedSelection[id]);\n const someSelected = pageRowIds.some((id) => resolvedSelection[id]);\n const headerCheckboxRef = React.useRef<HTMLInputElement | null>(null);\n\n React.useEffect(() => {\n if (headerCheckboxRef.current) {\n headerCheckboxRef.current.indeterminate = someSelected && !allSelected;\n }\n }, [someSelected, allSelected]);\n\n const toggleSort = (column: CraftDataTableColumn<T>) => {\n if (!enableSorting || column.sortable === false) return;\n const current = resolvedSort;\n if (!current || current.id !== column.id) {\n setSort({ id: column.id, desc: false });\n return;\n }\n if (!current.desc) {\n setSort({ id: column.id, desc: true });\n return;\n }\n setSort(null);\n };\n\n const resolvedShowGlobalFilter =\n showGlobalFilter ?? (enableFiltering && !toolbar);\n\n const setGlobalFilter = (next: string) => {\n if (globalFilter === undefined) setInternalGlobalFilter(next);\n onGlobalFilterChange?.(next);\n };\n\n const shouldShowActionsColumn = React.useMemo(() => {\n if (!showActionsColumn) return false;\n if (!actions || actions.length === 0) return false;\n return actions.some((action) => {\n if (action.permission === undefined) return true;\n if (typeof action.permission === \"boolean\") return action.permission;\n return true;\n });\n }, [actions, showActionsColumn]);\n\n const getVisibleActions = (item: T) =>\n actions.filter((action) => {\n if (action.permission !== undefined) {\n if (typeof action.permission === \"boolean\" && !action.permission) return false;\n if (typeof action.permission === \"function\" && !action.permission(item)) return false;\n }\n if (action.visible && typeof action.visible === \"function\") {\n return action.visible(item);\n }\n if (typeof action.visible === \"boolean\") return action.visible;\n return true;\n });\n\n const isActionDisabled = (action: CraftDataTableAction<T>, item: T) => {\n if (action.disabled && typeof action.disabled === \"function\") return action.disabled(item);\n if (typeof action.disabled === \"boolean\") return action.disabled;\n return false;\n };\n\n const handleActionClick = (action: CraftDataTableAction<T>, item: T) => {\n if (isActionDisabled(action, item)) return;\n action.onClick?.(item);\n };\n\n const totalColumns =\n visibleColumns.length +\n (resolvedSelectable ? 1 : 0) +\n (shouldShowActionsColumn ? 1 : 0);\n\n const densityPadding = {\n compact: \"px-4 py-2\",\n normal: \"px-6 py-4\",\n comfortable: \"px-8 py-6\",\n } as const;\n\n const headerPaddingClasses = {\n compact: \"px-4 py-2\",\n normal: \"px-6 py-3\",\n comfortable: \"px-8 py-4\",\n } as const;\n\n const rowClassNames = (isSelected: boolean, rowId: string, index: number) =>\n cn(\n \"transition-colors\",\n variant === \"bordered\" && \"border-b border-[rgb(var(--nc-border)/0.2)]\",\n variant === \"minimal\" && \"border-b border-[rgb(var(--nc-border)/0.15)]\",\n striped && index % 2 === 1 && \"bg-[rgb(var(--nc-surface)/0.04)]\",\n hoverable && !clickableRows && \"hover:bg-[rgb(var(--nc-surface)/0.12)]\",\n clickableRows && \"cursor-pointer hover:bg-[rgb(var(--nc-surface)/0.16)]\",\n isSelected && \"bg-[rgb(var(--nc-accent-1)/0.12)]\",\n rowLoading[rowId] && \"opacity-60\"\n );\n\n const containerClasses = cn(\n \"overflow-hidden rounded-3xl border border-[rgb(var(--nc-border)/0.3)]\",\n \"bg-[rgb(var(--nc-surface)/0.08)] shadow-[0_18px_50px_rgba(0,0,0,0.35)] backdrop-blur-2xl\",\n variant === \"minimal\" && \"border-transparent bg-transparent shadow-none\"\n );\n\n const openModal = (content: string) => {\n if (!enableTextModal) return;\n setModalContent(content);\n setShowModal(true);\n };\n\n const closeModal = () => {\n setShowModal(false);\n setModalContent(\"\");\n };\n\n return (\n <div className={cn(\"space-y-4\", className)} data-nc-theme={tone}>\n {toolbar}\n\n <CraftDataTableHeader\n title={title}\n description={description}\n variant={headerVariant}\n padding={headerPadding}\n tone={tone}\n filters={\n resolvedShowGlobalFilter ? (\n <div className=\"flex items-center gap-2 rounded-2xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-2 text-xs text-[rgb(var(--nc-fg))]\">\n <CraftIcon name=\"search\" className=\"h-4 w-4 text-[rgb(var(--nc-fg-muted))]\" />\n <input\n type=\"search\"\n value={resolvedGlobalFilter}\n onChange={(event) => setGlobalFilter(event.target.value)}\n placeholder=\"Search all columns...\"\n className=\"w-full max-w-xs bg-transparent text-xs text-[rgb(var(--nc-fg))] placeholder:text-[rgb(var(--nc-fg-muted))] focus:outline-none\"\n />\n </div>\n ) : null\n }\n actions={\n enableColumnVisibility ? (\n <div className=\"relative\">\n <CraftButton\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowColumns((prev) => !prev)}\n >\n Columns\n </CraftButton>\n {showColumns && (\n <div className=\"absolute right-0 top-12 z-20 w-56 rounded-2xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.2)] p-3 shadow-[0_12px_30px_rgba(0,0,0,0.35)] backdrop-blur-2xl\">\n <div className=\"grid gap-2\">\n {columns.map((column) => (\n <label\n key={column.id}\n className=\"flex items-center gap-2 text-xs text-[rgb(var(--nc-fg))]\"\n >\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 accent-[rgb(var(--nc-accent-1))]\"\n checked={resolvedVisibility[column.id] !== false}\n onChange={(event) =>\n setVisibility({\n ...resolvedVisibility,\n [column.id]: event.target.checked,\n })\n }\n />\n {column.header ?? column.label ?? column.id}\n </label>\n ))}\n </div>\n </div>\n )}\n </div>\n ) : null\n }\n />\n\n <div className={containerClasses}>\n <div className=\"relative\">\n <CraftLoader\n loading={loading || dataLoading}\n type={loadingType}\n size={loadingSize}\n color={loadingColor}\n overlay\n text={loadingText}\n textPosition={loadingTextPosition}\n backgroundColor={loadingBackground}\n />\n\n <div className={cn(\"overflow-x-auto\", (loading || dataLoading) && \"opacity-60\")}>\n <table className=\"min-w-full border-collapse text-left text-sm\">\n <thead className=\"bg-[rgb(var(--nc-surface)/0.12)] text-[rgb(var(--nc-fg-muted))]\">\n <tr>\n {resolvedSelectable && (\n <th className={cn(\"w-12\", headerPaddingClasses[density])}>\n <div className=\"flex items-center justify-center\">\n {bulkLoading ? (\n <CraftLoader loading type=\"spin\" size=\"small\" color={loadingColor} />\n ) : (\n <CraftCheckbox\n ref={headerCheckboxRef}\n checked={allSelected}\n onChange={(event) => {\n const next = { ...resolvedSelection };\n pageRowIds.forEach((id) => {\n next[id] = event.target.checked;\n });\n setSelection(next);\n }}\n />\n )}\n </div>\n </th>\n )}\n {visibleColumns.map((column) => {\n const headerLabel = column.header ?? column.label ?? column.id;\n return (\n <th\n key={column.id}\n className={cn(\n headerPaddingClasses[density],\n \"text-xs font-semibold uppercase tracking-[0.2em]\",\n column.headerClassName\n )}\n style={{ width: column.width }}\n >\n <button\n type=\"button\"\n className={cn(\n \"flex w-full items-center gap-2\",\n enableSorting && column.sortable !== false\n ? \"cursor-pointer\"\n : \"cursor-default\"\n )}\n onClick={() => toggleSort(column)}\n >\n <span>{headerLabel}</span>\n {sortLoading && resolvedSort?.id === column.id ? (\n <CraftLoader loading type=\"spin\" size=\"small\" color={loadingColor} />\n ) : null}\n {resolvedSort?.id === column.id && !sortLoading ? (\n <span className=\"text-[rgb(var(--nc-accent-1))]\">\n {resolvedSort.desc ? \"↓\" : \"↑\"}\n </span>\n ) : null}\n </button>\n {enableFiltering && column.filterable !== false && (\n <input\n type=\"text\"\n value={resolvedFilters[column.id] ?? \"\"}\n onChange={(event) =>\n setFilters({\n ...resolvedFilters,\n [column.id]: event.target.value,\n })\n }\n placeholder=\"Filter\"\n className=\"mt-2 w-full rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.18)] px-2 py-1 text-xs text-[rgb(var(--nc-fg))]\"\n />\n )}\n </th>\n );\n })}\n {shouldShowActionsColumn && (\n <th className={cn(headerPaddingClasses[density], \"text-xs uppercase\")}>Actions</th>\n )}\n </tr>\n </thead>\n <tbody className=\"text-[rgb(var(--nc-fg))]\">\n {showSkeleton && (loading || dataLoading) ? (\n Array.from({ length: skeletonRows }).map((_, rowIndex) => (\n <tr key={`skeleton-${rowIndex}`} className=\"animate-pulse\">\n {resolvedSelectable && (\n <td className={cn(headerPaddingClasses[density], \"w-12\")}> \n <div className=\"h-4 w-4 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n </td>\n )}\n {visibleColumns.map((column) => (\n <td key={column.id} className={cn(densityPadding[density])}>\n <div className=\"h-4 w-3/4 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n </td>\n ))}\n {shouldShowActionsColumn && (\n <td className={cn(densityPadding[density])}>\n <div className=\"flex items-center justify-center gap-2\">\n <div className=\"h-6 w-6 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n <div className=\"h-6 w-6 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n </div>\n </td>\n )}\n </tr>\n ))\n ) : pagedData.length === 0 ? (\n <tr>\n <td colSpan={totalColumns} className={cn(densityPadding[density], \"py-12\")}> \n {emptyState ?? (\n <div className=\"flex flex-col items-center justify-center text-center\">\n <CraftIcon\n name=\"search\"\n className=\"mb-4 h-12 w-12 text-[rgb(var(--nc-fg-muted))]\"\n />\n <p className=\"text-base font-semibold text-[rgb(var(--nc-fg))]\">\n {emptyText}\n </p>\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">\n {emptySubtitle}\n </p>\n </div>\n )}\n </td>\n </tr>\n ) : (\n pagedData.map((row: T, rowIndex: number) => {\n const rowId = rowIdFor(row, pageStartIndex + rowIndex);\n const isSelected = Boolean(resolvedSelection[rowId]);\n return (\n <tr\n key={rowId}\n className={rowClassNames(isSelected, rowId, rowIndex)}\n onClick={() => {\n if (!clickableRows) return;\n onRowClick?.({ item: row, index: rowIndex });\n }}\n >\n {resolvedSelectable && (\n <td className={cn(densityPadding[density], \"w-12\")}> \n <CraftCheckbox\n checked={isSelected}\n onChange={(event) =>\n setSelection({\n ...resolvedSelection,\n [rowId]: event.target.checked,\n })\n }\n />\n </td>\n )}\n {visibleColumns.map((column) => {\n const rawValue = getColumnValue(column, row);\n const formatted = column.formatter\n ? column.formatter(rawValue, row)\n : rawValue;\n const content = column.cell\n ? column.cell(row)\n : formatted ?? \"\";\n\n if (\n enableTextModal &&\n !column.cell &&\n typeof formatted === \"string\" &&\n (column.truncate ?? true) &&\n formatted.split(\" \").length > (column.maxWords ?? truncateWords)\n ) {\n const maxWords = column.maxWords ?? truncateWords;\n return (\n <td\n key={column.id}\n className={cn(\n densityPadding[density],\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n column.cellClassName\n )}\n >\n <button\n type=\"button\"\n className=\"text-[rgb(var(--nc-accent-1))] hover:text-[rgb(var(--nc-accent-2))]\"\n onClick={() => openModal(formatted)}\n >\n {truncateText(formatted, maxWords)}\n </button>\n </td>\n );\n }\n\n return (\n <td\n key={column.id}\n className={cn(\n densityPadding[density],\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n column.cellClassName\n )}\n >\n {content as React.ReactNode}\n </td>\n );\n })}\n {shouldShowActionsColumn && (\n <td className={cn(densityPadding[density])}>\n <div className=\"flex items-center justify-center gap-2\">\n {getVisibleActions(row).map((action) => {\n const tooltip =\n typeof action.tooltip === \"function\"\n ? action.tooltip(row)\n : action.tooltip;\n const className =\n typeof action.className === \"function\"\n ? action.className(row)\n : action.className;\n const button = (\n <CraftButton\n type=\"button\"\n size=\"sm\"\n variant={resolveActionVariant(action.variant)}\n disabled={isActionDisabled(action, row)}\n className={cn(\"h-8 w-8 p-0\", className)}\n onClick={(event) => {\n event.stopPropagation();\n handleActionClick(action, row);\n }}\n >\n {action.icon ? (\n typeof action.icon === \"string\" ? (\n <CraftIcon name={action.icon} className=\"h-4 w-4\" />\n ) : (\n action.icon\n )\n ) : action.label ? (\n <span className=\"text-[11px]\">{action.label}</span>\n ) : null}\n </CraftButton>\n );\n\n if (tooltip) {\n return (\n <CraftTooltip key={action.key} content={tooltip}>\n {button}\n </CraftTooltip>\n );\n }\n\n return <React.Fragment key={action.key}>{button}</React.Fragment>;\n })}\n </div>\n </td>\n )}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n </div>\n\n <CraftDataTablePagination\n currentPage={resolvedPageIndex}\n totalPages={resolvedPageCount}\n total={filteredData.length}\n pageSize={pageSize}\n selectable={Boolean(resolvedSelectable)}\n selectedCount={Object.values(resolvedSelection).filter(Boolean).length}\n showPagination={enablePagination}\n loading={paginationLoading}\n disabled={loading || dataLoading}\n onPageChange={setPageIndex}\n onPageSizeChange={onPageSizeChange}\n variant={paginationVariant}\n padding={paginationPadding}\n tone={tone}\n />\n </div>\n\n <CraftModal open={showModal} onOpenChange={setShowModal} title=\"Full Text\">\n <div className=\"space-y-3\">\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">Full content</p>\n <div className=\"text-sm text-[rgb(var(--nc-fg))] whitespace-pre-wrap wrap-break-words\">\n {modalContent}\n </div>\n <div className=\"flex justify-end\">\n <CraftButton type=\"button\" variant=\"ghost\" onClick={closeModal}>\n Close\n </CraftButton>\n </div>\n </div>\n </CraftModal>\n </div>\n );\n}\n"],"mappings":"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","names":["className"]}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
"use client";
|
|
3
|
+
var __create = Object.create;
|
|
3
4
|
var __defProp = Object.defineProperty;
|
|
4
5
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
6
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
8
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
9
|
var __export = (target, all) => {
|
|
8
10
|
for (var name in all)
|
|
@@ -16,6 +18,14 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
18
|
}
|
|
17
19
|
return to;
|
|
18
20
|
};
|
|
21
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
+
mod
|
|
28
|
+
));
|
|
19
29
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
30
|
var craft_form_field_exports = {};
|
|
21
31
|
__export(craft_form_field_exports, {
|
|
@@ -23,6 +33,7 @@ __export(craft_form_field_exports, {
|
|
|
23
33
|
});
|
|
24
34
|
module.exports = __toCommonJS(craft_form_field_exports);
|
|
25
35
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
36
|
+
var React = __toESM(require("react"), 1);
|
|
26
37
|
var import_react_hook_form = require("react-hook-form");
|
|
27
38
|
var import_cn = require("../utils/cn");
|
|
28
39
|
var import_craft_input = require("../components/craft-input");
|
|
@@ -48,6 +59,9 @@ function CraftFormField({
|
|
|
48
59
|
name,
|
|
49
60
|
label,
|
|
50
61
|
description,
|
|
62
|
+
helpText,
|
|
63
|
+
success,
|
|
64
|
+
required,
|
|
51
65
|
type = "text",
|
|
52
66
|
options = [],
|
|
53
67
|
placeholder,
|
|
@@ -62,11 +76,20 @@ function CraftFormField({
|
|
|
62
76
|
}) {
|
|
63
77
|
const { register, control, formState } = (0, import_react_hook_form.useFormContext)();
|
|
64
78
|
const error = getFieldError(formState.errors, name);
|
|
79
|
+
const fieldId = React.useId();
|
|
80
|
+
const errorId = `${fieldId}-error`;
|
|
81
|
+
const helpId = `${fieldId}-help`;
|
|
65
82
|
const errorMessage = typeof (error == null ? void 0 : error.message) === "string" ? error.message : void 0;
|
|
83
|
+
const hasError = Boolean(errorMessage);
|
|
84
|
+
const resolvedInputClassName = (0, import_cn.cn)(
|
|
85
|
+
inputClassName,
|
|
86
|
+
hasError ? "border-[rgb(var(--nc-accent-3))] focus:border-[rgb(var(--nc-accent-3))] focus:ring-[rgb(var(--nc-accent-3)/0.35)]" : null
|
|
87
|
+
);
|
|
88
|
+
const ariaDescribedBy = hasError ? errorId : helpText ? helpId : void 0;
|
|
66
89
|
if (type === "hidden") {
|
|
67
90
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", { type: "hidden", ...register(name, rules) });
|
|
68
91
|
}
|
|
69
|
-
const labelNode = label ? /* @__PURE__ */ (0, import_jsx_runtime.
|
|
92
|
+
const labelNode = label ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
70
93
|
"label",
|
|
71
94
|
{
|
|
72
95
|
htmlFor: name,
|
|
@@ -74,7 +97,10 @@ function CraftFormField({
|
|
|
74
97
|
"text-sm font-semibold text-[rgb(var(--nc-fg))]",
|
|
75
98
|
labelClassName
|
|
76
99
|
),
|
|
77
|
-
children:
|
|
100
|
+
children: [
|
|
101
|
+
label,
|
|
102
|
+
required ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "ml-1 text-[rgb(var(--nc-accent-3))]", "aria-label": "required", children: "*" }) : null
|
|
103
|
+
]
|
|
78
104
|
}
|
|
79
105
|
) : null;
|
|
80
106
|
const descriptionNode = description ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
@@ -87,7 +113,24 @@ function CraftFormField({
|
|
|
87
113
|
children: description
|
|
88
114
|
}
|
|
89
115
|
) : null;
|
|
90
|
-
const errorNode = errorMessage ? /* @__PURE__ */ (0, import_jsx_runtime.
|
|
116
|
+
const errorNode = errorMessage ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
117
|
+
"div",
|
|
118
|
+
{
|
|
119
|
+
id: errorId,
|
|
120
|
+
className: "flex items-start gap-2 text-xs text-[rgb(var(--nc-accent-3))]",
|
|
121
|
+
role: "alert",
|
|
122
|
+
"aria-live": "polite",
|
|
123
|
+
children: [
|
|
124
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { className: "mt-0.5 h-4 w-4 shrink-0", viewBox: "0 0 20 20", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M10 2.5a.75.75 0 01.66.39l7.25 12.5a.75.75 0 01-.66 1.11H2.75a.75.75 0 01-.66-1.11l7.25-12.5A.75.75 0 0110 2.5zm0 4.25a.75.75 0 00-.75.75v4.5a.75.75 0 001.5 0v-4.5a.75.75 0 00-.75-.75zm0 9a1 1 0 100-2 1 1 0 000 2z" }) }),
|
|
125
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: errorMessage })
|
|
126
|
+
]
|
|
127
|
+
}
|
|
128
|
+
) : null;
|
|
129
|
+
const helpNode = helpText && !hasError ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { id: helpId, className: "text-xs text-[rgb(var(--nc-fg-muted))]", children: helpText }) : null;
|
|
130
|
+
const successNode = success && !hasError ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-start gap-2 text-xs text-[rgb(var(--nc-accent-2))]", children: [
|
|
131
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { className: "mt-0.5 h-4 w-4 shrink-0", viewBox: "0 0 20 20", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M7.5 10.75l2 2 4-4a.75.75 0 111.06 1.06l-4.53 4.53a.75.75 0 01-1.06 0L6.44 11.81a.75.75 0 011.06-1.06z" }) }),
|
|
132
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: success })
|
|
133
|
+
] }) : null;
|
|
91
134
|
const renderInput = () => {
|
|
92
135
|
if (type === "textarea") {
|
|
93
136
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
@@ -96,8 +139,9 @@ function CraftFormField({
|
|
|
96
139
|
id: name,
|
|
97
140
|
placeholder,
|
|
98
141
|
tone,
|
|
99
|
-
className:
|
|
142
|
+
className: resolvedInputClassName,
|
|
100
143
|
disabled,
|
|
144
|
+
"aria-describedby": ariaDescribedBy,
|
|
101
145
|
...fieldProps,
|
|
102
146
|
...register(name, rules)
|
|
103
147
|
}
|
|
@@ -109,9 +153,10 @@ function CraftFormField({
|
|
|
109
153
|
{
|
|
110
154
|
id: name,
|
|
111
155
|
tone,
|
|
112
|
-
className:
|
|
156
|
+
className: resolvedInputClassName,
|
|
113
157
|
multiple: type === "multiselect",
|
|
114
158
|
disabled,
|
|
159
|
+
"aria-describedby": ariaDescribedBy,
|
|
115
160
|
...fieldProps,
|
|
116
161
|
...register(name, rules),
|
|
117
162
|
children: [
|
|
@@ -137,6 +182,7 @@ function CraftFormField({
|
|
|
137
182
|
label,
|
|
138
183
|
description,
|
|
139
184
|
disabled,
|
|
185
|
+
"aria-describedby": ariaDescribedBy,
|
|
140
186
|
...fieldProps,
|
|
141
187
|
...register(name, rules)
|
|
142
188
|
}
|
|
@@ -149,6 +195,7 @@ function CraftFormField({
|
|
|
149
195
|
tone,
|
|
150
196
|
label,
|
|
151
197
|
disabled,
|
|
198
|
+
"aria-describedby": ariaDescribedBy,
|
|
152
199
|
...fieldProps,
|
|
153
200
|
...register(name, rules)
|
|
154
201
|
}
|
|
@@ -170,6 +217,7 @@ function CraftFormField({
|
|
|
170
217
|
onChange: field.onChange,
|
|
171
218
|
tone,
|
|
172
219
|
placeholder,
|
|
220
|
+
"aria-describedby": ariaDescribedBy,
|
|
173
221
|
...fieldProps
|
|
174
222
|
}
|
|
175
223
|
);
|
|
@@ -184,8 +232,9 @@ function CraftFormField({
|
|
|
184
232
|
id: name,
|
|
185
233
|
tone,
|
|
186
234
|
placeholder,
|
|
187
|
-
className:
|
|
235
|
+
className: resolvedInputClassName,
|
|
188
236
|
disabled,
|
|
237
|
+
"aria-describedby": ariaDescribedBy,
|
|
189
238
|
...fieldProps,
|
|
190
239
|
...register(name, rules)
|
|
191
240
|
}
|
|
@@ -198,8 +247,9 @@ function CraftFormField({
|
|
|
198
247
|
id: name,
|
|
199
248
|
tone,
|
|
200
249
|
placeholder,
|
|
201
|
-
className:
|
|
250
|
+
className: resolvedInputClassName,
|
|
202
251
|
disabled,
|
|
252
|
+
"aria-describedby": ariaDescribedBy,
|
|
203
253
|
...fieldProps,
|
|
204
254
|
...register(name, rules)
|
|
205
255
|
}
|
|
@@ -224,6 +274,7 @@ function CraftFormField({
|
|
|
224
274
|
value: option.value,
|
|
225
275
|
disabled: option.disabled || disabled,
|
|
226
276
|
className: "h-4 w-4 accent-[rgb(var(--nc-accent-1))]",
|
|
277
|
+
"aria-describedby": ariaDescribedBy,
|
|
227
278
|
...fieldProps,
|
|
228
279
|
...register(name, rules)
|
|
229
280
|
}
|
|
@@ -242,9 +293,10 @@ function CraftFormField({
|
|
|
242
293
|
type: "range",
|
|
243
294
|
className: (0, import_cn.cn)(
|
|
244
295
|
"w-full accent-[rgb(var(--nc-accent-1))]",
|
|
245
|
-
|
|
296
|
+
resolvedInputClassName
|
|
246
297
|
),
|
|
247
298
|
disabled,
|
|
299
|
+
"aria-describedby": ariaDescribedBy,
|
|
248
300
|
...fieldProps,
|
|
249
301
|
...register(name, rules)
|
|
250
302
|
}
|
|
@@ -260,9 +312,10 @@ function CraftFormField({
|
|
|
260
312
|
className: (0, import_cn.cn)(
|
|
261
313
|
baseInputClass,
|
|
262
314
|
"file:mr-4 file:rounded-xl file:border-0 file:bg-[rgb(var(--nc-surface)/0.35)] file:px-4 file:py-2 file:text-sm file:font-semibold file:text-[rgb(var(--nc-fg))]",
|
|
263
|
-
|
|
315
|
+
resolvedInputClassName
|
|
264
316
|
),
|
|
265
317
|
disabled,
|
|
318
|
+
"aria-describedby": ariaDescribedBy,
|
|
266
319
|
...fieldProps,
|
|
267
320
|
...register(name, rules)
|
|
268
321
|
}
|
|
@@ -276,8 +329,9 @@ function CraftFormField({
|
|
|
276
329
|
type: inputType,
|
|
277
330
|
placeholder,
|
|
278
331
|
tone,
|
|
279
|
-
className:
|
|
332
|
+
className: resolvedInputClassName,
|
|
280
333
|
disabled,
|
|
334
|
+
"aria-describedby": ariaDescribedBy,
|
|
281
335
|
...fieldProps,
|
|
282
336
|
...register(name, rules)
|
|
283
337
|
}
|
|
@@ -291,7 +345,9 @@ function CraftFormField({
|
|
|
291
345
|
showDescriptionAbove ? descriptionNode : null,
|
|
292
346
|
renderInput(),
|
|
293
347
|
showDescriptionBelow ? descriptionNode : null,
|
|
294
|
-
errorNode
|
|
348
|
+
errorNode,
|
|
349
|
+
helpNode,
|
|
350
|
+
successNode
|
|
295
351
|
] });
|
|
296
352
|
}
|
|
297
353
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/craft-form-field.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n Controller,\n type FieldValues,\n type Path,\n type RegisterOptions,\n useFormContext,\n} from \"react-hook-form\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\nimport { CraftInput } from \"@/components/craft-input\";\nimport { CraftTextarea } from \"@/components/craft-textarea\";\nimport { CraftSelect } from \"@/components/craft-select\";\nimport { CraftCheckbox } from \"@/components/craft-checkbox\";\nimport { CraftSwitch } from \"@/components/craft-switch\";\nimport { CraftDatePicker } from \"@/components/craft-date-picker\";\nimport { CraftNumberInput } from \"@/components/craft-number-input\";\nimport { CraftCurrencyInput } from \"@/components/craft-currency-input\";\n\nexport type CraftFormFieldOption = {\n label: React.ReactNode;\n value: string;\n disabled?: boolean;\n};\n\nexport type CraftFormFieldType =\n | \"text\"\n | \"number\"\n | \"password\"\n | \"textarea\"\n | \"select\"\n | \"checkbox\"\n | \"slider\"\n | \"date\"\n | \"color\"\n | \"email\"\n | \"tel\"\n | \"url\"\n | \"time\"\n | \"datetime-local\"\n | \"month\"\n | \"week\"\n | \"file\"\n | \"multifile\"\n | \"radio\"\n | \"switch\"\n | \"range\"\n | \"search\"\n | \"hidden\"\n | \"multiselect\"\n | \"currency\";\n\nexport type CraftFormFieldProps<TValues extends FieldValues = FieldValues> = {\n name: Path<TValues>;\n label?: React.ReactNode;\n description?: React.ReactNode;\n type?: CraftFormFieldType;\n options?: CraftFormFieldOption[];\n placeholder?: string;\n tone?: ThemeName;\n className?: string;\n inputClassName?: string;\n labelClassName?: string;\n descriptionClassName?: string;\n rules?: RegisterOptions<TValues>;\n disabled?: boolean;\n fieldProps?: Record<string, unknown>;\n};\n\nfunction getFieldError(errors: unknown, name: string) {\n if (!errors || typeof errors !== \"object\") return undefined;\n const segments = name.split(\".\");\n let current: unknown = errors;\n for (const segment of segments) {\n if (!current || typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[segment];\n }\n return current;\n}\n\nconst baseInputClass =\n \"w-full rounded-2xl border-2 bg-[rgb(var(--nc-surface)/0.08)] text-[rgb(var(--nc-fg))] backdrop-blur-xl shadow-[inset_0_2px_8px_rgba(0,0,0,0.3)] focus:outline-none focus:ring-4 transition-all duration-300 disabled:opacity-50 disabled:cursor-not-allowed border-[rgb(var(--nc-border)/0.35)] focus:border-[rgb(var(--nc-accent-1)/0.8)] focus:ring-[rgb(var(--nc-accent-1)/0.3)] px-5 py-3 text-base placeholder:text-[rgb(var(--nc-fg-soft))]\";\n\nexport function CraftFormField<TValues extends FieldValues = FieldValues>({\n name,\n label,\n description,\n type = \"text\",\n options = [],\n placeholder,\n tone,\n className,\n inputClassName,\n labelClassName,\n descriptionClassName,\n rules,\n disabled,\n fieldProps,\n}: CraftFormFieldProps<TValues>) {\n const { register, control, formState } = useFormContext<TValues>();\n const error = getFieldError(formState.errors, name);\n const errorMessage =\n typeof (error as { message?: unknown })?.message === \"string\"\n ? (error as { message: string }).message\n : undefined;\n\n if (type === \"hidden\") {\n return <input type=\"hidden\" {...register(name, rules)} />;\n }\n\n const labelNode = label ? (\n <label\n htmlFor={name}\n className={cn(\n \"text-sm font-semibold text-[rgb(var(--nc-fg))]\",\n labelClassName\n )}\n >\n {label}\n </label>\n ) : null;\n\n const descriptionNode = description ? (\n <p\n className={cn(\n \"text-xs text-[rgb(var(--nc-fg-muted))]\",\n descriptionClassName\n )}\n >\n {description}\n </p>\n ) : null;\n\n const errorNode = errorMessage ? (\n <p className=\"text-xs text-[rgb(var(--nc-accent-3))]\">{errorMessage}</p>\n ) : null;\n\n const renderInput = () => {\n if (type === \"textarea\") {\n return (\n <CraftTextarea\n id={name}\n placeholder={placeholder}\n tone={tone}\n className={inputClassName}\n disabled={disabled}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n />\n );\n }\n\n if (type === \"select\" || type === \"multiselect\") {\n return (\n <CraftSelect\n id={name}\n tone={tone}\n className={inputClassName}\n multiple={type === \"multiselect\"}\n disabled={disabled}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {options.map((option) => (\n <option\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n >\n {option.label}\n </option>\n ))}\n </CraftSelect>\n );\n }\n\n if (type === \"checkbox\") {\n return (\n <CraftCheckbox\n tone={tone}\n label={label}\n description={description}\n disabled={disabled}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n />\n );\n }\n\n if (type === \"switch\") {\n return (\n <CraftSwitch\n tone={tone}\n label={label}\n disabled={disabled}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n />\n );\n }\n\n if (type === \"date\") {\n return (\n <Controller\n control={control}\n name={name}\n rules={rules}\n render={({ field }) => (\n <CraftDatePicker\n value={field.value ?? \"\"}\n onChange={field.onChange}\n tone={tone}\n placeholder={placeholder}\n {...(fieldProps as Record<string, unknown>)}\n />\n )}\n />\n );\n }\n\n if (type === \"number\") {\n return (\n <CraftNumberInput\n id={name}\n tone={tone}\n placeholder={placeholder}\n className={inputClassName}\n disabled={disabled}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n />\n );\n }\n\n if (type === \"currency\") {\n return (\n <CraftCurrencyInput\n id={name}\n tone={tone}\n placeholder={placeholder}\n className={inputClassName}\n disabled={disabled}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n />\n );\n }\n\n if (type === \"radio\") {\n return (\n <div className=\"grid gap-3\">\n {options.map((option) => (\n <label\n key={option.value}\n className={cn(\n \"flex items-center gap-3 rounded-2xl border border-[rgb(var(--nc-border)/0.35)] bg-[rgb(var(--nc-surface)/0.08)] px-4 py-3 text-sm text-[rgb(var(--nc-fg))]\",\n \"transition-all duration-200\",\n \"focus-within:ring-2 focus-within:ring-[rgb(var(--nc-accent-1)/0.5)]\",\n option.disabled ? \"opacity-60\" : \"cursor-pointer\"\n )}\n data-nc-theme={tone}\n >\n <input\n type=\"radio\"\n value={option.value}\n disabled={option.disabled || disabled}\n className=\"h-4 w-4 accent-[rgb(var(--nc-accent-1))]\"\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n />\n <span>{option.label}</span>\n </label>\n ))}\n </div>\n );\n }\n\n if (type === \"range\" || type === \"slider\") {\n return (\n <input\n id={name}\n type=\"range\"\n className={cn(\n \"w-full accent-[rgb(var(--nc-accent-1))]\",\n inputClassName\n )}\n disabled={disabled}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n />\n );\n }\n\n if (type === \"file\" || type === \"multifile\") {\n return (\n <input\n id={name}\n type=\"file\"\n multiple={type === \"multifile\"}\n className={cn(\n baseInputClass,\n \"file:mr-4 file:rounded-xl file:border-0 file:bg-[rgb(var(--nc-surface)/0.35)] file:px-4 file:py-2 file:text-sm file:font-semibold file:text-[rgb(var(--nc-fg))]\",\n inputClassName\n )}\n disabled={disabled}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n />\n );\n }\n\n const inputType =\n type === \"search\" ||\n type === \"password\" ||\n type === \"email\" ||\n type === \"tel\" ||\n type === \"url\" ||\n type === \"time\" ||\n type === \"datetime-local\" ||\n type === \"month\" ||\n type === \"week\" ||\n type === \"color\"\n ? type\n : \"text\";\n\n return (\n <CraftInput\n id={name}\n type={inputType}\n placeholder={placeholder}\n tone={tone}\n className={inputClassName}\n disabled={disabled}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n />\n );\n };\n\n const showLabel = type !== \"checkbox\" && type !== \"switch\";\n const showDescriptionAbove = type !== \"checkbox\" && type !== \"switch\";\n const showDescriptionBelow = type === \"switch\";\n\n return (\n <div className={cn(\"space-y-2\", className)} data-nc-theme={tone}>\n {showLabel ? labelNode : null}\n {showDescriptionAbove ? descriptionNode : null}\n {renderInput()}\n {showDescriptionBelow ? descriptionNode : null}\n {errorNode}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/craft-form-field.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n Controller,\n type FieldValues,\n type Path,\n type RegisterOptions,\n useFormContext,\n} from \"react-hook-form\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\nimport { CraftInput } from \"@/components/craft-input\";\nimport { CraftTextarea } from \"@/components/craft-textarea\";\nimport { CraftSelect } from \"@/components/craft-select\";\nimport { CraftCheckbox } from \"@/components/craft-checkbox\";\nimport { CraftSwitch } from \"@/components/craft-switch\";\nimport { CraftDatePicker } from \"@/components/craft-date-picker\";\nimport { CraftNumberInput } from \"@/components/craft-number-input\";\nimport { CraftCurrencyInput } from \"@/components/craft-currency-input\";\n\nexport type CraftFormFieldOption = {\n label: React.ReactNode;\n value: string;\n disabled?: boolean;\n};\n\nexport type CraftFormFieldType =\n | \"text\"\n | \"number\"\n | \"password\"\n | \"textarea\"\n | \"select\"\n | \"checkbox\"\n | \"slider\"\n | \"date\"\n | \"color\"\n | \"email\"\n | \"tel\"\n | \"url\"\n | \"time\"\n | \"datetime-local\"\n | \"month\"\n | \"week\"\n | \"file\"\n | \"multifile\"\n | \"radio\"\n | \"switch\"\n | \"range\"\n | \"search\"\n | \"hidden\"\n | \"multiselect\"\n | \"currency\";\n\nexport type CraftFormFieldProps<TValues extends FieldValues = FieldValues> = {\n name: Path<TValues>;\n label?: React.ReactNode;\n description?: React.ReactNode;\n helpText?: React.ReactNode;\n success?: React.ReactNode;\n required?: boolean;\n type?: CraftFormFieldType;\n options?: CraftFormFieldOption[];\n placeholder?: string;\n tone?: ThemeName;\n className?: string;\n inputClassName?: string;\n labelClassName?: string;\n descriptionClassName?: string;\n rules?: RegisterOptions<TValues>;\n disabled?: boolean;\n fieldProps?: Record<string, unknown>;\n};\n\nfunction getFieldError(errors: unknown, name: string) {\n if (!errors || typeof errors !== \"object\") return undefined;\n const segments = name.split(\".\");\n let current: unknown = errors;\n for (const segment of segments) {\n if (!current || typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[segment];\n }\n return current;\n}\n\nconst baseInputClass =\n \"w-full rounded-2xl border-2 bg-[rgb(var(--nc-surface)/0.08)] text-[rgb(var(--nc-fg))] backdrop-blur-xl shadow-[inset_0_2px_8px_rgba(0,0,0,0.3)] focus:outline-none focus:ring-4 transition-all duration-300 disabled:opacity-50 disabled:cursor-not-allowed border-[rgb(var(--nc-border)/0.35)] focus:border-[rgb(var(--nc-accent-1)/0.8)] focus:ring-[rgb(var(--nc-accent-1)/0.3)] px-5 py-3 text-base placeholder:text-[rgb(var(--nc-fg-soft))]\";\n\nexport function CraftFormField<TValues extends FieldValues = FieldValues>({\n name,\n label,\n description,\n helpText,\n success,\n required,\n type = \"text\",\n options = [],\n placeholder,\n tone,\n className,\n inputClassName,\n labelClassName,\n descriptionClassName,\n rules,\n disabled,\n fieldProps,\n}: CraftFormFieldProps<TValues>) {\n const { register, control, formState } = useFormContext<TValues>();\n const error = getFieldError(formState.errors, name);\n const fieldId = React.useId();\n const errorId = `${fieldId}-error`;\n const helpId = `${fieldId}-help`;\n const errorMessage =\n typeof (error as { message?: unknown })?.message === \"string\"\n ? (error as { message: string }).message\n : undefined;\n const hasError = Boolean(errorMessage);\n const resolvedInputClassName = cn(\n inputClassName,\n hasError\n ? \"border-[rgb(var(--nc-accent-3))] focus:border-[rgb(var(--nc-accent-3))] focus:ring-[rgb(var(--nc-accent-3)/0.35)]\"\n : null\n );\n const ariaDescribedBy = hasError\n ? errorId\n : helpText\n ? helpId\n : undefined;\n\n if (type === \"hidden\") {\n return <input type=\"hidden\" {...register(name, rules)} />;\n }\n\n const labelNode = label ? (\n <label\n htmlFor={name}\n className={cn(\n \"text-sm font-semibold text-[rgb(var(--nc-fg))]\",\n labelClassName\n )}\n >\n {label}\n {required ? (\n <span className=\"ml-1 text-[rgb(var(--nc-accent-3))]\" aria-label=\"required\">\n *\n </span>\n ) : null}\n </label>\n ) : null;\n\n const descriptionNode = description ? (\n <p\n className={cn(\n \"text-xs text-[rgb(var(--nc-fg-muted))]\",\n descriptionClassName\n )}\n >\n {description}\n </p>\n ) : null;\n\n const errorNode = errorMessage ? (\n <div\n id={errorId}\n className=\"flex items-start gap-2 text-xs text-[rgb(var(--nc-accent-3))]\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n <svg className=\"mt-0.5 h-4 w-4 shrink-0\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M10 2.5a.75.75 0 01.66.39l7.25 12.5a.75.75 0 01-.66 1.11H2.75a.75.75 0 01-.66-1.11l7.25-12.5A.75.75 0 0110 2.5zm0 4.25a.75.75 0 00-.75.75v4.5a.75.75 0 001.5 0v-4.5a.75.75 0 00-.75-.75zm0 9a1 1 0 100-2 1 1 0 000 2z\" />\n </svg>\n <span>{errorMessage}</span>\n </div>\n ) : null;\n\n const helpNode = helpText && !hasError ? (\n <p id={helpId} className=\"text-xs text-[rgb(var(--nc-fg-muted))]\">\n {helpText}\n </p>\n ) : null;\n\n const successNode = success && !hasError ? (\n <div className=\"flex items-start gap-2 text-xs text-[rgb(var(--nc-accent-2))]\">\n <svg className=\"mt-0.5 h-4 w-4 shrink-0\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M7.5 10.75l2 2 4-4a.75.75 0 111.06 1.06l-4.53 4.53a.75.75 0 01-1.06 0L6.44 11.81a.75.75 0 011.06-1.06z\" />\n </svg>\n <span>{success}</span>\n </div>\n ) : null;\n\n const renderInput = () => {\n if (type === \"textarea\") {\n return (\n <CraftTextarea\n id={name}\n placeholder={placeholder}\n tone={tone}\n className={resolvedInputClassName}\n disabled={disabled}\n aria-describedby={ariaDescribedBy}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n />\n );\n }\n\n if (type === \"select\" || type === \"multiselect\") {\n return (\n <CraftSelect\n id={name}\n tone={tone}\n className={resolvedInputClassName}\n multiple={type === \"multiselect\"}\n disabled={disabled}\n aria-describedby={ariaDescribedBy}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {options.map((option) => (\n <option\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n >\n {option.label}\n </option>\n ))}\n </CraftSelect>\n );\n }\n\n if (type === \"checkbox\") {\n return (\n <CraftCheckbox\n tone={tone}\n label={label}\n description={description}\n disabled={disabled}\n aria-describedby={ariaDescribedBy}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n />\n );\n }\n\n if (type === \"switch\") {\n return (\n <CraftSwitch\n tone={tone}\n label={label}\n disabled={disabled}\n aria-describedby={ariaDescribedBy}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n />\n );\n }\n\n if (type === \"date\") {\n return (\n <Controller\n control={control}\n name={name}\n rules={rules}\n render={({ field }) => (\n <CraftDatePicker\n value={field.value ?? \"\"}\n onChange={field.onChange}\n tone={tone}\n placeholder={placeholder}\n aria-describedby={ariaDescribedBy}\n {...(fieldProps as Record<string, unknown>)}\n />\n )}\n />\n );\n }\n\n if (type === \"number\") {\n return (\n <CraftNumberInput\n id={name}\n tone={tone}\n placeholder={placeholder}\n className={resolvedInputClassName}\n disabled={disabled}\n aria-describedby={ariaDescribedBy}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n />\n );\n }\n\n if (type === \"currency\") {\n return (\n <CraftCurrencyInput\n id={name}\n tone={tone}\n placeholder={placeholder}\n className={resolvedInputClassName}\n disabled={disabled}\n aria-describedby={ariaDescribedBy}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n />\n );\n }\n\n if (type === \"radio\") {\n return (\n <div className=\"grid gap-3\">\n {options.map((option) => (\n <label\n key={option.value}\n className={cn(\n \"flex items-center gap-3 rounded-2xl border border-[rgb(var(--nc-border)/0.35)] bg-[rgb(var(--nc-surface)/0.08)] px-4 py-3 text-sm text-[rgb(var(--nc-fg))]\",\n \"transition-all duration-200\",\n \"focus-within:ring-2 focus-within:ring-[rgb(var(--nc-accent-1)/0.5)]\",\n option.disabled ? \"opacity-60\" : \"cursor-pointer\"\n )}\n data-nc-theme={tone}\n >\n <input\n type=\"radio\"\n value={option.value}\n disabled={option.disabled || disabled}\n className=\"h-4 w-4 accent-[rgb(var(--nc-accent-1))]\"\n aria-describedby={ariaDescribedBy}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n />\n <span>{option.label}</span>\n </label>\n ))}\n </div>\n );\n }\n\n if (type === \"range\" || type === \"slider\") {\n return (\n <input\n id={name}\n type=\"range\"\n className={cn(\n \"w-full accent-[rgb(var(--nc-accent-1))]\",\n resolvedInputClassName\n )}\n disabled={disabled}\n aria-describedby={ariaDescribedBy}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n />\n );\n }\n\n if (type === \"file\" || type === \"multifile\") {\n return (\n <input\n id={name}\n type=\"file\"\n multiple={type === \"multifile\"}\n className={cn(\n baseInputClass,\n \"file:mr-4 file:rounded-xl file:border-0 file:bg-[rgb(var(--nc-surface)/0.35)] file:px-4 file:py-2 file:text-sm file:font-semibold file:text-[rgb(var(--nc-fg))]\",\n resolvedInputClassName\n )}\n disabled={disabled}\n aria-describedby={ariaDescribedBy}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n />\n );\n }\n\n const inputType =\n type === \"search\" ||\n type === \"password\" ||\n type === \"email\" ||\n type === \"tel\" ||\n type === \"url\" ||\n type === \"time\" ||\n type === \"datetime-local\" ||\n type === \"month\" ||\n type === \"week\" ||\n type === \"color\"\n ? type\n : \"text\";\n\n return (\n <CraftInput\n id={name}\n type={inputType}\n placeholder={placeholder}\n tone={tone}\n className={resolvedInputClassName}\n disabled={disabled}\n aria-describedby={ariaDescribedBy}\n {...(fieldProps as Record<string, unknown>)}\n {...register(name, rules)}\n />\n );\n };\n\n const showLabel = type !== \"checkbox\" && type !== \"switch\";\n const showDescriptionAbove = type !== \"checkbox\" && type !== \"switch\";\n const showDescriptionBelow = type === \"switch\";\n\n return (\n <div className={cn(\"space-y-2\", className)} data-nc-theme={tone}>\n {showLabel ? labelNode : null}\n {showDescriptionAbove ? descriptionNode : null}\n {renderInput()}\n {showDescriptionBelow ? descriptionNode : null}\n {errorNode}\n {helpNode}\n {successNode}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -13,6 +13,9 @@ type CraftFormFieldProps<TValues extends FieldValues = FieldValues> = {
|
|
|
13
13
|
name: Path<TValues>;
|
|
14
14
|
label?: React.ReactNode;
|
|
15
15
|
description?: React.ReactNode;
|
|
16
|
+
helpText?: React.ReactNode;
|
|
17
|
+
success?: React.ReactNode;
|
|
18
|
+
required?: boolean;
|
|
16
19
|
type?: CraftFormFieldType;
|
|
17
20
|
options?: CraftFormFieldOption[];
|
|
18
21
|
placeholder?: string;
|
|
@@ -25,6 +28,6 @@ type CraftFormFieldProps<TValues extends FieldValues = FieldValues> = {
|
|
|
25
28
|
disabled?: boolean;
|
|
26
29
|
fieldProps?: Record<string, unknown>;
|
|
27
30
|
};
|
|
28
|
-
declare function CraftFormField<TValues extends FieldValues = FieldValues>({ name, label, description, type, options, placeholder, tone, className, inputClassName, labelClassName, descriptionClassName, rules, disabled, fieldProps, }: CraftFormFieldProps<TValues>): react_jsx_runtime.JSX.Element;
|
|
31
|
+
declare function CraftFormField<TValues extends FieldValues = FieldValues>({ name, label, description, helpText, success, required, type, options, placeholder, tone, className, inputClassName, labelClassName, descriptionClassName, rules, disabled, fieldProps, }: CraftFormFieldProps<TValues>): react_jsx_runtime.JSX.Element;
|
|
29
32
|
|
|
30
33
|
export { CraftFormField, type CraftFormFieldOption, type CraftFormFieldProps, type CraftFormFieldType };
|
|
@@ -13,6 +13,9 @@ type CraftFormFieldProps<TValues extends FieldValues = FieldValues> = {
|
|
|
13
13
|
name: Path<TValues>;
|
|
14
14
|
label?: React.ReactNode;
|
|
15
15
|
description?: React.ReactNode;
|
|
16
|
+
helpText?: React.ReactNode;
|
|
17
|
+
success?: React.ReactNode;
|
|
18
|
+
required?: boolean;
|
|
16
19
|
type?: CraftFormFieldType;
|
|
17
20
|
options?: CraftFormFieldOption[];
|
|
18
21
|
placeholder?: string;
|
|
@@ -25,6 +28,6 @@ type CraftFormFieldProps<TValues extends FieldValues = FieldValues> = {
|
|
|
25
28
|
disabled?: boolean;
|
|
26
29
|
fieldProps?: Record<string, unknown>;
|
|
27
30
|
};
|
|
28
|
-
declare function CraftFormField<TValues extends FieldValues = FieldValues>({ name, label, description, type, options, placeholder, tone, className, inputClassName, labelClassName, descriptionClassName, rules, disabled, fieldProps, }: CraftFormFieldProps<TValues>): react_jsx_runtime.JSX.Element;
|
|
31
|
+
declare function CraftFormField<TValues extends FieldValues = FieldValues>({ name, label, description, helpText, success, required, type, options, placeholder, tone, className, inputClassName, labelClassName, descriptionClassName, rules, disabled, fieldProps, }: CraftFormFieldProps<TValues>): react_jsx_runtime.JSX.Element;
|
|
29
32
|
|
|
30
33
|
export { CraftFormField, type CraftFormFieldOption, type CraftFormFieldProps, type CraftFormFieldType };
|