koddiv-dyn-table 0.1.2

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dyn-table.umd.cjs","sources":["../src/components/Table/utils.ts","../src/components/Table/valueFormats.ts","../src/components/TableFormatters/TableFormatters.tsx","../src/components/Table/Table.tsx"],"sourcesContent":["import type { ColumnDef } from './Table.types';\r\n\r\n/** Genişlik değerini px sayısına çevirir (number veya \"100px\" / \"100\") */\r\nexport function parseWidth(w: string | number | undefined): number | undefined {\r\n if (w == null) return undefined;\r\n if (typeof w === 'number') return w;\r\n const n = parseFloat(w);\r\n return Number.isNaN(n) ? undefined : n;\r\n}\r\n\r\nexport function getCellValue<T>(row: T, column: ColumnDef<T>): unknown {\r\n if (column.valueGetter) return column.valueGetter(row);\r\n if (column.accessorKey === undefined) return undefined;\r\n const key = column.accessorKey as keyof T;\r\n return row[key];\r\n}\r\n","import type { ValueFormatType, ValueFormatOptions } from './Table.types';\r\n\r\nconst defaultLocale = 'tr-TR';\r\n\r\nfunction toDate(value: unknown): Date | null {\r\n if (value == null) return null;\r\n if (value instanceof Date) return value;\r\n const n = typeof value === 'number' ? value : Number(value);\r\n if (!Number.isNaN(n)) return new Date(n);\r\n const s = String(value).trim();\r\n if (!s) return null;\r\n const d = new Date(s);\r\n return Number.isNaN(d.getTime()) ? null : d;\r\n}\r\n\r\nexport function applyValueFormat(\r\n value: unknown,\r\n format: ValueFormatType,\r\n options: ValueFormatOptions = {}\r\n): string {\r\n const locale = options.locale ?? defaultLocale;\r\n\r\n switch (format) {\r\n case 'date': {\r\n const d = toDate(value);\r\n if (!d) return value != null ? String(value) : '—';\r\n if (options.dateStyle != null) {\r\n return d.toLocaleDateString(locale, { dateStyle: options.dateStyle });\r\n }\r\n return d.toLocaleDateString(locale, {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n });\r\n }\r\n case 'datetime': {\r\n const d = toDate(value);\r\n if (!d) return value != null ? String(value) : '—';\r\n return d.toLocaleString(locale, {\r\n dateStyle: options.dateStyle ?? 'short',\r\n timeStyle: options.timeStyle ?? 'short',\r\n });\r\n }\r\n case 'time': {\r\n const d = toDate(value);\r\n if (!d) return value != null ? String(value) : '—';\r\n return d.toLocaleTimeString(locale, {\r\n timeStyle: options.timeStyle ?? 'short',\r\n });\r\n }\r\n case 'number': {\r\n const n = typeof value === 'number' ? value : Number(value);\r\n if (Number.isNaN(n)) return value != null ? String(value) : '—';\r\n return n.toLocaleString(locale, {\r\n minimumFractionDigits: options.minimumFractionDigits,\r\n maximumFractionDigits: options.maximumFractionDigits ?? 2,\r\n });\r\n }\r\n case 'currency': {\r\n const n = typeof value === 'number' ? value : Number(value);\r\n if (Number.isNaN(n)) return value != null ? String(value) : '—';\r\n return n.toLocaleString(locale, {\r\n style: 'currency',\r\n currency: options.currency ?? 'TRY',\r\n minimumFractionDigits: options.minimumFractionDigits,\r\n maximumFractionDigits: options.maximumFractionDigits ?? 2,\r\n });\r\n }\r\n case 'percent': {\r\n const n = typeof value === 'number' ? value : Number(value);\r\n if (Number.isNaN(n)) return value != null ? String(value) : '—';\r\n return n.toLocaleString(locale, {\r\n style: 'percent',\r\n minimumFractionDigits: options.minimumFractionDigits,\r\n maximumFractionDigits: options.maximumFractionDigits ?? 2,\r\n });\r\n }\r\n default:\r\n return value != null ? String(value) : '—';\r\n }\r\n}\r\n","import type { ReactNode } from 'react';\r\nimport type { CellFormatType, CellFormatOptions } from '../Table/Table.types';\r\nimport './TableFormatters.css';\r\n\r\n/**\r\n * Varsayılan etiketler — cellFormat tipine göre true/false metinleri.\r\n * cellFormatOptions ile activeLabel / inactiveLabel verilerek override edilebilir.\r\n */\r\nconst DEFAULT_LABELS: Record<CellFormatType, { active: string; inactive: string }> = {\r\n status: { active: 'Aktif', inactive: 'Pasif' },\r\n yesNo: { active: 'Evet', inactive: 'Hayır' },\r\n onOff: { active: 'Açık', inactive: 'Kapalı' },\r\n published: { active: 'Yayında', inactive: 'Taslak' },\r\n approved: { active: 'Onaylı', inactive: 'Beklemede' },\r\n badge: { active: 'Evet', inactive: 'Hayır' }, // özel için cellFormatOptions zorunlu önerilir\r\n};\r\n\r\nexport interface StatusBadgeProps {\r\n value: unknown;\r\n activeLabel?: string;\r\n inactiveLabel?: string;\r\n activeClass?: string;\r\n inactiveClass?: string;\r\n}\r\n\r\nconst defaultActiveClass = 'table-formatter-status table-formatter-status--active';\r\nconst defaultInactiveClass = 'table-formatter-status table-formatter-status--inactive';\r\n\r\nexport function StatusBadge({\r\n value,\r\n activeLabel = 'Aktif',\r\n inactiveLabel = 'Pasif',\r\n activeClass = defaultActiveClass,\r\n inactiveClass = defaultInactiveClass,\r\n}: StatusBadgeProps) {\r\n const isActive = value === true || value === 'true' || value === 1;\r\n const label = isActive ? activeLabel : inactiveLabel;\r\n const className = isActive ? activeClass : inactiveClass;\r\n return <span className={className}>{label}</span>;\r\n}\r\n\r\nfunction getLabelsForFormat(formatType: CellFormatType, options: CellFormatOptions) {\r\n const defaults = DEFAULT_LABELS[formatType];\r\n return {\r\n activeLabel: options.activeLabel ?? defaults.active,\r\n inactiveLabel: options.inactiveLabel ?? defaults.inactive,\r\n };\r\n}\r\n\r\nexport function renderCellFormat(\r\n formatType: CellFormatType,\r\n value: unknown,\r\n _row: unknown,\r\n options: CellFormatOptions = {}\r\n): ReactNode {\r\n const { activeLabel, inactiveLabel } = getLabelsForFormat(formatType, options);\r\n return (\r\n <StatusBadge\r\n value={value}\r\n activeLabel={activeLabel}\r\n inactiveLabel={inactiveLabel}\r\n activeClass={options.activeClass}\r\n inactiveClass={options.inactiveClass}\r\n />\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport type { TableProps, ColumnDef } from './Table.types';\r\nimport { getCellValue, parseWidth } from './utils';\r\nimport { applyValueFormat } from './valueFormats';\r\nimport { renderCellFormat } from '../TableFormatters';\r\nimport './Table.css';\r\n\r\nconst DEFAULT_PAGE_SIZE_OPTIONS = [10, 25, 50, 100];\r\nconst DEFAULT_MIN_WIDTH = 50;\r\nconst DEFAULT_FLEX_MIN = 80;\r\n\r\n/** Kolon için mutlaka korunacak minimum genişlik (px); flex/resizable olsa da altına inmez */\r\nfunction getMinWidthForColumn<T>(col: ColumnDef<T>): number {\r\n return parseWidth(col.minWidth) ?? (col.flex ? DEFAULT_FLEX_MIN : DEFAULT_MIN_WIDTH);\r\n}\r\n\r\ninterface ResizeHandleProps {\r\n colId: string;\r\n minWidth: number;\r\n maxWidth: number | undefined;\r\n startWidth: number;\r\n onResize: (width: number) => void;\r\n}\r\n\r\nfunction ResizeHandle({\r\n colId,\r\n minWidth,\r\n maxWidth,\r\n startWidth,\r\n onResize,\r\n}: ResizeHandleProps) {\r\n const handleRef = React.useRef<HTMLDivElement>(null);\r\n const onResizeRef = React.useRef(onResize);\r\n onResizeRef.current = onResize;\r\n\r\n React.useEffect(() => {\r\n const el = handleRef.current;\r\n if (!el) return;\r\n let startX = 0;\r\n let startW = 0;\r\n const onMouseDown = (e: MouseEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n startX = e.clientX;\r\n startW = startWidth;\r\n document.body.classList.add('dyn-table-resizing');\r\n const onMouseMove = (e2: MouseEvent) => {\r\n const delta = e2.clientX - startX;\r\n let w = Math.max(minWidth, startW + delta);\r\n if (maxWidth != null) w = Math.min(maxWidth, w);\r\n onResizeRef.current(w);\r\n };\r\n const onMouseUp = () => {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n document.body.classList.remove('dyn-table-resizing');\r\n };\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n };\r\n el.addEventListener('mousedown', onMouseDown);\r\n return () => el.removeEventListener('mousedown', onMouseDown);\r\n }, [colId, minWidth, maxWidth, startWidth]);\r\n\r\n return (\r\n <div\r\n ref={handleRef}\r\n className=\"dyn-table-resize-handle\"\r\n role=\"separator\"\r\n aria-label={`${colId} kolon genişliğini değiştir`}\r\n />\r\n );\r\n}\r\n\r\nconst SELECTION_COLUMN_WIDTH = 44;\r\n\r\ninterface SelectionHeaderCheckboxProps<T> {\r\n displayData: T[];\r\n getRowKey: (row: T) => string | number;\r\n selectedSet: Set<string | number>;\r\n onToggleAll: () => void;\r\n}\r\n\r\nfunction SelectionHeaderCheckbox<T>({\r\n displayData,\r\n getRowKey,\r\n selectedSet,\r\n onToggleAll,\r\n}: SelectionHeaderCheckboxProps<T>) {\r\n const inputRef = React.useRef<HTMLInputElement>(null);\r\n const pageKeys = displayData.map((r) => getRowKey(r) as string | number);\r\n const allChecked = pageKeys.length > 0 && pageKeys.every((k) => selectedSet.has(k));\r\n const someChecked = pageKeys.some((k) => selectedSet.has(k));\r\n const indeterminate = someChecked && !allChecked;\r\n\r\n React.useEffect(() => {\r\n if (inputRef.current) inputRef.current.indeterminate = indeterminate;\r\n }, [indeterminate]);\r\n\r\n return (\r\n <label className=\"dyn-table-selection-header\">\r\n <input\r\n ref={inputRef}\r\n type=\"checkbox\"\r\n checked={allChecked}\r\n onChange={onToggleAll}\r\n aria-label=\"Tümünü seç\"\r\n />\r\n </label>\r\n );\r\n}\r\n\r\nfunction getComputedWidths<T>(\r\n columns: ColumnDef<T>[],\r\n tableWidth: number,\r\n columnWidths: Record<string, number>,\r\n actionsWidthPx: number,\r\n selectionWidthPx: number\r\n): number[] {\r\n const hasFlex = columns.some((c) => (c.flex ?? 0) > 0);\r\n const flexCols = columns.filter((c) => (c.flex ?? 0) > 0);\r\n const flexTotal = flexCols.reduce((s, c) => s + (c.flex ?? 0), 0);\r\n\r\n const fixedWidths: number[] = [];\r\n let fixedSum = 0;\r\n for (const col of columns) {\r\n const minPx = parseWidth(col.minWidth) ?? (col.flex ? DEFAULT_FLEX_MIN : DEFAULT_MIN_WIDTH);\r\n const maxPx = parseWidth(col.maxWidth);\r\n if (col.flex) {\r\n const override = columnWidths[col.id];\r\n if (override != null) {\r\n fixedWidths.push(Math.max(minPx, maxPx != null ? Math.min(override, maxPx) : override));\r\n fixedSum += fixedWidths[fixedWidths.length - 1];\r\n } else {\r\n fixedWidths.push(-1);\r\n }\r\n } else {\r\n const w =\r\n columnWidths[col.id] ??\r\n parseWidth(col.width) ??\r\n minPx;\r\n fixedWidths.push(maxPx != null ? Math.min(w, maxPx) : Math.max(minPx, w));\r\n fixedSum += fixedWidths[fixedWidths.length - 1];\r\n }\r\n }\r\n\r\n if (!hasFlex || tableWidth <= 0 || flexTotal <= 0) {\r\n return fixedWidths.map((w) => (w === -1 ? DEFAULT_FLEX_MIN : w));\r\n }\r\n\r\n const remaining = tableWidth - fixedSum - actionsWidthPx - selectionWidthPx;\r\n if (remaining <= 0) {\r\n return fixedWidths.map((w) => (w === -1 ? DEFAULT_FLEX_MIN : w));\r\n }\r\n\r\n const result = [...fixedWidths];\r\n let distributed = 0;\r\n for (let i = 0; i < columns.length; i++) {\r\n if (result[i] !== -1) continue;\r\n const col = columns[i];\r\n const minPx = parseWidth(col.minWidth) ?? DEFAULT_FLEX_MIN;\r\n const maxPx = parseWidth(col.maxWidth);\r\n const flex = col.flex ?? 0;\r\n const raw = (flex / flexTotal) * remaining;\r\n const clamped = maxPx != null ? Math.min(raw, maxPx) : raw;\r\n result[i] = Math.max(minPx, clamped);\r\n distributed += result[i];\r\n }\r\n return result;\r\n}\r\n\r\nexport function Table<T>({\r\n data,\r\n columns,\r\n keyExtractor: keyExtractorProp,\r\n keyColumnId,\r\n sortable = true,\r\n defaultSort = { id: '', direction: null },\r\n onSort,\r\n emptyMessage = 'Veri yok',\r\n theme = 'light',\r\n className = '',\r\n headerClassName = '',\r\n bodyClassName = '',\r\n rowClassName,\r\n actions,\r\n actionsHeader = 'İşlemler',\r\n actionsAlign = 'center',\r\n actionsWidth,\r\n pagination = false,\r\n pageSize: pageSizeProp = 10,\r\n pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS,\r\n page: pageProp,\r\n defaultPage = 1,\r\n onPageChange,\r\n totalCount: totalCountProp,\r\n onBlockNeeded,\r\n blockSize: _blockSize,\r\n minHeight,\r\n height,\r\n mobileBreakpoint = 768,\r\n rowSelection = false,\r\n selectedRowKeys: selectedRowKeysProp,\r\n defaultSelectedRowKeys = [],\r\n onSelectionChange,\r\n selectionToolbarLabel,\r\n filterable = false,\r\n filterModel: filterModelProp,\r\n defaultFilterModel = {},\r\n onFilterChange,\r\n filterPanelWidth = 280,\r\n virtualization = false,\r\n rowHeight = 44,\r\n virtualizationOverscan = 5,\r\n columnVisibility: columnVisibilityProp,\r\n onColumnVisibilityChange,\r\n columnOrder: columnOrderProp,\r\n onColumnOrderChange,\r\n columnReorder = true,\r\n loading = false,\r\n stickyHeader = false,\r\n}: TableProps<T>) {\r\n const getRowKey = React.useCallback(\r\n (row: T, index?: number): string | number => {\r\n if (keyExtractorProp) return keyExtractorProp(row);\r\n if (keyColumnId) {\r\n const col = columns.find((c) => c.id === keyColumnId);\r\n if (col) return getCellValue(row, col) as string | number;\r\n }\r\n return String(index ?? 0);\r\n },\r\n [keyExtractorProp, keyColumnId, columns]\r\n );\r\n\r\n const scrollRef = React.useRef<HTMLDivElement>(null);\r\n const [tableWidth, setTableWidth] = React.useState(0);\r\n const [scrollContainerHeight, setScrollContainerHeight] = React.useState(0);\r\n const [scrollTop, setScrollTop] = React.useState(0);\r\n const [columnWidths, setColumnWidths] = React.useState<Record<string, number>>({});\r\n\r\n React.useEffect(() => {\r\n const el = scrollRef.current;\r\n if (!el) return;\r\n const update = () => {\r\n setTableWidth(el.clientWidth);\r\n setScrollContainerHeight(el.clientHeight);\r\n };\r\n const ro = new ResizeObserver(update);\r\n ro.observe(el);\r\n update();\r\n return () => ro.disconnect();\r\n }, []);\r\n\r\n const [isMobile, setIsMobile] = React.useState(false);\r\n React.useEffect(() => {\r\n const mq = window.matchMedia(`(max-width: ${mobileBreakpoint}px)`);\r\n setIsMobile(mq.matches);\r\n const fn = () => setIsMobile(mq.matches);\r\n mq.addEventListener('change', fn);\r\n return () => mq.removeEventListener('change', fn);\r\n }, [mobileBreakpoint]);\r\n\r\n const [sortState, setSortState] = React.useState(defaultSort);\r\n const [internalPage, setInternalPage] = React.useState(defaultPage);\r\n const [pageSize, setPageSize] = React.useState(pageSizeProp);\r\n React.useEffect(() => {\r\n setPageSize(pageSizeProp);\r\n }, [pageSizeProp]);\r\n\r\n const isVisibilityControlled = columnVisibilityProp != null;\r\n const [internalVisibility, setInternalVisibility] = React.useState<Record<string, boolean>>(\r\n () => columns.reduce<Record<string, boolean>>((acc, c) => ({ ...acc, [c.id]: !c.hide }), {})\r\n );\r\n React.useEffect(() => {\r\n if (isVisibilityControlled) return;\r\n setInternalVisibility((prev) => {\r\n const next = { ...prev };\r\n for (const c of columns) {\r\n if (next[c.id] === undefined) next[c.id] = !c.hide;\r\n }\r\n return next;\r\n });\r\n }, [columns, isVisibilityControlled]);\r\n const currentVisibility = isVisibilityControlled ? columnVisibilityProp! : internalVisibility;\r\n const setVisibility = React.useCallback(\r\n (next: Record<string, boolean>) => {\r\n if (!isVisibilityControlled) setInternalVisibility(next);\r\n onColumnVisibilityChange?.(next);\r\n },\r\n [isVisibilityControlled, onColumnVisibilityChange]\r\n );\r\n\r\n const isOrderControlled = columnOrderProp != null;\r\n const [internalOrder, setInternalOrder] = React.useState<string[]>(() => columns.map((c) => c.id));\r\n React.useEffect(() => {\r\n if (!isOrderControlled) setInternalOrder((prev) => {\r\n const next = columns.map((c) => c.id);\r\n const added = next.filter((id) => !prev.includes(id));\r\n const removed = prev.filter((id) => !next.some((id2) => id2 === id));\r\n if (added.length === 0 && removed.length === 0) return prev;\r\n let order = prev.filter((id) => next.includes(id));\r\n for (const id of added) order.push(id);\r\n return order;\r\n });\r\n }, [columns, isOrderControlled]);\r\n const currentOrder = isOrderControlled ? columnOrderProp! : internalOrder;\r\n const setOrder = React.useCallback(\r\n (next: string[]) => {\r\n if (!isOrderControlled) setInternalOrder(next);\r\n onColumnOrderChange?.(next);\r\n },\r\n [isOrderControlled, onColumnOrderChange]\r\n );\r\n\r\n const isPageControlled = pageProp != null;\r\n const currentPage = isPageControlled ? pageProp : internalPage;\r\n\r\n const handlePageChange = React.useCallback(\r\n (nextPage: number, nextPageSize: number) => {\r\n if (!isPageControlled) setInternalPage(nextPage);\r\n if (nextPageSize !== pageSize) setPageSize(nextPageSize);\r\n onPageChange?.(nextPage, nextPageSize);\r\n },\r\n [isPageControlled, pageSize, onPageChange]\r\n );\r\n\r\n const lastBlockNeededPageRef = React.useRef<number | null>(null);\r\n React.useEffect(() => {\r\n if (!pagination || !onBlockNeeded) return;\r\n const needed = currentPage * pageSize;\r\n if (data.length >= needed) {\r\n lastBlockNeededPageRef.current = null;\r\n return;\r\n }\r\n if (lastBlockNeededPageRef.current === currentPage) return;\r\n lastBlockNeededPageRef.current = currentPage;\r\n onBlockNeeded(currentPage);\r\n }, [pagination, onBlockNeeded, currentPage, pageSize, data.length]);\r\n\r\n const handleSort = (id: string) => {\r\n if (!sortable) return;\r\n const next: typeof sortState =\r\n sortState.id === id\r\n ? {\r\n id,\r\n direction:\r\n sortState.direction === 'asc'\r\n ? 'desc'\r\n : sortState.direction === 'desc'\r\n ? null\r\n : 'asc',\r\n }\r\n : { id, direction: 'asc' as const };\r\n setSortState(next);\r\n onSort?.(next.id, next.direction);\r\n };\r\n\r\n const visibleColumns = React.useMemo(() => {\r\n const order = currentOrder.filter((id) => columns.some((c) => c.id === id));\r\n const baseOrdered = order\r\n .filter((id) => currentVisibility[id] !== false)\r\n .map((id) => columns.find((c) => c.id === id)!)\r\n .filter(Boolean);\r\n for (const c of columns) {\r\n if (currentVisibility[c.id] !== false && !baseOrdered.some((x) => x.id === c.id)) {\r\n baseOrdered.push(c);\r\n }\r\n }\r\n const left = baseOrdered.filter((c) => c.pinned === 'left');\r\n const center = baseOrdered.filter((c) => c.pinned !== 'left' && c.pinned !== 'right');\r\n const right = baseOrdered.filter((c) => c.pinned === 'right');\r\n return [...left, ...center, ...right];\r\n }, [columns, currentOrder, currentVisibility]);\r\n\r\n const filterableColumns = React.useMemo(\r\n () => visibleColumns.filter((c) => c.filter != null),\r\n [visibleColumns]\r\n );\r\n\r\n const isFilterControlled = filterModelProp != null;\r\n const [internalFilterModel, setInternalFilterModel] = React.useState<Record<string, string | number | null>>(\r\n () => defaultFilterModel ?? {}\r\n );\r\n const currentFilterModel = isFilterControlled ? filterModelProp! : internalFilterModel;\r\n const setFilterModel = React.useCallback(\r\n (next: Record<string, string | number | null>) => {\r\n if (!isFilterControlled) setInternalFilterModel(next);\r\n onFilterChange?.(next);\r\n },\r\n [isFilterControlled, onFilterChange]\r\n );\r\n\r\n const filteredData = React.useMemo(() => {\r\n const active = Object.entries(currentFilterModel).filter(\r\n ([_, v]) => v !== null && v !== undefined && v !== ''\r\n );\r\n if (active.length === 0) return data;\r\n return data.filter((row) => {\r\n for (const [colId, filterVal] of active) {\r\n const col = columns.find((c) => c.id === colId);\r\n if (!col?.filter) continue;\r\n const cellVal = getCellValue(row, col);\r\n if (col.filter === 'text') {\r\n const s = String(cellVal ?? '').toLowerCase();\r\n const f = String(filterVal).toLowerCase();\r\n if (f && !s.includes(f)) return false;\r\n } else if (col.filter === 'number') {\r\n const n = typeof cellVal === 'number' ? cellVal : Number(cellVal);\r\n const fn = typeof filterVal === 'number' ? filterVal : Number(filterVal);\r\n if (Number.isNaN(fn)) continue;\r\n if (Number.isNaN(n) || n !== fn) return false;\r\n } else if (col.filter === 'date') {\r\n const cv = cellVal != null ? new Date(cellVal as number | string).getTime() : NaN;\r\n const fv = new Date(filterVal as string).getTime();\r\n if (Number.isNaN(fv)) continue;\r\n if (Number.isNaN(cv)) return false;\r\n const d1 = new Date(cv).toDateString();\r\n const d2 = new Date(fv).toDateString();\r\n if (d1 !== d2) return false;\r\n } else if (col.filter === 'select') {\r\n const cStr = cellVal != null ? String(cellVal) : '';\r\n const fStr = String(filterVal);\r\n if (fStr && cStr !== fStr) return false;\r\n }\r\n }\r\n return true;\r\n });\r\n }, [data, columns, currentFilterModel]);\r\n\r\n const totalCount = totalCountProp ?? filteredData.length;\r\n const isClientSide = totalCountProp == null;\r\n const totalPages = Math.max(1, Math.ceil(totalCount / pageSize));\r\n const safePage = Math.min(Math.max(1, currentPage), totalPages);\r\n\r\n const actionsWidthPx =\r\n actions == null\r\n ? 0\r\n : parseWidth(actionsWidth) ?? 80;\r\n\r\n const selectionWidthPx = rowSelection ? SELECTION_COLUMN_WIDTH : 0;\r\n\r\n const computedWidths = React.useMemo(\r\n () =>\r\n getComputedWidths(\r\n visibleColumns,\r\n tableWidth,\r\n columnWidths,\r\n actionsWidthPx,\r\n selectionWidthPx\r\n ),\r\n [visibleColumns, tableWidth, columnWidths, actionsWidthPx, selectionWidthPx]\r\n );\r\n\r\n const { pinnedLeftOffsets, pinnedRightOffsets } = React.useMemo(() => {\r\n const left: (number | undefined)[] = [];\r\n const right: (number | undefined)[] = [];\r\n let leftAcc = selectionWidthPx;\r\n for (let i = 0; i < visibleColumns.length; i++) {\r\n if (visibleColumns[i].pinned === 'left') {\r\n left[i] = leftAcc;\r\n leftAcc += computedWidths[i];\r\n } else {\r\n left[i] = undefined;\r\n }\r\n }\r\n let rightAcc = actionsWidthPx;\r\n for (let i = visibleColumns.length - 1; i >= 0; i--) {\r\n if (visibleColumns[i].pinned === 'right') {\r\n right[i] = rightAcc;\r\n rightAcc += computedWidths[i];\r\n } else {\r\n right[i] = undefined;\r\n }\r\n }\r\n return {\r\n pinnedLeftOffsets: left,\r\n pinnedRightOffsets: right,\r\n };\r\n }, [visibleColumns, computedWidths, selectionWidthPx, actionsWidthPx]);\r\n\r\n const sortedData = React.useMemo(() => {\r\n if (!sortState.direction || !sortState.id) return filteredData;\r\n const col = columns.find((c) => c.id === sortState.id);\r\n if (!col?.sortable || col?.suppressSort) return filteredData;\r\n return [...filteredData].sort((a, b) => {\r\n const aVal = getCellValue(a, col);\r\n const bVal = getCellValue(b, col);\r\n const cmp = col.comparator\r\n ? col.comparator(aVal, bVal, a, b)\r\n : typeof aVal === 'number' && typeof bVal === 'number'\r\n ? aVal - bVal\r\n : String(aVal ?? '').localeCompare(String(bVal ?? ''));\r\n return sortState.direction === 'asc' ? cmp : -cmp;\r\n });\r\n }, [filteredData, columns, sortState]);\r\n\r\n const displayData = React.useMemo(() => {\r\n if (!pagination) return sortedData;\r\n if (isClientSide || onBlockNeeded) {\r\n const start = (safePage - 1) * pageSize;\r\n return sortedData.slice(start, start + pageSize);\r\n }\r\n return sortedData;\r\n }, [pagination, isClientSide, onBlockNeeded, sortedData, safePage, pageSize]);\r\n\r\n const isSelectionControlled = selectedRowKeysProp != null;\r\n const [internalSelectedKeys, setInternalSelectedKeys] = React.useState<(string | number)[]>(\r\n () => defaultSelectedRowKeys\r\n );\r\n const selectedKeys = isSelectionControlled ? selectedRowKeysProp : internalSelectedKeys;\r\n const selectedSet = React.useMemo(() => new Set(selectedKeys), [selectedKeys]);\r\n\r\n const setSelectedKeys = React.useCallback(\r\n (next: (string | number)[]) => {\r\n if (!isSelectionControlled) setInternalSelectedKeys(next);\r\n const rows = data.filter((row) => next.includes(getRowKey(row) as string | number));\r\n onSelectionChange?.(next, rows);\r\n },\r\n [isSelectionControlled, data, getRowKey, onSelectionChange]\r\n );\r\n\r\n const toggleRow = React.useCallback(\r\n (key: string | number) => {\r\n const next = selectedSet.has(key)\r\n ? selectedKeys.filter((k) => k !== key)\r\n : [...selectedKeys, key];\r\n setSelectedKeys(next);\r\n },\r\n [selectedKeys, selectedSet, setSelectedKeys]\r\n );\r\n\r\n const toggleAllOnPage = React.useCallback(() => {\r\n const pageKeys = displayData.map((row) => getRowKey(row) as string | number);\r\n const allSelected = pageKeys.length > 0 && pageKeys.every((k) => selectedSet.has(k));\r\n const next = allSelected\r\n ? selectedKeys.filter((k) => !pageKeys.includes(k))\r\n : [...new Set([...selectedKeys, ...pageKeys])];\r\n setSelectedKeys(next);\r\n }, [displayData, getRowKey, selectedKeys, selectedSet, setSelectedKeys]);\r\n\r\n const selectedRows = React.useMemo(\r\n () => data.filter((row) => selectedSet.has(getRowKey(row) as string | number)),\r\n [data, selectedSet, getRowKey]\r\n );\r\n\r\n const selectAll = React.useCallback(() => {\r\n setSelectedKeys(data.map((row) => getRowKey(row) as string | number));\r\n }, [data, getRowKey, setSelectedKeys]);\r\n\r\n const clearSelection = React.useCallback(() => {\r\n setSelectedKeys([]);\r\n }, [setSelectedKeys]);\r\n\r\n const [selectionDropdownOpen, setSelectionDropdownOpen] = React.useState(false);\r\n const selectionDropdownRef = React.useRef<HTMLDivElement>(null);\r\n React.useEffect(() => {\r\n if (!selectionDropdownOpen) return;\r\n const onDocClick = (e: MouseEvent) => {\r\n if (selectionDropdownRef.current && !selectionDropdownRef.current.contains(e.target as Node))\r\n setSelectionDropdownOpen(false);\r\n };\r\n document.addEventListener('click', onDocClick);\r\n return () => document.removeEventListener('click', onDocClick);\r\n }, [selectionDropdownOpen]);\r\n\r\n const [filterPanelOpen, setFilterPanelOpen] = React.useState(false);\r\n const [columnVisibilityDropdownOpen, setColumnVisibilityDropdownOpen] = React.useState(false);\r\n const columnVisibilityDropdownRef = React.useRef<HTMLDivElement>(null);\r\n React.useEffect(() => {\r\n if (!columnVisibilityDropdownOpen) return;\r\n const onDocClick = (e: MouseEvent) => {\r\n if (columnVisibilityDropdownRef.current && !columnVisibilityDropdownRef.current.contains(e.target as Node)) {\r\n setColumnVisibilityDropdownOpen(false);\r\n }\r\n };\r\n document.addEventListener('click', onDocClick);\r\n return () => document.removeEventListener('click', onDocClick);\r\n }, [columnVisibilityDropdownOpen]);\r\n\r\n const toggleColumnVisibility = React.useCallback(\r\n (colId: string) => {\r\n setVisibility({ ...currentVisibility, [colId]: !currentVisibility[colId] });\r\n },\r\n [currentVisibility, setVisibility]\r\n );\r\n\r\n const [draggedColId, setDraggedColId] = React.useState<string | null>(null);\r\n const [dragOverIndex, setDragOverIndex] = React.useState<number>(-1);\r\n\r\n const handleColumnDragStart = React.useCallback((e: React.DragEvent, colId: string) => {\r\n e.dataTransfer.setData('text/plain', colId);\r\n e.dataTransfer.effectAllowed = 'move';\r\n const th = (e.currentTarget as HTMLElement).closest('th');\r\n if (th) e.dataTransfer.setDragImage(th, 0, 0);\r\n setDraggedColId(colId);\r\n }, []);\r\n\r\n const handleColumnDragOver = React.useCallback((e: React.DragEvent, index: number) => {\r\n e.preventDefault();\r\n e.dataTransfer.dropEffect = 'move';\r\n setDragOverIndex(index);\r\n }, []);\r\n\r\n const handleColumnDragLeave = React.useCallback(() => {\r\n setDragOverIndex(-1);\r\n }, []);\r\n\r\n const handleColumnDrop = React.useCallback(\r\n (e: React.DragEvent, dropIndex: number) => {\r\n e.preventDefault();\r\n setDragOverIndex(-1);\r\n const draggedId = e.dataTransfer.getData('text/plain');\r\n if (!draggedId || draggedId === visibleColumns[dropIndex]?.id) return;\r\n const fromIdx = currentOrder.indexOf(draggedId);\r\n const dropTargetId = visibleColumns[dropIndex]?.id;\r\n const toIdx = currentOrder.indexOf(dropTargetId);\r\n if (fromIdx === -1 || toIdx === -1) return;\r\n const newOrder = currentOrder.slice();\r\n newOrder.splice(fromIdx, 1);\r\n const newToIdx = newOrder.indexOf(dropTargetId);\r\n newOrder.splice(newToIdx, 0, draggedId);\r\n setOrder(newOrder);\r\n },\r\n [visibleColumns, currentOrder, setOrder]\r\n );\r\n\r\n const handleColumnDragEnd = React.useCallback(() => {\r\n setDraggedColId(null);\r\n setDragOverIndex(-1);\r\n }, []);\r\n\r\n const activeFilterCount = Object.values(currentFilterModel).filter(\r\n (v) => v !== null && v !== undefined && v !== ''\r\n ).length;\r\n\r\n const clearFilters = React.useCallback(() => {\r\n setFilterModel({});\r\n }, [setFilterModel]);\r\n\r\n const useVirtualization = virtualization && !isMobile && displayData.length > 0;\r\n const useStickyHeader = stickyHeader && !isMobile;\r\n const { virtualStart, virtualEnd } = React.useMemo(() => {\r\n if (!useVirtualization || scrollContainerHeight <= 0) {\r\n return { virtualStart: 0, virtualEnd: displayData.length };\r\n }\r\n const visibleCount = Math.ceil(scrollContainerHeight / rowHeight) + virtualizationOverscan * 2;\r\n const start = Math.max(0, Math.floor(scrollTop / rowHeight) - virtualizationOverscan);\r\n const end = Math.min(displayData.length, start + visibleCount);\r\n return { virtualStart: start, virtualEnd: end };\r\n }, [useVirtualization, scrollContainerHeight, scrollTop, rowHeight, virtualizationOverscan, displayData.length]);\r\n\r\n const startRow = (safePage - 1) * pageSize + 1;\r\n const endRow = Math.min(safePage * pageSize, totalCount);\r\n const skeletonRowCount = loading ? Math.min(pageSize, 10) : 0;\r\n\r\n function getCellDisplay<T>(\r\n row: T,\r\n col: import('./Table.types').ColumnDef<T>,\r\n value: unknown\r\n): React.ReactNode {\r\n if (col.cell != null) return col.cell(row);\r\n if (col.valueFormatter != null) return col.valueFormatter(value, row);\r\n if (col.valueFormat != null) return applyValueFormat(value, col.valueFormat, col.valueFormatOptions);\r\n if (col.cellFormat != null) return renderCellFormat(col.cellFormat, value, row, col.cellFormatOptions);\r\n return value as React.ReactNode;\r\n}\r\n\r\n const themeClass = theme === 'dark' ? 'dyn-table-wrapper--dark' : 'dyn-table-wrapper--light';\r\n const showToolbar = rowSelection || filterable || columns.length > 1;\r\n return (\r\n <div className={`dyn-table-wrapper ${themeClass} ${className}`.trim()}>\r\n {showToolbar && (\r\n <div className={`dyn-table-toolbar ${isMobile ? 'dyn-table-toolbar--mobile' : ''}`.trim()}>\r\n <div className=\"dyn-table-toolbar__actions\">\r\n {rowSelection && (\r\n <>\r\n <button\r\n type=\"button\"\r\n className=\"dyn-table-toolbar__btn\"\r\n onClick={selectAll}\r\n aria-label=\"Tümünü seç\"\r\n >\r\n Tümünü seç\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"dyn-table-toolbar__btn\"\r\n onClick={clearSelection}\r\n disabled={selectedKeys.length === 0}\r\n aria-label=\"Seçimi kaldır\"\r\n >\r\n Kaldır\r\n </button>\r\n <div ref={selectionDropdownRef} className=\"dyn-table-toolbar__dropdown\">\r\n <button\r\n type=\"button\"\r\n className=\"dyn-table-toolbar__dropdown-trigger\"\r\n onClick={() => setSelectionDropdownOpen((v) => !v)}\r\n disabled={selectedKeys.length === 0}\r\n aria-expanded={selectionDropdownOpen}\r\n aria-haspopup=\"listbox\"\r\n aria-label=\"Seçilenleri göster\"\r\n >\r\n <span>{selectedKeys.length} seçili</span>\r\n <svg\r\n className={`dyn-table-toolbar__dropdown-chevron ${selectionDropdownOpen ? 'dyn-table-toolbar__dropdown-chevron--open' : ''}`}\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n width=\"14\"\r\n height=\"14\"\r\n >\r\n <path d=\"M6 9l6 6 6-6\" />\r\n </svg>\r\n </button>\r\n {selectionDropdownOpen && selectedKeys.length > 0 && (\r\n <div\r\n className=\"dyn-table-toolbar__dropdown-panel\"\r\n role=\"listbox\"\r\n aria-label=\"Seçilen satırlar\"\r\n >\r\n <ul className=\"dyn-table-toolbar__dropdown-list\">\r\n {selectedRows.map((row) => {\r\n const key = getRowKey(row) as string | number;\r\n const label = selectionToolbarLabel?.(row) ?? String(key);\r\n return (\r\n <li key={String(key)} className=\"dyn-table-toolbar__dropdown-item\">\r\n <span className=\"dyn-table-toolbar__dropdown-item-label\">{label}</span>\r\n <button\r\n type=\"button\"\r\n className=\"dyn-table-toolbar__dropdown-item-remove\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n toggleRow(key);\r\n }}\r\n aria-label={`${label} seçimini kaldır`}\r\n >\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" width=\"12\" height=\"12\">\r\n <path d=\"M18 6L6 18M6 6l12 12\" />\r\n </svg>\r\n </button>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n </div>\r\n )}\r\n </div>\r\n </>\r\n )}\r\n {filterable && (\r\n <button\r\n type=\"button\"\r\n className={`dyn-table-toolbar__btn dyn-table-toolbar__btn--filter ${filterPanelOpen ? 'dyn-table-toolbar__btn--filter-active' : ''}`}\r\n onClick={() => setFilterPanelOpen((v) => !v)}\r\n aria-expanded={filterPanelOpen}\r\n aria-label=\"Filtreler\"\r\n >\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" width=\"16\" height=\"16\">\r\n <path d=\"M22 3H2l8 9.46V19l4 2v-8.54L22 3z\" />\r\n </svg>\r\n <span className=\"dyn-table-toolbar__btn-label\">Filtre</span>\r\n {activeFilterCount > 0 && (\r\n <span className=\"dyn-table-toolbar__filter-count\">{activeFilterCount}</span>\r\n )}\r\n </button>\r\n )}\r\n {columns.length > 1 && (\r\n <div ref={columnVisibilityDropdownRef} className=\"dyn-table-toolbar__dropdown\">\r\n <button\r\n type=\"button\"\r\n className={`dyn-table-toolbar__dropdown-trigger ${columnVisibilityDropdownOpen ? 'dyn-table-toolbar__dropdown-trigger--open' : ''}`}\r\n onClick={() => setColumnVisibilityDropdownOpen((v) => !v)}\r\n aria-expanded={columnVisibilityDropdownOpen}\r\n aria-haspopup=\"dialog\"\r\n aria-label=\"Kolonları göster/gizle\"\r\n >\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" width=\"16\" height=\"16\">\r\n <path d=\"M3 6h18M3 12h18M3 18h18M7 6v12M11 12v6M15 6v12M19 12v6\" />\r\n </svg>\r\n <span className=\"dyn-table-toolbar__btn-label\">Kolonlar</span>\r\n <svg\r\n className={`dyn-table-toolbar__dropdown-chevron ${columnVisibilityDropdownOpen ? 'dyn-table-toolbar__dropdown-chevron--open' : ''}`}\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n width=\"14\"\r\n height=\"14\"\r\n >\r\n <path d=\"M6 9l6 6 6-6\" />\r\n </svg>\r\n </button>\r\n {columnVisibilityDropdownOpen && (\r\n <div\r\n className=\"dyn-table-toolbar__dropdown-panel dyn-table-toolbar__dropdown-panel--columns\"\r\n role=\"dialog\"\r\n aria-label=\"Kolon görünürlüğü\"\r\n >\r\n <div className=\"dyn-table-column-visibility__header\">Görünen kolonlar</div>\r\n <ul className=\"dyn-table-toolbar__dropdown-list\">\r\n {columns.map((col) => {\r\n const visible = currentVisibility[col.id] !== false;\r\n const headerLabel = typeof col.header === 'string' ? col.header : col.id;\r\n return (\r\n <li key={col.id} className=\"dyn-table-toolbar__dropdown-item dyn-table-toolbar__dropdown-item--checkbox\">\r\n <label className=\"dyn-table-column-visibility__label\">\r\n <input\r\n type=\"checkbox\"\r\n checked={visible}\r\n onChange={() => toggleColumnVisibility(col.id)}\r\n aria-label={`${headerLabel} ${visible ? 'gizle' : 'göster'}`}\r\n />\r\n <span className=\"dyn-table-toolbar__dropdown-item-label\">{headerLabel}</span>\r\n </label>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n {filterable ? (\r\n <div className=\"dyn-table-main\">\r\n {filterPanelOpen && (\r\n <div\r\n className=\"dyn-table-filter-overlay\"\r\n role=\"presentation\"\r\n onClick={() => setFilterPanelOpen(false)}\r\n aria-hidden\r\n />\r\n )}\r\n <div\r\n className={`dyn-table-filter-panel ${filterPanelOpen ? 'dyn-table-filter-panel--open' : ''}`}\r\n style={{ width: filterPanelWidth }}\r\n aria-label=\"Filtreler paneli\"\r\n >\r\n <div className=\"dyn-table-filter-panel__header\">\r\n <h3 className=\"dyn-table-filter-panel__title\">Filtreler</h3>\r\n <button\r\n type=\"button\"\r\n className=\"dyn-table-filter-panel__close\"\r\n onClick={() => setFilterPanelOpen(false)}\r\n aria-label=\"Paneli kapat\"\r\n >\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" width=\"20\" height=\"20\">\r\n <path d=\"M18 6L6 18M6 6l12 12\" />\r\n </svg>\r\n </button>\r\n </div>\r\n <div className=\"dyn-table-filter-panel__body\">\r\n {activeFilterCount > 0 && (\r\n <button\r\n type=\"button\"\r\n className=\"dyn-table-filter-panel__clear\"\r\n onClick={clearFilters}\r\n >\r\n Filtreleri temizle\r\n </button>\r\n )}\r\n {filterableColumns.map((col) => {\r\n const headerLabel = typeof col.header === 'string' ? col.header : col.id;\r\n const value = currentFilterModel[col.id] ?? '';\r\n return (\r\n <div key={col.id} className=\"dyn-table-filter-panel__item\">\r\n <label className=\"dyn-table-filter-panel__label\">{headerLabel}</label>\r\n {col.filter === 'text' && (\r\n <input\r\n type=\"text\"\r\n className=\"dyn-table-filter-panel__input\"\r\n value={value as string}\r\n onChange={(e) =>\r\n setFilterModel({ ...currentFilterModel, [col.id]: e.target.value || null })\r\n }\r\n placeholder=\"Ara...\"\r\n />\r\n )}\r\n {col.filter === 'number' && (\r\n <input\r\n type=\"number\"\r\n className=\"dyn-table-filter-panel__input\"\r\n value={value === '' || value === null ? '' : value}\r\n onChange={(e) => {\r\n const v = e.target.value;\r\n setFilterModel({\r\n ...currentFilterModel,\r\n [col.id]: v === '' ? null : Number(v),\r\n });\r\n }}\r\n placeholder=\"—\"\r\n />\r\n )}\r\n {col.filter === 'date' && (\r\n <input\r\n type=\"date\"\r\n className=\"dyn-table-filter-panel__input\"\r\n value={value === '' || value === null ? '' : String(value)}\r\n onChange={(e) =>\r\n setFilterModel({\r\n ...currentFilterModel,\r\n [col.id]: e.target.value || null,\r\n })\r\n }\r\n />\r\n )}\r\n {col.filter === 'select' && (\r\n <select\r\n className=\"dyn-table-filter-panel__select\"\r\n value={value === '' || value === null ? '' : String(value)}\r\n onChange={(e) =>\r\n setFilterModel({\r\n ...currentFilterModel,\r\n [col.id]: e.target.value === '' ? null : e.target.value,\r\n })\r\n }\r\n >\r\n <option value=\"\">Tümü</option>\r\n {(col.filterSelectOptions ?? []).map((opt) => (\r\n <option key={String(opt.value)} value={String(opt.value)}>\r\n {opt.label}\r\n </option>\r\n ))}\r\n </select>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n <div className=\"dyn-table-main__content\">\r\n {isMobile ? (\r\n <div\r\n className=\"dyn-table-mobile\"\r\n style={{\r\n ...(minHeight != null && {\r\n minHeight: typeof minHeight === 'number' ? `${minHeight}px` : minHeight,\r\n }),\r\n ...(height != null && {\r\n height: typeof height === 'number' ? `${height}px` : height,\r\n }),\r\n }}\r\n >\r\n {loading ? (\r\n <div className=\"dyn-table-cards\" aria-busy>\r\n {Array.from({ length: Math.min(skeletonRowCount, 5) }, (_, idx) => (\r\n <div key={`skeleton-card-${idx}`} className=\"dyn-table-card dyn-table-card--skeleton\">\r\n {rowSelection && (\r\n <div className=\"dyn-table-card__selection\">\r\n <span className=\"dyn-table-skeleton dyn-table-skeleton--checkbox\" />\r\n </div>\r\n )}\r\n {visibleColumns.map((col) => (\r\n <div key={col.id} className=\"dyn-table-card__row\">\r\n <span className=\"dyn-table-card__label\">\r\n {typeof col.header === 'string' ? col.header : col.id}\r\n </span>\r\n <span className=\"dyn-table-card__value\">\r\n <span className=\"dyn-table-skeleton\" />\r\n </span>\r\n </div>\r\n ))}\r\n {actions != null && <div className=\"dyn-table-card__actions\" />}\r\n </div>\r\n ))}\r\n </div>\r\n ) : displayData.length === 0 ? (\r\n <div className=\"dyn-table-empty dyn-table-empty--card\">\r\n {emptyMessage}\r\n </div>\r\n ) : (\r\n <div className=\"dyn-table-cards\">\r\n {displayData.map((row, index) => {\r\n const rowKey = getRowKey(row) as string | number;\r\n return (\r\n <div\r\n key={rowKey}\r\n className={`dyn-table-card ${typeof rowClassName === 'function' ? (rowClassName as (row: T, index: number) => string)(row, index) : rowClassName ?? ''}`.trim()}\r\n >\r\n {rowSelection && (\r\n <div className=\"dyn-table-card__selection\">\r\n <label className=\"dyn-table-selection-cell\">\r\n <input\r\n type=\"checkbox\"\r\n checked={selectedSet.has(rowKey)}\r\n onChange={() => toggleRow(rowKey)}\r\n aria-label=\"Satırı seç\"\r\n />\r\n </label>\r\n </div>\r\n )}\r\n {visibleColumns.map((col) => {\r\n const value = getCellValue(row, col);\r\n const display = getCellDisplay(row, col, value);\r\n return (\r\n <div key={col.id} className=\"dyn-table-card__row\">\r\n <span className=\"dyn-table-card__label\">\r\n {typeof col.header === 'string' ? col.header : col.header}\r\n </span>\r\n <span className=\"dyn-table-card__value\">{display}</span>\r\n </div>\r\n );\r\n })}\r\n {actions != null && (\r\n <div className=\"dyn-table-card__actions\">\r\n {actions(row)}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n ) : (\r\n <div\r\n ref={scrollRef}\r\n className={`dyn-table-scroll ${useVirtualization ? 'dyn-table-scroll--virtualized' : ''} ${useStickyHeader ? 'dyn-table-scroll--sticky-header' : ''}`.trim()}\r\n style={{\r\n ...(minHeight != null && {\r\n minHeight: typeof minHeight === 'number' ? `${minHeight}px` : minHeight,\r\n }),\r\n ...(height != null && {\r\n height: typeof height === 'number' ? `${height}px` : height,\r\n }),\r\n ...(useVirtualization && {\r\n overflowY: 'auto',\r\n height: height != null\r\n ? (typeof height === 'number' ? `${height}px` : height)\r\n : minHeight != null\r\n ? (typeof minHeight === 'number' ? `${minHeight}px` : minHeight)\r\n : 400,\r\n }),\r\n ...(useStickyHeader && !useVirtualization && {\r\n overflowY: 'auto',\r\n height: height != null\r\n ? (typeof height === 'number' ? `${height}px` : height)\r\n : minHeight != null\r\n ? (typeof minHeight === 'number' ? `${minHeight}px` : minHeight)\r\n : 400,\r\n }),\r\n }}\r\n onScroll={useVirtualization ? (e) => setScrollTop(e.currentTarget.scrollTop) : undefined}\r\n >\r\n <table className=\"dyn-table dyn-table--fixed\">\r\n <colgroup>\r\n {rowSelection && (\r\n <col style={{ width: SELECTION_COLUMN_WIDTH }} />\r\n )}\r\n {visibleColumns.map((col, i) => (\r\n <col key={col.id} style={{ width: computedWidths[i], minWidth: getMinWidthForColumn(col) }} />\r\n ))}\r\n {actions != null && (\r\n <col style={{ width: actionsWidthPx }} />\r\n )}\r\n </colgroup>\r\n <thead className={headerClassName}>\r\n <tr>\r\n {rowSelection && (\r\n <th className=\"dyn-table-th dyn-table-th--selection\" style={{ width: SELECTION_COLUMN_WIDTH }}>\r\n <SelectionHeaderCheckbox\r\n displayData={displayData}\r\n getRowKey={getRowKey}\r\n selectedSet={selectedSet}\r\n onToggleAll={toggleAllOnPage}\r\n />\r\n </th>\r\n )}\r\n {visibleColumns.map((col, i) => {\r\n const isSortable = sortable && col.sortable !== false && !col.suppressSort;\r\n const isSorted = sortState.id === col.id;\r\n const isPinnedLeft = col.pinned === 'left';\r\n const isPinnedRight = col.pinned === 'right';\r\n const isDragging = draggedColId === col.id;\r\n const isDragOver = dragOverIndex === i;\r\n const thClass = [\r\n 'dyn-table-th',\r\n isSortable ? 'dyn-table-th--sortable' : '',\r\n isSorted ? 'dyn-table-th--sorted' : '',\r\n col.resizable ? 'dyn-table-th--resizable' : '',\r\n isPinnedLeft ? 'dyn-table-th--pinned-left' : '',\r\n isPinnedRight ? 'dyn-table-th--pinned-right' : '',\r\n isDragging ? 'dyn-table-th--dragging' : '',\r\n isDragOver ? 'dyn-table-th--drag-over' : '',\r\n col.headerClass ?? '',\r\n ].filter(Boolean).join(' ');\r\n return (\r\n <th\r\n key={col.id}\r\n className={thClass}\r\n style={{\r\n width: computedWidths[i],\r\n minWidth: getMinWidthForColumn(col),\r\n maxWidth: parseWidth(col.maxWidth),\r\n textAlign: col.headerAlign ?? col.align ?? 'left',\r\n ...(isPinnedLeft && pinnedLeftOffsets[i] != null\r\n ? { left: pinnedLeftOffsets[i] }\r\n : {}),\r\n ...(isPinnedRight && pinnedRightOffsets[i] != null\r\n ? { right: pinnedRightOffsets[i] }\r\n : {}),\r\n ...col.headerStyle,\r\n }}\r\n title={col.headerTooltip}\r\n onClick={() => isSortable && handleSort(col.id)}\r\n onDragOver={columnReorder && !isMobile ? (e) => handleColumnDragOver(e, i) : undefined}\r\n onDragLeave={columnReorder && !isMobile ? handleColumnDragLeave : undefined}\r\n onDrop={columnReorder && !isMobile ? (e) => handleColumnDrop(e, i) : undefined}\r\n >\r\n <span className=\"dyn-table-th__content\">\r\n {columnReorder && !isMobile && (\r\n <span\r\n className=\"dyn-table-th__drag-handle\"\r\n draggable\r\n onDragStart={(e) => handleColumnDragStart(e, col.id)}\r\n onDragEnd={handleColumnDragEnd}\r\n onClick={(e) => e.stopPropagation()}\r\n aria-label={`${col.id} kolonunu taşı`}\r\n >\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden>\r\n <path d=\"M8 6h2V4H8v2zm0 4h2V8H8v2zm0 4h2v-2H8v2zm4-8h2V4h-2v2zm0 4h2V8h-2v2zm0 4h2v-2h-2v2z\" />\r\n </svg>\r\n </span>\r\n )}\r\n {col.header}\r\n {isSortable && (\r\n <span className=\"dyn-table-sort\" aria-hidden>\r\n {isSorted && sortState.direction === 'asc' && (\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <path d=\"M7 15l5-5 5 5H7z\" />\r\n </svg>\r\n )}\r\n {isSorted && sortState.direction === 'desc' && (\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <path d=\"M7 10l5 5 5-5H7z\" />\r\n </svg>\r\n )}\r\n {!isSorted && (\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <path d=\"M7 15l5-5 5 5H7z\" />\r\n </svg>\r\n )}\r\n </span>\r\n )}\r\n </span>\r\n {col.resizable && (\r\n <ResizeHandle\r\n colId={col.id}\r\n minWidth={getMinWidthForColumn(col)}\r\n maxWidth={parseWidth(col.maxWidth)}\r\n startWidth={computedWidths[i]}\r\n onResize={(w) =>\r\n setColumnWidths((prev) => ({ ...prev, [col.id]: w }))\r\n }\r\n />\r\n )}\r\n </th>\r\n );\r\n })}\r\n {actions != null && (\r\n <th\r\n className=\"dyn-table-th dyn-table-th--actions\"\r\n style={{\r\n width: actionsWidthPx,\r\n minWidth: actionsWidthPx,\r\n textAlign: actionsAlign,\r\n }}\r\n >\r\n {actionsHeader}\r\n </th>\r\n )}\r\n </tr>\r\n </thead>\r\n <tbody className={bodyClassName}>\r\n {loading ? (\r\n Array.from({ length: skeletonRowCount }, (_, rowIdx) => (\r\n <tr key={`skeleton-${rowIdx}`} className=\"dyn-table-row--skeleton\" aria-busy>\r\n {rowSelection && (\r\n <td className=\"dyn-table-td dyn-table-td--selection\" style={{ width: SELECTION_COLUMN_WIDTH }}>\r\n <span className=\"dyn-table-skeleton dyn-table-skeleton--checkbox\" />\r\n </td>\r\n )}\r\n {visibleColumns.map((col, i) => (\r\n <td\r\n key={col.id}\r\n className=\"dyn-table-td\"\r\n style={{\r\n width: computedWidths[i],\r\n minWidth: getMinWidthForColumn(col),\r\n textAlign: col.align ?? 'left',\r\n }}\r\n >\r\n <span className=\"dyn-table-skeleton\" />\r\n </td>\r\n ))}\r\n {actions != null && (\r\n <td className=\"dyn-table-td dyn-table-td--actions\" style={{ width: actionsWidthPx }} />\r\n )}\r\n </tr>\r\n ))\r\n ) : displayData.length === 0 ? (\r\n <tr>\r\n <td\r\n colSpan={\r\n visibleColumns.length +\r\n (actions != null ? 1 : 0) +\r\n (rowSelection ? 1 : 0)\r\n }\r\n className=\"dyn-table-empty\"\r\n >\r\n {emptyMessage}\r\n </td>\r\n </tr>\r\n ) : useVirtualization ? (\r\n <>\r\n {virtualStart > 0 && (\r\n <tr aria-hidden className=\"dyn-table-virtual-spacer\">\r\n <td\r\n colSpan={\r\n visibleColumns.length +\r\n (actions != null ? 1 : 0) +\r\n (rowSelection ? 1 : 0)\r\n }\r\n style={{ height: virtualStart * rowHeight, padding: 0, border: 'none', verticalAlign: 'top', lineHeight: 0 }}\r\n />\r\n </tr>\r\n )}\r\n {displayData.slice(virtualStart, virtualEnd).map((row, idx) => {\r\n const index = virtualStart + idx;\r\n const rowKey = getRowKey(row) as string | number;\r\n return (\r\n <tr\r\n key={rowKey}\r\n style={{ height: rowHeight }}\r\n className={[\r\n typeof rowClassName === 'function'\r\n ? (rowClassName as (row: T, index: number) => string)(row, index)\r\n : (rowClassName ?? ''),\r\n rowSelection && selectedSet.has(rowKey) ? 'dyn-table-row--selected' : '',\r\n ].filter(Boolean).join(' ')}\r\n >\r\n {rowSelection && (\r\n <td className=\"dyn-table-td dyn-table-td--selection\" style={{ width: SELECTION_COLUMN_WIDTH }}>\r\n <label className=\"dyn-table-selection-cell\">\r\n <input\r\n type=\"checkbox\"\r\n checked={selectedSet.has(rowKey)}\r\n onChange={() => toggleRow(rowKey)}\r\n aria-label=\"Satırı seç\"\r\n />\r\n </label>\r\n </td>\r\n )}\r\n {visibleColumns.map((col, i) => {\r\n const value = getCellValue(row, col);\r\n const display =\r\n col.cell != null\r\n ? col.cell(row)\r\n : col.valueFormatter != null\r\n ? col.valueFormatter(value, row)\r\n : col.valueFormat != null\r\n ? applyValueFormat(value, col.valueFormat, col.valueFormatOptions)\r\n : col.cellFormat != null\r\n ? renderCellFormat(col.cellFormat, value, row, col.cellFormatOptions)\r\n : (value as React.ReactNode);\r\n const cellClass =\r\n typeof col.cellClass === 'function'\r\n ? col.cellClass(row, value)\r\n : col.cellClass ?? '';\r\n const cellStyle =\r\n typeof col.cellStyle === 'function'\r\n ? col.cellStyle(row, value)\r\n : col.cellStyle ?? {};\r\n const tooltip = col.tooltip?.(row, value);\r\n const isPinnedLeft = col.pinned === 'left';\r\n const isPinnedRight = col.pinned === 'right';\r\n const tdClass = [\r\n 'dyn-table-td',\r\n isPinnedLeft ? 'dyn-table-td--pinned-left' : '',\r\n isPinnedRight ? 'dyn-table-td--pinned-right' : '',\r\n cellClass,\r\n ].filter(Boolean).join(' ');\r\n return (\r\n <td\r\n key={col.id}\r\n className={tdClass.trim()}\r\n style={{\r\n width: computedWidths[i],\r\n minWidth: getMinWidthForColumn(col),\r\n textAlign: col.align ?? 'left',\r\n ...(col.wrapText ? { whiteSpace: 'normal' } : {}),\r\n ...(isPinnedLeft && pinnedLeftOffsets[i] != null\r\n ? { left: pinnedLeftOffsets[i] }\r\n : {}),\r\n ...(isPinnedRight && pinnedRightOffsets[i] != null\r\n ? { right: pinnedRightOffsets[i] }\r\n : {}),\r\n ...cellStyle,\r\n }}\r\n title={tooltip}\r\n >\r\n {display}\r\n </td>\r\n );\r\n })}\r\n {actions != null && (\r\n <td\r\n className=\"dyn-table-td dyn-table-td--actions\"\r\n style={{ textAlign: actionsAlign }}\r\n >\r\n {actions(row)}\r\n </td>\r\n )}\r\n </tr>\r\n );\r\n })}\r\n {virtualEnd < displayData.length && (\r\n <tr aria-hidden className=\"dyn-table-virtual-spacer\">\r\n <td\r\n colSpan={\r\n visibleColumns.length +\r\n (actions != null ? 1 : 0) +\r\n (rowSelection ? 1 : 0)\r\n }\r\n style={{ height: (displayData.length - virtualEnd) * rowHeight, padding: 0, border: 'none', verticalAlign: 'top', lineHeight: 0 }}\r\n />\r\n </tr>\r\n )}\r\n </>\r\n ) : (\r\n displayData.map((row, index) => {\r\n const rowKey = getRowKey(row) as string | number;\r\n return (\r\n <tr\r\n key={rowKey}\r\n className={[\r\n typeof rowClassName === 'function'\r\n ? (rowClassName as (row: T, index: number) => string)(row, index)\r\n : (rowClassName ?? ''),\r\n rowSelection && selectedSet.has(rowKey) ? 'dyn-table-row--selected' : '',\r\n ].filter(Boolean).join(' ')}\r\n >\r\n {rowSelection && (\r\n <td className=\"dyn-table-td dyn-table-td--selection\" style={{ width: SELECTION_COLUMN_WIDTH }}>\r\n <label className=\"dyn-table-selection-cell\">\r\n <input\r\n type=\"checkbox\"\r\n checked={selectedSet.has(rowKey)}\r\n onChange={() => toggleRow(rowKey)}\r\n aria-label={`Satırı seç`}\r\n />\r\n </label>\r\n </td>\r\n )}\r\n {visibleColumns.map((col, i) => {\r\n const value = getCellValue(row, col);\r\n const display =\r\n col.cell != null\r\n ? col.cell(row)\r\n : col.valueFormatter != null\r\n ? col.valueFormatter(value, row)\r\n : col.valueFormat != null\r\n ? applyValueFormat(value, col.valueFormat, col.valueFormatOptions)\r\n : col.cellFormat != null\r\n ? renderCellFormat(col.cellFormat, value, row, col.cellFormatOptions)\r\n : (value as React.ReactNode);\r\n const cellClass =\r\n typeof col.cellClass === 'function'\r\n ? col.cellClass(row, value)\r\n : col.cellClass ?? '';\r\n const cellStyle =\r\n typeof col.cellStyle === 'function'\r\n ? col.cellStyle(row, value)\r\n : col.cellStyle ?? {};\r\n const tooltip = col.tooltip?.(row, value);\r\n const isPinnedLeft = col.pinned === 'left';\r\n const isPinnedRight = col.pinned === 'right';\r\n const tdClass = [\r\n 'dyn-table-td',\r\n isPinnedLeft ? 'dyn-table-td--pinned-left' : '',\r\n isPinnedRight ? 'dyn-table-td--pinned-right' : '',\r\n cellClass,\r\n ].filter(Boolean).join(' ');\r\n return (\r\n <td\r\n key={col.id}\r\n className={tdClass.trim()}\r\n style={{\r\n width: computedWidths[i],\r\n minWidth: getMinWidthForColumn(col),\r\n textAlign: col.align ?? 'left',\r\n ...(col.wrapText ? { whiteSpace: 'normal' } : {}),\r\n ...(isPinnedLeft && pinnedLeftOffsets[i] != null\r\n ? { left: pinnedLeftOffsets[i] }\r\n : {}),\r\n ...(isPinnedRight && pinnedRightOffsets[i] != null\r\n ? { right: pinnedRightOffsets[i] }\r\n : {}),\r\n ...cellStyle,\r\n }}\r\n title={tooltip}\r\n >\r\n {display}\r\n </td>\r\n );\r\n })}\r\n {actions != null && (\r\n <td\r\n className=\"dyn-table-td dyn-table-td--actions\"\r\n style={{ textAlign: actionsAlign }}\r\n >\r\n {actions(row)}\r\n </td>\r\n )}\r\n </tr>\r\n );\r\n })\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n ) : (\r\n isMobile ? (\r\n <div\r\n className=\"dyn-table-mobile\"\r\n style={{\r\n ...(minHeight != null && {\r\n minHeight: typeof minHeight === 'number' ? `${minHeight}px` : minHeight,\r\n }),\r\n ...(height != null && {\r\n height: typeof height === 'number' ? `${height}px` : height,\r\n }),\r\n }}\r\n >\r\n {loading ? (\r\n <div className=\"dyn-table-cards\" aria-busy>\r\n {Array.from({ length: Math.min(skeletonRowCount, 5) }, (_, idx) => (\r\n <div key={`skeleton-card-${idx}`} className=\"dyn-table-card dyn-table-card--skeleton\">\r\n {rowSelection && (\r\n <div className=\"dyn-table-card__selection\">\r\n <span className=\"dyn-table-skeleton dyn-table-skeleton--checkbox\" />\r\n </div>\r\n )}\r\n {visibleColumns.map((col) => (\r\n <div key={col.id} className=\"dyn-table-card__row\">\r\n <span className=\"dyn-table-card__label\">\r\n {typeof col.header === 'string' ? col.header : col.id}\r\n </span>\r\n <span className=\"dyn-table-card__value\">\r\n <span className=\"dyn-table-skeleton\" />\r\n </span>\r\n </div>\r\n ))}\r\n {actions != null && <div className=\"dyn-table-card__actions\" />}\r\n </div>\r\n ))}\r\n </div>\r\n ) : displayData.length === 0 ? (\r\n <div className=\"dyn-table-empty dyn-table-empty--card\">\r\n {emptyMessage}\r\n </div>\r\n ) : (\r\n <div className=\"dyn-table-cards\">\r\n {displayData.map((row) => {\r\n const rowKey = getRowKey(row) as string | number;\r\n return (\r\n <div\r\n key={rowKey}\r\n className={`dyn-table-card ${typeof rowClassName === 'function' ? (rowClassName as (row: T, index: number) => string)(row, 0) : rowClassName ?? ''}`.trim()}\r\n >\r\n {rowSelection && (\r\n <div className=\"dyn-table-card__selection\">\r\n <label className=\"dyn-table-selection-cell\">\r\n <input\r\n type=\"checkbox\"\r\n checked={selectedSet.has(rowKey)}\r\n onChange={() => toggleRow(rowKey)}\r\n aria-label=\"Satırı seç\"\r\n />\r\n </label>\r\n </div>\r\n )}\r\n {visibleColumns.map((col) => {\r\n const value = getCellValue(row, col);\r\n const display = getCellDisplay(row, col, value);\r\n return (\r\n <div key={col.id} className=\"dyn-table-card__row\">\r\n <span className=\"dyn-table-card__label\">\r\n {typeof col.header === 'string' ? col.header : col.header}\r\n </span>\r\n <span className=\"dyn-table-card__value\">{display}</span>\r\n </div>\r\n );\r\n })}\r\n {actions != null && (\r\n <div className=\"dyn-table-card__actions\">\r\n {actions(row)}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n ) : (\r\n <div\r\n ref={scrollRef}\r\n className={`dyn-table-scroll ${useVirtualization ? 'dyn-table-scroll--virtualized' : ''} ${useStickyHeader ? 'dyn-table-scroll--sticky-header' : ''}`.trim()}\r\n style={{\r\n ...(minHeight != null && {\r\n minHeight: typeof minHeight === 'number' ? `${minHeight}px` : minHeight,\r\n }),\r\n ...(height != null && {\r\n height: typeof height === 'number' ? `${height}px` : height,\r\n }),\r\n ...(useVirtualization && {\r\n overflowY: 'auto',\r\n height: height != null\r\n ? (typeof height === 'number' ? `${height}px` : height)\r\n : minHeight != null\r\n ? (typeof minHeight === 'number' ? `${minHeight}px` : minHeight)\r\n : 400,\r\n }),\r\n ...(useStickyHeader && !useVirtualization && {\r\n overflowY: 'auto',\r\n height: height != null\r\n ? (typeof height === 'number' ? `${height}px` : height)\r\n : minHeight != null\r\n ? (typeof minHeight === 'number' ? `${minHeight}px` : minHeight)\r\n : 400,\r\n }),\r\n }}\r\n onScroll={useVirtualization ? (e) => setScrollTop(e.currentTarget.scrollTop) : undefined}\r\n >\r\n <table className=\"dyn-table dyn-table--fixed\">\r\n <colgroup>\r\n {rowSelection && <col style={{ width: SELECTION_COLUMN_WIDTH }} />}\r\n {visibleColumns.map((col, i) => (\r\n <col key={col.id} style={{ width: computedWidths[i], minWidth: getMinWidthForColumn(col) }} />\r\n ))}\r\n {actions != null && <col style={{ width: actionsWidthPx }} />}\r\n </colgroup>\r\n <thead className={headerClassName}>\r\n <tr>\r\n {rowSelection && (\r\n <th className=\"dyn-table-th dyn-table-th--selection\" style={{ width: SELECTION_COLUMN_WIDTH }}>\r\n <SelectionHeaderCheckbox\r\n displayData={displayData}\r\n getRowKey={getRowKey}\r\n selectedSet={selectedSet}\r\n onToggleAll={toggleAllOnPage}\r\n />\r\n </th>\r\n )}\r\n {visibleColumns.map((col, i) => {\r\n const isSortable = sortable && col.sortable !== false && !col.suppressSort;\r\n const isSorted = sortState.id === col.id;\r\n const isDragging = draggedColId === col.id;\r\n const isDragOver = dragOverIndex === i;\r\n const thClass = [\r\n 'dyn-table-th',\r\n isSortable ? 'dyn-table-th--sortable' : '',\r\n isSorted ? 'dyn-table-th--sorted' : '',\r\n col.resizable ? 'dyn-table-th--resizable' : '',\r\n isDragging ? 'dyn-table-th--dragging' : '',\r\n isDragOver ? 'dyn-table-th--drag-over' : '',\r\n col.headerClass ?? '',\r\n ].filter(Boolean).join(' ');\r\n return (\r\n <th\r\n key={col.id}\r\n className={thClass}\r\n style={{\r\n width: computedWidths[i],\r\n minWidth: getMinWidthForColumn(col),\r\n maxWidth: parseWidth(col.maxWidth),\r\n textAlign: col.headerAlign ?? col.align ?? 'left',\r\n ...col.headerStyle,\r\n }}\r\n title={col.headerTooltip}\r\n onClick={() => isSortable && handleSort(col.id)}\r\n onDragOver={columnReorder && !isMobile ? (e) => handleColumnDragOver(e, i) : undefined}\r\n onDragLeave={columnReorder && !isMobile ? handleColumnDragLeave : undefined}\r\n onDrop={columnReorder && !isMobile ? (e) => handleColumnDrop(e, i) : undefined}\r\n >\r\n <span className=\"dyn-table-th__content\">\r\n {columnReorder && !isMobile && (\r\n <span\r\n className=\"dyn-table-th__drag-handle\"\r\n draggable\r\n onDragStart={(e) => handleColumnDragStart(e, col.id)}\r\n onDragEnd={handleColumnDragEnd}\r\n onClick={(e) => e.stopPropagation()}\r\n aria-label={`${col.id} kolonunu taşı`}\r\n >\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden>\r\n <path d=\"M8 6h2V4H8v2zm0 4h2V8H8v2zm0 4h2v-2H8v2zm4-8h2V4h-2v2zm0 4h2V8h-2v2zm0 4h2v-2h-2v2z\" />\r\n </svg>\r\n </span>\r\n )}\r\n {col.header}\r\n {isSortable && (\r\n <span className=\"dyn-table-sort\" aria-hidden>\r\n {isSorted && sortState.direction === 'asc' && (\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <path d=\"M7 15l5-5 5 5H7z\" />\r\n </svg>\r\n )}\r\n {isSorted && sortState.direction === 'desc' && (\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <path d=\"M7 10l5 5 5-5H7z\" />\r\n </svg>\r\n )}\r\n {!isSorted && (\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <path d=\"M7 15l5-5 5 5H7z\" />\r\n </svg>\r\n )}\r\n </span>\r\n )}\r\n </span>\r\n {col.resizable && (\r\n <ResizeHandle\r\n colId={col.id}\r\n minWidth={getMinWidthForColumn(col)}\r\n maxWidth={parseWidth(col.maxWidth)}\r\n startWidth={computedWidths[i]}\r\n onResize={(w) =>\r\n setColumnWidths((prev) => ({ ...prev, [col.id]: w }))\r\n }\r\n />\r\n )}\r\n </th>\r\n );\r\n })}\r\n {actions != null && (\r\n <th\r\n className=\"dyn-table-th dyn-table-th--actions\"\r\n style={{\r\n width: actionsWidthPx,\r\n minWidth: actionsWidthPx,\r\n textAlign: actionsAlign,\r\n }}\r\n >\r\n {actionsHeader}\r\n </th>\r\n )}\r\n </tr>\r\n </thead>\r\n <tbody className={bodyClassName}>\r\n {loading ? (\r\n Array.from({ length: skeletonRowCount }, (_, rowIdx) => (\r\n <tr key={`skeleton-${rowIdx}`} className=\"dyn-table-row--skeleton\" aria-busy>\r\n {rowSelection && (\r\n <td className=\"dyn-table-td dyn-table-td--selection\" style={{ width: SELECTION_COLUMN_WIDTH }}>\r\n <span className=\"dyn-table-skeleton dyn-table-skeleton--checkbox\" />\r\n </td>\r\n )}\r\n {visibleColumns.map((col, i) => (\r\n <td\r\n key={col.id}\r\n className=\"dyn-table-td\"\r\n style={{ width: computedWidths[i], minWidth: getMinWidthForColumn(col), textAlign: col.align ?? 'left' }}\r\n >\r\n <span className=\"dyn-table-skeleton\" />\r\n </td>\r\n ))}\r\n {actions != null && (\r\n <td className=\"dyn-table-td dyn-table-td--actions\" style={{ width: actionsWidthPx }} />\r\n )}\r\n </tr>\r\n ))\r\n ) : displayData.length === 0 ? (\r\n <tr>\r\n <td\r\n colSpan={\r\n visibleColumns.length +\r\n (actions != null ? 1 : 0) +\r\n (rowSelection ? 1 : 0)\r\n }\r\n className=\"dyn-table-empty\"\r\n >\r\n {emptyMessage}\r\n </td>\r\n </tr>\r\n ) : (\r\n displayData.map((row, index) => {\r\n const rowKey = getRowKey(row) as string | number;\r\n return (\r\n <tr\r\n key={rowKey}\r\n className={[\r\n typeof rowClassName === 'function'\r\n ? (rowClassName as (row: T, index: number) => string)(row, index)\r\n : (rowClassName ?? ''),\r\n rowSelection && selectedSet.has(rowKey) ? 'dyn-table-row--selected' : '',\r\n ].filter(Boolean).join(' ')}\r\n >\r\n {rowSelection && (\r\n <td className=\"dyn-table-td dyn-table-td--selection\" style={{ width: SELECTION_COLUMN_WIDTH }}>\r\n <label className=\"dyn-table-selection-cell\">\r\n <input\r\n type=\"checkbox\"\r\n checked={selectedSet.has(rowKey)}\r\n onChange={() => toggleRow(rowKey)}\r\n aria-label={`Satırı seç`}\r\n />\r\n </label>\r\n </td>\r\n )}\r\n {visibleColumns.map((col, i) => {\r\n const value = getCellValue(row, col);\r\n const display =\r\n col.cell != null\r\n ? col.cell(row)\r\n : col.valueFormatter != null\r\n ? col.valueFormatter(value, row)\r\n : col.valueFormat != null\r\n ? applyValueFormat(value, col.valueFormat, col.valueFormatOptions)\r\n : col.cellFormat != null\r\n ? renderCellFormat(col.cellFormat, value, row, col.cellFormatOptions)\r\n : (value as React.ReactNode);\r\n const cellClass =\r\n typeof col.cellClass === 'function'\r\n ? col.cellClass(row, value)\r\n : col.cellClass ?? '';\r\n const cellStyle =\r\n typeof col.cellStyle === 'function'\r\n ? col.cellStyle(row, value)\r\n : col.cellStyle ?? {};\r\n const tooltip = col.tooltip?.(row, value);\r\n const isPinnedLeft = col.pinned === 'left';\r\n const isPinnedRight = col.pinned === 'right';\r\n const tdClass = [\r\n 'dyn-table-td',\r\n isPinnedLeft ? 'dyn-table-td--pinned-left' : '',\r\n isPinnedRight ? 'dyn-table-td--pinned-right' : '',\r\n cellClass,\r\n ].filter(Boolean).join(' ');\r\n return (\r\n <td\r\n key={col.id}\r\n className={tdClass.trim()}\r\n style={{\r\n width: computedWidths[i],\r\n minWidth: getMinWidthForColumn(col),\r\n textAlign: col.align ?? 'left',\r\n ...(col.wrapText ? { whiteSpace: 'normal' } : {}),\r\n ...(isPinnedLeft && pinnedLeftOffsets[i] != null\r\n ? { left: pinnedLeftOffsets[i] }\r\n : {}),\r\n ...(isPinnedRight && pinnedRightOffsets[i] != null\r\n ? { right: pinnedRightOffsets[i] }\r\n : {}),\r\n ...cellStyle,\r\n }}\r\n title={tooltip}\r\n >\r\n {display}\r\n </td>\r\n );\r\n })}\r\n {actions != null && (\r\n <td\r\n className=\"dyn-table-td dyn-table-td--actions\"\r\n style={{ textAlign: actionsAlign }}\r\n >\r\n {actions(row)}\r\n </td>\r\n )}\r\n </tr>\r\n );\r\n })\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n )\r\n )}\r\n {pagination && totalCount > 0 && (\r\n <div className=\"dyn-table-pagination\">\r\n <div className=\"dyn-table-pagination__info\">\r\n {startRow}-{endRow} / {totalCount} kayıt\r\n </div>\r\n <div className=\"dyn-table-pagination__controls\">\r\n <select\r\n className=\"dyn-table-pagination__pagesize\"\r\n value={pageSize}\r\n onChange={(e) => {\r\n const next = Number(e.target.value);\r\n setPageSize(next);\r\n handlePageChange(1, next);\r\n }}\r\n aria-label=\"Sayfa başına kayıt\"\r\n >\r\n {pageSizeOptions.map((n) => (\r\n <option key={n} value={n}>\r\n {n}\r\n </option>\r\n ))}\r\n </select>\r\n <button\r\n type=\"button\"\r\n className=\"dyn-table-pagination__btn\"\r\n disabled={safePage <= 1}\r\n onClick={() => handlePageChange(safePage - 1, pageSize)}\r\n aria-label=\"Önceki sayfa\"\r\n >\r\n Önceki\r\n </button>\r\n <span className=\"dyn-table-pagination__page\">\r\n Sayfa {safePage} / {totalPages}\r\n </span>\r\n <button\r\n type=\"button\"\r\n className=\"dyn-table-pagination__btn\"\r\n disabled={safePage >= totalPages}\r\n onClick={() => handlePageChange(safePage + 1, pageSize)}\r\n aria-label=\"Sonraki sayfa\"\r\n >\r\n Sonraki\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["parseWidth","w","n","getCellValue","row","column","key","defaultLocale","toDate","value","s","d","applyValueFormat","format","options","locale","DEFAULT_LABELS","defaultActiveClass","defaultInactiveClass","StatusBadge","activeLabel","inactiveLabel","activeClass","inactiveClass","isActive","label","className","jsx","getLabelsForFormat","formatType","defaults","renderCellFormat","_row","DEFAULT_PAGE_SIZE_OPTIONS","DEFAULT_MIN_WIDTH","DEFAULT_FLEX_MIN","getMinWidthForColumn","col","ResizeHandle","colId","minWidth","maxWidth","startWidth","onResize","handleRef","React","onResizeRef","el","startX","startW","onMouseDown","e","onMouseMove","e2","delta","onMouseUp","SELECTION_COLUMN_WIDTH","SelectionHeaderCheckbox","displayData","getRowKey","selectedSet","onToggleAll","inputRef","pageKeys","r","allChecked","k","indeterminate","getComputedWidths","columns","tableWidth","columnWidths","actionsWidthPx","selectionWidthPx","hasFlex","flexTotal","c","fixedWidths","fixedSum","minPx","maxPx","override","remaining","result","distributed","i","raw","clamped","Table","data","keyExtractorProp","keyColumnId","sortable","defaultSort","onSort","emptyMessage","theme","headerClassName","bodyClassName","rowClassName","actions","actionsHeader","actionsAlign","actionsWidth","pagination","pageSizeProp","pageSizeOptions","pageProp","defaultPage","onPageChange","totalCountProp","onBlockNeeded","_blockSize","minHeight","height","mobileBreakpoint","rowSelection","selectedRowKeysProp","defaultSelectedRowKeys","onSelectionChange","selectionToolbarLabel","filterable","filterModelProp","defaultFilterModel","onFilterChange","filterPanelWidth","virtualization","rowHeight","virtualizationOverscan","columnVisibilityProp","onColumnVisibilityChange","columnOrderProp","onColumnOrderChange","columnReorder","loading","stickyHeader","index","scrollRef","setTableWidth","scrollContainerHeight","setScrollContainerHeight","scrollTop","setScrollTop","setColumnWidths","update","ro","isMobile","setIsMobile","mq","fn","sortState","setSortState","internalPage","setInternalPage","pageSize","setPageSize","isVisibilityControlled","internalVisibility","setInternalVisibility","acc","prev","next","currentVisibility","setVisibility","isOrderControlled","internalOrder","setInternalOrder","added","id","removed","id2","order","currentOrder","setOrder","isPageControlled","currentPage","handlePageChange","nextPage","nextPageSize","lastBlockNeededPageRef","needed","handleSort","visibleColumns","baseOrdered","x","left","center","right","filterableColumns","isFilterControlled","internalFilterModel","setInternalFilterModel","currentFilterModel","setFilterModel","filteredData","active","_","v","filterVal","cellVal","f","cv","fv","d1","d2","cStr","fStr","totalCount","isClientSide","totalPages","safePage","computedWidths","pinnedLeftOffsets","pinnedRightOffsets","leftAcc","rightAcc","sortedData","a","b","aVal","bVal","cmp","start","isSelectionControlled","internalSelectedKeys","setInternalSelectedKeys","selectedKeys","setSelectedKeys","rows","toggleRow","toggleAllOnPage","selectedRows","selectAll","clearSelection","selectionDropdownOpen","setSelectionDropdownOpen","selectionDropdownRef","onDocClick","filterPanelOpen","setFilterPanelOpen","columnVisibilityDropdownOpen","setColumnVisibilityDropdownOpen","columnVisibilityDropdownRef","toggleColumnVisibility","draggedColId","setDraggedColId","dragOverIndex","setDragOverIndex","handleColumnDragStart","th","handleColumnDragOver","handleColumnDragLeave","handleColumnDrop","dropIndex","draggedId","_a","fromIdx","dropTargetId","_b","toIdx","newOrder","newToIdx","handleColumnDragEnd","activeFilterCount","clearFilters","useVirtualization","useStickyHeader","virtualStart","virtualEnd","visibleCount","end","startRow","endRow","skeletonRowCount","getCellDisplay","themeClass","showToolbar","jsxs","Fragment","visible","headerLabel","opt","idx","rowKey","display","isSortable","isSorted","isPinnedLeft","isPinnedRight","isDragging","isDragOver","thClass","rowIdx","cellClass","cellStyle","tooltip","tdClass"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { Table } from './components/Table';
2
+ export type { TableProps, ColumnDef, SortDirection } from './components/Table';
package/dist/main.d.ts ADDED
@@ -0,0 +1 @@
1
+
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ .table-formatter-status{display:inline-block;padding:4px 10px;border-radius:6px;font-size:.8125rem;font-weight:500}.table-formatter-status--active{background:#dcfce7;color:#166534}.table-formatter-status--inactive{background:#f1f5f9;color:#64748b}.dyn-table-wrapper{--dyn-table-font: "Plus Jakarta Sans", system-ui, -apple-system, sans-serif;--dyn-table-radius: 2px;--dyn-table-header-font: 600;--dyn-table-transition: .15s ease;--dyn-table-row-selected-bg: #eff6ff;--dyn-table-row-selected-hover: #dbeafe;width:100%;border-radius:var(--dyn-table-radius);box-shadow:var(--dyn-table-shadow-lg);background:var(--dyn-table-row-bg);border:1px solid var(--dyn-table-border)}.dyn-table-toolbar{display:flex;align-items:center;gap:12px;padding:10px 16px;border-bottom:1px solid var(--dyn-table-border);background:var(--dyn-table-row-bg);font-size:.8125rem;min-height:44px}.dyn-table-toolbar__actions{display:flex;align-items:center;gap:8px;flex-shrink:0}.dyn-table-toolbar__btn{padding:6px 12px;border-radius:6px;border:1px solid var(--dyn-table-border);background:var(--dyn-table-row-bg);color:var(--dyn-table-text);font-size:.8125rem;font-weight:500;cursor:pointer;transition:background-color var(--dyn-table-transition),border-color var(--dyn-table-transition),color var(--dyn-table-transition)}.dyn-table-toolbar__btn:hover:not(:disabled){background:var(--dyn-table-row-hover);border-color:var(--dyn-table-header-border);color:var(--dyn-table-sort-active)}.dyn-table-toolbar__btn:disabled{opacity:.5;cursor:not-allowed}.dyn-table-toolbar__btn--filter{display:inline-flex;align-items:center;gap:6px}.dyn-table-toolbar__btn--filter-active{border-color:var(--dyn-table-sort-active);color:var(--dyn-table-sort-active)}.dyn-table-toolbar__filter-count{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:999px;background:var(--dyn-table-sort-active);color:#fff;font-size:.6875rem;font-weight:600}.dyn-table-toolbar__dropdown{position:relative}.dyn-table-toolbar__dropdown-trigger{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border-radius:6px;border:1px solid var(--dyn-table-border);background:var(--dyn-table-row-bg);color:var(--dyn-table-text);font-size:.8125rem;font-weight:500;cursor:pointer;transition:background-color var(--dyn-table-transition),border-color var(--dyn-table-transition)}.dyn-table-toolbar__dropdown-trigger:hover:not(:disabled){background:var(--dyn-table-row-hover);border-color:var(--dyn-table-header-border)}.dyn-table-toolbar__dropdown-trigger:disabled{opacity:.5;cursor:not-allowed}.dyn-table-toolbar__dropdown-chevron{flex-shrink:0;transition:transform var(--dyn-table-transition)}.dyn-table-toolbar__dropdown-chevron--open{transform:rotate(180deg)}.dyn-table-toolbar__dropdown-panel{position:absolute;top:calc(100% + 4px);left:0;z-index:10;min-width:200px;max-width:320px;max-height:280px;overflow-y:auto;border-radius:8px;border:1px solid var(--dyn-table-border);background:var(--dyn-table-row-bg);box-shadow:var(--dyn-table-shadow-lg)}.dyn-table-toolbar__dropdown-list{list-style:none;margin:0;padding:6px 0}.dyn-table-toolbar__dropdown-item{display:flex;align-items:center;gap:8px;padding:8px 12px;font-size:.8125rem;color:var(--dyn-table-text);transition:background-color var(--dyn-table-transition)}.dyn-table-toolbar__dropdown-item:hover{background:var(--dyn-table-row-hover)}.dyn-table-toolbar__dropdown-item-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dyn-table-toolbar__dropdown-item-remove{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;border:none;border-radius:4px;background:transparent;color:var(--dyn-table-text-muted);cursor:pointer;flex-shrink:0;transition:background-color var(--dyn-table-transition),color var(--dyn-table-transition)}.dyn-table-toolbar__dropdown-item-remove:hover{background:var(--dyn-table-border);color:var(--dyn-table-text)}.dyn-table-toolbar__dropdown-panel--columns{min-width:200px;max-height:320px}.dyn-table-column-visibility__header{padding:8px 12px 4px;font-size:.6875rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--dyn-table-text-muted);border-bottom:1px solid var(--dyn-table-border)}.dyn-table-toolbar__dropdown-item--checkbox{padding:6px 12px}.dyn-table-column-visibility__label{display:flex;align-items:center;gap:8px;width:100%;cursor:pointer;font-size:.8125rem;color:var(--dyn-table-text)}.dyn-table-column-visibility__label input{flex-shrink:0}.dyn-table-toolbar--mobile{padding:8px 12px;min-height:40px;flex-wrap:wrap;gap:8px}.dyn-table-toolbar--mobile .dyn-table-toolbar__actions{flex-wrap:wrap;flex:1;min-width:0;gap:6px}.dyn-table-toolbar--mobile .dyn-table-toolbar__btn{padding:6px 10px;font-size:.75rem}.dyn-table-toolbar--mobile .dyn-table-toolbar__btn--filter .dyn-table-toolbar__btn-label{display:none}.dyn-table-toolbar--mobile .dyn-table-toolbar__dropdown-trigger{padding:6px 8px;font-size:.75rem}.dyn-table-toolbar--mobile .dyn-table-toolbar__dropdown-trigger span{max-width:60px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dyn-table-toolbar--mobile .dyn-table-toolbar__dropdown-panel{left:auto;right:0;min-width:100%;max-width:min(320px,100vw);max-height:60vh}.dyn-table-scroll{width:100%;overflow-x:auto}.dyn-table-scroll--virtualized{overflow-y:auto}.dyn-table-scroll--virtualized .dyn-table thead th,.dyn-table-scroll--sticky-header .dyn-table thead th{position:sticky;top:0;z-index:3;background:var(--dyn-table-header-bg);box-shadow:0 1px 0 var(--dyn-table-header-border)}.dyn-table-scroll--sticky-header{overflow-y:auto}.dyn-table-virtual-spacer td{pointer-events:none;background:transparent!important}.dyn-table-main{position:relative;width:100%;overflow:hidden}.dyn-table-main__content{width:100%}.dyn-table-filter-overlay{position:absolute;top:0;right:0;bottom:0;left:0;z-index:5;background:#00000040;cursor:pointer}.dyn-table-filter-panel{position:absolute;top:0;right:0;bottom:0;z-index:10;display:flex;flex-direction:column;background:var(--dyn-table-row-bg);border-left:1px solid var(--dyn-table-border);box-shadow:-4px 0 24px #0000001f;transform:translate(100%);transition:transform .25s ease;overflow:hidden}.dyn-table-filter-panel--open{transform:translate(0)}.dyn-table-filter-panel__header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px;border-bottom:1px solid var(--dyn-table-border);background:var(--dyn-table-row-alt);flex-shrink:0}.dyn-table-filter-panel__title{margin:0;font-size:.9375rem;font-weight:600;color:var(--dyn-table-header-text)}.dyn-table-filter-panel__close{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:none;border-radius:6px;background:transparent;color:var(--dyn-table-text-muted);cursor:pointer;transition:background-color var(--dyn-table-transition),color var(--dyn-table-transition)}.dyn-table-filter-panel__close:hover{background:var(--dyn-table-border);color:var(--dyn-table-text)}.dyn-table-filter-panel__body{flex:1;overflow-y:auto;padding:12px 16px}.dyn-table-filter-panel__clear{width:100%;margin-bottom:12px;padding:8px 12px;border-radius:6px;border:1px solid var(--dyn-table-border);background:transparent;color:var(--dyn-table-text-muted);font-size:.8125rem;cursor:pointer;transition:background-color var(--dyn-table-transition),color var(--dyn-table-transition)}.dyn-table-filter-panel__clear:hover{background:var(--dyn-table-row-hover);color:var(--dyn-table-text)}.dyn-table-filter-panel__item{margin-bottom:14px}.dyn-table-filter-panel__item:last-child{margin-bottom:0}.dyn-table-filter-panel__label{display:block;margin-bottom:6px;font-size:.75rem;font-weight:500;color:var(--dyn-table-text-muted)}.dyn-table-filter-panel__input,.dyn-table-filter-panel__select{width:90%;padding:8px 10px;border-radius:6px;border:1px solid var(--dyn-table-border);background:var(--dyn-table-row-bg);color:var(--dyn-table-text);font-size:.8125rem;transition:border-color var(--dyn-table-transition)}.dyn-table-filter-panel__input:focus,.dyn-table-filter-panel__select:focus{outline:none;border-color:var(--dyn-table-sort-active)}.dyn-table-filter-panel__input::placeholder{color:var(--dyn-table-text-muted)}.dyn-table-wrapper--light{--dyn-table-header-bg: linear-gradient(180deg, #e2e8f0 0%, #cbd5e1 100%);--dyn-table-header-text: #0f172a;--dyn-table-header-border: #94a3b8;--dyn-table-header-hover: #cbd5e1;--dyn-table-header-sort: #3b82f6;--dyn-table-border: #e2e8f0;--dyn-table-row-bg: #ffffff;--dyn-table-row-hover: #f8fafc;--dyn-table-row-alt: #f1f5f9;--dyn-table-row-selected-bg: #eff6ff;--dyn-table-row-selected-hover: #dbeafe;--dyn-table-text: #334155;--dyn-table-text-muted: #64748b;--dyn-table-shadow: 0 1px 3px rgba(0, 0, 0, .06);--dyn-table-shadow-lg: 0 4px 6px -1px rgba(0, 0, 0, .07), 0 2px 4px -2px rgba(0, 0, 0, .05);--dyn-table-sort-active: #2563eb;--dyn-table-sort-inactive: #94a3b8}.dyn-table-wrapper--light .dyn-table-toolbar{background:#fafbfc;border-bottom:1px solid #e5e7eb;padding:12px 20px;min-height:48px;gap:10px}.dyn-table-wrapper--light .dyn-table-toolbar__btn{background:#fff;border:1px solid #e5e7eb;color:#374151;font-weight:500;padding:8px 14px;border-radius:8px;font-size:.8125rem;box-shadow:0 1px 2px #0000000a;transition:background-color var(--dyn-table-transition),border-color var(--dyn-table-transition),color var(--dyn-table-transition),box-shadow var(--dyn-table-transition)}.dyn-table-wrapper--light .dyn-table-toolbar__btn:hover:not(:disabled){background:#fff;border-color:#d1d5db;color:#2563eb;box-shadow:0 1px 3px #0000000f}.dyn-table-wrapper--light .dyn-table-toolbar__btn--filter-active{background:#eff6ff;border-color:#3b82f6;color:#2563eb;box-shadow:0 1px 2px #3b82f633}.dyn-table-wrapper--light .dyn-table-toolbar__filter-count{background:#2563eb;color:#fff;font-weight:600;min-width:20px;height:20px;font-size:.6875rem}.dyn-table-wrapper--light .dyn-table-toolbar__dropdown-trigger{background:#fff;border:1px solid #e5e7eb;color:#374151;padding:8px 12px;border-radius:8px;font-weight:500;box-shadow:0 1px 2px #0000000a;transition:background-color var(--dyn-table-transition),border-color var(--dyn-table-transition),color var(--dyn-table-transition),box-shadow var(--dyn-table-transition)}.dyn-table-wrapper--light .dyn-table-toolbar__dropdown-trigger:hover:not(:disabled){background:#fff;border-color:#d1d5db;color:#111827;box-shadow:0 1px 3px #0000000f}.dyn-table-wrapper--light .dyn-table-toolbar__dropdown-trigger--open,.dyn-table-wrapper--light .dyn-table-toolbar__dropdown-trigger[aria-expanded=true]{background:#f9fafb;border-color:#d1d5db;box-shadow:0 1px 3px #0000000f}.dyn-table-wrapper--light .dyn-table-toolbar__dropdown-panel{border:1px solid #e5e7eb;border-radius:10px;box-shadow:0 4px 6px -1px #00000012,0 10px 20px -5px #00000014;background:#fff}.dyn-table-wrapper--light .dyn-table-toolbar__dropdown-item:hover{background:#f3f4f6}.dyn-table-wrapper--light .dyn-table-column-visibility__header{color:#64748b;border-bottom-color:#e2e8f0}.dyn-table-wrapper--dark{--dyn-table-header-bg: linear-gradient(180deg, #0f172a 0%, #020617 100%);--dyn-table-header-text: #f1f5f9;--dyn-table-header-border: rgba(255, 255, 255, .06);--dyn-table-header-hover: rgba(255, 255, 255, .08);--dyn-table-header-sort: #93c5fd;--dyn-table-border: #334155;--dyn-table-row-bg: #1e293b;--dyn-table-row-hover: #334155;--dyn-table-row-alt: #0f172a;--dyn-table-row-selected-bg: rgba(59, 130, 246, .2);--dyn-table-row-selected-hover: rgba(59, 130, 246, .28);--dyn-table-text: #e2e8f0;--dyn-table-text-muted: #94a3b8;--dyn-table-shadow: 0 1px 3px rgba(0, 0, 0, .3);--dyn-table-shadow-lg: 0 4px 6px -1px rgba(0, 0, 0, .3), 0 2px 4px -2px rgba(0, 0, 0, .2);--dyn-table-sort-active: #93c5fd;--dyn-table-sort-inactive: #64748b}.dyn-table{width:100%;border-collapse:collapse;font-family:var(--dyn-table-font);font-size:.875rem;line-height:1.5;color:var(--dyn-table-text)}.dyn-table--fixed{table-layout:fixed}.dyn-table thead{position:relative}.dyn-table thead tr{background:var(--dyn-table-header-bg);border-bottom:1px solid var(--dyn-table-header-border)}.dyn-table-th{padding:10px 12px;text-align:left;font-weight:var(--dyn-table-header-font);color:var(--dyn-table-header-text);white-space:nowrap;letter-spacing:.01em;position:relative;transition:background-color var(--dyn-table-transition),color var(--dyn-table-transition)}.dyn-table-th--resizable{padding-right:22px}.dyn-table-resize-handle{position:absolute;top:6px;right:0;width:9px;height:75%;cursor:col-resize;-webkit-user-select:none;user-select:none;z-index:1}.dyn-table-resize-handle:after{content:"";position:absolute;top:25%;right:4px;width:2px;height:50%;background:var(--dyn-table-header-border);border-radius:1px;opacity:.5;transition:opacity var(--dyn-table-transition),background-color var(--dyn-table-transition)}.dyn-table-th--resizable:hover .dyn-table-resize-handle:after,.dyn-table-resize-handle:hover:after{opacity:.9;background:var(--dyn-table-sort-active)}body.dyn-table-resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}body.dyn-table-resizing *{cursor:col-resize!important}.dyn-table-th--selection,.dyn-table-td--selection{width:44px;min-width:44px;max-width:44px;padding:8px 16px;text-align:center;vertical-align:middle;cursor:default;position:sticky;left:0;z-index:1;background:var(--dyn-table-header-bg)}.dyn-table-th--selection{z-index:2;border-right:1px solid var(--dyn-table-header-border)}.dyn-table-td--selection{background:var(--dyn-table-row-bg)}.dyn-table tbody tr:nth-child(2n) .dyn-table-td--selection{background:var(--dyn-table-row-alt)}.dyn-table tbody tr:hover .dyn-table-td--selection{background:var(--dyn-table-row-hover)}.dyn-table tbody tr.dyn-table-row--selected .dyn-table-td--selection{background:var(--dyn-table-row-selected-bg)}.dyn-table tbody tr.dyn-table-row--selected:hover .dyn-table-td--selection{background:var(--dyn-table-row-selected-hover)}.dyn-table-selection-header,.dyn-table-selection-cell{display:inline-flex;align-items:center;justify-content:center;cursor:pointer;margin:0}.dyn-table-selection-header input,.dyn-table-selection-cell input{width:16px;height:16px;cursor:pointer;accent-color:var(--dyn-table-sort-active)}.dyn-table-th:first-child:not(.dyn-table-th--selection),.dyn-table-td:first-child:not(.dyn-table-td--selection){padding-left:16px}.dyn-table-th--selection+.dyn-table-th,.dyn-table-td--selection+.dyn-table-td{padding-left:16px}.dyn-table-th:first-child:not(.dyn-table-th--selection){border-radius:var(--dyn-table-radius) 0 0 0}.dyn-table-th:last-child{padding-right:16px}.dyn-table-th--actions{cursor:default;background:var(--dyn-table-header-bg);position:sticky;right:0;z-index:2;box-shadow:-4px 0 8px -2px #0000000f}.dyn-table-td--actions{position:sticky;right:0;z-index:1;box-shadow:-4px 0 8px -2px #0000000a}.dyn-table tbody tr:nth-child(odd) .dyn-table-td--actions{background:var(--dyn-table-row-bg)}.dyn-table tbody tr:nth-child(2n) .dyn-table-td--actions{background:var(--dyn-table-row-alt)}.dyn-table tbody tr:hover .dyn-table-td--actions{background:var(--dyn-table-row-hover)}.dyn-table-th--pinned-left,.dyn-table-td--pinned-left{position:sticky;z-index:1;background:var(--dyn-table-header-bg);box-shadow:4px 0 8px -2px #0000000f}.dyn-table-td--pinned-left{background:var(--dyn-table-row-bg)}.dyn-table tbody tr:nth-child(2n) .dyn-table-td--pinned-left{background:var(--dyn-table-row-alt)}.dyn-table tbody tr:hover .dyn-table-td--pinned-left{background:var(--dyn-table-row-hover)}.dyn-table-th--pinned-left{z-index:2}.dyn-table-th--pinned-right,.dyn-table-td--pinned-right{position:sticky;z-index:1;background:var(--dyn-table-header-bg);box-shadow:-4px 0 8px -2px #0000000f}.dyn-table-td--pinned-right{background:var(--dyn-table-row-bg)}.dyn-table tbody tr:nth-child(2n) .dyn-table-td--pinned-right{background:var(--dyn-table-row-alt)}.dyn-table tbody tr:hover .dyn-table-td--pinned-right{background:var(--dyn-table-row-hover)}.dyn-table-th--pinned-right{z-index:2}.dyn-table-th--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.dyn-table-th--sortable:hover{background:var(--dyn-table-header-hover);color:var(--dyn-table-header-sort)}.dyn-table-th__content{display:inline-flex;align-items:center;gap:8px}.dyn-table-th__drag-handle{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border-radius:4px;color:var(--dyn-table-text-muted);cursor:grab;flex-shrink:0;opacity:.7;transition:background-color var(--dyn-table-transition),color var(--dyn-table-transition),opacity var(--dyn-table-transition)}.dyn-table-th__drag-handle svg{width:24px;height:24px;flex-shrink:0;margin-top:8px}.dyn-table-th__drag-handle:hover{color:var(--dyn-table-header-text);background:var(--dyn-table-row-hover);opacity:1}.dyn-table-th__drag-handle:active{cursor:grabbing;background:var(--dyn-table-border)}.dyn-table-th--dragging{opacity:.6}.dyn-table-th--drag-over{box-shadow:inset 0 0 0 2px var(--dyn-table-sort-active)}.dyn-table-skeleton{display:inline-block;min-width:40px;min-height:14px;border-radius:4px;background:linear-gradient(90deg,var(--dyn-table-border) 0%,var(--dyn-table-row-hover) 50%,var(--dyn-table-border) 100%);background-size:200% 100%;animation:dyn-table-skeleton-shimmer 1.2s ease-in-out infinite}.dyn-table-skeleton--checkbox{display:inline-block;width:16px;height:16px;min-width:16px;min-height:16px;border-radius:3px}.dyn-table-row--skeleton .dyn-table-td{vertical-align:middle}.dyn-table-row--skeleton .dyn-table-skeleton{width:60%;max-width:120px}.dyn-table-card--skeleton .dyn-table-card__value .dyn-table-skeleton{width:70%;max-width:100px}@keyframes dyn-table-skeleton-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.dyn-table-sort{display:inline-flex;flex-direction:column;align-items:center;justify-content:center;width:18px;height:18px;margin-left:2px;flex-shrink:0;opacity:.6;transition:opacity var(--dyn-table-transition)}.dyn-table-th--sortable:hover .dyn-table-sort,.dyn-table-th--sortable.dyn-table-th--sorted .dyn-table-sort{opacity:1}.dyn-table-th--sortable.dyn-table-th--sorted .dyn-table-sort{color:var(--dyn-table-header-sort)}.dyn-table-sort svg{width:14px;height:14px}.dyn-table tbody tr{transition:background-color var(--dyn-table-transition);border-bottom:1px solid var(--dyn-table-border)}.dyn-table tbody tr:last-child{border-bottom:none}.dyn-table tbody tr:hover{background:var(--dyn-table-row-hover)}.dyn-table-td{padding:10px 12px;transition:background-color var(--dyn-table-transition);vertical-align:middle}.dyn-table tbody tr:nth-child(odd) .dyn-table-td{background:var(--dyn-table-row-bg)}.dyn-table tbody tr:nth-child(2n) .dyn-table-td{background:var(--dyn-table-row-alt)}.dyn-table tbody tr:hover .dyn-table-td{background:var(--dyn-table-row-hover)}.dyn-table tbody tr.dyn-table-row--selected .dyn-table-td{background:var(--dyn-table-row-selected-bg)}.dyn-table tbody tr.dyn-table-row--selected:hover .dyn-table-td{background:var(--dyn-table-row-selected-hover)}.dyn-table-td:first-child{padding-left:16px}.dyn-table-td:last-child{padding-right:16px}.dyn-table-empty{text-align:center;color:var(--dyn-table-text-muted);padding:48px 24px;font-size:.9375rem;background:var(--dyn-table-row-bg)}.dyn-table-empty td{border:none;background:var(--dyn-table-row-bg)!important}.dyn-table-scroll::-webkit-scrollbar{height:8px}.dyn-table-scroll::-webkit-scrollbar-track{background:#f1f5f9;border-radius:4px}.dyn-table-scroll::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:4px}.dyn-table-scroll::-webkit-scrollbar-thumb:hover{background:#94a3b8}.dyn-table-pagination{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:12px;padding:12px 16px;border-top:1px solid var(--dyn-table-border);background:var(--dyn-table-row-bg);font-size:.8125rem;color:var(--dyn-table-text)}.dyn-table-pagination__info{color:var(--dyn-table-text-muted)}.dyn-table-pagination__controls{display:flex;align-items:center;gap:10px}.dyn-table-pagination__pagesize{padding:6px 8px;border-radius:6px;border:1px solid var(--dyn-table-border);background:var(--dyn-table-row-bg);color:var(--dyn-table-text);font-size:.8125rem;cursor:pointer}.dyn-table-pagination__btn{padding:6px 12px;border-radius:6px;border:1px solid var(--dyn-table-border);background:var(--dyn-table-row-bg);color:var(--dyn-table-text);font-size:.8125rem;cursor:pointer;transition:background-color var(--dyn-table-transition),border-color var(--dyn-table-transition)}.dyn-table-pagination__btn:hover:not(:disabled){background:var(--dyn-table-row-hover);border-color:#cbd5e1}.dyn-table-pagination__btn:disabled{opacity:.5;cursor:not-allowed}.dyn-table-pagination__page{color:var(--dyn-table-text-muted);min-width:80px;text-align:center}@media (max-width: 768px){.dyn-table-pagination{flex-direction:column;align-items:stretch;gap:8px;padding:10px 8px}.dyn-table-pagination__info{text-align:center;font-size:.75rem}.dyn-table-pagination__controls{flex-wrap:wrap;justify-content:center;gap:6px}.dyn-table-pagination__pagesize{min-height:32px;padding:5px 8px;font-size:.75rem;max-width:72px}.dyn-table-pagination__btn{min-height:32px;padding:5px 10px;font-size:.75rem}.dyn-table-pagination__page{width:100%;min-width:0;order:-1;margin-bottom:2px;font-size:.75rem}}.dyn-table-mobile{width:100%}.dyn-table-cards{display:flex;flex-direction:column;gap:12px;padding:10px}.dyn-table-card{background:var(--dyn-table-row-bg);border:1px solid var(--dyn-table-border);border-radius:10px;padding:14px 16px;box-shadow:var(--dyn-table-shadow)}.dyn-table-card__selection{margin-bottom:8px;padding-bottom:8px;border-bottom:1px solid var(--dyn-table-border)}.dyn-table-card__selection .dyn-table-selection-cell input{width:18px;height:18px}.dyn-table-card__row{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;padding:8px 0;border-bottom:1px solid var(--dyn-table-border);font-size:.875rem}.dyn-table-card__row:last-of-type{border-bottom:none}.dyn-table-card__label{font-weight:600;color:var(--dyn-table-header-text);flex-shrink:0;min-width:100px}.dyn-table-card__value{color:var(--dyn-table-text);text-align:right;word-break:break-word}.dyn-table-card__actions{display:flex;justify-content:flex-end;gap:8px;margin-top:12px;padding-top:12px;border-top:1px solid var(--dyn-table-border)}.dyn-table-empty--card{padding:32px 16px;text-align:center;color:var(--dyn-table-text-muted);font-size:.9375rem}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "koddiv-dyn-table",
3
+ "version": "0.1.2",
4
+ "description": "React tabanlı dinamik, tam fonksiyonlu tablo komponenti (AG Grid tarzı)",
5
+ "type": "module",
6
+ "main": "./dist/dyn-table.umd.cjs",
7
+ "module": "./dist/dyn-table.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/dyn-table.js",
12
+ "require": "./dist/dyn-table.umd.cjs",
13
+ "types": "./dist/index.d.ts"
14
+ },
15
+ "./dist/style.css": "./dist/style.css"
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "keywords": [
21
+ "react",
22
+ "table",
23
+ "data-grid",
24
+ "ag-grid",
25
+ "pagination",
26
+ "sort",
27
+ "filter",
28
+ "virtualization"
29
+ ],
30
+ "license": "MIT",
31
+ "repository": {
32
+ "type": "git",
33
+ "url": ""
34
+ },
35
+ "scripts": {
36
+ "dev": "vite",
37
+ "build": "vite build",
38
+ "preview": "vite preview"
39
+ },
40
+ "peerDependencies": {
41
+ "react": ">=18.0.0",
42
+ "react-dom": ">=18.0.0"
43
+ },
44
+ "devDependencies": {
45
+ "@types/react": "^18.2.0",
46
+ "@types/react-dom": "^18.2.0",
47
+ "@vitejs/plugin-react": "^4.2.0",
48
+ "react": "^18.2.0",
49
+ "react-dom": "^18.2.0",
50
+ "typescript": "^5.3.0",
51
+ "vite": "^5.0.0",
52
+ "vite-plugin-dts": "^3.7.0"
53
+ },
54
+ "publishConfig": {
55
+ "access": "public"
56
+ }
57
+ }