@skygraph/react 0.0.0-placeholder.0 → 0.5.0

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.
Files changed (72) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +70 -12
  3. package/dist/Table-BmesoMje.d.ts +1017 -0
  4. package/dist/Table-CpKMOH2x.d.cts +1017 -0
  5. package/dist/chunk-2OCEO636.js +91 -0
  6. package/dist/chunk-2OCEO636.js.map +1 -0
  7. package/dist/chunk-BNMJSYI2.js +54 -0
  8. package/dist/chunk-BNMJSYI2.js.map +1 -0
  9. package/dist/chunk-FSV73JI4.js +58 -0
  10. package/dist/chunk-FSV73JI4.js.map +1 -0
  11. package/dist/chunk-GJDDPZH7.js +226 -0
  12. package/dist/chunk-GJDDPZH7.js.map +1 -0
  13. package/dist/chunk-MLEBVELO.js +1412 -0
  14. package/dist/chunk-MLEBVELO.js.map +1 -0
  15. package/dist/chunk-NXB3VAVF.js +3794 -0
  16. package/dist/chunk-NXB3VAVF.js.map +1 -0
  17. package/dist/chunk-SEQI65CF.js +61 -0
  18. package/dist/chunk-SEQI65CF.js.map +1 -0
  19. package/dist/chunk-UO6VJC3C.js +1667 -0
  20. package/dist/chunk-UO6VJC3C.js.map +1 -0
  21. package/dist/chunk-Z5UGF7EO.js +847 -0
  22. package/dist/chunk-Z5UGF7EO.js.map +1 -0
  23. package/dist/chunk-ZJF6SJLP.js +200 -0
  24. package/dist/chunk-ZJF6SJLP.js.map +1 -0
  25. package/dist/common-CdpocIEz.d.cts +27 -0
  26. package/dist/common-CdpocIEz.d.ts +27 -0
  27. package/dist/datagrid-B6hg5yJh.d.cts +200 -0
  28. package/dist/datagrid-B6hg5yJh.d.ts +200 -0
  29. package/dist/datagrid.cjs +1053 -0
  30. package/dist/datagrid.cjs.map +1 -0
  31. package/dist/datagrid.d.cts +2 -0
  32. package/dist/datagrid.d.ts +2 -0
  33. package/dist/datagrid.js +10 -0
  34. package/dist/datagrid.js.map +1 -0
  35. package/dist/devtools.cjs +253 -0
  36. package/dist/devtools.cjs.map +1 -0
  37. package/dist/devtools.d.cts +29 -0
  38. package/dist/devtools.d.ts +29 -0
  39. package/dist/devtools.js +9 -0
  40. package/dist/devtools.js.map +1 -0
  41. package/dist/form.cjs +1723 -0
  42. package/dist/form.cjs.map +1 -0
  43. package/dist/form.d.cts +530 -0
  44. package/dist/form.d.ts +530 -0
  45. package/dist/form.js +49 -0
  46. package/dist/form.js.map +1 -0
  47. package/dist/index.cjs +22467 -0
  48. package/dist/index.cjs.map +1 -0
  49. package/dist/index.d.cts +3685 -0
  50. package/dist/index.d.ts +3685 -0
  51. package/dist/index.js +14131 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/table.cjs +4134 -0
  54. package/dist/table.cjs.map +1 -0
  55. package/dist/table.d.cts +31 -0
  56. package/dist/table.d.ts +31 -0
  57. package/dist/table.js +26 -0
  58. package/dist/table.js.map +1 -0
  59. package/dist/tree.cjs +1822 -0
  60. package/dist/tree.cjs.map +1 -0
  61. package/dist/tree.d.cts +348 -0
  62. package/dist/tree.d.ts +348 -0
  63. package/dist/tree.js +13 -0
  64. package/dist/tree.js.map +1 -0
  65. package/dist/virtual.cjs +145 -0
  66. package/dist/virtual.cjs.map +1 -0
  67. package/dist/virtual.d.cts +50 -0
  68. package/dist/virtual.d.ts +50 -0
  69. package/dist/virtual.js +11 -0
  70. package/dist/virtual.js.map +1 -0
  71. package/package.json +108 -18
  72. package/index.js +0 -3
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/datagrid.ts","../src/components/complex/DataGrid/DataGrid.tsx","../src/hooks/useVirtualScroll.ts","../src/components/ui/Spin.tsx","../src/components/ConfigProvider.tsx","../src/components/ui/Checkbox.tsx","../src/components/complex/DataGrid/useDataGridState.ts"],"sourcesContent":["export { DataGrid } from './components/complex/DataGrid'\nexport type {\n DataGridProps,\n DataGridRef,\n DataGridColumn,\n DataGridLocale,\n CellEditorProps,\n CellPosition,\n CellRange,\n CellValue,\n} from './components/complex/DataGrid'\n","import React, { forwardRef, useImperativeHandle, useCallback, useRef, useMemo, useState } from 'react'\nimport { useVirtualScroll } from '../../../hooks/useVirtualScroll'\nimport { Spin } from '../../ui/Spin'\nimport { Checkbox } from '../../ui/Checkbox'\nimport { useDataGridState } from './useDataGridState'\nimport type {\n DataGridProps,\n DataGridRef,\n CellPosition,\n CellValue,\n DataGridColumn,\n CellEditorProps,\n DataGridContextMenuItem,\n} from './types'\n\nconst cls = {\n root: 'sg-datagrid',\n header: 'sg-datagrid-header',\n headerCell: 'sg-datagrid-header-cell',\n body: 'sg-datagrid-body',\n row: 'sg-datagrid-row',\n rowEven: 'sg-datagrid-row--even',\n rowOdd: 'sg-datagrid-row--odd',\n rowHoverable: 'sg-datagrid-row--hoverable',\n rowSelected: 'sg-datagrid-row--selected',\n cell: 'sg-datagrid-cell',\n cellActive: 'sg-datagrid-cell--active',\n cellEditing: 'sg-datagrid-cell--editing',\n cellSelected: 'sg-datagrid-cell--selected',\n frozen: 'sg-datagrid-cell--frozen',\n sortable: 'sg-datagrid-header-cell--sortable',\n sortAsc: 'sg-datagrid-header-cell--asc',\n sortDesc: 'sg-datagrid-header-cell--desc',\n resizer: 'sg-datagrid-resizer',\n empty: 'sg-datagrid-empty',\n summary: 'sg-datagrid-summary',\n summaryRow: 'sg-datagrid-summary-row',\n summaryCell: 'sg-datagrid-summary-cell',\n contextMenu: 'sg-datagrid-context-menu',\n contextMenuItem: 'sg-datagrid-context-menu-item',\n contextMenuDanger: 'sg-datagrid-context-menu-item--danger',\n contextMenuDisabled: 'sg-datagrid-context-menu-item--disabled',\n contextMenuDivider: 'sg-datagrid-context-menu-divider',\n loading: 'sg-datagrid-loading',\n selectionCell: 'sg-datagrid-selection-cell',\n rowNumberCell: 'sg-datagrid-row-number-cell',\n headerDragOver: 'sg-datagrid-header-cell--drag-over',\n}\n\nconst SELECTION_COL_WIDTH = 40\nconst ROW_NUMBER_COL_WIDTH = 48\n\nfunction DefaultEditor({ value, onChange, onCommit, onCancel }: CellEditorProps) {\n return (\n <input\n autoFocus\n defaultValue={value == null ? '' : String(value)}\n onChange={(e) => onChange(e.target.value)}\n onBlur={onCommit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') onCommit()\n if (e.key === 'Escape') onCancel()\n }}\n style={{\n width: '100%',\n height: '100%',\n border: 'none',\n outline: 'none',\n padding: '0 8px',\n background: 'transparent',\n font: 'inherit',\n }}\n />\n )\n}\n\nfunction isCellInRange(row: number, col: number, range: { start: CellPosition; end: CellPosition } | null): boolean {\n if (!range) return false\n const minRow = Math.min(range.start.row, range.end.row)\n const maxRow = Math.max(range.start.row, range.end.row)\n const minCol = Math.min(range.start.col, range.end.col)\n const maxCol = Math.max(range.start.col, range.end.col)\n return row >= minRow && row <= maxRow && col >= minCol && col <= maxCol\n}\n\nfunction ContextMenuPopup({\n items,\n position,\n onClose,\n}: {\n items: DataGridContextMenuItem[]\n position: { x: number; y: number }\n onClose: () => void\n}) {\n const ref = useRef<HTMLDivElement>(null)\n\n React.useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) onClose()\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [onClose])\n\n // Only the coordinates are runtime-computed; visuals (z-index, padding,\n // colours, hover, danger/disabled state) live in\n // `packages/styles/components/context-menu.css` under\n // `.sg-datagrid-context-menu*`.\n return (\n <div\n ref={ref}\n className={cls.contextMenu}\n style={{ position: 'fixed', top: position.y, left: position.x }}\n >\n {items.map((item) =>\n item.divider ? (\n <div key={item.key} className={cls.contextMenuDivider} />\n ) : (\n <div\n key={item.key}\n className={[\n cls.contextMenuItem,\n item.danger ? cls.contextMenuDanger : '',\n item.disabled ? cls.contextMenuDisabled : '',\n ].filter(Boolean).join(' ')}\n onClick={() => {\n if (!item.disabled) {\n item.onClick()\n onClose()\n }\n }}\n >\n {item.label}\n </div>\n ),\n )}\n </div>\n )\n}\n\nfunction DataGridInner<R extends Record<string, unknown>>(\n props: DataGridProps<R>,\n ref: React.ForwardedRef<DataGridRef>,\n) {\n const {\n columns,\n data,\n rowKey,\n rowHeight = 36,\n headerHeight = 40,\n width = '100%',\n height = 400,\n className,\n style,\n onCellEdit,\n sortColumn,\n sortDirection,\n onSort,\n onCopy,\n onPaste,\n overscan = 5,\n locale,\n rowSelection,\n selectedRows,\n onSelectedRowsChange,\n striped,\n highlightOnHover = true,\n showRowNumber,\n summaryRows,\n cellClassName,\n cellStyle: cellStyleFn,\n columnReorder,\n onColumnOrderChange,\n onContextMenu,\n onRowClick,\n onRowDoubleClick,\n rowClassName,\n loading,\n emptyContent,\n } = props\n\n const containerRef = useRef<HTMLDivElement>(null)\n\n const state = useDataGridState(columns, data)\n const {\n activeCell,\n setActiveCell,\n editingCell,\n startEditing,\n stopEditing,\n editValueRef,\n selection,\n navigate,\n resizeColumn,\n getColumnWidth,\n columnOrder,\n reorderColumns,\n dragColumnRef,\n } = state\n\n const [ctxMenu, setCtxMenu] = useState<{\n items: DataGridContextMenuItem[]\n position: { x: number; y: number }\n } | null>(null)\n\n const [dragOverCol, setDragOverCol] = useState<string | null>(null)\n\n const { range, containerRef: scrollRef, scrollToIndex } = useVirtualScroll({\n itemCount: data.length,\n itemHeight: rowHeight,\n overscan,\n })\n\n const getRowKey = useCallback(\n (row: R, index: number): React.Key => {\n if (typeof rowKey === 'function') return rowKey(row, index)\n return row[rowKey] as React.Key\n },\n [rowKey],\n )\n\n const frozenLeft = useMemo(\n () => columns.filter((c) => c.frozen === 'left'),\n [columns],\n )\n const frozenRight = useMemo(\n () => columns.filter((c) => c.frozen === 'right'),\n [columns],\n )\n const scrollable = useMemo(\n () => columns.filter((c) => !c.frozen),\n [columns],\n )\n\n const orderedColumns = useMemo(() => {\n const base = [...frozenLeft, ...scrollable, ...frozenRight]\n if (!columnOrder) return base\n const map = new Map(base.map((c) => [c.key, c]))\n const ordered: DataGridColumn<R>[] = []\n for (const key of columnOrder) {\n const col = map.get(key)\n if (col) ordered.push(col)\n }\n for (const col of base) {\n if (!columnOrder.includes(col.key)) ordered.push(col)\n }\n return ordered\n }, [frozenLeft, scrollable, frozenRight, columnOrder])\n\n const extraColsWidth = (rowSelection ? SELECTION_COL_WIDTH : 0) + (showRowNumber ? ROW_NUMBER_COL_WIDTH : 0)\n\n const totalWidth = useMemo(\n () => orderedColumns.reduce((sum, col) => sum + getColumnWidth(col.key), 0) + extraColsWidth,\n [orderedColumns, getColumnWidth, extraColsWidth],\n )\n\n const allSelected = useMemo(() => {\n if (!selectedRows || data.length === 0) return false\n return data.every((row, i) => selectedRows.has(getRowKey(row, i)))\n }, [selectedRows, data, getRowKey])\n\n const someSelected = useMemo(() => {\n if (!selectedRows || data.length === 0) return false\n const count = data.filter((row, i) => selectedRows.has(getRowKey(row, i))).length\n return count > 0 && count < data.length\n }, [selectedRows, data, getRowKey])\n\n const handleSelectAll = useCallback(() => {\n if (!onSelectedRowsChange) return\n if (allSelected) {\n onSelectedRowsChange(new Set())\n } else {\n const all = new Set<React.Key>(data.map((row, i) => getRowKey(row, i)))\n onSelectedRowsChange(all)\n }\n }, [allSelected, data, getRowKey, onSelectedRowsChange])\n\n const handleSelectRow = useCallback(\n (row: R, index: number) => {\n if (!onSelectedRowsChange || !selectedRows) return\n const key = getRowKey(row, index)\n const next = new Set(selectedRows)\n if (next.has(key)) next.delete(key)\n else next.add(key)\n onSelectedRowsChange(next)\n },\n [getRowKey, onSelectedRowsChange, selectedRows],\n )\n\n const handleCellClick = useCallback(\n (rowIndex: number, colIndex: number) => {\n if (editingCell) {\n if (onCellEdit && editValueRef.current !== undefined) {\n onCellEdit(editingCell.row, orderedColumns[editingCell.col].key, editValueRef.current)\n }\n stopEditing()\n }\n setActiveCell({ row: rowIndex, col: colIndex })\n },\n [editingCell, onCellEdit, editValueRef, orderedColumns, stopEditing, setActiveCell],\n )\n\n const handleCellDoubleClick = useCallback(\n (rowIndex: number, colIndex: number) => {\n startEditing({ row: rowIndex, col: colIndex })\n },\n [startEditing],\n )\n\n const handleCommitEdit = useCallback(() => {\n if (editingCell && onCellEdit && editValueRef.current !== undefined) {\n onCellEdit(editingCell.row, orderedColumns[editingCell.col].key, editValueRef.current)\n }\n stopEditing()\n }, [editingCell, onCellEdit, editValueRef, orderedColumns, stopEditing])\n\n const handleCancelEdit = useCallback(() => {\n stopEditing()\n }, [stopEditing])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (!activeCell) return\n\n if (editingCell) return\n\n switch (e.key) {\n case 'ArrowUp':\n e.preventDefault()\n navigate(activeCell, 'up', e.shiftKey)\n break\n case 'ArrowDown':\n e.preventDefault()\n navigate(activeCell, 'down', e.shiftKey)\n break\n case 'ArrowLeft':\n e.preventDefault()\n navigate(activeCell, 'left', e.shiftKey)\n break\n case 'ArrowRight':\n e.preventDefault()\n navigate(activeCell, 'right', e.shiftKey)\n break\n case 'Enter':\n e.preventDefault()\n startEditing(activeCell)\n break\n case 'Tab':\n e.preventDefault()\n navigate(activeCell, e.shiftKey ? 'left' : 'right')\n break\n case 'Escape':\n setActiveCell(null)\n break\n case ' ':\n if (rowSelection && selectedRows) {\n e.preventDefault()\n const row = data[activeCell.row]\n if (row) handleSelectRow(row, activeCell.row)\n }\n break\n case 'a':\n if ((e.ctrlKey || e.metaKey) && rowSelection) {\n e.preventDefault()\n handleSelectAll()\n }\n break\n case 'c':\n if ((e.ctrlKey || e.metaKey) && onCopy) {\n e.preventDefault()\n const col = orderedColumns[activeCell.col]\n const val = data[activeCell.row]?.[col.key]\n onCopy(val == null ? '' : String(val))\n }\n break\n case 'v':\n if ((e.ctrlKey || e.metaKey) && onPaste) {\n e.preventDefault()\n navigator.clipboard?.readText().then((text) => {\n onPaste(text, activeCell)\n })\n }\n break\n }\n },\n [activeCell, editingCell, navigate, startEditing, setActiveCell, onCopy, onPaste,\n orderedColumns, data, rowSelection, selectedRows, handleSelectRow, handleSelectAll],\n )\n\n const handleSort = useCallback(\n (col: DataGridColumn<R>) => {\n if (!col.sortable || !onSort) return\n const dir = sortColumn === col.key && sortDirection === 'asc' ? 'desc' : 'asc'\n onSort(col.key, dir)\n },\n [sortColumn, sortDirection, onSort],\n )\n\n const handleCellContextMenu = useCallback(\n (e: React.MouseEvent, rowIndex: number, col: DataGridColumn<R>) => {\n if (!onContextMenu) return\n e.preventDefault()\n const row = data[rowIndex]\n if (!row) return\n const items = onContextMenu(rowIndex, col.key, row)\n if (items.length === 0) return\n setCtxMenu({ items, position: { x: e.clientX, y: e.clientY } })\n },\n [onContextMenu, data],\n )\n\n const handleHeaderDragStart = useCallback(\n (e: React.DragEvent, colKey: string) => {\n if (!columnReorder) return\n dragColumnRef.current = colKey\n e.dataTransfer.effectAllowed = 'move'\n },\n [columnReorder, dragColumnRef],\n )\n\n const handleHeaderDragOver = useCallback(\n (e: React.DragEvent, colKey: string) => {\n if (!columnReorder || !dragColumnRef.current) return\n e.preventDefault()\n setDragOverCol(colKey)\n },\n [columnReorder, dragColumnRef],\n )\n\n const handleHeaderDrop = useCallback(\n (e: React.DragEvent, colKey: string) => {\n e.preventDefault()\n if (!columnReorder || !dragColumnRef.current) return\n const newOrder = reorderColumns(dragColumnRef.current, colKey)\n dragColumnRef.current = null\n setDragOverCol(null)\n onColumnOrderChange?.(newOrder)\n },\n [columnReorder, dragColumnRef, reorderColumns, onColumnOrderChange],\n )\n\n const handleHeaderDragEnd = useCallback(() => {\n dragColumnRef.current = null\n setDragOverCol(null)\n }, [dragColumnRef])\n\n useImperativeHandle(\n ref,\n () => ({\n scrollToRow: scrollToIndex,\n scrollToColumn: () => {},\n getActiveCell: () => activeCell,\n setActiveCell,\n }),\n [scrollToIndex, activeCell, setActiveCell],\n )\n\n const handleResizeStart = useCallback(\n (colKey: string, startX: number) => {\n const startWidth = getColumnWidth(colKey)\n\n const onMouseMove = (e: MouseEvent) => {\n const delta = e.clientX - startX\n resizeColumn(colKey, startWidth + delta)\n }\n const onMouseUp = () => {\n document.removeEventListener('mousemove', onMouseMove)\n document.removeEventListener('mouseup', onMouseUp)\n }\n document.addEventListener('mousemove', onMouseMove)\n document.addEventListener('mouseup', onMouseUp)\n },\n [getColumnWidth, resizeColumn],\n )\n\n const renderCell = useCallback(\n (row: R, rowIndex: number, col: DataGridColumn<R>, colIndex: number) => {\n const isActive = activeCell?.row === rowIndex && activeCell?.col === colIndex\n const isEditing = editingCell?.row === rowIndex && editingCell?.col === colIndex\n const isSelected = isCellInRange(rowIndex, colIndex, selection)\n\n const rawValue = col.formula\n ? col.formula(row)\n : (row[col.key] as CellValue)\n\n const extraClass = cellClassName?.(rawValue, row, rowIndex, col) ?? ''\n const extraStyle = cellStyleFn?.(rawValue, row, rowIndex, col)\n\n const cellClassNames = [\n cls.cell,\n isActive ? cls.cellActive : '',\n isEditing ? cls.cellEditing : '',\n isSelected ? cls.cellSelected : '',\n col.frozen ? cls.frozen : '',\n col.className ?? '',\n extraClass,\n ]\n .filter(Boolean)\n .join(' ')\n\n const baseCellStyle: React.CSSProperties = {\n width: getColumnWidth(col.key),\n minWidth: getColumnWidth(col.key),\n textAlign: col.align ?? 'left',\n ...extraStyle,\n }\n\n return (\n <div\n key={col.key}\n className={cellClassNames}\n style={baseCellStyle}\n onClick={() => handleCellClick(rowIndex, colIndex)}\n onDoubleClick={() => handleCellDoubleClick(rowIndex, colIndex)}\n onContextMenu={(e) => handleCellContextMenu(e, rowIndex, col)}\n role=\"gridcell\"\n aria-colindex={colIndex + 1 + (rowSelection ? 1 : 0) + (showRowNumber ? 1 : 0)}\n aria-selected={isActive || isSelected}\n >\n {isEditing ? (\n (col.editor ?? (DefaultEditor as (props: CellEditorProps<R>) => React.ReactNode))({\n value: rawValue,\n row,\n rowIndex,\n column: col,\n onChange: (v) => {\n editValueRef.current = v\n },\n onCommit: handleCommitEdit,\n onCancel: handleCancelEdit,\n })\n ) : col.render ? (\n col.render(rawValue, row, rowIndex)\n ) : (\n <span>{rawValue == null ? '' : String(rawValue)}</span>\n )}\n </div>\n )\n },\n [\n activeCell, editingCell, selection, getColumnWidth,\n handleCellClick, handleCellDoubleClick, handleCommitEdit,\n handleCancelEdit, editValueRef, cellClassName, cellStyleFn,\n handleCellContextMenu, rowSelection, showRowNumber,\n ],\n )\n\n const heightValue = typeof height === 'number' ? height : undefined\n const bodyHeight = heightValue ? heightValue - headerHeight : undefined\n\n const rootCls = [\n cls.root,\n striped ? 'sg-datagrid--striped' : '',\n loading ? 'sg-datagrid--loading' : '',\n className ?? '',\n ].filter(Boolean).join(' ')\n\n return (\n <div\n ref={containerRef}\n className={rootCls}\n style={{ width, height, display: 'flex', flexDirection: 'column', position: 'relative', ...style }}\n onKeyDown={handleKeyDown}\n tabIndex={0}\n role=\"grid\"\n aria-rowcount={data.length}\n aria-colcount={orderedColumns.length}\n >\n {/* Header */}\n <div\n className={cls.header}\n style={{\n display: 'flex',\n height: headerHeight,\n minHeight: headerHeight,\n minWidth: totalWidth,\n }}\n role=\"row\"\n >\n {rowSelection && (\n <div\n className={`${cls.headerCell} ${cls.selectionCell}`}\n style={{ width: SELECTION_COL_WIDTH, minWidth: SELECTION_COL_WIDTH, display: 'flex', alignItems: 'center', justifyContent: 'center' }}\n role=\"columnheader\"\n >\n <Checkbox\n checked={allSelected}\n indeterminate={someSelected}\n onChange={handleSelectAll}\n />\n </div>\n )}\n {showRowNumber && (\n <div\n className={`${cls.headerCell} ${cls.rowNumberCell}`}\n style={{ width: ROW_NUMBER_COL_WIDTH, minWidth: ROW_NUMBER_COL_WIDTH, display: 'flex', alignItems: 'center', justifyContent: 'center', userSelect: 'none' }}\n role=\"columnheader\"\n >\n #\n </div>\n )}\n {orderedColumns.map((col) => {\n const isSorted = sortColumn === col.key\n const headerCls = [\n cls.headerCell,\n col.sortable ? cls.sortable : '',\n isSorted && sortDirection === 'asc' ? cls.sortAsc : '',\n isSorted && sortDirection === 'desc' ? cls.sortDesc : '',\n col.headerClassName ?? '',\n dragOverCol === col.key ? cls.headerDragOver : '',\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <div\n key={col.key}\n className={headerCls}\n style={{\n width: getColumnWidth(col.key),\n minWidth: getColumnWidth(col.key),\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n padding: '0 8px',\n cursor: col.sortable ? 'pointer' : 'default',\n userSelect: 'none',\n }}\n onClick={() => handleSort(col)}\n draggable={!!columnReorder}\n onDragStart={(e) => handleHeaderDragStart(e, col.key)}\n onDragOver={(e) => handleHeaderDragOver(e, col.key)}\n onDrop={(e) => handleHeaderDrop(e, col.key)}\n onDragEnd={handleHeaderDragEnd}\n onDragLeave={() => setDragOverCol(null)}\n role=\"columnheader\"\n >\n {col.title}\n {isSorted && (\n <span style={{ marginLeft: 4, fontSize: 10 }}>\n {sortDirection === 'asc' ? '▲' : '▼'}\n </span>\n )}\n {col.resizable !== false && (\n <div\n className={cls.resizer}\n style={{\n position: 'absolute',\n right: 0,\n top: 0,\n bottom: 0,\n width: 4,\n cursor: 'col-resize',\n }}\n onMouseDown={(e) => {\n e.stopPropagation()\n handleResizeStart(col.key, e.clientX)\n }}\n />\n )}\n </div>\n )\n })}\n </div>\n\n {/* Body */}\n <div\n ref={scrollRef as React.RefObject<HTMLDivElement>}\n className={cls.body}\n style={{\n flex: 1,\n overflow: 'auto',\n position: 'relative',\n height: bodyHeight,\n }}\n >\n {data.length === 0 ? (\n <div className={cls.empty} style={{ padding: 24, textAlign: 'center' }}>\n {emptyContent ?? locale?.noData ?? 'No data'}\n </div>\n ) : (\n <div style={{ height: range.totalHeight, position: 'relative', minWidth: totalWidth }}>\n {range.visibleItems.map((vi) => {\n const row = data[vi.index]\n if (!row) return null\n const rKey = getRowKey(row, vi.index)\n const isRowSelected = selectedRows?.has(rKey) ?? false\n const rowExtraClass = typeof rowClassName === 'function' ? rowClassName(row, vi.index) : (rowClassName ?? '')\n\n const rowCls = [\n cls.row,\n striped ? (vi.index % 2 === 0 ? cls.rowEven : cls.rowOdd) : '',\n highlightOnHover ? cls.rowHoverable : '',\n isRowSelected ? cls.rowSelected : '',\n rowExtraClass,\n ].filter(Boolean).join(' ')\n\n return (\n <div\n key={rKey}\n className={rowCls}\n style={{\n display: 'flex',\n position: 'absolute',\n top: vi.offsetTop,\n height: vi.height,\n width: '100%',\n }}\n role=\"row\"\n aria-rowindex={vi.index + 1}\n aria-selected={isRowSelected}\n onClick={() => onRowClick?.(row, vi.index)}\n onDoubleClick={() => onRowDoubleClick?.(row, vi.index)}\n >\n {rowSelection && (\n <div\n className={`${cls.cell} ${cls.selectionCell}`}\n style={{ width: SELECTION_COL_WIDTH, minWidth: SELECTION_COL_WIDTH, display: 'flex', alignItems: 'center', justifyContent: 'center' }}\n onClick={(e) => e.stopPropagation()}\n >\n <Checkbox\n checked={isRowSelected}\n onChange={() => handleSelectRow(row, vi.index)}\n />\n </div>\n )}\n {showRowNumber && (\n <div\n className={`${cls.cell} ${cls.rowNumberCell}`}\n style={{ width: ROW_NUMBER_COL_WIDTH, minWidth: ROW_NUMBER_COL_WIDTH, display: 'flex', alignItems: 'center', justifyContent: 'center', color: 'var(--sg-text-tertiary, #999)' }}\n >\n {vi.index + 1}\n </div>\n )}\n {orderedColumns.map((col, ci) => renderCell(row, vi.index, col, ci))}\n </div>\n )\n })}\n </div>\n )}\n </div>\n\n {/* Summary Footer */}\n {summaryRows && summaryRows.length > 0 && data.length > 0 && (\n <div className={cls.summary} style={{ minWidth: totalWidth }}>\n {summaryRows.map((sr, sri) => (\n <div\n key={sri}\n className={`${cls.summaryRow} ${sr.className ?? ''}`}\n style={{ display: 'flex', height: rowHeight }}\n >\n {rowSelection && (\n <div className={`${cls.summaryCell}`} style={{ width: SELECTION_COL_WIDTH, minWidth: SELECTION_COL_WIDTH }} />\n )}\n {showRowNumber && (\n <div className={`${cls.summaryCell}`} style={{ width: ROW_NUMBER_COL_WIDTH, minWidth: ROW_NUMBER_COL_WIDTH }} />\n )}\n {orderedColumns.map((col) => (\n <div\n key={col.key}\n className={cls.summaryCell}\n style={{\n width: getColumnWidth(col.key),\n minWidth: getColumnWidth(col.key),\n textAlign: col.align ?? 'left',\n }}\n >\n {sr.render(col.key, data)}\n </div>\n ))}\n </div>\n ))}\n </div>\n )}\n\n {/* Context Menu */}\n {ctxMenu && (\n <ContextMenuPopup\n items={ctxMenu.items}\n position={ctxMenu.position}\n onClose={() => setCtxMenu(null)}\n />\n )}\n\n {/* Loading */}\n {loading && (\n <div className={cls.loading} style={{ position: 'absolute', inset: 0, display: 'flex', alignItems: 'center', justifyContent: 'center', background: 'rgba(255,255,255,0.6)', zIndex: 10 }}>\n <Spin size=\"large\" />\n </div>\n )}\n </div>\n )\n}\n\n/**\n * Virtualized table grid with sortable headers, resizable columns, inline editing,\n * row selection, striped rows, summary footer, context menu, column reorder, and clipboard hooks.\n */\nexport const DataGrid = forwardRef(DataGridInner) as <R extends Record<string, unknown>>(\n props: DataGridProps<R> & { ref?: React.Ref<DataGridRef> },\n) => React.ReactElement\n","import { useState, useCallback, useRef, useEffect, useMemo } from 'react'\nimport { createVirtual } from '@skygraph/core'\nimport type { VirtualEngine, VirtualRange } from '@skygraph/core'\n\nexport interface UseVirtualScrollOptions {\n itemCount: number\n itemHeight: number | ((index: number) => number)\n overscan?: number\n}\n\nexport interface UseVirtualScrollReturn {\n range: VirtualRange\n containerRef: React.RefObject<HTMLElement | null>\n scrollToIndex: (index: number, align?: 'start' | 'center' | 'end') => void\n engine: VirtualEngine\n}\n\nexport function useVirtualScroll(options: UseVirtualScrollOptions): UseVirtualScrollReturn {\n const containerRef = useRef<HTMLElement | null>(null)\n const engineRef = useRef<VirtualEngine | null>(null)\n\n if (!engineRef.current) {\n engineRef.current = createVirtual({\n itemCount: options.itemCount,\n itemHeight: options.itemHeight,\n overscan: options.overscan,\n })\n }\n\n const engine = engineRef.current\n\n useEffect(() => {\n engine.setItemCount(options.itemCount)\n }, [engine, options.itemCount])\n\n useEffect(() => {\n engine.setItemHeight(options.itemHeight)\n }, [engine, options.itemHeight])\n\n const [range, setRange] = useState<VirtualRange>(() =>\n engine.getRange(0, 0),\n )\n\n const recalc = useCallback(() => {\n const el = containerRef.current\n if (!el) return\n setRange(engine.getRange(el.scrollTop, el.clientHeight))\n }, [engine])\n\n useEffect(() => {\n const el = containerRef.current\n if (!el) return\n\n recalc()\n\n el.addEventListener('scroll', recalc, { passive: true })\n const ro = new ResizeObserver(recalc)\n ro.observe(el)\n\n return () => {\n el.removeEventListener('scroll', recalc)\n ro.disconnect()\n }\n }, [recalc])\n\n useEffect(() => {\n recalc()\n }, [options.itemCount, recalc])\n\n const scrollToIndex = useCallback(\n (index: number, align: 'start' | 'center' | 'end' = 'start') => {\n const el = containerRef.current\n if (!el) return\n el.scrollTop = engine.scrollToIndex(index, el.clientHeight, align)\n },\n [engine],\n )\n\n return useMemo(\n () => ({ range, containerRef, scrollToIndex, engine }),\n [range, scrollToIndex, engine],\n )\n}\n","import React from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, SizableProps } from '../../types'\n\n/** Props for loading spinner, overlay, and optional content blur. */\nexport interface SpinProps extends BaseComponentProps, SizableProps {\n /** When `true`, shows the loading state (subject to `delay`). @default true */\n spinning?: boolean\n /** Milliseconds to wait before showing the spinner after `spinning` becomes true. */\n delay?: number\n /** Optional text below the indicator. */\n tip?: string\n /** When `true`, covers the viewport instead of inline or wrapping children. */\n fullscreen?: boolean\n /** Custom spinner node; defaults to a styled status element. */\n indicator?: React.ReactNode\n /** When set, shows an overlay with blur on this content while loading. */\n children?: React.ReactNode\n}\n\n/**\n * Loading indicator with optional delay, tip, fullscreen mode, and child overlay.\n */\nexport function Spin({\n spinning = true,\n size: sizeProp,\n delay,\n tip,\n fullscreen,\n indicator,\n children,\n className,\n style,\n unstyled,\n}: SpinProps) {\n const config = useConfig()\n const resolvedSize = sizeProp ?? config.size ?? 'middle'\n\n const [visible, setVisible] = React.useState(delay ? false : spinning)\n\n React.useEffect(() => {\n if (!delay) {\n setVisible(spinning)\n return\n }\n\n if (spinning) {\n const timer = setTimeout(() => setVisible(true), delay)\n return () => clearTimeout(timer)\n }\n\n setVisible(false)\n }, [spinning, delay])\n\n if (!visible && !children) return null\n if (!visible && children) return <>{children}</>\n\n const spinSizeClass = resolvedSize === 'middle' ? 'default' : resolvedSize\n const spinClasses = unstyled\n ? (className ?? '')\n : ['sg-spin', `sg-spin-${spinSizeClass}`, className].filter(Boolean).join(' ')\n\n const spinElement = indicator ?? (\n <span\n className={spinClasses}\n style={style}\n role=\"status\"\n aria-live=\"polite\"\n aria-label={config.locale?.spin?.loading ?? 'Loading'}\n />\n )\n\n if (fullscreen) {\n return (\n <div className={unstyled ? '' : 'sg-spin-fullscreen'}>\n <div className={unstyled ? '' : 'sg-spin-fullscreen-inner'}>\n {spinElement}\n {tip && <div className={unstyled ? '' : 'sg-spin-tip'}>{tip}</div>}\n </div>\n </div>\n )\n }\n\n if (!children) {\n return (\n <span className={unstyled ? '' : 'sg-spin-standalone'} style={style}>\n {spinElement}\n {tip && <div className={unstyled ? '' : 'sg-spin-tip'}>{tip}</div>}\n </span>\n )\n }\n\n return (\n <div className={unstyled ? '' : 'sg-spin-container'} style={style}>\n <div className={unstyled ? '' : 'sg-spin-overlay'}>\n {spinElement}\n {tip && <div className={unstyled ? '' : 'sg-spin-tip'}>{tip}</div>}\n </div>\n <div className={visible ? (unstyled ? '' : 'sg-spin-blur') : ''}>{children}</div>\n </div>\n )\n}\n","import React, { createContext, useContext, useMemo } from 'react'\nimport type { SizeType, SgLocale } from '../types'\n\n/**\n * Global Skygraph component configuration merged through React context.\n *\n * По `prefixCls`: сознательно НЕ входит в публичный API до реализации\n * (вариант A в `docs/styling-plan.md`, фаза 4). На практике все корневые классы\n * имеют стабильный префикс `.sg-*`; если нужна изоляция — используйте изолированный\n * скоуп на хосте (шадоу-рут/отдельный контейнер со своими токенами).\n */\nexport interface SgConfig {\n /** Default size token for nested components. */\n size?: SizeType\n /** Disables interactions for nested components when true. */\n disabled?: boolean\n /** Enables bordered styling for nested components when true. */\n bordered?: boolean\n /** Locale messages shallow-merged with the parent provider when set. */\n locale?: SgLocale\n}\n\nconst SgConfigContext = createContext<SgConfig>({})\n\n/** Props for `ConfigProvider`, extending `SgConfig` with React children. */\nexport interface ConfigProviderProps extends SgConfig {\n /** Tree of components that consume merged configuration from this provider. */\n children: React.ReactNode\n}\n\n/**\n * Merges Skygraph configuration with any parent provider and exposes it via context.\n * Descendants read values through `useConfig` or `useConfigWithDefaults`.\n */\nexport function ConfigProvider({ children, ...config }: ConfigProviderProps) {\n const parent = useContext(SgConfigContext)\n\n const merged = useMemo<SgConfig>(\n () => ({\n size: config.size ?? parent.size,\n disabled: config.disabled ?? parent.disabled,\n bordered: config.bordered ?? parent.bordered,\n locale: config.locale\n ? parent.locale\n ? { ...parent.locale, ...config.locale }\n : config.locale\n : parent.locale,\n }),\n [config.size, config.disabled, config.bordered, config.locale, parent],\n )\n\n return <SgConfigContext.Provider value={merged}>{children}</SgConfigContext.Provider>\n}\n\n/** Returns the merged `SgConfig` from the nearest ancestor `ConfigProvider`. */\nexport function useConfig(): SgConfig {\n return useContext(SgConfigContext)\n}\n\n/**\n * Resolves effective `size` and `disabled` from props, context, and explicit defaults.\n * Returns the original props plus `resolvedSize` and `resolvedDisabled` for consumers.\n */\nexport function useConfigWithDefaults<T extends Record<string, unknown>>(\n props: T,\n defaults: { size?: SizeType; disabled?: boolean; bordered?: boolean },\n): T & { resolvedSize: SizeType; resolvedDisabled: boolean } {\n const config = useContext(SgConfigContext)\n\n return useMemo(() => {\n const resolvedSize =\n (props as Record<string, unknown>).size as SizeType | undefined ??\n config.size ??\n defaults.size ??\n 'middle'\n const resolvedDisabled =\n ((props as Record<string, unknown>).disabled as boolean | undefined) ??\n config.disabled ??\n defaults.disabled ??\n false\n\n return { ...props, resolvedSize, resolvedDisabled }\n }, [props, config.size, config.disabled, defaults.size, defaults.disabled])\n}\n","import React from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, InteractiveProps } from '../../types'\nimport { Spin } from './Spin'\n\n/** Props for the Checkbox component. */\nexport interface CheckboxProps extends BaseComponentProps, InteractiveProps {\n /** Controlled checked state. */\n checked?: boolean\n /** Uncontrolled initial checked state. */\n defaultChecked?: boolean\n /** Renders the native checkbox in indeterminate state. */\n indeterminate?: boolean\n /** Called when the checked state changes. */\n onChange?: (checked: boolean) => void\n /** Label content beside the control. */\n children?: React.ReactNode\n}\n\n/** Labeled checkbox with indeterminate support and optional loading state. */\nexport function Checkbox({\n checked,\n defaultChecked,\n disabled: disabledProp,\n loading,\n indeterminate,\n onChange,\n children,\n className,\n style,\n unstyled,\n}: CheckboxProps) {\n const config = useConfig()\n const disabled = disabledProp ?? config.disabled ?? false\n\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n React.useEffect(() => {\n if (inputRef.current) {\n inputRef.current.indeterminate = indeterminate ?? false\n }\n }, [indeterminate])\n\n const wrapperClass = unstyled\n ? (className ?? '')\n : [\n 'sg-checkbox',\n disabled || loading ? 'sg-checkbox-disabled' : '',\n loading ? 'sg-checkbox-loading' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <label className={wrapperClass} style={style}>\n <input\n ref={inputRef}\n type=\"checkbox\"\n aria-checked={checked}\n className={unstyled ? '' : 'sg-checkbox-input'}\n checked={checked}\n defaultChecked={defaultChecked}\n disabled={disabled || loading}\n onChange={(e) => onChange?.(e.target.checked)}\n />\n {!unstyled && <span className=\"sg-checkbox-box\" aria-hidden />}\n {children && <span className={unstyled ? '' : 'sg-checkbox-label'}>{children}</span>}\n {loading && <Spin size=\"small\" unstyled={unstyled} />}\n </label>\n )\n}\n","import { useState, useCallback, useRef } from 'react'\nimport type { CellPosition, CellRange, CellValue, DataGridColumn } from './types'\n\n/**\n * Holds active cell, edit session, range selection, column width, and column order state for `DataGrid`.\n */\nexport function useDataGridState<R>(columns: DataGridColumn<R>[], data: R[]) {\n const [activeCell, setActiveCell] = useState<CellPosition | null>(null)\n const [editingCell, setEditingCell] = useState<CellPosition | null>(null)\n const [selection, setSelection] = useState<CellRange | null>(null)\n const [columnWidths, setColumnWidths] = useState<Map<string, number>>(() => {\n const map = new Map<string, number>()\n for (const col of columns) {\n if (col.width) map.set(col.key, col.width)\n }\n return map\n })\n const [columnOrder, setColumnOrder] = useState<string[] | null>(null)\n\n const editValueRef = useRef<CellValue>(undefined)\n const dragColumnRef = useRef<string | null>(null)\n\n const startEditing = useCallback(\n (pos: CellPosition) => {\n const col = columns[pos.col]\n if (!col) return\n\n const isEditable =\n typeof col.editable === 'function'\n ? col.editable(data[pos.row], pos.row)\n : col.editable !== false\n\n if (!isEditable) return\n\n editValueRef.current = (data[pos.row] as Record<string, unknown>)[col.key] as CellValue\n setEditingCell(pos)\n },\n [columns, data],\n )\n\n const stopEditing = useCallback(() => {\n setEditingCell(null)\n editValueRef.current = undefined\n }, [])\n\n const navigate = useCallback(\n (\n from: CellPosition,\n direction: 'up' | 'down' | 'left' | 'right',\n shiftKey = false,\n ): CellPosition => {\n let { row, col } = from\n switch (direction) {\n case 'up':\n row = Math.max(0, row - 1)\n break\n case 'down':\n row = Math.min(data.length - 1, row + 1)\n break\n case 'left':\n col = Math.max(0, col - 1)\n break\n case 'right':\n col = Math.min(columns.length - 1, col + 1)\n break\n }\n const next = { row, col }\n\n if (shiftKey) {\n setSelection((prev) => ({\n start: prev?.start ?? from,\n end: next,\n }))\n } else {\n setSelection(null)\n }\n\n setActiveCell(next)\n return next\n },\n [data.length, columns.length],\n )\n\n const resizeColumn = useCallback(\n (key: string, width: number) => {\n const col = columns.find((c) => c.key === key)\n const minW = col?.minWidth ?? 50\n const maxW = col?.maxWidth ?? Infinity\n const clamped = Math.max(minW, Math.min(maxW, width))\n setColumnWidths((prev) => new Map(prev).set(key, clamped))\n },\n [columns],\n )\n\n const getColumnWidth = useCallback(\n (key: string): number => {\n return columnWidths.get(key) ?? columns.find((c) => c.key === key)?.width ?? 120\n },\n [columnWidths, columns],\n )\n\n const reorderColumns = useCallback(\n (fromKey: string, toKey: string) => {\n const order = columnOrder ?? columns.map((c) => c.key)\n const fromIdx = order.indexOf(fromKey)\n const toIdx = order.indexOf(toKey)\n if (fromIdx === -1 || toIdx === -1 || fromIdx === toIdx) return order\n const next = [...order]\n const [moved] = next.splice(fromIdx, 1)\n next.splice(toIdx, 0, moved)\n setColumnOrder(next)\n return next\n },\n [columnOrder, columns],\n )\n\n return {\n activeCell,\n setActiveCell,\n editingCell,\n startEditing,\n stopEditing,\n editValueRef,\n selection,\n setSelection,\n navigate,\n resizeColumn,\n getColumnWidth,\n columnOrder,\n setColumnOrder,\n reorderColumns,\n dragColumnRef,\n }\n}\n"],"mappings":"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","names":["import_react","import_react","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","React"]}
@@ -0,0 +1,2 @@
1
+ export { C as CellEditorProps, a as CellPosition, b as CellRange, c as CellValue, D as DataGrid, d as DataGridColumn, f as DataGridLocale, g as DataGridProps, h as DataGridRef } from './datagrid-B6hg5yJh.cjs';
2
+ import 'react';
@@ -0,0 +1,2 @@
1
+ export { C as CellEditorProps, a as CellPosition, b as CellRange, c as CellValue, D as DataGrid, d as DataGridColumn, f as DataGridLocale, g as DataGridProps, h as DataGridRef } from './datagrid-B6hg5yJh.js';
2
+ import 'react';
@@ -0,0 +1,10 @@
1
+ import {
2
+ DataGrid
3
+ } from "./chunk-Z5UGF7EO.js";
4
+ import "./chunk-FSV73JI4.js";
5
+ import "./chunk-2OCEO636.js";
6
+ import "./chunk-SEQI65CF.js";
7
+ export {
8
+ DataGrid
9
+ };
10
+ //# sourceMappingURL=datagrid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,253 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/devtools.ts
21
+ var devtools_exports = {};
22
+ __export(devtools_exports, {
23
+ HistoryPanel: () => HistoryPanel,
24
+ useHistory: () => useHistory
25
+ });
26
+ module.exports = __toCommonJS(devtools_exports);
27
+
28
+ // src/hooks/useHistory.ts
29
+ var import_react = require("react");
30
+ var import_core = require("@skygraph/core");
31
+ function useHistory(core, options) {
32
+ const [, forceUpdate] = (0, import_react.useState)(0);
33
+ const historyRef = (0, import_react.useRef)(null);
34
+ const optionsRef = (0, import_react.useRef)(options);
35
+ if (!historyRef.current) {
36
+ historyRef.current = (0, import_core.createHistory)(core, optionsRef.current);
37
+ }
38
+ const tick = (0, import_react.useCallback)(() => forceUpdate((n) => n + 1), []);
39
+ const undo = (0, import_react.useCallback)(() => {
40
+ historyRef.current.undo();
41
+ tick();
42
+ }, [tick]);
43
+ const redo = (0, import_react.useCallback)(() => {
44
+ historyRef.current.redo();
45
+ tick();
46
+ }, [tick]);
47
+ const jumpTo = (0, import_react.useCallback)(
48
+ (index) => {
49
+ historyRef.current.jumpTo(index);
50
+ tick();
51
+ },
52
+ [tick]
53
+ );
54
+ const clear = (0, import_react.useCallback)(() => {
55
+ historyRef.current.clear();
56
+ tick();
57
+ }, [tick]);
58
+ (0, import_react.useEffect)(() => {
59
+ return () => {
60
+ historyRef.current?.destroy();
61
+ };
62
+ }, []);
63
+ const h = historyRef.current;
64
+ return (0, import_react.useMemo)(
65
+ () => ({
66
+ history: h,
67
+ canUndo: h.canUndo,
68
+ canRedo: h.canRedo,
69
+ cursor: h.cursor,
70
+ entries: h.entries,
71
+ undo,
72
+ redo,
73
+ jumpTo,
74
+ clear
75
+ }),
76
+ // eslint-disable-next-line react-hooks/exhaustive-deps
77
+ [h, h.cursor, h.entries.length, undo, redo, jumpTo, clear]
78
+ );
79
+ }
80
+
81
+ // src/components/devtools/HistoryPanel.tsx
82
+ var import_react2 = require("react");
83
+ var import_jsx_runtime = require("react/jsx-runtime");
84
+ var styles = {
85
+ root: {
86
+ fontFamily: 'ui-monospace, "Cascadia Code", "Fira Code", monospace',
87
+ fontSize: 12,
88
+ border: "1px solid var(--sg-border, #d9d9d9)",
89
+ borderRadius: 8,
90
+ background: "var(--sg-bg-elevated, #fff)",
91
+ overflow: "hidden"
92
+ },
93
+ header: {
94
+ display: "flex",
95
+ alignItems: "center",
96
+ justifyContent: "space-between",
97
+ padding: "8px 12px",
98
+ borderBottom: "1px solid var(--sg-border, #d9d9d9)",
99
+ fontWeight: 600,
100
+ fontSize: 13
101
+ },
102
+ controls: {
103
+ display: "flex",
104
+ gap: 4
105
+ },
106
+ btn: {
107
+ padding: "2px 8px",
108
+ border: "1px solid var(--sg-border, #d9d9d9)",
109
+ borderRadius: 4,
110
+ background: "var(--sg-bg, #fafafa)",
111
+ cursor: "pointer",
112
+ fontSize: 11
113
+ },
114
+ btnDisabled: {
115
+ opacity: 0.4,
116
+ cursor: "not-allowed"
117
+ },
118
+ list: {
119
+ maxHeight: 300,
120
+ overflowY: "auto",
121
+ margin: 0,
122
+ padding: 0,
123
+ listStyle: "none"
124
+ },
125
+ entry: {
126
+ display: "flex",
127
+ alignItems: "center",
128
+ gap: 8,
129
+ padding: "4px 12px",
130
+ cursor: "pointer",
131
+ borderBottom: "1px solid var(--sg-border-light, #f0f0f0)",
132
+ transition: "background 0.15s"
133
+ },
134
+ entryActive: {
135
+ background: "var(--sg-primary-bg, #e6f4ff)",
136
+ fontWeight: 600
137
+ },
138
+ entryFuture: {
139
+ opacity: 0.5
140
+ },
141
+ badge: {
142
+ display: "inline-block",
143
+ padding: "1px 6px",
144
+ borderRadius: 4,
145
+ fontSize: 10,
146
+ background: "var(--sg-primary-bg, #e6f4ff)",
147
+ color: "var(--sg-primary, #1677ff)"
148
+ },
149
+ patches: {
150
+ padding: "4px 12px 8px 32px",
151
+ background: "var(--sg-bg-subtle, #fafafa)",
152
+ fontSize: 11,
153
+ lineHeight: 1.6
154
+ },
155
+ empty: {
156
+ padding: "24px 12px",
157
+ textAlign: "center",
158
+ color: "var(--sg-text-tertiary, #999)"
159
+ }
160
+ };
161
+ function HistoryPanel({ history, className, style }) {
162
+ const { entries, cursor, canUndo, canRedo, undo, redo, jumpTo, clear } = history;
163
+ const [expanded, setExpanded] = (0, import_react2.useState)(null);
164
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className, style: { ...styles.root, ...style }, children: [
165
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: styles.header, children: [
166
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
167
+ "Time-Travel (",
168
+ entries.length,
169
+ ")"
170
+ ] }),
171
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: styles.controls, children: [
172
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
173
+ "button",
174
+ {
175
+ style: { ...styles.btn, ...canUndo ? {} : styles.btnDisabled },
176
+ disabled: !canUndo,
177
+ onClick: undo,
178
+ children: "Undo"
179
+ }
180
+ ),
181
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
182
+ "button",
183
+ {
184
+ style: { ...styles.btn, ...canRedo ? {} : styles.btnDisabled },
185
+ disabled: !canRedo,
186
+ onClick: redo,
187
+ children: "Redo"
188
+ }
189
+ ),
190
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { style: styles.btn, onClick: clear, children: "Clear" })
191
+ ] })
192
+ ] }),
193
+ entries.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: styles.empty, children: "No history yet" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ul", { style: styles.list, children: entries.map((entry, i) => {
194
+ const isCurrent = i === cursor;
195
+ const isFuture = i > cursor;
196
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("li", { children: [
197
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
198
+ "div",
199
+ {
200
+ style: {
201
+ ...styles.entry,
202
+ ...isCurrent ? styles.entryActive : {},
203
+ ...isFuture ? styles.entryFuture : {}
204
+ },
205
+ onClick: () => jumpTo(i),
206
+ onDoubleClick: () => setExpanded(expanded === i ? null : i),
207
+ children: [
208
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: styles.badge, children: i }),
209
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
210
+ entry.patches.length,
211
+ " write",
212
+ entry.patches.length !== 1 ? "s" : ""
213
+ ] }),
214
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { marginLeft: "auto", fontSize: 10, opacity: 0.6 }, children: formatTime(entry.timestamp) })
215
+ ]
216
+ }
217
+ ),
218
+ expanded === i && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: styles.patches, children: entry.patches.map((p, pi) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
219
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", { children: p.path }),
220
+ ":",
221
+ " ",
222
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { opacity: 0.5 }, children: formatValue(p.oldValue) }),
223
+ " \u2192 ",
224
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: formatValue(p.value) })
225
+ ] }, pi)) })
226
+ ] }, i);
227
+ }) })
228
+ ] });
229
+ }
230
+ function formatTime(ts) {
231
+ const d = new Date(ts);
232
+ return d.toLocaleTimeString(void 0, {
233
+ hour: "2-digit",
234
+ minute: "2-digit",
235
+ second: "2-digit"
236
+ });
237
+ }
238
+ function formatValue(v) {
239
+ if (v === void 0) return "undefined";
240
+ if (v === null) return "null";
241
+ if (typeof v === "string") return `"${v}"`;
242
+ try {
243
+ return JSON.stringify(v);
244
+ } catch {
245
+ return String(v);
246
+ }
247
+ }
248
+ // Annotate the CommonJS export names for ESM import in node:
249
+ 0 && (module.exports = {
250
+ HistoryPanel,
251
+ useHistory
252
+ });
253
+ //# sourceMappingURL=devtools.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/devtools.ts","../src/hooks/useHistory.ts","../src/components/devtools/HistoryPanel.tsx"],"sourcesContent":["export { useHistory } from './hooks/useHistory'\nexport type { UseHistoryReturn } from './hooks/useHistory'\nexport { HistoryPanel } from './components/devtools/HistoryPanel'\nexport type { HistoryPanelProps } from './components/devtools/HistoryPanel'\n","import { useState, useCallback, useEffect, useRef, useMemo } from 'react'\nimport type { Core } from '@skygraph/core'\nimport { createHistory } from '@skygraph/core'\nimport type { HistoryPlugin, HistoryOptions } from '@skygraph/core'\n\nexport interface UseHistoryReturn {\n history: HistoryPlugin\n canUndo: boolean\n canRedo: boolean\n cursor: number\n entries: HistoryPlugin['entries']\n undo: () => void\n redo: () => void\n jumpTo: (index: number) => void\n clear: () => void\n}\n\nexport function useHistory(core: Core, options?: HistoryOptions): UseHistoryReturn {\n const [, forceUpdate] = useState(0)\n const historyRef = useRef<HistoryPlugin | null>(null)\n const optionsRef = useRef(options)\n\n if (!historyRef.current) {\n historyRef.current = createHistory(core, optionsRef.current)\n }\n\n const tick = useCallback(() => forceUpdate((n) => n + 1), [])\n\n const undo = useCallback(() => {\n historyRef.current!.undo()\n tick()\n }, [tick])\n\n const redo = useCallback(() => {\n historyRef.current!.redo()\n tick()\n }, [tick])\n\n const jumpTo = useCallback(\n (index: number) => {\n historyRef.current!.jumpTo(index)\n tick()\n },\n [tick],\n )\n\n const clear = useCallback(() => {\n historyRef.current!.clear()\n tick()\n }, [tick])\n\n useEffect(() => {\n return () => {\n historyRef.current?.destroy()\n }\n }, [])\n\n const h = historyRef.current\n\n return useMemo(\n () => ({\n history: h,\n canUndo: h.canUndo,\n canRedo: h.canRedo,\n cursor: h.cursor,\n entries: h.entries,\n undo,\n redo,\n jumpTo,\n clear,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [h, h.cursor, h.entries.length, undo, redo, jumpTo, clear],\n )\n}\n","import React, { useState } from 'react'\nimport type { UseHistoryReturn } from '../../hooks/useHistory'\nimport type { BaseComponentProps } from '../../types'\n\n/** Props for the devtools time-travel history panel (base layout props come from `BaseComponentProps`). */\nexport interface HistoryPanelProps extends BaseComponentProps {\n /** History controller from `useHistory` (entries, cursor, undo/redo, jump, clear). */\n history: UseHistoryReturn\n}\n\nconst styles: Record<string, React.CSSProperties> = {\n root: {\n fontFamily: 'ui-monospace, \"Cascadia Code\", \"Fira Code\", monospace',\n fontSize: 12,\n border: '1px solid var(--sg-border, #d9d9d9)',\n borderRadius: 8,\n background: 'var(--sg-bg-elevated, #fff)',\n overflow: 'hidden',\n },\n header: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '8px 12px',\n borderBottom: '1px solid var(--sg-border, #d9d9d9)',\n fontWeight: 600,\n fontSize: 13,\n },\n controls: {\n display: 'flex',\n gap: 4,\n },\n btn: {\n padding: '2px 8px',\n border: '1px solid var(--sg-border, #d9d9d9)',\n borderRadius: 4,\n background: 'var(--sg-bg, #fafafa)',\n cursor: 'pointer',\n fontSize: 11,\n },\n btnDisabled: {\n opacity: 0.4,\n cursor: 'not-allowed',\n },\n list: {\n maxHeight: 300,\n overflowY: 'auto' as const,\n margin: 0,\n padding: 0,\n listStyle: 'none',\n },\n entry: {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '4px 12px',\n cursor: 'pointer',\n borderBottom: '1px solid var(--sg-border-light, #f0f0f0)',\n transition: 'background 0.15s',\n },\n entryActive: {\n background: 'var(--sg-primary-bg, #e6f4ff)',\n fontWeight: 600,\n },\n entryFuture: {\n opacity: 0.5,\n },\n badge: {\n display: 'inline-block',\n padding: '1px 6px',\n borderRadius: 4,\n fontSize: 10,\n background: 'var(--sg-primary-bg, #e6f4ff)',\n color: 'var(--sg-primary, #1677ff)',\n },\n patches: {\n padding: '4px 12px 8px 32px',\n background: 'var(--sg-bg-subtle, #fafafa)',\n fontSize: 11,\n lineHeight: 1.6,\n },\n empty: {\n padding: '24px 12px',\n textAlign: 'center' as const,\n color: 'var(--sg-text-tertiary, #999)',\n },\n}\n\n/**\n * Time-travel UI listing history entries with undo/redo controls and expandable patch details.\n */\nexport function HistoryPanel({ history, className, style }: HistoryPanelProps) {\n const { entries, cursor, canUndo, canRedo, undo, redo, jumpTo, clear } = history\n const [expanded, setExpanded] = useState<number | null>(null)\n\n return (\n <div className={className} style={{ ...styles.root, ...style }}>\n <div style={styles.header}>\n <span>Time-Travel ({entries.length})</span>\n <div style={styles.controls}>\n <button\n style={{ ...styles.btn, ...(canUndo ? {} : styles.btnDisabled) }}\n disabled={!canUndo}\n onClick={undo}\n >\n Undo\n </button>\n <button\n style={{ ...styles.btn, ...(canRedo ? {} : styles.btnDisabled) }}\n disabled={!canRedo}\n onClick={redo}\n >\n Redo\n </button>\n <button style={styles.btn} onClick={clear}>\n Clear\n </button>\n </div>\n </div>\n\n {entries.length === 0 ? (\n <div style={styles.empty}>No history yet</div>\n ) : (\n <ul style={styles.list}>\n {entries.map((entry, i) => {\n const isCurrent = i === cursor\n const isFuture = i > cursor\n\n return (\n <li key={i}>\n <div\n style={{\n ...styles.entry,\n ...(isCurrent ? styles.entryActive : {}),\n ...(isFuture ? styles.entryFuture : {}),\n }}\n onClick={() => jumpTo(i)}\n onDoubleClick={() => setExpanded(expanded === i ? null : i)}\n >\n <span style={styles.badge}>{i}</span>\n <span>\n {entry.patches.length} write{entry.patches.length !== 1 ? 's' : ''}\n </span>\n <span style={{ marginLeft: 'auto', fontSize: 10, opacity: 0.6 }}>\n {formatTime(entry.timestamp)}\n </span>\n </div>\n\n {expanded === i && (\n <div style={styles.patches}>\n {entry.patches.map((p, pi) => (\n <div key={pi}>\n <code>{p.path}</code>:{' '}\n <span style={{ opacity: 0.5 }}>{formatValue(p.oldValue)}</span>\n {' → '}\n <span>{formatValue(p.value)}</span>\n </div>\n ))}\n </div>\n )}\n </li>\n )\n })}\n </ul>\n )}\n </div>\n )\n}\n\nfunction formatTime(ts: number): string {\n const d = new Date(ts)\n return d.toLocaleTimeString(undefined, {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n })\n}\n\nfunction formatValue(v: unknown): string {\n if (v === undefined) return 'undefined'\n if (v === null) return 'null'\n if (typeof v === 'string') return `\"${v}\"`\n try {\n return JSON.stringify(v)\n } catch {\n return String(v)\n }\n}\n"],"mappings":"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","names":["import_react"]}
@@ -0,0 +1,29 @@
1
+ import { HistoryPlugin, Core, HistoryOptions } from '@skygraph/core';
2
+ import * as react_jsx_runtime from 'react/jsx-runtime';
3
+ import { B as BaseComponentProps } from './common-CdpocIEz.cjs';
4
+ import 'react';
5
+
6
+ interface UseHistoryReturn {
7
+ history: HistoryPlugin;
8
+ canUndo: boolean;
9
+ canRedo: boolean;
10
+ cursor: number;
11
+ entries: HistoryPlugin['entries'];
12
+ undo: () => void;
13
+ redo: () => void;
14
+ jumpTo: (index: number) => void;
15
+ clear: () => void;
16
+ }
17
+ declare function useHistory(core: Core, options?: HistoryOptions): UseHistoryReturn;
18
+
19
+ /** Props for the devtools time-travel history panel (base layout props come from `BaseComponentProps`). */
20
+ interface HistoryPanelProps extends BaseComponentProps {
21
+ /** History controller from `useHistory` (entries, cursor, undo/redo, jump, clear). */
22
+ history: UseHistoryReturn;
23
+ }
24
+ /**
25
+ * Time-travel UI listing history entries with undo/redo controls and expandable patch details.
26
+ */
27
+ declare function HistoryPanel({ history, className, style }: HistoryPanelProps): react_jsx_runtime.JSX.Element;
28
+
29
+ export { HistoryPanel, type HistoryPanelProps, type UseHistoryReturn, useHistory };
@@ -0,0 +1,29 @@
1
+ import { HistoryPlugin, Core, HistoryOptions } from '@skygraph/core';
2
+ import * as react_jsx_runtime from 'react/jsx-runtime';
3
+ import { B as BaseComponentProps } from './common-CdpocIEz.js';
4
+ import 'react';
5
+
6
+ interface UseHistoryReturn {
7
+ history: HistoryPlugin;
8
+ canUndo: boolean;
9
+ canRedo: boolean;
10
+ cursor: number;
11
+ entries: HistoryPlugin['entries'];
12
+ undo: () => void;
13
+ redo: () => void;
14
+ jumpTo: (index: number) => void;
15
+ clear: () => void;
16
+ }
17
+ declare function useHistory(core: Core, options?: HistoryOptions): UseHistoryReturn;
18
+
19
+ /** Props for the devtools time-travel history panel (base layout props come from `BaseComponentProps`). */
20
+ interface HistoryPanelProps extends BaseComponentProps {
21
+ /** History controller from `useHistory` (entries, cursor, undo/redo, jump, clear). */
22
+ history: UseHistoryReturn;
23
+ }
24
+ /**
25
+ * Time-travel UI listing history entries with undo/redo controls and expandable patch details.
26
+ */
27
+ declare function HistoryPanel({ history, className, style }: HistoryPanelProps): react_jsx_runtime.JSX.Element;
28
+
29
+ export { HistoryPanel, type HistoryPanelProps, type UseHistoryReturn, useHistory };
@@ -0,0 +1,9 @@
1
+ import {
2
+ HistoryPanel,
3
+ useHistory
4
+ } from "./chunk-GJDDPZH7.js";
5
+ export {
6
+ HistoryPanel,
7
+ useHistory
8
+ };
9
+ //# sourceMappingURL=devtools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}