@skygraph/react 0.5.4 → 0.6.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +70 -70
- package/dist/{Table-CMKo6Pc3.d.cts → Table-Bhlshbs2.d.cts} +39 -0
- package/dist/{Table-CAay8MmA.d.ts → Table-DOGK_njf.d.ts} +39 -0
- package/dist/{chunk-Y6XZ5TLD.js → chunk-B6BK5B64.js} +3 -3
- package/dist/chunk-B6BK5B64.js.map +1 -0
- package/dist/{chunk-PEX2UTNG.js → chunk-EA2J67A4.js} +2 -2
- package/dist/chunk-EA2J67A4.js.map +1 -0
- package/dist/{chunk-BNMJSYI2.js → chunk-EWUB2QCP.js} +2 -2
- package/dist/chunk-EWUB2QCP.js.map +1 -0
- package/dist/{chunk-7AA2JPZB.js → chunk-G4MRXKGC.js} +21 -14
- package/dist/chunk-G4MRXKGC.js.map +1 -0
- package/dist/{chunk-EFDB2ENB.js → chunk-MTHPDCO3.js} +8 -6
- package/dist/chunk-MTHPDCO3.js.map +1 -0
- package/dist/{chunk-KGFFQGCM.js → chunk-N4S66XHX.js} +8 -4
- package/dist/chunk-N4S66XHX.js.map +1 -0
- package/dist/{chunk-SEQI65CF.js → chunk-U7BXGUMC.js} +1 -1
- package/dist/chunk-U7BXGUMC.js.map +1 -0
- package/dist/{chunk-45YW5VSP.js → chunk-UCCGEZPJ.js} +2 -2
- package/dist/chunk-UCCGEZPJ.js.map +1 -0
- package/dist/{chunk-VLRLCHEL.js → chunk-YJZKXU5O.js} +1 -1
- package/dist/chunk-YJZKXU5O.js.map +1 -0
- package/dist/{chunk-ZJC2QUWA.js → chunk-YWCL3MUL.js} +1 -1
- package/dist/chunk-YWCL3MUL.js.map +1 -0
- package/dist/datagrid.cjs +3 -4
- package/dist/datagrid.cjs.map +1 -1
- package/dist/datagrid.js +4 -4
- package/dist/devtools.cjs.map +1 -1
- package/dist/devtools.js +1 -1
- package/dist/form.cjs.map +1 -1
- package/dist/form.js +3 -3
- package/dist/index.cjs +1239 -255
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -4
- package/dist/index.d.ts +16 -4
- package/dist/index.js +1113 -150
- package/dist/index.js.map +1 -1
- package/dist/table.cjs +17 -10
- package/dist/table.cjs.map +1 -1
- package/dist/table.d.cts +1 -1
- package/dist/table.d.ts +1 -1
- package/dist/table.js +4 -4
- package/dist/tree.cjs +11 -7
- package/dist/tree.cjs.map +1 -1
- package/dist/tree.js +3 -3
- package/dist/virtual.cjs.map +1 -1
- package/dist/virtual.js +2 -2
- package/package.json +2 -2
- package/dist/chunk-45YW5VSP.js.map +0 -1
- package/dist/chunk-7AA2JPZB.js.map +0 -1
- package/dist/chunk-BNMJSYI2.js.map +0 -1
- package/dist/chunk-EFDB2ENB.js.map +0 -1
- package/dist/chunk-KGFFQGCM.js.map +0 -1
- package/dist/chunk-PEX2UTNG.js.map +0 -1
- package/dist/chunk-SEQI65CF.js.map +0 -1
- package/dist/chunk-VLRLCHEL.js.map +0 -1
- package/dist/chunk-Y6XZ5TLD.js.map +0 -1
- package/dist/chunk-ZJC2QUWA.js.map +0 -1
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Checkbox
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-EA2J67A4.js";
|
|
4
4
|
import {
|
|
5
|
-
Spin
|
|
6
|
-
|
|
5
|
+
Spin,
|
|
6
|
+
useConfig
|
|
7
|
+
} from "./chunk-YJZKXU5O.js";
|
|
7
8
|
import {
|
|
8
9
|
useVirtualScroll
|
|
9
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-U7BXGUMC.js";
|
|
10
11
|
|
|
11
12
|
// src/components/complex/DataGrid/DataGrid.tsx
|
|
12
13
|
import React, {
|
|
@@ -277,6 +278,7 @@ function DataGridInner(props, ref) {
|
|
|
277
278
|
loading,
|
|
278
279
|
emptyContent
|
|
279
280
|
} = props;
|
|
281
|
+
const config = useConfig();
|
|
280
282
|
const containerRef = useRef2(null);
|
|
281
283
|
const state = useDataGridState(columns, data);
|
|
282
284
|
const {
|
|
@@ -762,7 +764,7 @@ function DataGridInner(props, ref) {
|
|
|
762
764
|
position: "relative",
|
|
763
765
|
height: bodyHeight
|
|
764
766
|
},
|
|
765
|
-
children: data.length === 0 ? /* @__PURE__ */ jsx("div", { className: cls.empty, style: { padding: 24, textAlign: "center" }, children: emptyContent ?? locale?.noData ?? "No data" }) : /* @__PURE__ */ jsx("div", { style: { height: range.totalHeight, position: "relative", minWidth: totalWidth }, children: range.visibleItems.map((vi) => {
|
|
767
|
+
children: data.length === 0 ? /* @__PURE__ */ jsx("div", { className: cls.empty, style: { padding: 24, textAlign: "center" }, children: emptyContent ?? locale?.noData ?? config.locale?.dataGrid?.noData ?? "No data" }) : /* @__PURE__ */ jsx("div", { style: { height: range.totalHeight, position: "relative", minWidth: totalWidth }, children: range.visibleItems.map((vi) => {
|
|
766
768
|
const row = data[vi.index];
|
|
767
769
|
if (!row) return null;
|
|
768
770
|
const rKey = getRowKey(row, vi.index);
|
|
@@ -906,4 +908,4 @@ var DataGrid = forwardRef(DataGridInner);
|
|
|
906
908
|
export {
|
|
907
909
|
DataGrid
|
|
908
910
|
};
|
|
909
|
-
//# sourceMappingURL=chunk-
|
|
911
|
+
//# sourceMappingURL=chunk-MTHPDCO3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/complex/DataGrid/DataGrid.tsx","../src/components/complex/DataGrid/useDataGridState.ts"],"sourcesContent":["import React, {\r\n forwardRef,\r\n useImperativeHandle,\r\n useCallback,\r\n useRef,\r\n useMemo,\r\n useState,\r\n} from 'react'\r\nimport { useVirtualScroll } from '../../../hooks/useVirtualScroll'\r\nimport { useConfig } from '../../ConfigProvider'\r\nimport { Spin } from '../../ui/Spin'\r\nimport { Checkbox } from '../../ui/Checkbox'\r\nimport { useDataGridState } from './useDataGridState'\r\nimport type {\r\n DataGridProps,\r\n DataGridRef,\r\n CellPosition,\r\n CellValue,\r\n DataGridColumn,\r\n CellEditorProps,\r\n DataGridContextMenuItem,\r\n} from './types'\r\n\r\nconst cls = {\r\n root: 'sg-datagrid',\r\n header: 'sg-datagrid-header',\r\n headerCell: 'sg-datagrid-header-cell',\r\n body: 'sg-datagrid-body',\r\n row: 'sg-datagrid-row',\r\n rowEven: 'sg-datagrid-row--even',\r\n rowOdd: 'sg-datagrid-row--odd',\r\n rowHoverable: 'sg-datagrid-row--hoverable',\r\n rowSelected: 'sg-datagrid-row--selected',\r\n cell: 'sg-datagrid-cell',\r\n cellActive: 'sg-datagrid-cell--active',\r\n cellEditing: 'sg-datagrid-cell--editing',\r\n cellSelected: 'sg-datagrid-cell--selected',\r\n frozen: 'sg-datagrid-cell--frozen',\r\n sortable: 'sg-datagrid-header-cell--sortable',\r\n sortAsc: 'sg-datagrid-header-cell--asc',\r\n sortDesc: 'sg-datagrid-header-cell--desc',\r\n resizer: 'sg-datagrid-resizer',\r\n empty: 'sg-datagrid-empty',\r\n summary: 'sg-datagrid-summary',\r\n summaryRow: 'sg-datagrid-summary-row',\r\n summaryCell: 'sg-datagrid-summary-cell',\r\n contextMenu: 'sg-datagrid-context-menu',\r\n contextMenuItem: 'sg-datagrid-context-menu-item',\r\n contextMenuDanger: 'sg-datagrid-context-menu-item--danger',\r\n contextMenuDisabled: 'sg-datagrid-context-menu-item--disabled',\r\n contextMenuDivider: 'sg-datagrid-context-menu-divider',\r\n loading: 'sg-datagrid-loading',\r\n selectionCell: 'sg-datagrid-selection-cell',\r\n rowNumberCell: 'sg-datagrid-row-number-cell',\r\n headerDragOver: 'sg-datagrid-header-cell--drag-over',\r\n}\r\n\r\nconst SELECTION_COL_WIDTH = 40\r\nconst ROW_NUMBER_COL_WIDTH = 48\r\n\r\nfunction DefaultEditor({ value, onChange, onCommit, onCancel }: CellEditorProps) {\r\n return (\r\n <input\r\n autoFocus\r\n defaultValue={value == null ? '' : String(value)}\r\n onChange={(e) => onChange(e.target.value)}\r\n onBlur={onCommit}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') onCommit()\r\n if (e.key === 'Escape') onCancel()\r\n }}\r\n style={{\r\n width: '100%',\r\n height: '100%',\r\n border: 'none',\r\n outline: 'none',\r\n padding: '0 8px',\r\n background: 'transparent',\r\n font: 'inherit',\r\n }}\r\n />\r\n )\r\n}\r\n\r\nfunction isCellInRange(\r\n row: number,\r\n col: number,\r\n range: { start: CellPosition; end: CellPosition } | null,\r\n): boolean {\r\n if (!range) return false\r\n const minRow = Math.min(range.start.row, range.end.row)\r\n const maxRow = Math.max(range.start.row, range.end.row)\r\n const minCol = Math.min(range.start.col, range.end.col)\r\n const maxCol = Math.max(range.start.col, range.end.col)\r\n return row >= minRow && row <= maxRow && col >= minCol && col <= maxCol\r\n}\r\n\r\nfunction ContextMenuPopup({\r\n items,\r\n position,\r\n onClose,\r\n}: {\r\n items: DataGridContextMenuItem[]\r\n position: { x: number; y: number }\r\n onClose: () => void\r\n}) {\r\n const ref = useRef<HTMLDivElement>(null)\r\n\r\n React.useEffect(() => {\r\n const handler = (e: MouseEvent) => {\r\n if (ref.current && !ref.current.contains(e.target as Node)) onClose()\r\n }\r\n document.addEventListener('mousedown', handler)\r\n return () => document.removeEventListener('mousedown', handler)\r\n }, [onClose])\r\n\r\n // Only the coordinates are runtime-computed; visuals (z-index, padding,\r\n // colours, hover, danger/disabled state) live in\r\n // `packages/styles/components/context-menu.css` under\r\n // `.sg-datagrid-context-menu*`.\r\n return (\r\n <div\r\n ref={ref}\r\n className={cls.contextMenu}\r\n style={{ position: 'fixed', top: position.y, left: position.x }}\r\n >\r\n {items.map((item) =>\r\n item.divider ? (\r\n <div key={item.key} className={cls.contextMenuDivider} />\r\n ) : (\r\n <div\r\n key={item.key}\r\n className={[\r\n cls.contextMenuItem,\r\n item.danger ? cls.contextMenuDanger : '',\r\n item.disabled ? cls.contextMenuDisabled : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n onClick={() => {\r\n if (!item.disabled) {\r\n item.onClick()\r\n onClose()\r\n }\r\n }}\r\n >\r\n {item.label}\r\n </div>\r\n ),\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nfunction DataGridInner<R extends Record<string, unknown>>(\r\n props: DataGridProps<R>,\r\n ref: React.ForwardedRef<DataGridRef>,\r\n) {\r\n const {\r\n columns,\r\n data,\r\n rowKey,\r\n rowHeight = 36,\r\n headerHeight = 40,\r\n width = '100%',\r\n height = 400,\r\n className,\r\n style,\r\n onCellEdit,\r\n sortColumn,\r\n sortDirection,\r\n onSort,\r\n onCopy,\r\n onPaste,\r\n overscan = 5,\r\n locale,\r\n rowSelection,\r\n selectedRows,\r\n onSelectedRowsChange,\r\n striped,\r\n highlightOnHover = true,\r\n showRowNumber,\r\n summaryRows,\r\n cellClassName,\r\n cellStyle: cellStyleFn,\r\n columnReorder,\r\n onColumnOrderChange,\r\n onContextMenu,\r\n onRowClick,\r\n onRowDoubleClick,\r\n rowClassName,\r\n loading,\r\n emptyContent,\r\n } = props\r\n\r\n const config = useConfig()\r\n\r\n const containerRef = useRef<HTMLDivElement>(null)\r\n\r\n const state = useDataGridState(columns, data)\r\n const {\r\n activeCell,\r\n setActiveCell,\r\n editingCell,\r\n startEditing,\r\n stopEditing,\r\n editValueRef,\r\n selection,\r\n navigate,\r\n resizeColumn,\r\n getColumnWidth,\r\n columnOrder,\r\n reorderColumns,\r\n dragColumnRef,\r\n } = state\r\n\r\n const [ctxMenu, setCtxMenu] = useState<{\r\n items: DataGridContextMenuItem[]\r\n position: { x: number; y: number }\r\n } | null>(null)\r\n\r\n const [dragOverCol, setDragOverCol] = useState<string | null>(null)\r\n\r\n const {\r\n range,\r\n containerRef: scrollRef,\r\n scrollToIndex,\r\n } = useVirtualScroll({\r\n itemCount: data.length,\r\n itemHeight: rowHeight,\r\n overscan,\r\n })\r\n\r\n const getRowKey = useCallback(\r\n (row: R, index: number): React.Key => {\r\n if (typeof rowKey === 'function') return rowKey(row, index)\r\n return row[rowKey] as React.Key\r\n },\r\n [rowKey],\r\n )\r\n\r\n const frozenLeft = useMemo(() => columns.filter((c) => c.frozen === 'left'), [columns])\r\n const frozenRight = useMemo(() => columns.filter((c) => c.frozen === 'right'), [columns])\r\n const scrollable = useMemo(() => columns.filter((c) => !c.frozen), [columns])\r\n\r\n const orderedColumns = useMemo(() => {\r\n const base = [...frozenLeft, ...scrollable, ...frozenRight]\r\n if (!columnOrder) return base\r\n const map = new Map(base.map((c) => [c.key, c]))\r\n const ordered: DataGridColumn<R>[] = []\r\n for (const key of columnOrder) {\r\n const col = map.get(key)\r\n if (col) ordered.push(col)\r\n }\r\n for (const col of base) {\r\n if (!columnOrder.includes(col.key)) ordered.push(col)\r\n }\r\n return ordered\r\n }, [frozenLeft, scrollable, frozenRight, columnOrder])\r\n\r\n const extraColsWidth =\r\n (rowSelection ? SELECTION_COL_WIDTH : 0) + (showRowNumber ? ROW_NUMBER_COL_WIDTH : 0)\r\n\r\n const totalWidth = useMemo(\r\n () => orderedColumns.reduce((sum, col) => sum + getColumnWidth(col.key), 0) + extraColsWidth,\r\n [orderedColumns, getColumnWidth, extraColsWidth],\r\n )\r\n\r\n const allSelected = useMemo(() => {\r\n if (!selectedRows || data.length === 0) return false\r\n return data.every((row, i) => selectedRows.has(getRowKey(row, i)))\r\n }, [selectedRows, data, getRowKey])\r\n\r\n const someSelected = useMemo(() => {\r\n if (!selectedRows || data.length === 0) return false\r\n const count = data.filter((row, i) => selectedRows.has(getRowKey(row, i))).length\r\n return count > 0 && count < data.length\r\n }, [selectedRows, data, getRowKey])\r\n\r\n const handleSelectAll = useCallback(() => {\r\n if (!onSelectedRowsChange) return\r\n if (allSelected) {\r\n onSelectedRowsChange(new Set())\r\n } else {\r\n const all = new Set<React.Key>(data.map((row, i) => getRowKey(row, i)))\r\n onSelectedRowsChange(all)\r\n }\r\n }, [allSelected, data, getRowKey, onSelectedRowsChange])\r\n\r\n const handleSelectRow = useCallback(\r\n (row: R, index: number) => {\r\n if (!onSelectedRowsChange || !selectedRows) return\r\n const key = getRowKey(row, index)\r\n const next = new Set(selectedRows)\r\n if (next.has(key)) next.delete(key)\r\n else next.add(key)\r\n onSelectedRowsChange(next)\r\n },\r\n [getRowKey, onSelectedRowsChange, selectedRows],\r\n )\r\n\r\n const handleCellClick = useCallback(\r\n (rowIndex: number, colIndex: number) => {\r\n if (editingCell) {\r\n if (onCellEdit && editValueRef.current !== undefined) {\r\n onCellEdit(editingCell.row, orderedColumns[editingCell.col].key, editValueRef.current)\r\n }\r\n stopEditing()\r\n }\r\n setActiveCell({ row: rowIndex, col: colIndex })\r\n },\r\n [editingCell, onCellEdit, editValueRef, orderedColumns, stopEditing, setActiveCell],\r\n )\r\n\r\n const handleCellDoubleClick = useCallback(\r\n (rowIndex: number, colIndex: number) => {\r\n startEditing({ row: rowIndex, col: colIndex })\r\n },\r\n [startEditing],\r\n )\r\n\r\n const handleCommitEdit = useCallback(() => {\r\n if (editingCell && onCellEdit && editValueRef.current !== undefined) {\r\n onCellEdit(editingCell.row, orderedColumns[editingCell.col].key, editValueRef.current)\r\n }\r\n stopEditing()\r\n }, [editingCell, onCellEdit, editValueRef, orderedColumns, stopEditing])\r\n\r\n const handleCancelEdit = useCallback(() => {\r\n stopEditing()\r\n }, [stopEditing])\r\n\r\n const handleKeyDown = useCallback(\r\n (e: React.KeyboardEvent) => {\r\n if (!activeCell) return\r\n\r\n if (editingCell) return\r\n\r\n switch (e.key) {\r\n case 'ArrowUp':\r\n e.preventDefault()\r\n navigate(activeCell, 'up', e.shiftKey)\r\n break\r\n case 'ArrowDown':\r\n e.preventDefault()\r\n navigate(activeCell, 'down', e.shiftKey)\r\n break\r\n case 'ArrowLeft':\r\n e.preventDefault()\r\n navigate(activeCell, 'left', e.shiftKey)\r\n break\r\n case 'ArrowRight':\r\n e.preventDefault()\r\n navigate(activeCell, 'right', e.shiftKey)\r\n break\r\n case 'Enter':\r\n e.preventDefault()\r\n startEditing(activeCell)\r\n break\r\n case 'Tab':\r\n e.preventDefault()\r\n navigate(activeCell, e.shiftKey ? 'left' : 'right')\r\n break\r\n case 'Escape':\r\n setActiveCell(null)\r\n break\r\n case ' ':\r\n if (rowSelection && selectedRows) {\r\n e.preventDefault()\r\n const row = data[activeCell.row]\r\n if (row) handleSelectRow(row, activeCell.row)\r\n }\r\n break\r\n case 'a':\r\n if ((e.ctrlKey || e.metaKey) && rowSelection) {\r\n e.preventDefault()\r\n handleSelectAll()\r\n }\r\n break\r\n case 'c':\r\n if ((e.ctrlKey || e.metaKey) && onCopy) {\r\n e.preventDefault()\r\n const col = orderedColumns[activeCell.col]\r\n const val = data[activeCell.row]?.[col.key]\r\n onCopy(val == null ? '' : String(val))\r\n }\r\n break\r\n case 'v':\r\n if ((e.ctrlKey || e.metaKey) && onPaste) {\r\n e.preventDefault()\r\n navigator.clipboard?.readText().then((text) => {\r\n onPaste(text, activeCell)\r\n })\r\n }\r\n break\r\n }\r\n },\r\n [\r\n activeCell,\r\n editingCell,\r\n navigate,\r\n startEditing,\r\n setActiveCell,\r\n onCopy,\r\n onPaste,\r\n orderedColumns,\r\n data,\r\n rowSelection,\r\n selectedRows,\r\n handleSelectRow,\r\n handleSelectAll,\r\n ],\r\n )\r\n\r\n const handleSort = useCallback(\r\n (col: DataGridColumn<R>) => {\r\n if (!col.sortable || !onSort) return\r\n const dir = sortColumn === col.key && sortDirection === 'asc' ? 'desc' : 'asc'\r\n onSort(col.key, dir)\r\n },\r\n [sortColumn, sortDirection, onSort],\r\n )\r\n\r\n const handleCellContextMenu = useCallback(\r\n (e: React.MouseEvent, rowIndex: number, col: DataGridColumn<R>) => {\r\n if (!onContextMenu) return\r\n e.preventDefault()\r\n const row = data[rowIndex]\r\n if (!row) return\r\n const items = onContextMenu(rowIndex, col.key, row)\r\n if (items.length === 0) return\r\n setCtxMenu({ items, position: { x: e.clientX, y: e.clientY } })\r\n },\r\n [onContextMenu, data],\r\n )\r\n\r\n const handleHeaderDragStart = useCallback(\r\n (e: React.DragEvent, colKey: string) => {\r\n if (!columnReorder) return\r\n dragColumnRef.current = colKey\r\n e.dataTransfer.effectAllowed = 'move'\r\n },\r\n [columnReorder, dragColumnRef],\r\n )\r\n\r\n const handleHeaderDragOver = useCallback(\r\n (e: React.DragEvent, colKey: string) => {\r\n if (!columnReorder || !dragColumnRef.current) return\r\n e.preventDefault()\r\n setDragOverCol(colKey)\r\n },\r\n [columnReorder, dragColumnRef],\r\n )\r\n\r\n const handleHeaderDrop = useCallback(\r\n (e: React.DragEvent, colKey: string) => {\r\n e.preventDefault()\r\n if (!columnReorder || !dragColumnRef.current) return\r\n const newOrder = reorderColumns(dragColumnRef.current, colKey)\r\n dragColumnRef.current = null\r\n setDragOverCol(null)\r\n onColumnOrderChange?.(newOrder)\r\n },\r\n [columnReorder, dragColumnRef, reorderColumns, onColumnOrderChange],\r\n )\r\n\r\n const handleHeaderDragEnd = useCallback(() => {\r\n dragColumnRef.current = null\r\n setDragOverCol(null)\r\n }, [dragColumnRef])\r\n\r\n useImperativeHandle(\r\n ref,\r\n () => ({\r\n scrollToRow: scrollToIndex,\r\n scrollToColumn: () => {},\r\n getActiveCell: () => activeCell,\r\n setActiveCell,\r\n }),\r\n [scrollToIndex, activeCell, setActiveCell],\r\n )\r\n\r\n const handleResizeStart = useCallback(\r\n (colKey: string, startX: number) => {\r\n const startWidth = getColumnWidth(colKey)\r\n\r\n const onMouseMove = (e: MouseEvent) => {\r\n const delta = e.clientX - startX\r\n resizeColumn(colKey, startWidth + delta)\r\n }\r\n const onMouseUp = () => {\r\n document.removeEventListener('mousemove', onMouseMove)\r\n document.removeEventListener('mouseup', onMouseUp)\r\n }\r\n document.addEventListener('mousemove', onMouseMove)\r\n document.addEventListener('mouseup', onMouseUp)\r\n },\r\n [getColumnWidth, resizeColumn],\r\n )\r\n\r\n const renderCell = useCallback(\r\n (row: R, rowIndex: number, col: DataGridColumn<R>, colIndex: number) => {\r\n const isActive = activeCell?.row === rowIndex && activeCell?.col === colIndex\r\n const isEditing = editingCell?.row === rowIndex && editingCell?.col === colIndex\r\n const isSelected = isCellInRange(rowIndex, colIndex, selection)\r\n\r\n const rawValue = col.formula ? col.formula(row) : (row[col.key] as CellValue)\r\n\r\n const extraClass = cellClassName?.(rawValue, row, rowIndex, col) ?? ''\r\n const extraStyle = cellStyleFn?.(rawValue, row, rowIndex, col)\r\n\r\n const cellClassNames = [\r\n cls.cell,\r\n isActive ? cls.cellActive : '',\r\n isEditing ? cls.cellEditing : '',\r\n isSelected ? cls.cellSelected : '',\r\n col.frozen ? cls.frozen : '',\r\n col.className ?? '',\r\n extraClass,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')\r\n\r\n const baseCellStyle: React.CSSProperties = {\r\n width: getColumnWidth(col.key),\r\n minWidth: getColumnWidth(col.key),\r\n textAlign: col.align ?? 'left',\r\n ...extraStyle,\r\n }\r\n\r\n return (\r\n <div\r\n key={col.key}\r\n className={cellClassNames}\r\n style={baseCellStyle}\r\n onClick={() => handleCellClick(rowIndex, colIndex)}\r\n onDoubleClick={() => handleCellDoubleClick(rowIndex, colIndex)}\r\n onContextMenu={(e) => handleCellContextMenu(e, rowIndex, col)}\r\n role=\"gridcell\"\r\n aria-colindex={colIndex + 1 + (rowSelection ? 1 : 0) + (showRowNumber ? 1 : 0)}\r\n aria-selected={isActive || isSelected}\r\n >\r\n {isEditing ? (\r\n (col.editor ?? (DefaultEditor as (props: CellEditorProps<R>) => React.ReactNode))({\r\n value: rawValue,\r\n row,\r\n rowIndex,\r\n column: col,\r\n onChange: (v) => {\r\n editValueRef.current = v\r\n },\r\n onCommit: handleCommitEdit,\r\n onCancel: handleCancelEdit,\r\n })\r\n ) : col.render ? (\r\n col.render(rawValue, row, rowIndex)\r\n ) : (\r\n <span>{rawValue == null ? '' : String(rawValue)}</span>\r\n )}\r\n </div>\r\n )\r\n },\r\n [\r\n activeCell,\r\n editingCell,\r\n selection,\r\n getColumnWidth,\r\n handleCellClick,\r\n handleCellDoubleClick,\r\n handleCommitEdit,\r\n handleCancelEdit,\r\n editValueRef,\r\n cellClassName,\r\n cellStyleFn,\r\n handleCellContextMenu,\r\n rowSelection,\r\n showRowNumber,\r\n ],\r\n )\r\n\r\n const heightValue = typeof height === 'number' ? height : undefined\r\n const bodyHeight = heightValue ? heightValue - headerHeight : undefined\r\n\r\n const rootCls = [\r\n cls.root,\r\n striped ? 'sg-datagrid--striped' : '',\r\n loading ? 'sg-datagrid--loading' : '',\r\n className ?? '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={rootCls}\r\n style={{\r\n width,\r\n height,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n position: 'relative',\r\n ...style,\r\n }}\r\n onKeyDown={handleKeyDown}\r\n tabIndex={0}\r\n role=\"grid\"\r\n aria-rowcount={data.length}\r\n aria-colcount={orderedColumns.length}\r\n >\r\n {/* Header */}\r\n <div\r\n className={cls.header}\r\n style={{\r\n display: 'flex',\r\n height: headerHeight,\r\n minHeight: headerHeight,\r\n minWidth: totalWidth,\r\n }}\r\n role=\"row\"\r\n >\r\n {rowSelection && (\r\n <div\r\n className={`${cls.headerCell} ${cls.selectionCell}`}\r\n style={{\r\n width: SELECTION_COL_WIDTH,\r\n minWidth: SELECTION_COL_WIDTH,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n }}\r\n role=\"columnheader\"\r\n >\r\n <Checkbox\r\n checked={allSelected}\r\n indeterminate={someSelected}\r\n onChange={handleSelectAll}\r\n />\r\n </div>\r\n )}\r\n {showRowNumber && (\r\n <div\r\n className={`${cls.headerCell} ${cls.rowNumberCell}`}\r\n style={{\r\n width: ROW_NUMBER_COL_WIDTH,\r\n minWidth: ROW_NUMBER_COL_WIDTH,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n userSelect: 'none',\r\n }}\r\n role=\"columnheader\"\r\n >\r\n #\r\n </div>\r\n )}\r\n {orderedColumns.map((col) => {\r\n const isSorted = sortColumn === col.key\r\n const headerCls = [\r\n cls.headerCell,\r\n col.sortable ? cls.sortable : '',\r\n isSorted && sortDirection === 'asc' ? cls.sortAsc : '',\r\n isSorted && sortDirection === 'desc' ? cls.sortDesc : '',\r\n col.headerClassName ?? '',\r\n dragOverCol === col.key ? cls.headerDragOver : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')\r\n\r\n return (\r\n <div\r\n key={col.key}\r\n className={headerCls}\r\n style={{\r\n width: getColumnWidth(col.key),\r\n minWidth: getColumnWidth(col.key),\r\n position: 'relative',\r\n display: 'flex',\r\n alignItems: 'center',\r\n padding: '0 8px',\r\n cursor: col.sortable ? 'pointer' : 'default',\r\n userSelect: 'none',\r\n }}\r\n onClick={() => handleSort(col)}\r\n draggable={!!columnReorder}\r\n onDragStart={(e) => handleHeaderDragStart(e, col.key)}\r\n onDragOver={(e) => handleHeaderDragOver(e, col.key)}\r\n onDrop={(e) => handleHeaderDrop(e, col.key)}\r\n onDragEnd={handleHeaderDragEnd}\r\n onDragLeave={() => setDragOverCol(null)}\r\n role=\"columnheader\"\r\n >\r\n {col.title}\r\n {isSorted && (\r\n <span style={{ marginLeft: 4, fontSize: 10 }}>\r\n {sortDirection === 'asc' ? '▲' : '▼'}\r\n </span>\r\n )}\r\n {col.resizable !== false && (\r\n <div\r\n className={cls.resizer}\r\n style={{\r\n position: 'absolute',\r\n right: 0,\r\n top: 0,\r\n bottom: 0,\r\n width: 4,\r\n cursor: 'col-resize',\r\n }}\r\n onMouseDown={(e) => {\r\n e.stopPropagation()\r\n handleResizeStart(col.key, e.clientX)\r\n }}\r\n />\r\n )}\r\n </div>\r\n )\r\n })}\r\n </div>\r\n\r\n {/* Body */}\r\n <div\r\n ref={scrollRef as React.RefObject<HTMLDivElement>}\r\n className={cls.body}\r\n style={{\r\n flex: 1,\r\n overflow: 'auto',\r\n position: 'relative',\r\n height: bodyHeight,\r\n }}\r\n >\r\n {data.length === 0 ? (\r\n <div className={cls.empty} style={{ padding: 24, textAlign: 'center' }}>\r\n {emptyContent ?? locale?.noData ?? config.locale?.dataGrid?.noData ?? 'No data'}\r\n </div>\r\n ) : (\r\n <div style={{ height: range.totalHeight, position: 'relative', minWidth: totalWidth }}>\r\n {range.visibleItems.map((vi) => {\r\n const row = data[vi.index]\r\n if (!row) return null\r\n const rKey = getRowKey(row, vi.index)\r\n const isRowSelected = selectedRows?.has(rKey) ?? false\r\n const rowExtraClass =\r\n typeof rowClassName === 'function'\r\n ? rowClassName(row, vi.index)\r\n : (rowClassName ?? '')\r\n\r\n const rowCls = [\r\n cls.row,\r\n striped ? (vi.index % 2 === 0 ? cls.rowEven : cls.rowOdd) : '',\r\n highlightOnHover ? cls.rowHoverable : '',\r\n isRowSelected ? cls.rowSelected : '',\r\n rowExtraClass,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')\r\n\r\n return (\r\n <div\r\n key={rKey}\r\n className={rowCls}\r\n style={{\r\n display: 'flex',\r\n position: 'absolute',\r\n top: vi.offsetTop,\r\n height: vi.height,\r\n width: '100%',\r\n }}\r\n role=\"row\"\r\n aria-rowindex={vi.index + 1}\r\n aria-selected={isRowSelected}\r\n onClick={() => onRowClick?.(row, vi.index)}\r\n onDoubleClick={() => onRowDoubleClick?.(row, vi.index)}\r\n >\r\n {rowSelection && (\r\n <div\r\n className={`${cls.cell} ${cls.selectionCell}`}\r\n style={{\r\n width: SELECTION_COL_WIDTH,\r\n minWidth: SELECTION_COL_WIDTH,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <Checkbox\r\n checked={isRowSelected}\r\n onChange={() => handleSelectRow(row, vi.index)}\r\n />\r\n </div>\r\n )}\r\n {showRowNumber && (\r\n <div\r\n className={`${cls.cell} ${cls.rowNumberCell}`}\r\n style={{\r\n width: ROW_NUMBER_COL_WIDTH,\r\n minWidth: ROW_NUMBER_COL_WIDTH,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n color: 'var(--sg-color-text-tertiary, #999)',\r\n }}\r\n >\r\n {vi.index + 1}\r\n </div>\r\n )}\r\n {orderedColumns.map((col, ci) => renderCell(row, vi.index, col, ci))}\r\n </div>\r\n )\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Summary Footer */}\r\n {summaryRows && summaryRows.length > 0 && data.length > 0 && (\r\n <div className={cls.summary} style={{ minWidth: totalWidth }}>\r\n {summaryRows.map((sr, sri) => (\r\n <div\r\n key={sri}\r\n className={`${cls.summaryRow} ${sr.className ?? ''}`}\r\n style={{ display: 'flex', height: rowHeight }}\r\n >\r\n {rowSelection && (\r\n <div\r\n className={`${cls.summaryCell}`}\r\n style={{ width: SELECTION_COL_WIDTH, minWidth: SELECTION_COL_WIDTH }}\r\n />\r\n )}\r\n {showRowNumber && (\r\n <div\r\n className={`${cls.summaryCell}`}\r\n style={{ width: ROW_NUMBER_COL_WIDTH, minWidth: ROW_NUMBER_COL_WIDTH }}\r\n />\r\n )}\r\n {orderedColumns.map((col) => (\r\n <div\r\n key={col.key}\r\n className={cls.summaryCell}\r\n style={{\r\n width: getColumnWidth(col.key),\r\n minWidth: getColumnWidth(col.key),\r\n textAlign: col.align ?? 'left',\r\n }}\r\n >\r\n {sr.render(col.key, data)}\r\n </div>\r\n ))}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Context Menu */}\r\n {ctxMenu && (\r\n <ContextMenuPopup\r\n items={ctxMenu.items}\r\n position={ctxMenu.position}\r\n onClose={() => setCtxMenu(null)}\r\n />\r\n )}\r\n\r\n {/* Loading */}\r\n {loading && (\r\n <div\r\n className={cls.loading}\r\n style={{\r\n position: 'absolute',\r\n inset: 0,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n background: 'rgba(255,255,255,0.6)',\r\n zIndex: 10,\r\n }}\r\n >\r\n <Spin size=\"large\" />\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\n/**\r\n * Virtualized table grid with sortable headers, resizable columns, inline editing,\r\n * row selection, striped rows, summary footer, context menu, column reorder, and clipboard hooks.\r\n */\r\nexport const DataGrid = forwardRef(DataGridInner) as <R extends Record<string, unknown>>(\r\n props: DataGridProps<R> & { ref?: React.Ref<DataGridRef> },\r\n) => React.ReactElement\r\n","import { useState, useCallback, useRef } from 'react'\r\nimport type { CellPosition, CellRange, CellValue, DataGridColumn } from './types'\r\n\r\n/**\r\n * Holds active cell, edit session, range selection, column width, and column order state for `DataGrid`.\r\n */\r\nexport function useDataGridState<R>(columns: DataGridColumn<R>[], data: R[]) {\r\n const [activeCell, setActiveCell] = useState<CellPosition | null>(null)\r\n const [editingCell, setEditingCell] = useState<CellPosition | null>(null)\r\n const [selection, setSelection] = useState<CellRange | null>(null)\r\n const [columnWidths, setColumnWidths] = useState<Map<string, number>>(() => {\r\n const map = new Map<string, number>()\r\n for (const col of columns) {\r\n if (col.width) map.set(col.key, col.width)\r\n }\r\n return map\r\n })\r\n const [columnOrder, setColumnOrder] = useState<string[] | null>(null)\r\n\r\n const editValueRef = useRef<CellValue>(undefined)\r\n const dragColumnRef = useRef<string | null>(null)\r\n\r\n const startEditing = useCallback(\r\n (pos: CellPosition) => {\r\n const col = columns[pos.col]\r\n if (!col) return\r\n\r\n const isEditable =\r\n typeof col.editable === 'function'\r\n ? col.editable(data[pos.row], pos.row)\r\n : col.editable !== false\r\n\r\n if (!isEditable) return\r\n\r\n editValueRef.current = (data[pos.row] as Record<string, unknown>)[col.key] as CellValue\r\n setEditingCell(pos)\r\n },\r\n [columns, data],\r\n )\r\n\r\n const stopEditing = useCallback(() => {\r\n setEditingCell(null)\r\n editValueRef.current = undefined\r\n }, [])\r\n\r\n const navigate = useCallback(\r\n (\r\n from: CellPosition,\r\n direction: 'up' | 'down' | 'left' | 'right',\r\n shiftKey = false,\r\n ): CellPosition => {\r\n let { row, col } = from\r\n switch (direction) {\r\n case 'up':\r\n row = Math.max(0, row - 1)\r\n break\r\n case 'down':\r\n row = Math.min(data.length - 1, row + 1)\r\n break\r\n case 'left':\r\n col = Math.max(0, col - 1)\r\n break\r\n case 'right':\r\n col = Math.min(columns.length - 1, col + 1)\r\n break\r\n }\r\n const next = { row, col }\r\n\r\n if (shiftKey) {\r\n setSelection((prev) => ({\r\n start: prev?.start ?? from,\r\n end: next,\r\n }))\r\n } else {\r\n setSelection(null)\r\n }\r\n\r\n setActiveCell(next)\r\n return next\r\n },\r\n [data.length, columns.length],\r\n )\r\n\r\n const resizeColumn = useCallback(\r\n (key: string, width: number) => {\r\n const col = columns.find((c) => c.key === key)\r\n const minW = col?.minWidth ?? 50\r\n const maxW = col?.maxWidth ?? Infinity\r\n const clamped = Math.max(minW, Math.min(maxW, width))\r\n setColumnWidths((prev) => new Map(prev).set(key, clamped))\r\n },\r\n [columns],\r\n )\r\n\r\n const getColumnWidth = useCallback(\r\n (key: string): number => {\r\n return columnWidths.get(key) ?? columns.find((c) => c.key === key)?.width ?? 120\r\n },\r\n [columnWidths, columns],\r\n )\r\n\r\n const reorderColumns = useCallback(\r\n (fromKey: string, toKey: string) => {\r\n const order = columnOrder ?? columns.map((c) => c.key)\r\n const fromIdx = order.indexOf(fromKey)\r\n const toIdx = order.indexOf(toKey)\r\n if (fromIdx === -1 || toIdx === -1 || fromIdx === toIdx) return order\r\n const next = [...order]\r\n const [moved] = next.splice(fromIdx, 1)\r\n next.splice(toIdx, 0, moved)\r\n setColumnOrder(next)\r\n return next\r\n },\r\n [columnOrder, columns],\r\n )\r\n\r\n return {\r\n activeCell,\r\n setActiveCell,\r\n editingCell,\r\n startEditing,\r\n stopEditing,\r\n editValueRef,\r\n selection,\r\n setSelection,\r\n navigate,\r\n resizeColumn,\r\n getColumnWidth,\r\n columnOrder,\r\n setColumnOrder,\r\n reorderColumns,\r\n dragColumnRef,\r\n }\r\n}\r\n"],"mappings":"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","names":["useCallback","useRef","useState","useRef","useState","useCallback"]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Checkbox
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-EA2J67A4.js";
|
|
4
4
|
import {
|
|
5
5
|
Spin,
|
|
6
6
|
useConfig
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-YJZKXU5O.js";
|
|
8
8
|
|
|
9
9
|
// src/hooks/useTree.ts
|
|
10
10
|
import { useState, useCallback, useMemo } from "react";
|
|
@@ -645,7 +645,11 @@ function Tree(props) {
|
|
|
645
645
|
style,
|
|
646
646
|
unstyled
|
|
647
647
|
} = props;
|
|
648
|
-
const
|
|
648
|
+
const config = useConfig();
|
|
649
|
+
const t = useMemo2(
|
|
650
|
+
() => ({ ...DEFAULT_TREE_LOCALE, ...config.locale?.tree, ...locale }),
|
|
651
|
+
[config.locale?.tree, locale]
|
|
652
|
+
);
|
|
649
653
|
const showLineConfig = typeof showLine === "object" ? showLine : { showLeafIcon: false };
|
|
650
654
|
const isShowLine = !!showLine;
|
|
651
655
|
const {
|
|
@@ -1664,4 +1668,4 @@ export {
|
|
|
1664
1668
|
Tree,
|
|
1665
1669
|
TreeSelect
|
|
1666
1670
|
};
|
|
1667
|
-
//# sourceMappingURL=chunk-
|
|
1671
|
+
//# sourceMappingURL=chunk-N4S66XHX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useTree.ts","../src/components/complex/Tree/Tree.tsx","../src/components/complex/Tree/TreeNodeRow.tsx","../src/components/complex/Tree/types.ts","../src/components/complex/TreeSelect/TreeSelect.tsx"],"sourcesContent":["import { useState, useCallback, useMemo } from 'react'\r\nimport { createCore, createTree } from '@skygraph/core'\r\nimport type {\r\n Core,\r\n TreeEngine,\r\n TreeState,\r\n TreeEngineOptions,\r\n TreeKey,\r\n TreeNodeData,\r\n} from '@skygraph/core'\r\n\r\nexport interface UseTreeOptions extends TreeEngineOptions {\r\n data?: TreeNodeData[]\r\n}\r\n\r\nexport interface UseTreeReturn {\r\n core: Core\r\n tree: TreeEngine\r\n treeState: TreeState\r\n flatNodes: ReturnType<TreeEngine['getFlatNodes']>\r\n expand: (key: TreeKey) => void\r\n collapse: (key: TreeKey) => void\r\n toggleExpand: (key: TreeKey) => void\r\n setExpandedKeys: (keys: TreeKey[]) => void\r\n expandAll: () => void\r\n collapseAll: () => void\r\n expandToLevel: (level: number) => void\r\n check: (key: TreeKey) => void\r\n uncheck: (key: TreeKey) => void\r\n toggleCheck: (key: TreeKey) => void\r\n setCheckedKeys: (keys: TreeKey[]) => void\r\n checkAll: () => void\r\n uncheckAll: () => void\r\n select: (key: TreeKey, multiple?: boolean) => void\r\n deselect: (key: TreeKey) => void\r\n setSelectedKeys: (keys: TreeKey[]) => void\r\n markLoading: (key: TreeKey) => void\r\n markLoaded: (key: TreeKey) => void\r\n addChildren: (parentKey: TreeKey, children: TreeNodeData[]) => void\r\n moveNode: (dragKey: TreeKey, dropKey: TreeKey, position: -1 | 0 | 1) => TreeNodeData[] | null\r\n filterNodes: (predicate: ((node: TreeNodeData) => boolean) | null) => void\r\n getNodePath: (key: TreeKey) => TreeKey[]\r\n refresh: () => void\r\n}\r\n\r\nexport function useTree(options?: UseTreeOptions): UseTreeReturn {\r\n const [{ core, tree }] = useState(() => {\r\n const c = createCore()\r\n const t = createTree(c, options)\r\n if (options?.data) {\r\n t.setData(options.data)\r\n }\r\n return { core: c, tree: t }\r\n })\r\n\r\n const [treeState, setTreeState] = useState(() => tree.getState())\r\n const [flatNodes, setFlatNodes] = useState(() => tree.getFlatNodes())\r\n\r\n const refresh = useCallback(() => {\r\n setTreeState(tree.getState())\r\n setFlatNodes(tree.getFlatNodes())\r\n }, [tree])\r\n\r\n const expand = useCallback((key: TreeKey) => { tree.expand(key); refresh() }, [tree, refresh])\r\n const collapse = useCallback((key: TreeKey) => { tree.collapse(key); refresh() }, [tree, refresh])\r\n const toggleExpand = useCallback((key: TreeKey) => { tree.toggleExpand(key); refresh() }, [tree, refresh])\r\n const setExpandedKeys = useCallback((keys: TreeKey[]) => { tree.setExpandedKeys(keys); refresh() }, [tree, refresh])\r\n const expandAll = useCallback(() => { tree.expandAll(); refresh() }, [tree, refresh])\r\n const collapseAll = useCallback(() => { tree.collapseAll(); refresh() }, [tree, refresh])\r\n\r\n const check = useCallback((key: TreeKey) => { tree.check(key); refresh() }, [tree, refresh])\r\n const uncheck = useCallback((key: TreeKey) => { tree.uncheck(key); refresh() }, [tree, refresh])\r\n const toggleCheck = useCallback((key: TreeKey) => { tree.toggleCheck(key); refresh() }, [tree, refresh])\r\n const setCheckedKeys = useCallback((keys: TreeKey[]) => { tree.setCheckedKeys(keys); refresh() }, [tree, refresh])\r\n\r\n const select = useCallback((key: TreeKey, multiple?: boolean) => { tree.select(key, multiple); refresh() }, [tree, refresh])\r\n const deselect = useCallback((key: TreeKey) => { tree.deselect(key); refresh() }, [tree, refresh])\r\n const setSelectedKeys = useCallback((keys: TreeKey[]) => { tree.setSelectedKeys(keys); refresh() }, [tree, refresh])\r\n\r\n const markLoading = useCallback((key: TreeKey) => { tree.markLoading(key); refresh() }, [tree, refresh])\r\n const markLoaded = useCallback((key: TreeKey) => { tree.markLoaded(key); refresh() }, [tree, refresh])\r\n const addChildren = useCallback((parentKey: TreeKey, children: TreeNodeData[]) => { tree.addChildren(parentKey, children); refresh() }, [tree, refresh])\r\n\r\n const moveNode = useCallback((dragKey: TreeKey, dropKey: TreeKey, position: -1 | 0 | 1) => {\r\n const result = tree.moveNode(dragKey, dropKey, position)\r\n refresh()\r\n return result\r\n }, [tree, refresh])\r\n\r\n const filterNodes = useCallback((predicate: ((node: TreeNodeData) => boolean) | null) => {\r\n tree.filterNodes(predicate)\r\n refresh()\r\n }, [tree, refresh])\r\n\r\n const expandToLevel = useCallback((level: number) => {\r\n const flat = tree.getFlatNodes()\r\n const keys: TreeKey[] = []\r\n for (const item of flat) {\r\n if (item.depth < level && !item.isLeaf) {\r\n keys.push(item.key)\r\n }\r\n }\r\n tree.expandAll()\r\n const allFlat = tree.getFlatNodes()\r\n const expandKeys: TreeKey[] = []\r\n for (const item of allFlat) {\r\n if (item.depth < level && !item.isLeaf) {\r\n expandKeys.push(item.key)\r\n }\r\n }\r\n tree.setExpandedKeys(expandKeys)\r\n refresh()\r\n }, [tree, refresh])\r\n\r\n const checkAll = useCallback(() => {\r\n const allKeys = tree.getAllKeys()\r\n tree.setCheckedKeys(allKeys)\r\n refresh()\r\n }, [tree, refresh])\r\n\r\n const uncheckAll = useCallback(() => {\r\n tree.setCheckedKeys([])\r\n refresh()\r\n }, [tree, refresh])\r\n\r\n const getNodePath = useCallback((key: TreeKey): TreeKey[] => {\r\n const path: TreeKey[] = []\r\n let current: TreeKey | null = key\r\n while (current !== null) {\r\n path.unshift(current)\r\n current = tree.getParentKey(current)\r\n }\r\n return path\r\n }, [tree])\r\n\r\n return useMemo(() => ({\r\n core, tree, treeState, flatNodes,\r\n expand, collapse, toggleExpand, setExpandedKeys, expandAll, collapseAll, expandToLevel,\r\n check, uncheck, toggleCheck, setCheckedKeys, checkAll, uncheckAll,\r\n select, deselect, setSelectedKeys,\r\n markLoading, markLoaded, addChildren,\r\n moveNode, filterNodes, getNodePath, refresh,\r\n }), [\r\n core, tree, treeState, flatNodes,\r\n expand, collapse, toggleExpand, setExpandedKeys, expandAll, collapseAll, expandToLevel,\r\n check, uncheck, toggleCheck, setCheckedKeys, checkAll, uncheckAll,\r\n select, deselect, setSelectedKeys,\r\n markLoading, markLoaded, addChildren,\r\n moveNode, filterNodes, getNodePath, refresh,\r\n ])\r\n}\r\n","import React, { useState, useEffect, useMemo, useCallback, useRef } from 'react'\r\nimport { useTree } from '../../../hooks/useTree'\r\nimport { useConfig } from '../../ConfigProvider'\r\nimport { TreeNodeRow } from './TreeNodeRow'\r\nimport type { TreeProps, TreeKey, TreeNodeData } from './types'\r\nimport { DEFAULT_TREE_LOCALE, DEFAULT_INDENT, NODE_HEIGHT } from './types'\r\n\r\n/**\r\n * Hierarchical list with expand/collapse, checkboxes, selection, search, keyboard focus, and optional drag-and-drop.\r\n * State is managed by `useTree`; rows are rendered through `TreeNodeRow`.\r\n */\r\nexport function Tree(props: TreeProps) {\r\n const {\r\n treeData,\r\n fieldNames,\r\n checkable = false,\r\n checkStrictly = false,\r\n checkedKeys: controlledCheckedKeys,\r\n defaultCheckedKeys,\r\n onCheck,\r\n selectable = true,\r\n multiple = false,\r\n selectedKeys: controlledSelectedKeys,\r\n defaultSelectedKeys,\r\n onSelect,\r\n expandedKeys: controlledExpandedKeys,\r\n defaultExpandedKeys,\r\n defaultExpandAll = false,\r\n autoExpandParent = false,\r\n onExpand,\r\n draggable = false,\r\n allowDrop,\r\n onDragStart,\r\n onDragOver,\r\n onDragLeave,\r\n onDragEnd,\r\n onDrop,\r\n loadData,\r\n showLine = false,\r\n showIcon = false,\r\n icon: globalIcon,\r\n switcherIcon,\r\n blockNode = false,\r\n height,\r\n virtual = true,\r\n disabled = false,\r\n indentSize = DEFAULT_INDENT,\r\n directory = false,\r\n onRightClick,\r\n // Search\r\n showSearch = false,\r\n searchValue: controlledSearchValue,\r\n defaultSearchValue = '',\r\n onSearch,\r\n filterTreeNode,\r\n highlightSearch = true,\r\n // Keyboard\r\n keyboard = true,\r\n // Editable\r\n editable = false,\r\n onEdit,\r\n onEditCancel,\r\n // Custom render\r\n titleRender,\r\n // Actions\r\n actions,\r\n // Toolbar\r\n showToolbar = false,\r\n toolbarExtra,\r\n // Animation\r\n animated = true,\r\n // Focus\r\n autoFocus = false,\r\n focusedKey: controlledFocusedKey,\r\n onFocus: onFocusCallback,\r\n // Scroll\r\n scrollToKey,\r\n // Status\r\n nodeStatus,\r\n locale,\r\n className,\r\n style,\r\n unstyled,\r\n } = props\r\n\r\n const config = useConfig()\r\n const t = useMemo(\r\n () => ({ ...DEFAULT_TREE_LOCALE, ...config.locale?.tree, ...locale }),\r\n [config.locale?.tree, locale],\r\n )\r\n\r\n const showLineConfig = typeof showLine === 'object' ? showLine : { showLeafIcon: false }\r\n const isShowLine = !!showLine\r\n\r\n const {\r\n tree,\r\n treeState,\r\n flatNodes,\r\n toggleExpand,\r\n setExpandedKeys,\r\n expandAll,\r\n collapseAll,\r\n toggleCheck,\r\n setCheckedKeys,\r\n select,\r\n setSelectedKeys,\r\n markLoading,\r\n markLoaded,\r\n moveNode,\r\n filterNodes,\r\n refresh,\r\n } = useTree({\r\n data: treeData,\r\n fieldNames,\r\n checkStrictly,\r\n defaultExpandAll,\r\n defaultExpandedKeys,\r\n defaultCheckedKeys,\r\n defaultSelectedKeys,\r\n })\r\n\r\n // ═══════════════════════════════════════════\r\n // SEARCH STATE\r\n // ═══════════════════════════════════════════\r\n const [internalSearchValue, setInternalSearchValue] = useState(defaultSearchValue)\r\n const searchValue = controlledSearchValue ?? internalSearchValue\r\n\r\n const handleSearchChange = useCallback(\r\n (value: string) => {\r\n if (controlledSearchValue === undefined) {\r\n setInternalSearchValue(value)\r\n }\r\n onSearch?.(value)\r\n\r\n if (!value) {\r\n filterNodes(null)\r\n return\r\n }\r\n\r\n const predicate = filterTreeNode\r\n ? (node: TreeNodeData) => filterTreeNode(node, value)\r\n : (node: TreeNodeData) => {\r\n const title = String(node.title ?? '')\r\n return title.toLowerCase().includes(value.toLowerCase())\r\n }\r\n\r\n filterNodes(predicate)\r\n\r\n if (autoExpandParent) {\r\n const filtered = tree.getFilteredKeys()\r\n if (filtered) {\r\n setExpandedKeys(filtered)\r\n }\r\n }\r\n },\r\n [\r\n controlledSearchValue,\r\n onSearch,\r\n filterTreeNode,\r\n filterNodes,\r\n autoExpandParent,\r\n tree,\r\n setExpandedKeys,\r\n ],\r\n )\r\n\r\n useEffect(() => {\r\n if (controlledSearchValue !== undefined && controlledSearchValue !== internalSearchValue) {\r\n handleSearchChange(controlledSearchValue)\r\n }\r\n }, [controlledSearchValue]) // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n // ═══════════════════════════════════════════\r\n // SYNC DATA CHANGES\r\n // ═══════════════════════════════════════════\r\n const prevDataRef = useRef(treeData)\r\n useEffect(() => {\r\n if (prevDataRef.current !== treeData) {\r\n prevDataRef.current = treeData\r\n tree.setData(treeData)\r\n refresh()\r\n }\r\n }, [treeData, tree, refresh])\r\n\r\n // Controlled keys\r\n useEffect(() => {\r\n if (controlledExpandedKeys !== undefined) setExpandedKeys(controlledExpandedKeys)\r\n }, [controlledExpandedKeys, setExpandedKeys])\r\n\r\n useEffect(() => {\r\n if (controlledCheckedKeys !== undefined) setCheckedKeys(controlledCheckedKeys)\r\n }, [controlledCheckedKeys, setCheckedKeys])\r\n\r\n useEffect(() => {\r\n if (controlledSelectedKeys !== undefined) setSelectedKeys(controlledSelectedKeys)\r\n }, [controlledSelectedKeys, setSelectedKeys])\r\n\r\n // ═══════════════════════════════════════════\r\n // FOCUS STATE\r\n // ═══════════════════════════════════════════\r\n const [internalFocusedKey, setInternalFocusedKey] = useState<TreeKey | null>(null)\r\n const focusedKey = controlledFocusedKey ?? internalFocusedKey\r\n const treeRef = useRef<HTMLDivElement>(null)\r\n\r\n const setFocusedKey = useCallback(\r\n (key: TreeKey | null) => {\r\n setInternalFocusedKey(key)\r\n if (key !== null) onFocusCallback?.(key)\r\n },\r\n [onFocusCallback],\r\n )\r\n\r\n useEffect(() => {\r\n if (autoFocus && flatNodes.length > 0 && focusedKey === null) {\r\n setFocusedKey(flatNodes[0].key)\r\n }\r\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n // ═══════════════════════════════════════════\r\n // EDITING STATE\r\n // ═══════════════════════════════════════════\r\n const [editingKey, setEditingKey] = useState<TreeKey | null>(null)\r\n\r\n const isNodeEditable = useCallback(\r\n (node: TreeNodeData): boolean => {\r\n if (typeof editable === 'function') return editable(node)\r\n return !!editable\r\n },\r\n [editable],\r\n )\r\n\r\n const handleEditStart = useCallback((key: TreeKey) => {\r\n setEditingKey(key)\r\n }, [])\r\n\r\n const handleEditConfirm = useCallback(\r\n (key: TreeKey, value: string) => {\r\n const node = tree.getNode(key)\r\n if (node && onEdit) {\r\n onEdit({ key, node, value, oldValue: String(node.title ?? '') })\r\n }\r\n setEditingKey(null)\r\n },\r\n [tree, onEdit],\r\n )\r\n\r\n const handleEditCancelInternal = useCallback(\r\n (key: TreeKey) => {\r\n setEditingKey(null)\r\n onEditCancel?.(key)\r\n },\r\n [onEditCancel],\r\n )\r\n\r\n // ═══════════════════════════════════════════\r\n // DRAG STATE\r\n // ═══════════════════════════════════════════\r\n const [dragKey, setDragKey] = useState<TreeKey | null>(null)\r\n const [dropKey, setDropKey] = useState<TreeKey | null>(null)\r\n const [dropPosition, setDropPosition] = useState<-1 | 0 | 1>(0)\r\n\r\n // ═══════════════════════════════════════════\r\n // EVENT HANDLERS\r\n // ═══════════════════════════════════════════\r\n const handleExpand = useCallback(\r\n (key: TreeKey) => {\r\n toggleExpand(key)\r\n const node = tree.getNode(key)\r\n if (node && onExpand) {\r\n const newState = tree.getState()\r\n const expanded = newState.expandedKeys.includes(key)\r\n onExpand(newState.expandedKeys, { expanded, node })\r\n }\r\n },\r\n [toggleExpand, tree, onExpand],\r\n )\r\n\r\n const handleCheck = useCallback(\r\n (key: TreeKey) => {\r\n toggleCheck(key)\r\n if (onCheck) {\r\n const newState = tree.getState()\r\n const node = tree.getNode(key)!\r\n const checkedNodes = newState.checkedKeys\r\n .map((ck: TreeKey) => tree.getNode(ck))\r\n .filter(Boolean) as TreeNodeData[]\r\n onCheck(newState.checkedKeys, {\r\n checked: newState.checkedKeys.includes(key),\r\n node,\r\n checkedNodes,\r\n halfCheckedKeys: newState.halfCheckedKeys,\r\n })\r\n }\r\n },\r\n [toggleCheck, tree, onCheck],\r\n )\r\n\r\n const handleSelect = useCallback(\r\n (key: TreeKey) => {\r\n select(key, multiple)\r\n if (onSelect) {\r\n const newState = tree.getState()\r\n const node = tree.getNode(key)!\r\n const selectedNodes = newState.selectedKeys\r\n .map((sk: TreeKey) => tree.getNode(sk))\r\n .filter(Boolean) as TreeNodeData[]\r\n onSelect(newState.selectedKeys, {\r\n selected: newState.selectedKeys.includes(key),\r\n node,\r\n selectedNodes,\r\n })\r\n }\r\n },\r\n [select, multiple, tree, onSelect],\r\n )\r\n\r\n const handleLoadData = useCallback(\r\n (node: TreeNodeData) => {\r\n if (!loadData) return\r\n const key = node.key\r\n if (treeState.loadedKeys.includes(key) || treeState.loadingKeys.includes(key)) return\r\n markLoading(key)\r\n loadData(node).then(() => {\r\n markLoaded(key)\r\n })\r\n },\r\n [loadData, treeState.loadedKeys, treeState.loadingKeys, markLoading, markLoaded],\r\n )\r\n\r\n // Drag handlers\r\n const handleDragStart = useCallback(\r\n (e: React.DragEvent, key: TreeKey) => {\r\n setDragKey(key)\r\n e.dataTransfer.effectAllowed = 'move'\r\n const node = tree.getNode(key)\r\n if (node) onDragStart?.({ event: e, node })\r\n },\r\n [tree, onDragStart],\r\n )\r\n\r\n const handleDragOver = useCallback(\r\n (e: React.DragEvent, key: TreeKey) => {\r\n e.preventDefault()\r\n setDropKey(key)\r\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\r\n const y = e.clientY - rect.top\r\n const h = rect.height\r\n let pos: -1 | 0 | 1 = 0\r\n if (y < h * 0.25) pos = -1\r\n else if (y > h * 0.75) pos = 1\r\n setDropPosition(pos)\r\n const node = tree.getNode(key)\r\n if (node) onDragOver?.({ event: e, node })\r\n },\r\n [tree, onDragOver],\r\n )\r\n\r\n const handleDragLeave = useCallback(\r\n (e: React.DragEvent, key: TreeKey) => {\r\n setDropKey(null)\r\n const node = tree.getNode(key)\r\n if (node) onDragLeave?.({ event: e, node })\r\n },\r\n [tree, onDragLeave],\r\n )\r\n\r\n const handleDragEnd = useCallback(\r\n (e: React.DragEvent, key: TreeKey) => {\r\n setDragKey(null)\r\n setDropKey(null)\r\n const node = tree.getNode(key)\r\n if (node) onDragEnd?.({ event: e, node })\r\n },\r\n [tree, onDragEnd],\r\n )\r\n\r\n const handleDrop = useCallback(\r\n (e: React.DragEvent, key: TreeKey) => {\r\n e.preventDefault()\r\n if (dragKey === null || dragKey === key) {\r\n setDragKey(null)\r\n setDropKey(null)\r\n return\r\n }\r\n\r\n const dragNode = tree.getNode(dragKey)\r\n const dropNode = tree.getNode(key)\r\n if (!dragNode || !dropNode) return\r\n\r\n if (allowDrop && !allowDrop({ dragNode, dropNode, dropPosition })) {\r\n setDragKey(null)\r\n setDropKey(null)\r\n return\r\n }\r\n\r\n moveNode(dragKey, key, dropPosition)\r\n\r\n if (onDrop) {\r\n onDrop({ event: e, node: dropNode, dragNode, dropPosition })\r\n }\r\n\r\n setDragKey(null)\r\n setDropKey(null)\r\n },\r\n [dragKey, dropPosition, tree, allowDrop, moveNode, onDrop],\r\n )\r\n\r\n const handleRightClick = useCallback(\r\n (e: React.MouseEvent, node: TreeNodeData) => {\r\n onRightClick?.({ event: e, node })\r\n },\r\n [onRightClick],\r\n )\r\n\r\n const isDraggable = (node: TreeNodeData): boolean => {\r\n if (typeof draggable === 'function') return draggable(node)\r\n return !!draggable\r\n }\r\n\r\n // ═══════════════════════════════════════════\r\n // VIRTUAL SCROLL (refs declared early — used by keyboard handlers below)\r\n // ═══════════════════════════════════════════\r\n const containerRef = useRef<HTMLDivElement>(null)\r\n const [scrollTop, setScrollTop] = useState(0)\r\n const itemHeight = NODE_HEIGHT\r\n\r\n // Scrolls the virtual viewport so the row for `key` is visible. Declared\r\n // before `handleKeyDown` so it can be listed in the callback's deps array\r\n // (otherwise eslint-react-hooks/exhaustive-deps complains).\r\n const scrollToFocused = useCallback(\r\n (key: TreeKey) => {\r\n const index = flatNodes.findIndex((item) => item.key === key)\r\n if (index === -1) return\r\n const el = containerRef.current ?? treeRef.current\r\n if (!el) return\r\n const targetTop = index * itemHeight\r\n const { scrollTop: st, clientHeight: ch } = el\r\n if (targetTop < st) {\r\n el.scrollTop = targetTop\r\n } else if (targetTop + itemHeight > st + ch) {\r\n el.scrollTop = targetTop + itemHeight - ch\r\n }\r\n },\r\n [flatNodes, itemHeight],\r\n )\r\n\r\n // ═══════════════════════════════════════════\r\n // KEYBOARD NAVIGATION\r\n // ═══════════════════════════════════════════\r\n const handleKeyDown = useCallback(\r\n (e: React.KeyboardEvent) => {\r\n if (!keyboard || disabled || editingKey !== null) return\r\n\r\n const currentIndex = flatNodes.findIndex((item) => item.key === focusedKey)\r\n if (currentIndex === -1 && flatNodes.length === 0) return\r\n\r\n const focusNode = (index: number) => {\r\n if (index >= 0 && index < flatNodes.length) {\r\n setFocusedKey(flatNodes[index].key)\r\n scrollToFocused(flatNodes[index].key)\r\n }\r\n }\r\n\r\n switch (e.key) {\r\n case 'ArrowDown': {\r\n e.preventDefault()\r\n focusNode(currentIndex === -1 ? 0 : Math.min(currentIndex + 1, flatNodes.length - 1))\r\n break\r\n }\r\n case 'ArrowUp': {\r\n e.preventDefault()\r\n focusNode(currentIndex === -1 ? 0 : Math.max(currentIndex - 1, 0))\r\n break\r\n }\r\n case 'ArrowRight': {\r\n e.preventDefault()\r\n if (currentIndex === -1) break\r\n const item = flatNodes[currentIndex]\r\n if (!item.isLeaf && !treeState.expandedKeys.includes(item.key)) {\r\n handleExpand(item.key)\r\n } else if (!item.isLeaf && treeState.expandedKeys.includes(item.key)) {\r\n focusNode(currentIndex + 1)\r\n }\r\n break\r\n }\r\n case 'ArrowLeft': {\r\n e.preventDefault()\r\n if (currentIndex === -1) break\r\n const item = flatNodes[currentIndex]\r\n if (!item.isLeaf && treeState.expandedKeys.includes(item.key)) {\r\n handleExpand(item.key)\r\n } else if (item.parentKey !== null) {\r\n const parentIndex = flatNodes.findIndex((n) => n.key === item.parentKey)\r\n if (parentIndex !== -1) focusNode(parentIndex)\r\n }\r\n break\r\n }\r\n case 'Home': {\r\n e.preventDefault()\r\n focusNode(0)\r\n break\r\n }\r\n case 'End': {\r\n e.preventDefault()\r\n focusNode(flatNodes.length - 1)\r\n break\r\n }\r\n case 'Enter': {\r\n e.preventDefault()\r\n if (currentIndex === -1) break\r\n const item = flatNodes[currentIndex]\r\n if (selectable) handleSelect(item.key)\r\n break\r\n }\r\n case ' ': {\r\n e.preventDefault()\r\n if (currentIndex === -1) break\r\n const item = flatNodes[currentIndex]\r\n if (checkable) handleCheck(item.key)\r\n else if (!item.isLeaf) handleExpand(item.key)\r\n break\r\n }\r\n case '*': {\r\n e.preventDefault()\r\n expandAll()\r\n break\r\n }\r\n case 'F2': {\r\n e.preventDefault()\r\n if (currentIndex === -1) break\r\n const item = flatNodes[currentIndex]\r\n if (isNodeEditable(item.node)) {\r\n handleEditStart(item.key)\r\n }\r\n break\r\n }\r\n }\r\n },\r\n [\r\n keyboard,\r\n disabled,\r\n editingKey,\r\n flatNodes,\r\n focusedKey,\r\n treeState.expandedKeys,\r\n handleExpand,\r\n handleCheck,\r\n handleSelect,\r\n expandAll,\r\n setFocusedKey,\r\n checkable,\r\n selectable,\r\n scrollToFocused,\r\n isNodeEditable,\r\n handleEditStart,\r\n ],\r\n )\r\n\r\n // ═══════════════════════════════════════════\r\n // VIRTUAL SCROLL (handlers + memoized slices)\r\n // ═══════════════════════════════════════════\r\n const handleScroll = useCallback(() => {\r\n if (containerRef.current) {\r\n setScrollTop(containerRef.current.scrollTop)\r\n }\r\n }, [])\r\n\r\n const useVirtual = virtual && height !== undefined && flatNodes.length > 50\r\n\r\n // Larger overscan keeps rows mounted during fast scroll. `+ overscan*2` so\r\n // the visible window has padding both above and below the viewport.\r\n const VIRTUAL_OVERSCAN = 5\r\n\r\n const visibleSlice = useMemo(() => {\r\n if (!useVirtual || !height) {\r\n return { nodes: flatNodes, startIndex: 0 }\r\n }\r\n const rawStart = Math.floor(scrollTop / itemHeight)\r\n const startIndex = Math.max(0, rawStart - VIRTUAL_OVERSCAN)\r\n const visibleCount = Math.ceil(height / itemHeight) + VIRTUAL_OVERSCAN * 2\r\n const endIndex = Math.min(flatNodes.length, startIndex + visibleCount)\r\n return { nodes: flatNodes.slice(startIndex, endIndex), startIndex }\r\n }, [flatNodes, useVirtual, height, scrollTop, itemHeight])\r\n\r\n const visibleNodes = visibleSlice.nodes\r\n const virtualOffset = visibleSlice.startIndex * itemHeight\r\n\r\n const totalHeight = flatNodes.length * itemHeight\r\n const virtualBottomPad = Math.max(\r\n 0,\r\n totalHeight - virtualOffset - visibleNodes.length * itemHeight,\r\n )\r\n\r\n // scrollToKey prop\r\n useEffect(() => {\r\n if (scrollToKey !== undefined) {\r\n const index = flatNodes.findIndex((item) => item.key === scrollToKey)\r\n if (index !== -1) {\r\n scrollToFocused(scrollToKey)\r\n setFocusedKey(scrollToKey)\r\n }\r\n }\r\n }, [scrollToKey]) // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n // ═══════════════════════════════════════════\r\n // TOOLBAR HANDLERS\r\n // ═══════════════════════════════════════════\r\n const handleExpandAll = useCallback(() => {\r\n expandAll()\r\n if (onExpand) onExpand(tree.getState().expandedKeys, { expanded: true, node: treeData[0] })\r\n }, [expandAll, onExpand, tree, treeData])\r\n\r\n const handleCollapseAll = useCallback(() => {\r\n collapseAll()\r\n if (onExpand) onExpand([], { expanded: false, node: treeData[0] })\r\n }, [collapseAll, onExpand, treeData])\r\n\r\n const handleCheckAll = useCallback(() => {\r\n const allKeys = tree.getAllKeys()\r\n setCheckedKeys(allKeys)\r\n if (onCheck) {\r\n const allNodes = allKeys\r\n .map((k: TreeKey) => tree.getNode(k))\r\n .filter(Boolean) as TreeNodeData[]\r\n onCheck(allKeys, {\r\n checked: true,\r\n node: allNodes[0],\r\n checkedNodes: allNodes,\r\n halfCheckedKeys: [],\r\n })\r\n }\r\n }, [tree, setCheckedKeys, onCheck])\r\n\r\n const handleUncheckAll = useCallback(() => {\r\n setCheckedKeys([])\r\n if (onCheck) {\r\n onCheck([], { checked: false, node: treeData[0], checkedNodes: [], halfCheckedKeys: [] })\r\n }\r\n }, [setCheckedKeys, onCheck, treeData])\r\n\r\n // ═══════════════════════════════════════════\r\n // RENDER HELPERS\r\n // ═══════════════════════════════════════════\r\n const siblingsMap = useMemo(() => {\r\n if (!isShowLine) return null\r\n const map = new Map<TreeKey, { isLast: boolean; parentIsLast: boolean[] }>()\r\n function walk(list: TreeNodeData[], depth: number, parentIsLast: boolean[]) {\r\n for (let i = 0; i < list.length; i++) {\r\n const node = list[i]\r\n const key = node.key\r\n const isLast = i === list.length - 1\r\n map.set(key, { isLast, parentIsLast: [...parentIsLast] })\r\n const children = node.children\r\n if (children && children.length > 0) {\r\n walk(children, depth + 1, [...parentIsLast, isLast])\r\n }\r\n }\r\n }\r\n walk(treeData, 0, [])\r\n return map\r\n }, [treeData, isShowLine])\r\n\r\n const renderNode = (item: {\r\n node: TreeNodeData\r\n key: TreeKey\r\n depth: number\r\n isLeaf: boolean\r\n parentKey?: TreeKey | null\r\n }) => {\r\n const lineInfo = siblingsMap?.get(item.key)\r\n return (\r\n <TreeNodeRow\r\n key={item.key}\r\n node={item.node}\r\n nodeKey={item.key}\r\n depth={item.depth}\r\n isLeaf={item.isLeaf}\r\n indentSize={indentSize}\r\n expanded={treeState.expandedKeys.includes(item.key)}\r\n checked={treeState.checkedKeys.includes(item.key)}\r\n halfChecked={treeState.halfCheckedKeys.includes(item.key)}\r\n selected={treeState.selectedKeys.includes(item.key)}\r\n loading={treeState.loadingKeys.includes(item.key)}\r\n disabled={disabled || !!item.node.disabled}\r\n focused={focusedKey === item.key}\r\n checkable={checkable}\r\n selectable={selectable}\r\n showLine={isShowLine}\r\n showLeafIcon={showLineConfig.showLeafIcon ?? false}\r\n showIcon={showIcon || directory}\r\n blockNode={blockNode}\r\n directory={directory}\r\n animated={animated}\r\n globalIcon={globalIcon}\r\n nodeIcon={\r\n item.node.icon as\r\n | React.ReactNode\r\n | ((props: { expanded: boolean; selected: boolean }) => React.ReactNode)\r\n | undefined\r\n }\r\n switcherIcon={switcherIcon}\r\n draggable={isDraggable(item.node)}\r\n dropPosition={dropKey === item.key ? dropPosition : null}\r\n dragKey={dragKey}\r\n t={t}\r\n onExpand={handleExpand}\r\n onCheck={handleCheck}\r\n onSelect={handleSelect}\r\n onDragStart={handleDragStart}\r\n onDragOver={handleDragOver}\r\n onDragLeave={handleDragLeave}\r\n onDragEnd={handleDragEnd}\r\n onDrop={handleDrop}\r\n onRightClick={onRightClick ? handleRightClick : undefined}\r\n onLoadData={loadData ? handleLoadData : undefined}\r\n nodeClassName={item.node.className as string | undefined}\r\n nodeStyle={item.node.style as React.CSSProperties | undefined}\r\n // New features\r\n titleRender={titleRender}\r\n searchValue={highlightSearch ? searchValue : ''}\r\n editable={isNodeEditable(item.node)}\r\n editing={editingKey === item.key}\r\n onEditStart={handleEditStart}\r\n onEditConfirm={handleEditConfirm}\r\n onEditCancel={handleEditCancelInternal}\r\n actions={actions}\r\n status={nodeStatus?.(item.node) ?? 'default'}\r\n lineIsLast={lineInfo?.isLast ?? false}\r\n lineParentIsLast={lineInfo?.parentIsLast ?? []}\r\n onFocusNode={setFocusedKey}\r\n />\r\n )\r\n }\r\n\r\n // ═══════════════════════════════════════════\r\n // UNSTYLED RENDER\r\n // ═══════════════════════════════════════════\r\n if (unstyled) {\r\n return (\r\n <div\r\n ref={treeRef}\r\n className={className}\r\n style={style}\r\n role=\"tree\"\r\n tabIndex={0}\r\n onKeyDown={handleKeyDown}\r\n >\r\n {flatNodes.map((item) => renderNode(item))}\r\n </div>\r\n )\r\n }\r\n\r\n // ═══════════════════════════════════════════\r\n // STYLED RENDER\r\n // ═══════════════════════════════════════════\r\n const wrapperCls = [\r\n 'sg-tree',\r\n isShowLine ? 'sg-tree-show-line' : '',\r\n blockNode ? 'sg-tree-block-node' : '',\r\n directory ? 'sg-tree-directory' : '',\r\n disabled ? 'sg-tree-disabled' : '',\r\n animated ? 'sg-tree-animated' : '',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')\r\n\r\n const renderSearch = () => {\r\n if (!showSearch) return null\r\n return (\r\n <div className=\"sg-tree-search\">\r\n <input\r\n className=\"sg-tree-search-input\"\r\n type=\"text\"\r\n value={searchValue}\r\n onChange={(e) => handleSearchChange(e.target.value)}\r\n placeholder={t.searchPlaceholder}\r\n aria-label={t.searchPlaceholder}\r\n />\r\n {searchValue && (\r\n <button\r\n className=\"sg-tree-search-clear\"\r\n onClick={() => handleSearchChange('')}\r\n aria-label={t.clearSearch}\r\n type=\"button\"\r\n >\r\n ×\r\n </button>\r\n )}\r\n </div>\r\n )\r\n }\r\n\r\n const renderToolbar = () => {\r\n if (!showToolbar) return null\r\n return (\r\n <div className=\"sg-tree-toolbar\">\r\n <div className=\"sg-tree-toolbar-actions\">\r\n <button\r\n className=\"sg-tree-toolbar-btn\"\r\n onClick={handleExpandAll}\r\n title={t.expandAllText}\r\n type=\"button\"\r\n >\r\n ⊞\r\n </button>\r\n <button\r\n className=\"sg-tree-toolbar-btn\"\r\n onClick={handleCollapseAll}\r\n title={t.collapseAllText}\r\n type=\"button\"\r\n >\r\n ⊟\r\n </button>\r\n {checkable && (\r\n <>\r\n <span className=\"sg-tree-toolbar-divider\" />\r\n <button\r\n className=\"sg-tree-toolbar-btn\"\r\n onClick={handleCheckAll}\r\n title={t.checkAllText}\r\n type=\"button\"\r\n >\r\n ☑\r\n </button>\r\n <button\r\n className=\"sg-tree-toolbar-btn\"\r\n onClick={handleUncheckAll}\r\n title={t.uncheckAllText}\r\n type=\"button\"\r\n >\r\n ☐\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n {toolbarExtra && <div className=\"sg-tree-toolbar-extra\">{toolbarExtra}</div>}\r\n </div>\r\n )\r\n }\r\n\r\n const renderNodes = (list: typeof visibleNodes) => list.map((item) => renderNode(item))\r\n\r\n if (flatNodes.length === 0) {\r\n return (\r\n <div className={wrapperCls} style={style} role=\"tree\">\r\n {renderSearch()}\r\n {renderToolbar()}\r\n <div className=\"sg-tree-empty\">{t.emptyText}</div>\r\n </div>\r\n )\r\n }\r\n\r\n if (useVirtual && height) {\r\n return (\r\n <div className={wrapperCls} style={style}>\r\n {renderSearch()}\r\n {renderToolbar()}\r\n <div\r\n ref={containerRef}\r\n className=\"sg-tree-virtual-container\"\r\n style={{ height, overflow: 'auto' }}\r\n onScroll={handleScroll}\r\n onKeyDown={handleKeyDown}\r\n role=\"tree\"\r\n tabIndex={0}\r\n >\r\n <div\r\n style={{\r\n paddingTop: virtualOffset,\r\n paddingBottom: virtualBottomPad,\r\n boxSizing: 'border-box',\r\n }}\r\n >\r\n {renderNodes(visibleNodes)}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <div\r\n ref={treeRef}\r\n className={wrapperCls}\r\n style={style}\r\n role=\"tree\"\r\n tabIndex={0}\r\n onKeyDown={handleKeyDown}\r\n >\r\n {renderSearch()}\r\n {renderToolbar()}\r\n {renderNodes(visibleNodes)}\r\n </div>\r\n )\r\n}\r\n","import React, { useState, useRef, useEffect, useCallback } from 'react'\r\nimport { Checkbox } from '../../ui/Checkbox'\r\nimport { Spin } from '../../ui/Spin'\r\nimport type { TreeKey, TreeNodeData, TreeLocale, TreeNodeAction, TreeNodeStatus } from './types'\r\n\r\n/** Internal props for a single rendered tree node row. */\r\ninterface TreeNodeRowProps {\r\n /** Node data. */\r\n node: TreeNodeData\r\n /** Node key. */\r\n nodeKey: TreeKey\r\n /** Nesting depth for layout. */\r\n depth: number\r\n /** Whether this node is a leaf in the flattened list. */\r\n isLeaf: boolean\r\n /** Indentation step in pixels. */\r\n indentSize: number\r\n\r\n /** Expanded state. */\r\n expanded: boolean\r\n /** Checked state. */\r\n checked: boolean\r\n /** Indeterminate checkbox state. */\r\n halfChecked: boolean\r\n /** Selected state. */\r\n selected: boolean\r\n /** Async children loading flag. */\r\n loading: boolean\r\n /** Row interaction disabled. */\r\n disabled: boolean\r\n /** Whether this row has keyboard focus. */\r\n focused: boolean\r\n\r\n /** Checkbox column visible. */\r\n checkable: boolean\r\n /** Title click selects the node. */\r\n selectable: boolean\r\n /** Vertical guide lines enabled. */\r\n showLine: boolean\r\n /** Custom leaf connector when `showLine` is on. */\r\n showLeafIcon: boolean | React.ReactNode\r\n /** Leading custom or folder icon. */\r\n showIcon: boolean\r\n /** Full row hit target for selection. */\r\n blockNode: boolean\r\n /** Directory-style expand-on-select for folders. */\r\n directory: boolean\r\n /** Animate expand/collapse affordance. */\r\n animated: boolean\r\n\r\n /** Tree-level default icon. */\r\n globalIcon?: React.ReactNode | ((props: { expanded: boolean; selected: boolean }) => React.ReactNode)\r\n /** Per-node icon override. */\r\n nodeIcon?: React.ReactNode | ((props: { expanded: boolean; selected: boolean }) => React.ReactNode)\r\n /** Custom expander icon. */\r\n switcherIcon?: React.ReactNode | ((props: { expanded: boolean; loading: boolean; isLeaf: boolean }) => React.ReactNode)\r\n\r\n /** Row is draggable. */\r\n draggable: boolean\r\n /** Active drop indicator band on this row. */\r\n dropPosition: -1 | 0 | 1 | null\r\n /** Key of the row currently being dragged, if any. */\r\n dragKey: TreeKey | null\r\n\r\n /** Resolved locale strings. */\r\n t: Required<TreeLocale>\r\n\r\n /** Toggle expand. */\r\n onExpand: (key: TreeKey) => void\r\n /** Toggle check. */\r\n onCheck: (key: TreeKey) => void\r\n /** Toggle select. */\r\n onSelect: (key: TreeKey) => void\r\n /** Native drag start. */\r\n onDragStart: (e: React.DragEvent, key: TreeKey) => void\r\n /** Native drag over. */\r\n onDragOver: (e: React.DragEvent, key: TreeKey) => void\r\n /** Native drag leave. */\r\n onDragLeave: (e: React.DragEvent, key: TreeKey) => void\r\n /** Native drag end. */\r\n onDragEnd: (e: React.DragEvent, key: TreeKey) => void\r\n /** Native drop. */\r\n onDrop: (e: React.DragEvent, key: TreeKey) => void\r\n /** Context menu handler. */\r\n onRightClick?: (e: React.MouseEvent, node: TreeNodeData) => void\r\n /** Lazy-load children on expand. */\r\n onLoadData?: (node: TreeNodeData) => void\r\n /** Moves roving tabindex / focus highlight. */\r\n onFocusNode: (key: TreeKey | null) => void\r\n\r\n /** Custom title render replacing default text. */\r\n titleRender?: (node: TreeNodeData, info: { expanded: boolean; selected: boolean; checked: boolean; halfChecked: boolean }) => React.ReactNode\r\n /** Current filter string for search highlighting. */\r\n searchValue?: string\r\n\r\n /** Inline edit allowed for this row. */\r\n editable: boolean\r\n /** Row is currently in edit mode. */\r\n editing: boolean\r\n /** Enter edit mode. */\r\n onEditStart: (key: TreeKey) => void\r\n /** Commit edited title. */\r\n onEditConfirm: (key: TreeKey, value: string) => void\r\n /** Cancel edit mode. */\r\n onEditCancel: (key: TreeKey) => void\r\n\r\n /** Hover action buttons. */\r\n actions?: TreeNodeAction[]\r\n\r\n /** Semantic status styling for the row. */\r\n status: TreeNodeStatus\r\n\r\n /** Whether this node is the last child of its parent (line drawing). */\r\n lineIsLast: boolean\r\n /** Ancestor “last child” flags for line drawing. */\r\n lineParentIsLast: boolean[]\r\n\r\n /** Unstyled row. */\r\n unstyled?: boolean\r\n /** Extra class from node. */\r\n nodeClassName?: string\r\n /** Inline style from node. */\r\n nodeStyle?: React.CSSProperties\r\n}\r\n\r\n/** Renders one tree row: lines, switcher, checkbox, icon, title, edit field, and actions. */\r\nexport function TreeNodeRow(props: TreeNodeRowProps) {\r\n const {\r\n node, nodeKey, depth, isLeaf, indentSize,\r\n expanded, checked, halfChecked, selected, loading, disabled, focused,\r\n checkable, selectable, showLine, showLeafIcon, showIcon, blockNode, directory,\r\n globalIcon, nodeIcon, switcherIcon,\r\n draggable, dropPosition, dragKey,\r\n onExpand, onCheck, onSelect,\r\n onDragStart, onDragOver, onDragLeave, onDragEnd, onDrop,\r\n onRightClick, onLoadData, onFocusNode,\r\n titleRender, searchValue,\r\n editable, editing, onEditStart, onEditConfirm, onEditCancel,\r\n actions,\r\n status,\r\n lineIsLast, lineParentIsLast,\r\n unstyled, nodeClassName, nodeStyle,\r\n } = props\r\n\r\n const rowRef = useRef<HTMLDivElement>(null)\r\n const editInputRef = useRef<HTMLInputElement>(null)\r\n const [editValue, setEditValue] = useState('')\r\n\r\n useEffect(() => {\r\n if (editing) {\r\n setEditValue(String(node.title ?? ''))\r\n setTimeout(() => editInputRef.current?.focus(), 0)\r\n }\r\n }, [editing, node.title])\r\n\r\n useEffect(() => {\r\n if (focused && rowRef.current) {\r\n rowRef.current.scrollIntoView?.({ block: 'nearest' })\r\n }\r\n }, [focused])\r\n\r\n const handleSwitcherClick = (e: React.MouseEvent) => {\r\n e.stopPropagation()\r\n if (isLeaf) return\r\n if (!expanded && loading) return\r\n onExpand(nodeKey)\r\n if (!expanded && !isLeaf && onLoadData) {\r\n onLoadData(node)\r\n }\r\n }\r\n\r\n const handleCheckChange = () => {\r\n if (disabled || node.disableCheckbox) return\r\n onCheck(nodeKey)\r\n }\r\n\r\n const handleSelect = () => {\r\n if (disabled || (node.selectable === false)) return\r\n if (!selectable) return\r\n onSelect(nodeKey)\r\n if (directory && !isLeaf) {\r\n onExpand(nodeKey)\r\n }\r\n }\r\n\r\n const handleClick = () => {\r\n onFocusNode(nodeKey)\r\n handleSelect()\r\n }\r\n\r\n const handleDoubleClick = () => {\r\n if (editable && !editing) {\r\n onEditStart(nodeKey)\r\n }\r\n }\r\n\r\n const handleContextMenu = (e: React.MouseEvent) => {\r\n if (onRightClick) {\r\n e.preventDefault()\r\n onRightClick(e, node)\r\n }\r\n }\r\n\r\n const handleEditKeyDown = useCallback((e: React.KeyboardEvent) => {\r\n e.stopPropagation()\r\n if (e.key === 'Enter') {\r\n onEditConfirm(nodeKey, editValue)\r\n } else if (e.key === 'Escape') {\r\n onEditCancel(nodeKey)\r\n }\r\n }, [nodeKey, editValue, onEditConfirm, onEditCancel])\r\n\r\n const handleEditBlur = useCallback(() => {\r\n onEditConfirm(nodeKey, editValue)\r\n }, [nodeKey, editValue, onEditConfirm])\r\n\r\n // Highlighted title with search match\r\n const renderHighlightedTitle = (title: string) => {\r\n if (!searchValue) return title\r\n const index = title.toLowerCase().indexOf(searchValue.toLowerCase())\r\n if (index === -1) return title\r\n const before = title.slice(0, index)\r\n const match = title.slice(index, index + searchValue.length)\r\n const after = title.slice(index + searchValue.length)\r\n return (\r\n <>\r\n {before}\r\n <span className=\"sg-tree-highlight\">{match}</span>\r\n {after}\r\n </>\r\n )\r\n }\r\n\r\n // Switcher icon\r\n const renderSwitcher = () => {\r\n if (isLeaf) {\r\n if (showLine) {\r\n if (showLeafIcon === false) return <span className=\"sg-tree-switcher sg-tree-switcher-noop\" />\r\n if (showLeafIcon && typeof showLeafIcon !== 'boolean') {\r\n return <span className=\"sg-tree-switcher sg-tree-switcher-leaf-icon\">{showLeafIcon}</span>\r\n }\r\n return <span className=\"sg-tree-switcher sg-tree-switcher-leaf\">─</span>\r\n }\r\n return <span className=\"sg-tree-switcher sg-tree-switcher-noop\" />\r\n }\r\n\r\n if (loading) {\r\n return <span className=\"sg-tree-switcher sg-tree-switcher-loading\"><Spin size=\"small\" /></span>\r\n }\r\n\r\n let iconContent: React.ReactNode\r\n if (switcherIcon) {\r\n iconContent = typeof switcherIcon === 'function'\r\n ? switcherIcon({ expanded, loading, isLeaf })\r\n : switcherIcon\r\n } else {\r\n iconContent = (\r\n <svg\r\n className={`sg-tree-switcher-arrow${expanded ? ' sg-tree-switcher-arrow-open' : ''}`}\r\n width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\"\r\n >\r\n <path d=\"M3 2L7 5L3 8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\r\n </svg>\r\n )\r\n }\r\n\r\n return (\r\n <span\r\n className={`sg-tree-switcher${expanded ? ' sg-tree-switcher-open' : ' sg-tree-switcher-close'}`}\r\n onClick={handleSwitcherClick}\r\n >\r\n {iconContent}\r\n </span>\r\n )\r\n }\r\n\r\n // Node icon\r\n const renderIcon = () => {\r\n if (!showIcon && !directory) return null\r\n const iconSource = nodeIcon ?? globalIcon\r\n let iconContent: React.ReactNode = null\r\n\r\n if (iconSource) {\r\n iconContent = typeof iconSource === 'function'\r\n ? iconSource({ expanded, selected })\r\n : iconSource\r\n } else if (directory) {\r\n iconContent = expanded ? '📂' : '📁'\r\n }\r\n\r\n if (!iconContent) return null\r\n return <span className=\"sg-tree-icon\">{iconContent}</span>\r\n }\r\n\r\n // Title content\r\n const renderTitle = () => {\r\n if (editing) {\r\n return (\r\n <input\r\n ref={editInputRef}\r\n className=\"sg-tree-edit-input\"\r\n value={editValue}\r\n onChange={(e) => setEditValue(e.target.value)}\r\n onKeyDown={handleEditKeyDown}\r\n onBlur={handleEditBlur}\r\n onClick={(e) => e.stopPropagation()}\r\n />\r\n )\r\n }\r\n\r\n if (titleRender) {\r\n return titleRender(node, { expanded, selected, checked, halfChecked })\r\n }\r\n\r\n const titleText = String(node.title ?? nodeKey)\r\n return renderHighlightedTitle(titleText)\r\n }\r\n\r\n // Action buttons\r\n const renderActions = () => {\r\n if (!actions || actions.length === 0) return null\r\n const visibleActions = actions.filter((a) => !a.visible || a.visible(node))\r\n if (visibleActions.length === 0) return null\r\n\r\n return (\r\n <span className=\"sg-tree-actions\" onClick={(e) => e.stopPropagation()}>\r\n {visibleActions.map((action) => {\r\n const isDisabled = action.disabled?.(node) ?? false\r\n return (\r\n <button\r\n key={action.key}\r\n className={`sg-tree-action-btn${action.danger ? ' sg-tree-action-danger' : ''}${isDisabled ? ' sg-tree-action-disabled' : ''}`}\r\n title={action.title}\r\n onClick={(e) => {\r\n e.stopPropagation()\r\n if (!isDisabled) action.onClick(node, nodeKey)\r\n }}\r\n disabled={isDisabled}\r\n type=\"button\"\r\n >\r\n {action.icon ?? action.title ?? action.key}\r\n </button>\r\n )\r\n })}\r\n </span>\r\n )\r\n }\r\n\r\n // Connecting lines\r\n const renderIndentLines = () => {\r\n if (!showLine) return null\r\n const lines: React.ReactNode[] = []\r\n for (let i = 0; i < depth; i++) {\r\n const isParentLast = lineParentIsLast[i] ?? false\r\n lines.push(\r\n <span\r\n key={i}\r\n className={`sg-tree-indent-line${isParentLast ? ' sg-tree-indent-line-hidden' : ''}`}\r\n style={{ left: i * indentSize + indentSize / 2 }}\r\n />\r\n )\r\n }\r\n if (depth > 0) {\r\n lines.push(\r\n <span\r\n key=\"branch\"\r\n className={`sg-tree-indent-branch${lineIsLast ? ' sg-tree-indent-branch-last' : ''}`}\r\n style={{ left: (depth - 1) * indentSize + indentSize / 2 }}\r\n />\r\n )\r\n }\r\n return <>{lines}</>\r\n }\r\n\r\n // Status dot\r\n const renderStatus = () => {\r\n if (status === 'default') return null\r\n return <span className={`sg-tree-status sg-tree-status-${status}`} />\r\n }\r\n\r\n if (unstyled) {\r\n return (\r\n <div\r\n ref={rowRef}\r\n role=\"treeitem\"\r\n aria-expanded={isLeaf ? undefined : expanded}\r\n aria-selected={selected}\r\n aria-checked={checkable ? checked : undefined}\r\n aria-level={depth + 1}\r\n data-key={nodeKey}\r\n >\r\n {checkable && (\r\n <Checkbox\r\n checked={checked}\r\n indeterminate={halfChecked}\r\n disabled={disabled || node.disableCheckbox}\r\n onChange={handleCheckChange}\r\n unstyled\r\n />\r\n )}\r\n <span onClick={handleClick}>{renderTitle()}</span>\r\n </div>\r\n )\r\n }\r\n\r\n const isDragging = dragKey === nodeKey\r\n\r\n const rowCls = [\r\n 'sg-tree-node',\r\n selected ? 'sg-tree-node-selected' : '',\r\n disabled ? 'sg-tree-node-disabled' : '',\r\n isLeaf ? 'sg-tree-node-leaf' : '',\r\n expanded ? 'sg-tree-node-expanded' : '',\r\n draggable ? 'sg-tree-node-draggable' : '',\r\n isDragging ? 'sg-tree-node-dragging' : '',\r\n dropPosition === 0 ? 'sg-tree-node-drop-inner' : '',\r\n dropPosition === -1 ? 'sg-tree-node-drop-before' : '',\r\n dropPosition === 1 ? 'sg-tree-node-drop-after' : '',\r\n showLine ? 'sg-tree-node-show-line' : '',\r\n blockNode ? 'sg-tree-node-block' : '',\r\n directory ? 'sg-tree-node-directory' : '',\r\n focused ? 'sg-tree-node-focused' : '',\r\n editing ? 'sg-tree-node-editing' : '',\r\n status !== 'default' ? `sg-tree-node-status-${status}` : '',\r\n nodeClassName,\r\n ].filter(Boolean).join(' ')\r\n\r\n return (\r\n <div\r\n ref={rowRef}\r\n className={rowCls}\r\n style={{ ...nodeStyle, paddingLeft: depth * indentSize }}\r\n role=\"treeitem\"\r\n aria-expanded={isLeaf ? undefined : expanded}\r\n aria-selected={selected}\r\n aria-checked={checkable ? checked : undefined}\r\n aria-level={depth + 1}\r\n data-key={nodeKey}\r\n draggable={draggable && !editing}\r\n onDragStart={draggable ? (e) => onDragStart(e, nodeKey) : undefined}\r\n onDragOver={draggable ? (e) => { e.preventDefault(); onDragOver(e, nodeKey) } : undefined}\r\n onDragLeave={draggable ? (e) => onDragLeave(e, nodeKey) : undefined}\r\n onDragEnd={draggable ? (e) => onDragEnd(e, nodeKey) : undefined}\r\n onDrop={draggable ? (e) => { e.preventDefault(); onDrop(e, nodeKey) } : undefined}\r\n onContextMenu={handleContextMenu}\r\n onClick={handleClick}\r\n onDoubleClick={editable ? handleDoubleClick : undefined}\r\n >\r\n {renderIndentLines()}\r\n {renderSwitcher()}\r\n\r\n {checkable && node.checkable !== false && (\r\n <Checkbox\r\n checked={checked}\r\n indeterminate={halfChecked}\r\n disabled={disabled || node.disableCheckbox}\r\n onChange={handleCheckChange}\r\n />\r\n )}\r\n\r\n {renderIcon()}\r\n {renderStatus()}\r\n\r\n <span\r\n className={`sg-tree-title${selectable && !editing ? ' sg-tree-title-selectable' : ''}`}\r\n >\r\n {renderTitle()}\r\n </span>\r\n\r\n {renderActions()}\r\n </div>\r\n )\r\n}\r\n","import type React from 'react'\r\nimport type { TreeKey, TreeNodeData, TreeFieldNames } from '@skygraph/core'\r\n\r\n/** Re-exports core tree data types. */\r\nexport type { TreeKey, TreeNodeData, TreeFieldNames }\r\n\r\n/** Payload for `onCheck` describing the toggle and affected nodes. */\r\nexport interface CheckInfo {\r\n /** Whether the toggled node ended checked. */\r\n checked: boolean\r\n /** Node whose checkbox was toggled. */\r\n node: TreeNodeData\r\n /** All fully checked nodes after the update. */\r\n checkedNodes: TreeNodeData[]\r\n /** Keys in indeterminate half-checked state. */\r\n halfCheckedKeys: TreeKey[]\r\n}\r\n\r\n/** Payload for `onSelect` after a selection change. */\r\nexport interface SelectInfo {\r\n /** Whether the node ended selected. */\r\n selected: boolean\r\n /** Node that was clicked for selection. */\r\n node: TreeNodeData\r\n /** All selected nodes after the update. */\r\n selectedNodes: TreeNodeData[]\r\n}\r\n\r\n/** Payload for `onExpand` after an expand/collapse. */\r\nexport interface ExpandInfo {\r\n /** Whether the node ended expanded. */\r\n expanded: boolean\r\n /** Node whose expander was toggled. */\r\n node: TreeNodeData\r\n}\r\n\r\n/** Drag lifecycle event payload with DOM event and node. */\r\nexport interface DragInfo {\r\n /** Browser drag event. */\r\n event: React.DragEvent\r\n /** Associated tree node. */\r\n node: TreeNodeData\r\n}\r\n\r\n/** Drop completion payload including dragged node and position. */\r\nexport interface DropInfo {\r\n /** Browser drop event. */\r\n event: React.DragEvent\r\n /** Drop target node. */\r\n node: TreeNodeData\r\n /** Node that was dragged. */\r\n dragNode: TreeNodeData\r\n /** Insert position relative to the target. */\r\n dropPosition: -1 | 0 | 1\r\n}\r\n\r\n/** Payload when an inline edit is committed (if editing is used). */\r\nexport interface EditInfo {\r\n /** Edited node key. */\r\n key: TreeKey\r\n /** Edited node. */\r\n node: TreeNodeData\r\n /** New title text. */\r\n value: string\r\n /** Previous title text. */\r\n oldValue: string\r\n}\r\n\r\n/** Visual status hint for a node row. */\r\nexport type TreeNodeStatus = 'default' | 'success' | 'warning' | 'error' | 'info'\r\n\r\n/** Declarative action button on a tree node row. */\r\nexport interface TreeNodeAction {\r\n /** Action identifier. */\r\n key: string\r\n /** Button icon. */\r\n icon?: React.ReactNode\r\n /** Tooltip or aria label text. */\r\n title?: string\r\n /** Click handler receiving node and key. */\r\n onClick: (node: TreeNodeData, key: TreeKey) => void\r\n /** Hides the action for nodes where this returns false. */\r\n visible?: (node: TreeNodeData) => boolean\r\n /** Disables the action per node. */\r\n disabled?: (node: TreeNodeData) => boolean\r\n /** Destructive styling. */\r\n danger?: boolean\r\n}\r\n\r\n/** Localizable strings for built-in tree UI. */\r\nexport interface TreeLocale {\r\n /** Empty tree placeholder. */\r\n emptyText?: React.ReactNode\r\n /** Async loading label. */\r\n loadingText?: string\r\n /** Search field placeholder. */\r\n searchPlaceholder?: string\r\n /** Toolbar control to expand all nodes. */\r\n expandAllText?: string\r\n /** Toolbar control to collapse all nodes. */\r\n collapseAllText?: string\r\n /** Toolbar control to check all checkboxes. */\r\n checkAllText?: string\r\n /** Toolbar control to clear all checks. */\r\n uncheckAllText?: string\r\n /** Accessible label for the clear-search (×) button. */\r\n clearSearch?: string\r\n}\r\n\r\n/** Default English strings for `Tree`. */\r\nexport const DEFAULT_TREE_LOCALE: Required<TreeLocale> = {\r\n emptyText: 'No data',\r\n loadingText: 'Loading...',\r\n searchPlaceholder: 'Search...',\r\n expandAllText: 'Expand All',\r\n collapseAllText: 'Collapse All',\r\n checkAllText: 'Check All',\r\n uncheckAllText: 'Uncheck All',\r\n clearSearch: 'Clear search',\r\n}\r\n\r\n/** Default indent between tree levels in pixels. */\r\nexport const DEFAULT_INDENT = 24\r\n/** Default node row height used for virtual scroll estimates. */\r\nexport const NODE_HEIGHT = 28\r\n\r\n/** Props for the `Tree` component. */\r\nexport interface TreeProps {\r\n /** Hierarchical data with keys and optional children. */\r\n treeData: TreeNodeData[]\r\n /** Renames `title`, `key`, `children`, and other field accessors. */\r\n fieldNames?: TreeFieldNames\r\n\r\n /** Shows checkboxes on nodes. @default false */\r\n checkable?: boolean\r\n /** When true, parent and child checks are independent. @default false */\r\n checkStrictly?: boolean\r\n /** Controlled checked keys. */\r\n checkedKeys?: TreeKey[]\r\n /** Initial checked keys in uncontrolled mode. */\r\n defaultCheckedKeys?: TreeKey[]\r\n /** Fires after check state changes. */\r\n onCheck?: (checkedKeys: TreeKey[], info: CheckInfo) => void\r\n\r\n /** Allows clicking titles to select nodes. @default true */\r\n selectable?: boolean\r\n /** Allows multiple selected nodes. @default false */\r\n multiple?: boolean\r\n /** Controlled selected keys. */\r\n selectedKeys?: TreeKey[]\r\n /** Initial selected keys in uncontrolled mode. */\r\n defaultSelectedKeys?: TreeKey[]\r\n /** Fires after selection changes. */\r\n onSelect?: (selectedKeys: TreeKey[], info: SelectInfo) => void\r\n\r\n /** Controlled expanded keys. */\r\n expandedKeys?: TreeKey[]\r\n /** Initial expanded keys in uncontrolled mode. */\r\n defaultExpandedKeys?: TreeKey[]\r\n /** Expands every parent on first render when uncontrolled. @default false */\r\n defaultExpandAll?: boolean\r\n /** Expands ancestors of the focused or matched node when filtering. @default false */\r\n autoExpandParent?: boolean\r\n /** Fires after expand/collapse. */\r\n onExpand?: (expandedKeys: TreeKey[], info: ExpandInfo) => void\r\n\r\n /** Enables drag handles per node or per node predicate. @default false */\r\n draggable?: boolean | ((node: TreeNodeData) => boolean)\r\n /** Validates whether a drop is allowed. */\r\n allowDrop?: (info: {\r\n dragNode: TreeNodeData\r\n dropNode: TreeNodeData\r\n dropPosition: -1 | 0 | 1\r\n }) => boolean\r\n /** Drag start callback. */\r\n onDragStart?: (info: DragInfo) => void\r\n /** Drag enter callback. */\r\n onDragEnter?: (info: DragInfo) => void\r\n /** Drag over callback. */\r\n onDragOver?: (info: DragInfo) => void\r\n /** Drag leave callback. */\r\n onDragLeave?: (info: DragInfo) => void\r\n /** Drag end callback. */\r\n onDragEnd?: (info: DragInfo) => void\r\n /** Drop callback after a successful internal move. */\r\n onDrop?: (info: DropInfo) => void\r\n\r\n /** Loads children asynchronously; return promise resolves when data is ready. */\r\n loadData?: (node: TreeNodeData) => Promise<void>\r\n /** Keys whose children have finished loading. */\r\n loadedKeys?: TreeKey[]\r\n\r\n /** Renders guide lines between levels or configures leaf icons. @default false */\r\n showLine?: boolean | { showLeafIcon?: boolean | React.ReactNode }\r\n /** Shows a leading icon column. @default false */\r\n showIcon?: boolean\r\n /** Default node icon render or element. */\r\n icon?: React.ReactNode | ((props: { expanded: boolean; selected: boolean }) => React.ReactNode)\r\n /** Custom expand/collapse control. */\r\n switcherIcon?:\r\n | React.ReactNode\r\n | ((props: { expanded: boolean; loading: boolean; isLeaf: boolean }) => React.ReactNode)\r\n /** Makes the whole row clickable for selection. @default false */\r\n blockNode?: boolean\r\n /** Fixed viewport height enabling internal virtual scroll. */\r\n height?: number\r\n /** Uses windowed rendering when `height` is set and the list is large. @default true */\r\n virtual?: boolean\r\n /** Disables all interactions. @default false */\r\n disabled?: boolean\r\n /** Horizontal indent per depth level in pixels. @default 24 */\r\n indentSize?: number\r\n\r\n /** Directory-style selection expands folders on click. @default false */\r\n directory?: boolean\r\n\r\n /** Context menu handler on node rows. */\r\n onRightClick?: (info: { event: React.MouseEvent; node: TreeNodeData }) => void\r\n\r\n /** Shows the toolbar search field. @default false */\r\n showSearch?: boolean\r\n /** Controlled filter text. */\r\n searchValue?: string\r\n /** Initial filter text when uncontrolled. @default '' */\r\n defaultSearchValue?: string\r\n /** Emits filter text changes. */\r\n onSearch?: (value: string) => void\r\n /** Predicate to include nodes while searching. */\r\n filterTreeNode?: (node: TreeNodeData, searchValue: string) => boolean\r\n /** Highlights matched text in titles. @default true */\r\n highlightSearch?: boolean\r\n\r\n /** Enables built-in keyboard navigation helpers. @default true */\r\n keyboard?: boolean\r\n\r\n /** Enables inline editing of titles per node or predicate. @default false */\r\n editable?: boolean | ((node: TreeNodeData) => boolean)\r\n /** Commit handler for inline edits. */\r\n onEdit?: (info: EditInfo) => void\r\n /** Cancel handler for inline edits. */\r\n onEditCancel?: (key: TreeKey) => void\r\n\r\n /** Custom title area render. */\r\n titleRender?: (\r\n node: TreeNodeData,\r\n info: { expanded: boolean; selected: boolean; checked: boolean; halfChecked: boolean },\r\n ) => React.ReactNode\r\n\r\n /** Inline action buttons on node rows. */\r\n actions?: TreeNodeAction[]\r\n\r\n /** Shows toolbar with expand/collapse/check-all controls. @default false */\r\n showToolbar?: boolean\r\n /** Extra toolbar nodes after built-ins. */\r\n toolbarExtra?: React.ReactNode\r\n\r\n /** Enables expand/collapse animations. @default true */\r\n animated?: boolean\r\n\r\n /** Focuses a node on mount when supported. @default false */\r\n autoFocus?: boolean\r\n /** Controlled focused node key. */\r\n focusedKey?: TreeKey\r\n /** Fires when focus moves to a node. */\r\n onFocus?: (key: TreeKey) => void\r\n\r\n /** Scrolls the given key into view when it changes. */\r\n scrollToKey?: TreeKey\r\n\r\n /** Maps a node to a status color variant. */\r\n nodeStatus?: (node: TreeNodeData) => TreeNodeStatus\r\n\r\n /** Overrides default locale strings. */\r\n locale?: TreeLocale\r\n\r\n /** Root wrapper class name. */\r\n className?: string\r\n /** Root wrapper style. */\r\n style?: React.CSSProperties\r\n /** Renders semantic tree without Skygraph styles. */\r\n unstyled?: boolean\r\n}\r\n","import React, { useState, useEffect, useRef, useCallback, useMemo } from 'react'\r\nimport { Tree } from '../Tree'\r\nimport { useConfig } from '../../ConfigProvider'\r\nimport type { TreeSelectProps, TreeKey, TreeNodeData } from './types'\r\n\r\nfunction toArray(val: TreeKey | TreeKey[] | undefined): TreeKey[] {\r\n if (val === undefined) return []\r\n return Array.isArray(val) ? val : [val]\r\n}\r\n\r\nfunction collectAllKeys(nodes: TreeNodeData[]): TreeKey[] {\r\n const keys: TreeKey[] = []\r\n const walk = (list: TreeNodeData[]) => {\r\n for (const n of list) {\r\n keys.push(n.key)\r\n if (n.children) walk(n.children)\r\n }\r\n }\r\n walk(nodes)\r\n return keys\r\n}\r\n\r\nfunction findNode(nodes: TreeNodeData[], key: TreeKey): TreeNodeData | undefined {\r\n for (const n of nodes) {\r\n if (n.key === key) return n\r\n if (n.children) {\r\n const found = findNode(n.children, key)\r\n if (found) return found\r\n }\r\n }\r\n return undefined\r\n}\r\n\r\nfunction getNodeLabel(node: TreeNodeData | undefined): React.ReactNode {\r\n if (!node) return ''\r\n return node.title ?? String(node.key)\r\n}\r\n\r\nfunction filterTreeKeepMatches(\r\n nodes: TreeNodeData[],\r\n predicate: (node: TreeNodeData) => boolean,\r\n): TreeNodeData[] {\r\n const result: TreeNodeData[] = []\r\n for (const node of nodes) {\r\n const childResult = node.children ? filterTreeKeepMatches(node.children, predicate) : []\r\n if (predicate(node) || childResult.length > 0) {\r\n result.push({\r\n ...node,\r\n children: childResult.length > 0 ? childResult : undefined,\r\n })\r\n }\r\n }\r\n return result\r\n}\r\n\r\nfunction getParentKeys(nodes: TreeNodeData[], targetKey: TreeKey): TreeKey[] {\r\n const parents: TreeKey[] = []\r\n const walk = (list: TreeNodeData[], path: TreeKey[]): boolean => {\r\n for (const n of list) {\r\n if (n.key === targetKey) {\r\n parents.push(...path)\r\n return true\r\n }\r\n if (n.children && walk(n.children, [...path, n.key])) return true\r\n }\r\n return false\r\n }\r\n walk(nodes, [])\r\n return parents\r\n}\r\n\r\nfunction applyStrategy(\r\n checkedKeys: TreeKey[],\r\n treeData: TreeNodeData[],\r\n strategy: 'SHOW_ALL' | 'SHOW_PARENT' | 'SHOW_CHILD',\r\n): TreeKey[] {\r\n if (strategy === 'SHOW_ALL') return checkedKeys\r\n\r\n const checkedSet = new Set(checkedKeys)\r\n\r\n if (strategy === 'SHOW_CHILD') {\r\n return checkedKeys.filter((key) => {\r\n const node = findNode(treeData, key)\r\n return !node?.children || node.children.length === 0\r\n })\r\n }\r\n\r\n if (strategy === 'SHOW_PARENT') {\r\n return checkedKeys.filter((key) => {\r\n const parentKeys = getParentKeys(treeData, key)\r\n return !parentKeys.some((pk) => checkedSet.has(pk))\r\n })\r\n }\r\n\r\n return checkedKeys\r\n}\r\n\r\n/**\r\n * Dropdown that embeds `Tree` for single or multiple selection, optional checkboxes, and search.\r\n * Manages open state, filtering, and tag display for multi-value modes.\r\n */\r\nexport function TreeSelect(props: TreeSelectProps) {\r\n const {\r\n treeData,\r\n value: controlledValue,\r\n defaultValue,\r\n onChange,\r\n fieldNames,\r\n multiple = false,\r\n treeCheckable = false,\r\n treeCheckStrictly = false,\r\n treeDefaultExpandAll = false,\r\n treeDefaultExpandedKeys,\r\n showSearch = false,\r\n filterTreeNode,\r\n placeholder = 'Please select',\r\n allowClear = false,\r\n disabled = false,\r\n size = 'middle',\r\n maxTagCount,\r\n dropdownStyle,\r\n treeLine = false,\r\n showCheckedStrategy = 'SHOW_ALL',\r\n onSearch,\r\n className,\r\n style,\r\n unstyled,\r\n } = props\r\n\r\n const treeSelectLocale = useConfig().locale?.treeSelect\r\n const searchPlaceholder = treeSelectLocale?.searchPlaceholder ?? 'Search...'\r\n const noMatchesText = treeSelectLocale?.noMatches ?? 'No matches'\r\n\r\n const isMultiple = multiple || treeCheckable\r\n\r\n const [internalValue, setInternalValue] = useState<TreeKey[]>(() =>\r\n toArray(controlledValue ?? defaultValue),\r\n )\r\n const [open, setOpen] = useState(false)\r\n const [searchValue, setSearchValue] = useState('')\r\n const wrapperRef = useRef<HTMLDivElement>(null)\r\n const searchRef = useRef<HTMLInputElement>(null)\r\n\r\n const currentValue = useMemo(\r\n () => toArray(controlledValue ?? internalValue),\r\n [controlledValue, internalValue],\r\n )\r\n\r\n useEffect(() => {\r\n if (controlledValue !== undefined) {\r\n setInternalValue(toArray(controlledValue))\r\n }\r\n }, [controlledValue])\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (e: MouseEvent) => {\r\n if (wrapperRef.current && !wrapperRef.current.contains(e.target as Node)) {\r\n setOpen(false)\r\n setSearchValue('')\r\n }\r\n }\r\n document.addEventListener('mousedown', handleClickOutside)\r\n return () => document.removeEventListener('mousedown', handleClickOutside)\r\n }, [])\r\n\r\n useEffect(() => {\r\n if (open && showSearch && searchRef.current) {\r\n searchRef.current.focus()\r\n }\r\n }, [open, showSearch])\r\n\r\n const defaultFilter = useCallback((input: string, node: TreeNodeData): boolean => {\r\n const title = String(node.title ?? node.key).toLowerCase()\r\n return title.includes(input.toLowerCase())\r\n }, [])\r\n\r\n const filterFn = filterTreeNode ?? defaultFilter\r\n\r\n const filteredTreeData = useMemo(() => {\r\n if (!searchValue) return treeData\r\n return filterTreeKeepMatches(treeData, (node) => filterFn(searchValue, node))\r\n }, [treeData, searchValue, filterFn])\r\n\r\n const filteredExpandedKeys = useMemo(() => {\r\n if (!searchValue) return undefined\r\n return collectAllKeys(filteredTreeData)\r\n }, [searchValue, filteredTreeData])\r\n\r\n const fireChange = useCallback(\r\n (keys: TreeKey[], triggerNode: TreeNodeData) => {\r\n setInternalValue(keys)\r\n const labels = keys.map((k) => getNodeLabel(findNode(treeData, k)))\r\n if (onChange) {\r\n const result = isMultiple ? keys : keys[0]\r\n onChange(result as TreeKey & TreeKey[], labels, { triggerNode })\r\n }\r\n },\r\n [treeData, onChange, isMultiple],\r\n )\r\n\r\n const handleTreeSelect = useCallback(\r\n (\r\n _selectedKeys: TreeKey[],\r\n info: { selected: boolean; node: TreeNodeData; selectedNodes: TreeNodeData[] },\r\n ) => {\r\n if (treeCheckable) return\r\n const node = info.node\r\n if (isMultiple) {\r\n const newKeys = info.selected\r\n ? [...currentValue, node.key]\r\n : currentValue.filter((k) => k !== node.key)\r\n fireChange(newKeys, node)\r\n } else {\r\n fireChange([node.key], node)\r\n setOpen(false)\r\n setSearchValue('')\r\n }\r\n },\r\n [treeCheckable, isMultiple, currentValue, fireChange],\r\n )\r\n\r\n const handleTreeCheck = useCallback(\r\n (\r\n checkedKeys: TreeKey[],\r\n info: {\r\n checked: boolean\r\n node: TreeNodeData\r\n checkedNodes: TreeNodeData[]\r\n halfCheckedKeys: TreeKey[]\r\n },\r\n ) => {\r\n const displayed = applyStrategy(checkedKeys, treeData, showCheckedStrategy)\r\n fireChange(displayed, info.node)\r\n },\r\n [treeData, showCheckedStrategy, fireChange],\r\n )\r\n\r\n const handleRemoveTag = useCallback(\r\n (key: TreeKey, e: React.MouseEvent) => {\r\n e.stopPropagation()\r\n if (disabled) return\r\n const node = findNode(treeData, key) ?? ({ key } as TreeNodeData)\r\n const newKeys = currentValue.filter((k) => k !== key)\r\n fireChange(newKeys, node)\r\n },\r\n [disabled, treeData, currentValue, fireChange],\r\n )\r\n\r\n const handleClear = useCallback(\r\n (e: React.MouseEvent) => {\r\n e.stopPropagation()\r\n if (disabled) return\r\n const node = treeData[0] ?? ({ key: '' } as TreeNodeData)\r\n fireChange([], node)\r\n setSearchValue('')\r\n },\r\n [disabled, treeData, fireChange],\r\n )\r\n\r\n const handleSearchChange = useCallback(\r\n (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const val = e.target.value\r\n setSearchValue(val)\r\n onSearch?.(val)\r\n },\r\n [onSearch],\r\n )\r\n\r\n const handleTriggerClick = useCallback(() => {\r\n if (disabled) return\r\n setOpen((prev) => !prev)\r\n }, [disabled])\r\n\r\n const displayedValues = useMemo(() => {\r\n if (!isMultiple) return currentValue\r\n return applyStrategy(currentValue, treeData, showCheckedStrategy)\r\n }, [isMultiple, currentValue, treeData, showCheckedStrategy])\r\n\r\n const treeCheckedKeys = useMemo(() => {\r\n if (!treeCheckable) return undefined\r\n return currentValue\r\n }, [treeCheckable, currentValue])\r\n\r\n const treeSelectedKeys = useMemo(() => {\r\n if (treeCheckable) return undefined\r\n return currentValue\r\n }, [treeCheckable, currentValue])\r\n\r\n // Unstyled render\r\n if (unstyled) {\r\n return (\r\n <div ref={wrapperRef} className={className} style={style}>\r\n <div onClick={handleTriggerClick}>\r\n {displayedValues.length === 0 && <span>{placeholder}</span>}\r\n {!isMultiple && displayedValues.length > 0 && (\r\n <span>{getNodeLabel(findNode(treeData, displayedValues[0]))}</span>\r\n )}\r\n {isMultiple &&\r\n displayedValues.map((key) => (\r\n <span key={String(key)}>\r\n {getNodeLabel(findNode(treeData, key))}\r\n <span onClick={(e) => handleRemoveTag(key, e)}>×</span>\r\n </span>\r\n ))}\r\n </div>\r\n {open && (\r\n <div>\r\n {showSearch && (\r\n <input\r\n ref={searchRef}\r\n value={searchValue}\r\n onChange={handleSearchChange}\r\n placeholder={searchPlaceholder}\r\n />\r\n )}\r\n <Tree\r\n treeData={filteredTreeData}\r\n fieldNames={fieldNames}\r\n checkable={treeCheckable}\r\n checkStrictly={treeCheckStrictly}\r\n checkedKeys={treeCheckedKeys}\r\n selectedKeys={treeSelectedKeys}\r\n multiple={isMultiple}\r\n defaultExpandAll={treeDefaultExpandAll}\r\n defaultExpandedKeys={treeDefaultExpandedKeys}\r\n expandedKeys={filteredExpandedKeys}\r\n showLine={treeLine}\r\n onSelect={handleTreeSelect}\r\n onCheck={handleTreeCheck}\r\n unstyled\r\n />\r\n </div>\r\n )}\r\n </div>\r\n )\r\n }\r\n\r\n // Styled render\r\n const wrapperCls = [\r\n 'sg-treeselect',\r\n `sg-treeselect-${size}`,\r\n open ? 'sg-treeselect-open' : '',\r\n disabled ? 'sg-treeselect-disabled' : '',\r\n isMultiple ? 'sg-treeselect-multiple' : '',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')\r\n\r\n const visibleTags =\r\n maxTagCount !== undefined && isMultiple\r\n ? displayedValues.slice(0, maxTagCount)\r\n : displayedValues\r\n\r\n const hiddenCount =\r\n maxTagCount !== undefined && isMultiple ? Math.max(0, displayedValues.length - maxTagCount) : 0\r\n\r\n return (\r\n <div className={wrapperCls} style={style} ref={wrapperRef}>\r\n <div className=\"sg-treeselect-selector\" onClick={handleTriggerClick}>\r\n <div className=\"sg-treeselect-selection-wrap\">\r\n {displayedValues.length === 0 && !searchValue && (\r\n <span className=\"sg-treeselect-placeholder\">{placeholder}</span>\r\n )}\r\n\r\n {!isMultiple && displayedValues.length > 0 && !searchValue && (\r\n <span className=\"sg-treeselect-selection-item\">\r\n {getNodeLabel(findNode(treeData, displayedValues[0]))}\r\n </span>\r\n )}\r\n\r\n {isMultiple &&\r\n visibleTags.map((key) => (\r\n <span key={String(key)} className=\"sg-treeselect-tag\">\r\n <span className=\"sg-treeselect-tag-label\">\r\n {getNodeLabel(findNode(treeData, key))}\r\n </span>\r\n <span className=\"sg-treeselect-tag-close\" onClick={(e) => handleRemoveTag(key, e)}>\r\n ×\r\n </span>\r\n </span>\r\n ))}\r\n\r\n {hiddenCount > 0 && (\r\n <span className=\"sg-treeselect-tag sg-treeselect-tag-rest\">+{hiddenCount}...</span>\r\n )}\r\n\r\n {showSearch && open && (\r\n <input\r\n ref={searchRef}\r\n className=\"sg-treeselect-search-input\"\r\n value={searchValue}\r\n onChange={handleSearchChange}\r\n placeholder={displayedValues.length === 0 ? '' : ''}\r\n />\r\n )}\r\n </div>\r\n\r\n <div className=\"sg-treeselect-actions\">\r\n {allowClear && displayedValues.length > 0 && (\r\n <span className=\"sg-treeselect-clear\" onClick={handleClear}>\r\n ×\r\n </span>\r\n )}\r\n <span className=\"sg-treeselect-arrow\">{open ? '\\u25B2' : '\\u25BC'}</span>\r\n </div>\r\n </div>\r\n\r\n {open && (\r\n <div className=\"sg-treeselect-dropdown\" style={dropdownStyle}>\r\n {filteredTreeData.length === 0 ? (\r\n <div className=\"sg-treeselect-empty\">{noMatchesText}</div>\r\n ) : (\r\n <Tree\r\n treeData={filteredTreeData}\r\n fieldNames={fieldNames}\r\n checkable={treeCheckable}\r\n checkStrictly={treeCheckStrictly}\r\n checkedKeys={treeCheckedKeys}\r\n selectedKeys={treeSelectedKeys}\r\n multiple={isMultiple}\r\n defaultExpandAll={treeDefaultExpandAll}\r\n defaultExpandedKeys={treeDefaultExpandedKeys}\r\n expandedKeys={filteredExpandedKeys}\r\n showLine={treeLine}\r\n onSelect={handleTreeSelect}\r\n onCheck={handleTreeCheck}\r\n />\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n"],"mappings":"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","names":["useState","useEffect","useMemo","useCallback","useRef","useState","useCallback","useState","useCallback","Fragment","jsx","jsxs","useMemo","useState","useCallback","useEffect","useRef","useState","useEffect","useRef","useCallback","useMemo","jsx","jsxs","useState","useRef","useMemo","useEffect","useCallback"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useVirtualScroll.ts"],"sourcesContent":["import { useState, useCallback, useRef, useEffect, useMemo } from 'react'\r\nimport { createVirtual } from '@skygraph/core'\r\nimport type { VirtualEngine, VirtualRange } from '@skygraph/core'\r\n\r\nexport interface UseVirtualScrollOptions {\r\n itemCount: number\r\n itemHeight: number | ((index: number) => number)\r\n overscan?: number\r\n}\r\n\r\nexport interface UseVirtualScrollReturn {\r\n range: VirtualRange\r\n containerRef: React.RefObject<HTMLElement | null>\r\n scrollToIndex: (index: number, align?: 'start' | 'center' | 'end') => void\r\n engine: VirtualEngine\r\n}\r\n\r\nexport function useVirtualScroll(options: UseVirtualScrollOptions): UseVirtualScrollReturn {\r\n const containerRef = useRef<HTMLElement | null>(null)\r\n const engineRef = useRef<VirtualEngine | null>(null)\r\n\r\n if (!engineRef.current) {\r\n engineRef.current = createVirtual({\r\n itemCount: options.itemCount,\r\n itemHeight: options.itemHeight,\r\n overscan: options.overscan,\r\n })\r\n }\r\n\r\n const engine = engineRef.current\r\n\r\n useEffect(() => {\r\n engine.setItemCount(options.itemCount)\r\n }, [engine, options.itemCount])\r\n\r\n useEffect(() => {\r\n engine.setItemHeight(options.itemHeight)\r\n }, [engine, options.itemHeight])\r\n\r\n const [range, setRange] = useState<VirtualRange>(() =>\r\n engine.getRange(0, 0),\r\n )\r\n\r\n const recalc = useCallback(() => {\r\n const el = containerRef.current\r\n if (!el) return\r\n setRange(engine.getRange(el.scrollTop, el.clientHeight))\r\n }, [engine])\r\n\r\n useEffect(() => {\r\n const el = containerRef.current\r\n if (!el) return\r\n\r\n recalc()\r\n\r\n el.addEventListener('scroll', recalc, { passive: true })\r\n const ro = new ResizeObserver(recalc)\r\n ro.observe(el)\r\n\r\n return () => {\r\n el.removeEventListener('scroll', recalc)\r\n ro.disconnect()\r\n }\r\n }, [recalc])\r\n\r\n useEffect(() => {\r\n recalc()\r\n }, [options.itemCount, recalc])\r\n\r\n const scrollToIndex = useCallback(\r\n (index: number, align: 'start' | 'center' | 'end' = 'start') => {\r\n const el = containerRef.current\r\n if (!el) return\r\n el.scrollTop = engine.scrollToIndex(index, el.clientHeight, align)\r\n },\r\n [engine],\r\n )\r\n\r\n return useMemo(\r\n () => ({ range, containerRef, scrollToIndex, engine }),\r\n [range, scrollToIndex, engine],\r\n )\r\n}\r\n"],"mappings":";AAAA,SAAS,UAAU,aAAa,QAAQ,WAAW,eAAe;AAClE,SAAS,qBAAqB;AAgBvB,SAAS,iBAAiB,SAA0D;AACzF,QAAM,eAAe,OAA2B,IAAI;AACpD,QAAM,YAAY,OAA6B,IAAI;AAEnD,MAAI,CAAC,UAAU,SAAS;AACtB,cAAU,UAAU,cAAc;AAAA,MAChC,WAAW,QAAQ;AAAA,MACnB,YAAY,QAAQ;AAAA,MACpB,UAAU,QAAQ;AAAA,IACpB,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,UAAU;AAEzB,YAAU,MAAM;AACd,WAAO,aAAa,QAAQ,SAAS;AAAA,EACvC,GAAG,CAAC,QAAQ,QAAQ,SAAS,CAAC;AAE9B,YAAU,MAAM;AACd,WAAO,cAAc,QAAQ,UAAU;AAAA,EACzC,GAAG,CAAC,QAAQ,QAAQ,UAAU,CAAC;AAE/B,QAAM,CAAC,OAAO,QAAQ,IAAI;AAAA,IAAuB,MAC/C,OAAO,SAAS,GAAG,CAAC;AAAA,EACtB;AAEA,QAAM,SAAS,YAAY,MAAM;AAC/B,UAAM,KAAK,aAAa;AACxB,QAAI,CAAC,GAAI;AACT,aAAS,OAAO,SAAS,GAAG,WAAW,GAAG,YAAY,CAAC;AAAA,EACzD,GAAG,CAAC,MAAM,CAAC;AAEX,YAAU,MAAM;AACd,UAAM,KAAK,aAAa;AACxB,QAAI,CAAC,GAAI;AAET,WAAO;AAEP,OAAG,iBAAiB,UAAU,QAAQ,EAAE,SAAS,KAAK,CAAC;AACvD,UAAM,KAAK,IAAI,eAAe,MAAM;AACpC,OAAG,QAAQ,EAAE;AAEb,WAAO,MAAM;AACX,SAAG,oBAAoB,UAAU,MAAM;AACvC,SAAG,WAAW;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,YAAU,MAAM;AACd,WAAO;AAAA,EACT,GAAG,CAAC,QAAQ,WAAW,MAAM,CAAC;AAE9B,QAAM,gBAAgB;AAAA,IACpB,CAAC,OAAe,QAAoC,YAAY;AAC9D,YAAM,KAAK,aAAa;AACxB,UAAI,CAAC,GAAI;AACT,SAAG,YAAY,OAAO,cAAc,OAAO,GAAG,cAAc,KAAK;AAAA,IACnE;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,SAAO;AAAA,IACL,OAAO,EAAE,OAAO,cAAc,eAAe,OAAO;AAAA,IACpD,CAAC,OAAO,eAAe,MAAM;AAAA,EAC/B;AACF;","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Spin,
|
|
3
3
|
useConfig
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-YJZKXU5O.js";
|
|
5
5
|
|
|
6
6
|
// src/components/ui/Input.tsx
|
|
7
7
|
import React from "react";
|
|
@@ -231,4 +231,4 @@ export {
|
|
|
231
231
|
Transition,
|
|
232
232
|
Button
|
|
233
233
|
};
|
|
234
|
-
//# sourceMappingURL=chunk-
|
|
234
|
+
//# sourceMappingURL=chunk-UCCGEZPJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/Input.tsx","../src/components/ui/Transition.tsx","../src/components/ui/Button.tsx"],"sourcesContent":["import React from 'react'\r\nimport { useConfig } from '../ConfigProvider'\r\nimport type { BaseComponentProps, InteractiveProps, SizableProps } from '../../types'\r\nimport { Spin } from './Spin'\r\n\r\n/** Props for the Input component. */\r\nexport interface InputProps extends BaseComponentProps, InteractiveProps, SizableProps {\r\n /** Controlled input value. */\r\n value?: string\r\n /** Uncontrolled initial value. */\r\n defaultValue?: string\r\n /** Placeholder text when the field is empty. */\r\n placeholder?: string\r\n /** Native HTML input type. @default 'text' */\r\n type?: 'text' | 'email' | 'password' | 'number'\r\n /**\r\n * Marks the field as read-only. The value is selectable and submitted\r\n * but cannot be edited. Sets the HTML `readonly` attribute,\r\n * `aria-readonly=\"true\"`, and adds the `sg-input-readonly` modifier class.\r\n * @default false\r\n */\r\n readOnly?: boolean\r\n /** DOM id forwarded to the underlying `<input>`. */\r\n id?: string\r\n /**\r\n * When true, renders a clear (×) button while the field has a value.\r\n * Disabled and read-only fields hide the button. @default false\r\n */\r\n allowClear?: boolean\r\n /**\r\n * Validation status badge. Adds `sg-input-wrapper-status-{status}` and\r\n * `sg-input-status-{status}` modifier classes and sets `aria-invalid` when\r\n * `error`.\r\n */\r\n status?: 'error' | 'warning'\r\n /** Optional content rendered before the `<input>` (e.g. icon). */\r\n prefix?: React.ReactNode\r\n /** Optional content rendered after the `<input>` (e.g. icon, unit). */\r\n suffix?: React.ReactNode\r\n /** Exposes invalid state to assistive technologies. */\r\n 'aria-invalid'?: boolean | 'false' | 'true' | 'grammar' | 'spelling'\r\n /** Marks the field as required for assistive technologies. */\r\n 'aria-required'?: boolean | 'false' | 'true'\r\n /** Connects the input to description / error nodes for assistive technologies. */\r\n 'aria-describedby'?: string\r\n /** Called when the text value changes. */\r\n onChange?: (value: string) => void\r\n /** Called when the input loses focus. */\r\n onBlur?: () => void\r\n /** Called when the input gains focus. */\r\n onFocus?: () => void\r\n /** Called when the user activates the built-in clear button. */\r\n onClear?: () => void\r\n}\r\n\r\n/** Single-line text input with optional loading indicator and configurable HTML type. */\r\nexport function Input({\r\n value,\r\n defaultValue,\r\n placeholder,\r\n type = 'text',\r\n readOnly = false,\r\n size: sizeProp,\r\n disabled: disabledProp,\r\n loading,\r\n allowClear = false,\r\n status,\r\n prefix,\r\n suffix,\r\n onChange,\r\n onBlur,\r\n onFocus,\r\n onClear,\r\n 'aria-invalid': ariaInvalid,\r\n 'aria-required': ariaRequired,\r\n 'aria-describedby': ariaDescribedBy,\r\n id,\r\n className,\r\n style,\r\n unstyled,\r\n}: InputProps) {\r\n const config = useConfig()\r\n const size = sizeProp ?? config.size ?? 'middle'\r\n const disabled = disabledProp ?? config.disabled ?? false\r\n\r\n const [internalValue, setInternalValue] = React.useState<string>(defaultValue ?? '')\r\n const currentValue = value ?? internalValue\r\n const isControlled = value !== undefined\r\n\r\n const wrapperClasses = unstyled\r\n ? (className ?? '')\r\n : [\r\n 'sg-input-wrapper',\r\n `sg-input-wrapper-${size}`,\r\n loading ? 'sg-input-wrapper-loading' : '',\r\n readOnly ? 'sg-input-wrapper-readonly' : '',\r\n status ? `sg-input-wrapper-status-${status}` : '',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')\r\n\r\n const inputClasses = unstyled\r\n ? ''\r\n : [\r\n 'sg-input',\r\n `sg-input-${size}`,\r\n readOnly ? 'sg-input-readonly' : '',\r\n status ? `sg-input-status-${status}` : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')\r\n\r\n const clearLabel = config.locale?.input?.clear ?? 'Clear'\r\n const showClear = allowClear && !disabled && !readOnly && !loading && currentValue !== ''\r\n\r\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n if (!isControlled) setInternalValue(e.target.value)\r\n onChange?.(e.target.value)\r\n }\r\n\r\n const handleClear = () => {\r\n if (!isControlled) setInternalValue('')\r\n onChange?.('')\r\n onClear?.()\r\n }\r\n\r\n const resolvedAriaInvalid = ariaInvalid ?? (status === 'error' ? true : undefined)\r\n\r\n return (\r\n <span className={wrapperClasses} style={style}>\r\n {prefix && <span className=\"sg-input-prefix\">{prefix}</span>}\r\n <input\r\n id={id}\r\n type={type}\r\n className={inputClasses}\r\n value={currentValue}\r\n placeholder={placeholder}\r\n disabled={disabled || loading}\r\n readOnly={readOnly}\r\n aria-invalid={resolvedAriaInvalid}\r\n aria-required={ariaRequired}\r\n aria-readonly={readOnly || undefined}\r\n aria-describedby={ariaDescribedBy}\r\n onChange={handleChange}\r\n onBlur={onBlur}\r\n onFocus={onFocus}\r\n />\r\n {showClear && (\r\n <button\r\n type=\"button\"\r\n className=\"sg-input-clear\"\r\n aria-label={clearLabel}\r\n onClick={handleClear}\r\n >\r\n ×\r\n </button>\r\n )}\r\n {loading && <Spin size=\"small\" unstyled={unstyled} />}\r\n {suffix && <span className=\"sg-input-suffix\">{suffix}</span>}\r\n </span>\r\n )\r\n}\r\n","import React, { useState, useEffect, useRef, useCallback } from 'react'\r\n\r\n/** Props for class-based enter/leave animation on a single child element. */\r\nexport interface TransitionProps {\r\n /** When `true`, runs enter; when `false`, runs leave (and may unmount). */\r\n visible: boolean\r\n /** Base class name prefix for default enter/leave classes (e.g. `sg-fade-enter-from`). @default 'sg-fade' */\r\n name?: string\r\n /** Animation length in ms before idle phase and after callbacks. @default 200 */\r\n duration?: number\r\n /** Custom initial class for the enter frame (with `-enter-active`). */\r\n enterFrom?: string\r\n /** Custom final class for the enter-active frame. */\r\n enterTo?: string\r\n /** Custom initial class for the leave frame (with `-leave-active`). */\r\n leaveFrom?: string\r\n /** Custom final class for the leave-active frame. */\r\n leaveTo?: string\r\n /** Fires once the enter transition timer completes. */\r\n onAfterEnter?: () => void\r\n /** Fires once the leave transition timer completes. */\r\n onAfterLeave?: () => void\r\n /** Single React element whose `className` will be merged with transition classes. */\r\n children: React.ReactElement<{ className?: string; ref?: React.Ref<HTMLElement> }>\r\n /** When `true`, removes the child from the tree after leave; when `false`, keeps it mounted. @default true */\r\n unmountOnExit?: boolean\r\n}\r\n\r\ntype Phase = 'idle' | 'enter' | 'enter-active' | 'leave' | 'leave-active'\r\n\r\n/**\r\n * Clones a single child and toggles CSS classes over `duration` when `visible` changes, optionally unmounting after leave.\r\n */\r\nexport function Transition({\r\n visible,\r\n name = 'sg-fade',\r\n duration = 200,\r\n enterFrom,\r\n enterTo,\r\n leaveFrom,\r\n leaveTo,\r\n onAfterEnter,\r\n onAfterLeave,\r\n children,\r\n unmountOnExit = true,\r\n}: TransitionProps) {\r\n const [mounted, setMounted] = useState(visible)\r\n const [phase, setPhase] = useState<Phase>(visible ? 'idle' : 'idle')\r\n const nodeRef = useRef<HTMLElement | null>(null)\r\n const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\r\n const prevVisible = useRef(visible)\r\n\r\n const getEnterClasses = useCallback(() => {\r\n if (enterFrom && enterTo) return { from: enterFrom, active: `${name}-enter-active`, to: enterTo }\r\n return { from: `${name}-enter-from`, active: `${name}-enter-active`, to: `${name}-enter-to` }\r\n }, [name, enterFrom, enterTo])\r\n\r\n const getLeaveClasses = useCallback(() => {\r\n if (leaveFrom && leaveTo) return { from: leaveFrom, active: `${name}-leave-active`, to: leaveTo }\r\n return { from: `${name}-leave-from`, active: `${name}-leave-active`, to: `${name}-leave-to` }\r\n }, [name, leaveFrom, leaveTo])\r\n\r\n useEffect(() => {\r\n if (visible === prevVisible.current) return\r\n prevVisible.current = visible\r\n clearTimeout(timerRef.current)\r\n\r\n if (visible) {\r\n setMounted(true)\r\n setPhase('enter')\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => setPhase('enter-active'))\r\n })\r\n timerRef.current = setTimeout(() => {\r\n setPhase('idle')\r\n onAfterEnter?.()\r\n }, duration)\r\n } else {\r\n setPhase('leave')\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => setPhase('leave-active'))\r\n })\r\n timerRef.current = setTimeout(() => {\r\n setPhase('idle')\r\n if (unmountOnExit) setMounted(false)\r\n onAfterLeave?.()\r\n }, duration)\r\n }\r\n }, [visible, duration, unmountOnExit, onAfterEnter, onAfterLeave])\r\n\r\n useEffect(() => {\r\n return () => clearTimeout(timerRef.current)\r\n }, [])\r\n\r\n if (!mounted && unmountOnExit) return null\r\n\r\n const enterC = getEnterClasses()\r\n const leaveC = getLeaveClasses()\r\n\r\n let transitionClass = ''\r\n switch (phase) {\r\n case 'enter':\r\n transitionClass = `${enterC.from} ${enterC.active}`\r\n break\r\n case 'enter-active':\r\n transitionClass = `${enterC.to} ${enterC.active}`\r\n break\r\n case 'leave':\r\n transitionClass = `${leaveC.from} ${leaveC.active}`\r\n break\r\n case 'leave-active':\r\n transitionClass = `${leaveC.to} ${leaveC.active}`\r\n break\r\n }\r\n\r\n return React.cloneElement(children, {\r\n ref: nodeRef,\r\n className: [children.props.className, transitionClass].filter(Boolean).join(' '),\r\n })\r\n}\r\n","import React from 'react'\r\nimport { Spin } from './Spin'\r\nimport { useConfig } from '../ConfigProvider'\r\nimport type { BaseComponentProps, InteractiveProps, SizableProps } from '../../types'\r\n\r\n/** Props for the Button component. */\r\nexport interface ButtonProps extends BaseComponentProps, InteractiveProps, SizableProps {\r\n /** Visual style variant. @default 'default' */\r\n type?: 'default' | 'primary' | 'dashed' | 'text' | 'link'\r\n /** Native HTML button type attribute. @default 'button' */\r\n htmlType?: 'button' | 'submit' | 'reset'\r\n /**\r\n * Visually flags a destructive action. Combines with `type` (e.g. a\r\n * `danger` `primary` button is solid red, a `danger` `text` is red text).\r\n * Adds the `sg-button-danger` modifier class.\r\n * @default false\r\n */\r\n danger?: boolean\r\n /** Stretches the button to fill its parent container. @default false */\r\n block?: boolean\r\n /** Click event handler. */\r\n onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void\r\n /** Button content. */\r\n children?: React.ReactNode\r\n}\r\n\r\n/** General-purpose button with multiple visual variants, sizes, and loading state. */\r\nexport function Button({\r\n type = 'default',\r\n size: sizeProp,\r\n disabled: disabledProp,\r\n loading,\r\n htmlType = 'button',\r\n danger = false,\r\n block = false,\r\n onClick,\r\n children,\r\n className,\r\n style,\r\n unstyled,\r\n}: ButtonProps) {\r\n const config = useConfig()\r\n const size = sizeProp ?? config.size ?? 'middle'\r\n const disabled = disabledProp ?? config.disabled ?? false\r\n\r\n const classes = unstyled\r\n ? className ?? ''\r\n : [\r\n 'sg-button',\r\n `sg-button-${type}`,\r\n `sg-button-${size}`,\r\n danger ? 'sg-button-danger' : '',\r\n block ? 'sg-button-block' : '',\r\n loading ? 'sg-button-loading' : '',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')\r\n\r\n return (\r\n <button\r\n type={htmlType}\r\n className={classes}\r\n style={style}\r\n disabled={disabled || loading}\r\n aria-disabled={disabled || loading}\r\n aria-busy={loading}\r\n onClick={onClick}\r\n >\r\n {loading && <Spin size=\"small\" unstyled={unstyled} />}\r\n {children}\r\n </button>\r\n )\r\n}\r\n"],"mappings":"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","names":["React","jsx","jsxs"]}
|