@alneas/appkit-react 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/consumer-ai/api-index.json +10 -42
- package/consumer-ai/package-context.json +2 -2
- package/dist/ai/generative-ui/GenerativeUIRenderer.cjs.map +1 -1
- package/dist/ai/generative-ui/GenerativeUIRenderer.d.cts +5 -5
- package/dist/ai/generative-ui/GenerativeUIRenderer.d.ts +5 -5
- package/dist/ai/generative-ui/GenerativeUIRenderer.js.map +1 -1
- package/dist/consumer-ai/api-index.json +10 -42
- package/dist/consumer-ai/package-context.json +2 -2
- package/dist/tools/components/data-table/data-table.cjs +1 -1
- package/dist/tools/components/data-table/data-table.cjs.map +1 -1
- package/dist/tools/components/data-table/data-table.js +241 -240
- package/dist/tools/components/data-table/data-table.js.map +1 -1
- package/dist/tools/components/kanban/kanban-primitives.cjs +1 -1
- package/dist/tools/components/kanban/kanban-primitives.cjs.map +1 -1
- package/dist/tools/components/kanban/kanban-primitives.d.cts +2 -2
- package/dist/tools/components/kanban/kanban-primitives.d.ts +2 -2
- package/dist/tools/components/kanban/kanban-primitives.js +49 -48
- package/dist/tools/components/kanban/kanban-primitives.js.map +1 -1
- package/dist/tools/components/ui/dnd/Draggable.cjs +1 -1
- package/dist/tools/components/ui/dnd/Draggable.cjs.map +1 -1
- package/dist/tools/components/ui/dnd/Draggable.js +14 -13
- package/dist/tools/components/ui/dnd/Draggable.js.map +1 -1
- package/dist/tools/components/ui/dnd/use-accessible-drag-ref.cjs +2 -0
- package/dist/tools/components/ui/dnd/use-accessible-drag-ref.cjs.map +1 -0
- package/dist/tools/components/ui/dnd/use-accessible-drag-ref.d.cts +8 -0
- package/dist/tools/components/ui/dnd/use-accessible-drag-ref.d.ts +8 -0
- package/dist/tools/components/ui/dnd/use-accessible-drag-ref.js +27 -0
- package/dist/tools/components/ui/dnd/use-accessible-drag-ref.js.map +1 -0
- package/docs/migration.md +24 -4
- package/docs/tools.md +8 -0
- package/llms-full.txt +32 -4
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-table.js","names":["React","m.dataTable_noResults","FilterIcon","m.dataTable_items","m.dataTable_filterPlaceholder","m.dataTable_view","m.dataTable_toggleColumns","m.dataTable_rowsSelected","m.dataTable_rowsPerPage","m.dataTable_page","m.dataTable_goToFirstPage","m.dataTable_goToPreviousPage","m.dataTable_goToNextPage","m.dataTable_goToLastPage","_Fragment","datatable_filterplaceholder2","datatable_gotofirstpage4","datatable_gotolastpage4","datatable_gotonextpage4","datatable_gotopreviouspage4","datatable_items1","datatable_noresults2","datatable_page1","datatable_rowsperpage3","datatable_rowsselected2","datatable_togglecolumns2","datatable_view1","React$1","DataTableColumnHeader","canReorder","enableColumnOrdering","header","useSortable","sortableIndex","sortableGroup","registeredIds","closestCenter","canSort","sortDirection","isSorted","SortLabel","style","isDragging","TableHead","ref","cn","enableMultiSort","handleRef","GripVertical","event","flexRender","jsx","ChevronUp","ChevronDown","sortIndex","DataTable","controlledSorting","controlledPagination","getTableSettings","useDataTableStore","state","setTableSettings","hasHydrated","mounted","filterOpen","setFilterOpen","defaultFilterOpen","localSorting","setLocalSorting","columnFilters","setColumnFilters","columnVisibility","setColumnVisibility","rowSelection","setRowSelection","localPagination","setLocalPagination","columnOrder","setColumnOrder","getLeafColumnIds","columns","isPaginationControlled","sorting","pagination","setSorting","next","updater","onSortingChange","setPagination","onPaginationChange","settingsLoaded","setSettingsLoaded","columnIdListKey","showRowNumber","validColumnIds","loadKey","storageKey","storedSettings","validSorting","s","validVisibility","key","value","prev","validStoredOrder","id","storedOrderSet","newColumns","mergedOrder","rowNumberColumn","tableInstance","paginationState","row","columnsWithRowNumber","cols","enableSortingByDefault","col","getRowId","rowIdField","obj","originalRow","manualFiltering","onColumnFiltersChange","table","useTable","dataTableFeatures","manualPagination","pageCount","rowCount","index","onSelectionChange","dragSnapshot","handleDragStart","source","column","handleDragEnd","snapshot","target","isSortable","leafIds","group","reorderVisibleColumns","order","getSortIndex","columnId","renderTable","DragDropProvider","defaults","sensor","PointerSensor","PointerActivationConstraints","Feedback","tableClassName","Table","TableHeader","headerGroup","TableRow","TableBody","onRowClick","TableCell","cell","renderLoadingTable","variant","containerClassName","DataTablePagination","onAdd","Button","Plus","DataTableViewOptions","filterContent","filterLayout","Filter","DataTablePaginationCompact","itemCount","activeFiltersContent","filterColumn","Input","DropdownMenu","DropdownMenuTrigger","buttonVariants","Settings2","DropdownMenuContent","DropdownMenuGroup","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuCheckboxItem","e","pageSizeOptions","pageSize","ChevronsLeft","ChevronLeft","ChevronRight","ChevronsRight","totalPages","Fragment"],"sources":["../../../../src/tools/components/data-table/data-table.tsx"],"sourcesContent":["/**\n * @fileoverview DataTable component with sorting, pagination, and persistence\n *\n * A feature-rich data table built on TanStack Table with:\n * - Three layout variants: default, toolbar, minimal\n * - Single and multi-column sorting\n * - Column reordering via drag-and-drop\n * - Column visibility toggle\n * - Settings persistence via Zustand store\n * - Row selection and click handling\n * - Server-side pagination/sorting support\n *\n * @module data-table/data-table\n */\n\nimport * as React from 'react';\nimport {\n ColumnDef,\n ColumnFiltersState,\n SortingState,\n VisibilityState,\n ColumnOrderState,\n PaginationState,\n flexRender,\n useTable,\n dataTableFeatures,\n Table as TableInstance,\n Header,\n} from './table-engine';\nimport * as m from '../../paraglide/messages.js';\n\nimport { DragDropProvider, type DragStartEvent, type DragEndEvent } from '@dnd-kit/react';\nimport { useSortable, isSortable } from '@dnd-kit/react/sortable';\nimport { PointerSensor, PointerActivationConstraints, Feedback } from '@dnd-kit/dom';\nimport { closestCenter } from '@dnd-kit/collision';\nimport { reorderVisibleColumns, getLeafColumnIds } from './column-order';\n\nimport { cn } from \"../../lib/utils\";\nimport { Button, buttonVariants } from '../ui/button';\nimport { Input } from '../ui/input';\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../ui/table';\n\nimport {\n ChevronLeft,\n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n Settings2,\n GripVertical,\n Plus,\n ChevronUp,\n ChevronDown,\n Filter as FilterIcon,\n} from 'lucide-react';\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuTrigger,\n DropdownMenuSeparator,\n DropdownMenuLabel,\n DropdownMenuGroup,\n} from '../ui/dropdown-menu';\n\nimport { useDataTableStore } from './table-store';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * テーブルレイアウトのバリアント\n * Table layout variants\n */\nexport type DataTableVariant = 'default' | 'toolbar' | 'minimal';\n\n// =============================================================================\n// Sortable Header Component\n// =============================================================================\n\ninterface DataTableColumnHeaderProps<\n TData extends object,\n TValue,\n> extends React.HTMLAttributes<HTMLTableCellElement> {\n header: Header<TData, TValue>;\n enableColumnOrdering?: boolean;\n enableMultiSort?: boolean;\n sortIndex?: number;\n sortableIndex: number;\n sortableGroup: string;\n registeredIds: string[];\n}\n\nfunction DataTableColumnHeader<TData extends object, TValue>({\n header,\n enableColumnOrdering = true,\n enableMultiSort = false,\n sortIndex,\n sortableIndex, sortableGroup, registeredIds,\n}: DataTableColumnHeaderProps<TData, TValue>) {\n const canReorder = enableColumnOrdering && !header.isPlaceholder && header.column.columns.length === 0;\n const { ref, handleRef, isDragging } = useSortable({\n id: header.id,\n index: sortableIndex,\n group: sortableGroup,\n type: sortableGroup,\n accept: sortableGroup,\n data: {columnId: header.column.id, groupId: sortableGroup, columnIds: registeredIds},\n disabled: !canReorder,\n collisionDetector: closestCenter,\n });\n\n const canSort = header.column.getCanSort();\n const sortDirection = header.column.getIsSorted();\n const isSorted = sortDirection !== false;\n const SortLabel = canSort && typeof header.column.columnDef.header !== 'function' ? 'button' : 'span';\n\n const style: React.CSSProperties = enableColumnOrdering\n ? {\n opacity: isDragging ? 0.8 : 1,\n zIndex: isDragging ? 1 : 0,\n position: 'relative',\n cursor: 'move',\n }\n : {};\n\n const handleSort = (e: React.MouseEvent) => {\n if (!canSort || (e.target as HTMLElement).closest('button, input, select, [role=checkbox]')) return;\n if (enableMultiSort && e.shiftKey) {\n header.column.toggleSorting(undefined, true);\n } else {\n header.column.toggleSorting();\n }\n };\n\n return (\n <TableHead\n ref={canReorder ? ref : undefined}\n colSpan={header.colSpan}\n aria-hidden={header.isPlaceholder || undefined}\n style={style}\n aria-sort={canSort ? (sortDirection === 'asc' ? 'ascending' : sortDirection === 'desc' ? 'descending' : 'none') : undefined}\n className={cn(\n 'bg-primary/10 text-primary font-bold border-b border-primary/20',\n canSort && 'cursor-pointer select-none hover:bg-primary/20 transition-colors',\n )}\n onClick={canSort ? handleSort : undefined}\n >\n {canReorder && <button\n type='button' ref={handleRef}\n aria-label={`Reorder column ${header.column.id}`}\n className='inline-flex h-6 w-6 items-center justify-center cursor-grab'\n ><GripVertical className='h-3 w-3' aria-hidden='true' /></button>}\n {header.isPlaceholder ? null : (\n <span className='inline-flex items-center gap-1'>\n <SortLabel className={cn(isSorted && 'font-semibold')}\n {...(SortLabel === 'button' ? { type: 'button' as const, onClick: (event: React.MouseEvent) => {\n event.stopPropagation();\n header.column.toggleSorting(undefined, enableMultiSort && event.shiftKey);\n } } : {})}\n >\n {flexRender(header.column.columnDef.header, header.getContext())}\n </SortLabel>\n {/* Only show sort indicator when column is actively sorted */}\n {isSorted && (\n <span className='inline-flex items-center text-xs'>\n {sortDirection === 'asc' ? (\n <ChevronUp className='h-3.5 w-3.5' />\n ) : (\n <ChevronDown className='h-3.5 w-3.5' />\n )}\n {enableMultiSort && sortIndex !== undefined && sortIndex >= 0 && (\n <span className='text-[10px] ml-0.5'>{sortIndex + 1}</span>\n )}\n </span>\n )}\n </span>\n )}\n </TableHead>\n );\n}\n\n// =============================================================================\n// DataTable Props\n// =============================================================================\n\n/**\n * DataTableProps\n * DataTableのプロップス\n *\n * ## AI/Automation Features\n * - `testId`: Container element\n * - Pattern: `{testId}`, rows: `{testId}-row-{id}`, pagination: `{testId}-pagination`\n */\nexport interface DataTableProps<TData extends object, TValue> {\n /** AI/E2E Test用の安定ID / Stable test identifier */\n testId?: string;\n /** 列定義 / Column definitions */\n columns: ColumnDef<TData, TValue>[];\n /** データ配列 / Data array */\n data: TData[];\n /** テーブルレイアウトのバリアント / Table layout variant */\n variant?: DataTableVariant;\n /** ツールバー用カスタムフィルターコンテンツ / Custom filter content for toolbar */\n filterContent?: React.ReactNode;\n /** 設定永続化用キー(Zustandストアで使用) / Storage key for persisting settings */\n storageKey?: string;\n /** 全カラムをデフォルトでソート可能にする / Enable sorting on all columns by default */\n enableSortingByDefault?: boolean;\n /** 複数カラムソートを有効化 / Enable multi-column sorting */\n enableMultiSort?: boolean;\n /** 行番号カラムを表示 / Show row number column */\n showRowNumber?: boolean;\n /** アイテム総数(表示用) / Total item count for display */\n itemCount?: number;\n /** 追加ボタンのコールバック / Callback for floating add button */\n onAdd?: () => void;\n /** 総ページ数(手動ページネーション時) / Total page count for manual pagination */\n pageCount?: number;\n /** 総行数(手動ページネーション時) / Total row count for manual pagination */\n rowCount?: number;\n /**\n * ページ変更時のコールバック / Pagination change callback\n * 操作による変更要求時に通知。初期マウント・props同期では通知しません。\n */\n onPaginationChange?: (pagination: { pageIndex: number; pageSize: number }) => void;\n /** ソートの変更要求時のコールバック(初期マウント・props同期では通知しない) / Requested sorting change */\n onSortingChange?: (sorting: SortingState) => void;\n /** フィルタ変更時のコールバック / Filter change callback */\n onColumnFiltersChange?: (filters: ColumnFiltersState) => void;\n /** 行クリック時のコールバック / Row click callback */\n onRowClick?: (rowId: string | number) => void;\n /** 選択変更時のコールバック / Selection change callback */\n onSelectionChange?: (selectedRows: TData[]) => void;\n /** 行ID用フィールド名 / Row ID field name */\n rowIdField?: string;\n /** サーバーサイドページネーション / Server-side pagination */\n manualPagination?: boolean;\n /** サーバーサイドソート / Server-side sorting */\n manualSorting?: boolean;\n /** サーバーサイドフィルタ / Server-side filtering */\n manualFiltering?: boolean;\n /** フィルタ対象カラム / Filter column name */\n filterColumn?: string;\n /** ページサイズのオプション / Page size options */\n pageSizeOptions?: number[];\n /** ソート推移のオプション(外部制御用) / Sorting state for controlled mode */\n sorting?: SortingState;\n /**\n * 現在のページネーション(外部制御用) / Pagination state for controlled mode\n * 指定時はページ自動リセット(autoResetPageIndex)を無効化します。\n */\n pagination?: PaginationState;\n /** 列の並べ替え有効化 / Enable column reordering */\n enableColumnOrdering?: boolean;\n /** コンテナのクラス名 / Container class name */\n containerClassName?: string;\n /** テーブルのクラス名 / Table class name */\n tableClassName?: string;\n /** フィルターのレイアウトモード / Filter layout mode */\n filterLayout?: 'inline' | 'panel';\n /** フィルターパネルの初期開閉状態 / Default open state of the filter panel */\n defaultFilterOpen?: boolean;\n /** アクティブフィルター表示用のコンテンツ / Custom active filters component or node */\n activeFiltersContent?: React.ReactNode;\n}\n\n// =============================================================================\n// DataTable Component\n// =============================================================================\n\n/**\n * Render a sortable/filterable table with host-controlled or local state.\n * @typeParam TData - Object shape of each data row.\n * @typeParam TValue - Column cell-value type shared by the supplied column definitions.\n * @param props - Columns, data, presentation and feature/state options. Native leaf\n * reordering is enabled by default; sort and reorder buttons remain separate.\n * @returns The table with its configured toolbar, pagination and interaction surfaces.\n * @remarks Hidden/grouped columns retain stable persisted slots; changing current\n * columns or visibility invalidates an active reorder snapshot. Controlled sorting\n * and pagination remain host-owned. Supplying pagination notifies onPaginationChange\n * even without manualPagination and disables automatic page-index reset on data updates.\n * Import Appkit CSS once; this component owns its native drag provider.\n * @example\n * ```tsx\n * import {DataTable} from '@alneas/appkit-react/tools/data-table';\n * import '@alneas/appkit-react/styles';\n * export function ReviewTable() {\n * return <DataTable data={[{id: 'one', title: 'Review'}]}\n * columns={[{accessorKey: 'title', header: 'Title'}]} />;\n * }\n * ```\n */\nexport function DataTable<TData extends object, TValue>({\n columns,\n data,\n variant = 'default',\n filterContent,\n storageKey,\n enableSortingByDefault = true,\n enableMultiSort = false,\n showRowNumber = false,\n itemCount,\n onAdd,\n pageCount,\n rowCount,\n onPaginationChange,\n onSortingChange,\n onColumnFiltersChange,\n onRowClick,\n onSelectionChange,\n rowIdField = 'id',\n manualPagination = false,\n manualSorting = false,\n manualFiltering = false,\n filterColumn,\n sorting: controlledSorting,\n pagination: controlledPagination,\n enableColumnOrdering = true,\n containerClassName,\n tableClassName,\n pageSizeOptions = [10, 20, 30, 50, 100],\n filterLayout = 'inline',\n defaultFilterOpen = false,\n activeFiltersContent,\n}: DataTableProps<TData, TValue>) {\n 'use no memo';\n\n // Get persisted settings from store (must be called before any early returns)\n const getTableSettings = useDataTableStore((state) => state.getTableSettings);\n const setTableSettings = useDataTableStore((state) => state.setTableSettings);\n const hasHydrated = useDataTableStore((state) => state._hasHydrated);\n\n // SSR safety: Only render on client\n // useSyncExternalStore ensures we have a consistent value during hydration\n const mounted = React.useSyncExternalStore(\n React.useCallback(() => () => {}, []),\n () => true,\n () => false,\n );\n const [filterOpen, setFilterOpen] = React.useState(defaultFilterOpen);\n\n // Initialize state with default values (SSR-safe)\n const [localSorting, setLocalSorting] = React.useState<SortingState>(controlledSorting || []);\n const [columnFilters, setColumnFilters] = React.useState<ColumnFiltersState>([]);\n const [columnVisibility, setColumnVisibility] = React.useState<VisibilityState>({});\n const [rowSelection, setRowSelection] = React.useState({});\n const [localPagination, setLocalPagination] = React.useState<PaginationState>(\n controlledPagination || {\n pageIndex: 0,\n pageSize: 10,\n },\n );\n const [columnOrder, setColumnOrder] = React.useState<ColumnOrderState>(\n getLeafColumnIds(columns),\n );\n const isPaginationControlled = controlledPagination !== undefined;\n const sorting = controlledSorting ?? localSorting;\n const pagination = controlledPagination ?? localPagination;\n const setSorting: React.Dispatch<React.SetStateAction<SortingState>> = (updater) => {\n const next = typeof updater === 'function' ? updater(sorting) : updater;\n if (controlledSorting === undefined) setLocalSorting(next);\n onSortingChange?.(next);\n };\n const setPagination: React.Dispatch<React.SetStateAction<PaginationState>> = (updater) => {\n const next = typeof updater === 'function' ? updater(pagination) : updater;\n if (controlledPagination === undefined) setLocalPagination(next);\n onPaginationChange?.(next);\n };\n const [settingsLoaded, setSettingsLoaded] = React.useState<string | null>(null);\n const columnIdListKey = React.useMemo(\n () => JSON.stringify([...(showRowNumber ? ['rowNumber'] : []), ...getLeafColumnIds(columns)]),\n [columns, showRowNumber],\n );\n const validColumnIds = React.useMemo(\n () => new Set<string>(JSON.parse(columnIdListKey)),\n [columnIdListKey],\n );\n\n // Guarded render-time hydration, avoiding a stale-state effect render.\n const loadKey = storageKey ? JSON.stringify([storageKey, columnIdListKey, Boolean(controlledSorting), Boolean(controlledPagination)]) : null;\n if (hasHydrated && storageKey && settingsLoaded !== loadKey) {\n setSettingsLoaded(loadKey);\n const storedSettings = getTableSettings(storageKey);\n if (storedSettings) {\n if (!controlledSorting && storedSettings.sorting && storedSettings.sorting.length > 0) {\n // Filter out sorting for columns that no longer exist\n const validSorting = storedSettings.sorting.filter((s) => validColumnIds.has(s.id));\n if (validSorting.length > 0) {\n setLocalSorting(validSorting);\n }\n }\n if (\n storedSettings.columnVisibility &&\n Object.keys(storedSettings.columnVisibility).length > 0\n ) {\n // Filter out visibility for columns that no longer exist\n const validVisibility: Record<string, boolean> = {};\n for (const [key, value] of Object.entries(storedSettings.columnVisibility)) {\n if (validColumnIds.has(key)) {\n validVisibility[key] = value;\n }\n }\n if (Object.keys(validVisibility).length > 0) {\n setColumnVisibility(validVisibility);\n }\n }\n if (!controlledPagination && storedSettings.pageSize && storedSettings.pageSize !== 10) {\n setLocalPagination((prev) => ({ ...prev, pageSize: storedSettings.pageSize }));\n }\n if (storedSettings.columnOrder && storedSettings.columnOrder.length > 0) {\n // Filter out columns that no longer exist and add new columns\n const validStoredOrder = storedSettings.columnOrder.filter((id) => validColumnIds.has(id));\n const storedOrderSet = new Set(validStoredOrder);\n const newColumns = Array.from(validColumnIds).filter((id) => !storedOrderSet.has(id));\n const mergedOrder = [...validStoredOrder, ...newColumns];\n if (mergedOrder.length > 0) {\n setColumnOrder(mergedOrder);\n }\n }\n }\n }\n\n // Row number column definition (MUST be called before early return)\n const rowNumberColumn: ColumnDef<TData, TValue> = React.useMemo(\n () => ({\n id: 'rowNumber',\n header: 'No',\n enableSorting: false,\n cell: ({ row, table: tableInstance }) => {\n const paginationState = tableInstance.store.state.pagination;\n if (paginationState) {\n return paginationState.pageIndex * paginationState.pageSize + row.index + 1;\n }\n return row.index + 1;\n },\n }),\n [],\n );\n\n // Add row number column if requested (MUST be called before early return)\n const columnsWithRowNumber = React.useMemo(() => {\n const cols = showRowNumber ? [rowNumberColumn, ...columns] : columns;\n // Apply enableSortingByDefault to all columns that don't explicitly disable sorting\n if (enableSortingByDefault) {\n return cols.map((col) => ({\n ...col,\n enableSorting: col.enableSorting !== false,\n }));\n }\n return cols;\n }, [showRowNumber, columns, rowNumberColumn, enableSortingByDefault]);\n\n // Helper to extract nested ID safely (MUST be called before early return)\n const getRowId = React.useCallback(\n (originalRow: TData) => {\n if (!rowIdField) return undefined;\n // Simple dot notation support for id field\n\n return rowIdField.split('_').reduce<unknown>((obj, key) => {\n if (\n obj &&\n typeof obj === 'object' &&\n key !== '__proto__' &&\n key !== 'constructor' &&\n key !== 'prototype' &&\n Object.prototype.hasOwnProperty.call(obj, key)\n ) {\n return (obj as Record<string, unknown>)[key];\n }\n return undefined;\n }, originalRow as unknown);\n },\n [rowIdField],\n );\n\n // Persist settings to store (MUST be called before early return)\n React.useEffect(() => {\n if (storageKey && hasHydrated && settingsLoaded === loadKey) {\n setTableSettings(storageKey, {\n columnOrder,\n columnVisibility,\n sorting,\n pageSize: pagination.pageSize,\n });\n }\n }, [storageKey, columnOrder, columnVisibility, sorting, pagination.pageSize, setTableSettings, hasHydrated, settingsLoaded, loadKey]);\n\n React.useEffect(() => {\n if (manualFiltering && onColumnFiltersChange) {\n onColumnFiltersChange(columnFilters);\n }\n }, [columnFilters, manualFiltering, onColumnFiltersChange]);\n\n // Create table instance (MUST be called before early return)\n const table = useTable({\n features: dataTableFeatures,\n data,\n // Table 9 erases heterogeneous cell values to unknown at the table boundary.\n columns: columnsWithRowNumber as ColumnDef<TData>[],\n pageCount: manualPagination ? pageCount : undefined,\n rowCount: manualPagination ? rowCount : undefined,\n getRowId: rowIdField\n ? (originalRow, index) => {\n const id = rowIdField.split('_').reduce<unknown>((obj, key) => {\n if (obj && typeof obj === 'object' && key in (obj as Record<string, unknown>)) {\n return (obj as Record<string, unknown>)[key];\n }\n return undefined;\n }, originalRow as unknown);\n return id !== undefined ? String(id) : String(index);\n }\n : undefined,\n state: {\n sorting,\n columnFilters,\n columnVisibility,\n rowSelection,\n pagination,\n columnOrder,\n },\n enableRowSelection: true,\n enableMultiSort,\n onRowSelectionChange: setRowSelection,\n onSortingChange: setSorting,\n onColumnFiltersChange: setColumnFilters,\n onColumnVisibilityChange: setColumnVisibility,\n onPaginationChange: setPagination,\n onColumnOrderChange: setColumnOrder,\n autoResetPageIndex: manualPagination || isPaginationControlled ? false : undefined,\n manualPagination,\n manualSorting,\n manualFiltering,\n });\n\n // Sync selection to parent (MUST be called before early return)\n React.useEffect(() => {\n if (onSelectionChange) {\n const selectedRows = table.getFilteredSelectedRowModel().rows.map((row) => row.original);\n onSelectionChange(selectedRows);\n }\n }, [rowSelection, table, onSelectionChange]);\n\n // A drag captures the registered leaf subset. Hidden/changed columns never use stale indices.\n const dragSnapshot = React.useRef<{\n sourceId: string; groupId: string; ids: string[]; leafIds: string[]; order: string[];\n } | null>(null);\n const handleDragStart = React.useCallback((event: DragStartEvent) => {\n const source = event.operation.source;\n if (!source || !Array.isArray(source.data.columnIds)) return;\n dragSnapshot.current = {\n sourceId: String(source.id), groupId: source.data.groupId,\n ids: [...source.data.columnIds], leafIds: table.getAllLeafColumns().map(column => column.id),\n order: [...columnOrder],\n };\n }, [table, columnOrder]);\n const handleDragEnd = React.useCallback((event: DragEndEvent) => {\n const snapshot = dragSnapshot.current;\n dragSnapshot.current = null;\n const {source, target} = event.operation;\n if (event.canceled || !enableColumnOrdering || !snapshot || !target || !isSortable(source) || String(source.id) !== snapshot.sourceId) return;\n const leafIds = table.getAllLeafColumns().map(column => column.id);\n const group = table.getHeaderGroups().find(group => group.id === snapshot.groupId);\n const registeredIds = group?.headers.filter(header => !header.isPlaceholder && header.column.columns.length === 0).map(header => header.column.id);\n if (!registeredIds || JSON.stringify(registeredIds) !== JSON.stringify(snapshot.ids) ||\n JSON.stringify(leafIds) !== JSON.stringify(snapshot.leafIds) || JSON.stringify(columnOrder) !== JSON.stringify(snapshot.order)) return;\n setColumnOrder(order => reorderVisibleColumns(order, leafIds, snapshot.ids, source.data.columnId, source.initialIndex, source.index));\n }, [table, columnOrder, enableColumnOrdering]);\n\n // Get sort index for multi-sort display (MUST be called before early return)\n const getSortIndex = React.useCallback(\n (columnId: string): number => {\n return sorting.findIndex((s) => s.id === columnId);\n },\n [sorting],\n );\n\n // Render table content (MUST be called before early return)\n const renderTable = React.useCallback(\n () => (\n <DragDropProvider\n sensors={defaults => [...defaults.filter(sensor => sensor !== PointerSensor), PointerSensor.configure({activationConstraints: [new PointerActivationConstraints.Distance({value: 8})]})]}\n plugins={defaults => [...defaults, Feedback.configure({feedback: 'clone', dropAnimation: {duration: 0}})]}\n onDragStart={handleDragStart} onDragEnd={handleDragEnd}\n >\n <div className={cn('rounded-md border', tableClassName)}>\n <Table>\n <TableHeader>\n {table.getHeaderGroups().map(headerGroup => {\n const registeredIds = headerGroup.headers.filter(header => !header.isPlaceholder && header.column.columns.length === 0).map(header => header.column.id);\n return <TableRow key={headerGroup.id}>\n {headerGroup.headers.map(header => <DataTableColumnHeader\n key={header.id} header={header} enableColumnOrdering={enableColumnOrdering}\n enableMultiSort={enableMultiSort} sortIndex={getSortIndex(header.column.id)}\n sortableIndex={registeredIds.indexOf(header.column.id)} sortableGroup={headerGroup.id}\n registeredIds={registeredIds}\n />)}\n </TableRow>;\n })}\n </TableHeader>\n <TableBody>\n {table.getRowModel().rows?.length ? (\n table.getRowModel().rows.map((row) => (\n <TableRow\n key={row.id}\n data-state={row.getIsSelected() && 'selected'}\n onClick={() =>\n onRowClick && onRowClick(getRowId(row.original) as string | number)\n }\n className={onRowClick ? 'cursor-pointer hover:bg-muted/50' : undefined}\n >\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : (\n <TableRow>\n <TableCell colSpan={columnsWithRowNumber.length} className='h-24 text-center'>\n {m.dataTable_noResults()}\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </div>\n </DragDropProvider>\n ),\n [\n handleDragStart,\n handleDragEnd,\n table,\n columnsWithRowNumber,\n columnOrder,\n enableColumnOrdering,\n enableMultiSort,\n getSortIndex,\n onRowClick,\n getRowId,\n tableClassName,\n ],\n );\n\n // Render loading table during SSR - simple version to avoid hydration issues\n const renderLoadingTable = () => (\n <div className={cn('rounded-md border', tableClassName)}>\n <Table>\n <TableBody>\n <TableRow>\n <TableCell className='h-24 text-center'>\n <div className='text-muted-foreground'>Loading...</div>\n </TableCell>\n </TableRow>\n </TableBody>\n </Table>\n </div>\n );\n\n // Variant: minimal - just table with pagination\n if (variant === 'minimal') {\n return (\n <div className={cn('space-y-4', containerClassName)}>\n {mounted ? renderTable() : renderLoadingTable()}\n <DataTablePagination table={table} pageSizeOptions={pageSizeOptions} />\n </div>\n );\n }\n\n // Variant: toolbar - setagaya-front style with toolbar above table\n if (variant === 'toolbar') {\n return (\n <div className={cn('relative h-full', containerClassName)}>\n {onAdd && (\n <div className='absolute left-0 top-0 w-full h-full z-10 pointer-events-none'>\n <div className='fixed right-4 bottom-10 pointer-events-auto'>\n <Button\n type='button'\n size='icon'\n aria-label='Add row'\n onClick={onAdd}\n className='w-12 h-12 rounded-full shadow-lg'\n >\n <Plus className='w-6 h-6' />\n </Button>\n </div>\n </div>\n )}\n <div className='relative h-full flex flex-col'>\n {/* Toolbar */}\n <div className='bg-muted p-2 rounded-t-md grid grid-cols-1 sm:grid-cols-[1fr_minmax(0,auto)_1fr] items-center gap-2'>\n {/* Center: Column settings + filter content */}\n <div className='flex flex-wrap justify-center items-center gap-2 sm:col-start-2 sm:col-end-3'>\n <DataTableViewOptions table={table} />\n {filterContent && filterLayout === 'inline' && filterContent}\n {filterContent && filterLayout === 'panel' && (\n <Button\n type='button'\n variant={filterOpen ? 'default' : 'outline'}\n size='sm'\n onClick={() => setFilterOpen(!filterOpen)}\n className='h-8 gap-1.5'\n >\n <FilterIcon className='h-4 w-4' />\n <span>フィルター</span>\n </Button>\n )}\n </div>\n {/* Right: Pagination + count */}\n <div className='flex items-center gap-3 justify-center sm:justify-end sm:col-start-3 sm:col-end-4'>\n <DataTablePaginationCompact table={table} pageSizeOptions={pageSizeOptions} />\n {typeof itemCount === 'number' && (\n <span className='text-sm text-muted-foreground whitespace-nowrap'>\n {`${itemCount.toLocaleString()} ${m.dataTable_items()}`}\n </span>\n )}\n </div>\n </div>\n {/* Filter Panel (Collapsible) */}\n {filterContent && filterLayout === 'panel' && (\n <div\n className={cn(\n 'border-b transition-all duration-200 ease-in-out overflow-hidden bg-background',\n filterOpen ? 'max-h-[500px] p-4' : 'max-h-0 p-0 border-none',\n )}\n >\n {filterContent}\n </div>\n )}\n {/* Active Filters Display */}\n {activeFiltersContent && (\n <div className='bg-background px-4 py-1.5 border-b'>{activeFiltersContent}</div>\n )}\n {/* Table */}\n <div className='flex-1 overflow-auto'>\n {mounted ? renderTable() : renderLoadingTable()}\n </div>\n </div>\n </div>\n );\n }\n\n // Variant: default - current behavior\n return (\n <div className={cn('space-y-4', containerClassName)}>\n <div className='flex items-center justify-between'>\n <div className='flex items-center py-4'>\n {filterColumn && (\n <Input\n placeholder={m.dataTable_filterPlaceholder({ column: filterColumn })}\n value={(table.getColumn(filterColumn)?.getFilterValue() as string) ?? ''}\n onChange={(event) =>\n table.getColumn(filterColumn)?.setFilterValue(event.target.value)\n }\n className='max-w-sm'\n />\n )}\n </div>\n <DataTableViewOptions table={table} />\n </div>\n {activeFiltersContent && (\n <div className='border rounded-md bg-background px-3 py-1'>{activeFiltersContent}</div>\n )}\n {mounted ? renderTable() : renderLoadingTable()}\n <DataTablePagination table={table} pageSizeOptions={pageSizeOptions} />\n {onAdd && (\n <div className='fixed right-4 bottom-10 z-10'>\n <Button\n type='button'\n size='icon'\n onClick={onAdd}\n className='w-12 h-12 rounded-full shadow-lg'\n >\n <Plus className='w-6 h-6' />\n </Button>\n </div>\n )}\n </div>\n );\n}\n\n// =============================================================================\n// View Options Component\n// =============================================================================\n\ninterface DataTableViewOptionsProps<TData extends object> {\n table: TableInstance<TData>;\n}\n\n/**\n * テーブルの表示列を切り替える設定ドロップダウンメニューコンポーネント\n */\nexport function DataTableViewOptions<TData extends object>({ table }: DataTableViewOptionsProps<TData>) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger\n className={buttonVariants({ variant: 'default', size: 'sm', className: 'h-8' })}\n >\n <Settings2 className='mr-2 h-4 w-4' />\n {m.dataTable_view()}\n </DropdownMenuTrigger>\n <DropdownMenuContent align='end' className='w-40'>\n <DropdownMenuGroup>\n <DropdownMenuLabel>{m.dataTable_toggleColumns()}</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {table\n .getAllColumns()\n .filter((column) => typeof column.accessorFn !== 'undefined' && column.getCanHide())\n .map((column) => {\n return (\n <DropdownMenuCheckboxItem\n key={column.id}\n className='capitalize'\n checked={column.getIsVisible()}\n onCheckedChange={(value) => column.toggleVisibility(!!value)}\n >\n {typeof column.columnDef.header === 'string'\n ? column.columnDef.header\n : column.id}\n </DropdownMenuCheckboxItem>\n );\n })}\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\n// =============================================================================\n// Pagination Component (Full)\n// =============================================================================\n\ninterface DataTablePaginationProps<TData extends object> {\n table: TableInstance<TData>;\n pageSizeOptions?: number[];\n}\n\n/**\n * テーブルの標準的なページネーションコントロールコンポーネント\n */\nexport function DataTablePagination<TData extends object>({\n table,\n pageSizeOptions = [10, 20, 30, 50, 100],\n}: DataTablePaginationProps<TData>) {\n return (\n <div className='flex items-center justify-between px-2'>\n <div className='flex-1 text-sm text-muted-foreground'>\n {m.dataTable_rowsSelected({\n selected: table.getFilteredSelectedRowModel().rows.length,\n total: table.getFilteredRowModel().rows.length,\n })}\n </div>\n <div className='flex items-center space-x-6 lg:space-x-8'>\n <div className='flex items-center space-x-2'>\n <p className='text-sm font-medium'>{m.dataTable_rowsPerPage()}</p>\n <select\n aria-label={m.dataTable_rowsPerPage()}\n value={`${table.store.state.pagination.pageSize}`}\n onChange={(e) => {\n table.setPageSize(Number(e.target.value));\n }}\n className='h-8 w-fit min-w-16 rounded-md border border-input bg-background px-2 py-1 text-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2'\n >\n {pageSizeOptions.map((pageSize) => (\n <option key={pageSize} value={`${pageSize}`}>\n {pageSize}\n </option>\n ))}\n </select>\n </div>\n <div className='flex w-24 items-center justify-center text-sm font-medium'>\n {m.dataTable_page({\n current: table.store.state.pagination.pageIndex + 1,\n total: table.getPageCount(),\n })}\n </div>\n <div className='flex items-center space-x-2'>\n <Button\n variant='default'\n size='icon'\n className='hidden h-8 w-8 lg:flex hover:bg-primary/90'\n aria-label={m.dataTable_goToFirstPage()}\n onClick={() => table.setPageIndex(0)}\n disabled={!table.getCanPreviousPage()}\n >\n <span className='sr-only'>{m.dataTable_goToFirstPage()}</span>\n <ChevronsLeft className='h-4 w-4' />\n </Button>\n <Button\n variant='default'\n size='icon'\n className='h-8 w-8 hover:bg-primary/90'\n aria-label={m.dataTable_goToPreviousPage()}\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n >\n <span className='sr-only'>{m.dataTable_goToPreviousPage()}</span>\n <ChevronLeft className='h-4 w-4' />\n </Button>\n <Button\n variant='default'\n size='icon'\n className='h-8 w-8 hover:bg-primary/90'\n aria-label={m.dataTable_goToNextPage()}\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n >\n <span className='sr-only'>{m.dataTable_goToNextPage()}</span>\n <ChevronRight className='h-4 w-4' />\n </Button>\n <Button\n variant='default'\n size='icon'\n className='hidden h-8 w-8 lg:flex hover:bg-primary/90'\n aria-label={m.dataTable_goToLastPage()}\n onClick={() => table.setPageIndex(table.getPageCount() - 1)}\n disabled={!table.getCanNextPage()}\n >\n <span className='sr-only'>{m.dataTable_goToLastPage()}</span>\n <ChevronsRight className='h-4 w-4' />\n </Button>\n </div>\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// Pagination Component (Compact - for toolbar variant)\n// =============================================================================\n\ninterface DataTablePaginationCompactProps<TData extends object> {\n table: TableInstance<TData>;\n pageSizeOptions?: number[];\n}\n\n/**\n * ツールバー等に配置するコンパクトなページネーションコントロールコンポーネント\n */\nexport function DataTablePaginationCompact<TData extends object>({\n table,\n pageSizeOptions = [10, 20, 30, 50, 100],\n}: DataTablePaginationCompactProps<TData>) {\n const totalPages = table.getPageCount();\n\n return (\n <div className='flex items-center gap-1'>\n <select\n aria-label={m.dataTable_rowsPerPage()}\n value={`${table.store.state.pagination.pageSize}`}\n onChange={(e) => {\n table.setPageSize(Number(e.target.value));\n }}\n className='h-8 w-fit min-w-16 rounded-md border border-input bg-background px-2 py-1 text-sm'\n >\n {pageSizeOptions.map((pageSize) => (\n <option key={pageSize} value={`${pageSize}`}>\n {pageSize}\n </option>\n ))}\n </select>\n {totalPages > 1 && (\n <>\n <Button\n variant='default'\n size='icon'\n className='h-8 w-8 hover:bg-primary/90'\n aria-label={m.dataTable_goToFirstPage()}\n onClick={() => table.setPageIndex(0)}\n disabled={table.store.state.pagination.pageIndex === 0}\n >\n <ChevronsLeft className='h-4 w-4' />\n </Button>\n <Button\n variant='default'\n size='icon'\n className='h-8 w-8 hover:bg-primary/90'\n aria-label={m.dataTable_goToPreviousPage()}\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n >\n <ChevronLeft className='h-4 w-4' />\n </Button>\n <span className='text-sm text-muted-foreground whitespace-nowrap px-1'>\n {table.store.state.pagination.pageIndex + 1} / {totalPages}\n </span>\n <Button\n variant='default'\n size='icon'\n className='h-8 w-8 hover:bg-primary/90'\n aria-label={m.dataTable_goToNextPage()}\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n >\n <ChevronRight className='h-4 w-4' />\n </Button>\n <Button\n variant='default'\n size='icon'\n className='h-8 w-8 hover:bg-primary/90'\n aria-label={m.dataTable_goToLastPage()}\n onClick={() => table.setPageIndex(totalPages - 1)}\n disabled={table.store.state.pagination.pageIndex === totalPages - 1}\n >\n <ChevronsRight className='h-4 w-4' />\n </Button>\n </>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"data-table.js","names":["React","m.dataTable_noResults","FilterIcon","m.dataTable_items","m.dataTable_filterPlaceholder","m.dataTable_view","m.dataTable_toggleColumns","m.dataTable_rowsSelected","m.dataTable_rowsPerPage","m.dataTable_page","m.dataTable_goToFirstPage","m.dataTable_goToPreviousPage","m.dataTable_goToNextPage","m.dataTable_goToLastPage","_Fragment","datatable_filterplaceholder2","datatable_gotofirstpage4","datatable_gotolastpage4","datatable_gotonextpage4","datatable_gotopreviouspage4","datatable_items1","datatable_noresults2","datatable_page1","datatable_rowsperpage3","datatable_rowsselected2","datatable_togglecolumns2","datatable_view1","React$1","DataTableColumnHeader","canReorder","enableColumnOrdering","header","useSortable","sortableIndex","sortableGroup","registeredIds","closestCenter","columnHandleRef","useAccessibleDragRef","handleRef","canSort","sortDirection","isSorted","SortLabel","style","isDragging","TableHead","ref","cn","enableMultiSort","GripVertical","event","flexRender","jsx","ChevronUp","ChevronDown","sortIndex","DataTable","controlledSorting","controlledPagination","getTableSettings","useDataTableStore","state","setTableSettings","hasHydrated","mounted","filterOpen","setFilterOpen","defaultFilterOpen","localSorting","setLocalSorting","columnFilters","setColumnFilters","columnVisibility","setColumnVisibility","rowSelection","setRowSelection","localPagination","setLocalPagination","columnOrder","setColumnOrder","getLeafColumnIds","columns","isPaginationControlled","sorting","pagination","setSorting","next","updater","onSortingChange","setPagination","onPaginationChange","settingsLoaded","setSettingsLoaded","columnIdListKey","showRowNumber","validColumnIds","loadKey","storageKey","storedSettings","validSorting","s","validVisibility","key","value","prev","validStoredOrder","id","storedOrderSet","newColumns","mergedOrder","rowNumberColumn","tableInstance","paginationState","row","columnsWithRowNumber","cols","enableSortingByDefault","col","getRowId","rowIdField","obj","originalRow","manualFiltering","onColumnFiltersChange","table","useTable","dataTableFeatures","manualPagination","pageCount","rowCount","index","onSelectionChange","dragSnapshot","handleDragStart","source","column","handleDragEnd","snapshot","target","isSortable","leafIds","group","reorderVisibleColumns","order","getSortIndex","columnId","renderTable","DragDropProvider","defaults","sensor","PointerSensor","PointerActivationConstraints","Feedback","tableClassName","Table","TableHeader","headerGroup","TableRow","TableBody","onRowClick","TableCell","cell","renderLoadingTable","variant","containerClassName","DataTablePagination","onAdd","Button","Plus","DataTableViewOptions","filterContent","filterLayout","Filter","DataTablePaginationCompact","itemCount","activeFiltersContent","filterColumn","Input","DropdownMenu","DropdownMenuTrigger","buttonVariants","Settings2","DropdownMenuContent","DropdownMenuGroup","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuCheckboxItem","e","pageSizeOptions","pageSize","ChevronsLeft","ChevronLeft","ChevronRight","ChevronsRight","totalPages","Fragment"],"sources":["../../../../src/tools/components/data-table/data-table.tsx"],"sourcesContent":["/**\n * @fileoverview DataTable component with sorting, pagination, and persistence\n *\n * A feature-rich data table built on TanStack Table with:\n * - Three layout variants: default, toolbar, minimal\n * - Single and multi-column sorting\n * - Column reordering via drag-and-drop\n * - Column visibility toggle\n * - Settings persistence via Zustand store\n * - Row selection and click handling\n * - Server-side pagination/sorting support\n *\n * @module data-table/data-table\n */\n\nimport * as React from 'react';\nimport {\n ColumnDef,\n ColumnFiltersState,\n SortingState,\n VisibilityState,\n ColumnOrderState,\n PaginationState,\n flexRender,\n useTable,\n dataTableFeatures,\n Table as TableInstance,\n Header,\n} from './table-engine';\nimport * as m from '../../paraglide/messages.js';\n\nimport { DragDropProvider, type DragStartEvent, type DragEndEvent } from '@dnd-kit/react';\nimport { useSortable, isSortable } from '@dnd-kit/react/sortable';\nimport { PointerSensor, PointerActivationConstraints, Feedback } from '@dnd-kit/dom';\nimport { closestCenter } from '@dnd-kit/collision';\nimport { reorderVisibleColumns, getLeafColumnIds } from './column-order';\n\nimport { cn } from \"../../lib/utils\";\nimport { Button, buttonVariants } from '../ui/button';\nimport { Input } from '../ui/input';\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../ui/table';\n\nimport {\n ChevronLeft,\n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n Settings2,\n GripVertical,\n Plus,\n ChevronUp,\n ChevronDown,\n Filter as FilterIcon,\n} from 'lucide-react';\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuTrigger,\n DropdownMenuSeparator,\n DropdownMenuLabel,\n DropdownMenuGroup,\n} from '../ui/dropdown-menu';\n\nimport { useDataTableStore } from './table-store';\nimport { useAccessibleDragRef } from '../ui/dnd/use-accessible-drag-ref';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * テーブルレイアウトのバリアント\n * Table layout variants\n */\nexport type DataTableVariant = 'default' | 'toolbar' | 'minimal';\n\n// =============================================================================\n// Sortable Header Component\n// =============================================================================\n\ninterface DataTableColumnHeaderProps<\n TData extends object,\n TValue,\n> extends React.HTMLAttributes<HTMLTableCellElement> {\n header: Header<TData, TValue>;\n enableColumnOrdering?: boolean;\n enableMultiSort?: boolean;\n sortIndex?: number;\n sortableIndex: number;\n sortableGroup: string;\n registeredIds: string[];\n}\n\nfunction DataTableColumnHeader<TData extends object, TValue>({\n header,\n enableColumnOrdering = true,\n enableMultiSort = false,\n sortIndex,\n sortableIndex, sortableGroup, registeredIds,\n}: DataTableColumnHeaderProps<TData, TValue>) {\n const canReorder = enableColumnOrdering && !header.isPlaceholder && header.column.columns.length === 0;\n const { ref, handleRef, isDragging } = useSortable({\n id: header.id,\n index: sortableIndex,\n group: sortableGroup,\n type: sortableGroup,\n accept: sortableGroup,\n data: {columnId: header.column.id, groupId: sortableGroup, columnIds: registeredIds},\n disabled: !canReorder,\n collisionDetector: closestCenter,\n });\n\n const columnHandleRef = useAccessibleDragRef(handleRef);\n\n const canSort = header.column.getCanSort();\n const sortDirection = header.column.getIsSorted();\n const isSorted = sortDirection !== false;\n const SortLabel = canSort && typeof header.column.columnDef.header !== 'function' ? 'button' : 'span';\n\n const style: React.CSSProperties = enableColumnOrdering\n ? {\n opacity: isDragging ? 0.8 : 1,\n zIndex: isDragging ? 1 : 0,\n position: 'relative',\n cursor: 'move',\n }\n : {};\n\n const handleSort = (e: React.MouseEvent) => {\n if (!canSort || (e.target as HTMLElement).closest('button, input, select, [role=checkbox]')) return;\n if (enableMultiSort && e.shiftKey) {\n header.column.toggleSorting(undefined, true);\n } else {\n header.column.toggleSorting();\n }\n };\n\n return (\n <TableHead\n ref={canReorder ? ref : undefined}\n colSpan={header.colSpan}\n aria-hidden={header.isPlaceholder || undefined}\n style={style}\n aria-sort={canSort ? (sortDirection === 'asc' ? 'ascending' : sortDirection === 'desc' ? 'descending' : 'none') : undefined}\n className={cn(\n 'bg-primary/10 text-primary font-bold border-b border-primary/20',\n canSort && 'cursor-pointer select-none hover:bg-primary/20 transition-colors',\n )}\n onClick={canSort ? handleSort : undefined}\n >\n {canReorder && <button\n type='button' ref={columnHandleRef}\n aria-label={`Reorder column ${header.column.id}`}\n className='inline-flex h-6 w-6 items-center justify-center cursor-grab'\n ><GripVertical className='h-3 w-3' aria-hidden='true' /></button>}\n {header.isPlaceholder ? null : (\n <span className='inline-flex items-center gap-1'>\n <SortLabel className={cn(isSorted && 'font-semibold')}\n {...(SortLabel === 'button' ? { type: 'button' as const, onClick: (event: React.MouseEvent) => {\n event.stopPropagation();\n header.column.toggleSorting(undefined, enableMultiSort && event.shiftKey);\n } } : {})}\n >\n {flexRender(header.column.columnDef.header, header.getContext())}\n </SortLabel>\n {/* Only show sort indicator when column is actively sorted */}\n {isSorted && (\n <span className='inline-flex items-center text-xs'>\n {sortDirection === 'asc' ? (\n <ChevronUp className='h-3.5 w-3.5' />\n ) : (\n <ChevronDown className='h-3.5 w-3.5' />\n )}\n {enableMultiSort && sortIndex !== undefined && sortIndex >= 0 && (\n <span className='text-[10px] ml-0.5'>{sortIndex + 1}</span>\n )}\n </span>\n )}\n </span>\n )}\n </TableHead>\n );\n}\n\n// =============================================================================\n// DataTable Props\n// =============================================================================\n\n/**\n * DataTableProps\n * DataTableのプロップス\n *\n * ## AI/Automation Features\n * - `testId`: Container element\n * - Pattern: `{testId}`, rows: `{testId}-row-{id}`, pagination: `{testId}-pagination`\n */\nexport interface DataTableProps<TData extends object, TValue> {\n /** AI/E2E Test用の安定ID / Stable test identifier */\n testId?: string;\n /** 列定義 / Column definitions */\n columns: ColumnDef<TData, TValue>[];\n /** データ配列 / Data array */\n data: TData[];\n /** テーブルレイアウトのバリアント / Table layout variant */\n variant?: DataTableVariant;\n /** ツールバー用カスタムフィルターコンテンツ / Custom filter content for toolbar */\n filterContent?: React.ReactNode;\n /** 設定永続化用キー(Zustandストアで使用) / Storage key for persisting settings */\n storageKey?: string;\n /** 全カラムをデフォルトでソート可能にする / Enable sorting on all columns by default */\n enableSortingByDefault?: boolean;\n /** 複数カラムソートを有効化 / Enable multi-column sorting */\n enableMultiSort?: boolean;\n /** 行番号カラムを表示 / Show row number column */\n showRowNumber?: boolean;\n /** アイテム総数(表示用) / Total item count for display */\n itemCount?: number;\n /** 追加ボタンのコールバック / Callback for floating add button */\n onAdd?: () => void;\n /** 総ページ数(手動ページネーション時) / Total page count for manual pagination */\n pageCount?: number;\n /** 総行数(手動ページネーション時) / Total row count for manual pagination */\n rowCount?: number;\n /**\n * ページ変更時のコールバック / Pagination change callback\n * 操作による変更要求時に通知。初期マウント・props同期では通知しません。\n */\n onPaginationChange?: (pagination: { pageIndex: number; pageSize: number }) => void;\n /** ソートの変更要求時のコールバック(初期マウント・props同期では通知しない) / Requested sorting change */\n onSortingChange?: (sorting: SortingState) => void;\n /** フィルタ変更時のコールバック / Filter change callback */\n onColumnFiltersChange?: (filters: ColumnFiltersState) => void;\n /** 行クリック時のコールバック / Row click callback */\n onRowClick?: (rowId: string | number) => void;\n /** 選択変更時のコールバック / Selection change callback */\n onSelectionChange?: (selectedRows: TData[]) => void;\n /** 行ID用フィールド名 / Row ID field name */\n rowIdField?: string;\n /** サーバーサイドページネーション / Server-side pagination */\n manualPagination?: boolean;\n /** サーバーサイドソート / Server-side sorting */\n manualSorting?: boolean;\n /** サーバーサイドフィルタ / Server-side filtering */\n manualFiltering?: boolean;\n /** フィルタ対象カラム / Filter column name */\n filterColumn?: string;\n /** ページサイズのオプション / Page size options */\n pageSizeOptions?: number[];\n /** ソート推移のオプション(外部制御用) / Sorting state for controlled mode */\n sorting?: SortingState;\n /**\n * 現在のページネーション(外部制御用) / Pagination state for controlled mode\n * 指定時はページ自動リセット(autoResetPageIndex)を無効化します。\n */\n pagination?: PaginationState;\n /** 列の並べ替え有効化 / Enable column reordering */\n enableColumnOrdering?: boolean;\n /** コンテナのクラス名 / Container class name */\n containerClassName?: string;\n /** テーブルのクラス名 / Table class name */\n tableClassName?: string;\n /** フィルターのレイアウトモード / Filter layout mode */\n filterLayout?: 'inline' | 'panel';\n /** フィルターパネルの初期開閉状態 / Default open state of the filter panel */\n defaultFilterOpen?: boolean;\n /** アクティブフィルター表示用のコンテンツ / Custom active filters component or node */\n activeFiltersContent?: React.ReactNode;\n}\n\n// =============================================================================\n// DataTable Component\n// =============================================================================\n\n/**\n * Render a sortable/filterable table with host-controlled or local state.\n * @typeParam TData - Object shape of each data row.\n * @typeParam TValue - Column cell-value type shared by the supplied column definitions.\n * @param props - Columns, data, presentation and feature/state options. Native leaf\n * reordering is enabled by default; sort and reorder buttons remain separate.\n * @returns The table with its configured toolbar, pagination and interaction surfaces.\n * @remarks Hidden/grouped columns retain stable persisted slots; changing current\n * columns or visibility invalidates an active reorder snapshot. Controlled sorting\n * and pagination remain host-owned. Supplying pagination notifies onPaginationChange\n * even without manualPagination and disables automatic page-index reset on data updates.\n * Import Appkit CSS once; this component owns its native drag provider.\n * @example\n * ```tsx\n * import {DataTable} from '@alneas/appkit-react/tools/data-table';\n * import '@alneas/appkit-react/styles';\n * export function ReviewTable() {\n * return <DataTable data={[{id: 'one', title: 'Review'}]}\n * columns={[{accessorKey: 'title', header: 'Title'}]} />;\n * }\n * ```\n */\nexport function DataTable<TData extends object, TValue>({\n columns,\n data,\n variant = 'default',\n filterContent,\n storageKey,\n enableSortingByDefault = true,\n enableMultiSort = false,\n showRowNumber = false,\n itemCount,\n onAdd,\n pageCount,\n rowCount,\n onPaginationChange,\n onSortingChange,\n onColumnFiltersChange,\n onRowClick,\n onSelectionChange,\n rowIdField = 'id',\n manualPagination = false,\n manualSorting = false,\n manualFiltering = false,\n filterColumn,\n sorting: controlledSorting,\n pagination: controlledPagination,\n enableColumnOrdering = true,\n containerClassName,\n tableClassName,\n pageSizeOptions = [10, 20, 30, 50, 100],\n filterLayout = 'inline',\n defaultFilterOpen = false,\n activeFiltersContent,\n}: DataTableProps<TData, TValue>) {\n 'use no memo';\n\n // Get persisted settings from store (must be called before any early returns)\n const getTableSettings = useDataTableStore((state) => state.getTableSettings);\n const setTableSettings = useDataTableStore((state) => state.setTableSettings);\n const hasHydrated = useDataTableStore((state) => state._hasHydrated);\n\n // SSR safety: Only render on client\n // useSyncExternalStore ensures we have a consistent value during hydration\n const mounted = React.useSyncExternalStore(\n React.useCallback(() => () => {}, []),\n () => true,\n () => false,\n );\n const [filterOpen, setFilterOpen] = React.useState(defaultFilterOpen);\n\n // Initialize state with default values (SSR-safe)\n const [localSorting, setLocalSorting] = React.useState<SortingState>(controlledSorting || []);\n const [columnFilters, setColumnFilters] = React.useState<ColumnFiltersState>([]);\n const [columnVisibility, setColumnVisibility] = React.useState<VisibilityState>({});\n const [rowSelection, setRowSelection] = React.useState({});\n const [localPagination, setLocalPagination] = React.useState<PaginationState>(\n controlledPagination || {\n pageIndex: 0,\n pageSize: 10,\n },\n );\n const [columnOrder, setColumnOrder] = React.useState<ColumnOrderState>(\n getLeafColumnIds(columns),\n );\n const isPaginationControlled = controlledPagination !== undefined;\n const sorting = controlledSorting ?? localSorting;\n const pagination = controlledPagination ?? localPagination;\n const setSorting: React.Dispatch<React.SetStateAction<SortingState>> = (updater) => {\n const next = typeof updater === 'function' ? updater(sorting) : updater;\n if (controlledSorting === undefined) setLocalSorting(next);\n onSortingChange?.(next);\n };\n const setPagination: React.Dispatch<React.SetStateAction<PaginationState>> = (updater) => {\n const next = typeof updater === 'function' ? updater(pagination) : updater;\n if (controlledPagination === undefined) setLocalPagination(next);\n onPaginationChange?.(next);\n };\n const [settingsLoaded, setSettingsLoaded] = React.useState<string | null>(null);\n const columnIdListKey = React.useMemo(\n () => JSON.stringify([...(showRowNumber ? ['rowNumber'] : []), ...getLeafColumnIds(columns)]),\n [columns, showRowNumber],\n );\n const validColumnIds = React.useMemo(\n () => new Set<string>(JSON.parse(columnIdListKey)),\n [columnIdListKey],\n );\n\n // Guarded render-time hydration, avoiding a stale-state effect render.\n const loadKey = storageKey ? JSON.stringify([storageKey, columnIdListKey, Boolean(controlledSorting), Boolean(controlledPagination)]) : null;\n if (hasHydrated && storageKey && settingsLoaded !== loadKey) {\n setSettingsLoaded(loadKey);\n const storedSettings = getTableSettings(storageKey);\n if (storedSettings) {\n if (!controlledSorting && storedSettings.sorting && storedSettings.sorting.length > 0) {\n // Filter out sorting for columns that no longer exist\n const validSorting = storedSettings.sorting.filter((s) => validColumnIds.has(s.id));\n if (validSorting.length > 0) {\n setLocalSorting(validSorting);\n }\n }\n if (\n storedSettings.columnVisibility &&\n Object.keys(storedSettings.columnVisibility).length > 0\n ) {\n // Filter out visibility for columns that no longer exist\n const validVisibility: Record<string, boolean> = {};\n for (const [key, value] of Object.entries(storedSettings.columnVisibility)) {\n if (validColumnIds.has(key)) {\n validVisibility[key] = value;\n }\n }\n if (Object.keys(validVisibility).length > 0) {\n setColumnVisibility(validVisibility);\n }\n }\n if (!controlledPagination && storedSettings.pageSize && storedSettings.pageSize !== 10) {\n setLocalPagination((prev) => ({ ...prev, pageSize: storedSettings.pageSize }));\n }\n if (storedSettings.columnOrder && storedSettings.columnOrder.length > 0) {\n // Filter out columns that no longer exist and add new columns\n const validStoredOrder = storedSettings.columnOrder.filter((id) => validColumnIds.has(id));\n const storedOrderSet = new Set(validStoredOrder);\n const newColumns = Array.from(validColumnIds).filter((id) => !storedOrderSet.has(id));\n const mergedOrder = [...validStoredOrder, ...newColumns];\n if (mergedOrder.length > 0) {\n setColumnOrder(mergedOrder);\n }\n }\n }\n }\n\n // Row number column definition (MUST be called before early return)\n const rowNumberColumn: ColumnDef<TData, TValue> = React.useMemo(\n () => ({\n id: 'rowNumber',\n header: 'No',\n enableSorting: false,\n cell: ({ row, table: tableInstance }) => {\n const paginationState = tableInstance.store.state.pagination;\n if (paginationState) {\n return paginationState.pageIndex * paginationState.pageSize + row.index + 1;\n }\n return row.index + 1;\n },\n }),\n [],\n );\n\n // Add row number column if requested (MUST be called before early return)\n const columnsWithRowNumber = React.useMemo(() => {\n const cols = showRowNumber ? [rowNumberColumn, ...columns] : columns;\n // Apply enableSortingByDefault to all columns that don't explicitly disable sorting\n if (enableSortingByDefault) {\n return cols.map((col) => ({\n ...col,\n enableSorting: col.enableSorting !== false,\n }));\n }\n return cols;\n }, [showRowNumber, columns, rowNumberColumn, enableSortingByDefault]);\n\n // Helper to extract nested ID safely (MUST be called before early return)\n const getRowId = React.useCallback(\n (originalRow: TData) => {\n if (!rowIdField) return undefined;\n // Simple dot notation support for id field\n\n return rowIdField.split('_').reduce<unknown>((obj, key) => {\n if (\n obj &&\n typeof obj === 'object' &&\n key !== '__proto__' &&\n key !== 'constructor' &&\n key !== 'prototype' &&\n Object.prototype.hasOwnProperty.call(obj, key)\n ) {\n return (obj as Record<string, unknown>)[key];\n }\n return undefined;\n }, originalRow as unknown);\n },\n [rowIdField],\n );\n\n // Persist settings to store (MUST be called before early return)\n React.useEffect(() => {\n if (storageKey && hasHydrated && settingsLoaded === loadKey) {\n setTableSettings(storageKey, {\n columnOrder,\n columnVisibility,\n sorting,\n pageSize: pagination.pageSize,\n });\n }\n }, [storageKey, columnOrder, columnVisibility, sorting, pagination.pageSize, setTableSettings, hasHydrated, settingsLoaded, loadKey]);\n\n React.useEffect(() => {\n if (manualFiltering && onColumnFiltersChange) {\n onColumnFiltersChange(columnFilters);\n }\n }, [columnFilters, manualFiltering, onColumnFiltersChange]);\n\n // Create table instance (MUST be called before early return)\n const table = useTable({\n features: dataTableFeatures,\n data,\n // Table 9 erases heterogeneous cell values to unknown at the table boundary.\n columns: columnsWithRowNumber as ColumnDef<TData>[],\n pageCount: manualPagination ? pageCount : undefined,\n rowCount: manualPagination ? rowCount : undefined,\n getRowId: rowIdField\n ? (originalRow, index) => {\n const id = rowIdField.split('_').reduce<unknown>((obj, key) => {\n if (obj && typeof obj === 'object' && key in (obj as Record<string, unknown>)) {\n return (obj as Record<string, unknown>)[key];\n }\n return undefined;\n }, originalRow as unknown);\n return id !== undefined ? String(id) : String(index);\n }\n : undefined,\n state: {\n sorting,\n columnFilters,\n columnVisibility,\n rowSelection,\n pagination,\n columnOrder,\n },\n enableRowSelection: true,\n enableMultiSort,\n onRowSelectionChange: setRowSelection,\n onSortingChange: setSorting,\n onColumnFiltersChange: setColumnFilters,\n onColumnVisibilityChange: setColumnVisibility,\n onPaginationChange: setPagination,\n onColumnOrderChange: setColumnOrder,\n autoResetPageIndex: manualPagination || isPaginationControlled ? false : undefined,\n manualPagination,\n manualSorting,\n manualFiltering,\n });\n\n // Sync selection to parent (MUST be called before early return)\n React.useEffect(() => {\n if (onSelectionChange) {\n const selectedRows = table.getFilteredSelectedRowModel().rows.map((row) => row.original);\n onSelectionChange(selectedRows);\n }\n }, [rowSelection, table, onSelectionChange]);\n\n // A drag captures the registered leaf subset. Hidden/changed columns never use stale indices.\n const dragSnapshot = React.useRef<{\n sourceId: string; groupId: string; ids: string[]; leafIds: string[]; order: string[];\n } | null>(null);\n const handleDragStart = React.useCallback((event: DragStartEvent) => {\n const source = event.operation.source;\n if (!source || !Array.isArray(source.data.columnIds)) return;\n dragSnapshot.current = {\n sourceId: String(source.id), groupId: source.data.groupId,\n ids: [...source.data.columnIds], leafIds: table.getAllLeafColumns().map(column => column.id),\n order: [...columnOrder],\n };\n }, [table, columnOrder]);\n const handleDragEnd = React.useCallback((event: DragEndEvent) => {\n const snapshot = dragSnapshot.current;\n dragSnapshot.current = null;\n const {source, target} = event.operation;\n if (event.canceled || !enableColumnOrdering || !snapshot || !target || !isSortable(source) || String(source.id) !== snapshot.sourceId) return;\n const leafIds = table.getAllLeafColumns().map(column => column.id);\n const group = table.getHeaderGroups().find(group => group.id === snapshot.groupId);\n const registeredIds = group?.headers.filter(header => !header.isPlaceholder && header.column.columns.length === 0).map(header => header.column.id);\n if (!registeredIds || JSON.stringify(registeredIds) !== JSON.stringify(snapshot.ids) ||\n JSON.stringify(leafIds) !== JSON.stringify(snapshot.leafIds) || JSON.stringify(columnOrder) !== JSON.stringify(snapshot.order)) return;\n setColumnOrder(order => reorderVisibleColumns(order, leafIds, snapshot.ids, source.data.columnId, source.initialIndex, source.index));\n }, [table, columnOrder, enableColumnOrdering]);\n\n // Get sort index for multi-sort display (MUST be called before early return)\n const getSortIndex = React.useCallback(\n (columnId: string): number => {\n return sorting.findIndex((s) => s.id === columnId);\n },\n [sorting],\n );\n\n // Render table content (MUST be called before early return)\n const renderTable = React.useCallback(\n () => (\n <DragDropProvider\n sensors={defaults => [...defaults.filter(sensor => sensor !== PointerSensor), PointerSensor.configure({activationConstraints: [new PointerActivationConstraints.Distance({value: 8})]})]}\n plugins={defaults => [...defaults, Feedback.configure({feedback: 'clone', dropAnimation: {duration: 0}})]}\n onDragStart={handleDragStart} onDragEnd={handleDragEnd}\n >\n <div className={cn('rounded-md border', tableClassName)}>\n <Table>\n <TableHeader>\n {table.getHeaderGroups().map(headerGroup => {\n const registeredIds = headerGroup.headers.filter(header => !header.isPlaceholder && header.column.columns.length === 0).map(header => header.column.id);\n return <TableRow key={headerGroup.id}>\n {headerGroup.headers.map(header => <DataTableColumnHeader\n key={header.id} header={header} enableColumnOrdering={enableColumnOrdering}\n enableMultiSort={enableMultiSort} sortIndex={getSortIndex(header.column.id)}\n sortableIndex={registeredIds.indexOf(header.column.id)} sortableGroup={headerGroup.id}\n registeredIds={registeredIds}\n />)}\n </TableRow>;\n })}\n </TableHeader>\n <TableBody>\n {table.getRowModel().rows?.length ? (\n table.getRowModel().rows.map((row) => (\n <TableRow\n key={row.id}\n data-state={row.getIsSelected() && 'selected'}\n onClick={() =>\n onRowClick && onRowClick(getRowId(row.original) as string | number)\n }\n className={onRowClick ? 'cursor-pointer hover:bg-muted/50' : undefined}\n >\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : (\n <TableRow>\n <TableCell colSpan={columnsWithRowNumber.length} className='h-24 text-center'>\n {m.dataTable_noResults()}\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </div>\n </DragDropProvider>\n ),\n [\n handleDragStart,\n handleDragEnd,\n table,\n columnsWithRowNumber,\n columnOrder,\n enableColumnOrdering,\n enableMultiSort,\n getSortIndex,\n onRowClick,\n getRowId,\n tableClassName,\n ],\n );\n\n // Render loading table during SSR - simple version to avoid hydration issues\n const renderLoadingTable = () => (\n <div className={cn('rounded-md border', tableClassName)}>\n <Table>\n <TableBody>\n <TableRow>\n <TableCell className='h-24 text-center'>\n <div className='text-muted-foreground'>Loading...</div>\n </TableCell>\n </TableRow>\n </TableBody>\n </Table>\n </div>\n );\n\n // Variant: minimal - just table with pagination\n if (variant === 'minimal') {\n return (\n <div className={cn('space-y-4', containerClassName)}>\n {mounted ? renderTable() : renderLoadingTable()}\n <DataTablePagination table={table} pageSizeOptions={pageSizeOptions} />\n </div>\n );\n }\n\n // Variant: toolbar - setagaya-front style with toolbar above table\n if (variant === 'toolbar') {\n return (\n <div className={cn('relative h-full', containerClassName)}>\n {onAdd && (\n <div className='absolute left-0 top-0 w-full h-full z-10 pointer-events-none'>\n <div className='fixed right-4 bottom-10 pointer-events-auto'>\n <Button\n type='button'\n size='icon'\n aria-label='Add row'\n onClick={onAdd}\n className='w-12 h-12 rounded-full shadow-lg'\n >\n <Plus className='w-6 h-6' />\n </Button>\n </div>\n </div>\n )}\n <div className='relative h-full flex flex-col'>\n {/* Toolbar */}\n <div className='bg-muted p-2 rounded-t-md grid grid-cols-1 sm:grid-cols-[1fr_minmax(0,auto)_1fr] items-center gap-2'>\n {/* Center: Column settings + filter content */}\n <div className='flex flex-wrap justify-center items-center gap-2 sm:col-start-2 sm:col-end-3'>\n <DataTableViewOptions table={table} />\n {filterContent && filterLayout === 'inline' && filterContent}\n {filterContent && filterLayout === 'panel' && (\n <Button\n type='button'\n variant={filterOpen ? 'default' : 'outline'}\n size='sm'\n onClick={() => setFilterOpen(!filterOpen)}\n className='h-8 gap-1.5'\n >\n <FilterIcon className='h-4 w-4' />\n <span>フィルター</span>\n </Button>\n )}\n </div>\n {/* Right: Pagination + count */}\n <div className='flex items-center gap-3 justify-center sm:justify-end sm:col-start-3 sm:col-end-4'>\n <DataTablePaginationCompact table={table} pageSizeOptions={pageSizeOptions} />\n {typeof itemCount === 'number' && (\n <span className='text-sm text-muted-foreground whitespace-nowrap'>\n {`${itemCount.toLocaleString()} ${m.dataTable_items()}`}\n </span>\n )}\n </div>\n </div>\n {/* Filter Panel (Collapsible) */}\n {filterContent && filterLayout === 'panel' && (\n <div\n className={cn(\n 'border-b transition-all duration-200 ease-in-out overflow-hidden bg-background',\n filterOpen ? 'max-h-[500px] p-4' : 'max-h-0 p-0 border-none',\n )}\n >\n {filterContent}\n </div>\n )}\n {/* Active Filters Display */}\n {activeFiltersContent && (\n <div className='bg-background px-4 py-1.5 border-b'>{activeFiltersContent}</div>\n )}\n {/* Table */}\n <div className='flex-1 overflow-auto'>\n {mounted ? renderTable() : renderLoadingTable()}\n </div>\n </div>\n </div>\n );\n }\n\n // Variant: default - current behavior\n return (\n <div className={cn('space-y-4', containerClassName)}>\n <div className='flex items-center justify-between'>\n <div className='flex items-center py-4'>\n {filterColumn && (\n <Input\n placeholder={m.dataTable_filterPlaceholder({ column: filterColumn })}\n value={(table.getColumn(filterColumn)?.getFilterValue() as string) ?? ''}\n onChange={(event) =>\n table.getColumn(filterColumn)?.setFilterValue(event.target.value)\n }\n className='max-w-sm'\n />\n )}\n </div>\n <DataTableViewOptions table={table} />\n </div>\n {activeFiltersContent && (\n <div className='border rounded-md bg-background px-3 py-1'>{activeFiltersContent}</div>\n )}\n {mounted ? renderTable() : renderLoadingTable()}\n <DataTablePagination table={table} pageSizeOptions={pageSizeOptions} />\n {onAdd && (\n <div className='fixed right-4 bottom-10 z-10'>\n <Button\n type='button'\n size='icon'\n onClick={onAdd}\n className='w-12 h-12 rounded-full shadow-lg'\n >\n <Plus className='w-6 h-6' />\n </Button>\n </div>\n )}\n </div>\n );\n}\n\n// =============================================================================\n// View Options Component\n// =============================================================================\n\ninterface DataTableViewOptionsProps<TData extends object> {\n table: TableInstance<TData>;\n}\n\n/**\n * テーブルの表示列を切り替える設定ドロップダウンメニューコンポーネント\n */\nexport function DataTableViewOptions<TData extends object>({ table }: DataTableViewOptionsProps<TData>) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger\n className={buttonVariants({ variant: 'default', size: 'sm', className: 'h-8' })}\n >\n <Settings2 className='mr-2 h-4 w-4' />\n {m.dataTable_view()}\n </DropdownMenuTrigger>\n <DropdownMenuContent align='end' className='w-40'>\n <DropdownMenuGroup>\n <DropdownMenuLabel>{m.dataTable_toggleColumns()}</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {table\n .getAllColumns()\n .filter((column) => typeof column.accessorFn !== 'undefined' && column.getCanHide())\n .map((column) => {\n return (\n <DropdownMenuCheckboxItem\n key={column.id}\n className='capitalize'\n checked={column.getIsVisible()}\n onCheckedChange={(value) => column.toggleVisibility(!!value)}\n >\n {typeof column.columnDef.header === 'string'\n ? column.columnDef.header\n : column.id}\n </DropdownMenuCheckboxItem>\n );\n })}\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\n// =============================================================================\n// Pagination Component (Full)\n// =============================================================================\n\ninterface DataTablePaginationProps<TData extends object> {\n table: TableInstance<TData>;\n pageSizeOptions?: number[];\n}\n\n/**\n * テーブルの標準的なページネーションコントロールコンポーネント\n */\nexport function DataTablePagination<TData extends object>({\n table,\n pageSizeOptions = [10, 20, 30, 50, 100],\n}: DataTablePaginationProps<TData>) {\n return (\n <div className='flex items-center justify-between px-2'>\n <div className='flex-1 text-sm text-muted-foreground'>\n {m.dataTable_rowsSelected({\n selected: table.getFilteredSelectedRowModel().rows.length,\n total: table.getFilteredRowModel().rows.length,\n })}\n </div>\n <div className='flex items-center space-x-6 lg:space-x-8'>\n <div className='flex items-center space-x-2'>\n <p className='text-sm font-medium'>{m.dataTable_rowsPerPage()}</p>\n <select\n aria-label={m.dataTable_rowsPerPage()}\n value={`${table.store.state.pagination.pageSize}`}\n onChange={(e) => {\n table.setPageSize(Number(e.target.value));\n }}\n className='h-8 w-fit min-w-16 rounded-md border border-input bg-background px-2 py-1 text-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2'\n >\n {pageSizeOptions.map((pageSize) => (\n <option key={pageSize} value={`${pageSize}`}>\n {pageSize}\n </option>\n ))}\n </select>\n </div>\n <div className='flex w-24 items-center justify-center text-sm font-medium'>\n {m.dataTable_page({\n current: table.store.state.pagination.pageIndex + 1,\n total: table.getPageCount(),\n })}\n </div>\n <div className='flex items-center space-x-2'>\n <Button\n variant='default'\n size='icon'\n className='hidden h-8 w-8 lg:flex hover:bg-primary/90'\n aria-label={m.dataTable_goToFirstPage()}\n onClick={() => table.setPageIndex(0)}\n disabled={!table.getCanPreviousPage()}\n >\n <span className='sr-only'>{m.dataTable_goToFirstPage()}</span>\n <ChevronsLeft className='h-4 w-4' />\n </Button>\n <Button\n variant='default'\n size='icon'\n className='h-8 w-8 hover:bg-primary/90'\n aria-label={m.dataTable_goToPreviousPage()}\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n >\n <span className='sr-only'>{m.dataTable_goToPreviousPage()}</span>\n <ChevronLeft className='h-4 w-4' />\n </Button>\n <Button\n variant='default'\n size='icon'\n className='h-8 w-8 hover:bg-primary/90'\n aria-label={m.dataTable_goToNextPage()}\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n >\n <span className='sr-only'>{m.dataTable_goToNextPage()}</span>\n <ChevronRight className='h-4 w-4' />\n </Button>\n <Button\n variant='default'\n size='icon'\n className='hidden h-8 w-8 lg:flex hover:bg-primary/90'\n aria-label={m.dataTable_goToLastPage()}\n onClick={() => table.setPageIndex(table.getPageCount() - 1)}\n disabled={!table.getCanNextPage()}\n >\n <span className='sr-only'>{m.dataTable_goToLastPage()}</span>\n <ChevronsRight className='h-4 w-4' />\n </Button>\n </div>\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// Pagination Component (Compact - for toolbar variant)\n// =============================================================================\n\ninterface DataTablePaginationCompactProps<TData extends object> {\n table: TableInstance<TData>;\n pageSizeOptions?: number[];\n}\n\n/**\n * ツールバー等に配置するコンパクトなページネーションコントロールコンポーネント\n */\nexport function DataTablePaginationCompact<TData extends object>({\n table,\n pageSizeOptions = [10, 20, 30, 50, 100],\n}: DataTablePaginationCompactProps<TData>) {\n const totalPages = table.getPageCount();\n\n return (\n <div className='flex items-center gap-1'>\n <select\n aria-label={m.dataTable_rowsPerPage()}\n value={`${table.store.state.pagination.pageSize}`}\n onChange={(e) => {\n table.setPageSize(Number(e.target.value));\n }}\n className='h-8 w-fit min-w-16 rounded-md border border-input bg-background px-2 py-1 text-sm'\n >\n {pageSizeOptions.map((pageSize) => (\n <option key={pageSize} value={`${pageSize}`}>\n {pageSize}\n </option>\n ))}\n </select>\n {totalPages > 1 && (\n <>\n <Button\n variant='default'\n size='icon'\n className='h-8 w-8 hover:bg-primary/90'\n aria-label={m.dataTable_goToFirstPage()}\n onClick={() => table.setPageIndex(0)}\n disabled={table.store.state.pagination.pageIndex === 0}\n >\n <ChevronsLeft className='h-4 w-4' />\n </Button>\n <Button\n variant='default'\n size='icon'\n className='h-8 w-8 hover:bg-primary/90'\n aria-label={m.dataTable_goToPreviousPage()}\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n >\n <ChevronLeft className='h-4 w-4' />\n </Button>\n <span className='text-sm text-muted-foreground whitespace-nowrap px-1'>\n {table.store.state.pagination.pageIndex + 1} / {totalPages}\n </span>\n <Button\n variant='default'\n size='icon'\n className='h-8 w-8 hover:bg-primary/90'\n aria-label={m.dataTable_goToNextPage()}\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n >\n <ChevronRight className='h-4 w-4' />\n </Button>\n <Button\n variant='default'\n size='icon'\n className='h-8 w-8 hover:bg-primary/90'\n aria-label={m.dataTable_goToLastPage()}\n onClick={() => table.setPageIndex(totalPages - 1)}\n disabled={table.store.state.pagination.pageIndex === totalPages - 1}\n >\n <ChevronsRight className='h-4 w-4' />\n </Button>\n </>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../ui/lib/utils.cjs"),n=require("./KanbanCardView.cjs");let
|
|
1
|
+
"use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../ui/lib/utils.cjs"),n=require("../ui/dnd/use-accessible-drag-ref.cjs"),r=require("./KanbanCardView.cjs");let i=require("react/jsx-runtime"),a=require("react");a=e.__toESM(a,1);let o=require("@dnd-kit/react"),s=require("@dnd-kit/collision"),c=require("react-dom");function l({controller:e,overlayClassName:t,children:n}){let a=e.activeTask&&(0,i.jsx)(r.KanbanCardView,{task:e.activeTask});return(0,i.jsxs)(o.DragDropProvider,{...e.contextProps,children:[n,typeof document<`u`&&(0,c.createPortal)((0,i.jsx)(o.DragOverlay,{dropAnimation:{duration:0},children:a&&(t?(0,i.jsx)(`div`,{className:t,children:a}):a)}),document.body)]})}function u({task:e,disabled:r,className:s,children:c,style:l,...u}){let{ref:d,draggable:f,isDragging:p}=(0,o.useDraggable)({id:e.id,type:`kanban-task`,data:{type:`Task`,task:e},disabled:r}),m=a.useRef(null),h=a.useCallback(e=>{m.current=e,d(r?null:e)},[d,r]),g=n.useAccessibleDragRef(h,!r);return a.useLayoutEffect(()=>{if(r){let t=f.manager?.registry.draggables.get(e.id);t&&(t.element=void 0);for(let e of[`tabindex`,`role`,`aria-roledescription`,`aria-describedby`,`aria-disabled`,`aria-pressed`,`aria-grabbed`]){let t=u[e===`tabindex`?`tabIndex`:e];t==null?m.current?.removeAttribute(e):m.current?.setAttribute(e,String(t))}}}),(0,i.jsx)(`div`,{ref:g,tabIndex:r?void 0:0,role:r?void 0:`button`,"aria-roledescription":r?void 0:`draggable`,style:l,"data-task-id":e.id,...u,className:t.cn(`cursor-grab active:cursor-grabbing`,r&&`cursor-default`,p&&`opacity-30`,s),children:c})}var d=a.forwardRef(({column:e,isOverLimit:n,className:r,children:c,...l},u)=>{let{ref:d,isDropTarget:f}=(0,o.useDroppable)({id:e.id,accept:`kanban-task`,collisionDetector:s.pointerIntersection,data:{type:`Column`,column:e}}),p=a.useCallback(e=>{if(d(e),typeof u==`function`){let t=u(e);if(typeof t==`function`)return()=>{d(null),t()}}else u&&(u.current=e)},[d,u]);return(0,i.jsx)(`div`,{ref:p,"data-slot":`kanban-column`,"data-column-id":e.id,"data-over":f||void 0,"data-over-limit":n||void 0,...l,className:t.cn(`flex h-full w-[320px] min-w-[320px] flex-col rounded-lg bg-muted/30 dark:bg-muted/10 p-3 transition-colors duration-200`,f&&`bg-primary/5 ring-2 ring-primary/20`,n&&`bg-destructive/5`,r),children:c})});d.displayName=`KanbanColumnFrame`,exports.KanbanColumnFrame=d,exports.KanbanDragSurface=l,exports.KanbanDraggableCard=u;
|
|
2
2
|
//# sourceMappingURL=kanban-primitives.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kanban-primitives.cjs","names":["KanbanCardView","DragDropProvider","createPortal","DragOverlay","useDraggable","React","cn","useDroppable","pointerIntersection","require_runtime","require_ui_lib_utils","require_tools_components_kanban_KanbanCardView","react_jsx_runtime","react","_dnd_kit_react","_dnd_kit_collision","react_dom","KanbanDragSurface","card","controller","children","overlayClassName","KanbanDraggableCard","props","task","elementRef","cardRef","element","ref","disabled","registered","draggable","attribute","supplied","isDragging","className","KanbanColumnFrame","setNodeRef","isOver","column","composedRef","node","cleanup","isOverLimit"],"sources":["../../../../src/tools/components/kanban/kanban-primitives.tsx"],"sourcesContent":["import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { DragDropProvider, DragOverlay, useDraggable, useDroppable } from '@dnd-kit/react';\nimport { pointerIntersection } from '@dnd-kit/collision';\nimport { cn } from '../../lib/utils';\nimport { KanbanCardView } from './KanbanCardView';\nimport type { KanbanColumn, KanbanTask } from './types';\nimport type { useKanbanDrag } from './use-kanban-drag';\n\n/**\n * Render the native Kanban provider and one body-portal overlay.\n * @param props - Native controller, optional overlay class and registered children.\n * @returns The provider and overlay; no portal is created during server rendering.\n * @remarks Uses immediate drop completion with native focus restoration. The\n * overlay is presentation only and never registers a second draggable.\n * @example\n * ```tsx\n * import {KanbanDragSurface, KanbanColumnFrame, KanbanDraggableCard, useKanbanDrag}\n * from '@alneas/appkit-react/tools/kanban';\n * import '@alneas/appkit-react/styles';\n * export function CustomCards() {\n * const tasks = [{id: 'one', title: 'Review', status: 'todo'}];\n * const controller = useKanbanDrag({tasks});\n * return <KanbanDragSurface controller={controller}>\n * <KanbanColumnFrame column={{id: 'todo', title: 'Todo'}}>\n * <KanbanDraggableCard task={tasks[0]}>Review</KanbanDraggableCard>\n * </KanbanColumnFrame>\n * </KanbanDragSurface>;\n * }\n * ```\n */\nexport function KanbanDragSurface({\n controller,\n overlayClassName,\n children,\n}: {\n controller: ReturnType<typeof useKanbanDrag>;\n overlayClassName?: string;\n children: React.ReactNode;\n}) {\n const card = controller.activeTask && <KanbanCardView task={controller.activeTask} />;\n return (\n <DragDropProvider {...controller.contextProps}>\n {children}\n {typeof document !== 'undefined' &&\n createPortal(\n <DragOverlay dropAnimation={{duration: 0}}>\n {card && (overlayClassName ? <div className={overlayClassName}>{card}</div> : card)}\n </DragOverlay>,\n document.body,\n )}\n </DragDropProvider>\n );\n}\n\n/**\n * Register a native status-only Kanban card with custom content.\n * @param props - Task, optional disabled flag (default false), HTML attributes,\n * custom style and children. Caller-supplied accessibility attributes are retained.\n * @returns A div registered under the native Kanban surface.\n * @remarks Requires the same native provider as KanbanColumnFrame. Disabled cards\n * have no automatic drag tab stop; this component does not persist order or status.\n * @example\n * ```tsx\n * import {KanbanDragSurface, KanbanColumnFrame, KanbanDraggableCard, useKanbanDrag}\n * from '@alneas/appkit-react/tools/kanban';\n * import '@alneas/appkit-react/styles';\n * export function CustomCards() {\n * const tasks = [{id: 'one', title: 'Review', status: 'todo'}];\n * const controller = useKanbanDrag({tasks});\n * return <KanbanDragSurface controller={controller}>\n * <KanbanColumnFrame column={{id: 'todo', title: 'Todo'}}>\n * <KanbanDraggableCard task={tasks[0]}>Review</KanbanDraggableCard>\n * </KanbanColumnFrame>\n * </KanbanDragSurface>;\n * }\n * ```\n */\nexport function KanbanDraggableCard({\n task,\n disabled,\n className,\n children,\n style,\n ...props\n}: React.HTMLAttributes<HTMLDivElement> & { task: KanbanTask; disabled?: boolean }) {\n const { ref, draggable, isDragging } = useDraggable({\n id: task.id,\n type: 'kanban-task',\n data: { type: 'Task', task },\n disabled,\n });\n const elementRef = React.useRef<HTMLDivElement | null>(null);\n const cardRef = React.useCallback((element: HTMLDivElement | null) => {\n elementRef.current = element;\n ref(disabled ? null : element);\n }, [ref, disabled]);\n React.useLayoutEffect(() => {\n // Native ref cleanup retains an active source. Explicitly detach read-only\n // cards so Accessibility cannot restore drag attributes after React clears them.\n if (disabled) {\n const registered = draggable.manager?.registry.draggables.get(task.id);\n if (registered) registered.element = undefined;\n for (const attribute of ['tabindex', 'role', 'aria-roledescription', 'aria-describedby', 'aria-disabled', 'aria-pressed', 'aria-grabbed']) {\n const supplied = props[attribute === 'tabindex' ? 'tabIndex' : attribute as keyof typeof props];\n if (supplied == null) elementRef.current?.removeAttribute(attribute);\n else elementRef.current?.setAttribute(attribute, String(supplied));\n }\n }\n });\n return (\n <div\n ref={cardRef}\n tabIndex={disabled ? undefined : 0}\n role={disabled ? undefined : 'button'}\n aria-roledescription={disabled ? undefined : 'draggable'}\n style={style}\n data-task-id={task.id}\n {...props}\n className={cn(\n 'cursor-grab active:cursor-grabbing',\n disabled && 'cursor-default',\n isDragging && 'opacity-30',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n\n/**\n * Register a native Kanban column while retaining host-composed content.\n * @remarks Retain forwardRef to compose native registration and caller refs, including\n * callback cleanup; this is not a direct DOM-ref passthrough.\n * @param props - Column metadata, optional limit presentation, HTML attributes and children.\n * @param ref - Forwarded div ref, including React 19 callback cleanup support.\n * @returns A column div accepting Kanban task registrations.\n * @remarks Requires the native Kanban surface. Pointer intersection excludes outside\n * drops; WIP limits are presentational and do not reject a host status callback.\n * @example\n * ```tsx\n * import {KanbanDragSurface, KanbanColumnFrame, KanbanDraggableCard, useKanbanDrag}\n * from '@alneas/appkit-react/tools/kanban';\n * import '@alneas/appkit-react/styles';\n * export function CustomCards() {\n * const tasks = [{id: 'one', title: 'Review', status: 'todo'}];\n * const controller = useKanbanDrag({tasks});\n * return <KanbanDragSurface controller={controller}>\n * <KanbanColumnFrame column={{id: 'todo', title: 'Todo'}}>\n * <KanbanDraggableCard task={tasks[0]}>Review</KanbanDraggableCard>\n * </KanbanColumnFrame>\n * </KanbanDragSurface>;\n * }\n * ```\n */\nexport const KanbanColumnFrame = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & { column: KanbanColumn; isOverLimit?: boolean }\n>(({ column, isOverLimit, className, children, ...props }, ref) => {\n const { ref: setNodeRef, isDropTarget: isOver } = useDroppable({\n id: column.id,\n accept: 'kanban-task',\n collisionDetector: pointerIntersection,\n data: { type: 'Column', column },\n });\n const composedRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n setNodeRef(node);\n if (typeof ref === 'function') {\n // ForwardedRef also supports React 18's void return type; React 19 may return cleanup.\n const cleanup: unknown = ref(node);\n if (typeof cleanup === 'function')\n return () => {\n setNodeRef(null);\n cleanup();\n };\n } else if (ref) ref.current = node;\n },\n [setNodeRef, ref],\n );\n return (\n <div\n ref={composedRef}\n data-slot='kanban-column'\n data-column-id={column.id}\n data-over={isOver || undefined}\n data-over-limit={isOverLimit || undefined}\n {...props}\n className={cn(\n 'flex h-full w-[320px] min-w-[320px] flex-col rounded-lg bg-muted/30 dark:bg-muted/10 p-3 transition-colors duration-200',\n isOver && 'bg-primary/5 ring-2 ring-primary/20',\n isOverLimit && 'bg-destructive/5',\n className,\n )}\n >\n {children}\n </div>\n );\n});\nKanbanColumnFrame.displayName = 'KanbanColumnFrame';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"kanban-primitives.cjs","names":["KanbanCardView","DragDropProvider","createPortal","DragOverlay","useDraggable","React","useAccessibleDragRef","cn","useDroppable","pointerIntersection","require_runtime","require_ui_lib_utils","require_tools_components_ui_dnd_use_accessible_drag_ref","require_tools_components_kanban_KanbanCardView","react_jsx_runtime","react","_dnd_kit_react","_dnd_kit_collision","react_dom","KanbanDragSurface","card","controller","children","overlayClassName","KanbanDraggableCard","props","task","elementRef","cardRef","element","ref","disabled","accessibleCardRef","registered","draggable","attribute","supplied","isDragging","className","KanbanColumnFrame","setNodeRef","isOver","column","composedRef","node","cleanup","isOverLimit"],"sources":["../../../../src/tools/components/kanban/kanban-primitives.tsx"],"sourcesContent":["import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { DragDropProvider, DragOverlay, useDraggable, useDroppable } from '@dnd-kit/react';\nimport { pointerIntersection } from '@dnd-kit/collision';\nimport { cn } from '../../lib/utils';\nimport {useAccessibleDragRef} from '../ui/dnd/use-accessible-drag-ref';\nimport { KanbanCardView } from './KanbanCardView';\nimport type { KanbanColumn, KanbanTask } from './types';\nimport type { useKanbanDrag } from './use-kanban-drag';\n\n/**\n * Render the native Kanban provider and one body-portal overlay.\n * @param props - Native controller, optional overlay class and registered children.\n * @returns The provider and overlay; no portal is created during server rendering.\n * @remarks Uses immediate drop completion with native focus restoration. The\n * overlay is presentation only and never registers a second draggable.\n * @example\n * ```tsx\n * import {KanbanDragSurface, KanbanColumnFrame, KanbanDraggableCard, useKanbanDrag}\n * from '@alneas/appkit-react/tools/kanban';\n * import '@alneas/appkit-react/styles';\n * export function CustomCards() {\n * const tasks = [{id: 'one', title: 'Review', status: 'todo'}];\n * const controller = useKanbanDrag({tasks});\n * return <KanbanDragSurface controller={controller}>\n * <KanbanColumnFrame column={{id: 'todo', title: 'Todo'}}>\n * <KanbanDraggableCard task={tasks[0]}>Review</KanbanDraggableCard>\n * </KanbanColumnFrame>\n * </KanbanDragSurface>;\n * }\n * ```\n */\nexport function KanbanDragSurface({\n controller,\n overlayClassName,\n children,\n}: {\n controller: ReturnType<typeof useKanbanDrag>;\n overlayClassName?: string;\n children: React.ReactNode;\n}) {\n const card = controller.activeTask && <KanbanCardView task={controller.activeTask} />;\n return (\n <DragDropProvider {...controller.contextProps}>\n {children}\n {typeof document !== 'undefined' &&\n createPortal(\n <DragOverlay dropAnimation={{duration: 0}}>\n {card && (overlayClassName ? <div className={overlayClassName}>{card}</div> : card)}\n </DragOverlay>,\n document.body,\n )}\n </DragDropProvider>\n );\n}\n\n/**\n * Register a native status-only Kanban card with custom content.\n * @param props - Task, optional disabled flag (default false), HTML attributes,\n * custom style and children. Caller-supplied accessibility attributes are retained.\n * @returns A div registered under the native Kanban surface.\n * @remarks Requires the same native provider as KanbanColumnFrame. Disabled cards\n * have no automatic drag tab stop; this component does not persist order or status.\n * @example\n * ```tsx\n * import {KanbanDragSurface, KanbanColumnFrame, KanbanDraggableCard, useKanbanDrag}\n * from '@alneas/appkit-react/tools/kanban';\n * import '@alneas/appkit-react/styles';\n * export function CustomCards() {\n * const tasks = [{id: 'one', title: 'Review', status: 'todo'}];\n * const controller = useKanbanDrag({tasks});\n * return <KanbanDragSurface controller={controller}>\n * <KanbanColumnFrame column={{id: 'todo', title: 'Todo'}}>\n * <KanbanDraggableCard task={tasks[0]}>Review</KanbanDraggableCard>\n * </KanbanColumnFrame>\n * </KanbanDragSurface>;\n * }\n * ```\n */\nexport function KanbanDraggableCard({\n task,\n disabled,\n className,\n children,\n style,\n ...props\n}: React.HTMLAttributes<HTMLDivElement> & { task: KanbanTask; disabled?: boolean }) {\n const { ref, draggable, isDragging } = useDraggable({\n id: task.id,\n type: 'kanban-task',\n data: { type: 'Task', task },\n disabled,\n });\n const elementRef = React.useRef<HTMLDivElement | null>(null);\n const cardRef = React.useCallback((element: HTMLDivElement | null) => {\n elementRef.current = element;\n ref(disabled ? null : element);\n }, [ref, disabled]);\n const accessibleCardRef = useAccessibleDragRef(cardRef, !disabled);\n React.useLayoutEffect(() => {\n // Native ref cleanup retains an active source. Explicitly detach read-only\n // cards so Accessibility cannot restore drag attributes after React clears them.\n if (disabled) {\n const registered = draggable.manager?.registry.draggables.get(task.id);\n if (registered) registered.element = undefined;\n for (const attribute of ['tabindex', 'role', 'aria-roledescription', 'aria-describedby', 'aria-disabled', 'aria-pressed', 'aria-grabbed']) {\n const supplied = props[attribute === 'tabindex' ? 'tabIndex' : attribute as keyof typeof props];\n if (supplied == null) elementRef.current?.removeAttribute(attribute);\n else elementRef.current?.setAttribute(attribute, String(supplied));\n }\n }\n });\n return (\n <div\n ref={accessibleCardRef}\n tabIndex={disabled ? undefined : 0}\n role={disabled ? undefined : 'button'}\n aria-roledescription={disabled ? undefined : 'draggable'}\n style={style}\n data-task-id={task.id}\n {...props}\n className={cn(\n 'cursor-grab active:cursor-grabbing',\n disabled && 'cursor-default',\n isDragging && 'opacity-30',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n\n/**\n * Register a native Kanban column while retaining host-composed content.\n * @remarks Retain forwardRef to compose native registration and caller refs, including\n * callback cleanup; this is not a direct DOM-ref passthrough.\n * Requires the native Kanban surface. Pointer intersection excludes outside\n * drops; WIP limits are presentational and do not reject a host status callback.\n * @param props - Column metadata, optional limit presentation, HTML attributes and children.\n * @param ref - Forwarded div ref, including React 19 callback cleanup support.\n * @returns A column div accepting Kanban task registrations.\n * @example\n * ```tsx\n * import {KanbanDragSurface, KanbanColumnFrame, KanbanDraggableCard, useKanbanDrag}\n * from '@alneas/appkit-react/tools/kanban';\n * import '@alneas/appkit-react/styles';\n * export function CustomCards() {\n * const tasks = [{id: 'one', title: 'Review', status: 'todo'}];\n * const controller = useKanbanDrag({tasks});\n * return <KanbanDragSurface controller={controller}>\n * <KanbanColumnFrame column={{id: 'todo', title: 'Todo'}}>\n * <KanbanDraggableCard task={tasks[0]}>Review</KanbanDraggableCard>\n * </KanbanColumnFrame>\n * </KanbanDragSurface>;\n * }\n * ```\n */\nexport const KanbanColumnFrame = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & { column: KanbanColumn; isOverLimit?: boolean }\n>(({ column, isOverLimit, className, children, ...props }, ref) => {\n const { ref: setNodeRef, isDropTarget: isOver } = useDroppable({\n id: column.id,\n accept: 'kanban-task',\n collisionDetector: pointerIntersection,\n data: { type: 'Column', column },\n });\n const composedRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n setNodeRef(node);\n if (typeof ref === 'function') {\n // ForwardedRef also supports React 18's void return type; React 19 may return cleanup.\n const cleanup: unknown = ref(node);\n if (typeof cleanup === 'function')\n return () => {\n setNodeRef(null);\n cleanup();\n };\n } else if (ref) ref.current = node;\n },\n [setNodeRef, ref],\n );\n return (\n <div\n ref={composedRef}\n data-slot='kanban-column'\n data-column-id={column.id}\n data-over={isOver || undefined}\n data-over-limit={isOverLimit || undefined}\n {...props}\n className={cn(\n 'flex h-full w-[320px] min-w-[320px] flex-col rounded-lg bg-muted/30 dark:bg-muted/10 p-3 transition-colors duration-200',\n isOver && 'bg-primary/5 ring-2 ring-primary/20',\n isOverLimit && 'bg-destructive/5',\n className,\n )}\n >\n {children}\n </div>\n );\n});\nKanbanColumnFrame.displayName = 'KanbanColumnFrame';\n"],"mappings":"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"}
|
|
@@ -59,11 +59,11 @@ export declare function KanbanDraggableCard({ task, disabled, className, childre
|
|
|
59
59
|
* Register a native Kanban column while retaining host-composed content.
|
|
60
60
|
* @remarks Retain forwardRef to compose native registration and caller refs, including
|
|
61
61
|
* callback cleanup; this is not a direct DOM-ref passthrough.
|
|
62
|
+
* Requires the native Kanban surface. Pointer intersection excludes outside
|
|
63
|
+
* drops; WIP limits are presentational and do not reject a host status callback.
|
|
62
64
|
* @param props - Column metadata, optional limit presentation, HTML attributes and children.
|
|
63
65
|
* @param ref - Forwarded div ref, including React 19 callback cleanup support.
|
|
64
66
|
* @returns A column div accepting Kanban task registrations.
|
|
65
|
-
* @remarks Requires the native Kanban surface. Pointer intersection excludes outside
|
|
66
|
-
* drops; WIP limits are presentational and do not reject a host status callback.
|
|
67
67
|
* @example
|
|
68
68
|
* ```tsx
|
|
69
69
|
* import {KanbanDragSurface, KanbanColumnFrame, KanbanDraggableCard, useKanbanDrag}
|
|
@@ -59,11 +59,11 @@ export declare function KanbanDraggableCard({ task, disabled, className, childre
|
|
|
59
59
|
* Register a native Kanban column while retaining host-composed content.
|
|
60
60
|
* @remarks Retain forwardRef to compose native registration and caller refs, including
|
|
61
61
|
* callback cleanup; this is not a direct DOM-ref passthrough.
|
|
62
|
+
* Requires the native Kanban surface. Pointer intersection excludes outside
|
|
63
|
+
* drops; WIP limits are presentational and do not reject a host status callback.
|
|
62
64
|
* @param props - Column metadata, optional limit presentation, HTML attributes and children.
|
|
63
65
|
* @param ref - Forwarded div ref, including React 19 callback cleanup support.
|
|
64
66
|
* @returns A column div accepting Kanban task registrations.
|
|
65
|
-
* @remarks Requires the native Kanban surface. Pointer intersection excludes outside
|
|
66
|
-
* drops; WIP limits are presentational and do not reject a host status callback.
|
|
67
67
|
* @example
|
|
68
68
|
* ```tsx
|
|
69
69
|
* import {KanbanDragSurface, KanbanColumnFrame, KanbanDraggableCard, useKanbanDrag}
|
|
@@ -1,40 +1,41 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { cn as e } from "../../../ui/lib/utils.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
3
|
+
import { useAccessibleDragRef as t } from "../ui/dnd/use-accessible-drag-ref.js";
|
|
4
|
+
import { KanbanCardView as n } from "./KanbanCardView.js";
|
|
5
|
+
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
6
|
+
import * as a from "react";
|
|
7
|
+
import { DragDropProvider as o, DragOverlay as s, useDraggable as c, useDroppable as l } from "@dnd-kit/react";
|
|
8
|
+
import { pointerIntersection as u } from "@dnd-kit/collision";
|
|
9
|
+
import { createPortal as d } from "react-dom";
|
|
9
10
|
//#region src/tools/components/kanban/kanban-primitives.tsx
|
|
10
|
-
function
|
|
11
|
-
let c = e.activeTask && /* @__PURE__ */ n
|
|
12
|
-
return /* @__PURE__ */
|
|
11
|
+
function f({ controller: e, overlayClassName: t, children: a }) {
|
|
12
|
+
let c = e.activeTask && /* @__PURE__ */ r(n, { task: e.activeTask });
|
|
13
|
+
return /* @__PURE__ */ i(o, {
|
|
13
14
|
...e.contextProps,
|
|
14
|
-
children: [
|
|
15
|
+
children: [a, typeof document < "u" && d(/* @__PURE__ */ r(s, {
|
|
15
16
|
dropAnimation: { duration: 0 },
|
|
16
|
-
children: c && (
|
|
17
|
-
className:
|
|
17
|
+
children: c && (t ? /* @__PURE__ */ r("div", {
|
|
18
|
+
className: t,
|
|
18
19
|
children: c
|
|
19
20
|
}) : c)
|
|
20
21
|
}), document.body)]
|
|
21
22
|
});
|
|
22
23
|
}
|
|
23
|
-
function
|
|
24
|
-
let { ref:
|
|
25
|
-
id:
|
|
24
|
+
function p({ task: n, disabled: i, className: o, children: s, style: l, ...u }) {
|
|
25
|
+
let { ref: d, draggable: f, isDragging: p } = c({
|
|
26
|
+
id: n.id,
|
|
26
27
|
type: "kanban-task",
|
|
27
28
|
data: {
|
|
28
29
|
type: "Task",
|
|
29
|
-
task:
|
|
30
|
+
task: n
|
|
30
31
|
},
|
|
31
|
-
disabled:
|
|
32
|
-
}),
|
|
33
|
-
|
|
34
|
-
}, [
|
|
35
|
-
return
|
|
36
|
-
if (
|
|
37
|
-
let e =
|
|
32
|
+
disabled: i
|
|
33
|
+
}), m = a.useRef(null), h = a.useCallback((e) => {
|
|
34
|
+
m.current = e, d(i ? null : e);
|
|
35
|
+
}, [d, i]), g = t(h, !i);
|
|
36
|
+
return a.useLayoutEffect(() => {
|
|
37
|
+
if (i) {
|
|
38
|
+
let e = f.manager?.registry.draggables.get(n.id);
|
|
38
39
|
e && (e.element = void 0);
|
|
39
40
|
for (let e of [
|
|
40
41
|
"tabindex",
|
|
@@ -45,52 +46,52 @@ function f({ task: t, disabled: r, className: a, children: o, style: c, ...l })
|
|
|
45
46
|
"aria-pressed",
|
|
46
47
|
"aria-grabbed"
|
|
47
48
|
]) {
|
|
48
|
-
let t =
|
|
49
|
-
t == null ?
|
|
49
|
+
let t = u[e === "tabindex" ? "tabIndex" : e];
|
|
50
|
+
t == null ? m.current?.removeAttribute(e) : m.current?.setAttribute(e, String(t));
|
|
50
51
|
}
|
|
51
52
|
}
|
|
52
|
-
}), /* @__PURE__ */
|
|
53
|
-
ref:
|
|
54
|
-
tabIndex:
|
|
55
|
-
role:
|
|
56
|
-
"aria-roledescription":
|
|
57
|
-
style:
|
|
58
|
-
"data-task-id":
|
|
59
|
-
...
|
|
60
|
-
className: e("cursor-grab active:cursor-grabbing",
|
|
61
|
-
children:
|
|
53
|
+
}), /* @__PURE__ */ r("div", {
|
|
54
|
+
ref: g,
|
|
55
|
+
tabIndex: i ? void 0 : 0,
|
|
56
|
+
role: i ? void 0 : "button",
|
|
57
|
+
"aria-roledescription": i ? void 0 : "draggable",
|
|
58
|
+
style: l,
|
|
59
|
+
"data-task-id": n.id,
|
|
60
|
+
...u,
|
|
61
|
+
className: e("cursor-grab active:cursor-grabbing", i && "cursor-default", p && "opacity-30", o),
|
|
62
|
+
children: s
|
|
62
63
|
});
|
|
63
64
|
}
|
|
64
|
-
var
|
|
65
|
-
let { ref: d, isDropTarget: f } =
|
|
65
|
+
var m = a.forwardRef(({ column: t, isOverLimit: n, className: i, children: o, ...s }, c) => {
|
|
66
|
+
let { ref: d, isDropTarget: f } = l({
|
|
66
67
|
id: t.id,
|
|
67
68
|
accept: "kanban-task",
|
|
68
|
-
collisionDetector:
|
|
69
|
+
collisionDetector: u,
|
|
69
70
|
data: {
|
|
70
71
|
type: "Column",
|
|
71
72
|
column: t
|
|
72
73
|
}
|
|
73
|
-
}), p =
|
|
74
|
-
if (d(e), typeof
|
|
75
|
-
let t =
|
|
74
|
+
}), p = a.useCallback((e) => {
|
|
75
|
+
if (d(e), typeof c == "function") {
|
|
76
|
+
let t = c(e);
|
|
76
77
|
if (typeof t == "function") return () => {
|
|
77
78
|
d(null), t();
|
|
78
79
|
};
|
|
79
|
-
} else
|
|
80
|
-
}, [d,
|
|
81
|
-
return /* @__PURE__ */
|
|
80
|
+
} else c && (c.current = e);
|
|
81
|
+
}, [d, c]);
|
|
82
|
+
return /* @__PURE__ */ r("div", {
|
|
82
83
|
ref: p,
|
|
83
84
|
"data-slot": "kanban-column",
|
|
84
85
|
"data-column-id": t.id,
|
|
85
86
|
"data-over": f || void 0,
|
|
86
|
-
"data-over-limit":
|
|
87
|
+
"data-over-limit": n || void 0,
|
|
87
88
|
...s,
|
|
88
|
-
className: e("flex h-full w-[320px] min-w-[320px] flex-col rounded-lg bg-muted/30 dark:bg-muted/10 p-3 transition-colors duration-200", f && "bg-primary/5 ring-2 ring-primary/20",
|
|
89
|
+
className: e("flex h-full w-[320px] min-w-[320px] flex-col rounded-lg bg-muted/30 dark:bg-muted/10 p-3 transition-colors duration-200", f && "bg-primary/5 ring-2 ring-primary/20", n && "bg-destructive/5", i),
|
|
89
90
|
children: o
|
|
90
91
|
});
|
|
91
92
|
});
|
|
92
|
-
|
|
93
|
+
m.displayName = "KanbanColumnFrame";
|
|
93
94
|
//#endregion
|
|
94
|
-
export {
|
|
95
|
+
export { m as KanbanColumnFrame, f as KanbanDragSurface, p as KanbanDraggableCard };
|
|
95
96
|
|
|
96
97
|
//# sourceMappingURL=kanban-primitives.js.map
|