@ehfuse/mui-virtual-data-table 1.11.4 → 1.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -0
- package/dist/columnReorder.d.ts +42 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.esm.js +2 -2
- package/dist/index.esm.js.map +4 -4
- package/dist/index.js +2 -2
- package/dist/index.js.map +4 -4
- package/dist/types.d.ts +25 -0
- package/package.json +1 -1
package/dist/index.esm.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/VirtualDataTable.tsx", "../src/rowReorder.tsx", "../src/i18n/index.ts", "../src/i18n/mui-virtual-data-table/ko.json", "../src/i18n/mui-virtual-data-table/en.json", "../src/i18n/mui-virtual-data-table/ja.json", "../src/i18n/mui-virtual-data-table/zh.json", "../src/i18n/mui-virtual-data-table/de.json", "../src/i18n/mui-virtual-data-table/fr.json", "../src/i18n/mui-virtual-data-table/it.json", "../src/i18n/mui-virtual-data-table/vi.json", "../node_modules/@ehfuse/mui-fadeout-loading-progress/node_modules/tslib/tslib.es6.js", "../node_modules/@ehfuse/mui-fadeout-loading-progress/src/LoadingProgress.tsx", "../src/CssSpinner.tsx", "../src/HeaderMenu.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * VirtualDataTable.tsx\n *\n * MIT License\n *\n * Copyright (c) 2025 KIM YOUNG JIN (ehfuse@gmail.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport React, {\n forwardRef,\n useCallback,\n useMemo,\n useRef,\n useEffect,\n memo,\n useState,\n} from \"react\";\nimport {\n Box,\n Table,\n TableBody as MuiTableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableFooter as MuiTableFooter,\n TableRow as MuiTableRow,\n TableSortLabel,\n Paper,\n Typography,\n useTheme,\n useMediaQuery,\n type SxProps,\n type Theme,\n} from \"@mui/material\";\nimport { TableVirtuoso } from \"react-virtuoso\";\nimport { REORDER_COLUMN_ID, useRowReorder } from \"./rowReorder\";\nimport type { TableComponents } from \"react-virtuoso\";\nimport { LoadingProgress } from \"@ehfuse/mui-fadeout-loading-progress\";\nimport { CssSpinner } from \"./CssSpinner\";\nimport { HeaderMenu, HeaderFilterIcon } from \"./HeaderMenu\";\n\nimport OverlayScrollbar from \"@ehfuse/overlay-scrollbar\";\nimport type { DataColumn, SortDirection, VDTColumnWidths, VirtualDataTableProps } from \"./types\";\n\n// OverlayScrollbar \uC124\uC815\uC744 \uCEF4\uD3EC\uB10C\uD2B8 \uC678\uBD80\uC5D0 \uC0C1\uC218\uB85C \uC120\uC5B8 (\uC7AC\uB80C\uB354\uB9C1 \uC2DC \uB3D9\uC77C\uD55C \uCC38\uC870 \uC720\uC9C0)\nconst OVERLAY_SCROLLBAR_TRACK_CONFIG = {\n alignment: \"default\" as const, // \uC61B \uAC12 \"right\" \uB294 1.7 \uD0C0\uC785\uC5D0\uC11C \uC0AC\uB77C\uC84C\uB2E4 \u2014 \uB3D9\uC791\uC740 \uAC19\uB2E4(\"outside\" \uAC00 \uC544\uB2C8\uBA74 \uC548\uCABD \uC815\uB82C)\n margin: 0,\n radius: 0,\n};\nconst ROW_CLICK_DRAG_THRESHOLD_PX = 5;\n/** \uBC14\uAFBC \uC5F4 \uD3ED\uC774 \uC5C6\uC744 \uB54C\uC758 \uBE48 \uD45C \u2014 \uB9E4 \uB80C\uB354 \uC0C8 \uAC1D\uCCB4\uB97C \uB9CC\uB4E4\uBA74 \uD3ED \uACC4\uC0B0 memo \uAC00 \uB9E4\uBC88 \uB2E4\uC2DC \uB3C8\uB2E4. */\nconst EMPTY_WIDTHS: VDTColumnWidths = {};\n/** \uC5F4 \uD3ED \uB04C\uAE30\uB85C \uCE60 \uCD5C\uC18C \uC774\uB3D9 px \u2014 \uACBD\uACC4\uB97C \uB20C\uB800\uB2E4 \uB5BC\uB294 \uAC83(\uB450 \uBC88 \uB204\uB974\uAE30 \uD3EC\uD568)\uC740 \uB04C\uAE30\uAC00 \uC544\uB2C8\uB2E4. */\nconst RESIZE_DRAG_THRESHOLD_PX = 3;\n\n/** \uC22B\uC790 \uD3ED\uC740 px \uAE00\uC790\uB85C \u2014 CSS \uBCC0\uC218\uC758 \uAE30\uBCF8\uAC12(var(--x, \uAE30\uBCF8\uAC12))\uC5D0 \uB123\uC73C\uB824\uBA74 \uB2E8\uC704\uAC00 \uC788\uC5B4\uC57C \uD55C\uB2E4. */\nfunction cssPx(value: string | number | undefined): string | undefined {\n return typeof value === \"number\" ? `${value}px` : value;\n}\n\n/** \uBA38\uB9AC \uCE78\uC758 \uD3ED(style width \uAE30\uC900) \u2014 content-box \uCE78\uC774\uBA74 \uADF8\uB824\uC9C4 \uD3ED\uC5D0\uC11C \uC548\uCABD \uC5EC\uBC31 \u00B7 \uD14C\uB450\uB9AC\uB97C \uBE80\uB2E4. */\nfunction headerCellWidth(th: HTMLElement): number {\n const cs = window.getComputedStyle(th);\n const extra =\n cs.boxSizing === \"border-box\"\n ? 0\n : (parseFloat(cs.paddingLeft) || 0) +\n (parseFloat(cs.paddingRight) || 0) +\n (parseFloat(cs.borderLeftWidth) || 0) +\n (parseFloat(cs.borderRightWidth) || 0);\n return th.getBoundingClientRect().width - extra;\n}\n\n/**\n * \uD45C \uC0C1\uC790\uC5D0 \uC5B9\uC740 CSS \uBCC0\uC218(--vdt-*)\uB97C vars \uB300\uB85C \uB9DE\uCD98\uB2E4(\uC5C6\uB294 \uC774\uB984\uC740 \uB5C0\uB2E4). \uB044\uB294 \uB3D9\uC548 React \uC0C1\uD0DC\uB97C \uBC14\uAFB8\uBA74 \uD45C \uBD80\uD488\uC774 \uB2E4\uC2DC \uB9CC\uB4E4\uC5B4\uC838\n * \uAC00\uC0C1 \uBAA9\uB85D \uC904\uAE4C\uC9C0 \uB2E4\uC2DC \uADF8\uB9AC\uBBC0\uB85C, \uB044\uB294 \uB3D9\uC548\uC740 \uBCC0\uC218\uB9CC \uBC14\uAFB8\uACE0 \uB193\uC744 \uB54C \uD55C \uBC88 \uC0C1\uD0DC\uB85C \uC62E\uAE34\uB2E4.\n */\nfunction applyResizeVars(el: HTMLElement, vars: Record<string, string>) {\n const stale: string[] = [];\n for (let i = 0; i < el.style.length; i += 1) {\n const name = el.style[i];\n if (name.startsWith(\"--vdt-\") && !(name in vars)) stale.push(name);\n }\n stale.forEach((name) => el.style.removeProperty(name));\n Object.entries(vars).forEach(([name, value]) => el.style.setProperty(name, value));\n}\n\n/**\n * \uB370\uC774\uD130 \uAE30\uBC18 \uBB34\uD55C \uC2A4\uD06C\uB864 \uBC0F \uAC00\uC0C1\uD654\uB97C \uC9C0\uC6D0\uD558\uB294 \uD14C\uC774\uBE14 \uCEF4\uD3EC\uB10C\uD2B8\n */\n/**\n * \uB178\uC158\uD48D(variant=\"notion\") \uC0C9 \u2014 @ehfuse/taskbox \uC758 \uBAA9\uB85D\uD45C \uD314\uB808\uD2B8(light: border/borderStrong/textSecondary/surfaceHover,\n * dark: \uAC19\uC740 \uC774\uB984\uC758 \uB2E4\uD06C \uAC12)\uB97C \uADF8\uB300\uB85C \uC62E\uAE34 \uAC83\uC774\uB2E4. \uB450 \uD328\uD0A4\uC9C0\uAC00 \uC11C\uB85C\uB97C \uCC38\uC870\uD558\uC9C0 \uC54A\uC544 \uAC12\uC744 \uBCA0\uAEF4 \uB454\uB2E4 \u2014 \uADF8\uCABD\uC774 \uBC14\uB00C\uBA74 \uC5EC\uAE30\uB3C4 \uB9DE\uCD98\uB2E4.\n */\n/**\n * \uB178\uC158\uD48D \uC120 \uC0C9 \uD558\uB098(1.11.4) \u2014 \uBC14\uAE65 \uD2C0 \u00B7 \uBA38\uB9AC\uC904 \uC544\uB798 \u00B7 \uCE78 \uC0AC\uC774 \uC120\uC744 \uBAA8\uB450 \uC774 \uC0C9\uC73C\uB85C \uADF8\uB9B0\uB2E4. \uC18C\uBE44\uCC98\uAC00 \uD45C \uBC16\uC758 \uC120(\uB2EC\uB825 \uACA9\uC790 \uB4F1)\uB3C4 \uAC19\uC740 \uC0C9\uC73C\uB85C \uB9DE\uCD94\uAC8C \uB0B4\uBCF4\uB0B8\uB2E4.\n * 1.11.3 \uC5D0\uC11C \uD55C \uB2E8\uACC4 \uC9C4\uD558\uAC8C \uD588\uACE0(\uC608\uC804 #e6e6e3 \u00B7 #dedddb \uB294 \uBC1D\uC740 \uBAA8\uB2C8\uD130\uC5D0\uC11C \uC798 \uC548 \uBCF4\uC600\uB2E4), 1.11.4 \uC5D0\uC11C \uB450 \uB2E8\uACC4\uB97C \uD558\uB098\uB85C \uD569\uCCE4\uB2E4\n * (2026-11-03 \uC0AC\uC6A9\uC790 \uC9C0\uC801 \"\uBA38\uB9AC \uC544\uB798 \uC120\uB9CC \uB354 \uD750\uB9AC\uB2E4 \u2014 \uD1B5\uC77C\").\n */\nexport const NOTION_LINE_COLOR = \"#d9d8d5\";\n/** \uC5B4\uB450\uC6B4 \uD654\uBA74\uC758 \uB178\uC158\uD48D \uC120 \uC0C9. */\nexport const NOTION_LINE_COLOR_DARK = \"#3b434e\";\n\nconst NOTION_LIGHT = {\n bg: \"#ffffff\",\n border: NOTION_LINE_COLOR,\n borderStrong: NOTION_LINE_COLOR,\n headerColor: \"#787774\",\n hoverBg: \"#f8f8f7\",\n emptyColor: \"#9b9a97\",\n selectedBg: \"#dbeafe\",\n selectedBar: \"#3b82f6\",\n};\n/** \uB178\uC158\uD48D \uC885\uC774 \uC704\uC544\uB798 \uC5EC\uBC31 \u2014 \uC88C\uC6B0 \uAE30\uBCF8(12px)\uACFC \uAC19\uB2E4. */\nconst NOTION_PADDING_Y = \"12px\";\nconst NOTION_DARK = {\n bg: \"#1e1e1e\",\n border: NOTION_LINE_COLOR_DARK,\n borderStrong: NOTION_LINE_COLOR_DARK,\n headerColor: \"#a3adbb\",\n hoverBg: \"#272d36\",\n emptyColor: \"#7d8590\",\n selectedBg: \"rgba(59, 130, 246, 0.22)\",\n selectedBar: \"#60a5fa\",\n};\n\n/** \uBC14\uAE65 \uC2A4\uD06C\uB864\uC77C \uB54C\uC758 \uC2A4\uD06C\uB864 \uC0C1\uC790 \uC790\uB9AC \u2014 \uAD74\uB9AC\uC9C0 \uC54A\uB294 \uD3C9\uBC94\uD55C \uC0C1\uC790(1.7.0) */\nconst PlainScroller = forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>((props, ref) => <div {...props} ref={ref} />);\nPlainScroller.displayName = \"VdtPlainScroller\";\n\n/** \uD3F0 \uBAA9\uB85D\uC73C\uB85C \uBC14\uAFB8\uB294 \uAE30\uBCF8 \uD3ED \u2014 MUI sm(600) \uBBF8\uB9CC */\nconst DEFAULT_MOBILE_QUERY = \"(max-width:599.95px)\";\n\n/** \uC774 \uC5F4\uC774 \uBA38\uB9AC \uBA54\uB274\uC5D0 \uAC70\uB974\uAE30 \uBAA9\uB85D\uC744 \uAC16\uB294\uC9C0 \u2014 \uAC12 \uBAA9\uB85D\uACFC \uBC14\uB01C \uC54C\uB9BC\uC774 \uB458 \uB2E4 \uC788\uC5B4\uC57C \uD55C\uB2E4. */\nfunction hasColumnFilter<T>(col: DataColumn<T>): boolean {\n return Boolean(col.filterOptions && col.onFilterChange);\n}\n\n/**\n * \uC815\uB82C \uD654\uC0B4\uD45C \uC790\uB9AC(1.10.4) \u2014 \uCE78 \uB9DE\uCDA4(align)\uC73C\uB85C \uC815\uD55C\uB2E4. \uD45C \uAF34(variant)\uACFC \uC0C1\uAD00\uC5C6\uC774 \uAC19\uB2E4(1.10.3 \uAE4C\uC9C0\uB294 \uB178\uC158\uD48D CSS \uC5D0\uB9CC \uC788\uC5B4 \uAE30\uBCF8 \uAF34 \uD45C\uB294 \uD654\uC0B4\uD45C\uAC00 \uBC16\uC5D0 \uB5A0 \uC798\uB838\uB2E4).\n * \uC67C\uCABD \uB9DE\uCDA4: \uBA38\uB9AC\uAE00 \uC624\uB978\uCABD \uC548(\uC0C1\uC790 \uC624\uB978\uCABD 20px) \u00B7 \uC624\uB978\uCABD \uB9DE\uCDA4: \uBA38\uB9AC\uAE00 \uC67C\uCABD \uC548(\uC0C1\uC790 \uC67C\uCABD 20px \u2014 \uBA38\uB9AC\uAE00 \uB05D\uC774 \uAC12 \uB05D\uACFC \uB9DE\uB294\uB2E4) \u00B7\n * \uAC00\uC6B4\uB370 \uB9DE\uCDA4: \uBA38\uB9AC\uAE00 \uBB36\uC74C \uBC16(left 100%) \u2014 \uD638\uBC84 \uB54C\uB9CC \uBCF4\uC774\uB2C8 \uBB36\uC74C\uC744 \uBC00\uC9C0 \uC54A\uACE0 \uBB36\uC74C\uC774 \uCE78 \uAC00\uC6B4\uB370\uC5D0 \uC120\uB2E4.\n */\nfunction sortPlacement(align?: \"left\" | \"center\" | \"right\") {\n if (align === \"right\") return { box: { paddingLeft: \"20px\" }, label: { left: 0, marginLeft: 0 } };\n if (align === \"center\") return { box: {}, label: { left: \"100%\", marginLeft: \"4px\" } };\n return { box: { paddingRight: \"20px\" }, label: { left: \"auto\", right: 0, marginLeft: 0 } };\n}\n\nfunction VirtualDataTableComponent<T>({\n data,\n loading = false,\n columns: columnsProp,\n onRowClick,\n getRowId,\n selectedRowId,\n selectedRowSx: selectedRowSxProp,\n rowHeight: rowHeightProp,\n columnHeight: columnHeightProp,\n striped,\n rowDivider = true,\n onSort,\n onSortClear,\n onHeaderContextMenu,\n onLoadMore,\n sortBy,\n sortDirection,\n showPaper = true,\n paddingX: paddingXProp,\n paddingTop = 0,\n paddingBottom = 0,\n rowHoverColor: rowHoverColorProp,\n rowHoverOpacity: rowHoverOpacityProp,\n viewportBuffer,\n overscan,\n initialItemCount,\n scrollbars,\n emptyMessage = \"NO DATA\",\n autoHeight = false,\n LoadingComponent,\n showFooter,\n footerHeight,\n footerSx,\n variant = \"default\",\n borderColor,\n framed = true,\n headerTopBorder = false,\n scrollbarGutter = false,\n rowHeightMode = \"fixed\",\n tableLayout = \"fixed\",\n renderFullWidthRow,\n fullWidthRowSx,\n onRowContextMenu,\n pinnedRows,\n pinnedRowsMaxHeight,\n pinnedRowsSx,\n resetScrollOnDataChange = true,\n rowKeyFromId = false,\n onEndReached,\n colorMode,\n mobile,\n scrollParent,\n columnResize,\n columnWidths,\n onColumnWidthsChange,\n rowReorder,\n}: VirtualDataTableProps<T>) {\n // \uB178\uC158\uD48D(variant=\"notion\") \u2014 @ehfuse/taskbox \uBAA9\uB85D\uD45C\uC640 \uAC19\uC740 \uAC12\uC774\uB2E4. \uAE30\uBCF8\uAC12\uB9CC \uBC14\uAFB8\uACE0 \uC9C1\uC811 \uC900 prop \uC774 \uC774\uAE34\uB2E4.\n const notion = variant === \"notion\";\n const muiTheme = useTheme();\n // colorMode \uB97C \uC8FC\uBA74 \uC571 \uD14C\uB9C8\uC640 \uB2EC\uB9AC \uC774 \uD45C\uB9CC \uADF8 \uBAA8\uB4DC\uB85C \uCE60\uD55C\uB2E4(\uC571\uC740 \uBC1D\uC740\uB370 \uC5C5\uBB34\uD568\uB9CC \uC5B4\uB450\uC6B4 \uACBD\uC6B0).\n const baseNotionTokens = (colorMode ?? muiTheme.palette.mode) === \"dark\" ? NOTION_DARK : NOTION_LIGHT;\n // \uBC14\uAE65\uC5D0\uC11C \uC120 \uC0C9\uC744 \uC8FC\uBA74 \uD2C0 \u00B7 \uBA38\uB9AC\uC904 \u00B7 \uCE78 \uC120 \uBAA8\uB450 \uADF8 \uC0C9(1.11.3).\n const notionTokens = borderColor ? { ...baseNotionTokens, border: borderColor, borderStrong: borderColor } : baseNotionTokens;\n const hasPinnedRows = (pinnedRows?.length ?? 0) > 0;\n const columnHeight = columnHeightProp ?? (notion ? 40 : 56);\n // \uB178\uC158\uD48D \uC904 \uB192\uC774 \uAE30\uBCF8 48 \u2014 \uC5C5\uBB34\uD568 \uBAA9\uB85D \uD45C \u00B7 \uC804\uC790\uACB0\uC7AC \uD45C\uAC00 \uC4F0\uB294 \uAC12\uC774\uB2E4.\n const rowHeight = rowHeightProp ?? (notion ? 48 : 50);\n // \uD2C0 \uC5C6\uC774(framed=false) \uADF8\uB9B4 \uB54C\uB294 \uBC14\uAE65 \uC0C1\uC790\uAC00 \uC774\uBBF8 \uD14C\uB450\uB9AC\uB97C \uB458\uB800\uB2E4 \u2014 \uC88C\uC6B0 \uC5EC\uBC31 \uC5C6\uC774 \uD45C\uAC00 \uC0C1\uC790\uC5D0 \uAF49 \uCC2C\uB2E4.\n const paddingX = framed ? (paddingXProp ?? (notion ? \"12px\" : \"1rem\")) : 0;\n // \uD3F0 \uBAA9\uB85D(1.6.0) \u2014 \uCF20 \uD45C\uB9CC, \uD654\uBA74\uC774 \uC881\uC744 \uB54C\uB9CC \uCE74\uB4DC \uC904\uB85C \uADF8\uB9B0\uB2E4\n const mobileConfig = mobile === true ? {} : mobile || null;\n const mobileMatch = useMediaQuery(mobileConfig?.query ?? DEFAULT_MOBILE_QUERY, { noSsr: true });\n const mobileList = Boolean(mobileConfig) && mobileMatch;\n // \uC904 \uB04C\uC5B4 \uC62E\uAE30\uAE30(1.9.0) \u2014 \uC190\uC7A1\uC774 \uC5F4\uC744 \uB9E8 \uC55E\uC5D0 \uB07C\uC6B4\uB2E4. \uD45C \uC0C1\uC790 \u00B7 \uAD74\uB9AC\uB294 \uC694\uC18C ref \uB294 \uC544\uB798\uC5D0\uC11C \uCC44\uC6CC\uC9C4\uB2E4(\uB044\uB294 \uB3D9\uC548\uC5D0\uB9CC \uC77D\uB294\uB2E4)\n const reorderBoxRef = useRef<HTMLDivElement | null>(null);\n const reorderScrollerRef = useRef<() => HTMLElement | null>(() => null);\n const dataLengthRef = useRef(data.length);\n dataLengthRef.current = data.length;\n const reorder = useRowReorder<T>({\n config: rowReorder,\n tableBoxRef: reorderBoxRef,\n getScroller: () => reorderScrollerRef.current(),\n dataLengthRef,\n anyPinned: columnsProp.some((c) => c.pinned === \"left\"),\n });\n const columns = useMemo(\n () => (reorder.handleColumn ? [reorder.handleColumn, ...columnsProp] : columnsProp),\n [reorder.handleColumn, columnsProp],\n );\n // \uBC14\uAE65 \uC2A4\uD06C\uB864(1.7.0) \u2014 \uD398\uC774\uC9C0\uAC00 \uAD74\uB9AC\uACE0 \uD45C\uB294 \uADF8 \uC2A4\uD06C\uB864\uC5D0 \uB9DE\uCDB0 \uBCF4\uC774\uB294 \uC904\uB9CC \uADF8\uB9B0\uB2E4(\uB192\uC774\uB294 \uB0B4\uC6A9\uB9CC\uD07C)\n const external = Boolean(scrollParent);\n // \uB192\uC774\uB97C \uB0B4\uC6A9\uC5D0 \uB9E1\uAE30\uB294\uAC00 \u2014 autoHeight(\uAC00\uC0C1\uD654 \uC5C6\uC74C) \u00B7 \uBC14\uAE65 \uC2A4\uD06C\uB864(\uAC00\uC0C1\uD654 \uC788\uC74C)\n const sizeAuto = autoHeight || external;\n // \uCE74\uB4DC \uC904\uC740 \uB0B4\uC6A9\uB9CC\uD07C \uB192\uC544\uC9C4\uB2E4(rowHeight \uB294 \uCD5C\uC18C \uB192\uC774)\n const autoRowHeight = rowHeightMode === \"auto\" || mobileList;\n // \uD638\uBC84\uB294 \uB2E8\uC0C9(\uBD88\uD22C\uBA85) \u2014 \uAE30\uBCF8 \uBAA8\uC591\uC758 \uBC18\uD22C\uBA85 \uAC80\uC815\uC740 \uD770 \uC885\uC774 \uC704\uC5D0\uC11C \uD68C\uC0C9\uC774 \uC544\uB2C8\uB77C \uD0C1\uD55C \uC0C9\uC73C\uB85C \uBCF4\uC778\uB2E4.\n // \uB05D \uCE78 \uC2A4\uD06C\uB864\uBC14 \uC790\uB9AC(scrollbarGutter, 1.11.1) \u2014 \uB05D \uCE78 \uC624\uB978\uCABD \uC5EC\uBC31 = \uC6D0\uB798 \uCE78 \uC5EC\uBC31 + \uC2A4\uD06C\uB864\uBC14 \uD3ED.\n const gutterPx =\n typeof scrollbarGutter === \"number\"\n ? scrollbarGutter\n : scrollbarGutter\n ? (Number((scrollbars as { thumb?: { width?: number } } | undefined)?.thumb?.width) || 8) + 8\n : 0;\n const gutterSx =\n gutterPx > 0\n ? {\n \"& thead tr th:last-of-type, & tbody tr td:last-of-type:not([data-vdt-pad])\": {\n paddingRight: `${(notion ? 14 : 16) + gutterPx}px !important`,\n },\n }\n : {};\n const rowHoverColor = rowHoverColorProp ?? (notion ? notionTokens.hoverBg : undefined);\n const rowHoverOpacity = rowHoverOpacityProp ?? (notion ? 1 : undefined);\n const defaultViewportBufferTop = Math.max(rowHeight * 12, 480);\n const defaultViewportBufferBottom = Math.max(rowHeight * 12, 480);\n const viewportBufferTop =\n typeof viewportBuffer === \"number\"\n ? viewportBuffer\n : (viewportBuffer?.top ?? defaultViewportBufferTop);\n const viewportBufferBottom =\n typeof viewportBuffer === \"number\"\n ? viewportBuffer\n : (viewportBuffer?.bottom ?? defaultViewportBufferBottom);\n const defaultOverscanMain = Math.max(rowHeight * 8, 420);\n const defaultOverscanReverse = Math.max(rowHeight * 10, 520);\n const virtuosoOverscan =\n typeof overscan === \"number\"\n ? overscan\n : {\n main: overscan?.main ?? defaultOverscanMain,\n reverse: overscan?.reverse ?? defaultOverscanReverse,\n };\n const estimatedItemHeight = rowHeight + (rowDivider ? 1 : 0);\n\n // \uC120\uD0DD \uD589 \uD558\uC774\uB77C\uC774\uD2B8\uB294 selectedRowSx \uAC00 \uAC1D\uCCB4(\uB610\uB294 \uBBF8\uC9C0\uC815)\uBA74 CSS \uC140\uB809\uD130\uB85C \uCC98\uB9AC\uD55C\uB2E4.\n // \uCEE8\uD14C\uC774\uB108 sx \uC5D0 `tr[data-row-id=\"...\"]` \uADDC\uCE59\uC744 \uB123\uC73C\uBA74 selectedRowId \uBCC0\uACBD \uC2DC components/\uD589\uC744\n // \uC7AC\uB80C\uB354\uD558\uC9C0 \uC54A\uACE0(\uCEE8\uD14C\uC774\uB108 1\uAC1C\uB9CC \uAC31\uC2E0) CSS \uB85C\uB9CC \uAC15\uC870\uB3FC row \uD074\uB9AD \uBC18\uC751\uC774 \uC989\uAC01\uC801\uC774\uB2E4.\n // \uD568\uC218\uD615 selectedRowSx(\uD589\uB9C8\uB2E4 \uB3D9\uC801)\uB294 CSS \uB85C \uD45C\uD604 \uBD88\uAC00\uD558\uBBC0\uB85C \uAE30\uC874 per-row \uACBD\uB85C\uB97C \uC720\uC9C0\uD55C\uB2E4.\n // \uB178\uC158\uD48D\uC740 \uC120\uD0DD \uC904 \uBAA8\uC591\uC744 \uAE30\uBCF8\uC73C\uB85C \uAC16\uB294\uB2E4 \u2014 \uC605\uC740 \uD30C\uB780 \uBC14\uD0D5 + \uC67C\uCABD \uD30C\uB780 \uB760 3px(\uBAA9\uB85D \uD45C\uC758 \"\uC9C0\uAE08 \uC5F4\uC5B4 \uB454 \uC904\").\n // \uB760\uB294 \uC904(tr)\uC758 \uADF8\uB9BC\uC790\uAC00 \uBE0C\uB77C\uC6B0\uC800\uB9C8\uB2E4 \uADF8\uB824\uC9C0\uC9C0 \uC54A\uC544 \uCCAB \uCE78 \uC548\uCABD \uADF8\uB9BC\uC790\uB85C \uAE0B\uB294\uB2E4. \uACE0\uC815 \uC5F4 \uCE78\uC740 \uC81C \uBC14\uD0D5\uC744 \uCE60\uD558\uBBC0\uB85C \uAC19\uC740 \uC0C9\uC744 \uC900\uB2E4.\n const notionSelectedSx = useMemo(\n () =>\n notion\n ? {\n backgroundColor: notionTokens.selectedBg,\n \"& > td:first-of-type\": { boxShadow: `inset 3px 0 0 ${notionTokens.selectedBar}` },\n \"& > td[data-vdt-pinned]\": { backgroundColor: notionTokens.selectedBg },\n }\n : undefined,\n [notion, notionTokens],\n );\n const selectedRowSx = selectedRowSxProp ?? notionSelectedSx;\n const useCssRowHighlight = !selectedRowSx || typeof selectedRowSx !== \"function\";\n const selectedRowCssSx = useMemo<Record<string, unknown> | null>(() => {\n if (\n !useCssRowHighlight ||\n selectedRowId === null ||\n selectedRowId === undefined ||\n !selectedRowSx\n ) {\n return null;\n }\n const escaped = String(selectedRowId).replace(/[\"\\\\]/g, \"\\\\$&\");\n return {\n [`& tbody tr[data-row-id=\"${escaped}\"]`]: selectedRowSx,\n };\n }, [useCssRowHighlight, selectedRowId, selectedRowSx]);\n\n const isDev =\n typeof window !== \"undefined\" &&\n (window.location.hostname === \"localhost\" ||\n window.location.hostname === \"127.0.0.1\");\n\n const [perfDebugEnabled] = useState(() => {\n if (typeof window === \"undefined\") {\n return false;\n }\n return window.localStorage.getItem(\"vdt-perf-debug\") === \"1\";\n });\n const perfStatsRef = useRef({\n wheelEvents: 0,\n wheelInputPx: 0,\n wheelHandlerMs: 0,\n wheelRafFlushes: 0,\n wheelRafMs: 0,\n rangeChangedCalls: 0,\n rangeChangedMs: 0,\n rowContentCalls: 0,\n rowContentMs: 0,\n rowContentMaxMs: 0,\n cellRenderCalls: 0,\n cellRenderMs: 0,\n cellRenderMaxMs: 0,\n });\n\n // \uB204\uC801\uB41C \uC131\uB2A5 \uD1B5\uACC4\uB97C \uCF58\uC194\uC5D0 \uC8FC\uAE30\uC801\uC73C\uB85C \uCD9C\uB825\uD55C\uB2E4.\n const flushPerfStats = useCallback(\n (reason: string) => {\n if (!perfDebugEnabled) {\n return;\n }\n const stats = perfStatsRef.current;\n const hasData =\n stats.wheelEvents > 0 ||\n stats.rangeChangedCalls > 0 ||\n stats.rowContentCalls > 0 ||\n stats.cellRenderCalls > 0;\n if (!hasData) {\n return;\n }\n\n const rowAvgMs =\n stats.rowContentCalls > 0\n ? stats.rowContentMs / stats.rowContentCalls\n : 0;\n const cellAvgMs =\n stats.cellRenderCalls > 0\n ? stats.cellRenderMs / stats.cellRenderCalls\n : 0;\n\n console.log(\"[VDT perf]\", {\n reason,\n wheel: {\n events: stats.wheelEvents,\n inputPx: Math.round(stats.wheelInputPx),\n handlerMs: Number(stats.wheelHandlerMs.toFixed(2)),\n rafFlushes: stats.wheelRafFlushes,\n rafMs: Number(stats.wheelRafMs.toFixed(2)),\n },\n rangeChanged: {\n calls: stats.rangeChangedCalls,\n totalMs: Number(stats.rangeChangedMs.toFixed(2)),\n },\n rowContent: {\n calls: stats.rowContentCalls,\n totalMs: Number(stats.rowContentMs.toFixed(2)),\n avgMs: Number(rowAvgMs.toFixed(3)),\n maxMs: Number(stats.rowContentMaxMs.toFixed(3)),\n },\n cellRender: {\n calls: stats.cellRenderCalls,\n totalMs: Number(stats.cellRenderMs.toFixed(2)),\n avgMs: Number(cellAvgMs.toFixed(3)),\n maxMs: Number(stats.cellRenderMaxMs.toFixed(3)),\n },\n });\n\n perfStatsRef.current = {\n wheelEvents: 0,\n wheelInputPx: 0,\n wheelHandlerMs: 0,\n wheelRafFlushes: 0,\n wheelRafMs: 0,\n rangeChangedCalls: 0,\n rangeChangedMs: 0,\n rowContentCalls: 0,\n rowContentMs: 0,\n rowContentMaxMs: 0,\n cellRenderCalls: 0,\n cellRenderMs: 0,\n cellRenderMaxMs: 0,\n };\n },\n [perfDebugEnabled],\n );\n\n useEffect(() => {\n if (!perfDebugEnabled || typeof window === \"undefined\") {\n return;\n }\n\n console.log(\"[VDT perf] enabled (localStorage vdt-perf-debug=1)\");\n\n const intervalId = window.setInterval(() => {\n flushPerfStats(\"interval\");\n }, 1500);\n\n return () => {\n window.clearInterval(intervalId);\n flushPerfStats(\"cleanup\");\n };\n }, [flushPerfStats, perfDebugEnabled]);\n\n // \uAC01 \uD14C\uC774\uBE14 \uC778\uC2A4\uD134\uC2A4\uBCC4\uB85C Scroller \uCEF4\uD3EC\uB10C\uD2B8 \uC0DD\uC131 (scrollbars, paddingX\uB97C \uCD08\uAE30\uAC12\uC73C\uB85C \uACE0\uC815)\n const VirtuosoScroller = useMemo(\n () =>\n forwardRef<HTMLDivElement, any>((props, ref) => {\n const scrollContainerRef = useRef<HTMLElement | null>(null);\n const wheelDeltaRef = useRef(0);\n const wheelRafRef = useRef<number | null>(null);\n\n // \uD720 \uC774\uBCA4\uD2B8\uB97C \uC9C1\uC811 \uC81C\uC5B4\uD574 \uBE0C\uB77C\uC6B0\uC800 smooth-scroll \uBCF4\uAC04 \uC5C6\uC774 \uC989\uC2DC scrollTop \uBC18\uC601\n useEffect(() => {\n const el = scrollContainerRef.current;\n if (!el) return;\n\n // \uD720 \uB378\uD0C0\uB97C \uD504\uB808\uC784 \uB2E8\uC704\uB85C \uD569\uC0B0 \uBC18\uC601\uD574 \uACFC\uB3C4\uD55C scrollTop \uAC31\uC2E0\uC744 \uC904\uC778\uB2E4.\n const handleWheel = (e: WheelEvent) => {\n const wheelStart = perfDebugEnabled\n ? performance.now()\n : 0;\n // \uAC00\uB85C \uD720(\uD2B8\uB799\uD328\uB4DC \uC606 \uBC00\uAE30 \u00B7 Shift+\uD720)\uC740 \uBE0C\uB77C\uC6B0\uC800\uC5D0 \uB9E1\uAE34\uB2E4 \u2014 \uC544\uB798\uC5D0\uC11C \uC138\uB85C\uB85C\uB9CC \uC62E\uAE30\uBBC0\uB85C \uB9C9\uC73C\uBA74\n // \uC5F4\uC774 \uB9CE\uC740 \uD45C(tableLayout=\"auto\")\uB97C \uC606\uC73C\uB85C \uBC00 \uC218 \uC5C6\uB2E4.\n if (e.shiftKey || Math.abs(e.deltaX) > Math.abs(e.deltaY)) {\n return;\n }\n // \uBA38\uB9AC \uC544\uB798 \uACE0\uC815 \uC904 \uC601\uC5ED(pinnedRows)\uCC98\uB7FC \uC548\uC5D0\uC11C \uB530\uB85C \uAD74\uB9AC\uB294 \uC0C1\uC790 \uC704\uC5D0\uC11C\uB294 \uADF8 \uC0C1\uC790\uB97C \uBA3C\uC800 \uAD74\uB9B0\uB2E4 \u2014\n // \uC5EC\uAE30\uC11C \uB9C9\uC73C\uBA74 \uADF8 \uC601\uC5ED\uC758 6\uBC88\uC9F8 \uC904\uBD80\uD130\uB294 \uBCFC \uBC29\uBC95\uC774 \uC5C6\uB2E4. \uB05D\uC5D0 \uB2FF\uC558\uC73C\uBA74 \uBCF8\uBB38\uC744 \uAD74\uB9B0\uB2E4.\n const inner = (e.target as HTMLElement | null)?.closest?.(\"[data-vdt-inner-scroll]\") as HTMLElement | null;\n if (inner && el.contains(inner)) {\n const canScroll =\n e.deltaY < 0\n ? inner.scrollTop > 0\n : inner.scrollTop + inner.clientHeight < inner.scrollHeight - 1;\n if (canScroll) return;\n }\n e.preventDefault();\n let delta = e.deltaY;\n // deltaMode 1 = \uB77C\uC778 \uB2E8\uC704, 2 = \uD398\uC774\uC9C0 \uB2E8\uC704 \uBCC0\uD658\n if (e.deltaMode === 1) {\n delta *= 40;\n } else if (e.deltaMode === 2) {\n delta *= el.clientHeight;\n }\n\n if (perfDebugEnabled) {\n perfStatsRef.current.wheelEvents += 1;\n perfStatsRef.current.wheelInputPx += delta;\n }\n\n wheelDeltaRef.current += delta;\n if (wheelRafRef.current !== null) {\n return;\n }\n\n wheelRafRef.current = requestAnimationFrame(() => {\n const rafStart = perfDebugEnabled\n ? performance.now()\n : 0;\n const maxStep = Math.max(\n el.clientHeight * 0.4,\n 160,\n );\n const batchedDelta = Math.max(\n -maxStep,\n Math.min(maxStep, wheelDeltaRef.current),\n );\n wheelDeltaRef.current = 0;\n wheelRafRef.current = null;\n if (batchedDelta !== 0) {\n el.scrollTop += batchedDelta;\n }\n if (perfDebugEnabled) {\n perfStatsRef.current.wheelRafFlushes += 1;\n perfStatsRef.current.wheelRafMs +=\n performance.now() - rafStart;\n }\n });\n\n if (perfDebugEnabled) {\n perfStatsRef.current.wheelHandlerMs +=\n performance.now() - wheelStart;\n }\n };\n\n el.addEventListener(\"wheel\", handleWheel, {\n passive: false,\n });\n return () => {\n el.removeEventListener(\"wheel\", handleWheel);\n if (wheelRafRef.current !== null) {\n cancelAnimationFrame(wheelRafRef.current);\n wheelRafRef.current = null;\n }\n wheelDeltaRef.current = 0;\n };\n }, []);\n\n return (\n <OverlayScrollbar\n detectInnerScroll={true}\n track={OVERLAY_SCROLLBAR_TRACK_CONFIG}\n {...scrollbars}\n >\n <TableContainer\n component={Box}\n {...props}\n ref={(node) => {\n scrollContainerRef.current =\n node as HTMLElement;\n if (typeof ref === \"function\") {\n ref(node as HTMLDivElement);\n } else if (ref) {\n ref.current = node as HTMLDivElement;\n }\n }}\n sx={{\n userSelect: \"auto\",\n WebkitUserSelect: \"auto\",\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n overflow: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n scrollbarWidth: \"none\",\n msOverflowStyle: \"none\",\n // \uAE5C\uBC15\uC784 \uBC29\uC9C0\uB97C \uC704\uD55C GPU \uAC00\uC18D\n transform: \"translateZ(0)\",\n backfaceVisibility: \"hidden\",\n willChange: \"scroll-position\",\n \"&::-webkit-scrollbar\": {\n display: \"none\",\n },\n \"& .MuiTable-root\": {\n // \uB178\uC158\uD48D\uC740 \uC88C\uC6B0 \uC5EC\uBC31\uC744 \uC885\uC774(Paper/Box) \uCABD\uC5D0 \uC900\uB2E4 \u2014 \uD14C\uB450\uB9AC\uAC00 \uC5EC\uBC31 \uC548\uCABD\uC5D0 \uADF8\uB824\uC838\uC57C \uD55C\uB2E4.\n paddingRight: notion ? 0 : paddingX,\n // \uC22B\uC790\uB294 px \uB85C \uC900\uB2E4 \u2014 sx \uC5D0 \uC22B\uC790\uB97C \uADF8\uB300\uB85C \uB123\uC73C\uBA74 MUI \uAC00 \uAC04\uACA9 \uB2E8\uC704(\u00D78)\uB85C \uC77D\uC5B4 106 \uC774 848px \uAC00 \uB410\uB2E4(1.7.1 \u00B7 \uAE00\uC740 \uADF8\uB300\uB85C 1.7.2)\n paddingTop: typeof paddingTop === \"number\" ? `${paddingTop}px` : paddingTop,\n paddingBottom: typeof paddingBottom === \"number\" ? `${paddingBottom}px` : paddingBottom,\n },\n }}\n />\n </OverlayScrollbar>\n );\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [], // \uBE48 \uBC30\uC5F4: \uCD5C\uCD08 \uB9C8\uC6B4\uD2B8 \uC2DC\uC5D0\uB9CC \uC0DD\uC131, scrollbars, paddingX, paddingTop, paddingBottom, notion \uC740 \uD074\uB85C\uC800\uB85C \uACE0\uC815\n );\n\n // Striped row \uBC30\uACBD\uC0C9 \uACC4\uC0B0\n const stripedRowColor = useMemo(() => {\n if (striped === true) {\n return \"#f5f5f5\"; // \uAE30\uBCF8 \uD68C\uC0C9\n } else if (typeof striped === \"string\") {\n return striped; // \uC0AC\uC6A9\uC790 \uC9C0\uC815 \uC0C9\uC0C1\n }\n return undefined; // \uBC30\uACBD\uC0C9 \uC5C6\uC74C\n }, [striped]);\n\n // \uB85C\uB529 \uC0C1\uD0DC \uAD00\uB9AC (\uC6D0\uBCF8 \uBC29\uC2DD)\n const [internalLoading, setInternalLoading] = useState(loading);\n\n // \uD14C\uC774\uBE14 \uC7AC\uB9C8\uC6B4\uD2B8\uB97C \uC704\uD55C \uD0A4 (\uB370\uC774\uD130\uAC00 \uBE44\uC6CC\uC9C0\uBA74 \uC7AC\uB9C8\uC6B4\uD2B8)\n const [tableKey, setTableKey] = useState(0);\n\n // \uB85C\uB529 \uC0C1\uD0DC \uBCC0\uACBD \uAC10\uC9C0\n useEffect(() => {\n if (loading) {\n // \uB85C\uB529\uC774 \uC2DC\uC791\uB418\uBA74 \uC989\uC2DC \uD45C\uC2DC\n setInternalLoading(true);\n }\n // \uB85C\uB529\uC774 \uB05D\uB098\uB3C4 internalLoading\uC740 handleLoadingComplete\uC5D0\uC11C\uB9CC false\uB85C \uC124\uC815\n // LoadingProgress\uC5D0\uC11C\uB294 visible={false}\uB85C \uD398\uC774\uB4DC\uC544\uC6C3\uC744 \uC2DC\uC791\uD568\n }, [loading]);\n\n // \uB85C\uB529 \uC644\uB8CC \uD578\uB4E4\uB7EC - LoadingProgress\uC758 \uD398\uC774\uB4DC\uC544\uC6C3\uC774 \uC644\uB8CC\uB41C \uD6C4 \uD638\uCD9C\uB428\n const handleLoadingComplete = useCallback(() => {\n setInternalLoading(false);\n }, []);\n\n // \uB85C\uB529 \uC624\uBC84\uB808\uC774 \uD45C\uC2DC \uC870\uAC74\n const shouldShowLoading = internalLoading;\n\n // \uB354\uBCF4\uAE30 \uB85C\uB529 \uC5EC\uBD80 (\uB370\uC774\uD130\uAC00 \uC788\uACE0 \uB85C\uB529 \uC911\uC774\uBA74 \uB354\uBCF4\uAE30 \uB85C\uB529)\n const isLoadMoreLoading = loading && data.length > 0;\n\n // \uBB34\uD55C \uC2A4\uD06C\uB864 \uB85C\uB529 \uC0C1\uD0DC (\uAE30\uC874 VirtualDataTable \uBC29\uC2DD)\n const isLoadingMoreRef = useRef(false);\n // \uC9C1\uC804\uC5D0 loadMore \uB97C \uC694\uCCAD\uD55C \uC2DC\uC810\uC758 \uB370\uC774\uD130 \uAE38\uC774. \uC694\uCCAD \uD6C4 \uAE38\uC774\uAC00 \uB298\uC9C0 \uC54A\uC558\uB2E4\uBA74\n // (= \uC11C\uBC84\uC5D0 \uB354 \uC774\uC0C1 \uB370\uC774\uD130 \uC5C6\uC74C) \uAC19\uC740 \uAE38\uC774\uB85C\uB294 \uB2E4\uC2DC \uC694\uCCAD\uD558\uC9C0 \uC54A\uC544, \uBC14\uB2E5\uC5D0\uC11C\n // endReached \u2194 onLoadMore \uAC00 \uBB34\uD55C \uBC18\uBCF5\uB418\uB294 \uAC83\uC744 \uB9C9\uB294\uB2E4.\n const lastLoadMoreLengthRef = useRef<number>(-1);\n const virtuosoRef = useRef<any>(null); // TableVirtuoso ref\n // \uC904\uB4E4\uC774 \uC2A4\uD06C\uB864 \uC601\uC5ED\uBCF4\uB2E4 \uAE34\uAC00 \u2014 \uAE38\uBA74 \uB9E8 \uB05D \uC904\uC774 \uD2C0 \uBC14\uB2E5\uC5D0 \uB2FF\uC73C\uBBC0\uB85C \uADF8 \uC904\uC758 \uC544\uB798\uC120\uC744 \uBE80\uB2E4(\uC544\uB798 \uB178\uC158 \uC2A4\uD0C0\uC77C).\n const scrollerElRef = useRef<HTMLElement | null>(null);\n const [listOverflows, setListOverflows] = useState(false);\n const checkListOverflow = useCallback(() => {\n const el = scrollerElRef.current;\n if (el) setListOverflows(el.scrollHeight > el.clientHeight + 1);\n }, []);\n useEffect(() => {\n const el = scrollerElRef.current;\n if (!el || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(() => checkListOverflow());\n observer.observe(el);\n return () => observer.disconnect();\n }, [checkListOverflow, autoHeight]);\n\n // \uC18C\uBE44\uCC98\uAC00 \uC778\uB77C\uC778\uC73C\uB85C \uB118\uAE30\uB294 \uCF5C\uBC31(onRowClick/getRowId)\uC740 \uB9E4 \uB80C\uB354\uB9C8\uB2E4 identity \uAC00 \uBC14\uB010\uB2E4.\n // \uC774\uB97C ref \uB85C \uC7A1\uC544 \uB450\uBA74 VirtuosoTableComponents(memo)\uB97C \uC7AC\uC0DD\uC131\uD558\uC9C0 \uC54A\uC544\uB3C4 \uCD5C\uC2E0 \uCF5C\uBC31\uC744 \uC4F8 \uC218 \uC788\uC5B4,\n // \uAC80\uC0C9/\uD544\uD130\uB85C \uBD80\uBAA8\uAC00 \uB9AC\uB80C\uB354\uB3FC\uB3C4 \uD589(\uBC0F \uC774\uBBF8\uC9C0)\uC774 \uB9AC\uB9C8\uC6B4\uD2B8\uB418\uC9C0 \uC54A\uB294\uB2E4(\uC0AC\uC9C4 \uAE5C\uBE61\uC784 \uBC29\uC9C0).\n const onRowClickRef = useRef(onRowClick);\n onRowClickRef.current = onRowClick;\n const getRowIdRef = useRef(getRowId);\n getRowIdRef.current = getRowId;\n const onRowContextMenuRef = useRef(onRowContextMenu);\n onRowContextMenuRef.current = onRowContextMenu;\n const onEndReachedRef = useRef(onEndReached);\n onEndReachedRef.current = onEndReached;\n // \uACE0\uC815 \uC904(pinnedRows)\uC740 \uBA38\uB9AC \uC548\uC5D0 \uADF8\uB9AC\uB294\uB370 \uBA38\uB9AC \uB0B4\uC6A9\uC774 \uC904 \uBD80\uD488\uBCF4\uB2E4 \uBA3C\uC800 \uB9CC\uB4E4\uC5B4\uC9C4\uB2E4 \u2014 \uC904 \uBD80\uD488\uC740 ref \uB85C \uB2A6\uAC8C \uC7A1\uB294\uB2E4.\n const rowComponentRef = useRef<React.ComponentType<any> | null>(null);\n\n // \uC5F4 \uD3ED \uB04C\uC5B4 \uBC14\uAFB8\uAE30(1.8.0) \u2014 \uD3F0 \uBAA9\uB85D\uC740 \uCE78 \uD558\uB098\uB77C \uC5F4 \uD3ED\uC774 \uC5C6\uC5B4 \uC190\uC7A1\uC774\uB3C4 \uBC14\uAFBC \uD3ED\uB3C4 \uC4F0\uC9C0 \uC54A\uB294\uB2E4.\n const resizeConfig = columnResize === true ? {} : columnResize || null;\n const resizeOn = Boolean(resizeConfig) && !mobileList;\n const resizeMinDefault = resizeConfig?.minWidth ?? 48;\n // \uB193\uC740 \uB4A4 \uC18C\uBE44\uCC98\uAC00 \uC0C8 \uD3ED\uC744 \uB118\uACA8 \uC904 \uB54C\uAE4C\uC9C0 \uC950\uB294 \uAC12 \u2014 \uC800\uC7A5\uC774 \uB2A6\uC5B4\uB3C4 \uB193\uC740 \uD3ED\uC774 \uC61B \uD3ED\uC73C\uB85C \uD280\uC9C0 \uC54A\uAC8C. \uC18C\uBE44\uCC98\uAC00 \uD3ED\uC744 \uB118\uAE30\uC9C0 \uC54A\uC73C\uBA74 \uC774\uAC83\uC774 \uACE7 \uD45C \uC548 \uAE30\uC5B5\uC774\uB2E4.\n const [localWidths, setLocalWidths] = useState<VDTColumnWidths | null>(null);\n useEffect(() => {\n setLocalWidths(null);\n }, [columnWidths]);\n const activeWidths: VDTColumnWidths = resizeOn ? (localWidths ?? columnWidths ?? EMPTY_WIDTHS) : EMPTY_WIDTHS;\n const activeWidthsRef = useRef(activeWidths);\n activeWidthsRef.current = activeWidths;\n const onColumnWidthsChangeRef = useRef(onColumnWidthsChange);\n onColumnWidthsChangeRef.current = onColumnWidthsChange;\n const columnsRef = useRef(columns);\n columnsRef.current = columns;\n const tableBoxRef = useRef<HTMLDivElement | null>(null);\n // \uB04C\uC5B4 \uC62E\uAE30\uAE30(1.9.0)\uC758 \uC790\uB3D9 \uC2A4\uD06C\uB864\uC774 \uAD74\uB9B4 \uC694\uC18C \u2014 \uBC14\uAE65 \uC2A4\uD06C\uB864\uC774\uBA74 \uADF8\uAC83, \uC544\uB2C8\uBA74 \uD45C\uC758 \uC2A4\uD06C\uB864\uB7EC(autoHeight \uB294 null \u2192 \uAC00\uAE4C\uC6B4 \uAD74\uB9AC\uB294 \uC870\uC0C1 \u00B7 \uBB38\uC11C)\n reorderScrollerRef.current = () => (external ? (scrollParent as HTMLElement | null) : autoHeight ? null : scrollerElRef.current);\n\n /**\n * \uBC14\uAFBC \uD3ED \u2192 \uD45C \uC0C1\uC790\uC758 CSS \uBCC0\uC218. \uCE78 \uD3ED\uC740 --vdt-cw-\uC5F4\uC21C\uBC88, \uD45C \uCD5C\uC18C \uD3ED\uC740 --vdt-tmin, \uBAA8\uB4E0 \uC5F4 \uD3ED\uC774 \uC815\uD574\uC84C\uC73C\uBA74 \uD45C \uD3ED --vdt-tw.\n * \uD45C \uD3ED\uC744 100% \uB85C \uB450\uBA74 \uBAA8\uB4E0 \uC5F4\uC774 \uC22B\uC790\uC77C \uB54C \uB0A8\uB294 \uD3ED\uC774 \uC5F4\uB9C8\uB2E4 \uB098\uB220\uC838 \uB048 \uD3ED\uACFC \uADF8\uB824\uC9C4 \uD3ED\uC774 \uC5B4\uAE0B\uB09C\uB2E4 \u2014 \uADF8\uB54C\uB294 \uD45C\uB97C \uC5F4 \uD3ED \uD569\uC73C\uB85C \uC138\uC6B4\uB2E4.\n * \uB0A8\uB294 \uD3ED\uC744 \uAC16\uB294 \uC5F4(width \uC5C6\uC74C)\uC774 \uC788\uC73C\uBA74 \uD45C \uCD5C\uC18C \uD3ED\uC5D0 \uADF8 \uC5F4\uC758 \uCD5C\uC18C \uD3ED\uC744 \uB123\uB294\uB2E4 \u2014 \uC606 \uC5F4\uC744 \uB113\uD788\uB2E4 0 \uC73C\uB85C \uC811\uD788\uC9C0 \uC54A\uAC8C.\n */\n const computeResizeVars = useCallback(\n (widths: VDTColumnWidths): Record<string, string> => {\n const vars: Record<string, string> = {};\n let changed = false;\n let allFixed = true;\n let minSum = 0;\n let fixedSum = 0;\n columns.forEach((col, index) => {\n const w = widths[String(col.id)];\n if (typeof w === \"number\" && Number.isFinite(w) && w > 0) {\n const cw = Math.max(col.minWidth ?? resizeMinDefault, Math.round(w));\n vars[`--vdt-cw-${index}`] = `${cw}px`;\n changed = true;\n minSum += cw;\n fixedSum += cw;\n } else if (typeof col.width === \"number\") {\n minSum += col.width;\n fixedSum += col.width;\n } else {\n allFixed = false;\n minSum += col.minWidth ?? resizeMinDefault;\n }\n });\n if (changed) {\n vars[\"--vdt-tmin\"] = `${minSum}px`;\n if (allFixed) vars[\"--vdt-tw\"] = `${fixedSum}px`;\n }\n return vars;\n },\n [columns, resizeMinDefault],\n );\n const computeResizeVarsRef = useRef(computeResizeVars);\n computeResizeVarsRef.current = computeResizeVars;\n const resizeVars = useMemo(\n () => (resizeOn ? computeResizeVars(activeWidths) : null),\n [resizeOn, computeResizeVars, activeWidths],\n );\n\n /**\n * \uCE78 \uD3ED style. \uB04C\uC5B4 \uBC14\uAFB8\uAE30\uB97C \uCF1C\uBA74 \uD45C \uC0C1\uC790\uC758 CSS \uBCC0\uC218\uB97C \uBA3C\uC800 \uBCF8\uB2E4 \u2014 \uB044\uB294 \uB3D9\uC548 \uCE78\uC744 \uB2E4\uC2DC \uADF8\uB9AC\uC9C0 \uC54A\uACE0 \uBCC0\uC218 \uD558\uB098\uB85C \uBA38\uB9AC \u00B7 \uBCF8\uBB38 \u00B7 \uD569\uACC4 \uCE78\uC774 \uD568\uAED8 \uBC14\uB010\uB2E4.\n * \uBCC0\uC218\uAC00 \uC5C6\uC73C\uBA74 \uC6D0\uB798 \uD3ED(\uC5C6\uC73C\uBA74 auto)\uC774\uB2E4.\n */\n const colWidthStyle = useCallback(\n (col: DataColumn<T>, index: number, minWidth: string | number | undefined): React.CSSProperties => {\n if (!resizeOn) return { width: col.width, minWidth };\n const name = `--vdt-cw-${index}`;\n const w = cssPx(col.width);\n const m = cssPx(minWidth);\n return {\n width: w !== undefined ? `var(${name}, ${w})` : `var(${name})`,\n minWidth: m !== undefined ? `var(${name}, ${m})` : `var(${name})`,\n };\n },\n [resizeOn],\n );\n\n // \uACE0\uC815 \uC5F4(pinned: \"left\")\uC774 \uBD99\uC744 \uC67C\uCABD \uC790\uB9AC \u2014 \uC55E\uCABD \uACE0\uC815 \uC5F4 \uD3ED\uC758 \uD569. \uACE0\uC815 \uC5F4\uC774 \uC544\uB2C8\uBA74 \uC5C6\uB2E4.\n // \uB04C\uC5B4 \uBC14\uAFB8\uAE30\uB97C \uCF1C\uBA74 \uC55E \uC5F4 \uD3ED\uC774 CSS \uBCC0\uC218\uB77C \uD569\uB3C4 calc \uB85C \uB454\uB2E4.\n const pinnedLeft = useMemo(() => {\n const map = new Map<string, number | string>();\n let left = 0;\n const parts: string[] = [];\n columns.forEach((col, index) => {\n if (col.pinned !== \"left\") return;\n map.set(String(col.id), resizeOn && parts.length > 0 ? `calc(${parts.join(\" + \")})` : left);\n const w = typeof col.width === \"number\" ? col.width : 0;\n left += w;\n parts.push(`var(--vdt-cw-${index}, ${w}px)`);\n });\n return map;\n }, [columns, resizeOn]);\n // \uD45C \uCD5C\uC18C \uD3ED \u2014 minWidth \uB97C \uC900 \uC5F4\uC774 \uC788\uC744 \uB54C\uB9CC. \uC5F4\uB9C8\uB2E4 width(\uC22B\uC790) \uB610\uB294 minWidth \uC758 \uD569\uC774\uACE0, \uD2C0\uC774 \uC881\uC73C\uBA74 \uAC00\uB85C\uB85C \uBBFC\uB2E4.\n const tableMinWidth = useMemo(() => {\n if (!columns.some((col) => typeof col.minWidth === \"number\")) return undefined;\n return columns.reduce(\n (sum, col) =>\n sum + (typeof col.width === \"number\" ? col.width : typeof col.minWidth === \"number\" ? col.minWidth : 0),\n 0,\n );\n }, [columns]);\n /** \uACE0\uC815 \uC5F4 \uCE78\uC758 sticky \uC790\uB9AC. \uBA38\uB9AC \uCE78\uC740 \uBCF8\uBB38 \uACE0\uC815 \uCE78\uBCF4\uB2E4 \uC704(zIndex 3)\uC5D0 \uC120\uB2E4. */\n const pinnedStyle = useCallback(\n (col: DataColumn<T>, head: boolean): React.CSSProperties => {\n const left = pinnedLeft.get(String(col.id));\n if (left === undefined) return {};\n return { position: \"sticky\", left, zIndex: head ? 3 : 1 };\n },\n [pinnedLeft],\n );\n // truthiness \uAC00 \uBC14\uB00C\uBA74(\uD074\uB9AD \uAC00\uB2A5 \uC5EC\uBD80) hover/cursor \uC2A4\uD0C0\uC77C\uC774 \uB2EC\uB77C\uC9C0\uBBC0\uB85C deps \uC5D0\uB294 boolean \uB9CC \uB123\uB294\uB2E4.\n const hasRowClick = !!onRowClick;\n\n // \uC2A4\uD06C\uB864 \uCEE8\uD14C\uC774\uB108 \uCC38\uC870 (OverlayScrollbar\uC6A9)\n const isScrollDraggingRef = useRef(false); // OverlayScrollbar \uB4DC\uB798\uADF8 \uC2A4\uD06C\uB864 \uAC10\uC9C0\uC6A9\n const mouseDownPositionRef = useRef({ x: 0, y: 0 }); // \uB9C8\uC6B0\uC2A4 \uB2E4\uC6B4 \uC2DC\uC791 \uC704\uCE58\n\n useEffect(() => {\n const handleDocumentMouseMove = (event: MouseEvent) => {\n const dx = event.clientX - mouseDownPositionRef.current.x;\n const dy = event.clientY - mouseDownPositionRef.current.y;\n if (Math.sqrt(dx * dx + dy * dy) > ROW_CLICK_DRAG_THRESHOLD_PX) {\n isScrollDraggingRef.current = true;\n }\n };\n\n document.addEventListener(\"mousemove\", handleDocumentMouseMove);\n return () => {\n document.removeEventListener(\"mousemove\", handleDocumentMouseMove);\n };\n }, []);\n\n // \uC815\uB82C\uC774 \uBCC0\uACBD\uB420 \uB54C \uBAA8\uB4E0 TableSortLabel\uC758 hover \uC0C1\uD0DC \uCD08\uAE30\uD654\n useEffect(() => {\n // sortBy\uAC00 \uBCC0\uACBD\uB418\uBA74 \uBAA8\uB4E0 TableSortLabel \uC694\uC18C\uC758 hover \uC0C1\uD0DC\uB97C \uAC15\uC81C\uB85C \uCD08\uAE30\uD654\n const tableContainer = document.querySelector(\n '[data-testid=\"virtuoso-scroller\"]',\n );\n if (tableContainer) {\n const sortLabels = tableContainer.querySelectorAll(\n \".MuiTableSortLabel-root\",\n );\n sortLabels.forEach((label) => {\n // \uB9C8\uC6B0\uC2A4 \uC774\uBCA4\uD2B8\uB97C \uC2DC\uBBAC\uB808\uC774\uC158\uD558\uC5EC hover \uC0C1\uD0DC \uD574\uC81C\n const mouseLeaveEvent = new MouseEvent(\"mouseleave\", {\n bubbles: true,\n cancelable: true,\n });\n label.dispatchEvent(mouseLeaveEvent);\n });\n }\n }, [sortBy]);\n\n // \uC815\uB82C \uD578\uB4E4\uB7EC\n const handleSort = useCallback(\n (columnId: string) => {\n if (!onSort) return;\n\n const newDirection: SortDirection =\n sortBy === columnId && sortDirection === \"asc\" ? \"desc\" : \"asc\";\n\n onSort(columnId, newDirection);\n },\n [onSort, sortBy, sortDirection],\n );\n\n /**\n * \uBA38\uB9AC \uC6B0\uD074\uB9AD \uBA54\uB274(1.4.0). \uC5F4\uC740 \uC694\uC18C\uAC00 \uC544\uB2C8\uB77C id \uB85C \uC954\uB2E4 \u2014 \uAC12\uC744 \uACE0\uB974\uBA74 \uC18C\uBE44\uCC98\uAC00 columns \uB97C \uC0C8\uB85C \uB9CC\uB4E4\uC5B4 \uBA38\uB9AC \uCE78\uC774 \uB2E4\uC2DC \uADF8\uB824\uC9C0\uB294\uB370,\n * \uC694\uC18C\uB97C \uC950\uBA74 \uC61B \uC694\uC18C\uC5D0 \uBD99\uC5B4 \uBA54\uB274\uAC00 \uC5C9\uB6B1\uD55C \uB370\uB85C \uAC00\uAC70\uB098 \uB2EB\uD78C\uB2E4. \uC790\uB9AC\uB3C4 \uC88C\uD45C\uB85C \uB454\uB2E4(\uB204\uB978 x \u00B7 \uBA38\uB9AC \uCE78 \uBC14\uB2E5 y).\n */\n const [headerMenu, setHeaderMenu] = useState<{ colId: string; x: number; y: number } | null>(null);\n const onHeaderContextMenuRef = useRef(onHeaderContextMenu);\n onHeaderContextMenuRef.current = onHeaderContextMenu;\n const onSortRef = useRef(onSort);\n onSortRef.current = onSort;\n\n /**\n * \uBA38\uB9AC \uCE78 \uC6B0\uD074\uB9AD \u2014 \uBE0C\uB77C\uC6B0\uC800 \uBA54\uB274\uB294 \uB298 \uB9C9\uB294\uB2E4(\uBA38\uB9AC\uC5D0\uC11C \"\uB4A4\uB85C \u00B7 \uC0C8\uB85C\uACE0\uCE68\" \uBA54\uB274\uB294 \uC4F8 \uB370\uAC00 \uC5C6\uACE0, \uC815\uB82C \u00B7 \uAC70\uB974\uAE30 \uBA54\uB274\uC640 \uACB9\uCCD0 \uB72C\uB2E4).\n * \uC18C\uBE44\uCC98 \uCC98\uB9AC(headerProps.onContextMenu \u00B7 onHeaderContextMenu)\uAC00 \uBA3C\uC800\uB2E4 \u2014 \uADF8\uCABD\uC774 preventDefault \uD588\uAC70\uB098 true \uB97C \uB3CC\uB824\uC8FC\uBA74 \uAE30\uBCF8 \uBA54\uB274\uB97C \uB744\uC6B0\uC9C0 \uC54A\uB294\uB2E4.\n * \uADF8\uB798\uC11C \uB9C9\uB294 preventDefault \uB294 \uC18C\uBE44\uCC98\uB97C \uBD80\uB978 \uB4A4\uC5D0 \uD55C\uB2E4(\uBA3C\uC800 \uB9C9\uC73C\uBA74 \"\uCC98\uB9AC\uD588\uB2E4\" \uB97C \uAC00\uB824\uB0BC \uC218 \uC5C6\uB2E4).\n */\n const handleHeaderContextMenu = useCallback(\n (col: DataColumn<T> | null, event: React.MouseEvent<HTMLTableCellElement>) => {\n if (!col) {\n event.preventDefault();\n return;\n }\n col.headerProps?.onContextMenu?.(event);\n let handled = event.defaultPrevented;\n if (!handled) handled = onHeaderContextMenuRef.current?.(col, event) === true || event.defaultPrevented;\n event.preventDefault();\n if (handled || col.headerMenu === false) return;\n const canSort = Boolean((col.sortMenu ?? col.sortable) && onSortRef.current);\n if (!canSort && !hasColumnFilter(col)) return;\n const rect = event.currentTarget.getBoundingClientRect();\n setHeaderMenu({ colId: String(col.id), x: event.clientX, y: rect.bottom });\n },\n [],\n );\n\n /**\n * \uC5F4 \uD3ED \uB04C\uAE30 \uC2DC\uC791(1.8.0). \uBA38\uB9AC \uCE78\uC758 \uB04C\uC5B4 \uC62E\uAE30\uAE30(draggable) \u00B7 \uAE00\uC790 \uACE0\uB974\uAE30 \u00B7 \uC815\uB82C \uD074\uB9AD\uC774 \uD568\uAED8 \uC2DC\uC791\uB418\uC9C0 \uC54A\uAC8C \uC5EC\uAE30\uC11C \uB04A\uB294\uB2E4.\n * \uC2DC\uC791 \uD3ED\uC740 \uADF8\uB824\uC9C4 \uCE78 \uD3ED\uC744 \uC7B0\uB2E4 \u2014 \uD3ED\uC744 \uBE44\uC6B4 \uC5F4 \u00B7 % \uC5F4\uB3C4 \uC9C0\uAE08 \uBCF4\uC774\uB294 \uD3ED\uC5D0\uC11C \uC774\uC5B4 \uAC04\uB2E4.\n */\n const handleResizeMouseDown = useCallback(\n (col: DataColumn<T>, event: React.MouseEvent<HTMLElement>) => {\n if (event.button !== 0) return;\n event.preventDefault();\n event.stopPropagation();\n const handle = event.currentTarget;\n const th = handle.closest(\"th\");\n const box = tableBoxRef.current;\n if (!th || !box) return;\n const startWidth = headerCellWidth(th);\n const startX = event.clientX;\n const key = String(col.id);\n const min = col.minWidth ?? resizeMinDefault;\n let base = activeWidthsRef.current;\n // \uB0A8\uB294 \uD3ED\uC744 \uAC16\uB294 \uC5F4(width \uC5C6\uC74C)\uC774 \uC5C6\uB294 \uD45C\uB294 \uBE0C\uB77C\uC6B0\uC800\uAC00 \uB0A8\uB294 \uD3ED\uC744 \uBAA8\uB4E0 \uC5F4\uC5D0 \uB098\uB220 \uADF8\uB9B0\uB2E4. \uD55C \uC5F4\uC744 \uBC14\uAFB8\uBA74 \uD45C\uAC00 \uC5F4 \uD3ED \uD569\uC73C\uB85C \uC11C\uBA74\uC11C\n // \uB2E4\uB978 \uC5F4\uC774 \uBAA8\uB450 \uC120\uC5B8 \uD3ED\uC73C\uB85C \uC6C0\uCC14 \uC904\uC5C8\uB2E4(1.8.1) \u2014 \uADF8\uB798\uC11C \uC9C0\uAE08 \uADF8\uB824\uC9C4 \uD3ED\uC744 \uBAA8\uB4E0 \uC5F4\uC758 \uD3ED\uC73C\uB85C \uBD99\uC7A1\uACE0 \uC2DC\uC791\uD55C\uB2E4.\n const cols = columnsRef.current;\n const hasFlex = cols.some((c) => !(String(c.id) in base) && typeof c.width !== \"number\");\n if (!hasFlex) {\n const snap: VDTColumnWidths = { ...base };\n box.querySelectorAll<HTMLElement>(\"thead th [data-vdt-col]\").forEach((h) => {\n const c = cols[Number(h.getAttribute(\"data-vdt-col\"))];\n const cell = h.closest(\"th\");\n if (!c || !cell || String(c.id) in snap) return;\n snap[String(c.id)] = Math.round(headerCellWidth(cell));\n });\n base = snap;\n }\n let next = base;\n let moved = false;\n let raf = 0;\n handle.setAttribute(\"data-active\", \"\");\n // \uB044\uB294 \uB3D9\uC548 \uC190\uC774 \uCE78 \uBC16\uC73C\uB85C \uB098\uAC00\uB3C4 \uCEE4\uC11C\uAC00 \uBC14\uB00C\uC9C0 \uC54A\uAC8C\n const prevCursor = document.body.style.cursor;\n document.body.style.cursor = \"col-resize\";\n const onMove = (ev: MouseEvent) => {\n const dx = ev.clientX - startX;\n if (!moved && Math.abs(dx) < RESIZE_DRAG_THRESHOLD_PX) return;\n moved = true;\n next = { ...base, [key]: Math.max(min, Math.round(startWidth + dx)) };\n if (!raf) {\n raf = requestAnimationFrame(() => {\n raf = 0;\n applyResizeVars(box, computeResizeVarsRef.current(next));\n });\n }\n };\n const onUp = () => {\n document.removeEventListener(\"mousemove\", onMove);\n document.removeEventListener(\"mouseup\", onUp);\n if (raf) cancelAnimationFrame(raf);\n handle.removeAttribute(\"data-active\");\n document.body.style.cursor = prevCursor;\n if (!moved) return;\n applyResizeVars(box, computeResizeVarsRef.current(next));\n // \uB193\uC740 \uC790\uB9AC\uC758 click \uC774 \uBA38\uB9AC \uCE78(\uC815\uB82C \u00B7 \uC18C\uBE44\uCC98 \uBA38\uB9AC \uD074\uB9AD)\uC73C\uB85C \uAC00\uC9C0 \uC54A\uAC8C \uD55C \uBC88 \uC0BC\uD0A8\uB2E4 \u2014 click \uC740 mouseup \uBC14\uB85C \uB4A4 \uAC19\uC740 \uCC28\uB840\uC5D0 \uC628\uB2E4.\n const swallow = (ce: MouseEvent) => {\n ce.stopPropagation();\n ce.preventDefault();\n };\n window.addEventListener(\"click\", swallow, true);\n window.setTimeout(() => window.removeEventListener(\"click\", swallow, true), 0);\n setLocalWidths(next);\n onColumnWidthsChangeRef.current?.(next);\n };\n document.addEventListener(\"mousemove\", onMove);\n document.addEventListener(\"mouseup\", onUp);\n },\n [resizeMinDefault],\n );\n\n /**\n * \uACBD\uACC4 \uB450 \uBC88 \uB204\uB974\uAE30 \u2014 \uADF8 \uC5F4\uC744 \uCC98\uC74C \uD3ED\uC73C\uB85C. \uBC14\uAFBC \uC801 \uC5C6\uB294 \uC5F4\uC774\uBA74 \uC544\uBB34\uAC83\uB3C4 \uD558\uC9C0 \uC54A\uB294\uB2E4.\n * \uB0A8\uB294 \uD3ED\uC744 \uAC16\uB294 \uC5F4\uC774 \uC5C6\uB294 \uD45C\uB294 \uCCAB \uB04C\uAE30 \uB54C \uBAA8\uB4E0 \uC5F4 \uD3ED\uC744 \uBD99\uC7A1\uC558\uC73C\uBBC0\uB85C(handleResizeMouseDown) \uD0A4\uB9CC \uBE7C\uBA74 \uC120\uC5B8 \uD3ED(\uB298\uC5B4\uB098\uAE30 \uC804)\uC73C\uB85C \uC904\uC5B4\uB4E0\uB2E4 \u2014\n * \uCC98\uC74C \uD654\uBA74\uC5D0\uC11C \uB298\uC5B4\uB098 \uC788\uB358 \uD3ED(\uC120\uC5B8 \uD3ED \u00D7 \uD2C0 \uD3ED / \uC120\uC5B8 \uD3ED \uD569)\uC73C\uB85C \uB418\uB3CC\uB9AC\uACE0, \uBAA8\uB4E0 \uC5F4\uC774 \uADF8 \uD3ED\uC774\uBA74 \uBC14\uAFBC \uD3ED\uC744 \uD1B5\uC9F8\uB85C \uBE44\uC6B4\uB2E4(\uCC98\uC74C \uC0C1\uD0DC).\n */\n const handleResizeDoubleClick = useCallback((col: DataColumn<T>, event: React.MouseEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n const key = String(col.id);\n const base = activeWidthsRef.current;\n if (!(key in base)) return;\n let next: VDTColumnWidths = { ...base };\n delete next[key];\n const cols = columnsRef.current;\n const table = tableBoxRef.current?.querySelector(\"table\");\n const parent = table?.parentElement;\n if (table && parent && cols.every((c) => typeof c.width === \"number\")) {\n const declaredSum = cols.reduce((sum, c) => sum + (c.width as number), 0);\n // \uD45C\uB294 width 100% \uB77C \uBD80\uBAA8 \uD3ED\uC744 \uADF8\uB300\uB85C \uBC1B\uB294\uB2E4(\uC624\uB978\uCABD \uB367\uC5EC\uBC31\uC740 \uD3ED\uC744 \uC904\uC774\uC9C0 \uC54A\uACE0 \uBC14\uAE65\uC73C\uB85C \uBD99\uB294\uB2E4).\n const avail = parent.clientWidth;\n const scale = declaredSum > 0 ? Math.max(1, avail / declaredSum) : 1;\n const initial = (c: DataColumn<T>) => Math.round((c.width as number) * scale);\n if (scale > 1) next[key] = initial(col);\n // \uBAA8\uB450 \uCC98\uC74C \uD3ED\uC774\uBA74 \uBD99\uC7A1\uC740 \uD3ED\uC744 \uB2E4 \uBE44\uC6B4\uB2E4 \u2014 \uC800\uC7A5\uB41C \uAC12 \uC5C6\uC774 \uCC98\uC74C \uADF8\uB300\uB85C \uADF8\uB9AC\uAC8C(\uD2C0 \uD3ED\uC774 \uBC14\uB00C\uBA74 \uB2E4\uC2DC \uB298\uC5B4\uB09C\uB2E4).\n if (cols.every((c) => !(String(c.id) in next) || Math.abs(next[String(c.id)] - initial(c)) <= 1)) next = {};\n }\n setLocalWidths(next);\n onColumnWidthsChangeRef.current?.(next);\n }, []);\n\n /** \uBA38\uB9AC \uCE78 \uC624\uB978\uCABD \uACBD\uACC4\uC758 \uC190\uC7A1\uC774 \u2014 \uBAA8\uC591(\uD638\uBC84 \uB54C \uC587\uC740 \uC120)\uC740 \uD45C \uC0C1\uC790 sx \uC758 [data-vdt-resize] \uAC00 \uC815\uD55C\uB2E4. */\n const renderResizeHandle = useCallback(\n (col: DataColumn<T>) =>\n resizeOn && col.id !== REORDER_COLUMN_ID ? (\n <span\n data-vdt-resize=\"\"\n data-vdt-col={columns.indexOf(col)}\n aria-hidden\n onMouseDown={(e) => handleResizeMouseDown(col, e)}\n onDoubleClick={(e) => handleResizeDoubleClick(col, e)}\n // \uC190\uC7A1\uC774 \uD074\uB9AD\uC774 \uBA38\uB9AC \uCE78 \uD074\uB9AD(\uC18C\uBE44\uCC98 headerProps.onClick)\uC73C\uB85C \uBC88\uC9C0\uC9C0 \uC54A\uAC8C\n onClick={(e) => e.stopPropagation()}\n />\n ) : null,\n [resizeOn, handleResizeMouseDown, handleResizeDoubleClick, columns],\n );\n\n /** \uBA38\uB9AC\uAE00 \u2014 \uAC70\uB97C \uC218 \uC788\uB294 \uC5F4\uC740 \uAC70\uB974\uAE30 \uC544\uC774\uCF58\uC744 \uBD99\uC774\uACE0, \uAC78\uB824 \uC788\uC73C\uBA74 \uAC15\uC870\uC0C9\uC73C\uB85C \uC120\uB2E4(\uAC78\uB9B0 \uC904 \uBAA8\uB974\uACE0 \"\uC65C \uBA87 \uC904 \uC5C6\uC9C0\" \uD558\uC9C0 \uC54A\uAC8C). */\n const renderHeaderText = useCallback(\n (col: DataColumn<T>) => {\n if (!hasColumnFilter(col)) return col.text;\n const active = Boolean(col.filterValues && col.filterValues.length > 0);\n // \uAC70\uB974\uAE30 \uC544\uC774\uCF58\uC740 \uB298 \uBCF4\uC774\uB2C8 \uAE00\uC790\uC640 \uD55C \uBB36\uC74C\uC73C\uB85C \uC120\uB2E4 \u2014 \uAC00\uC6B4\uB370 \uB9DE\uCDA4\uC774\uBA74 \uBB36\uC74C\uC774 \uAC00\uC6B4\uB370(1.10.3, 1.10.1 \uC758 \uBC16\uC5D0 \uB744\uC6B0\uAE30\uB97C \uB418\uB3CC\uB9BC).\n // \uC815\uB82C \uD654\uC0B4\uD45C\uB9CC \uD638\uBC84 \uB54C \uBCF4\uC774\uB294 \uAC83\uC774\uB77C \uBB36\uC74C \uBC16(left: 100%)\uC5D0 \uB72C\uB2E4.\n return (\n <Box\n component=\"span\"\n sx={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 0.5,\n maxWidth: \"100%\",\n color: active ? \"primary.main\" : undefined,\n fontWeight: active ? 600 : undefined,\n verticalAlign: \"middle\",\n }}\n >\n <Box component=\"span\" sx={{ overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\n {col.text}\n </Box>\n <HeaderFilterIcon active={active} />\n </Box>\n );\n },\n [],\n );\n\n // \uC2A4\uD06C\uB864 \uB05D \uADFC\uCC98\uC5D0\uC11C\uB9CC \uCD94\uAC00 \uB85C\uB4DC\uB97C \uC2E4\uD589\uD574 scroll \uD56B\uD328\uC2A4 \uBD80\uB2F4\uC744 \uC904\uC778\uB2E4.\n const handleEndReached = useCallback(\n (endIndex: number) => {\n const rangeStart = perfDebugEnabled ? performance.now() : 0;\n onEndReachedRef.current?.();\n if (!onLoadMore) {\n if (perfDebugEnabled) {\n perfStatsRef.current.rangeChangedCalls += 1;\n perfStatsRef.current.rangeChangedMs +=\n performance.now() - rangeStart;\n }\n return;\n }\n\n if (loading && data.length === 0) {\n if (perfDebugEnabled) {\n perfStatsRef.current.rangeChangedCalls += 1;\n perfStatsRef.current.rangeChangedMs +=\n performance.now() - rangeStart;\n }\n return;\n }\n\n const hasMinimumData = data.length >= 30;\n const nearEnd = endIndex >= data.length - 1;\n\n // \uC9C1\uC804 \uC694\uCCAD \uC774\uD6C4 \uAE38\uC774\uAC00 \uADF8\uB300\uB85C\uBA74(\uC11C\uBC84\uC5D0 \uB354 \uC774\uC0C1 \uB370\uC774\uD130 \uC5C6\uC74C) \uC7AC\uC694\uCCAD\uD558\uC9C0 \uC54A\uB294\uB2E4.\n const alreadyRequestedAtThisLength =\n lastLoadMoreLengthRef.current === data.length;\n\n if (\n nearEnd &&\n hasMinimumData &&\n !isLoadingMoreRef.current &&\n !alreadyRequestedAtThisLength\n ) {\n isLoadingMoreRef.current = true;\n lastLoadMoreLengthRef.current = data.length;\n const offset = data.length;\n const limit = 50;\n onLoadMore(offset, limit);\n }\n\n if (perfDebugEnabled) {\n perfStatsRef.current.rangeChangedCalls += 1;\n perfStatsRef.current.rangeChangedMs +=\n performance.now() - rangeStart;\n }\n },\n [data.length, loading, onLoadMore, perfDebugEnabled],\n );\n\n // \uB85C\uB529 \uC0C1\uD0DC\uAC00 \uBCC0\uACBD\uB418\uBA74 isLoadingMoreRef \uC5C5\uB370\uC774\uD2B8 (\uAE30\uC874 VirtualDataTable \uBC29\uC2DD)\n useEffect(() => {\n if (!loading) {\n isLoadingMoreRef.current = false;\n }\n }, [loading]);\n\n // \uB370\uC774\uD130\uAC00 \uBE44\uC6CC\uC9C0\uBA74 \uD14C\uC774\uBE14\uC744 \uC7AC\uB9C8\uC6B4\uD2B8\uD558\uC5EC \uC2A4\uD06C\uB864\uC744 \uB9E8 \uC704\uB85C \uC774\uB3D9\n useEffect(() => {\n if (data.length === 0) {\n setTableKey((prev) => prev + 1);\n }\n }, [data.length]);\n\n const resetScrollOnDataChangeRef = useRef(resetScrollOnDataChange);\n resetScrollOnDataChangeRef.current = resetScrollOnDataChange;\n // \uC774\uC804 \uB370\uC774\uD130 \uAE38\uC774 / \uCCAB \uD589 \uC2DD\uBCC4\uC790\uB97C \uCD94\uC801\n const prevDataLengthRef = useRef(data.length);\n const prevFirstRowKeyRef = useRef<unknown>(undefined);\n\n // \uB370\uC774\uD130\uAC00 '\uC9C4\uC9DC\uB85C \uAD50\uCCB4'\uB41C \uACBD\uC6B0(\uC815\uB82C/\uD544\uD130/\uC7AC\uC870\uD68C)\uC5D0\uB9CC \uC2A4\uD06C\uB864\uC744 \uB9E8 \uC704\uB85C \uC774\uB3D9\uD55C\uB2E4.\n // \uB2E8\uC21C\uD788 \uAC19\uC740 \uBAA9\uB85D\uC758 \uD56D\uBAA9\uC774 in-place \uB85C \uBC14\uB00C\uC5C8\uC744 \uBFD0(\uCCB4\uD06C\uBC15\uC2A4 \uD1A0\uAE00, \uBB34\uD55C \uC2A4\uD06C\uB864\n // \uBE48 \uACB0\uACFC, \uBD80\uBAA8 \uB9AC\uB80C\uB354\uB85C \uC778\uD55C \uC0C8 \uBC30\uC5F4 \uCC38\uC870 \uB4F1)\uC778\uB370\uB3C4 \uB9E8 \uC704\uB85C \uD280\uB358 \uBB38\uC81C\uB97C \uB9C9\uB294\uB2E4.\n // \u2192 \uCCAB \uD589 \uC2DD\uBCC4\uC790(getRowId)\uC640 \uAE38\uC774\uB85C '\uAD50\uCCB4' \uC5EC\uBD80\uB97C \uD310\uBCC4\uD55C\uB2E4.\n useEffect(() => {\n const prevLength = prevDataLengthRef.current;\n const currentLength = data.length;\n\n // \uCCAB \uD589 \uD0A4: getRowId \uAC00 \uC788\uC73C\uBA74 \uAC12 \uAE30\uBC18(\uCC38\uC870\uAC00 \uB9E4\uBC88 \uBC14\uB00C\uC5B4\uB3C4 \uC548\uC815), \uC5C6\uC73C\uBA74 \uAC1D\uCCB4 \uCC38\uC870.\n const firstRowKey =\n currentLength > 0\n ? getRowIdRef.current\n ? getRowIdRef.current(data[0], 0)\n : (data[0] as unknown)\n : undefined;\n const prevFirstRowKey = prevFirstRowKeyRef.current;\n\n // \uB370\uC774\uD130 \uAE38\uC774\uAC00 \uC99D\uAC00\uD55C \uACBD\uC6B0 (\uBB34\uD55C \uC2A4\uD06C\uB864) - \uC2A4\uD06C\uB864 \uC704\uCE58 \uC720\uC9C0\n if (currentLength > prevLength && prevLength > 0) {\n prevDataLengthRef.current = currentLength;\n prevFirstRowKeyRef.current = firstRowKey;\n return;\n }\n\n // '\uAD50\uCCB4'\uB85C \uD310\uB2E8: \uAE38\uC774\uAC00 \uC904\uC5C8\uAC70\uB098, \uCCAB \uD589 \uC2DD\uBCC4\uC790\uAC00 \uBC14\uB010 \uACBD\uC6B0\uC5D0\uB9CC \uB9E8 \uC704\uB85C.\n // (\uAC19\uC740 \uAE38\uC774 + \uAC19\uC740 \uCCAB \uD589 = in-place \uC5C5\uB370\uC774\uD2B8 \u2192 \uC2A4\uD06C\uB864 \uC720\uC9C0)\n const dataReplaced =\n currentLength < prevLength ||\n (prevLength > 0 && firstRowKey !== prevFirstRowKey);\n\n // \uBAA9\uB85D\uC774 \uAD50\uCCB4(\uC815\uB82C/\uAC80\uC0C9/\uD544\uD130\uB85C 1\uD398\uC774\uC9C0 \uC7AC\uC870\uD68C)\uB418\uBA74 \uB354\uBCF4\uAE30 \uB798\uCE58\uB97C \uD480\uC5B4 \uBB34\uD55C \uC2A4\uD06C\uB864\uC774\n // \uB2E4\uC2DC \uB3D9\uC791\uD558\uAC8C \uD55C\uB2E4. \uB798\uCE58\uB294 \"\uC694\uCCAD\uD55C \uAE38\uC774\uC5D0\uC11C \uC548 \uB298\uBA74 \uC11C\uBC84 \uC18C\uC9C4\"\uC774\uB77C\uB294 \uC804\uC81C\uC778\uB370,\n // \uAD50\uCCB4\uB85C \uAE38\uC774\uAC00 \uC6B0\uC5F0\uD788 \uAC19\uC544\uC9C0\uBA74(\uC608: 100\u219250 \uC774 \uC544\uB2C8\uB77C \uC18C\uC9C4 \uD6C4 \uB2E4\uB978 \uAC80\uC0C9\uC774 50) \uADF8 \uC804\uC81C\uAC00\n // \uAE68\uC838 onLoadMore \uAC00 \uC601\uAD6C\uD788 \uBA48\uCD98\uB2E4. append/\uBE48\uC751\uB2F5\uC740 \uC704 early-return\u00B7\uB3D9\uC77C firstRowKey \uB85C\n // \uAC78\uB7EC\uC9C0\uBBC0\uB85C(=dataReplaced=false) 1.1.29 \uAC00 \uACE0\uCE5C \"\uBC14\uB2E5 \uB5A8\uB9BC\"\uC740 \uB418\uC0B4\uC544\uB098\uC9C0 \uC54A\uB294\uB2E4.\n if (dataReplaced) {\n lastLoadMoreLengthRef.current = -1;\n }\n\n if (virtuosoRef.current && currentLength > 0 && dataReplaced && resetScrollOnDataChangeRef.current) {\n virtuosoRef.current.scrollToIndex({\n index: 0,\n align: \"start\",\n behavior: \"auto\",\n });\n }\n\n prevDataLengthRef.current = currentLength;\n prevFirstRowKeyRef.current = firstRowKey;\n }, [data]);\n\n /**\n * \uD14C\uC774\uBE14 \uACE0\uC815 \uD5E4\uB354 \uCEE8\uD150\uCE20 \uC815\uC758 (\uAE30\uC874 VirtualDataTable \uC2A4\uD0C0\uC77C)\n * \uC815\uB82C \uAE30\uB2A5\uC774 \uD3EC\uD568\uB41C \uCEEC\uB7FC \uD5E4\uB354\uB97C \uB80C\uB354\uB9C1\n */\n const headerRowsContent = useCallback(() => {\n // 1. \uADF8\uB8F9 \uC815\uBCF4 \uCD94\uCD9C\n const groupMap: { [group: string]: DataColumn<T>[] } = {};\n const noGroupColumns: DataColumn<T>[] = [];\n\n columns.forEach((col) => {\n if (col.group) {\n if (!groupMap[col.group]) {\n groupMap[col.group] = [];\n }\n groupMap[col.group].push(col);\n } else {\n noGroupColumns.push(col);\n }\n });\n\n // \uADF8\uB8F9\uC774 \uC788\uB294 \uACBD\uC6B0 2\uC904 \uD5E4\uB354, \uC5C6\uB294 \uACBD\uC6B0 1\uC904 \uD5E4\uB354\n const hasGroups = Object.keys(groupMap).length > 0;\n\n if (!hasGroups) {\n // \uB2E8\uC77C \uD589 \uD5E4\uB354\n return (\n <MuiTableRow>\n {columns.map((col, colIndex) => (\n <TableCell\n key={String(col.id)}\n align={col.align || \"left\"}\n // \uB178\uC158\uD48D \uBA38\uB9AC\uB294 \uD55C \uC904 \uB9D0\uC904\uC784\uC774\uB77C \uAE00\uC790 \uBA38\uB9AC\uB294 \uC804\uCCB4 \uC774\uB984\uC744 \uD234\uD301\uC73C\uB85C \uBCF4\uC778\uB2E4(headerProps.title \uC774 \uC788\uC73C\uBA74 \uADF8\uAC83\uC774 \uC774\uAE34\uB2E4).\n title={typeof col.text === \"string\" ? col.text : undefined}\n {...col.headerProps}\n onContextMenu={(e: React.MouseEvent<HTMLTableCellElement>) => handleHeaderContextMenu(col, e)}\n style={{\n ...colWidthStyle(col, colIndex, col.width ?? col.minWidth),\n ...col.style,\n fontWeight: \"bold\",\n position: \"sticky\",\n top: 0,\n zIndex: 2,\n padding: \"16px\",\n ...pinnedStyle(col, true),\n ...col.headerProps?.style,\n }}\n >\n {col.sortable ? (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent:\n col.align === \"center\"\n ? \"center\"\n : col.align === \"right\"\n ? \"flex-end\"\n : \"flex-start\",\n position: \"relative\",\n width: \"100%\",\n }}\n >\n <Box\n className=\"vdt-sort-box\"\n data-align={col.align || \"left\"}\n data-filter={hasColumnFilter(col) ? \"1\" : undefined}\n sx={{\n position: \"relative\",\n ...sortPlacement(col.align).box,\n cursor: \"default\",\n \"&:hover .MuiTableSortLabel-root\": {\n opacity: \"1 !important\",\n \"& .MuiSvgIcon-root\": {\n color: \"#000\",\n opacity: \"1 !important\",\n },\n },\n }}\n onClick={() =>\n handleSort(String(col.id))\n }\n >\n {renderHeaderText(col)}\n <TableSortLabel\n active={sortBy === col.id}\n direction={\n sortBy === col.id\n ? sortDirection\n : \"desc\"\n }\n sx={{\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n ...sortPlacement(col.align).label,\n minWidth: \"auto\",\n width: \"16px\",\n height: \"16px\",\n cursor: \"default\",\n opacity:\n sortBy === col.id ? 1 : 0,\n transition: \"opacity 0.2s ease\",\n \"& .MuiTableSortLabel-icon\": {\n position: \"relative\",\n marginLeft: 0,\n marginRight: 0,\n opacity: 1,\n transition:\n \"color 0.2s ease\",\n },\n \"& .MuiTableSortLabel-iconDirectionAsc\":\n {\n transform:\n \"rotate(180deg)\",\n },\n \"& .MuiTableSortLabel-iconDirectionDesc\":\n {\n transform:\n \"rotate(0deg)\",\n },\n }}\n />\n </Box>\n </div>\n ) : (\n renderHeaderText(col)\n )}\n {renderResizeHandle(col)}\n </TableCell>\n ))}\n </MuiTableRow>\n );\n }\n\n // 2\uC904 \uD5E4\uB354 (\uADF8\uB8F9\uC774 \uC788\uB294 \uACBD\uC6B0)\n const firstRowCells = [\n ...noGroupColumns.map((col) => (\n <TableCell\n key={String(col.id)}\n rowSpan={2}\n align={col.align || \"left\"}\n // \uB178\uC158\uD48D \uBA38\uB9AC\uB294 \uD55C \uC904 \uB9D0\uC904\uC784\uC774\uB77C \uAE00\uC790 \uBA38\uB9AC\uB294 \uC804\uCCB4 \uC774\uB984\uC744 \uD234\uD301\uC73C\uB85C \uBCF4\uC778\uB2E4(headerProps.title \uC774 \uC788\uC73C\uBA74 \uADF8\uAC83\uC774 \uC774\uAE34\uB2E4).\n title={typeof col.text === \"string\" ? col.text : undefined}\n {...col.headerProps}\n onContextMenu={(e: React.MouseEvent<HTMLTableCellElement>) => handleHeaderContextMenu(col, e)}\n style={{\n ...colWidthStyle(col, columns.indexOf(col), col.width),\n ...col.style,\n fontWeight: \"bold\",\n position: \"sticky\",\n top: 0,\n zIndex: 2,\n padding: \"16px\",\n ...pinnedStyle(col, true),\n ...col.headerProps?.style,\n }}\n >\n {col.sortable && onSort ? (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent:\n col.align === \"center\"\n ? \"center\"\n : col.align === \"right\"\n ? \"flex-end\"\n : \"flex-start\",\n position: \"relative\",\n width: \"100%\",\n }}\n >\n <Box\n className=\"vdt-sort-box\"\n data-align={col.align || \"left\"}\n data-filter={hasColumnFilter(col) ? \"1\" : undefined}\n sx={{\n position: \"relative\",\n ...sortPlacement(col.align).box,\n cursor: \"default\",\n \"&:hover .MuiTableSortLabel-root\": {\n opacity: \"1 !important\",\n \"& .MuiSvgIcon-root\": {\n color: \"#000\",\n opacity: \"1 !important\",\n },\n },\n }}\n onClick={() => handleSort(String(col.id))}\n >\n {renderHeaderText(col)}\n <TableSortLabel\n active={sortBy === col.id}\n direction={\n sortBy === col.id\n ? sortDirection\n : \"desc\"\n }\n sx={{\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n ...sortPlacement(col.align).label,\n minWidth: \"auto\",\n width: \"16px\",\n height: \"16px\",\n cursor: \"default\",\n opacity: sortBy === col.id ? 1 : 0,\n transition: \"opacity 0.2s ease\",\n \"&:hover\": {\n opacity: \"1 !important\",\n \"& .MuiSvgIcon-root\": {\n color: \"#000\",\n opacity: \"1 !important\",\n },\n },\n \"& .MuiTableSortLabel-icon\": {\n position: \"relative\",\n marginLeft: 0,\n marginRight: 0,\n opacity: 1,\n transition: \"color 0.2s ease\",\n },\n \"& .MuiTableSortLabel-iconDirectionAsc\":\n {\n transform: \"rotate(180deg)\",\n },\n \"& .MuiTableSortLabel-iconDirectionDesc\":\n {\n transform: \"rotate(0deg)\",\n },\n }}\n />\n </Box>\n </div>\n ) : (\n renderHeaderText(col)\n )}\n {renderResizeHandle(col)}\n </TableCell>\n )),\n ...Object.entries(groupMap).map(([group, cols]) => (\n <TableCell\n key={group}\n align=\"center\"\n colSpan={cols.length}\n onContextMenu={(e: React.MouseEvent<HTMLTableCellElement>) => handleHeaderContextMenu(null, e)}\n style={{\n fontWeight: \"bold\",\n position: \"sticky\",\n top: 0,\n zIndex: 2,\n padding: \"16px\",\n }}\n >\n {group}\n </TableCell>\n )),\n ];\n\n const secondRowCells = [\n ...Object.values(groupMap)\n .flat()\n .map((col) => (\n <TableCell\n key={String(col.id)}\n align={col.align || \"left\"}\n // \uB178\uC158\uD48D \uBA38\uB9AC\uB294 \uD55C \uC904 \uB9D0\uC904\uC784\uC774\uB77C \uAE00\uC790 \uBA38\uB9AC\uB294 \uC804\uCCB4 \uC774\uB984\uC744 \uD234\uD301\uC73C\uB85C \uBCF4\uC778\uB2E4(headerProps.title \uC774 \uC788\uC73C\uBA74 \uADF8\uAC83\uC774 \uC774\uAE34\uB2E4).\n title={typeof col.text === \"string\" ? col.text : undefined}\n {...col.headerProps}\n onContextMenu={(e: React.MouseEvent<HTMLTableCellElement>) => handleHeaderContextMenu(col, e)}\n style={{\n ...colWidthStyle(col, columns.indexOf(col), col.width),\n ...col.style,\n fontWeight: \"bold\",\n position: \"sticky\",\n top: 0,\n zIndex: 2,\n padding: \"16px\",\n ...pinnedStyle(col, true),\n ...col.headerProps?.style,\n }}\n >\n {col.sortable && onSort ? (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent:\n col.align === \"center\"\n ? \"center\"\n : col.align === \"right\"\n ? \"flex-end\"\n : \"flex-start\",\n position: \"relative\",\n width: \"100%\",\n }}\n >\n <Box\n className=\"vdt-sort-box\"\n data-align={col.align || \"left\"}\n data-filter={hasColumnFilter(col) ? \"1\" : undefined}\n sx={{\n position: \"relative\",\n ...sortPlacement(col.align).box,\n cursor: \"default\",\n \"&:hover .MuiTableSortLabel-root\": {\n opacity: \"1 !important\",\n \"& .MuiSvgIcon-root\": {\n color: \"#000\",\n opacity: \"1 !important\",\n },\n },\n }}\n onClick={() => handleSort(String(col.id))}\n >\n {renderHeaderText(col)}\n <TableSortLabel\n active={sortBy === col.id}\n direction={\n sortBy === col.id\n ? sortDirection\n : \"desc\"\n }\n sx={{\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n ...sortPlacement(col.align).label,\n minWidth: \"auto\",\n width: \"16px\",\n height: \"16px\",\n cursor: \"default\",\n opacity: sortBy === col.id ? 1 : 0,\n transition: \"opacity 0.2s ease\",\n \"&:hover\": {\n opacity: \"1 !important\",\n \"& .MuiSvgIcon-root\": {\n color: \"#000\",\n opacity: \"1 !important\",\n },\n },\n \"& .MuiTableSortLabel-icon\": {\n position: \"relative\",\n marginLeft: 0,\n marginRight: 0,\n opacity: 1,\n transition: \"color 0.2s ease\",\n },\n \"& .MuiTableSortLabel-iconDirectionAsc\":\n {\n transform: \"rotate(0deg)\",\n },\n \"& .MuiTableSortLabel-iconDirectionDesc\":\n {\n transform: \"rotate(180deg)\",\n },\n }}\n />\n </Box>\n </div>\n ) : (\n renderHeaderText(col)\n )}\n {renderResizeHandle(col)}\n </TableCell>\n )),\n ];\n\n return (\n <>\n <MuiTableRow>{firstRowCells}</MuiTableRow>\n <MuiTableRow>{secondRowCells}</MuiTableRow>\n </>\n );\n }, [columns, sortBy, sortDirection, handleSort, onSort, columnHeight, pinnedStyle, handleHeaderContextMenu, renderHeaderText, colWidthStyle, renderResizeHandle]);\n\n /**\n * \uD14C\uC774\uBE14 \uD589 \uCEE8\uD150\uCE20 \uB80C\uB354\uB9C1 \uD568\uC218 (\uAE30\uC874 VirtualDataTable \uC2A4\uD0C0\uC77C)\n * \uAC01 \uB370\uC774\uD130 \uD56D\uBAA9\uC5D0 \uB300\uD55C \uC140 \uB0B4\uC6A9\uC744 \uC815\uC758\n */\n /** \uD3F0 \uBAA9\uB85D\uC758 \uC5F4 \uC790\uB9AC \u2014 \uC5F4\uC758 mobile \uD78C\uD2B8\uB85C \uB098\uB208\uB2E4(\uC5C6\uC73C\uBA74 \uCCAB \uC5F4\uC740 \uC81C\uBAA9, \uB098\uBA38\uC9C0\uB294 \uC815\uBCF4 \uC904) */\n const mobileSlots = useMemo(() => {\n const shown = columns.filter((c) => c.mobile !== false);\n const title = shown.find((c) => c.mobile === \"title\") ?? shown.find((c) => !c.mobile);\n return {\n title,\n thumb: shown.filter((c) => c.mobile === \"thumb\"),\n badge: shown.filter((c) => c.mobile === \"badge\"),\n sub: shown.filter((c) => c.mobile === \"sub\"),\n meta: shown.filter((c) => c !== title && (!c.mobile || c.mobile === \"meta\")),\n };\n }, [columns]);\n\n /** \uD3F0 \uBAA9\uB85D \uCE74\uB4DC \uD55C \uC904 \u2014 [\uC0AC\uC9C4] [\uC81C\uBAA9 \u00B7 \uCE69 / \uC544\uB798 \uD55C \uC904 / \uBA38\uB9AC\uAE00 \uAC12 \uBB36\uC74C] */\n const renderMobileRow = useCallback(\n (item: T, index: number): React.ReactNode => {\n if (mobileConfig?.renderRow) return mobileConfig.renderRow(item, index);\n const cell = (c: DataColumn<T>) => (c.render ? c.render(item, index) : String((item as any)[c.id] ?? \"\"));\n const { title, thumb, badge, sub, meta } = mobileSlots;\n return (\n <Box sx={{ display: \"flex\", gap: \"12px\", alignItems: \"flex-start\", py: \"12px\", px: \"14px\", minWidth: 0 }}>\n {thumb.map((c) => (\n <Box key={String(c.id)} sx={{ flexShrink: 0 }}>\n {cell(c)}\n </Box>\n ))}\n <Box sx={{ flex: 1, minWidth: 0, display: \"flex\", flexDirection: \"column\", gap: \"4px\" }}>\n {(title || badge.length > 0) && (\n <Box sx={{ display: \"flex\", alignItems: \"flex-start\", gap: \"8px\", minWidth: 0 }}>\n <Box sx={{ flex: 1, minWidth: 0, fontSize: 15, fontWeight: 500, overflowWrap: \"anywhere\" }}>\n {title ? cell(title) : null}\n </Box>\n {badge.map((c) => (\n <Box key={String(c.id)} sx={{ flexShrink: 0 }}>\n {cell(c)}\n </Box>\n ))}\n </Box>\n )}\n {sub.map((c) => (\n <Box key={String(c.id)} sx={{ fontSize: 13, color: notionTokens.headerColor, minWidth: 0 }}>\n {cell(c)}\n </Box>\n ))}\n {meta.length > 0 && (\n <Box sx={{ display: \"flex\", flexWrap: \"wrap\", gap: \"2px 12px\", fontSize: 13, minWidth: 0 }}>\n {meta.map((c) => {\n const label = c.mobileLabel === false ? null : (c.mobileLabel ?? (typeof c.text === \"string\" ? c.text : null));\n return (\n <Box key={String(c.id)} sx={{ display: \"inline-flex\", alignItems: \"center\", gap: \"4px\", minWidth: 0, maxWidth: \"100%\" }}>\n {label ? <Box component=\"span\" sx={{ color: notionTokens.headerColor, flexShrink: 0 }}>{label}</Box> : null}\n <Box component=\"span\" sx={{ minWidth: 0, \"& > *\": { width: \"auto !important\", textAlign: \"left !important\" } }}>\n {cell(c)}\n </Box>\n </Box>\n );\n })}\n </Box>\n )}\n </Box>\n </Box>\n );\n },\n [mobileConfig, mobileSlots, notionTokens],\n );\n\n const rowContent = useCallback(\n (index: number, item: T) => {\n const rowStart = perfDebugEnabled ? performance.now() : 0;\n // console.log(\"rowContent \uB80C\uB354\uB9C1:\", { index, item: item ? \"\uC788\uC74C\" : \"\uC5C6\uC74C\" });\n\n if (!item) {\n if (perfDebugEnabled) {\n perfStatsRef.current.rowContentCalls += 1;\n const rowDuration = performance.now() - rowStart;\n perfStatsRef.current.rowContentMs += rowDuration;\n perfStatsRef.current.rowContentMaxMs = Math.max(\n perfStatsRef.current.rowContentMaxMs,\n rowDuration,\n );\n }\n return null;\n }\n\n // \uD3F0 \uBAA9\uB85D \u2014 \uBAA8\uB4E0 \uC5F4\uC744 \uD569\uCE5C \uCE78 \uD558\uB098\uC5D0 \uCE74\uB4DC(\uBA38\uB9AC \uC904\uC774 \uC5C6\uC5B4 \uC5F4 \uD3ED\uC740 \uC758\uBBF8\uAC00 \uC5C6\uB2E4)\n if (mobileList) {\n const card = renderMobileRow(item, index);\n return (\n <TableCell colSpan={columns.length} data-vdt-pad=\"\" sx={{ padding: 0 }}>\n {reorder.on ? (\n // \uB04C\uC5B4 \uC62E\uAE30\uAE30(1.9.0) \u2014 \uCE74\uB4DC \uC67C\uCABD\uC5D0 \uC190\uC7A1\uC774. \uCE74\uB4DC \uC790\uCCB4\uC758 \uC5EC\uBC31\uC740 \uADF8\uB300\uB85C\uB2E4\n <Box sx={{ display: \"flex\", alignItems: \"stretch\", minWidth: 0 }}>\n <Box sx={{ display: \"flex\", alignItems: \"center\", pl: \"6px\", flexShrink: 0 }}>{reorder.renderHandle(item, index)}</Box>\n <Box sx={{ flex: 1, minWidth: 0 }}>{card}</Box>\n </Box>\n ) : (\n card\n )}\n </TableCell>\n );\n }\n\n // \uD55C \uCE78 \uC904(\uBB36\uC74C \uBA38\uB9AC \uB4F1) \u2014 \uBAA8\uB4E0 \uC5F4\uC744 \uD569\uCE5C \uCE78 \uD558\uB098. \uC5EC\uBC31 \u00B7 \uBC14\uD0D5\uC740 fullWidthRowSx \uAC00 \uC815\uD55C\uB2E4.\n const fullWidth = renderFullWidthRow\n ? renderFullWidthRow(item, index)\n : null;\n if (fullWidth !== null && fullWidth !== undefined) {\n return (\n <TableCell\n colSpan={columns.length}\n data-vdt-pad=\"\"\n sx={[\n { padding: notion ? \"0 14px\" : \"8px 16px\" },\n ...(Array.isArray(fullWidthRowSx)\n ? fullWidthRowSx\n : fullWidthRowSx\n ? [fullWidthRowSx]\n : []),\n ]}\n >\n {fullWidth}\n </TableCell>\n );\n }\n\n // \uC624\uB978\uCABD\uC73C\uB85C \uD569\uCE5C \uCE78(colSpan)\uC5D0 \uB36E\uC778 \uC5F4 \uC218 \u2014 \uADF8\uB9CC\uD07C \uB2E4\uC74C \uC5F4\uB4E4\uC758 \uCE78\uC744 \uADF8\uB9AC\uC9C0 \uC54A\uB294\uB2E4.\n let coveredByColSpan = 0;\n const cells = columns.map((column, columnIndex) => {\n if (coveredByColSpan > 0) {\n coveredByColSpan -= 1;\n return null;\n }\n const colSpan = column.colSpan\n ? Math.max(1, Math.min(column.colSpan(item, index), columns.length - columnIndex))\n : 1;\n coveredByColSpan = colSpan - 1;\n const cellStart = perfDebugEnabled ? performance.now() : 0;\n const cellValue = column.render\n ? column.render(item, index)\n : String((item as any)[column.id] || \"\");\n\n if (perfDebugEnabled) {\n const cellDuration = performance.now() - cellStart;\n perfStatsRef.current.cellRenderCalls += 1;\n perfStatsRef.current.cellRenderMs += cellDuration;\n perfStatsRef.current.cellRenderMaxMs = Math.max(\n perfStatsRef.current.cellRenderMaxMs,\n cellDuration,\n );\n }\n\n const pinned = pinnedLeft.has(String(column.id));\n const customPadding = column.cellPadding !== undefined;\n // \uC544\uB798\uB85C \uD569\uCE5C \uCE78\uC5D0 \uB36E\uC778 \uC904\uC740 \uCE78\uC744 \uADF8\uB9AC\uC9C0 \uC54A\uB294\uB2E4.\n const span = column.rowSpan ? column.rowSpan(item, index) : 1;\n if (span <= 0) return null;\n const onCellClick = column.onCellClick;\n return (\n <TableCell\n key={String(column.id)}\n align={column.align || \"left\"}\n rowSpan={span > 1 ? span : undefined}\n colSpan={colSpan > 1 ? colSpan : undefined}\n data-vdt-pad={customPadding ? \"\" : undefined}\n data-vdt-pinned={pinned ? \"\" : undefined}\n data-vdt-cell-click={onCellClick ? \"\" : undefined}\n onClick={\n onCellClick\n ? (e: React.MouseEvent) => {\n // \uB04C\uC5B4\uC11C \uBBFC \uB4A4\uC758 \uD074\uB9AD\uC740 \uCE78 \uB204\uB984\uC73C\uB85C \uCE58\uC9C0 \uC54A\uB294\uB2E4(\uC904 \uD074\uB9AD\uACFC \uAC19\uC740 \uAE30\uC900).\n const dx = e.clientX - mouseDownPositionRef.current.x;\n const dy = e.clientY - mouseDownPositionRef.current.y;\n e.stopPropagation();\n if (Math.sqrt(dx * dx + dy * dy) > ROW_CLICK_DRAG_THRESHOLD_PX) return;\n onCellClick(item, index, e);\n }\n : undefined\n }\n style={{\n // \uD569\uCE5C \uCE78\uC740 \uD3ED\uC744 \uBC15\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uC5F4 \uD3ED\uC740 \uBA38\uB9AC \uC904\uC774 \uC815\uD558\uACE0, \uBC15\uC73C\uBA74 \uD569\uCE5C \uD3ED\uC774 \uD55C \uC5F4 \uD3ED\uC73C\uB85C \uC904\uC5B4\uB4E0\uB2E4.\n ...(colSpan > 1 ? {} : colWidthStyle(column, columnIndex, column.width ?? column.minWidth)),\n ...(column.primary ? { fontSize: 15 } : {}),\n ...column.style,\n ...(column.cellStyle ? column.cellStyle(item, index) : {}),\n padding: customPadding ? column.cellPadding : \"8px 16px\",\n ...pinnedStyle(column, false),\n }}\n >\n {cellValue}\n </TableCell>\n );\n });\n\n if (perfDebugEnabled) {\n perfStatsRef.current.rowContentCalls += 1;\n const rowDuration = performance.now() - rowStart;\n perfStatsRef.current.rowContentMs += rowDuration;\n perfStatsRef.current.rowContentMaxMs = Math.max(\n perfStatsRef.current.rowContentMaxMs,\n rowDuration,\n );\n }\n\n return <>{cells}</>;\n },\n [columns, perfDebugEnabled, renderFullWidthRow, fullWidthRowSx, notion, pinnedLeft, pinnedStyle, mobileList, renderMobileRow, colWidthStyle, reorder.on, reorder.renderHandle],\n );\n\n /**\n * \uBA38\uB9AC \uB0B4\uC6A9 = \uBA38\uB9AC \uC904 + (\uC788\uC73C\uBA74) \uACE0\uC815 \uC904 \uC601\uC5ED. \uACE0\uC815 \uC904\uC740 \uBA38\uB9AC(thead)\uC640 \uD568\uAED8 \uC704\uC5D0 \uBD99\uC5B4 \uBCF8\uBB38 \uC2A4\uD06C\uB864\uACFC \uBB34\uAD00\uD558\uAC8C \uBCF4\uC778\uB2E4.\n * \uBA38\uB9AC \uC548\uC5D0 \uBCF8\uBB38 \uCE78\uC744 \uADF8\uB9AC\uB824\uBA74 \uD55C \uCE78(colSpan \uC804\uCCB4) \uC548\uC5D0 \uAC19\uC740 \uC5F4 \uAD6C\uC131\uC758 \uD45C\uB97C \uD558\uB098 \uB354 \uB454\uB2E4 \u2014 \uC5F4 \uD3ED\uC740 colgroup \uC73C\uB85C \uBC14\uAE65 \uD45C\uC640 \uB9DE\uCD94\uACE0\n * (\uCCAB \uC904\uC774 \uBB36\uC74C \uB760 \uC904\uC774\uBA74 \uADF8 \uC904\uB85C\uB294 \uC5F4 \uD3ED\uC744 \uBABB \uC815\uD55C\uB2E4), \uAC00\uB85C\uB85C \uBC00\uBA74 \uBC14\uAE65 \uD45C\uC640 \uD568\uAED8 \uC6C0\uC9C1\uC778\uB2E4.\n * \uC548\uCABD tbody \uB97C MUI TableBody \uB85C \uAC10\uC2F8\uC57C \uCE78\uC774 \uBA38\uB9AC \uCE78(th)\uC774 \uC544\uB2C8\uB77C \uBCF8\uBB38 \uCE78(td)\uC73C\uB85C \uADF8\uB824\uC9C4\uB2E4.\n */\n const fixedHeaderContent = useCallback(() => {\n const headerRows = headerRowsContent();\n if (!pinnedRows || pinnedRows.length === 0) return headerRows;\n const RowComponent = rowComponentRef.current;\n return (\n <>\n {headerRows}\n <tr data-vdt-pinned-area=\"\">\n <td colSpan={columns.length} style={{ padding: 0, border: 0 }}>\n <Box\n data-vdt-inner-scroll=\"\"\n sx={[\n {\n maxHeight: pinnedRowsMaxHeight,\n overflowY: pinnedRowsMaxHeight ? \"auto\" : \"visible\",\n overflowX: \"hidden\",\n scrollbarWidth: \"thin\",\n borderBottom: `1px solid ${notion ? notionTokens.borderStrong : \"rgba(224, 224, 224, 1)\"}`,\n // \uC601\uC5ED \uC544\uB7AB\uC120\uC774 \uACBD\uACC4\uB97C \uB9E1\uB294\uB2E4 \u2014 \uB9C8\uC9C0\uB9C9 \uC904 \uC544\uB798\uC120\uAE4C\uC9C0 \uADF8\uC73C\uBA74 \uC774\uC911\uC120\uC774\uB2E4.\n \"& tbody tr:last-of-type > td\": { borderBottom: \"none\" },\n },\n ...(Array.isArray(pinnedRowsSx) ? pinnedRowsSx : pinnedRowsSx ? [pinnedRowsSx] : []),\n ]}\n >\n <table\n style={{\n width: \"100%\",\n tableLayout,\n borderCollapse: \"separate\",\n borderSpacing: 0,\n }}\n >\n <colgroup>\n {columns.map((col, colIndex) => (\n <col key={String(col.id)} style={colWidthStyle(col, colIndex, col.width ?? col.minWidth)} />\n ))}\n </colgroup>\n <MuiTableBody>\n {pinnedRows.map((item, index) =>\n RowComponent ? (\n <RowComponent\n key={getRowId ? String(getRowId(item, index)) : `p${index}`}\n item={item}\n data-index={index}\n data-vdt-pinned-row=\"\"\n >\n {rowContent(index, item)}\n </RowComponent>\n ) : null,\n )}\n </MuiTableBody>\n </table>\n </Box>\n </td>\n </tr>\n </>\n );\n }, [headerRowsContent, pinnedRows, pinnedRowsMaxHeight, pinnedRowsSx, columns, rowContent, tableLayout, getRowId, notion, notionTokens, colWidthStyle]);\n\n // \uCEEC\uB7FC\uC5D0 footer \uB80C\uB354\uB7EC\uAC00 \uD558\uB098\uB77C\uB3C4 \uC788\uAC70\uB098 showFooter \uAC00 \uBA85\uC2DC\uB418\uBA74 \uD558\uB2E8 \uD569\uACC4 \uD589\uC744 \uD45C\uC2DC\uD55C\uB2E4.\n const hasFooter =\n showFooter ?? columns.some((col) => typeof col.footer === \"function\");\n\n /**\n * \uD14C\uC774\uBE14 \uD558\uB2E8 \uACE0\uC815 \uD569\uACC4 \uD589(tfoot) \uCEE8\uD150\uCE20 \uC815\uC758\n * \uAC01 \uCEEC\uB7FC\uC758 footer(data) \uACB0\uACFC\uB97C \uC140\uB85C \uB80C\uB354\uB9C1\uD55C\uB2E4. (footer \uC5C6\uB294 \uCEEC\uB7FC\uC740 \uBE48 \uC140)\n * tableLayout: fixed \uB77C \uD5E4\uB354/\uBC14\uB514\uC640 \uB3D9\uC77C\uD55C \uCEEC\uB7FC \uB108\uBE44\uB85C \uC790\uB3D9 \uC815\uB82C\uB41C\uB2E4.\n */\n const fixedFooterContent = useCallback(() => {\n if (!hasFooter) {\n return null;\n }\n\n // footerColSpan \uC73C\uB85C \uC140\uC744 \uBCD1\uD569\uD55C\uB2E4. \uC55E \uCEEC\uB7FC\uC774 colSpan \uC73C\uB85C \uB36E\uC740 \uCEEC\uB7FC\uC740 \uC140\uC744 \uC0DD\uB7B5\uD55C\uB2E4.\n const cells: React.ReactNode[] = [];\n for (let i = 0; i < columns.length; i += 1) {\n const col = columns[i];\n const colSpan =\n col.footerColSpan && col.footerColSpan > 1\n ? Math.min(col.footerColSpan, columns.length - i)\n : 1;\n\n cells.push(\n <TableCell\n key={String(col.id)}\n align={col.align || \"left\"}\n colSpan={colSpan > 1 ? colSpan : undefined}\n style={{\n // \uBCD1\uD569 \uC2DC \uB108\uBE44 \uACE0\uC815\uC744 \uD480\uC5B4 colSpan \uC774 \uC2E4\uC81C\uB85C \uB298\uC5B4\uB098\uAC8C \uD55C\uB2E4.\n ...(colSpan > 1\n ? {}\n : colWidthStyle(col, i, col.width)),\n ...col.style,\n fontWeight: \"bold\",\n // \uB178\uC158\uD48D\uC740 \uBCF8\uBB38 \uCE78\uACFC \uAC19\uC740 \uC88C\uC6B0 \uC5EC\uBC31 \u00B7 \uC138\uB85C 0(\uC904 \uB192\uC774\uB85C \uAC00\uC6B4\uB370) \u2014 16px \uC774\uBA74 \uD569\uACC4 \uC904\uB9CC \uB192\uACE0 \uAE00\uC790\uAC00 \uCE78\uACFC \uC5B4\uAE0B\uB0AC\uB2E4.\n padding: notion ? \"0 14px\" : \"16px\",\n }}\n >\n {col.footer ? col.footer(data) : null}\n </TableCell>,\n );\n\n // colSpan \uC73C\uB85C \uB36E\uC778 \uB4A4 \uCEEC\uB7FC\uC740 \uAC74\uB108\uB6F4\uB2E4.\n i += colSpan - 1;\n }\n\n return <MuiTableRow>{cells}</MuiTableRow>;\n }, [hasFooter, columns, data, notion, colWidthStyle]);\n\n // \uD14C\uC774\uBE14 \uCEF4\uD3EC\uB10C\uD2B8 \uC815\uC758 (\uAE30\uC874 VirtualDataTable \uC2A4\uD0C0\uC77C)\n const VirtuosoTableComponents: TableComponents<T> = useMemo(\n () => ({\n // \uC2A4\uD06C\uB864 \uCEE8\uD14C\uC774\uB108 (\uC678\uBD80\uC5D0\uC11C \uD55C \uBC88\uB9CC \uC0DD\uC131\uB41C \uC548\uC815\uC801\uC778 \uCEF4\uD3EC\uB10C\uD2B8 \uC0AC\uC6A9)\n // \uBC14\uAE65 \uC2A4\uD06C\uB864\uC774\uBA74 \uC790\uAE30 \uC2A4\uD06C\uB864 \uC0C1\uC790(OverlayScrollbar) \uC5C6\uC774 \uD3C9\uBC94\uD55C \uC0C1\uC790 \u2014 \uAD74\uB9AC\uB294 \uAC83\uC740 \uBC14\uAE65\uC774\uB2E4\n Scroller: external ? PlainScroller : VirtuosoScroller,\n // \uD14C\uC774\uBE14 \uCEF4\uD3EC\uB10C\uD2B8\n Table: (props) => (\n <Table\n {...props}\n sx={{\n borderCollapse: \"separate\",\n tableLayout,\n // \uD3F0 \uBAA9\uB85D\uC740 \uCE78 \uD558\uB098\uB77C \uC5F4 \uD3ED \uD569(\uCD5C\uC18C \uD3ED)\uC744 \uB450\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uB450\uBA74 \uD654\uBA74 \uBC16\uC73C\uB85C \uBC00\uB9B0\uB2E4\n // \uB04C\uC5B4 \uBC14\uAFB8\uAE30\uB97C \uCF1C\uBA74 \uD45C \uD3ED \u00B7 \uCD5C\uC18C \uD3ED\uB3C4 \uD45C \uC0C1\uC790\uC758 CSS \uBCC0\uC218\uB97C \uBCF8\uB2E4(\uB044\uB294 \uB3D9\uC548 \uBD80\uD488\uC744 \uB2E4\uC2DC \uB9CC\uB4E4\uC9C0 \uC54A\uAC8C).\n ...(resizeOn\n ? { width: \"var(--vdt-tw, 100%)\", minWidth: `var(--vdt-tmin, ${tableMinWidth ?? 0}px)` }\n : tableMinWidth && !mobileList\n ? { minWidth: tableMinWidth }\n : {}),\n // \uD2C0 \uC5C6\uC774 \uADF8\uB9B4 \uB54C\uB294 \uC624\uB978\uCABD \uB367\uC5EC\uBC31\uC774 \uAC00\uB85C \uB118\uCE68(\uAC00\uB85C \uB9C9\uB300)\uC744 \uB9CC\uB4E0\uB2E4 \u2014 \uD45C\uAC00 \uC0C1\uC790 \uD3ED\uC5D0 \uAF2D \uB9DE\uAC8C \uB454\uB2E4.\n marginRight: framed ? \"16px\" : 0,\n // \uD558\uB2E8 \uD569\uACC4 \uD589\uC774 \uC788\uC73C\uBA74 \uB370\uC774\uD130\uAC00 \uC801\uC5B4\uB3C4 \uD14C\uC774\uBE14\uC774 \uCEE8\uD14C\uC774\uB108\uB97C \uCC44\uC6B0\uAC8C \uD55C\uB2E4.\n // (\uC2E4\uC81C \uBC14\uB2E5 \uC815\uB82C\uC740 tbody \uAC00 \uB298\uC5B4\uB098\uBA70 \uCC98\uB9AC \u2014 \uD589 \uB192\uC774\uB294 \uADF8\uB300\uB85C \uC720\uC9C0)\n ...(hasFooter ? { height: \"100%\" } : {}),\n }}\n />\n ),\n // \uD14C\uC774\uBE14 \uD5E4\uB354 (\uACE0\uC815 \uC704\uCE58)\n TableHead: forwardRef<HTMLTableSectionElement, any>(\n (props, ref) => (\n <TableHead\n {...props}\n ref={ref}\n sx={{\n userSelect: \"none\",\n // \uBC14\uB85C \uC544\uB798 \uC904(\uBA38\uB9AC \uC904)\uB9CC \u2014 \uBA38\uB9AC \uC548 \uACE0\uC815 \uC904 \uC601\uC5ED(pinnedRows)\uC758 \uC904\uAE4C\uC9C0 \uBA38\uB9AC \uB192\uC774 \u00B7 \uAD75\uAE30\uB97C \uBC1B\uC73C\uBA74 \uC548 \uB41C\uB2E4.\n \"& > tr\": {\n height: columnHeight,\n \"& > th\": {\n padding: \"16px\",\n position: \"sticky\",\n top: 0,\n zIndex: 2,\n fontWeight: \"bold\",\n },\n },\n }}\n />\n ),\n ),\n // \uD14C\uC774\uBE14 \uD589 (\uD074\uB9AD \uC774\uBCA4\uD2B8 \uBC0F \uD638\uBC84 \uD6A8\uACFC \uD3EC\uD568)\n // \uD14C\uC774\uBE14 \uD589 (\uD074\uB9AD \uC774\uBCA4\uD2B8 \uBC0F \uD638\uBC84 \uD6A8\uACFC \uD3EC\uD568)\n TableRow: (props: any) => {\n const {\n item,\n selected: _selected,\n \"aria-selected\": _ariaSelected,\n className,\n ...rest\n } = props as any;\n // react-virtuoso\uB294 'data-index' \uC18D\uC131\uC73C\uB85C index\uB97C \uC804\uB2EC\uD569\uB2C8\uB2E4\n const rowIndex = rest[\"data-index\"] ?? 0;\n const isOddRow = rowIndex % 2 === 1;\n const rowId =\n item && getRowIdRef.current\n ? getRowIdRef.current(item, rowIndex)\n : rowIndex;\n // CSS \uD558\uC774\uB77C\uC774\uD2B8 \uBAA8\uB4DC\uC5D0\uC11C\uB294 \uD589 \uC790\uCCB4\uC5D0\uC11C \uC120\uD0DD\uC744 \uACC4\uC0B0\uD558\uC9C0 \uC54A\uB294\uB2E4(\uCEE8\uD14C\uC774\uB108 CSS \uAC00 \uCC98\uB9AC).\n // \u2192 selectedRowId \uBCC0\uACBD\uC774 \uD589 \uC7AC\uB80C\uB354\uB85C \uC774\uC5B4\uC9C0\uC9C0 \uC54A\uB294\uB2E4.\n const isSelected =\n !useCssRowHighlight &&\n selectedRowId !== null &&\n selectedRowId !== undefined &&\n rowId === selectedRowId;\n const resolvedSelectedRowSx =\n isSelected && selectedRowSx\n ? typeof selectedRowSx === \"function\"\n ? selectedRowSx(item, rowIndex)\n : selectedRowSx\n : undefined;\n const sanitizedClassName = String(className ?? \"\")\n .split(/\\s+/)\n .filter(\n (token) =>\n token !== \"Mui-selected\" &&\n token !== \"Mui-focusVisible\",\n )\n .join(\" \");\n\n return (\n <MuiTableRow\n {...rest}\n data-row-id={rowId !== null && rowId !== undefined ? String(rowId) : undefined}\n className={sanitizedClassName || undefined}\n selected={isSelected}\n onMouseDown={(e: any) => {\n // \uB9C8\uC6B0\uC2A4 \uB2E4\uC6B4 \uC2DC \uB4DC\uB798\uADF8 \uD50C\uB798\uADF8 \uCD08\uAE30\uD654 \uBC0F \uC2DC\uC791 \uC704\uCE58 \uC800\uC7A5\n isScrollDraggingRef.current = false;\n mouseDownPositionRef.current = {\n x: e.clientX,\n y: e.clientY,\n };\n }}\n onContextMenu={(e: React.MouseEvent) => {\n if (item && onRowContextMenuRef.current) {\n onRowContextMenuRef.current(item, rowIndex, e);\n }\n }}\n onClick={(e: React.MouseEvent) => {\n // mousedown \uC2DC\uC791 \uC704\uCE58\uC640 click \uC704\uCE58 \uCC28\uC774\uB85C \uB4DC\uB798\uADF8 \uC5EC\uBD80 \uD310\uBCC4\n const dx =\n e.clientX - mouseDownPositionRef.current.x;\n const dy =\n e.clientY - mouseDownPositionRef.current.y;\n const wasDrag =\n Math.sqrt(dx * dx + dy * dy) >\n ROW_CLICK_DRAG_THRESHOLD_PX ||\n isScrollDraggingRef.current;\n if (wasDrag) {\n e.preventDefault();\n e.stopPropagation();\n isScrollDraggingRef.current = false;\n return;\n }\n if (item && onRowClickRef.current) {\n onRowClickRef.current(item, rowIndex);\n }\n isScrollDraggingRef.current = false;\n }}\n sx={[\n {\n userSelect: \"none\",\n // \uD589 \uB192\uC774\uB97C estimatedItemHeight(=rowHeight + divider) \uB85C \uC815\uD655\uD788\n // \uACE0\uC815\uD55C\uB2E4. react-virtuoso \uB294 fixedItemHeight \uB97C \uC918\uB3C4\n // ResizeObserver \uB85C \uC2E4\uC81C \uD589 \uB192\uC774\uB97C \uC7AC\uCE21\uC815\uD574 \uBC18\uC601\uD558\uB294\uB370, \uC140\n // \uD3F0\uD2B8/\uB77C\uC778\uC758 \uC11C\uBE0C\uD53D\uC140 \uB54C\uBB38\uC5D0 \uCE21\uC815\uAC12\uC774 \uC815\uC218\uC5D0\uC11C \uC5B4\uAE0B\uB098\uBA74\n // \uD558\uB2E8 filler row \uB192\uC774(offsetBottom)\uAC00 \uC2A4\uD06C\uB864\uB9C8\uB2E4 \uC18C\uC218\uC810\uC73C\uB85C\n // \uD754\uB4E4\uB9AC\uACE0, \uADF8 \uC704\uC5D0 sticky \uB85C \uBD99\uC740 <tfoot> \uD569\uACC4\uD589\uC774 1px \uB5A8\uB9B0\uB2E4.\n // height/maxHeight \uB97C \uC815\uC218\uB85C \uBC15\uACE0 overflow:hidden \uC73C\uB85C \uB9C9\uC544\n // \uCE21\uC815\uAC12\uC774 \uD56D\uC0C1 estimatedItemHeight \uAC00 \uB418\uAC8C \uD55C\uB2E4.\n // \uC904 \uB192\uC774 \"auto\" \uB294 \uB0B4\uC6A9\uB9CC\uD07C \uB298\uC5B4\uB09C\uB2E4 \u2014 \uCE78 \uB192\uC774(rowHeight)\uAC00 \uCD5C\uC18C \uB192\uC774\uB85C \uB3D9\uC791\uD55C\uB2E4.\n ...(autoRowHeight\n ? { \"& > td\": { height: estimatedItemHeight } }\n : {\n height: estimatedItemHeight,\n maxHeight: estimatedItemHeight,\n }),\n boxSizing: \"border-box\",\n backgroundColor:\n isOddRow && stripedRowColor\n ? stripedRowColor\n : \"transparent\",\n // \uC5EC\uBC31\uC744 \uB530\uB85C \uBC1B\uC740 \uCE78(cellPadding \u00B7 \uD55C \uCE78 \uC904)\uC740 \uAE30\uBCF8 \uC5EC\uBC31\uC5D0\uC11C \uBE80\uB2E4.\n \"& td:not([data-vdt-pad])\": {\n padding: \"8px 16px\",\n },\n \"& td\": {\n boxSizing: \"border-box\",\n borderBottom: rowDivider\n ? \"1px solid rgba(224, 224, 224, 1)\"\n : \"none\",\n },\n \"& th\": {\n padding: \"8px 16px\",\n borderBottom: \"none\",\n },\n \"&:hover\":\n hasRowClick && !isSelected\n ? {\n backgroundColor: (theme) => {\n const isDark =\n theme.palette.mode ===\n \"dark\";\n const defaultColor =\n \"#000000\";\n const color =\n rowHoverColor ??\n defaultColor;\n const opacity =\n rowHoverOpacity ?? 0.06;\n\n if (!rowHoverColor) {\n return isDark\n ? `rgba(255, 255, 255, ${opacity})`\n : `rgba(0, 0, 0, ${opacity})`;\n }\n\n const hex = color\n .replace(\"#\", \"\")\n .trim();\n if (hex.length !== 6) {\n return color;\n }\n\n const r = parseInt(\n hex.substring(0, 2),\n 16,\n );\n const g = parseInt(\n hex.substring(2, 4),\n 16,\n );\n const b = parseInt(\n hex.substring(4, 6),\n 16,\n );\n\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n },\n }\n : undefined,\n cursor: hasRowClick ? \"pointer\" : undefined,\n },\n resolvedSelectedRowSx,\n ]}\n />\n );\n },\n // \uD14C\uC774\uBE14 \uBC14\uB514 \u2014 \uD558\uB2E8 \uD569\uACC4 \uD589\uC774 \uC788\uC73C\uBA74 row-group \uC744 \uB298\uB824 \uBE48 \uACF5\uAC04\uC774 \uB9C8\uC9C0\uB9C9 \uD589 '\uC544\uB798'\uB85C \uAC00\uAC8C \uD55C\uB2E4.\n // (\uAC1C\uBCC4 \uD589 \uB192\uC774\uB294 \uADF8\uB300\uB85C \uC720\uC9C0\uB418\uACE0, tfoot \uC740 \uADF8 \uC544\uB798 \uBC14\uB2E5\uC5D0 \uBD99\uB294\uB2E4)\n TableBody: forwardRef<HTMLTableSectionElement>((props, ref) => {\n const { children, ...rest } =\n props as React.HTMLAttributes<HTMLTableSectionElement>;\n return (\n <MuiTableBody\n {...rest}\n ref={ref}\n sx={hasFooter ? { height: \"100%\" } : undefined}\n >\n {children}\n {/* fill \uBAA8\uB4DC(hasFooter)\uC5D0\uC11C table/tbody \uC758 height:100% \uB54C\uBB38\uC5D0 \uB0A8\uB294 \uB192\uC774\uAC00\n \uB370\uC774\uD130 <tr> \uC5D0 \uBD84\uBC30\uB418\uC5B4 \uD589\uC774 rowHeight \uBCF4\uB2E4 \uCEE4\uC9C0\uB294 \uBB38\uC81C\uB97C \uB9C9\uB294 spacer.\n \uC720\uC5F0\uD55C \uBE48 \uD589\uC774 \uB0A8\uB294 \uACF5\uAC04\uC744 \uD761\uC218 \u2192 \uB370\uC774\uD130 \uD589\uC740 rowHeight \uB85C \uACE0\uC815\uB418\uACE0,\n sticky footer \uB294 \uADF8 \uC544\uB798 \uBC14\uB2E5\uC5D0 \uBD99\uB294\uB2E4. \uC2A4\uD06C\uB864\uC774 \uC0DD\uAE30\uBA74 0 \uC73C\uB85C \uC811\uD78C\uB2E4. */}\n {hasFooter && (\n <tr aria-hidden style={{ height: \"100%\" }}>\n <td\n colSpan={columns.length}\n style={{ padding: 0, border: 0 }}\n />\n </tr>\n )}\n </MuiTableBody>\n );\n }),\n // \uD14C\uC774\uBE14 \uD558\uB2E8 \uD569\uACC4 \uD589(tfoot) \u2014 \uBC14\uB2E5\uC5D0 \uACE0\uC815\n TableFoot: forwardRef<HTMLTableSectionElement, any>(\n (props, ref) => (\n <MuiTableFooter\n {...props}\n ref={ref}\n sx={[\n {\n // \uB5A8\uB9BC\uC758 \uADFC\uBCF8 \uC6D0\uC778(\uB370\uC774\uD130 \uD589 \uCE21\uC815 \uB192\uC774\uC758 \uC11C\uBE0C\uD53D\uC140)\uC740 TableRow\n // \uC5D0\uC11C height/maxHeight \uC815\uC218 \uACE0\uC815\uC73C\uB85C \uC7A1\uB294\uB2E4. \uC5EC\uAE30\uC11C\uB294 \uD569\uACC4\uD589\n // \uC140 \uC2A4\uD0C0\uC77C\uB9CC \uB454\uB2E4(virtuoso \uAC00 <tfoot> \uC5D0 \uC9C1\uC811 sticky \uB97C \uAC74\uB2E4).\n // \uD569\uACC4\uD589 \uB192\uC774\uB97C footerHeight(\uBBF8\uC9C0\uC815 \uC2DC rowHeight) \uB85C \uC815\uD655\uD788\n // \uACE0\uC815\uD55C\uB2E4. \uADF8\uB798\uC57C \uB85C\uB529 \uC624\uBC84\uB808\uC774\uC758 \uD558\uB2E8 \uCEF7\uC624\uD504(bottom:\n // footerHeight ?? rowHeight)\uC640 \uC2E4\uC81C footer \uB192\uC774\uAC00 \uC77C\uCE58\uD574\n // \uC624\uBC84\uB808\uC774\uAC00 footer \uC704\uAE4C\uC9C0\uB9CC \uB0B4\uB824\uC624\uACE0 footer \uB97C \uB36E\uC9C0 \uC54A\uB294\uB2E4.\n \"& tr\": {\n height: footerHeight ?? rowHeight,\n maxHeight: footerHeight ?? rowHeight,\n boxSizing: \"border-box\",\n },\n \"& td\": {\n height: footerHeight ?? rowHeight,\n boxSizing: \"border-box\",\n backgroundColor: (theme) =>\n theme.palette.mode === \"dark\"\n ? \"#1e1e1e\"\n : \"#ffffff\",\n // \uC138\uB85C padding \uC744 0 \uC73C\uB85C \uB450\uACE0 \uD589 \uB192\uC774\uB85C \uC815\uB82C\uC744 \uB9E1\uAE34\uB2E4.\n // (\uAC00\uB85C 16px \uC720\uC9C0) \u2014 16px \uC138\uB85C padding \uC774\uBA74 \uC2E4\uC81C footer \uAC00\n // footerHeight \uBCF4\uB2E4 \uCEE4\uC838 \uC624\uBC84\uB808\uC774 \uCEF7\uC624\uD504\uC640 \uC5B4\uAE0B\uB09C\uB2E4.\n padding: \"0 16px\",\n color: \"inherit\",\n fontSize: \"0.875rem\",\n // \uAD6C\uBD84\uC120\uC740 \uC2E4\uC81C border \uB300\uC2E0 inset box-shadow \uB85C \uADF8\uB9B0\uB2E4.\n // collapsed-border \uD53D\uC140 \uACBD\uACC4 \uACF5\uC720\uB85C \uC778\uD55C \uAE5C\uBE61\uC784\uC744 \uD53C\uD55C\uB2E4.\n border: \"none\",\n // \uB178\uC158\uD48D\uC740 \uBA38\uB9AC \uC544\uB798 \uC120\uACFC \uAC19\uC740 \uC9C4\uD55C \uD68C\uC0C9 \uC120 \u2014 \uAC80\uC740 \uC120\uC740 \uC605\uC740 \uD45C\uC5D0\uC11C \uD63C\uC790 \uD280\uC5C8\uB2E4.\n boxShadow: `inset 0 1px 0 0 ${notion ? notionTokens.borderStrong : \"#000000\"}`,\n },\n },\n ...(Array.isArray(footerSx)\n ? footerSx\n : footerSx\n ? [footerSx]\n : []),\n ]}\n />\n ),\n ),\n }),\n [\n // onRowClick/getRowId \uB294 ref \uB85C \uCC98\uB9AC\uD558\uBBC0\uB85C deps \uC5D0\uC11C \uC81C\uC678(\uC778\uB77C\uC778 \uCF5C\uBC31\uC774\uC5B4\uB3C4 \uD589 \uB9AC\uB9C8\uC6B4\uD2B8 \uC548 \uB428).\n hasRowClick,\n // CSS \uD558\uC774\uB77C\uC774\uD2B8 \uBAA8\uB4DC\uC5D0\uC11C\uB294 selectedRowId \uAC00 components \uB97C \uC7AC\uC0DD\uC131\uD558\uC9C0 \uC54A\uAC8C \uD55C\uB2E4(\uD589 \uC7AC\uB80C\uB354 \uBC29\uC9C0).\n // \uD568\uC218\uD615 selectedRowSx(per-row) \uC77C \uB54C\uB9CC selectedRowId \uBCC0\uACBD\uC73C\uB85C components \uB97C \uAC31\uC2E0\uD55C\uB2E4.\n useCssRowHighlight ? null : selectedRowId,\n selectedRowSx,\n rowHeight,\n stripedRowColor,\n rowDivider,\n columnHeight,\n rowHoverColor,\n rowHoverOpacity,\n VirtuosoScroller,\n footerHeight,\n footerSx,\n hasFooter,\n notion,\n notionTokens,\n // spacer \uD589\uC758 colSpan \uACC4\uC0B0\uC5D0 \uC0AC\uC6A9 (\uCEEC\uB7FC \uAD6C\uC870 \uBCC0\uACBD \uC2DC components \uC7AC\uC0DD\uC131)\n columns,\n tableLayout,\n framed,\n autoRowHeight,\n tableMinWidth,\n mobileList,\n external,\n resizeOn,\n ],\n );\n rowComponentRef.current = (VirtuosoTableComponents as Record<string, unknown>).TableRow as React.ComponentType<any>;\n\n const resolvedVirtuosoComponents = VirtuosoTableComponents;\n // autoHeight \uB294 \uAC19\uC740 \uD45C \uBD80\uD488(\uBA38\uB9AC \u00B7 \uC904 \u00B7 \uD569\uACC4)\uC744 \uAC00\uC0C1\uD654 \uC5C6\uC774 \uADF8\uB300\uB85C \uC4F4\uB2E4 \u2014 \uCE78 \uBAA8\uC591\uC774 \uAC00\uC0C1 \uD45C\uC640 \uAC19\uB2E4.\n const autoParts = VirtuosoTableComponents as Record<string, unknown>;\n const AutoTable = autoParts.Table as React.ComponentType<any>;\n const AutoTableHead = autoParts.TableHead as React.ComponentType<any>;\n const AutoTableBody = autoParts.TableBody as React.ComponentType<any>;\n const AutoTableRow = autoParts.TableRow as React.ComponentType<any>;\n const AutoTableFoot = autoParts.TableFoot as React.ComponentType<any>;\n\n // \uBA38\uB9AC \uC6B0\uD074\uB9AD \uBA54\uB274 \u2014 \uC5F4\uC740 \uB9E4 \uB80C\uB354 columns \uC5D0\uC11C \uB2E4\uC2DC \uCC3E\uB294\uB2E4(\uACE0\uB978 \uAC12 \u00B7 \uC815\uB82C \uD45C\uC2DC\uAC00 \uBC14\uB85C \uB530\uB77C\uC624\uAC8C). \uC5F4\uC774 \uC0AC\uB77C\uC84C\uC73C\uBA74 \uADF8\uB9AC\uC9C0 \uC54A\uB294\uB2E4.\n const menuColumn = headerMenu ? columns.find((col) => String(col.id) === headerMenu.colId) : undefined;\n const closeHeaderMenu = () => setHeaderMenu(null);\n let headerMenuNode: React.ReactNode = null;\n if (headerMenu && menuColumn) {\n const colId = String(menuColumn.id);\n const canSort = Boolean((menuColumn.sortMenu ?? menuColumn.sortable) && onSort);\n const canFilter = hasColumnFilter(menuColumn);\n const activeSort = sortBy === colId ? sortDirection : undefined;\n // \uBA54\uB274 \uBAA8\uC591\uC740 \uACF5\uC6A9 HeaderMenu \uD55C \uBC8C\uC774\uB2E4(1.5.0) \u2014 \uD654\uBA74\uC774 \uC9C1\uC811 \uB744\uC6B0\uB294 \uBA38\uB9AC \uBA54\uB274\uC640 \uAC19\uC740 \uD06C\uAE30 \u00B7 \uCCB4\uD06C \uBAA8\uC591.\n headerMenuNode = (\n <HeaderMenu\n open\n anchorPosition={{ left: headerMenu.x, top: headerMenu.y }}\n onClose={closeHeaderMenu}\n sort={\n canSort\n ? {\n active: activeSort ?? null,\n clearable: Boolean(onSortClear),\n onChange: (direction) => {\n if (direction) onSort?.(colId, direction);\n else onSortClear?.();\n },\n }\n : undefined\n }\n filter={\n canFilter\n ? {\n options: menuColumn.filterOptions ?? [],\n value: menuColumn.filterValues ?? [],\n onChange: (values) => menuColumn.onFilterChange?.(values),\n multiple: menuColumn.filterMultiple !== false,\n emptyLabel: menuColumn.filterEmptyLabel,\n searchable: menuColumn.filterSearchable,\n }\n : undefined\n }\n />\n );\n }\n\n // \uACF5\uD1B5 \uD14C\uC774\uBE14 \uB0B4\uC6A9\n const tableContent = (\n <Box\n ref={(el: HTMLDivElement | null) => {\n tableBoxRef.current = el;\n reorderBoxRef.current = el;\n }}\n // \uBC14\uAFBC \uC5F4 \uD3ED(1.8.0) \u2014 \uCE78 \u00B7 \uD45C \uD3ED\uC774 \uC774 \uBCC0\uC218\uB97C \uBCF8\uB2E4\n style={resizeVars ?? undefined}\n sx={\n {\n position: \"relative\",\n height: sizeAuto ? \"auto\" : \"100%\",\n width: \"100%\",\n // \uC904 \uB04C\uC5B4 \uC62E\uAE30\uAE30(1.9.0) \u2014 \uC190\uC7A1\uC774 \u00B7 \uB04C\uB358 \uC904 \uD750\uB9AC\uAC8C \u00B7 \uB193\uC744 \uC790\uB9AC \uC120. \uC904 DOM \uC740 \uC18D\uC131\uB9CC \uBC14\uB00C\uACE0 React \uB294 \uB2E4\uC2DC \uADF8\uB9AC\uC9C0 \uC54A\uB294\uB2E4\n ...(reorder.on\n ? {\n \"& .vdt-reorder-handle\": {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 28,\n height: 28,\n padding: 0,\n border: 0,\n borderRadius: \"4px\",\n background: \"none\",\n color: notion ? notionTokens.headerColor : muiTheme.palette.text.secondary,\n cursor: \"grab\",\n touchAction: \"none\",\n \"&:hover\": { color: muiTheme.palette.text.primary, backgroundColor: notion ? notionTokens.hoverBg : \"rgba(0,0,0,.06)\" },\n \"&:disabled\": { opacity: 0.35, cursor: \"not-allowed\" },\n \"&[aria-pressed=\\\"true\\\"]\": { color: notion ? notionTokens.selectedBar : muiTheme.palette.primary.main, backgroundColor: notion ? notionTokens.selectedBg : \"rgba(0,0,0,.06)\" },\n },\n // \uBA38\uB9AC \uC548 \uACE0\uC815 \uC904(pinnedRows)\uC740 \uC62E\uAE38 \uC218 \uC5C6\uB2E4 \u2014 \uC190\uC7A1\uC774\uB97C \uAC10\uCD98\uB2E4\n \"& thead tr[data-vdt-pinned-row] .vdt-reorder-handle\": { visibility: \"hidden\" },\n \"& tbody tr[data-vdt-dragging] > td\": { opacity: 0.45 },\n \"& [data-vdt-drop-indicator]\": { backgroundColor: notion ? notionTokens.selectedBar : muiTheme.palette.primary.main },\n }\n : {}),\n \"& .MuiTableHead-root\": {\n backgroundColor: (theme: Theme) =>\n notion\n ? `${notionTokens.bg} !important`\n : theme.palette.mode === \"dark\"\n ? \"#1e1e1e !important\"\n : \"#ffffff !important\",\n },\n // \uC120\uD0DD \uD589 CSS \uD558\uC774\uB77C\uC774\uD2B8 (selectedRowId \uBCC0\uACBD \uC2DC \uC774 \uCEE8\uD14C\uC774\uB108\uB9CC \uAC31\uC2E0, \uD589 \uC7AC\uB80C\uB354 \uC5C6\uC74C).\n ...(selectedRowCssSx ?? {}),\n // \uC5F4 \uD3ED \uC190\uC7A1\uC774(1.8.0) \u2014 \uBA38\uB9AC \uCE78(sticky \uB77C \uC790\uB9AC \uAE30\uC900\uC774 \uB41C\uB2E4) \uC624\uB978\uCABD \uB05D 7px. \uC120\uC740 \uD638\uBC84 \u00B7 \uB044\uB294 \uB3D9\uC548\uB9CC \uBCF4\uC778\uB2E4(\uD3C9\uC18C\uC5D0 \uADF8\uC73C\uBA74 \uCE78 \uC0AC\uC774 \uC138\uB85C\uC120\uC774 \uB450 \uACB9\uC774\uB2E4).\n ...(resizeOn\n ? {\n \"& thead th [data-vdt-resize]\": {\n position: \"absolute\",\n top: 0,\n right: 0,\n bottom: 0,\n width: \"7px\",\n cursor: \"col-resize\",\n zIndex: 1,\n \"&::after\": {\n content: '\"\"',\n position: \"absolute\",\n top: 0,\n bottom: 0,\n right: 0,\n width: \"2px\",\n backgroundColor: notion ? notionTokens.selectedBar : muiTheme.palette.primary.main,\n opacity: 0,\n transition: \"opacity 0.12s ease\",\n },\n \"&:hover::after, &[data-active]::after\": { opacity: 1 },\n },\n }\n : {}),\n // \uACE0\uC815 \uC5F4 \uCE78\uC740 \uB4A4\uB85C \uC9C0\uB098\uAC00\uB294 \uCE78\uC744 \uAC00\uB824\uC57C \uD574 \uBC14\uD0D5\uC744 \uCE60\uD55C\uB2E4. \uC904 \uD638\uBC84 \uC0C9\uC740 \uC904(tr)\uC5D0 \uCE60\uD574\uC9C0\uBBC0\uB85C \uACE0\uC815 \uCE78\uC5D0\uB3C4 \uAC19\uC740 \uC0C9\uC744 \uC900\uB2E4.\n \"& tbody td[data-vdt-pinned]\": {\n backgroundColor: notion\n ? notionTokens.bg\n : muiTheme.palette.background.paper,\n },\n // \uCE78 \uB2E8\uC704\uB85C \uB204\uB974\uB294 \uCE78 \u2014 \uCE78\uC5D0\uB9CC \uD638\uBC84 \uBC14\uD0D5.\n \"& tbody td[data-vdt-cell-click]\": { cursor: \"pointer\" },\n \"& tbody td[data-vdt-cell-click]:hover\": {\n backgroundColor: notion\n ? notionTokens.hoverBg\n : muiTheme.palette.mode === \"dark\"\n ? \"rgba(255, 255, 255, 0.06)\"\n : \"rgba(0, 0, 0, 0.04)\",\n },\n ...(notion && hasRowClick\n ? {\n \"& tbody tr:hover td[data-vdt-pinned]\": {\n backgroundColor: notionTokens.hoverBg,\n },\n }\n : {}),\n // \uB05D \uCE78 \uC2A4\uD06C\uB864\uBC14 \uC790\uB9AC(scrollbarGutter) \u2014 \uC544\uB798 \uB178\uC158\uD48D \uCE78 \uC5EC\uBC31(!important)\uBCF4\uB2E4 \uB4A4\uC5D0 \uC640\uC57C \uD558\uBBC0\uB85C \uAC1D\uCCB4 \uB05D\uC5D0\uC11C \uB2E4\uC2DC \uC900\uB2E4(gutterSx).\n // \uB178\uC158\uD48D \u2014 \uBA38\uB9AC\u00B7\uCE78\uC758 \uC778\uB77C\uC778 style(padding\u00B7fontWeight)\uC744 \uB36E\uC5B4\uC57C \uD574\uC11C !important \uB2E4.\n // \uC140\uB809\uD130\uB97C \uCEE8\uD14C\uC774\uB108\uC5D0\uC11C \uB0B4\uB9AC\uB294 \uAC83\uC740 \uD589 \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uAC74\uB4DC\uB9AC\uC9C0 \uC54A\uAE30 \uC704\uD574\uC11C\uB2E4(\uD589 \uC7AC\uB80C\uB354 \uBE44\uC6A9).\n ...(notion\n ? {\n // \uBC14\uAE65 \uD14C\uB450\uB9AC \u2014 \uC5C5\uBB34\uD568 \uD45C(border 1px + radius 4px)\uC640 \uAC19\uB2E4. \uAC00\uC0C1\uD654\uB77C \uB0B4\uC6A9 \uB192\uC774\uC5D0 \uB9DE\uCDB0 \uC904\uC774\uC9C0 \uBABB\uD558\uACE0\n // \uC885\uC774 \uC548\uCABD \uC5EC\uBC31 \uC548\uC5D0\uC11C \uC138\uB85C\uB97C \uAF49 \uCC44\uC6B4\uB2E4. \uBA38\uB9AC\uC758 \uC717\uC120\u00B7\uC88C\uC6B0\uC120\uC740 \uC774 \uD14C\uB450\uB9AC\uAC00 \uB300\uC2E0\uD55C\uB2E4.\n ...(framed\n ? {\n border: `1px solid ${notionTokens.borderStrong}`,\n borderRadius: \"4px\",\n }\n : {\n // \uD2C0 \uC5C6\uC774 \u2014 \uBC14\uAE65 \uC0C1\uC790 \uBC14\uD0D5\uC774 \uBE44\uCE58\uC9C0 \uC54A\uAC8C \uD45C\uB97C \uC885\uC774 \uC0C9\uC73C\uB85C \uCE60\uD55C\uB2E4.\n \"& table\": { backgroundColor: notionTokens.bg },\n }),\n overflow: \"hidden\",\n // \uBA38\uB9AC \uCE78 \uC548\uC758 \uC778\uB77C\uC778 \uC0C1\uC790(\uC544\uC774\uCF58 + \uAE00\uC790\uB97C \uBB36\uC740 inline-flex \uBA38\uB9AC \u00B7 \uBA38\uB9AC\uAE00 \uD544\uD130 \uB2E8\uCD94)\uB294 \uAE30\uC900\uC120\uC5D0 \uC11C\uC11C \uC544\uB798\uC5D0\n // \uAE00\uC790 \uB0B4\uB9BC \uC790\uB9AC\uAC00 \uB0A8\uC544 \uAE00\uC790\uAC00 1~3px \uC704\uB85C \uB5A0 \uBCF4\uC600\uB2E4(1.4.3) \u2014 \uCE78 \uAC00\uC6B4\uB370\uC5D0 \uC138\uC6B4\uB2E4.\n \"& thead tr th > *\": { verticalAlign: \"middle\" },\n // \uBA38\uB9AC \uCE78\uC740 \uD55C \uC904(1.5.0) \u2014 \uCE78 \uD3ED\uBCF4\uB2E4 \uAE34 \uBA38\uB9AC\uAE00 \u00B7 \uC544\uC774\uCF58\uC774 \uB450 \uC904\uB85C \uAEBE\uC5EC \uBA38\uB9AC \uC904\uC774 \uB192\uC544\uC84C\uB2E4(\uC870\uC9C1 \uCE78\uC774 \uB9CE\uC740 \uACC4\uC57D \uBAA9\uB85D).\n // \uB118\uCE58\uBA74 \uB9D0\uC904\uC784, \uC804\uCCB4 \uC774\uB984\uC740 title(\uAE00\uC790 \uBA38\uB9AC) \uD234\uD301\uC73C\uB85C \uBCF8\uB2E4. \uB192\uC774\uB294 columnHeight \uADF8\uB300\uB85C\uB2E4.\n \"& thead > tr > th\": { whiteSpace: \"nowrap\", overflow: \"hidden\", textOverflow: \"ellipsis\" },\n \"& thead > tr > th > *\": { maxWidth: \"100%\" },\n // \uC815\uB82C \uD654\uC0B4\uD45C \uC790\uB9AC\uB294 sortPlacement(\uCE78 \uB9DE\uCDA4)\uAC00 \uC815\uD55C\uB2E4(1.10.4 \u2014 \uD45C \uAF34\uACFC \uC0C1\uAD00\uC5C6\uC774)\n \"& thead tr th\": {\n height: columnHeight,\n boxSizing: \"border-box\",\n padding: \"0 14px !important\",\n fontSize: 13,\n fontWeight: \"500 !important\",\n color: notionTokens.headerColor,\n backgroundColor: `${notionTokens.bg} !important`,\n // \uD2C0 \uC5C6\uB294 \uD45C\uB97C \uB3C4\uAD6C \uC904\uACFC \uD55C \uC0C1\uC790\uC5D0 \uB123\uC73C\uBA74 \uBA38\uB9AC \uC704 \uACBD\uACC4\uAC00 \uC5C6\uB2E4 \u2014 \uADF8\uB54C\uB9CC \uC717\uC120(headerTopBorder).\n borderTop: !framed && headerTopBorder ? `1px solid ${notionTokens.borderStrong}` : \"none\",\n borderBottom: `1px solid ${notionTokens.borderStrong}`,\n // \uCE78 \uC0AC\uC774 \uC138\uB85C\uC120 \u2014 \uB9C8\uC9C0\uB9C9 \uCE78 \uB4A4\uC5D0\uB294 \uAE0B\uC9C0 \uC54A\uB294\uB2E4(\uBC14\uAE65 \uD14C\uB450\uB9AC\uC640 \uACB9\uCCD0 \uB450 \uC904\uB85C \uBCF4\uC778\uB2E4).\n borderRight: `1px solid ${notionTokens.border}`,\n \"&:last-of-type\": { borderRight: \"none\" },\n },\n \"& tbody tr td:not([data-vdt-pad])\": {\n padding: \"0 14px !important\",\n },\n \"& tbody tr td\": {\n fontSize: 14,\n borderBottom: `1px solid ${notionTokens.border}`,\n },\n // \uB9C8\uC9C0\uB9C9 \uC904 \uC544\uB798\uC120 \u2014 \uD2C0 \uBC14\uB2E5(\uB610\uB294 \uD569\uACC4 \uC904\uC758 \uC717\uC120)\uACFC \uB9DE\uB2FF\uC73C\uBA74 \uAE0B\uC9C0 \uC54A\uB294\uB2E4. \uB450 \uC120\uC774 \uACB9\uCCD0 \uAD75\uC740 \uC774\uC911\uC120\uC73C\uB85C \uBCF4\uC600\uB2E4(2026-10-17).\n // \uB9DE\uB2FF\uB294 \uACBD\uC6B0: \uB0B4\uC6A9 \uB192\uC774\uB9CC\uD07C \uC11C\uB294 \uD45C(autoHeight), \uC904\uC774 \uC601\uC5ED\uBCF4\uB2E4 \uAE38\uC5B4 \uB05D\uAE4C\uC9C0 \uB0B4\uB9AC\uBA74 \uBC14\uB2E5\uC5D0 \uB2FF\uB294 \uD45C, \uD569\uACC4 \uC904\uC774 \uC788\uB294 \uD45C.\n // \uC904\uC774 \uC801\uC5B4 \uC544\uB798\uAC00 \uBE44\uB294 \uD45C\uB294 \uADF8\uB300\uB85C \uAE0B\uB294\uB2E4 \u2014 \uC904\uC774 \uC5B4\uB514\uC11C \uB05D\uB098\uB294\uC9C0 \uBCF4\uC5EC\uC57C \uD55C\uB2E4.\n // autoHeight \uB77C\uB3C4 \uD2C0\uC774 \uC5C6\uC73C\uBA74(framed=false) \uB9DE\uB2FF\uB294 \uBC14\uB2E5\uC120\uC774 \uC5C6\uB2E4 \u2014 \uB9C8\uC9C0\uB9C9 \uC904 \uC544\uB798\uC120\uC744 \uB0A8\uAE34\uB2E4(1.9.3, \uC5C5\uBB34\uD568 \uAD6C\uC131\uC6D0 \uBAA9\uB85D \"\uB9C8\uC9C0\uB9C9 \uC904 \uC544\uB798 \uAD6C\uBD84\uC120\uC774 \uC5C6\uB2E4\").\n ...(data.length > 0 && ((sizeAuto && framed) || listOverflows || hasFooter)\n ? { [`& tbody tr[data-index=\"${data.length - 1}\"]:not([data-vdt-pinned-row]) td`]: { borderBottom: \"none\" } }\n : {}),\n }\n : {}),\n ...gutterSx,\n } as SxProps<Theme>\n }\n >\n {reorder.indicator}\n {/* \uD14C\uC774\uBE14 \u2014 autoHeight \uBA74 \uAC00\uC0C1\uD654 \uC5C6\uC774 \uBAA8\uB4E0 \uC904\uC744 \uADF8\uB9AC\uACE0 \uB192\uC774\uB294 \uB0B4\uC6A9\uC744 \uB530\uB978\uB2E4(\uD398\uC774\uC9C0\uAC00 \uAD74\uB9B0\uB2E4). */}\n {autoHeight ? (\n // \uD45C\uC758 \uC624\uB978\uCABD \uB367\uC5EC\uBC31(framed 16px)\uC740 \uAC00\uC0C1 \uC2A4\uD06C\uB864\uB7EC\uC6A9\uC774\uB2E4 \u2014 \uC5EC\uAE30\uC11C\uB294 \uC0C1\uC790 \uD3ED\uC744 16px \uB118\uACA8 \uB298 \uAC00\uB85C \uB9C9\uB300\uAC00 \uC130\uB2E4(1.9.2, \uC5C5\uBB34 \uAE30\uC5EC\uB3C4 \uC0C1\uC138 \uCC3D).\n <Box sx={{ overflowX: \"auto\", width: \"100%\", \"& > .MuiTable-root\": { marginRight: 0 } }}>\n <AutoTable>\n {mobileList ? null : <AutoTableHead>{fixedHeaderContent()}</AutoTableHead>}\n <AutoTableBody>\n {data.map((item, index) => (\n <AutoTableRow\n key={getRowId ? String(getRowId(item, index)) : index}\n item={item}\n data-index={index}\n >\n {rowContent(index, item)}\n </AutoTableRow>\n ))}\n </AutoTableBody>\n {hasFooter && !mobileList ? <AutoTableFoot>{fixedFooterContent()}</AutoTableFoot> : null}\n </AutoTable>\n </Box>\n ) : scrollParent === null ? null : ( // \uBC14\uAE65 \uC2A4\uD06C\uB864 \uC694\uC18C\uB97C \uC544\uC9C1 \uBABB \uC5BB\uC5C8\uC73C\uBA74 \uAE30\uB2E4\uB9B0\uB2E4\n <TableVirtuoso\n key={tableKey}\n ref={virtuosoRef}\n data={data}\n totalCount={onLoadMore ? data.length + 1 : data.length}\n defaultItemHeight={estimatedItemHeight}\n fixedItemHeight={autoRowHeight ? undefined : estimatedItemHeight}\n // \uD3F0 \uBAA9\uB85D\uC740 \uBA38\uB9AC \uC904 \u00B7 \uD569\uACC4 \uC904 \uC5C6\uC774 \uCE74\uB4DC\uB9CC\n fixedHeaderContent={mobileList ? undefined : fixedHeaderContent}\n fixedFooterContent={hasFooter && !mobileList ? fixedFooterContent : undefined}\n itemContent={rowContent}\n // \uD0A4 \uD568\uC218\uB294 \uC4F8 \uB54C\uB9CC \uB118\uAE34\uB2E4 \u2014 computeItemKey={undefined} \uB97C \uADF8\uB300\uB85C \uB118\uAE30\uBA74 react-virtuoso \uC758 \uAE30\uBCF8 \uD0A4 \uD568\uC218\uAC00 undefined \uB85C \uB36E\uC5EC\n // \"n is not a function\" \uC73C\uB85C \uD45C \uC804\uCCB4\uAC00 \uADF8\uB824\uC9C0\uC9C0 \uC54A\uC558\uB2E4(1.3.0, 2026-10-18).\n {...(rowKeyFromId && getRowId\n ? { computeItemKey: (index: number, item: T) => (item ? getRowId(item, index) : `vdt-${index}`) }\n : {})}\n endReached={handleEndReached}\n scrollerRef={(el) => {\n scrollerElRef.current = el instanceof HTMLElement ? el : null;\n checkListOverflow();\n }}\n totalListHeightChanged={checkListOverflow}\n style={external ? undefined : { height: \"100%\" }}\n // \uBC14\uAE65 \uC2A4\uD06C\uB864(1.7.0) \u2014 \uC571 \uC178\uCC98\uB7FC \uD398\uC774\uC9C0\uAC00 \uAD74\uB9AC\uB294 \uD654\uBA74(\uBA38\uB9AC \uC811\uAE30 \u00B7 \uB9E8 \uC704\uB85C \u00B7 \uB2F9\uACA8\uC11C \uC0C8\uB85C\uACE0\uCE68\uC740 \uBC14\uAE65 \uAC83\uC774 \uADF8\uB300\uB85C \uD55C\uB2E4)\n {...(external ? { customScrollParent: scrollParent as HTMLElement } : {})}\n increaseViewportBy={{\n top: viewportBufferTop,\n bottom: viewportBufferBottom,\n }}\n overscan={virtuosoOverscan}\n // \uCCAB \uADF8\uB9BC\uBD80\uD130 \uC55E\uCABD \uC904\uC744 \uADF8\uB9B0\uB2E4(1.7.3 \u2014 \uB2E4\uC2DC \uC5F0 \uD654\uBA74\uC774 \uC7A0\uAE50 \uBE44\uC9C0 \uC54A\uAC8C). \uC904 \uC218\uBCF4\uB2E4 \uB9CE\uC73C\uBA74 virtuoso \uAC00 \uACBD\uACE0\uD558\uBBC0\uB85C \uC904\uC778\uB2E4\n {...(initialItemCount && data.length > 0 ? { initialItemCount: Math.min(initialItemCount, data.length) } : {})}\n followOutput={false}\n components={resolvedVirtuosoComponents}\n />\n )}\n\n {/* \uBE48 \uB370\uC774\uD130 \uD45C\uC2DC \u2014 \uB178\uC158\uD48D\uC740 \uBA38\uB9AC \uC544\uB798\uC5D0 \uC605\uC740 \uAE00 \uD55C \uC904(\uC5C5\uBB34\uD568 \uBAA9\uB85D \uD45C\uC758 \uBE48 \uBAA9\uB85D\uACFC \uAC19\uC740 \uBAA8\uC591). */}\n {data.length === 0 && !loading && !hasPinnedRows && notion && typeof emptyMessage === \"string\" && (\n <Box\n sx={{\n position: sizeAuto ? \"static\" : \"absolute\",\n top: mobileList ? 0 : columnHeight,\n left: 0,\n right: 0,\n py: 6,\n // \uC88C\uC6B0 16px \u2014 \uD2C0 \uC5C6\uB294 \uD45C(framed=false \u00B7 \uD3F0 \uBAA9\uB85D)\uB294 \uC548\uCABD \uC5EC\uBC31\uC774 \uC5C6\uC5B4 \uAE34 \uC548\uB0B4 \uAE00\uC774 \uD654\uBA74 \uB05D\uAE4C\uC9C0 \uB2FF\uC558\uB2E4(1.6.1)\n px: 2,\n textAlign: \"center\",\n fontSize: 14,\n color: notionTokens.emptyColor,\n // \uAE00 \uD55C \uC904\uBFD0\uC774\uB77C \uB204\uB97C \uAC83\uC774 \uC5C6\uB2E4 \u2014 \uBA38\uB9AC \uCE78 \uD074\uB9AD \u00B7 \uC6B0\uD074\uB9AD\uC744 \uAC00\uB85C\uCC44\uC9C0 \uC54A\uAC8C.\n pointerEvents: \"none\",\n }}\n >\n {emptyMessage}\n </Box>\n )}\n {data.length === 0 && !loading && !hasPinnedRows && !(notion && typeof emptyMessage === \"string\") && (\n <Box\n sx={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 2,\n px: 2, // \uD2C0 \uC5C6\uB294 \uD45C\uC5D0\uC11C\uB3C4 \uC548\uB0B4 \uAE00\uC774 \uD654\uBA74 \uB05D\uC5D0 \uB2FF\uC9C0 \uC54A\uAC8C(1.6.1)\n textAlign: \"center\",\n // \uD45C \uC804\uCCB4(\uBA38\uB9AC \uD3EC\uD568)\uB97C \uB36E\uB294 \uC0C1\uC790\uB77C \uBE48 \uBAA9\uB85D\uC5D0\uC11C \uBA38\uB9AC \uCE78 \uC815\uB82C \u00B7 \uC6B0\uD074\uB9AD \uBA54\uB274\uAC00 \uBA39\uC9C0 \uC54A\uC558\uB2E4(1.4.2) \u2014\n // \uC0C1\uC790\uB294 \uD1B5\uACFC\uC2DC\uD0A4\uACE0 \uAC00\uC6B4\uB370 \uB0B4\uC6A9(\uC548\uB0B4 \u00B7 \uB2E8\uCD94)\uB9CC \uB20C\uB9AC\uAC8C \uD55C\uB2E4.\n pointerEvents: \"none\",\n \"& > *\": { pointerEvents: \"auto\" },\n }}\n >\n {typeof emptyMessage === \"string\" ? (\n <>\n <Box\n sx={{\n width: 48,\n height: 48,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"50%\",\n backgroundColor: \"#f5f5f5\",\n color: \"#999\",\n }}\n >\n \uD83D\uDCC4\n </Box>\n <Typography\n variant=\"body1\"\n sx={{ color: \"text.secondary\" }}\n >\n {emptyMessage}\n </Typography>\n </>\n ) : (\n emptyMessage\n )}\n </Box>\n )}\n\n {headerMenuNode}\n\n {/* \uB85C\uB529 \uC2A4\uD53C\uB108 */}\n {shouldShowLoading && (\n <>\n {LoadingComponent ? (\n <LoadingComponent\n visible={loading}\n onComplete={handleLoadingComplete}\n />\n ) : loadingGate ? (\n // \uC571 \uC804\uC5ED \uB85C\uB529 \uAD00\uBB38(1.11.0) \u2014 \uC571\uC774 \uAE30\uBCF8 \uB85C\uB529 \uD45C\uC2DC\uB97C \uB300\uC2E0 \uADF8\uB9B4\uC9C0 \uC815\uD55C\uB2E4(\uC608: \uC571 \uC2DC\uC791 \uD654\uBA74\uC744 \uBD99\uC7A1\uACE0 \uC544\uBB34\uAC83\uB3C4 \uC548 \uADF8\uB9BC).\n // \uAD00\uBB38\uC774 \uAE30\uBCF8 \uD45C\uC2DC\uB97C \uC4F0\uACA0\uB2E4\uBA74 fallback \uC744 \uADF8\uB300\uB85C \uADF8\uB9B0\uB2E4.\n React.createElement(loadingGate, {\n visible: Boolean(loading),\n onComplete: handleLoadingComplete,\n fallback: (\n <LoadingProgress\n visible={loading}\n onComplete={handleLoadingComplete}\n size={40}\n indicator={<CssSpinner />}\n sx={{\n top: `${columns.some((col) => col.group) ? columnHeight * 2 : columnHeight}px`,\n bottom: `${hasFooter ? footerHeight ?? rowHeight : 0}px`,\n }}\n background={{ show: data.length === 0, opacity: 0.8 }}\n />\n ),\n })\n ) : (\n <LoadingProgress\n visible={loading}\n onComplete={handleLoadingComplete}\n size={40}\n indicator={<CssSpinner />}\n sx={{\n top: `${\n columns.some((col) => col.group)\n ? columnHeight * 2\n : columnHeight\n }px`,\n // \uD478\uD130(\uD569\uACC4 \uD589)\uAC00 \uC788\uC73C\uBA74 \uADF8 \uB192\uC774\uB9CC\uD07C \uC544\uB798\uB97C \uC798\uB77C, \uD5E4\uB354~\uD478\uD130 \uC0AC\uC774 \uB0B4\uC6A9 \uC601\uC5ED \uC911\uC559\uC5D0 \uC2A4\uD53C\uB108\uB97C \uB454\uB2E4.\n bottom: `${hasFooter ? footerHeight ?? rowHeight : 0}px`,\n }}\n background={{\n show: data.length === 0, // \uCD5C\uCD08 \uB85C\uB529\uC5D0\uB9CC \uBC30\uACBD \uD45C\uC2DC\n opacity: 0.8,\n }}\n />\n )}\n </>\n )}\n </Box>\n );\n\n // \uB178\uC158\uD48D\uC740 \uC0AC\uBC29 \uC5EC\uBC31 \u2014 \uC5C5\uBB34\uD568\uCC98\uB7FC \uD45C\uAC00 \uC885\uC774 \uAC00\uC7A5\uC790\uB9AC\uC5D0 \uBD99\uC9C0 \uC54A\uB294\uB2E4(\uC88C\uC6B0 paddingX, \uC0C1\uD558 NOTION_PADDING_Y).\n const notionFramePadding = notion && framed\n ? { paddingRight: paddingX, paddingTop: NOTION_PADDING_Y, paddingBottom: NOTION_PADDING_Y }\n : {};\n\n return showPaper ? (\n <Paper\n className=\"grow\"\n elevation={1}\n sx={{\n padding: 0,\n paddingLeft: paddingX,\n ...notionFramePadding,\n boxSizing: \"border-box\",\n height: sizeAuto ? \"auto\" : \"100%\",\n minHeight: 0,\n flex: sizeAuto ? \"none\" : 1,\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {tableContent}\n </Paper>\n ) : (\n <Box\n className=\"grow\"\n style={{\n padding: 0,\n paddingLeft: paddingX,\n ...notionFramePadding,\n boxSizing: \"border-box\",\n height: sizeAuto ? \"auto\" : \"100%\",\n minHeight: 0,\n flex: sizeAuto ? \"none\" : 1,\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {tableContent}\n </Box>\n );\n}\n\n\n/**\n * \uC571 \uC804\uC5ED \uB85C\uB529 \uAD00\uBB38(1.11.0) \u2014 LoadingComponent \uB97C \uC8FC\uC9C0 \uC54A\uC740 \uD45C \uBAA8\uB450\uC5D0 \uAC78\uB9B0\uB2E4.\n * \uAD00\uBB38\uC740 { visible, onComplete, fallback } \uC744 \uBC1B\uC544, \uAE30\uBCF8 \uB85C\uB529 \uD45C\uC2DC(fallback)\uB97C \uADF8\uB9AC\uAC70\uB098 \uB2E4\uB978 \uAC83\uC744 \uADF8\uB9B0\uB2E4.\n * visible \uC774 false \uAC00 \uB418\uBA74 onComplete \uB97C \uBD88\uB7EC\uC57C \uD45C\uAC00 \uB85C\uB529 \uD45C\uC2DC\uB97C \uAC77\uB294\uB2E4(fallback \uC744 \uADF8\uB838\uC73C\uBA74 fallback \uC774 \uBD80\uB978\uB2E4).\n */\nexport interface VirtualDataTableLoadingGateProps {\n visible: boolean;\n onComplete: () => void;\n fallback: React.ReactNode;\n}\nlet loadingGate: React.ComponentType<VirtualDataTableLoadingGateProps> | null = null;\nexport function setVirtualDataTableLoadingGate(gate: React.ComponentType<VirtualDataTableLoadingGateProps> | null): void {\n loadingGate = gate;\n}\n\nexport const VirtualDataTable = memo(VirtualDataTableComponent) as <T>(\n props: VirtualDataTableProps<T>,\n) => React.JSX.Element;\n", "/**\n * rowReorder.tsx \u2014 \uC904 \uB04C\uC5B4 \uC62E\uAE30\uAE30(1.9.0)\n *\n * \uCCAB \uCE78\uC5D0 \uC190\uC7A1\uC774(\u22EE\u22EE)\uB97C \uC138\uC6B0\uACE0, \uC190\uC7A1\uC774\uB97C \uB04C\uBA74 \uB193\uC744 \uC790\uB9AC\uC5D0 \uC120\uC744 \uAE0B\uACE0 \uB193\uC744 \uB54C onReorder(from, to) \uB97C \uBD80\uB978\uB2E4. \uD45C\uB294 data \uB97C \uBC14\uAFB8\uC9C0 \uC54A\uB294\uB2E4 \u2014\n * \uC18C\uBE44\uCC98\uAC00 \uBC14\uAFD4 \uB118\uAE30\uBA74 \uADF8\uB300\uB85C \uB2E4\uC2DC \uADF8\uB9B0\uB2E4. \uAC00\uC0C1\uD654 \uD45C\uC5D0\uC11C\uB3C4 \uB418\uB3C4\uB85D \uC904 DOM \uC744 \uC190\uB300\uC9C0 \uC54A\uB294\uB2E4: \uB044\uB294 \uB3D9\uC548\uC740 \uD3EC\uC778\uD130 \uC544\uB798 \uC904(elementFromPoint)\uC758\n * \uC790\uB9AC\uB85C \uC120 \uC704\uCE58\uB9CC \uC815\uD558\uACE0, \uB04C\uB358 \uC904\uC740 data-vdt-dragging \uC18D\uC131\uC73C\uB85C \uD750\uB9AC\uAC8C \uBCF4\uC778\uB2E4(React \uC7AC\uB80C\uB354 \uC5C6\uC74C). \uBC14\uAE65 \uC758\uC874\uC131(dnd-kit \uB4F1) \uC5C6\uC774 \uD3EC\uC778\uD130 \uC774\uBCA4\uD2B8\uB85C \uD55C\uB2E4.\n * \uD0A4\uBCF4\uB4DC: \uC190\uC7A1\uC774\uC5D0 \uCD08\uC810 \u2192 Space(\uB4E4\uAE30) \u2192 \u2191 \u2193 \uB85C \uD55C \uCE78\uC529(\uBC14\uB85C onReorder) \u2192 Space \u00B7 Enter \u00B7 Esc \uB85C \uB193\uAE30.\n */\nimport React, { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport type { DataColumn, VDTRowReorderConfig } from \"./types\";\nimport { useI18n } from \"./i18n\";\n\n/** \uC190\uC7A1\uC774 \uC5F4\uC758 id \u2014 \uC18C\uBE44\uCC98 \uC5F4\uACFC \uACB9\uCE58\uC9C0 \uC54A\uAC8C */\nexport const REORDER_COLUMN_ID = \"__vdt_reorder\";\n/** \uC790\uB3D9 \uC2A4\uD06C\uB864\uC774 \uC2DC\uC791\uB418\uB294 \uAC00\uC7A5\uC790\uB9AC \uD3ED px */\nconst EDGE_PX = 40;\n/** \uC790\uB3D9 \uC2A4\uD06C\uB864 \uCD5C\uB300 \uC18D\uB3C4 px/\uD504\uB808\uC784 */\nconst EDGE_SPEED = 14;\n\n/** \uC190\uC7A1\uC774 \uADF8\uB9BC(Material DragIndicator \uACBD\uB85C) \u2014 @mui/icons-material \uC744 \uB4E4\uC774\uC9C0 \uC54A\uC73C\uB824\uACE0 \uACBD\uB85C\uB9CC \uB454\uB2E4 */\nconst HANDLE_ICON = (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" aria-hidden focusable=\"false\">\n <path fill=\"currentColor\" d=\"M11 18c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zm-2-8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 4c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\" />\n </svg>\n);\n\ninterface Drag {\n from: number; // \uB04C\uAE30 \uC2DC\uC791\uD55C \uC904\n item: unknown;\n pointerId: number;\n x: number;\n y: number;\n to: number | null; // \uB193\uC73C\uBA74 \uC124 \uC790\uB9AC(data \uC21C\uBC88) \u2014 null \uC774\uBA74 \uC544\uC9C1 \uBAA8\uB978\uB2E4\n tr: HTMLElement | null; // \uB04C\uB358 \uC904\n}\n\n/** \uBCF8\uBB38 \uC904\uB4E4(\uACE0\uC815 \uC904 \uC81C\uC678) \u2014 \uBCF4\uC774\uB294 \uAC83\uB9CC(\uAC00\uC0C1\uD654) */\nconst bodyRows = (box: HTMLElement) => Array.from(box.querySelectorAll<HTMLElement>(\"tbody tr[data-index]:not([data-vdt-pinned-row])\"));\n\n/** \uAC00\uC7A5 \uAC00\uAE4C\uC6B4 \uAD74\uB9AC\uB294 \uC870\uC0C1(autoHeight \uD45C\uAC00 \uC4F4\uB2E4) */\nfunction nearestScrollable(el: HTMLElement | null): HTMLElement | null {\n for (let e = el; e; e = e.parentElement) {\n const { overflowY } = getComputedStyle(e);\n if ((overflowY === \"auto\" || overflowY === \"scroll\") && e.scrollHeight > e.clientHeight) return e;\n }\n return null;\n}\n\nexport interface UseRowReorderArgs<T> {\n config: VDTRowReorderConfig<T> | undefined;\n tableBoxRef: React.RefObject<HTMLElement | null>; // \uD45C \uC0C1\uC790(position: relative) \u2014 \uC120\uC744 \uC774 \uC548\uC5D0 \uADF8\uB9B0\uB2E4\n getScroller: () => HTMLElement | null; // \uD45C\uB97C \uAD74\uB9AC\uB294 \uC694\uC18C(\uC5C6\uC73C\uBA74 \uBB38\uC11C)\n dataLengthRef: React.RefObject<number>;\n anyPinned: boolean; // \uACE0\uC815 \uC5F4\uC774 \uC788\uC73C\uBA74 \uC190\uC7A1\uC774 \uC5F4\uB3C4 \uACE0\uC815\uD55C\uB2E4(\uC544\uB2C8\uBA74 \uACE0\uC815 \uC5F4\uC774 \uC190\uC7A1\uC774\uB97C \uB36E\uB294\uB2E4)\n}\n\n/**\n * \uB04C\uC5B4 \uC62E\uAE30\uAE30 \u2014 \uC190\uC7A1\uC774 \uC5F4 \u00B7 \uC190\uC7A1\uC774 \uB80C\uB354 \u00B7 \uD45C \uC0C1\uC790\uC5D0 \uB123\uC744 \uC120 \uC694\uC18C\uB97C \uB3CC\uB824\uC900\uB2E4.\n * \uBAA8\uB4E0 \uD3EC\uC778\uD130 \uCC98\uB9AC\uB294 ref \uB85C \uD574 \uB044\uB294 \uB3D9\uC548 React \uAC00 \uB2E4\uC2DC \uADF8\uB9AC\uC9C0 \uC54A\uB294\uB2E4.\n */\nexport function useRowReorder<T>({ config, tableBoxRef, getScroller, dataLengthRef, anyPinned }: UseRowReorderArgs<T>) {\n const { t } = useI18n();\n const configRef = useRef(config);\n configRef.current = config;\n const on = Boolean(config);\n const dragRef = useRef<Drag | null>(null);\n const rafRef = useRef(0);\n const indicatorRef = useRef<HTMLDivElement | null>(null);\n const liftedRef = useRef<number | null>(null); // \uD0A4\uBCF4\uB4DC\uB85C \uB4E0 \uC904\n\n const hideIndicator = () => {\n if (indicatorRef.current) indicatorRef.current.style.display = \"none\";\n };\n\n /** \uD3EC\uC778\uD130 \uC790\uB9AC\uB85C \uB193\uC744 \uC790\uB9AC\uB97C \uC815\uD558\uACE0 \uC120\uC744 \uAE0B\uB294\uB2E4 */\n const updateTarget = useCallback(() => {\n const d = dragRef.current;\n const box = tableBoxRef.current;\n if (!d || !box) return;\n const rows = bodyRows(box);\n if (rows.length === 0) return;\n const under = document.elementFromPoint(d.x, d.y)?.closest<HTMLElement>(\"tr[data-index]\");\n let row: HTMLElement | null = under && box.contains(under) && !under.hasAttribute(\"data-vdt-pinned-row\") ? under : null;\n let edge: \"before\" | \"after\";\n if (row) {\n const r = row.getBoundingClientRect();\n edge = d.y < r.top + r.height / 2 ? \"before\" : \"after\";\n } else {\n const first = rows[0].getBoundingClientRect();\n const last = rows[rows.length - 1].getBoundingClientRect();\n if (d.y < first.top) {\n row = rows[0];\n edge = \"before\";\n } else if (d.y > last.bottom) {\n row = rows[rows.length - 1];\n edge = \"after\";\n } else return; // \uC904 \uC0AC\uC774 \uD2C8(\uAD6C\uBD84\uC120) \u2014 \uC9C0\uB09C \uC790\uB9AC\uB97C \uC9C0\uD0A8\uB2E4\n }\n const idx = Number(row.dataset.index);\n const insertAt = edge === \"before\" ? idx : idx + 1;\n const to = insertAt > d.from ? insertAt - 1 : insertAt;\n d.to = to;\n const ind = indicatorRef.current;\n if (!ind) return;\n if (to === d.from) {\n ind.style.display = \"none\";\n return;\n }\n const r = row.getBoundingClientRect();\n const b = box.getBoundingClientRect();\n const y = (edge === \"before\" ? r.top : r.bottom) - b.top;\n ind.style.top = `${Math.max(0, Math.min(b.height - 2, Math.round(y) - 1))}px`;\n ind.style.display = \"block\";\n }, [tableBoxRef]);\n\n /** \uAC00\uC7A5\uC790\uB9AC \uC790\uB3D9 \uC2A4\uD06C\uB864 \u2014 \uD3EC\uC778\uD130\uAC00 \uB05D \uAC00\uAE4C\uC774\uC5D0 \uC788\uB294 \uB3D9\uC548 \uD504\uB808\uC784\uB9C8\uB2E4 \uAD74\uB9B0\uB2E4 */\n const autoScroll = useCallback(() => {\n cancelAnimationFrame(rafRef.current);\n const step = () => {\n const d = dragRef.current;\n if (!d) return;\n const scroller = getScroller() ?? nearestScrollable(tableBoxRef.current) ?? null;\n const target: HTMLElement | null = scroller ?? (document.scrollingElement as HTMLElement | null);\n if (!target) return;\n const top = scroller ? scroller.getBoundingClientRect().top : 0;\n const bottom = scroller ? scroller.getBoundingClientRect().bottom : window.innerHeight;\n let dy = 0;\n if (d.y < top + EDGE_PX) dy = -Math.ceil(((top + EDGE_PX - d.y) / EDGE_PX) * EDGE_SPEED);\n else if (d.y > bottom - EDGE_PX) dy = Math.ceil(((d.y - (bottom - EDGE_PX)) / EDGE_PX) * EDGE_SPEED);\n if (dy !== 0) {\n target.scrollTop += dy;\n updateTarget();\n rafRef.current = requestAnimationFrame(step);\n }\n };\n rafRef.current = requestAnimationFrame(step);\n }, [getScroller, tableBoxRef, updateTarget]);\n\n const finish = useCallback(\n (commit: boolean) => {\n const d = dragRef.current;\n if (!d) return;\n dragRef.current = null;\n cancelAnimationFrame(rafRef.current);\n hideIndicator();\n d.tr?.removeAttribute(\"data-vdt-dragging\");\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n if (commit && d.to !== null && d.to !== d.from) configRef.current?.onReorder(d.from, d.to, d.item as T);\n },\n [],\n );\n\n // \uCC3D \uB2E8\uC704 \uC774\uBCA4\uD2B8 \u2014 \uB044\uB294 \uB3D9\uC548\uB9CC \uB4E3\uB294\uB2E4(\uD3EC\uC778\uD130\uB97C \uC190\uC7A1\uC774\uAC00 \uBD99\uC7A1\uC544\uB3C4 window \uAE4C\uC9C0 \uC62C\uB77C\uC628\uB2E4)\n useEffect(() => {\n if (!on) return;\n const move = (e: PointerEvent) => {\n const d = dragRef.current;\n if (!d || e.pointerId !== d.pointerId) return;\n d.x = e.clientX;\n d.y = e.clientY;\n updateTarget();\n autoScroll();\n };\n const up = (e: PointerEvent) => {\n const d = dragRef.current;\n if (!d || e.pointerId !== d.pointerId) return;\n finish(e.type === \"pointerup\");\n };\n const key = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && dragRef.current) finish(false);\n };\n window.addEventListener(\"pointermove\", move);\n window.addEventListener(\"pointerup\", up);\n window.addEventListener(\"pointercancel\", up);\n window.addEventListener(\"keydown\", key);\n return () => {\n window.removeEventListener(\"pointermove\", move);\n window.removeEventListener(\"pointerup\", up);\n window.removeEventListener(\"pointercancel\", up);\n window.removeEventListener(\"keydown\", key);\n finish(false);\n };\n }, [on, updateTarget, autoScroll, finish]);\n\n /** \uD0A4\uBCF4\uB4DC\uB85C \uB4E0 \uC904 \uD45C\uC2DC\uB97C \uB2E4\uC2DC \uBD99\uC778\uB2E4(\uC904\uC774 \uB2E4\uC2DC \uADF8\uB824\uC9C4 \uB4A4) */\n const markLifted = useCallback(\n (index: number | null) => {\n const box = tableBoxRef.current;\n if (!box) return;\n box.querySelectorAll(\"tbody tr[data-vdt-dragging]\").forEach((tr) => tr.removeAttribute(\"data-vdt-dragging\"));\n box.querySelectorAll(\".vdt-reorder-handle[aria-pressed=\\\"true\\\"]\").forEach((h) => h.setAttribute(\"aria-pressed\", \"false\"));\n if (index === null) return;\n const tr = box.querySelector<HTMLElement>(`tbody tr[data-index=\"${index}\"]:not([data-vdt-pinned-row])`);\n tr?.setAttribute(\"data-vdt-dragging\", \"\");\n tr?.querySelector(\".vdt-reorder-handle\")?.setAttribute(\"aria-pressed\", \"true\");\n },\n [tableBoxRef],\n );\n\n const onHandlePointerDown = useCallback(\n (e: React.PointerEvent<HTMLButtonElement>, index: number, item: T) => {\n e.stopPropagation();\n if (e.button !== 0 && e.pointerType === \"mouse\") return;\n if (configRef.current?.disabledReason) return;\n const tr = e.currentTarget.closest<HTMLElement>(\"tr\");\n if (tr?.hasAttribute(\"data-vdt-pinned-row\")) return;\n e.preventDefault();\n if (liftedRef.current !== null) {\n liftedRef.current = null;\n markLifted(null);\n }\n try {\n e.currentTarget.setPointerCapture(e.pointerId);\n } catch {\n /* \uD3EC\uC778\uD130\uB97C \uBABB \uBD99\uC7A1\uC544\uB3C4 window \uC774\uBCA4\uD2B8\uB85C \uC774\uC5B4 \uAC04\uB2E4 */\n }\n dragRef.current = { from: index, item, pointerId: e.pointerId, x: e.clientX, y: e.clientY, to: null, tr };\n tr?.setAttribute(\"data-vdt-dragging\", \"\");\n document.body.style.cursor = \"grabbing\";\n document.body.style.userSelect = \"none\";\n },\n [markLifted],\n );\n\n const onHandleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLButtonElement>, index: number, item: T) => {\n const cfg = configRef.current;\n if (!cfg || cfg.disabledReason) return;\n const lifted = liftedRef.current;\n if (e.key === \" \" || e.key === \"Enter\") {\n e.preventDefault();\n e.stopPropagation();\n liftedRef.current = lifted === null ? index : null;\n markLifted(liftedRef.current);\n return;\n }\n if (e.key === \"Escape\" && lifted !== null) {\n e.preventDefault();\n liftedRef.current = null;\n markLifted(null);\n return;\n }\n if ((e.key === \"ArrowUp\" || e.key === \"ArrowDown\") && lifted !== null) {\n e.preventDefault();\n e.stopPropagation();\n const to = Math.max(0, Math.min((dataLengthRef.current ?? 1) - 1, index + (e.key === \"ArrowUp\" ? -1 : 1)));\n if (to === index) return;\n cfg.onReorder(index, to, item);\n liftedRef.current = to;\n // \uC904\uC774 \uB2E4\uC2DC \uADF8\uB824\uC9C4 \uB4A4 \uC62E\uAE34 \uC904\uC758 \uC190\uC7A1\uC774\uB85C \uCD08\uC810\uC744 \uC62E\uAE30\uACE0 \uB4E0 \uD45C\uC2DC\uB97C \uB2E4\uC2DC \uBD99\uC778\uB2E4\n requestAnimationFrame(() =>\n requestAnimationFrame(() => {\n const box = tableBoxRef.current;\n const h = box?.querySelector<HTMLButtonElement>(`tbody tr[data-index=\"${to}\"]:not([data-vdt-pinned-row]) .vdt-reorder-handle`);\n h?.focus({ preventScroll: false });\n markLifted(to);\n }),\n );\n }\n },\n [dataLengthRef, markLifted, tableBoxRef],\n );\n\n /** \uC190\uC7A1\uC774 \uB2E8\uCD94 \u2014 \uCE78 \u00B7 \uD3F0 \uCE74\uB4DC\uAC00 \uD568\uAED8 \uC4F4\uB2E4 */\n const renderHandle = useCallback(\n (item: T, index: number): React.ReactNode => {\n const cfg = configRef.current;\n if (!cfg) return null;\n if (cfg.canDrag && !cfg.canDrag(item, index)) return null;\n const label = cfg.handleLabel ?? t(\"reorderHandle\");\n return (\n <button\n type=\"button\"\n className=\"vdt-reorder-handle\"\n aria-label={label}\n title={cfg.disabledReason ?? label}\n disabled={Boolean(cfg.disabledReason)}\n onPointerDown={(e) => onHandlePointerDown(e, index, item)}\n onKeyDown={(e) => onHandleKeyDown(e, index, item)}\n // \uC904 \uB204\uB984(onRowClick) \u00B7 \uB04C\uC5B4\uC11C \uAD74\uB9AC\uAE30 \uAC10\uC9C0\uB85C \uBC88\uC9C0\uC9C0 \uC54A\uAC8C\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onContextMenu={(e) => e.stopPropagation()}\n >\n {HANDLE_ICON}\n </button>\n );\n },\n [onHandlePointerDown, onHandleKeyDown, t],\n );\n\n const handleWidth = config?.handleWidth ?? 36;\n // \uB9C9\uB294 \uC774\uC720\uAC00 \uBC14\uB00C\uBA74 \uC5F4\uC744 \uC0C8\uB85C \uB9CC\uB4E4\uC5B4 \uC904\uC774 \uB2E4\uC2DC \uADF8\uB824\uC9C0\uAC8C \uD55C\uB2E4 \u2014 \uC190\uC7A1\uC774\uC758 disabled \u00B7 title \uC740 \uADF8\uB9B4 \uB54C \uC77D\uB294\uB2E4\n const disabledReason = config?.disabledReason;\n /** \uD45C \uB9E8 \uC55E\uC5D0 \uB07C\uC6B8 \uC190\uC7A1\uC774 \uC5F4 \u2014 \uD3F0 \uCE74\uB4DC\uC5D0\uC11C\uB294 \uC5F4 \uB300\uC2E0 \uCE74\uB4DC \uC67C\uCABD\uC5D0 \uC190\uC7A1\uC774\uB97C \uC138\uC6B4\uB2E4(mobile: false) */\n const handleColumn = useMemo<DataColumn<T> | null>(\n () =>\n on\n ? {\n id: REORDER_COLUMN_ID,\n text: \"\",\n width: handleWidth,\n align: \"center\",\n cellPadding: 0,\n headerMenu: false,\n mobile: false,\n ...(anyPinned ? { pinned: \"left\" as const } : {}),\n render: renderHandle,\n }\n : null,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [on, handleWidth, anyPinned, renderHandle, disabledReason],\n );\n\n /** \uB193\uC744 \uC790\uB9AC \uC120 \u2014 \uD45C \uC0C1\uC790(position: relative) \uC548\uC5D0 \uB454\uB2E4 */\n const indicator = on ? (\n <div\n ref={indicatorRef}\n data-vdt-drop-indicator=\"\"\n aria-hidden\n style={{ position: \"absolute\", left: 0, right: 0, height: 2, display: \"none\", zIndex: 4, pointerEvents: \"none\" }}\n />\n ) : null;\n\n return { on, handleColumn, renderHandle, indicator };\n}\n", "/**\n * mui-virtual-data-table \uD654\uBA74 \uBB38\uAD6C \uB2E4\uAD6D\uC5B4(2026-10-26).\n *\n * \uBB38\uAD6C\uB294 ./mui-virtual-data-table/<\uC5B8\uC5B4>.json(\uD3C9\uD3C9\uD55C { \uC5F4\uC1E0: \uAE00 }). ko \u00B7 en \uC740 \uC190\uC73C\uB85C, \uB098\uBA38\uC9C0\uB294 \uC5C5\uBB34\uD568 www/scripts/i18n-translate.mjs \uB85C \uCC44\uC6B4\uB2E4.\n * \uAE30\uBCF8 \uC5B8\uC5B4\uB294 \uD55C\uAD6D\uC5B4 \u2014 \uC571\uC774 setMuiVirtualDataTableLocale(lang) \uC744 \uBD80\uB974\uBA74 \uADF8 \uC5B8\uC5B4\uB85C \uBC14\uAFB8\uACE0, \uADF8 \uBB38\uAD6C\uB97C \uC4F0\uB294 \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uB2E4\uC2DC \uADF8\uB9B0\uB2E4.\n * \uBAA8\uB974\uB294 \uC5B8\uC5B4\uBA74 \uC601\uC5B4. \uC5F4\uC1E0\uAC00 \uADF8 \uC5B8\uC5B4\uC5D0 \uC5C6\uC73C\uBA74 \uC601\uC5B4 \u2192 \uD55C\uAD6D\uC5B4 \u2192 \uC5F4\uC1E0 \uC21C\uC73C\uB85C \uCC3E\uB294\uB2E4.\n */\nimport { useCallback, useSyncExternalStore } from \"react\";\nimport ko from \"./mui-virtual-data-table/ko.json\";\nimport en from \"./mui-virtual-data-table/en.json\";\nimport ja from \"./mui-virtual-data-table/ja.json\";\nimport zh from \"./mui-virtual-data-table/zh.json\";\nimport de from \"./mui-virtual-data-table/de.json\";\nimport fr from \"./mui-virtual-data-table/fr.json\";\nimport it from \"./mui-virtual-data-table/it.json\";\nimport vi from \"./mui-virtual-data-table/vi.json\";\n\n/** \uC774 \uD328\uD0A4\uC9C0\uAC00 \uC544\uB294 \uD654\uBA74 \uC5B8\uC5B4 */\nexport type MuiVirtualDataTableLang = \"ko\" | \"en\" | \"ja\" | \"zh\" | \"de\" | \"fr\" | \"it\" | \"vi\";\n\ntype Dict = Record<string, string>;\nconst DICTS: Record<MuiVirtualDataTableLang, Dict> = { ko, en, ja, zh, de, fr, it, vi };\nconst INTL_TAGS: Record<MuiVirtualDataTableLang, string> = { ko: \"ko-KR\", en: \"en-US\", ja: \"ja-JP\", zh: \"zh-CN\", de: \"de-DE\", fr: \"fr-FR\", it: \"it-IT\", vi: \"vi-VN\" };\n\nlet current: MuiVirtualDataTableLang = \"ko\";\nconst listeners = new Set<() => void>();\n\n/** \"en-US\" \u00B7 \"zh_CN\" \uAC19\uC740 \uAC12\uC744 \uC544\uB294 \uC5B8\uC5B4\uB85C \u2014 \uBAA8\uB974\uBA74 \uC601\uC5B4 */\nexport function normalizeLang(lang?: string | null): MuiVirtualDataTableLang {\n const base = String(lang ?? \"\").toLowerCase().split(/[-_]/)[0];\n return (base in DICTS ? base : \"en\") as MuiVirtualDataTableLang;\n}\n\n/** \uD654\uBA74 \uC5B8\uC5B4\uB97C \uC815\uD55C\uB2E4(\uC571 \uC804\uC5ED \u2014 \uC571\uC774 \uC5B8\uC5B4\uB97C \uBC14\uAFC0 \uB54C\uB9C8\uB2E4 \uBD80\uB978\uB2E4). */\nexport function setMuiVirtualDataTableLocale(lang: string): void {\n const next = normalizeLang(lang);\n if (next === current) return;\n current = next;\n listeners.forEach((fn) => fn());\n}\n\n/** \uC9C0\uAE08 \uD654\uBA74 \uC5B8\uC5B4 */\nexport function getMuiVirtualDataTableLocale(): MuiVirtualDataTableLang {\n return current;\n}\n\nfunction subscribe(fn: () => void): () => void {\n listeners.add(fn);\n return () => {\n listeners.delete(fn);\n };\n}\n\nexport type TParams = Record<string, string | number | null | undefined>;\n\n/** \uC5F4\uC1E0 \u2192 \uAE00. lang \uC744 \uC8FC\uBA74 \uADF8 \uC5B8\uC5B4(\uCEF4\uD3EC\uB10C\uD2B8 locale prop), \uC544\uB2C8\uBA74 \uC804\uC5ED \uC5B8\uC5B4. {{x}} \uC5D0 params \uB97C \uB123\uB294\uB2E4. */\nexport function t(key: string, params?: TParams, lang?: string | null): string {\n const l = lang ? normalizeLang(lang) : current;\n const raw = DICTS[l][key] ?? DICTS.en[key] ?? DICTS.ko[key] ?? key;\n if (!params) return raw;\n return raw.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (m, name) => (params[name] == null ? m : String(params[name])));\n}\n\n/** Intl \uC5D0 \uC904 \uC5B8\uC5B4 \uD0DC\uADF8(\uB0A0\uC9DC \u00B7 \uC22B\uC790) */\nexport function intlTag(lang?: string | null): string {\n return INTL_TAGS[lang ? normalizeLang(lang) : current];\n}\n\n/** \uCEF4\uD3EC\uB10C\uD2B8\uC6A9 \u2014 \uC804\uC5ED \uC5B8\uC5B4\uAC00 \uBC14\uB00C\uBA74 \uB2E4\uC2DC \uADF8\uB9B0\uB2E4. localeProp \uC744 \uC8FC\uBA74 \uADF8\uAC83\uC774 \uC774\uAE34\uB2E4. */\nexport function useI18n(localeProp?: string | null) {\n const globalLang = useSyncExternalStore(subscribe, getMuiVirtualDataTableLocale, getMuiVirtualDataTableLocale);\n const lang: MuiVirtualDataTableLang = localeProp ? normalizeLang(localeProp) : globalLang;\n const tt = useCallback((key: string, params?: TParams) => t(key, params, lang), [lang]);\n return { t: tt, lang, intlTag: INTL_TAGS[lang] };\n}\n", "{\n \"clearFilter\": \"\uAC70\uB974\uAE30 \uD480\uAE30\",\n \"clearSort\": \"\uC815\uB82C \uD480\uAE30\",\n \"noMatches\": \"\uCC3E\uB294 \uAC12\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.\",\n \"noOptions\": \"\uACE0\uB97C \uAC12\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.\",\n \"reorderHandle\": \"\uC21C\uC11C \uC62E\uAE30\uAE30\",\n \"search\": \"\uCC3E\uAE30\",\n \"sortAscending\": \"\uC624\uB984\uCC28\uC21C \uC815\uB82C\",\n \"sortDescending\": \"\uB0B4\uB9BC\uCC28\uC21C \uC815\uB82C\"\n}\n", "{\n \"clearFilter\": \"Clear filter\",\n \"clearSort\": \"Clear sort\",\n \"noMatches\": \"No matching values.\",\n \"noOptions\": \"No values to choose from.\",\n \"reorderHandle\": \"Drag to reorder\",\n \"search\": \"Search\",\n \"sortAscending\": \"Sort ascending\",\n \"sortDescending\": \"Sort descending\"\n}\n", "{\n \"clearFilter\": \"\u30D5\u30A3\u30EB\u30BF\u30FC\u89E3\u9664\",\n \"clearSort\": \"\u4E26\u3079\u66FF\u3048\u89E3\u9664\",\n \"noMatches\": \"\u4E00\u81F4\u3059\u308B\u9805\u76EE\u304C\u3042\u308A\u307E\u305B\u3093\u3002\",\n \"noOptions\": \"\u9078\u629E\u53EF\u80FD\u306A\u9805\u76EE\u304C\u3042\u308A\u307E\u305B\u3093\u3002\",\n \"reorderHandle\": \"\u30C9\u30E9\u30C3\u30B0\u3057\u3066\u4E26\u3079\u66FF\u3048\",\n \"search\": \"\u691C\u7D22\",\n \"sortAscending\": \"\u6607\u9806\u3067\u4E26\u3079\u66FF\u3048\",\n \"sortDescending\": \"\u964D\u9806\u3067\u4E26\u3079\u66FF\u3048\"\n}\n", "{\n \"clearFilter\": \"\u6E05\u9664\u7B5B\u9009\",\n \"clearSort\": \"\u6E05\u9664\u6392\u5E8F\",\n \"noMatches\": \"\u672A\u627E\u5230\u5339\u914D\u9879\u3002\",\n \"noOptions\": \"\u6682\u65E0\u53EF\u9009\u5185\u5BB9\u3002\",\n \"reorderHandle\": \"\u62D6\u52A8\u8C03\u6574\u987A\u5E8F\",\n \"search\": \"\u641C\u7D22\",\n \"sortAscending\": \"\u5347\u5E8F\u6392\u5E8F\",\n \"sortDescending\": \"\u964D\u5E8F\u6392\u5E8F\"\n}\n", "{\n \"clearFilter\": \"Filter zur\u00FCcksetzen\",\n \"clearSort\": \"Sortierung zur\u00FCcksetzen\",\n \"noMatches\": \"Keine passenden Werte.\",\n \"noOptions\": \"Keine Werte zur Auswahl.\",\n \"reorderHandle\": \"Ziehen zum Neuanordnen\",\n \"search\": \"Suchen\",\n \"sortAscending\": \"Aufsteigend sortieren\",\n \"sortDescending\": \"Absteigend sortieren\"\n}\n", "{\n \"clearFilter\": \"Effacer le filtre\",\n \"clearSort\": \"Effacer le tri\",\n \"noMatches\": \"Aucune valeur correspondante.\",\n \"noOptions\": \"Aucune option disponible.\",\n \"reorderHandle\": \"Glisser pour r\u00E9organiser\",\n \"search\": \"Rechercher\",\n \"sortAscending\": \"Tri croissant\",\n \"sortDescending\": \"Tri d\u00E9croissant\"\n}\n", "{\n \"clearFilter\": \"Cancella filtro\",\n \"clearSort\": \"Annulla ordinamento\",\n \"noMatches\": \"Nessun valore corrispondente.\",\n \"noOptions\": \"Nessuna opzione disponibile.\",\n \"reorderHandle\": \"Trascina per riordinare\",\n \"search\": \"Cerca\",\n \"sortAscending\": \"Ordina in ordine crescente\",\n \"sortDescending\": \"Ordina in ordine decrescente\"\n}\n", "{\n \"clearFilter\": \"X\u00F3a b\u1ED9 l\u1ECDc\",\n \"clearSort\": \"B\u1ECF s\u1EAFp x\u1EBFp\",\n \"noMatches\": \"Kh\u00F4ng t\u00ECm th\u1EA5y gi\u00E1 tr\u1ECB ph\u00F9 h\u1EE3p.\",\n \"noOptions\": \"Kh\u00F4ng c\u00F3 gi\u00E1 tr\u1ECB \u0111\u1EC3 ch\u1ECDn.\",\n \"reorderHandle\": \"K\u00E9o \u0111\u1EC3 \u0111\u1ED5i th\u1EE9 t\u1EF1\",\n \"search\": \"T\u00ECm ki\u1EBFm\",\n \"sortAscending\": \"S\u1EAFp x\u1EBFp t\u0103ng d\u1EA7n\",\n \"sortDescending\": \"S\u1EAFp x\u1EBFp gi\u1EA3m d\u1EA7n\"\n}\n", "/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n", "/**\n * MIT License\n *\n * Copyright (c) 2025 KIM YOUNG JIN (ehfuse@gmail.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { CSSProperties, ReactNode, useEffect, useRef, useState } from \"react\";\nimport { Box, CircularProgress, SxProps, Theme } from \"@mui/material\";\n\nexport interface BackgroundConfig {\n show?: boolean;\n color?: string; // Any CSS color: hex (#fff, #ffffff), rgb(255,255,255), rgba(), named colors, or RGB string \"255, 255, 255\"\n opacity?: number; // Applied to background (0.0 ~ 1.0). If color is already rgba, this is ignored\n}\n\nexport interface LoadingProgressProps {\n visible: boolean;\n onComplete?: () => void;\n fadeoutDuration?: number;\n exitDelay?: number;\n size?: number;\n className?: string;\n style?: CSSProperties;\n sx?: SxProps<Theme>;\n indicator?: ReactNode | string;\n background?: BackgroundConfig;\n}\n\nexport default function LoadingProgress({\n visible,\n onComplete,\n fadeoutDuration = 200,\n exitDelay = 0,\n size = 40,\n className,\n style,\n sx,\n indicator,\n background = {\n show: true,\n color: \"255, 255, 255\",\n opacity: 0.9,\n },\n}: LoadingProgressProps) {\n const prevVisibleRef = useRef<boolean | undefined>(undefined);\n const boxRef = useRef<HTMLDivElement>(null);\n const [shouldRender, setShouldRender] = useState(visible);\n\n // 배경 설정 기본값 처리\n const {\n show: showBackground = true,\n color: backgroundColor = \"255, 255, 255\",\n opacity: backgroundOpacity = 0.9,\n } = background;\n\n useEffect(() => {\n const prevVisible = prevVisibleRef.current;\n\n // visible이 true에서 false로 변경될 때 페이드아웃 후 onComplete 호출\n if (prevVisible === true && visible === false && boxRef.current) {\n // CSS transition으로 페이드아웃 시작\n const box = boxRef.current;\n box.style.opacity = \"0\";\n\n // fadeoutDuration + exitDelay 후 onComplete 호출 및 언마운트\n setTimeout(() => {\n setShouldRender(false); // 페이드아웃 완료 후 언마운트\n onComplete?.();\n }, fadeoutDuration + exitDelay);\n } else if (visible === true) {\n // visible이 true가 되면 다시 렌더링하고 opacity 복원\n setShouldRender(true);\n if (boxRef.current) {\n boxRef.current.style.opacity = \"1\";\n }\n }\n\n // 현재 visible 값을 ref에 저장\n prevVisibleRef.current = visible;\n }, [visible, onComplete, fadeoutDuration, exitDelay]);\n\n if (!shouldRender) {\n return null;\n }\n\n // indicator 렌더링 로직\n const renderIndicator = () => {\n // string이면 이미지 URL로 간주\n if (typeof indicator === \"string\") {\n return (\n <img\n src={indicator}\n alt=\"Loading\"\n style={{ width: size, height: size }}\n />\n );\n }\n // ReactNode가 제공되면 그대로 렌더링\n if (indicator) {\n return indicator;\n }\n // 기본값: MUI CircularProgress\n return <CircularProgress size={size} />;\n };\n\n // 배경색 처리: 다양한 색상 형식 지원\n const getBackgroundStyle = () => {\n if (!showBackground) {\n return { backgroundColor: \"transparent\" };\n }\n\n // 이미 rgba 형식이면 그대로 사용\n if (backgroundColor.startsWith(\"rgba\")) {\n return { backgroundColor };\n }\n\n // RGB 문자열 형식 (예: \"255, 255, 255\")\n if (/^\\d+,\\s*\\d+,\\s*\\d+$/.test(backgroundColor)) {\n return {\n backgroundColor: `rgba(${backgroundColor}, ${backgroundOpacity})`,\n };\n }\n\n // hex, rgb(), named color 등의 경우\n // CSS에서 color와 opacity를 함께 사용\n if (backgroundOpacity !== 1) {\n return {\n backgroundColor: backgroundColor,\n // 배경에만 opacity를 적용하기 위해 before pseudo-element 사용하거나\n // 직접 rgba로 변환하는 대신 CSS custom property 사용\n \"&::before\": {\n content: '\"\"',\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: backgroundColor,\n opacity: backgroundOpacity,\n zIndex: -1,\n },\n };\n }\n\n // opacity가 1이면 그냥 색상만\n return { backgroundColor };\n };\n\n return (\n <Box\n ref={boxRef}\n className={className}\n style={{ ...style }}\n sx={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 1000,\n opacity: visible ? 1 : 0,\n transition: `opacity ${fadeoutDuration}ms ease-out`,\n ...getBackgroundStyle(),\n ...sx,\n }}\n >\n {renderIndicator()}\n </Box>\n );\n}\n", "/**\n * \uC21C\uC218 CSS \uB85C\uB529 \uC2A4\uD53C\uB108. MUI CircularProgress \uB300\uC2E0 LoadingProgress \uC758 indicator \uB85C \uC8FC\uC785\uD55C\uB2E4.\n *\n * \uC2A4\uD0C0\uC77C\uC740 \uC790\uCCB4 <style> \uD074\uB798\uC2A4\uB85C \uC8FC\uC785\uD55C\uB2E4(\uC678\uBD80 \uC2A4\uD0C0\uC77C \uC758\uC874 \uC5C6\uC74C). \uBC30\uACBD \uB9C1(\uC5F0\uD55C \uD2B8\uB799)\uACFC\n * \uD68C\uC804 \uD638(\uC0C1\uB2E8 \uC0C9)\uB97C \uD55C \uD074\uB798\uC2A4\uC5D0 \uB2F4\uB294\uB2E4. \uC571 \uCD08\uAE30 \uC2A4\uD53C\uB108 \uBC0F \uB300\uC2DC\uBCF4\uB4DC \uB808\uC774\uC544\uC6C3 \uC2A4\uD53C\uB108\uC640 \uB3D9\uC77C\uD55C \uBAA8\uC591.\n */\nexport interface CssSpinnerProps {\n /** \uC2A4\uD53C\uB108 \uC9C0\uB984(px). \uAE30\uBCF8 54 */\n size?: number;\n}\n\nconst SPINNER_CSS = `\n.vdt-css-spinner{box-sizing:border-box;border-radius:50%;border:4px solid rgba(28,64,125,0.14);border-top-color:#1c407d;animation:vdt-css-spinner-spin .75s linear infinite}\n@keyframes vdt-css-spinner-spin{to{transform:rotate(360deg)}}\n`;\n\nexport function CssSpinner({ size = 54 }: CssSpinnerProps) {\n return (\n <>\n <style>{SPINNER_CSS}</style>\n <span\n className=\"vdt-css-spinner\"\n role=\"progressbar\"\n aria-label=\"loading\"\n style={{ display: \"inline-block\", width: size, height: size }}\n />\n </>\n );\n}\n\nexport default CssSpinner;\n", "/**\n * HeaderMenu.tsx - \uD45C \uBA38\uB9AC \uBA54\uB274 \uACF5\uC6A9 \uBD80\uD488(1.5.0)\n *\n * MIT License \u2014 Copyright (c) 2025 KIM YOUNG JIN (ehfuse@gmail.com)\n *\n * \uBA38\uB9AC \uCE78\uC758 \uC815\uB82C \u00B7 \uAC70\uB974\uAE30 \uBA54\uB274\uB97C \uD55C \uBC8C\uB85C \uB454\uB2E4. \uD654\uBA74\uB9C8\uB2E4(\uACE0\uAC1D \u00B7 \uACC4\uC57D \u00B7 \uC5C5\uBB34\uD568 \u00B7 \uC6D4\uBCC4 \uD45C \u2026) \uBA54\uB274\uB97C \uB530\uB85C \uB9CC\uB4E4\uC5B4\n * \uAE00\uC790 \uD06C\uAE30 \u00B7 \uC904 \uB192\uC774 \u00B7 \uCCB4\uD06C \uBAA8\uC591\uC774 \uC81C\uAC01\uAC01\uC774\uC5C8\uB2E4(\uACE0\uAC1D \uBAA9\uB85D \uBA54\uB274\uB9CC \uAE00\uC790\uAC00 \uCEF8\uB2E4). \uD06C\uAE30 \uADDC\uCE59\uC740 \uC774 \uD30C\uC77C\uC758 \uC0C1\uC218 \uD55C \uACF3\uC5D0\uC11C \uC815\uD55C\uB2E4 \u2014\n * \uD56D\uBAA9 \uAE00\uC790 14px \u00B7 \uC544\uC774\uCF58 18px \u00B7 \uC904 \uB192\uC774 34px \u00B7 \uC88C\uC6B0 \uC5EC\uBC31 12px. \uD45C\uC758 \uB0B4\uC7A5 \uBA38\uB9AC \uBA54\uB274(\uC5F4 \uC635\uC158 filterOptions)\uB3C4 \uC774 \uBD80\uD488\uC73C\uB85C \uADF8\uB9B0\uB2E4.\n */\n\nimport React, { useMemo, useState } from \"react\";\nimport { Box, Divider, InputBase, Menu, MenuItem, SvgIcon, type SxProps, type Theme } from \"@mui/material\";\nimport { useI18n } from \"./i18n\";\n\n/** \uBA54\uB274 \uD06C\uAE30 \uADDC\uCE59 \u2014 \uBAA8\uB4E0 \uBA38\uB9AC \uBA54\uB274\uAC00 \uAC19\uC740 \uAC12\uC744 \uC4F4\uB2E4. */\nexport const HEADER_MENU_FONT_SIZE = 14;\nexport const HEADER_MENU_ICON_SIZE = 18;\nexport const HEADER_MENU_ITEM_HEIGHT = 34;\n\n/** \uBA54\uB274 \uC544\uC774\uCF58(Material \uACBD\uB85C) \u2014 @mui/icons-material \uC744 \uC758\uC874\uC131\uC73C\uB85C \uB4E4\uC774\uC9C0 \uC54A\uC73C\uB824\uACE0 \uACBD\uB85C\uB9CC \uC62E\uACA8 \uB454\uB2E4. */\nexport const HEADER_MENU_ICON_PATHS = {\n asc: \"M4 12l1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z\",\n desc: \"M20 12l-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z\",\n checked: \"M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\",\n unchecked: \"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\",\n radioOn: \"M12 7c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5zm0-5C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\",\n radioOff: \"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\",\n filter: \"M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z\",\n search: \"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\",\n};\n\n/** \uACBD\uB85C \uD558\uB098\uB85C \uADF8\uB9B0 \uC544\uC774\uCF58 \u2014 \uD06C\uAE30 \uAE30\uBCF8\uC740 \uBA54\uB274 \uC544\uC774\uCF58 \uD06C\uAE30. */\nexport function HeaderMenuIcon({ d, size = HEADER_MENU_ICON_SIZE, color }: { d: string; size?: number; color?: string }) {\n return (\n <SvgIcon sx={{ fontSize: size, flexShrink: 0, color }}>\n <path d={d} />\n </SvgIcon>\n );\n}\n\n/**\n * \uBA38\uB9AC \uCE78\uC758 \uAC70\uB974\uAE30 \uD45C\uC2DC(1.5.1) \u2014 @ehfuse/mui-filter-button \uC758 TuneIcon(\uC120 \uB450 \uC904 + \uB3D9\uADF8\uB77C\uBBF8 \uB450 \uAC1C)\uACFC \uAC19\uC740 \uADF8\uB9BC\uC774\uB2E4(\uCD9C\uCC98: mui-filter-button\n * src/icons/TuneIcon.tsx). \uBA38\uB9AC \uC904 \uD544\uD130 \uB2E8\uCD94\uC640 \uBA38\uB9AC \uCE78 \uAC70\uB974\uAE30\uAC00 \uAC19\uC740 \uBB3C\uAC74\uC73C\uB85C \uC77D\uD788\uAC8C \uADF8 \uC544\uC774\uCF58\uC744 \uC4F0\uB418, \uD45C\uAC00 \uADF8 \uD328\uD0A4\uC9C0\uC5D0 \uAE30\uB300\uC9C0 \uC54A\uAC8C \uACBD\uB85C\uB97C \uC62E\uACA8 \uB454\uB2E4.\n * \uC0C9\uC740 \uAE00\uC790\uC0C9\uC744 \uB530\uB978\uB2E4(currentColor) \u2014 \uD3C9\uC18C \uBA38\uB9AC \uAE00\uC790\uC0C9, \uAC78\uB9AC\uBA74 \uAC15\uC870\uC0C9(active). 14px \uC5D0\uC11C\uB294 1.5 \uAD75\uAE30\uAC00 \uC815\uB82C \uD654\uC0B4\uD45C(\uCC44\uC6B4 \uC544\uC774\uCF58)\uBCF4\uB2E4 \uAC00\uB298\uC5B4 \uBCF4\uC5EC 1.8 \uB85C \uB454\uB2E4.\n */\nexport function HeaderFilterIcon({ size = 14, active, color }: { size?: number; active?: boolean; color?: string }) {\n const stroke = { stroke: \"currentColor\", strokeWidth: 1.8, strokeMiterlimit: 10, strokeLinecap: \"round\" as const, strokeLinejoin: \"round\" as const };\n return (\n <Box\n component=\"svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden\n sx={{ width: size, height: size, flexShrink: 0, color: active ? \"primary.main\" : color ?? \"currentColor\", verticalAlign: \"middle\" }}\n >\n <path d=\"M2 17.5H7\" {...stroke} />\n <path d=\"M22 6.5H17\" {...stroke} />\n <path d=\"M13 17.5H22\" {...stroke} />\n <path d=\"M11 6.5H2\" {...stroke} />\n <path d=\"M10 20.3999C8.34315 20.3999 7 19.0568 7 17.3999C7 15.743 8.34315 14.3999 10 14.3999C11.6569 14.3999 13 15.743 13 17.3999C13 19.0568 11.6569 20.3999 10 20.3999Z\" {...stroke} />\n <path d=\"M14 9.3999C15.6569 9.3999 17 8.05676 17 6.3999C17 4.74305 15.6569 3.3999 14 3.3999C12.3431 3.3999 11 4.74305 11 6.3999C11 8.05676 12.3431 9.3999 14 9.3999Z\" {...stroke} />\n </Box>\n );\n}\n\n/** \uD56D\uBAA9 \uBAA8\uC591 \u2014 \uB2E4\uB978 \uBA54\uB274(\uB3C4\uAD6C \uC904 \uB2E8\uCD94 \uBA54\uB274 \uB4F1)\uB3C4 \uC774 sx \uB85C \uAC19\uC740 \uD06C\uAE30\uB97C \uC4F4\uB2E4. */\nexport const HEADER_MENU_ITEM_SX = {\n gap: 1,\n fontSize: HEADER_MENU_FONT_SIZE,\n // \uB192\uC774\uB294 \uC904 \uB192\uC774 + \uC704\uC544\uB798 \uC5EC\uBC31\uC73C\uB85C \uC815\uD55C\uB2E4(20 + 7 + 7 = 34) \u2014 MenuItem \uC758 \uB113\uC740 \uD654\uBA74 \uADDC\uCE59(min-height: auto)\uC774 \uBBF8\uB514\uC5B4 \uCFFC\uB9AC\uB77C\n // sx \uC758 minHeight \uB97C \uC774\uACA8 28px \uB85C \uC904\uC5C8\uB2E4(1.5.2).\n lineHeight: \"20px\",\n minHeight: HEADER_MENU_ITEM_HEIGHT,\n py: \"7px\",\n px: 1.5,\n} as const;\n\nexport interface HeaderMenuItemProps {\n /** \uC55E \uC544\uC774\uCF58 \uC790\uB9AC(18px). \uC5C6\uC73C\uBA74 \uBE44\uC6B0\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uC544\uC774\uCF58 \uC904\uC744 \uB9DE\uCD94\uB824\uBA74 iconSpace \uB97C \uCF20\uB2E4. */\n icon?: React.ReactNode;\n /** \uC544\uC774\uCF58\uC774 \uC5C6\uB294 \uC904\uB3C4 \uC544\uC774\uCF58 \uD3ED\uB9CC\uD07C \uBE44\uC6CC \uAE00\uC790 \uC904\uC744 \uB9DE\uCD98\uB2E4. */\n iconSpace?: boolean;\n selected?: boolean;\n disabled?: boolean;\n /** \uD750\uB9B0 \uAE00\uC790(\uD480\uAE30 \u00B7 \uD574\uC81C \uAC19\uC740 \uBCF4\uC870 \uB3D9\uC791). */\n muted?: boolean;\n onClick?: (event: React.MouseEvent<HTMLLIElement>) => void;\n sx?: SxProps<Theme>;\n children?: React.ReactNode;\n}\n\n/** \uBA38\uB9AC \uBA54\uB274 \uD56D\uBAA9 \uD55C \uC904 \u2014 \uD06C\uAE30 \uADDC\uCE59(14px \u00B7 34px)\uC744 \uC9C0\uD0A8 MenuItem. */\nexport function HeaderMenuItem({ icon, iconSpace, selected, disabled, muted, onClick, sx, children }: HeaderMenuItemProps) {\n return (\n <MenuItem\n selected={selected}\n disabled={disabled}\n onClick={onClick}\n sx={[HEADER_MENU_ITEM_SX, muted ? { color: \"text.secondary\" } : {}, ...(Array.isArray(sx) ? sx : sx ? [sx] : [])]}\n >\n {icon ?? (iconSpace ? <Box component=\"span\" sx={{ width: HEADER_MENU_ICON_SIZE, flexShrink: 0 }} /> : null)}\n {children}\n </MenuItem>\n );\n}\n\n/** \uBA54\uB274 \uCE78 \uB098\uB204\uB294 \uC120 \u2014 \uC704\uC544\uB798 \uC5EC\uBC31\uC744 \uC904\uC778\uB2E4(\uAE30\uBCF8 8px \uC740 34px \uC904 \uC0AC\uC774\uC5D0\uC11C \uD5D0\uAC81\uB2E4). */\nexport function HeaderMenuDivider() {\n return <Divider sx={{ my: \"4px !important\" }} />;\n}\n\n/** \uBA38\uB9AC \uCE78(\uB610\uB294 \uB2E8\uCD94) \uBC14\uB85C \uC544\uB798 \uC67C\uCABD \uC790\uB9AC \u2014 \uBA54\uB274\uB294 \uC694\uC18C\uAC00 \uC544\uB2C8\uB77C \uC88C\uD45C\uC5D0 \uB744\uC6B4\uB2E4(\uD45C\uAC00 \uBA38\uB9AC \uCE78\uC744 \uB2E4\uC2DC \uBD99\uC5EC\uB3C4 \uBA54\uB274\uAC00 \uD280\uC9C0 \uC54A\uAC8C). */\nexport function headerMenuAnchor(element: Element, x?: number): { left: number; top: number } {\n const rect = element.getBoundingClientRect();\n return { left: x ?? rect.left, top: rect.bottom };\n}\n\nexport type HeaderMenuSortDirection = \"asc\" | \"desc\";\n\n/** \uACE0\uB97C \uAC12 \uD558\uB098. render \uB97C \uC8FC\uBA74 \uAE00\uC790 \uC790\uB9AC\uC5D0 \uADF8\uB300\uB85C \uADF8\uB9B0\uB2E4(\uC0C9 \uCE69 \u00B7 \uC544\uBC14\uD0C0 + \uC774\uB984). */\nexport interface HeaderMenuOption {\n value: string;\n label: string;\n /** \uAE00\uC790 \uC55E\uC5D0 \uBD99\uB294 \uC791\uC740 \uD45C\uC2DC(\uC0C9 \uC810 \u00B7 \uC544\uBC14\uD0C0). */\n icon?: React.ReactNode;\n /** \uAE00\uC790 \uC790\uB9AC\uB97C \uD1B5\uC9F8\uB85C \uBC14\uAFBC\uB2E4(\uC0C9 \uCE69). \uCC3E\uAE30\uB294 label \uB85C \uD55C\uB2E4. */\n render?: React.ReactNode;\n /** \uC624\uB978\uCABD \uC605\uC740 \uC22B\uC790(\uADF8 \uAC12\uC758 \uC904 \uC218). */\n count?: number;\n}\n\nexport interface HeaderMenuSortConfig {\n /** \uC9C0\uAE08 \uC774 \uCE78\uC758 \uC815\uB82C \uBC29\uD5A5(\uC774 \uCE78\uC73C\uB85C \uC815\uB82C \uC911\uC774 \uC544\uB2C8\uBA74 null). */\n active: HeaderMenuSortDirection | null | undefined;\n /** \uACE0\uB978 \uBC29\uD5A5 \u2014 \uD480\uBA74 null. */\n onChange: (direction: HeaderMenuSortDirection | null) => void;\n /** \"\uC815\uB82C \uD480\uAE30\" \uD56D\uBAA9\uC744 \uB454\uB2E4(\uC815\uB82C \uC911\uC77C \uB54C\uB9CC \uBCF4\uC778\uB2E4). \uAC19\uC740 \uBC29\uD5A5\uC744 \uB2E4\uC2DC \uACE0\uB974\uBA74 \uD480\uB9B0\uB2E4. \uAE30\uBCF8 true. */\n clearable?: boolean;\n}\n\nexport interface HeaderMenuFilterConfig {\n options: HeaderMenuOption[];\n /** \uC9C0\uAE08 \uACE0\uB978 \uAC12\uB4E4(\uBE48 \uBC30\uC5F4 = \uAC70\uB974\uC9C0 \uC54A\uC74C). */\n value: string[];\n onChange: (values: string[]) => void;\n /** \uC5EC\uB7EC \uAC1C \uACE0\uB974\uAE30(\uCCB4\uD06C \uBAA9\uB85D, \uAE30\uBCF8) / false = \uD558\uB098\uB9CC(\uB77C\uB514\uC624, \uACE0\uB974\uBA74 \uB2EB\uD78C\uB2E4). */\n multiple?: boolean;\n /** \uAC12 \"\"(\uBE44\uC5B4 \uC788\uC74C) \uD56D\uBAA9\uC744 \uB05D\uC5D0 \uB354\uD55C\uB2E4 \u2014 \uADF8 \uC774\uB984. options \uC5D0 \"\" \uAC00 \uC774\uBBF8 \uC788\uC73C\uBA74 \uB354\uD558\uC9C0 \uC54A\uB294\uB2E4. */\n emptyLabel?: string;\n /** \uD558\uB098 \uACE0\uB974\uAE30\uC5D0\uC11C \uB9E8 \uC704 \"\uC804\uCCB4\" \uD56D\uBAA9(\uACE0\uB974\uBA74 \uAC12 []). */\n allLabel?: string;\n /** \uB9E8 \uC704 \uCC3E\uAE30 \uCE78 \u2014 \uAE30\uBCF8: \uAC12\uC774 10\uAC1C\uB97C \uB118\uC73C\uBA74. */\n searchable?: boolean;\n searchPlaceholder?: string;\n /** \uD480\uAE30 \uD56D\uBAA9 \uC774\uB984(\uAE30\uBCF8 \"\uAC70\uB974\uAE30 \uD480\uAE30\"). \uAC78\uB824 \uC788\uC744 \uB54C\uB9CC \uBCF4\uC778\uB2E4. */\n clearLabel?: string;\n /** \uACE0\uB97C \uAC12\uC774 \uC5C6\uC744 \uB54C \uAE00(\uAE30\uBCF8 \"\uACE0\uB97C \uAC12\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.\"). */\n emptyText?: string;\n}\n\nexport interface HeaderMenuProps {\n open: boolean;\n /** \uB744\uC6B8 \uC790\uB9AC(\uC88C\uD45C) \u2014 headerMenuAnchor(\uC694\uC18C) \uB85C \uB9CC\uB4E0\uB2E4. anchorEl \uBCF4\uB2E4 \uC774\uAC83\uC744 \uAD8C\uD55C\uB2E4. */\n anchorPosition?: { left: number; top: number } | null;\n /** \uC694\uC18C\uC5D0 \uBD99\uC5EC \uB744\uC6B8 \uB54C(\uC694\uC18C\uAC00 \uB2E4\uC2DC \uBD99\uC9C0 \uC54A\uB294 \uACF3\uB9CC). */\n anchorEl?: HTMLElement | null;\n onClose: () => void;\n sort?: HeaderMenuSortConfig;\n filter?: HeaderMenuFilterConfig;\n /** \uC815\uB82C \u00B7 \uAC70\uB974\uAE30 \uC55E\uC5D0 \uB458 \uD56D\uBAA9(HeaderMenuItem \uB4E4). */\n header?: React.ReactNode;\n /** \uB9E8 \uB4A4\uC5D0 \uB458 \uD56D\uBAA9(HeaderMenuItem \uB4E4 \u00B7 \uBC94\uC704 \uC785\uB825 \uB4F1). */\n children?: React.ReactNode;\n minWidth?: number;\n maxHeight?: number;\n}\n\n/**\n * \uBA38\uB9AC \uBA54\uB274 \u2014 \uC815\uB82C(\uC624\uB984 \u00B7 \uB0B4\uB9BC \u00B7 \uD480\uAE30) \u00B7 \uAC12 \uAC70\uB974\uAE30(\uC5EC\uB7EC \uAC1C \uCCB4\uD06C / \uD558\uB098 \uB77C\uB514\uC624 \u00B7 \uBE44\uC5B4 \uC788\uC74C \u00B7 \uCC3E\uAE30 \u00B7 \uD480\uAE30)\uB97C \uD544\uC694\uD55C \uAC83\uB9CC \uADF8\uB9B0\uB2E4.\n * \uB204\uB978 \uC790\uB9AC\uC5D0\uC11C \uBC14\uB85C \uB72C\uB2E4(transitionDuration 0 \u2014 \uD3BC\uCE68 \uC560\uB2C8\uBA54\uC774\uC158\uC740 \uBA54\uB274\uAC00 \uB2A6\uAC8C \uB530\uB77C\uC624\uB294 \uAC83\uCC98\uB7FC \uBCF4\uC778\uB2E4).\n */\nexport function HeaderMenu({\n open,\n anchorPosition,\n anchorEl,\n onClose,\n sort,\n filter,\n header,\n children,\n minWidth = 180,\n maxHeight = 420,\n}: HeaderMenuProps) {\n const { t } = useI18n();\n const [query, setQuery] = useState(\"\");\n const multiple = filter?.multiple !== false;\n const picked = filter?.value ?? [];\n const options = useMemo(() => {\n if (!filter) return [];\n const list = filter.options;\n return filter.emptyLabel && !list.some((option) => option.value === \"\")\n ? [...list, { value: \"\", label: filter.emptyLabel }]\n : list;\n }, [filter]);\n const searchable = Boolean(filter) && (filter?.searchable ?? options.length > 10);\n const keyword = query.trim().toLowerCase();\n const shown = keyword ? options.filter((option) => option.label.toLowerCase().includes(keyword)) : options;\n const close = () => {\n setQuery(\"\");\n onClose();\n };\n\n const items: React.ReactNode[] = [];\n // \uBA38\uB9AC \u00B7 \uB367\uBD99\uC77C \uD56D\uBAA9\uC740 Fragment \uB85C \uAC10\uC2F8\uC9C0 \uC54A\uACE0 \uD480\uC5B4 \uB123\uB294\uB2E4 \u2014 MUI Menu \uB294 Fragment \uC790\uC2DD\uC744 \uBC1B\uC9C0 \uC54A\uB294\uB2E4(\uAC1C\uBC1C \uBAA8\uB4DC \uACBD\uACE0, 1.5.3).\n if (header) items.push(...React.Children.toArray(header).map((node, i) => (React.isValidElement(node) ? React.cloneElement(node, { key: `h${i}` }) : node)));\n if (sort) {\n const pickSort = (direction: HeaderMenuSortDirection) => {\n close();\n sort.onChange(sort.active === direction && sort.clearable !== false ? null : direction);\n };\n items.push(\n <HeaderMenuItem\n key=\"sort-asc\"\n selected={sort.active === \"asc\"}\n onClick={() => pickSort(\"asc\")}\n icon={<HeaderMenuIcon d={HEADER_MENU_ICON_PATHS.asc} color=\"text.secondary\" />}\n >\n {t(\"sortAscending\")}\n </HeaderMenuItem>,\n <HeaderMenuItem\n key=\"sort-desc\"\n selected={sort.active === \"desc\"}\n onClick={() => pickSort(\"desc\")}\n icon={<HeaderMenuIcon d={HEADER_MENU_ICON_PATHS.desc} color=\"text.secondary\" />}\n >\n {t(\"sortDescending\")}\n </HeaderMenuItem>,\n );\n if (sort.active && sort.clearable !== false) {\n items.push(\n <HeaderMenuItem\n key=\"sort-clear\"\n muted\n iconSpace\n onClick={() => {\n close();\n sort.onChange(null);\n }}\n >\n {t(\"clearSort\")}\n </HeaderMenuItem>,\n );\n }\n }\n if (sort && filter) items.push(<HeaderMenuDivider key=\"div-sort\" />);\n if (filter) {\n if (searchable) {\n items.push(\n <Box\n key=\"search\"\n // \uBA54\uB274\uC758 \uAE00\uC790 \uCC3E\uC544 \uAC00\uAE30(type-ahead)\uAC00 \uC785\uB825\uC744 \uAC00\uB85C\uCC44\uC9C0 \uC54A\uAC8C \uD0A4\uB294 \uC5EC\uAE30\uC11C \uBA48\uCD98\uB2E4.\n onKeyDown={(event) => event.stopPropagation()}\n sx={{ display: \"flex\", alignItems: \"center\", gap: 1, px: 1.5, pb: 0.5, minHeight: HEADER_MENU_ITEM_HEIGHT }}\n >\n <HeaderMenuIcon d={HEADER_MENU_ICON_PATHS.search} color=\"text.secondary\" />\n <InputBase\n autoFocus\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n placeholder={filter.searchPlaceholder ?? t(\"search\")}\n sx={{ flex: 1, fontSize: HEADER_MENU_FONT_SIZE }}\n />\n </Box>,\n );\n }\n if (!multiple && filter.allLabel) {\n items.push(\n <HeaderMenuItem\n key=\"f-all\"\n selected={picked.length === 0}\n onClick={() => {\n close();\n filter.onChange([]);\n }}\n icon={<HeaderMenuIcon d={picked.length === 0 ? HEADER_MENU_ICON_PATHS.radioOn : HEADER_MENU_ICON_PATHS.radioOff} color={picked.length === 0 ? \"primary.main\" : \"text.disabled\"} />}\n >\n {filter.allLabel}\n </HeaderMenuItem>,\n );\n }\n if (options.length === 0) {\n items.push(\n <HeaderMenuItem key=\"f-none\" disabled iconSpace>\n {filter.emptyText ?? t(\"noOptions\")}\n </HeaderMenuItem>,\n );\n }\n shown.forEach((option) => {\n const on = picked.includes(option.value);\n const toggle = () => {\n if (multiple) {\n filter.onChange(on ? picked.filter((item) => item !== option.value) : [...picked, option.value]);\n return;\n }\n close();\n filter.onChange(on ? [] : [option.value]);\n };\n const mark = multiple\n ? on\n ? HEADER_MENU_ICON_PATHS.checked\n : HEADER_MENU_ICON_PATHS.unchecked\n : on\n ? HEADER_MENU_ICON_PATHS.radioOn\n : HEADER_MENU_ICON_PATHS.radioOff;\n items.push(\n <HeaderMenuItem\n key={`f:${option.value || \"(empty)\"}`}\n selected={!multiple && on}\n onClick={toggle}\n icon={<HeaderMenuIcon d={mark} color={on ? \"primary.main\" : \"text.disabled\"} />}\n >\n {option.icon}\n <Box component=\"span\" sx={{ flex: 1, minWidth: 0, overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\n {option.render ?? option.label}\n </Box>\n {typeof option.count === \"number\" ? (\n <Box component=\"span\" sx={{ color: \"text.secondary\", ml: 1, fontVariantNumeric: \"tabular-nums\" }}>\n {option.count}\n </Box>\n ) : null}\n </HeaderMenuItem>,\n );\n });\n if (searchable && keyword && shown.length === 0) {\n items.push(\n <HeaderMenuItem key=\"f-nohit\" disabled iconSpace>\n {t(\"noMatches\")}\n </HeaderMenuItem>,\n );\n }\n // \uAC78\uB824 \uC788\uC744 \uB54C\uB9CC \u2014 \uD558\uB098\uC529 \uB044\uC9C0 \uC54A\uACE0 \uD55C \uBC88\uC5D0 \uD47C\uB2E4.\n if (picked.length > 0) {\n items.push(\n <HeaderMenuDivider key=\"div-filter\" />,\n <HeaderMenuItem\n key=\"f-clear\"\n muted\n iconSpace\n onClick={() => {\n close();\n filter.onChange([]);\n }}\n >\n {filter.clearLabel ?? t(\"clearFilter\")}\n </HeaderMenuItem>,\n );\n }\n }\n if (children) {\n if (items.length > 0) items.push(<HeaderMenuDivider key=\"div-children\" />);\n items.push(...React.Children.toArray(children));\n }\n\n const useAnchorEl = !anchorPosition && Boolean(anchorEl);\n return (\n <Menu\n open={open && (Boolean(anchorPosition) || Boolean(anchorEl))}\n {...(useAnchorEl\n ? { anchorEl }\n : { anchorReference: \"anchorPosition\" as const, anchorPosition: anchorPosition ?? undefined })}\n onClose={close}\n transitionDuration={0}\n // \uCC3E\uAE30 \uCE78\uC774 \uC788\uC73C\uBA74 \uCCAB \uD56D\uBAA9 \uB300\uC2E0 \uADF8 \uCE78\uC5D0 \uCD08\uC810\uC744 \uB454\uB2E4.\n disableAutoFocusItem={searchable}\n // \uBA54\uB274 \uC548 \uC6B0\uD074\uB9AD\uC5D0\uB3C4 \uBE0C\uB77C\uC6B0\uC800 \uBA54\uB274\uB97C \uB744\uC6B0\uC9C0 \uC54A\uB294\uB2E4. \uB204\uB974\uAE30\uAC00 \uD45C(\uBA38\uB9AC \uCE78 \uC815\uB82C)\uB85C \uC62C\uB77C\uAC00\uC9C0 \uC54A\uAC8C \uB9C9\uB294\uB2E4.\n onContextMenu={(event) => event.preventDefault()}\n onClick={(event) => event.stopPropagation()}\n slotProps={{ paper: { sx: { maxHeight, minWidth } }, list: { sx: { py: 0.5 } } }}\n >\n {items}\n </Menu>\n );\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["React", "forwardRef", "useCallback", "useMemo", "useRef", "useEffect", "memo", "useState", "Box", "Table", "MuiTableBody", "TableCell", "TableContainer", "TableHead", "MuiTableFooter", "MuiTableRow", "TableSortLabel", "Paper", "Typography", "useTheme", "useMediaQuery", "TableVirtuoso", "useCallback", "useEffect", "useMemo", "useRef", "useCallback", "useSyncExternalStore", "ko_default", "en_default", "ja_default", "zh_default", "de_default", "fr_default", "it_default", "vi_default", "DICTS", "ko_default", "en_default", "ja_default", "zh_default", "de_default", "fr_default", "it_default", "vi_default", "INTL_TAGS", "current", "listeners", "normalizeLang", "lang", "base", "setMuiVirtualDataTableLocale", "next", "fn", "getMuiVirtualDataTableLocale", "subscribe", "t", "key", "params", "l", "raw", "m", "name", "useI18n", "localeProp", "globalLang", "useSyncExternalStore", "subscribe", "getMuiVirtualDataTableLocale", "lang", "normalizeLang", "useCallback", "key", "params", "t", "INTL_TAGS", "jsx", "REORDER_COLUMN_ID", "EDGE_PX", "EDGE_SPEED", "HANDLE_ICON", "bodyRows", "box", "nearestScrollable", "el", "e", "overflowY", "useRowReorder", "config", "tableBoxRef", "getScroller", "dataLengthRef", "anyPinned", "t", "useI18n", "configRef", "useRef", "on", "dragRef", "rafRef", "indicatorRef", "liftedRef", "hideIndicator", "updateTarget", "useCallback", "rows", "under", "row", "edge", "r", "first", "last", "idx", "insertAt", "to", "ind", "b", "y", "autoScroll", "step", "d", "scroller", "target", "top", "bottom", "dy", "finish", "commit", "useEffect", "move", "up", "key", "markLifted", "index", "tr", "onHandlePointerDown", "item", "onHandleKeyDown", "cfg", "lifted", "renderHandle", "label", "handleWidth", "disabledReason", "handleColumn", "useMemo", "__assign", "t", "s", "i", "n", "p", "LoadingProgress", "_a", "visible", "onComplete", "_b", "fadeoutDuration", "_c", "exitDelay", "_d", "size", "className", "style", "sx", "indicator", "_e", "background", "prevVisibleRef", "useRef", "boxRef", "_f", "useState", "shouldRender", "setShouldRender", "_g", "showBackground", "_h", "backgroundColor", "_j", "backgroundOpacity", "useEffect", "prevVisible", "box", "renderIndicator", "_jsx", "CircularProgress", "getBackgroundStyle", "Box", "__assign", "Fragment", "jsx", "jsxs", "SPINNER_CSS", "CssSpinner", "size", "React", "useMemo", "useState", "Box", "Divider", "InputBase", "Menu", "MenuItem", "SvgIcon", "jsx", "jsxs", "HEADER_MENU_FONT_SIZE", "HEADER_MENU_ICON_SIZE", "HEADER_MENU_ITEM_HEIGHT", "HEADER_MENU_ICON_PATHS", "HeaderMenuIcon", "d", "size", "color", "SvgIcon", "HeaderFilterIcon", "active", "stroke", "Box", "HEADER_MENU_ITEM_SX", "HeaderMenuItem", "icon", "iconSpace", "selected", "disabled", "muted", "onClick", "sx", "children", "MenuItem", "HeaderMenuDivider", "Divider", "headerMenuAnchor", "element", "x", "rect", "HeaderMenu", "open", "anchorPosition", "anchorEl", "onClose", "sort", "filter", "header", "minWidth", "maxHeight", "t", "useI18n", "query", "setQuery", "useState", "multiple", "picked", "options", "useMemo", "list", "option", "searchable", "keyword", "shown", "close", "items", "React", "node", "i", "pickSort", "direction", "event", "InputBase", "on", "toggle", "item", "mark", "Menu", "OverlayScrollbar", "Fragment", "jsx", "jsxs", "OVERLAY_SCROLLBAR_TRACK_CONFIG", "ROW_CLICK_DRAG_THRESHOLD_PX", "EMPTY_WIDTHS", "RESIZE_DRAG_THRESHOLD_PX", "cssPx", "value", "headerCellWidth", "th", "cs", "extra", "applyResizeVars", "el", "vars", "stale", "i", "name", "NOTION_LINE_COLOR", "NOTION_LINE_COLOR_DARK", "NOTION_LIGHT", "NOTION_PADDING_Y", "NOTION_DARK", "PlainScroller", "forwardRef", "props", "ref", "DEFAULT_MOBILE_QUERY", "hasColumnFilter", "col", "sortPlacement", "align", "VirtualDataTableComponent", "data", "loading", "columnsProp", "onRowClick", "getRowId", "selectedRowId", "selectedRowSxProp", "rowHeightProp", "columnHeightProp", "striped", "rowDivider", "onSort", "onSortClear", "onHeaderContextMenu", "onLoadMore", "sortBy", "sortDirection", "showPaper", "paddingXProp", "paddingTop", "paddingBottom", "rowHoverColorProp", "rowHoverOpacityProp", "viewportBuffer", "overscan", "initialItemCount", "scrollbars", "emptyMessage", "autoHeight", "LoadingComponent", "showFooter", "footerHeight", "footerSx", "variant", "borderColor", "framed", "headerTopBorder", "scrollbarGutter", "rowHeightMode", "tableLayout", "renderFullWidthRow", "fullWidthRowSx", "onRowContextMenu", "pinnedRows", "pinnedRowsMaxHeight", "pinnedRowsSx", "resetScrollOnDataChange", "rowKeyFromId", "onEndReached", "colorMode", "mobile", "scrollParent", "columnResize", "columnWidths", "onColumnWidthsChange", "rowReorder", "notion", "muiTheme", "useTheme", "baseNotionTokens", "notionTokens", "hasPinnedRows", "columnHeight", "rowHeight", "paddingX", "mobileConfig", "mobileMatch", "useMediaQuery", "mobileList", "reorderBoxRef", "useRef", "reorderScrollerRef", "dataLengthRef", "reorder", "useRowReorder", "c", "columns", "useMemo", "external", "sizeAuto", "autoRowHeight", "gutterPx", "gutterSx", "rowHoverColor", "rowHoverOpacity", "defaultViewportBufferTop", "defaultViewportBufferBottom", "viewportBufferTop", "viewportBufferBottom", "defaultOverscanMain", "defaultOverscanReverse", "virtuosoOverscan", "estimatedItemHeight", "notionSelectedSx", "selectedRowSx", "useCssRowHighlight", "selectedRowCssSx", "isDev", "perfDebugEnabled", "useState", "perfStatsRef", "flushPerfStats", "useCallback", "reason", "stats", "rowAvgMs", "cellAvgMs", "useEffect", "intervalId", "VirtuosoScroller", "scrollContainerRef", "wheelDeltaRef", "wheelRafRef", "handleWheel", "e", "wheelStart", "inner", "delta", "rafStart", "maxStep", "batchedDelta", "TableContainer", "Box", "node", "stripedRowColor", "internalLoading", "setInternalLoading", "tableKey", "setTableKey", "handleLoadingComplete", "shouldShowLoading", "isLoadMoreLoading", "isLoadingMoreRef", "lastLoadMoreLengthRef", "virtuosoRef", "scrollerElRef", "listOverflows", "setListOverflows", "checkListOverflow", "observer", "onRowClickRef", "getRowIdRef", "onRowContextMenuRef", "onEndReachedRef", "rowComponentRef", "resizeConfig", "resizeOn", "resizeMinDefault", "localWidths", "setLocalWidths", "activeWidths", "activeWidthsRef", "onColumnWidthsChangeRef", "columnsRef", "tableBoxRef", "computeResizeVars", "widths", "changed", "allFixed", "minSum", "fixedSum", "index", "w", "cw", "computeResizeVarsRef", "resizeVars", "colWidthStyle", "minWidth", "m", "pinnedLeft", "map", "left", "parts", "tableMinWidth", "sum", "pinnedStyle", "head", "hasRowClick", "isScrollDraggingRef", "mouseDownPositionRef", "handleDocumentMouseMove", "event", "dx", "dy", "tableContainer", "label", "mouseLeaveEvent", "handleSort", "columnId", "headerMenu", "setHeaderMenu", "onHeaderContextMenuRef", "onSortRef", "handleHeaderContextMenu", "handled", "rect", "handleResizeMouseDown", "handle", "box", "startWidth", "startX", "key", "min", "base", "cols", "snap", "h", "cell", "next", "moved", "raf", "prevCursor", "onMove", "ev", "onUp", "swallow", "ce", "handleResizeDoubleClick", "table", "parent", "declaredSum", "avail", "scale", "initial", "renderResizeHandle", "REORDER_COLUMN_ID", "renderHeaderText", "active", "HeaderFilterIcon", "handleEndReached", "endIndex", "rangeStart", "hasMinimumData", "nearEnd", "alreadyRequestedAtThisLength", "offset", "prev", "resetScrollOnDataChangeRef", "prevDataLengthRef", "prevFirstRowKeyRef", "prevLength", "currentLength", "firstRowKey", "prevFirstRowKey", "dataReplaced", "headerRowsContent", "groupMap", "noGroupColumns", "MuiTableRow", "colIndex", "TableCell", "TableSortLabel", "firstRowCells", "group", "secondRowCells", "mobileSlots", "shown", "title", "renderMobileRow", "item", "thumb", "badge", "sub", "meta", "rowContent", "rowStart", "rowDuration", "card", "fullWidth", "coveredByColSpan", "cells", "column", "columnIndex", "colSpan", "cellStart", "cellValue", "cellDuration", "pinned", "customPadding", "span", "onCellClick", "fixedHeaderContent", "headerRows", "RowComponent", "MuiTableBody", "hasFooter", "fixedFooterContent", "VirtuosoTableComponents", "Table", "TableHead", "_selected", "_ariaSelected", "className", "rest", "rowIndex", "isOddRow", "rowId", "isSelected", "resolvedSelectedRowSx", "sanitizedClassName", "token", "theme", "isDark", "color", "opacity", "hex", "r", "g", "b", "children", "MuiTableFooter", "resolvedVirtuosoComponents", "autoParts", "AutoTable", "AutoTableHead", "AutoTableBody", "AutoTableRow", "AutoTableFoot", "menuColumn", "closeHeaderMenu", "headerMenuNode", "colId", "canSort", "canFilter", "activeSort", "HeaderMenu", "direction", "values", "tableContent", "TableVirtuoso", "Typography", "loadingGate", "React", "LoadingProgress", "CssSpinner", "notionFramePadding", "Paper", "setVirtualDataTableLoadingGate", "gate", "VirtualDataTable", "memo"]
|
|
3
|
+
"sources": ["../src/VirtualDataTable.tsx", "../src/rowReorder.tsx", "../src/i18n/index.ts", "../src/i18n/mui-virtual-data-table/ko.json", "../src/i18n/mui-virtual-data-table/en.json", "../src/i18n/mui-virtual-data-table/ja.json", "../src/i18n/mui-virtual-data-table/zh.json", "../src/i18n/mui-virtual-data-table/de.json", "../src/i18n/mui-virtual-data-table/fr.json", "../src/i18n/mui-virtual-data-table/it.json", "../src/i18n/mui-virtual-data-table/vi.json", "../src/columnReorder.tsx", "../node_modules/@ehfuse/mui-fadeout-loading-progress/node_modules/tslib/tslib.es6.js", "../node_modules/@ehfuse/mui-fadeout-loading-progress/src/LoadingProgress.tsx", "../src/CssSpinner.tsx", "../src/HeaderMenu.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * VirtualDataTable.tsx\n *\n * MIT License\n *\n * Copyright (c) 2025 KIM YOUNG JIN (ehfuse@gmail.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport React, {\n forwardRef,\n useCallback,\n useMemo,\n useRef,\n useEffect,\n memo,\n useState,\n} from \"react\";\nimport {\n Box,\n Table,\n TableBody as MuiTableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableFooter as MuiTableFooter,\n TableRow as MuiTableRow,\n TableSortLabel,\n Paper,\n Typography,\n useTheme,\n useMediaQuery,\n type SxProps,\n type Theme,\n} from \"@mui/material\";\nimport { TableVirtuoso } from \"react-virtuoso\";\nimport { REORDER_COLUMN_ID, useRowReorder } from \"./rowReorder\";\nimport { applyColumnOrder, useColumnReorder } from \"./columnReorder\";\nimport type { TableComponents } from \"react-virtuoso\";\nimport { LoadingProgress } from \"@ehfuse/mui-fadeout-loading-progress\";\nimport { CssSpinner } from \"./CssSpinner\";\nimport { HeaderMenu, HeaderFilterIcon } from \"./HeaderMenu\";\n\nimport OverlayScrollbar from \"@ehfuse/overlay-scrollbar\";\nimport type { DataColumn, SortDirection, VDTColumnWidths, VirtualDataTableProps } from \"./types\";\n\n// OverlayScrollbar \uC124\uC815\uC744 \uCEF4\uD3EC\uB10C\uD2B8 \uC678\uBD80\uC5D0 \uC0C1\uC218\uB85C \uC120\uC5B8 (\uC7AC\uB80C\uB354\uB9C1 \uC2DC \uB3D9\uC77C\uD55C \uCC38\uC870 \uC720\uC9C0)\nconst OVERLAY_SCROLLBAR_TRACK_CONFIG = {\n alignment: \"default\" as const, // \uC61B \uAC12 \"right\" \uB294 1.7 \uD0C0\uC785\uC5D0\uC11C \uC0AC\uB77C\uC84C\uB2E4 \u2014 \uB3D9\uC791\uC740 \uAC19\uB2E4(\"outside\" \uAC00 \uC544\uB2C8\uBA74 \uC548\uCABD \uC815\uB82C)\n margin: 0,\n radius: 0,\n};\nconst ROW_CLICK_DRAG_THRESHOLD_PX = 5;\n/** \uBC14\uAFBC \uC5F4 \uD3ED\uC774 \uC5C6\uC744 \uB54C\uC758 \uBE48 \uD45C \u2014 \uB9E4 \uB80C\uB354 \uC0C8 \uAC1D\uCCB4\uB97C \uB9CC\uB4E4\uBA74 \uD3ED \uACC4\uC0B0 memo \uAC00 \uB9E4\uBC88 \uB2E4\uC2DC \uB3C8\uB2E4. */\nconst EMPTY_WIDTHS: VDTColumnWidths = {};\n/** \uC5F4 \uD3ED \uB04C\uAE30\uB85C \uCE60 \uCD5C\uC18C \uC774\uB3D9 px \u2014 \uACBD\uACC4\uB97C \uB20C\uB800\uB2E4 \uB5BC\uB294 \uAC83(\uB450 \uBC88 \uB204\uB974\uAE30 \uD3EC\uD568)\uC740 \uB04C\uAE30\uAC00 \uC544\uB2C8\uB2E4. */\nconst RESIZE_DRAG_THRESHOLD_PX = 3;\n\n/** \uC22B\uC790 \uD3ED\uC740 px \uAE00\uC790\uB85C \u2014 CSS \uBCC0\uC218\uC758 \uAE30\uBCF8\uAC12(var(--x, \uAE30\uBCF8\uAC12))\uC5D0 \uB123\uC73C\uB824\uBA74 \uB2E8\uC704\uAC00 \uC788\uC5B4\uC57C \uD55C\uB2E4. */\nfunction cssPx(value: string | number | undefined): string | undefined {\n return typeof value === \"number\" ? `${value}px` : value;\n}\n\n/** \uBA38\uB9AC \uCE78\uC758 \uD3ED(style width \uAE30\uC900) \u2014 content-box \uCE78\uC774\uBA74 \uADF8\uB824\uC9C4 \uD3ED\uC5D0\uC11C \uC548\uCABD \uC5EC\uBC31 \u00B7 \uD14C\uB450\uB9AC\uB97C \uBE80\uB2E4. */\nfunction headerCellWidth(th: HTMLElement): number {\n const cs = window.getComputedStyle(th);\n const extra =\n cs.boxSizing === \"border-box\"\n ? 0\n : (parseFloat(cs.paddingLeft) || 0) +\n (parseFloat(cs.paddingRight) || 0) +\n (parseFloat(cs.borderLeftWidth) || 0) +\n (parseFloat(cs.borderRightWidth) || 0);\n return th.getBoundingClientRect().width - extra;\n}\n\n/**\n * \uD45C \uC0C1\uC790\uC5D0 \uC5B9\uC740 CSS \uBCC0\uC218(--vdt-*)\uB97C vars \uB300\uB85C \uB9DE\uCD98\uB2E4(\uC5C6\uB294 \uC774\uB984\uC740 \uB5C0\uB2E4). \uB044\uB294 \uB3D9\uC548 React \uC0C1\uD0DC\uB97C \uBC14\uAFB8\uBA74 \uD45C \uBD80\uD488\uC774 \uB2E4\uC2DC \uB9CC\uB4E4\uC5B4\uC838\n * \uAC00\uC0C1 \uBAA9\uB85D \uC904\uAE4C\uC9C0 \uB2E4\uC2DC \uADF8\uB9AC\uBBC0\uB85C, \uB044\uB294 \uB3D9\uC548\uC740 \uBCC0\uC218\uB9CC \uBC14\uAFB8\uACE0 \uB193\uC744 \uB54C \uD55C \uBC88 \uC0C1\uD0DC\uB85C \uC62E\uAE34\uB2E4.\n */\nfunction applyResizeVars(el: HTMLElement, vars: Record<string, string>) {\n const stale: string[] = [];\n for (let i = 0; i < el.style.length; i += 1) {\n const name = el.style[i];\n if (name.startsWith(\"--vdt-\") && !(name in vars)) stale.push(name);\n }\n stale.forEach((name) => el.style.removeProperty(name));\n Object.entries(vars).forEach(([name, value]) => el.style.setProperty(name, value));\n}\n\n/**\n * \uB370\uC774\uD130 \uAE30\uBC18 \uBB34\uD55C \uC2A4\uD06C\uB864 \uBC0F \uAC00\uC0C1\uD654\uB97C \uC9C0\uC6D0\uD558\uB294 \uD14C\uC774\uBE14 \uCEF4\uD3EC\uB10C\uD2B8\n */\n/**\n * \uB178\uC158\uD48D(variant=\"notion\") \uC0C9 \u2014 @ehfuse/taskbox \uC758 \uBAA9\uB85D\uD45C \uD314\uB808\uD2B8(light: border/borderStrong/textSecondary/surfaceHover,\n * dark: \uAC19\uC740 \uC774\uB984\uC758 \uB2E4\uD06C \uAC12)\uB97C \uADF8\uB300\uB85C \uC62E\uAE34 \uAC83\uC774\uB2E4. \uB450 \uD328\uD0A4\uC9C0\uAC00 \uC11C\uB85C\uB97C \uCC38\uC870\uD558\uC9C0 \uC54A\uC544 \uAC12\uC744 \uBCA0\uAEF4 \uB454\uB2E4 \u2014 \uADF8\uCABD\uC774 \uBC14\uB00C\uBA74 \uC5EC\uAE30\uB3C4 \uB9DE\uCD98\uB2E4.\n */\n/**\n * \uB178\uC158\uD48D \uC120 \uC0C9 \uD558\uB098(1.11.4) \u2014 \uBC14\uAE65 \uD2C0 \u00B7 \uBA38\uB9AC\uC904 \uC544\uB798 \u00B7 \uCE78 \uC0AC\uC774 \uC120\uC744 \uBAA8\uB450 \uC774 \uC0C9\uC73C\uB85C \uADF8\uB9B0\uB2E4. \uC18C\uBE44\uCC98\uAC00 \uD45C \uBC16\uC758 \uC120(\uB2EC\uB825 \uACA9\uC790 \uB4F1)\uB3C4 \uAC19\uC740 \uC0C9\uC73C\uB85C \uB9DE\uCD94\uAC8C \uB0B4\uBCF4\uB0B8\uB2E4.\n * 1.11.3 \uC5D0\uC11C \uD55C \uB2E8\uACC4 \uC9C4\uD558\uAC8C \uD588\uACE0(\uC608\uC804 #e6e6e3 \u00B7 #dedddb \uB294 \uBC1D\uC740 \uBAA8\uB2C8\uD130\uC5D0\uC11C \uC798 \uC548 \uBCF4\uC600\uB2E4), 1.11.4 \uC5D0\uC11C \uB450 \uB2E8\uACC4\uB97C \uD558\uB098\uB85C \uD569\uCCE4\uB2E4\n * (2026-11-03 \uC0AC\uC6A9\uC790 \uC9C0\uC801 \"\uBA38\uB9AC \uC544\uB798 \uC120\uB9CC \uB354 \uD750\uB9AC\uB2E4 \u2014 \uD1B5\uC77C\").\n */\nexport const NOTION_LINE_COLOR = \"#d9d8d5\";\n/** \uC5B4\uB450\uC6B4 \uD654\uBA74\uC758 \uB178\uC158\uD48D \uC120 \uC0C9. */\nexport const NOTION_LINE_COLOR_DARK = \"#3b434e\";\n\nconst NOTION_LIGHT = {\n bg: \"#ffffff\",\n border: NOTION_LINE_COLOR,\n borderStrong: NOTION_LINE_COLOR,\n headerColor: \"#787774\",\n hoverBg: \"#f8f8f7\",\n emptyColor: \"#9b9a97\",\n selectedBg: \"#dbeafe\",\n selectedBar: \"#3b82f6\",\n};\n/** \uB178\uC158\uD48D \uC885\uC774 \uC704\uC544\uB798 \uC5EC\uBC31 \u2014 \uC88C\uC6B0 \uAE30\uBCF8(12px)\uACFC \uAC19\uB2E4. */\nconst NOTION_PADDING_Y = \"12px\";\nconst NOTION_DARK = {\n bg: \"#1e1e1e\",\n border: NOTION_LINE_COLOR_DARK,\n borderStrong: NOTION_LINE_COLOR_DARK,\n headerColor: \"#a3adbb\",\n hoverBg: \"#272d36\",\n emptyColor: \"#7d8590\",\n selectedBg: \"rgba(59, 130, 246, 0.22)\",\n selectedBar: \"#60a5fa\",\n};\n\n/** \uBC14\uAE65 \uC2A4\uD06C\uB864\uC77C \uB54C\uC758 \uC2A4\uD06C\uB864 \uC0C1\uC790 \uC790\uB9AC \u2014 \uAD74\uB9AC\uC9C0 \uC54A\uB294 \uD3C9\uBC94\uD55C \uC0C1\uC790(1.7.0) */\nconst PlainScroller = forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>((props, ref) => <div {...props} ref={ref} />);\nPlainScroller.displayName = \"VdtPlainScroller\";\n\n/** \uD3F0 \uBAA9\uB85D\uC73C\uB85C \uBC14\uAFB8\uB294 \uAE30\uBCF8 \uD3ED \u2014 MUI sm(600) \uBBF8\uB9CC */\nconst DEFAULT_MOBILE_QUERY = \"(max-width:599.95px)\";\n\n/** \uC774 \uC5F4\uC774 \uBA38\uB9AC \uBA54\uB274\uC5D0 \uAC70\uB974\uAE30 \uBAA9\uB85D\uC744 \uAC16\uB294\uC9C0 \u2014 \uAC12 \uBAA9\uB85D\uACFC \uBC14\uB01C \uC54C\uB9BC\uC774 \uB458 \uB2E4 \uC788\uC5B4\uC57C \uD55C\uB2E4. */\nfunction hasColumnFilter<T>(col: DataColumn<T>): boolean {\n return Boolean(col.filterOptions && col.onFilterChange);\n}\n\n/**\n * \uC815\uB82C \uD654\uC0B4\uD45C \uC790\uB9AC(1.10.4) \u2014 \uCE78 \uB9DE\uCDA4(align)\uC73C\uB85C \uC815\uD55C\uB2E4. \uD45C \uAF34(variant)\uACFC \uC0C1\uAD00\uC5C6\uC774 \uAC19\uB2E4(1.10.3 \uAE4C\uC9C0\uB294 \uB178\uC158\uD48D CSS \uC5D0\uB9CC \uC788\uC5B4 \uAE30\uBCF8 \uAF34 \uD45C\uB294 \uD654\uC0B4\uD45C\uAC00 \uBC16\uC5D0 \uB5A0 \uC798\uB838\uB2E4).\n * \uC67C\uCABD \uB9DE\uCDA4: \uBA38\uB9AC\uAE00 \uC624\uB978\uCABD \uC548(\uC0C1\uC790 \uC624\uB978\uCABD 20px) \u00B7 \uC624\uB978\uCABD \uB9DE\uCDA4: \uBA38\uB9AC\uAE00 \uC67C\uCABD \uC548(\uC0C1\uC790 \uC67C\uCABD 20px \u2014 \uBA38\uB9AC\uAE00 \uB05D\uC774 \uAC12 \uB05D\uACFC \uB9DE\uB294\uB2E4) \u00B7\n * \uAC00\uC6B4\uB370 \uB9DE\uCDA4: \uBA38\uB9AC\uAE00 \uBB36\uC74C \uBC16(left 100%) \u2014 \uD638\uBC84 \uB54C\uB9CC \uBCF4\uC774\uB2C8 \uBB36\uC74C\uC744 \uBC00\uC9C0 \uC54A\uACE0 \uBB36\uC74C\uC774 \uCE78 \uAC00\uC6B4\uB370\uC5D0 \uC120\uB2E4.\n */\nfunction sortPlacement(align?: \"left\" | \"center\" | \"right\") {\n if (align === \"right\") return { box: { paddingLeft: \"20px\" }, label: { left: 0, marginLeft: 0 } };\n if (align === \"center\") return { box: {}, label: { left: \"100%\", marginLeft: \"4px\" } };\n return { box: { paddingRight: \"20px\" }, label: { left: \"auto\", right: 0, marginLeft: 0 } };\n}\n\nfunction VirtualDataTableComponent<T>({\n data,\n loading = false,\n columns: columnsProp,\n onRowClick,\n getRowId,\n selectedRowId,\n selectedRowSx: selectedRowSxProp,\n rowHeight: rowHeightProp,\n columnHeight: columnHeightProp,\n striped,\n rowDivider = true,\n onSort,\n onSortClear,\n onHeaderContextMenu,\n onLoadMore,\n sortBy,\n sortDirection,\n showPaper = true,\n paddingX: paddingXProp,\n paddingTop = 0,\n paddingBottom = 0,\n rowHoverColor: rowHoverColorProp,\n rowHoverOpacity: rowHoverOpacityProp,\n viewportBuffer,\n overscan,\n initialItemCount,\n scrollbars,\n emptyMessage = \"NO DATA\",\n autoHeight = false,\n LoadingComponent,\n showFooter,\n footerHeight,\n footerSx,\n variant = \"default\",\n borderColor,\n framed = true,\n headerTopBorder = false,\n scrollbarGutter = false,\n rowHeightMode = \"fixed\",\n tableLayout = \"fixed\",\n renderFullWidthRow,\n fullWidthRowSx,\n onRowContextMenu,\n pinnedRows,\n pinnedRowsMaxHeight,\n pinnedRowsSx,\n resetScrollOnDataChange = true,\n rowKeyFromId = false,\n onEndReached,\n colorMode,\n mobile,\n scrollParent,\n columnResize,\n columnWidths,\n onColumnWidthsChange,\n rowReorder,\n columnReorder,\n columnOrder,\n onColumnOrderChange,\n}: VirtualDataTableProps<T>) {\n // \uB178\uC158\uD48D(variant=\"notion\") \u2014 @ehfuse/taskbox \uBAA9\uB85D\uD45C\uC640 \uAC19\uC740 \uAC12\uC774\uB2E4. \uAE30\uBCF8\uAC12\uB9CC \uBC14\uAFB8\uACE0 \uC9C1\uC811 \uC900 prop \uC774 \uC774\uAE34\uB2E4.\n const notion = variant === \"notion\";\n const muiTheme = useTheme();\n // colorMode \uB97C \uC8FC\uBA74 \uC571 \uD14C\uB9C8\uC640 \uB2EC\uB9AC \uC774 \uD45C\uB9CC \uADF8 \uBAA8\uB4DC\uB85C \uCE60\uD55C\uB2E4(\uC571\uC740 \uBC1D\uC740\uB370 \uC5C5\uBB34\uD568\uB9CC \uC5B4\uB450\uC6B4 \uACBD\uC6B0).\n const baseNotionTokens = (colorMode ?? muiTheme.palette.mode) === \"dark\" ? NOTION_DARK : NOTION_LIGHT;\n // \uBC14\uAE65\uC5D0\uC11C \uC120 \uC0C9\uC744 \uC8FC\uBA74 \uD2C0 \u00B7 \uBA38\uB9AC\uC904 \u00B7 \uCE78 \uC120 \uBAA8\uB450 \uADF8 \uC0C9(1.11.3).\n const notionTokens = borderColor ? { ...baseNotionTokens, border: borderColor, borderStrong: borderColor } : baseNotionTokens;\n const hasPinnedRows = (pinnedRows?.length ?? 0) > 0;\n const columnHeight = columnHeightProp ?? (notion ? 40 : 56);\n // \uB178\uC158\uD48D \uC904 \uB192\uC774 \uAE30\uBCF8 48 \u2014 \uC5C5\uBB34\uD568 \uBAA9\uB85D \uD45C \u00B7 \uC804\uC790\uACB0\uC7AC \uD45C\uAC00 \uC4F0\uB294 \uAC12\uC774\uB2E4.\n const rowHeight = rowHeightProp ?? (notion ? 48 : 50);\n // \uD2C0 \uC5C6\uC774(framed=false) \uADF8\uB9B4 \uB54C\uB294 \uBC14\uAE65 \uC0C1\uC790\uAC00 \uC774\uBBF8 \uD14C\uB450\uB9AC\uB97C \uB458\uB800\uB2E4 \u2014 \uC88C\uC6B0 \uC5EC\uBC31 \uC5C6\uC774 \uD45C\uAC00 \uC0C1\uC790\uC5D0 \uAF49 \uCC2C\uB2E4.\n const paddingX = framed ? (paddingXProp ?? (notion ? \"12px\" : \"1rem\")) : 0;\n // \uD3F0 \uBAA9\uB85D(1.6.0) \u2014 \uCF20 \uD45C\uB9CC, \uD654\uBA74\uC774 \uC881\uC744 \uB54C\uB9CC \uCE74\uB4DC \uC904\uB85C \uADF8\uB9B0\uB2E4\n const mobileConfig = mobile === true ? {} : mobile || null;\n const mobileMatch = useMediaQuery(mobileConfig?.query ?? DEFAULT_MOBILE_QUERY, { noSsr: true });\n const mobileList = Boolean(mobileConfig) && mobileMatch;\n // \uC904 \uB04C\uC5B4 \uC62E\uAE30\uAE30(1.9.0) \u2014 \uC190\uC7A1\uC774 \uC5F4\uC744 \uB9E8 \uC55E\uC5D0 \uB07C\uC6B4\uB2E4. \uD45C \uC0C1\uC790 \u00B7 \uAD74\uB9AC\uB294 \uC694\uC18C ref \uB294 \uC544\uB798\uC5D0\uC11C \uCC44\uC6CC\uC9C4\uB2E4(\uB044\uB294 \uB3D9\uC548\uC5D0\uB9CC \uC77D\uB294\uB2E4)\n const reorderBoxRef = useRef<HTMLDivElement | null>(null);\n const reorderScrollerRef = useRef<() => HTMLElement | null>(() => null);\n const dataLengthRef = useRef(data.length);\n dataLengthRef.current = data.length;\n const reorder = useRowReorder<T>({\n config: rowReorder,\n tableBoxRef: reorderBoxRef,\n getScroller: () => reorderScrollerRef.current(),\n dataLengthRef,\n anyPinned: columnsProp.some((c) => c.pinned === \"left\"),\n });\n // \uC5F4 \uC21C\uC11C \uBC14\uAFB8\uAE30(1.12.0, 2026-11-14) \u2014 \uD3F0 \uBAA9\uB85D\uC740 \uCE78 \uD558\uB098\uB77C \uB04C\uAE30\uB3C4 \uBC14\uAFBC \uC21C\uC11C\uB3C4 \uC4F0\uC9C0 \uC54A\uB294\uB2E4(\uC5F4 \uD3ED \uB04C\uAE30\uC640 \uAC19\uB2E4).\n const colReorderConfig = columnReorder === true ? {} : columnReorder || null;\n const colReorderOn = Boolean(colReorderConfig) && !mobileList;\n // \uB193\uC740 \uB4A4 \uC18C\uBE44\uCC98\uAC00 \uC0C8 \uC21C\uC11C\uB97C \uB118\uACA8 \uC904 \uB54C\uAE4C\uC9C0 \uC950\uB294 \uAC12 \u2014 \uC18C\uBE44\uCC98\uAC00 \uC21C\uC11C\uB97C \uB118\uAE30\uC9C0 \uC54A\uC73C\uBA74 \uC774\uAC83\uC774 \uACE7 \uD45C \uC548 \uAE30\uC5B5\uC774\uB2E4.\n const [localOrder, setLocalOrder] = useState<string[] | null>(null);\n useEffect(() => {\n setLocalOrder(null);\n }, [columnOrder]);\n const activeOrder = colReorderOn ? (localOrder ?? columnOrder ?? null) : null;\n const orderedColumns = useMemo(() => applyColumnOrder(columnsProp, activeOrder), [columnsProp, activeOrder]);\n const orderedColumnsRef = useRef(orderedColumns);\n orderedColumnsRef.current = orderedColumns;\n const onColumnOrderChangeRef = useRef(onColumnOrderChange);\n onColumnOrderChangeRef.current = onColumnOrderChange;\n const colReorderBoxRef = useRef<HTMLDivElement | null>(null);\n const colReorder = useColumnReorder<T>({\n on: colReorderOn,\n config: colReorderConfig,\n tableBoxRef: colReorderBoxRef,\n columnsRef: orderedColumnsRef,\n onCommit: useCallback((order: string[]) => {\n setLocalOrder(order);\n onColumnOrderChangeRef.current?.(order);\n }, []),\n });\n const columns = useMemo(\n () => (reorder.handleColumn ? [reorder.handleColumn, ...orderedColumns] : orderedColumns),\n [reorder.handleColumn, orderedColumns],\n );\n // \uBC14\uAE65 \uC2A4\uD06C\uB864(1.7.0) \u2014 \uD398\uC774\uC9C0\uAC00 \uAD74\uB9AC\uACE0 \uD45C\uB294 \uADF8 \uC2A4\uD06C\uB864\uC5D0 \uB9DE\uCDB0 \uBCF4\uC774\uB294 \uC904\uB9CC \uADF8\uB9B0\uB2E4(\uB192\uC774\uB294 \uB0B4\uC6A9\uB9CC\uD07C)\n const external = Boolean(scrollParent);\n // \uB192\uC774\uB97C \uB0B4\uC6A9\uC5D0 \uB9E1\uAE30\uB294\uAC00 \u2014 autoHeight(\uAC00\uC0C1\uD654 \uC5C6\uC74C) \u00B7 \uBC14\uAE65 \uC2A4\uD06C\uB864(\uAC00\uC0C1\uD654 \uC788\uC74C)\n const sizeAuto = autoHeight || external;\n // \uCE74\uB4DC \uC904\uC740 \uB0B4\uC6A9\uB9CC\uD07C \uB192\uC544\uC9C4\uB2E4(rowHeight \uB294 \uCD5C\uC18C \uB192\uC774)\n const autoRowHeight = rowHeightMode === \"auto\" || mobileList;\n // \uD638\uBC84\uB294 \uB2E8\uC0C9(\uBD88\uD22C\uBA85) \u2014 \uAE30\uBCF8 \uBAA8\uC591\uC758 \uBC18\uD22C\uBA85 \uAC80\uC815\uC740 \uD770 \uC885\uC774 \uC704\uC5D0\uC11C \uD68C\uC0C9\uC774 \uC544\uB2C8\uB77C \uD0C1\uD55C \uC0C9\uC73C\uB85C \uBCF4\uC778\uB2E4.\n // \uB05D \uCE78 \uC2A4\uD06C\uB864\uBC14 \uC790\uB9AC(scrollbarGutter, 1.11.1) \u2014 \uB05D \uCE78 \uC624\uB978\uCABD \uC5EC\uBC31 = \uC6D0\uB798 \uCE78 \uC5EC\uBC31 + \uC2A4\uD06C\uB864\uBC14 \uD3ED.\n const gutterPx =\n typeof scrollbarGutter === \"number\"\n ? scrollbarGutter\n : scrollbarGutter\n ? (Number((scrollbars as { thumb?: { width?: number } } | undefined)?.thumb?.width) || 8) + 8\n : 0;\n const gutterSx =\n gutterPx > 0\n ? {\n \"& thead tr th:last-of-type, & tbody tr td:last-of-type:not([data-vdt-pad])\": {\n paddingRight: `${(notion ? 14 : 16) + gutterPx}px !important`,\n },\n }\n : {};\n const rowHoverColor = rowHoverColorProp ?? (notion ? notionTokens.hoverBg : undefined);\n const rowHoverOpacity = rowHoverOpacityProp ?? (notion ? 1 : undefined);\n const defaultViewportBufferTop = Math.max(rowHeight * 12, 480);\n const defaultViewportBufferBottom = Math.max(rowHeight * 12, 480);\n const viewportBufferTop =\n typeof viewportBuffer === \"number\"\n ? viewportBuffer\n : (viewportBuffer?.top ?? defaultViewportBufferTop);\n const viewportBufferBottom =\n typeof viewportBuffer === \"number\"\n ? viewportBuffer\n : (viewportBuffer?.bottom ?? defaultViewportBufferBottom);\n const defaultOverscanMain = Math.max(rowHeight * 8, 420);\n const defaultOverscanReverse = Math.max(rowHeight * 10, 520);\n const virtuosoOverscan =\n typeof overscan === \"number\"\n ? overscan\n : {\n main: overscan?.main ?? defaultOverscanMain,\n reverse: overscan?.reverse ?? defaultOverscanReverse,\n };\n const estimatedItemHeight = rowHeight + (rowDivider ? 1 : 0);\n\n // \uC120\uD0DD \uD589 \uD558\uC774\uB77C\uC774\uD2B8\uB294 selectedRowSx \uAC00 \uAC1D\uCCB4(\uB610\uB294 \uBBF8\uC9C0\uC815)\uBA74 CSS \uC140\uB809\uD130\uB85C \uCC98\uB9AC\uD55C\uB2E4.\n // \uCEE8\uD14C\uC774\uB108 sx \uC5D0 `tr[data-row-id=\"...\"]` \uADDC\uCE59\uC744 \uB123\uC73C\uBA74 selectedRowId \uBCC0\uACBD \uC2DC components/\uD589\uC744\n // \uC7AC\uB80C\uB354\uD558\uC9C0 \uC54A\uACE0(\uCEE8\uD14C\uC774\uB108 1\uAC1C\uB9CC \uAC31\uC2E0) CSS \uB85C\uB9CC \uAC15\uC870\uB3FC row \uD074\uB9AD \uBC18\uC751\uC774 \uC989\uAC01\uC801\uC774\uB2E4.\n // \uD568\uC218\uD615 selectedRowSx(\uD589\uB9C8\uB2E4 \uB3D9\uC801)\uB294 CSS \uB85C \uD45C\uD604 \uBD88\uAC00\uD558\uBBC0\uB85C \uAE30\uC874 per-row \uACBD\uB85C\uB97C \uC720\uC9C0\uD55C\uB2E4.\n // \uB178\uC158\uD48D\uC740 \uC120\uD0DD \uC904 \uBAA8\uC591\uC744 \uAE30\uBCF8\uC73C\uB85C \uAC16\uB294\uB2E4 \u2014 \uC605\uC740 \uD30C\uB780 \uBC14\uD0D5 + \uC67C\uCABD \uD30C\uB780 \uB760 3px(\uBAA9\uB85D \uD45C\uC758 \"\uC9C0\uAE08 \uC5F4\uC5B4 \uB454 \uC904\").\n // \uB760\uB294 \uC904(tr)\uC758 \uADF8\uB9BC\uC790\uAC00 \uBE0C\uB77C\uC6B0\uC800\uB9C8\uB2E4 \uADF8\uB824\uC9C0\uC9C0 \uC54A\uC544 \uCCAB \uCE78 \uC548\uCABD \uADF8\uB9BC\uC790\uB85C \uAE0B\uB294\uB2E4. \uACE0\uC815 \uC5F4 \uCE78\uC740 \uC81C \uBC14\uD0D5\uC744 \uCE60\uD558\uBBC0\uB85C \uAC19\uC740 \uC0C9\uC744 \uC900\uB2E4.\n const notionSelectedSx = useMemo(\n () =>\n notion\n ? {\n backgroundColor: notionTokens.selectedBg,\n \"& > td:first-of-type\": { boxShadow: `inset 3px 0 0 ${notionTokens.selectedBar}` },\n \"& > td[data-vdt-pinned]\": { backgroundColor: notionTokens.selectedBg },\n }\n : undefined,\n [notion, notionTokens],\n );\n const selectedRowSx = selectedRowSxProp ?? notionSelectedSx;\n const useCssRowHighlight = !selectedRowSx || typeof selectedRowSx !== \"function\";\n const selectedRowCssSx = useMemo<Record<string, unknown> | null>(() => {\n if (\n !useCssRowHighlight ||\n selectedRowId === null ||\n selectedRowId === undefined ||\n !selectedRowSx\n ) {\n return null;\n }\n const escaped = String(selectedRowId).replace(/[\"\\\\]/g, \"\\\\$&\");\n return {\n [`& tbody tr[data-row-id=\"${escaped}\"]`]: selectedRowSx,\n };\n }, [useCssRowHighlight, selectedRowId, selectedRowSx]);\n\n const isDev =\n typeof window !== \"undefined\" &&\n (window.location.hostname === \"localhost\" ||\n window.location.hostname === \"127.0.0.1\");\n\n const [perfDebugEnabled] = useState(() => {\n if (typeof window === \"undefined\") {\n return false;\n }\n return window.localStorage.getItem(\"vdt-perf-debug\") === \"1\";\n });\n const perfStatsRef = useRef({\n wheelEvents: 0,\n wheelInputPx: 0,\n wheelHandlerMs: 0,\n wheelRafFlushes: 0,\n wheelRafMs: 0,\n rangeChangedCalls: 0,\n rangeChangedMs: 0,\n rowContentCalls: 0,\n rowContentMs: 0,\n rowContentMaxMs: 0,\n cellRenderCalls: 0,\n cellRenderMs: 0,\n cellRenderMaxMs: 0,\n });\n\n // \uB204\uC801\uB41C \uC131\uB2A5 \uD1B5\uACC4\uB97C \uCF58\uC194\uC5D0 \uC8FC\uAE30\uC801\uC73C\uB85C \uCD9C\uB825\uD55C\uB2E4.\n const flushPerfStats = useCallback(\n (reason: string) => {\n if (!perfDebugEnabled) {\n return;\n }\n const stats = perfStatsRef.current;\n const hasData =\n stats.wheelEvents > 0 ||\n stats.rangeChangedCalls > 0 ||\n stats.rowContentCalls > 0 ||\n stats.cellRenderCalls > 0;\n if (!hasData) {\n return;\n }\n\n const rowAvgMs =\n stats.rowContentCalls > 0\n ? stats.rowContentMs / stats.rowContentCalls\n : 0;\n const cellAvgMs =\n stats.cellRenderCalls > 0\n ? stats.cellRenderMs / stats.cellRenderCalls\n : 0;\n\n console.log(\"[VDT perf]\", {\n reason,\n wheel: {\n events: stats.wheelEvents,\n inputPx: Math.round(stats.wheelInputPx),\n handlerMs: Number(stats.wheelHandlerMs.toFixed(2)),\n rafFlushes: stats.wheelRafFlushes,\n rafMs: Number(stats.wheelRafMs.toFixed(2)),\n },\n rangeChanged: {\n calls: stats.rangeChangedCalls,\n totalMs: Number(stats.rangeChangedMs.toFixed(2)),\n },\n rowContent: {\n calls: stats.rowContentCalls,\n totalMs: Number(stats.rowContentMs.toFixed(2)),\n avgMs: Number(rowAvgMs.toFixed(3)),\n maxMs: Number(stats.rowContentMaxMs.toFixed(3)),\n },\n cellRender: {\n calls: stats.cellRenderCalls,\n totalMs: Number(stats.cellRenderMs.toFixed(2)),\n avgMs: Number(cellAvgMs.toFixed(3)),\n maxMs: Number(stats.cellRenderMaxMs.toFixed(3)),\n },\n });\n\n perfStatsRef.current = {\n wheelEvents: 0,\n wheelInputPx: 0,\n wheelHandlerMs: 0,\n wheelRafFlushes: 0,\n wheelRafMs: 0,\n rangeChangedCalls: 0,\n rangeChangedMs: 0,\n rowContentCalls: 0,\n rowContentMs: 0,\n rowContentMaxMs: 0,\n cellRenderCalls: 0,\n cellRenderMs: 0,\n cellRenderMaxMs: 0,\n };\n },\n [perfDebugEnabled],\n );\n\n useEffect(() => {\n if (!perfDebugEnabled || typeof window === \"undefined\") {\n return;\n }\n\n console.log(\"[VDT perf] enabled (localStorage vdt-perf-debug=1)\");\n\n const intervalId = window.setInterval(() => {\n flushPerfStats(\"interval\");\n }, 1500);\n\n return () => {\n window.clearInterval(intervalId);\n flushPerfStats(\"cleanup\");\n };\n }, [flushPerfStats, perfDebugEnabled]);\n\n // \uAC01 \uD14C\uC774\uBE14 \uC778\uC2A4\uD134\uC2A4\uBCC4\uB85C Scroller \uCEF4\uD3EC\uB10C\uD2B8 \uC0DD\uC131 (scrollbars, paddingX\uB97C \uCD08\uAE30\uAC12\uC73C\uB85C \uACE0\uC815)\n const VirtuosoScroller = useMemo(\n () =>\n forwardRef<HTMLDivElement, any>((props, ref) => {\n const scrollContainerRef = useRef<HTMLElement | null>(null);\n const wheelDeltaRef = useRef(0);\n const wheelRafRef = useRef<number | null>(null);\n\n // \uD720 \uC774\uBCA4\uD2B8\uB97C \uC9C1\uC811 \uC81C\uC5B4\uD574 \uBE0C\uB77C\uC6B0\uC800 smooth-scroll \uBCF4\uAC04 \uC5C6\uC774 \uC989\uC2DC scrollTop \uBC18\uC601\n useEffect(() => {\n const el = scrollContainerRef.current;\n if (!el) return;\n\n // \uD720 \uB378\uD0C0\uB97C \uD504\uB808\uC784 \uB2E8\uC704\uB85C \uD569\uC0B0 \uBC18\uC601\uD574 \uACFC\uB3C4\uD55C scrollTop \uAC31\uC2E0\uC744 \uC904\uC778\uB2E4.\n const handleWheel = (e: WheelEvent) => {\n const wheelStart = perfDebugEnabled\n ? performance.now()\n : 0;\n // \uAC00\uB85C \uD720(\uD2B8\uB799\uD328\uB4DC \uC606 \uBC00\uAE30 \u00B7 Shift+\uD720)\uC740 \uBE0C\uB77C\uC6B0\uC800\uC5D0 \uB9E1\uAE34\uB2E4 \u2014 \uC544\uB798\uC5D0\uC11C \uC138\uB85C\uB85C\uB9CC \uC62E\uAE30\uBBC0\uB85C \uB9C9\uC73C\uBA74\n // \uC5F4\uC774 \uB9CE\uC740 \uD45C(tableLayout=\"auto\")\uB97C \uC606\uC73C\uB85C \uBC00 \uC218 \uC5C6\uB2E4.\n if (e.shiftKey || Math.abs(e.deltaX) > Math.abs(e.deltaY)) {\n return;\n }\n // \uBA38\uB9AC \uC544\uB798 \uACE0\uC815 \uC904 \uC601\uC5ED(pinnedRows)\uCC98\uB7FC \uC548\uC5D0\uC11C \uB530\uB85C \uAD74\uB9AC\uB294 \uC0C1\uC790 \uC704\uC5D0\uC11C\uB294 \uADF8 \uC0C1\uC790\uB97C \uBA3C\uC800 \uAD74\uB9B0\uB2E4 \u2014\n // \uC5EC\uAE30\uC11C \uB9C9\uC73C\uBA74 \uADF8 \uC601\uC5ED\uC758 6\uBC88\uC9F8 \uC904\uBD80\uD130\uB294 \uBCFC \uBC29\uBC95\uC774 \uC5C6\uB2E4. \uB05D\uC5D0 \uB2FF\uC558\uC73C\uBA74 \uBCF8\uBB38\uC744 \uAD74\uB9B0\uB2E4.\n const inner = (e.target as HTMLElement | null)?.closest?.(\"[data-vdt-inner-scroll]\") as HTMLElement | null;\n if (inner && el.contains(inner)) {\n const canScroll =\n e.deltaY < 0\n ? inner.scrollTop > 0\n : inner.scrollTop + inner.clientHeight < inner.scrollHeight - 1;\n if (canScroll) return;\n }\n e.preventDefault();\n let delta = e.deltaY;\n // deltaMode 1 = \uB77C\uC778 \uB2E8\uC704, 2 = \uD398\uC774\uC9C0 \uB2E8\uC704 \uBCC0\uD658\n if (e.deltaMode === 1) {\n delta *= 40;\n } else if (e.deltaMode === 2) {\n delta *= el.clientHeight;\n }\n\n if (perfDebugEnabled) {\n perfStatsRef.current.wheelEvents += 1;\n perfStatsRef.current.wheelInputPx += delta;\n }\n\n wheelDeltaRef.current += delta;\n if (wheelRafRef.current !== null) {\n return;\n }\n\n wheelRafRef.current = requestAnimationFrame(() => {\n const rafStart = perfDebugEnabled\n ? performance.now()\n : 0;\n const maxStep = Math.max(\n el.clientHeight * 0.4,\n 160,\n );\n const batchedDelta = Math.max(\n -maxStep,\n Math.min(maxStep, wheelDeltaRef.current),\n );\n wheelDeltaRef.current = 0;\n wheelRafRef.current = null;\n if (batchedDelta !== 0) {\n el.scrollTop += batchedDelta;\n }\n if (perfDebugEnabled) {\n perfStatsRef.current.wheelRafFlushes += 1;\n perfStatsRef.current.wheelRafMs +=\n performance.now() - rafStart;\n }\n });\n\n if (perfDebugEnabled) {\n perfStatsRef.current.wheelHandlerMs +=\n performance.now() - wheelStart;\n }\n };\n\n el.addEventListener(\"wheel\", handleWheel, {\n passive: false,\n });\n return () => {\n el.removeEventListener(\"wheel\", handleWheel);\n if (wheelRafRef.current !== null) {\n cancelAnimationFrame(wheelRafRef.current);\n wheelRafRef.current = null;\n }\n wheelDeltaRef.current = 0;\n };\n }, []);\n\n return (\n <OverlayScrollbar\n detectInnerScroll={true}\n track={OVERLAY_SCROLLBAR_TRACK_CONFIG}\n {...scrollbars}\n >\n <TableContainer\n component={Box}\n {...props}\n ref={(node) => {\n scrollContainerRef.current =\n node as HTMLElement;\n if (typeof ref === \"function\") {\n ref(node as HTMLDivElement);\n } else if (ref) {\n ref.current = node as HTMLDivElement;\n }\n }}\n sx={{\n userSelect: \"auto\",\n WebkitUserSelect: \"auto\",\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n overflow: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n scrollbarWidth: \"none\",\n msOverflowStyle: \"none\",\n // \uAE5C\uBC15\uC784 \uBC29\uC9C0\uB97C \uC704\uD55C GPU \uAC00\uC18D\n transform: \"translateZ(0)\",\n backfaceVisibility: \"hidden\",\n willChange: \"scroll-position\",\n \"&::-webkit-scrollbar\": {\n display: \"none\",\n },\n \"& .MuiTable-root\": {\n // \uB178\uC158\uD48D\uC740 \uC88C\uC6B0 \uC5EC\uBC31\uC744 \uC885\uC774(Paper/Box) \uCABD\uC5D0 \uC900\uB2E4 \u2014 \uD14C\uB450\uB9AC\uAC00 \uC5EC\uBC31 \uC548\uCABD\uC5D0 \uADF8\uB824\uC838\uC57C \uD55C\uB2E4.\n paddingRight: notion ? 0 : paddingX,\n // \uC22B\uC790\uB294 px \uB85C \uC900\uB2E4 \u2014 sx \uC5D0 \uC22B\uC790\uB97C \uADF8\uB300\uB85C \uB123\uC73C\uBA74 MUI \uAC00 \uAC04\uACA9 \uB2E8\uC704(\u00D78)\uB85C \uC77D\uC5B4 106 \uC774 848px \uAC00 \uB410\uB2E4(1.7.1 \u00B7 \uAE00\uC740 \uADF8\uB300\uB85C 1.7.2)\n paddingTop: typeof paddingTop === \"number\" ? `${paddingTop}px` : paddingTop,\n paddingBottom: typeof paddingBottom === \"number\" ? `${paddingBottom}px` : paddingBottom,\n },\n }}\n />\n </OverlayScrollbar>\n );\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [], // \uBE48 \uBC30\uC5F4: \uCD5C\uCD08 \uB9C8\uC6B4\uD2B8 \uC2DC\uC5D0\uB9CC \uC0DD\uC131, scrollbars, paddingX, paddingTop, paddingBottom, notion \uC740 \uD074\uB85C\uC800\uB85C \uACE0\uC815\n );\n\n // Striped row \uBC30\uACBD\uC0C9 \uACC4\uC0B0\n const stripedRowColor = useMemo(() => {\n if (striped === true) {\n return \"#f5f5f5\"; // \uAE30\uBCF8 \uD68C\uC0C9\n } else if (typeof striped === \"string\") {\n return striped; // \uC0AC\uC6A9\uC790 \uC9C0\uC815 \uC0C9\uC0C1\n }\n return undefined; // \uBC30\uACBD\uC0C9 \uC5C6\uC74C\n }, [striped]);\n\n // \uB85C\uB529 \uC0C1\uD0DC \uAD00\uB9AC (\uC6D0\uBCF8 \uBC29\uC2DD)\n const [internalLoading, setInternalLoading] = useState(loading);\n\n // \uD14C\uC774\uBE14 \uC7AC\uB9C8\uC6B4\uD2B8\uB97C \uC704\uD55C \uD0A4 (\uB370\uC774\uD130\uAC00 \uBE44\uC6CC\uC9C0\uBA74 \uC7AC\uB9C8\uC6B4\uD2B8)\n const [tableKey, setTableKey] = useState(0);\n\n // \uB85C\uB529 \uC0C1\uD0DC \uBCC0\uACBD \uAC10\uC9C0\n useEffect(() => {\n if (loading) {\n // \uB85C\uB529\uC774 \uC2DC\uC791\uB418\uBA74 \uC989\uC2DC \uD45C\uC2DC\n setInternalLoading(true);\n }\n // \uB85C\uB529\uC774 \uB05D\uB098\uB3C4 internalLoading\uC740 handleLoadingComplete\uC5D0\uC11C\uB9CC false\uB85C \uC124\uC815\n // LoadingProgress\uC5D0\uC11C\uB294 visible={false}\uB85C \uD398\uC774\uB4DC\uC544\uC6C3\uC744 \uC2DC\uC791\uD568\n }, [loading]);\n\n // \uB85C\uB529 \uC644\uB8CC \uD578\uB4E4\uB7EC - LoadingProgress\uC758 \uD398\uC774\uB4DC\uC544\uC6C3\uC774 \uC644\uB8CC\uB41C \uD6C4 \uD638\uCD9C\uB428\n const handleLoadingComplete = useCallback(() => {\n setInternalLoading(false);\n }, []);\n\n // \uB85C\uB529 \uC624\uBC84\uB808\uC774 \uD45C\uC2DC \uC870\uAC74\n const shouldShowLoading = internalLoading;\n\n // \uB354\uBCF4\uAE30 \uB85C\uB529 \uC5EC\uBD80 (\uB370\uC774\uD130\uAC00 \uC788\uACE0 \uB85C\uB529 \uC911\uC774\uBA74 \uB354\uBCF4\uAE30 \uB85C\uB529)\n const isLoadMoreLoading = loading && data.length > 0;\n\n // \uBB34\uD55C \uC2A4\uD06C\uB864 \uB85C\uB529 \uC0C1\uD0DC (\uAE30\uC874 VirtualDataTable \uBC29\uC2DD)\n const isLoadingMoreRef = useRef(false);\n // \uC9C1\uC804\uC5D0 loadMore \uB97C \uC694\uCCAD\uD55C \uC2DC\uC810\uC758 \uB370\uC774\uD130 \uAE38\uC774. \uC694\uCCAD \uD6C4 \uAE38\uC774\uAC00 \uB298\uC9C0 \uC54A\uC558\uB2E4\uBA74\n // (= \uC11C\uBC84\uC5D0 \uB354 \uC774\uC0C1 \uB370\uC774\uD130 \uC5C6\uC74C) \uAC19\uC740 \uAE38\uC774\uB85C\uB294 \uB2E4\uC2DC \uC694\uCCAD\uD558\uC9C0 \uC54A\uC544, \uBC14\uB2E5\uC5D0\uC11C\n // endReached \u2194 onLoadMore \uAC00 \uBB34\uD55C \uBC18\uBCF5\uB418\uB294 \uAC83\uC744 \uB9C9\uB294\uB2E4.\n const lastLoadMoreLengthRef = useRef<number>(-1);\n const virtuosoRef = useRef<any>(null); // TableVirtuoso ref\n // \uC904\uB4E4\uC774 \uC2A4\uD06C\uB864 \uC601\uC5ED\uBCF4\uB2E4 \uAE34\uAC00 \u2014 \uAE38\uBA74 \uB9E8 \uB05D \uC904\uC774 \uD2C0 \uBC14\uB2E5\uC5D0 \uB2FF\uC73C\uBBC0\uB85C \uADF8 \uC904\uC758 \uC544\uB798\uC120\uC744 \uBE80\uB2E4(\uC544\uB798 \uB178\uC158 \uC2A4\uD0C0\uC77C).\n const scrollerElRef = useRef<HTMLElement | null>(null);\n const [listOverflows, setListOverflows] = useState(false);\n const checkListOverflow = useCallback(() => {\n const el = scrollerElRef.current;\n if (el) setListOverflows(el.scrollHeight > el.clientHeight + 1);\n }, []);\n useEffect(() => {\n const el = scrollerElRef.current;\n if (!el || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(() => checkListOverflow());\n observer.observe(el);\n return () => observer.disconnect();\n }, [checkListOverflow, autoHeight]);\n\n // \uC18C\uBE44\uCC98\uAC00 \uC778\uB77C\uC778\uC73C\uB85C \uB118\uAE30\uB294 \uCF5C\uBC31(onRowClick/getRowId)\uC740 \uB9E4 \uB80C\uB354\uB9C8\uB2E4 identity \uAC00 \uBC14\uB010\uB2E4.\n // \uC774\uB97C ref \uB85C \uC7A1\uC544 \uB450\uBA74 VirtuosoTableComponents(memo)\uB97C \uC7AC\uC0DD\uC131\uD558\uC9C0 \uC54A\uC544\uB3C4 \uCD5C\uC2E0 \uCF5C\uBC31\uC744 \uC4F8 \uC218 \uC788\uC5B4,\n // \uAC80\uC0C9/\uD544\uD130\uB85C \uBD80\uBAA8\uAC00 \uB9AC\uB80C\uB354\uB3FC\uB3C4 \uD589(\uBC0F \uC774\uBBF8\uC9C0)\uC774 \uB9AC\uB9C8\uC6B4\uD2B8\uB418\uC9C0 \uC54A\uB294\uB2E4(\uC0AC\uC9C4 \uAE5C\uBE61\uC784 \uBC29\uC9C0).\n const onRowClickRef = useRef(onRowClick);\n onRowClickRef.current = onRowClick;\n const getRowIdRef = useRef(getRowId);\n getRowIdRef.current = getRowId;\n const onRowContextMenuRef = useRef(onRowContextMenu);\n onRowContextMenuRef.current = onRowContextMenu;\n const onEndReachedRef = useRef(onEndReached);\n onEndReachedRef.current = onEndReached;\n // \uACE0\uC815 \uC904(pinnedRows)\uC740 \uBA38\uB9AC \uC548\uC5D0 \uADF8\uB9AC\uB294\uB370 \uBA38\uB9AC \uB0B4\uC6A9\uC774 \uC904 \uBD80\uD488\uBCF4\uB2E4 \uBA3C\uC800 \uB9CC\uB4E4\uC5B4\uC9C4\uB2E4 \u2014 \uC904 \uBD80\uD488\uC740 ref \uB85C \uB2A6\uAC8C \uC7A1\uB294\uB2E4.\n const rowComponentRef = useRef<React.ComponentType<any> | null>(null);\n\n // \uC5F4 \uD3ED \uB04C\uC5B4 \uBC14\uAFB8\uAE30(1.8.0) \u2014 \uD3F0 \uBAA9\uB85D\uC740 \uCE78 \uD558\uB098\uB77C \uC5F4 \uD3ED\uC774 \uC5C6\uC5B4 \uC190\uC7A1\uC774\uB3C4 \uBC14\uAFBC \uD3ED\uB3C4 \uC4F0\uC9C0 \uC54A\uB294\uB2E4.\n const resizeConfig = columnResize === true ? {} : columnResize || null;\n const resizeOn = Boolean(resizeConfig) && !mobileList;\n const resizeMinDefault = resizeConfig?.minWidth ?? 48;\n // \uB193\uC740 \uB4A4 \uC18C\uBE44\uCC98\uAC00 \uC0C8 \uD3ED\uC744 \uB118\uACA8 \uC904 \uB54C\uAE4C\uC9C0 \uC950\uB294 \uAC12 \u2014 \uC800\uC7A5\uC774 \uB2A6\uC5B4\uB3C4 \uB193\uC740 \uD3ED\uC774 \uC61B \uD3ED\uC73C\uB85C \uD280\uC9C0 \uC54A\uAC8C. \uC18C\uBE44\uCC98\uAC00 \uD3ED\uC744 \uB118\uAE30\uC9C0 \uC54A\uC73C\uBA74 \uC774\uAC83\uC774 \uACE7 \uD45C \uC548 \uAE30\uC5B5\uC774\uB2E4.\n const [localWidths, setLocalWidths] = useState<VDTColumnWidths | null>(null);\n useEffect(() => {\n setLocalWidths(null);\n }, [columnWidths]);\n const activeWidths: VDTColumnWidths = resizeOn ? (localWidths ?? columnWidths ?? EMPTY_WIDTHS) : EMPTY_WIDTHS;\n const activeWidthsRef = useRef(activeWidths);\n activeWidthsRef.current = activeWidths;\n const onColumnWidthsChangeRef = useRef(onColumnWidthsChange);\n onColumnWidthsChangeRef.current = onColumnWidthsChange;\n const columnsRef = useRef(columns);\n columnsRef.current = columns;\n const tableBoxRef = useRef<HTMLDivElement | null>(null);\n // \uB04C\uC5B4 \uC62E\uAE30\uAE30(1.9.0)\uC758 \uC790\uB3D9 \uC2A4\uD06C\uB864\uC774 \uAD74\uB9B4 \uC694\uC18C \u2014 \uBC14\uAE65 \uC2A4\uD06C\uB864\uC774\uBA74 \uADF8\uAC83, \uC544\uB2C8\uBA74 \uD45C\uC758 \uC2A4\uD06C\uB864\uB7EC(autoHeight \uB294 null \u2192 \uAC00\uAE4C\uC6B4 \uAD74\uB9AC\uB294 \uC870\uC0C1 \u00B7 \uBB38\uC11C)\n reorderScrollerRef.current = () => (external ? (scrollParent as HTMLElement | null) : autoHeight ? null : scrollerElRef.current);\n\n /**\n * \uBC14\uAFBC \uD3ED \u2192 \uD45C \uC0C1\uC790\uC758 CSS \uBCC0\uC218. \uCE78 \uD3ED\uC740 --vdt-cw-\uC5F4\uC21C\uBC88, \uD45C \uCD5C\uC18C \uD3ED\uC740 --vdt-tmin, \uBAA8\uB4E0 \uC5F4 \uD3ED\uC774 \uC815\uD574\uC84C\uC73C\uBA74 \uD45C \uD3ED --vdt-tw.\n * \uD45C \uD3ED\uC744 100% \uB85C \uB450\uBA74 \uBAA8\uB4E0 \uC5F4\uC774 \uC22B\uC790\uC77C \uB54C \uB0A8\uB294 \uD3ED\uC774 \uC5F4\uB9C8\uB2E4 \uB098\uB220\uC838 \uB048 \uD3ED\uACFC \uADF8\uB824\uC9C4 \uD3ED\uC774 \uC5B4\uAE0B\uB09C\uB2E4 \u2014 \uADF8\uB54C\uB294 \uD45C\uB97C \uC5F4 \uD3ED \uD569\uC73C\uB85C \uC138\uC6B4\uB2E4.\n * \uB0A8\uB294 \uD3ED\uC744 \uAC16\uB294 \uC5F4(width \uC5C6\uC74C)\uC774 \uC788\uC73C\uBA74 \uD45C \uCD5C\uC18C \uD3ED\uC5D0 \uADF8 \uC5F4\uC758 \uCD5C\uC18C \uD3ED\uC744 \uB123\uB294\uB2E4 \u2014 \uC606 \uC5F4\uC744 \uB113\uD788\uB2E4 0 \uC73C\uB85C \uC811\uD788\uC9C0 \uC54A\uAC8C.\n */\n const computeResizeVars = useCallback(\n (widths: VDTColumnWidths): Record<string, string> => {\n const vars: Record<string, string> = {};\n let changed = false;\n let allFixed = true;\n let minSum = 0;\n let fixedSum = 0;\n columns.forEach((col, index) => {\n const w = widths[String(col.id)];\n if (typeof w === \"number\" && Number.isFinite(w) && w > 0) {\n const cw = Math.max(col.minWidth ?? resizeMinDefault, Math.round(w));\n vars[`--vdt-cw-${index}`] = `${cw}px`;\n changed = true;\n minSum += cw;\n fixedSum += cw;\n } else if (typeof col.width === \"number\") {\n minSum += col.width;\n fixedSum += col.width;\n } else {\n allFixed = false;\n minSum += col.minWidth ?? resizeMinDefault;\n }\n });\n if (changed) {\n vars[\"--vdt-tmin\"] = `${minSum}px`;\n if (allFixed) vars[\"--vdt-tw\"] = `${fixedSum}px`;\n }\n return vars;\n },\n [columns, resizeMinDefault],\n );\n const computeResizeVarsRef = useRef(computeResizeVars);\n computeResizeVarsRef.current = computeResizeVars;\n const resizeVars = useMemo(\n () => (resizeOn ? computeResizeVars(activeWidths) : null),\n [resizeOn, computeResizeVars, activeWidths],\n );\n\n /**\n * \uCE78 \uD3ED style. \uB04C\uC5B4 \uBC14\uAFB8\uAE30\uB97C \uCF1C\uBA74 \uD45C \uC0C1\uC790\uC758 CSS \uBCC0\uC218\uB97C \uBA3C\uC800 \uBCF8\uB2E4 \u2014 \uB044\uB294 \uB3D9\uC548 \uCE78\uC744 \uB2E4\uC2DC \uADF8\uB9AC\uC9C0 \uC54A\uACE0 \uBCC0\uC218 \uD558\uB098\uB85C \uBA38\uB9AC \u00B7 \uBCF8\uBB38 \u00B7 \uD569\uACC4 \uCE78\uC774 \uD568\uAED8 \uBC14\uB010\uB2E4.\n * \uBCC0\uC218\uAC00 \uC5C6\uC73C\uBA74 \uC6D0\uB798 \uD3ED(\uC5C6\uC73C\uBA74 auto)\uC774\uB2E4.\n */\n const colWidthStyle = useCallback(\n (col: DataColumn<T>, index: number, minWidth: string | number | undefined): React.CSSProperties => {\n if (!resizeOn) return { width: col.width, minWidth };\n const name = `--vdt-cw-${index}`;\n const w = cssPx(col.width);\n const m = cssPx(minWidth);\n return {\n width: w !== undefined ? `var(${name}, ${w})` : `var(${name})`,\n minWidth: m !== undefined ? `var(${name}, ${m})` : `var(${name})`,\n };\n },\n [resizeOn],\n );\n\n // \uACE0\uC815 \uC5F4(pinned: \"left\")\uC774 \uBD99\uC744 \uC67C\uCABD \uC790\uB9AC \u2014 \uC55E\uCABD \uACE0\uC815 \uC5F4 \uD3ED\uC758 \uD569. \uACE0\uC815 \uC5F4\uC774 \uC544\uB2C8\uBA74 \uC5C6\uB2E4.\n // \uB04C\uC5B4 \uBC14\uAFB8\uAE30\uB97C \uCF1C\uBA74 \uC55E \uC5F4 \uD3ED\uC774 CSS \uBCC0\uC218\uB77C \uD569\uB3C4 calc \uB85C \uB454\uB2E4.\n const pinnedLeft = useMemo(() => {\n const map = new Map<string, number | string>();\n let left = 0;\n const parts: string[] = [];\n columns.forEach((col, index) => {\n if (col.pinned !== \"left\") return;\n map.set(String(col.id), resizeOn && parts.length > 0 ? `calc(${parts.join(\" + \")})` : left);\n const w = typeof col.width === \"number\" ? col.width : 0;\n left += w;\n parts.push(`var(--vdt-cw-${index}, ${w}px)`);\n });\n return map;\n }, [columns, resizeOn]);\n // \uD45C \uCD5C\uC18C \uD3ED \u2014 minWidth \uB97C \uC900 \uC5F4\uC774 \uC788\uC744 \uB54C\uB9CC. \uC5F4\uB9C8\uB2E4 width(\uC22B\uC790) \uB610\uB294 minWidth \uC758 \uD569\uC774\uACE0, \uD2C0\uC774 \uC881\uC73C\uBA74 \uAC00\uB85C\uB85C \uBBFC\uB2E4.\n const tableMinWidth = useMemo(() => {\n if (!columns.some((col) => typeof col.minWidth === \"number\")) return undefined;\n return columns.reduce(\n (sum, col) =>\n sum + (typeof col.width === \"number\" ? col.width : typeof col.minWidth === \"number\" ? col.minWidth : 0),\n 0,\n );\n }, [columns]);\n /** \uACE0\uC815 \uC5F4 \uCE78\uC758 sticky \uC790\uB9AC. \uBA38\uB9AC \uCE78\uC740 \uBCF8\uBB38 \uACE0\uC815 \uCE78\uBCF4\uB2E4 \uC704(zIndex 3)\uC5D0 \uC120\uB2E4. */\n const pinnedStyle = useCallback(\n (col: DataColumn<T>, head: boolean): React.CSSProperties => {\n const left = pinnedLeft.get(String(col.id));\n if (left === undefined) return {};\n return { position: \"sticky\", left, zIndex: head ? 3 : 1 };\n },\n [pinnedLeft],\n );\n // truthiness \uAC00 \uBC14\uB00C\uBA74(\uD074\uB9AD \uAC00\uB2A5 \uC5EC\uBD80) hover/cursor \uC2A4\uD0C0\uC77C\uC774 \uB2EC\uB77C\uC9C0\uBBC0\uB85C deps \uC5D0\uB294 boolean \uB9CC \uB123\uB294\uB2E4.\n const hasRowClick = !!onRowClick;\n\n // \uC2A4\uD06C\uB864 \uCEE8\uD14C\uC774\uB108 \uCC38\uC870 (OverlayScrollbar\uC6A9)\n const isScrollDraggingRef = useRef(false); // OverlayScrollbar \uB4DC\uB798\uADF8 \uC2A4\uD06C\uB864 \uAC10\uC9C0\uC6A9\n const mouseDownPositionRef = useRef({ x: 0, y: 0 }); // \uB9C8\uC6B0\uC2A4 \uB2E4\uC6B4 \uC2DC\uC791 \uC704\uCE58\n\n useEffect(() => {\n const handleDocumentMouseMove = (event: MouseEvent) => {\n const dx = event.clientX - mouseDownPositionRef.current.x;\n const dy = event.clientY - mouseDownPositionRef.current.y;\n if (Math.sqrt(dx * dx + dy * dy) > ROW_CLICK_DRAG_THRESHOLD_PX) {\n isScrollDraggingRef.current = true;\n }\n };\n\n document.addEventListener(\"mousemove\", handleDocumentMouseMove);\n return () => {\n document.removeEventListener(\"mousemove\", handleDocumentMouseMove);\n };\n }, []);\n\n // \uC815\uB82C\uC774 \uBCC0\uACBD\uB420 \uB54C \uBAA8\uB4E0 TableSortLabel\uC758 hover \uC0C1\uD0DC \uCD08\uAE30\uD654\n useEffect(() => {\n // sortBy\uAC00 \uBCC0\uACBD\uB418\uBA74 \uBAA8\uB4E0 TableSortLabel \uC694\uC18C\uC758 hover \uC0C1\uD0DC\uB97C \uAC15\uC81C\uB85C \uCD08\uAE30\uD654\n const tableContainer = document.querySelector(\n '[data-testid=\"virtuoso-scroller\"]',\n );\n if (tableContainer) {\n const sortLabels = tableContainer.querySelectorAll(\n \".MuiTableSortLabel-root\",\n );\n sortLabels.forEach((label) => {\n // \uB9C8\uC6B0\uC2A4 \uC774\uBCA4\uD2B8\uB97C \uC2DC\uBBAC\uB808\uC774\uC158\uD558\uC5EC hover \uC0C1\uD0DC \uD574\uC81C\n const mouseLeaveEvent = new MouseEvent(\"mouseleave\", {\n bubbles: true,\n cancelable: true,\n });\n label.dispatchEvent(mouseLeaveEvent);\n });\n }\n }, [sortBy]);\n\n // \uC815\uB82C \uD578\uB4E4\uB7EC\n const handleSort = useCallback(\n (columnId: string) => {\n if (!onSort) return;\n\n const newDirection: SortDirection =\n sortBy === columnId && sortDirection === \"asc\" ? \"desc\" : \"asc\";\n\n onSort(columnId, newDirection);\n },\n [onSort, sortBy, sortDirection],\n );\n\n /**\n * \uBA38\uB9AC \uC6B0\uD074\uB9AD \uBA54\uB274(1.4.0). \uC5F4\uC740 \uC694\uC18C\uAC00 \uC544\uB2C8\uB77C id \uB85C \uC954\uB2E4 \u2014 \uAC12\uC744 \uACE0\uB974\uBA74 \uC18C\uBE44\uCC98\uAC00 columns \uB97C \uC0C8\uB85C \uB9CC\uB4E4\uC5B4 \uBA38\uB9AC \uCE78\uC774 \uB2E4\uC2DC \uADF8\uB824\uC9C0\uB294\uB370,\n * \uC694\uC18C\uB97C \uC950\uBA74 \uC61B \uC694\uC18C\uC5D0 \uBD99\uC5B4 \uBA54\uB274\uAC00 \uC5C9\uB6B1\uD55C \uB370\uB85C \uAC00\uAC70\uB098 \uB2EB\uD78C\uB2E4. \uC790\uB9AC\uB3C4 \uC88C\uD45C\uB85C \uB454\uB2E4(\uB204\uB978 x \u00B7 \uBA38\uB9AC \uCE78 \uBC14\uB2E5 y).\n */\n const [headerMenu, setHeaderMenu] = useState<{ colId: string; x: number; y: number } | null>(null);\n const onHeaderContextMenuRef = useRef(onHeaderContextMenu);\n onHeaderContextMenuRef.current = onHeaderContextMenu;\n const onSortRef = useRef(onSort);\n onSortRef.current = onSort;\n\n /**\n * \uBA38\uB9AC \uCE78 \uC6B0\uD074\uB9AD \u2014 \uBE0C\uB77C\uC6B0\uC800 \uBA54\uB274\uB294 \uB298 \uB9C9\uB294\uB2E4(\uBA38\uB9AC\uC5D0\uC11C \"\uB4A4\uB85C \u00B7 \uC0C8\uB85C\uACE0\uCE68\" \uBA54\uB274\uB294 \uC4F8 \uB370\uAC00 \uC5C6\uACE0, \uC815\uB82C \u00B7 \uAC70\uB974\uAE30 \uBA54\uB274\uC640 \uACB9\uCCD0 \uB72C\uB2E4).\n * \uC18C\uBE44\uCC98 \uCC98\uB9AC(headerProps.onContextMenu \u00B7 onHeaderContextMenu)\uAC00 \uBA3C\uC800\uB2E4 \u2014 \uADF8\uCABD\uC774 preventDefault \uD588\uAC70\uB098 true \uB97C \uB3CC\uB824\uC8FC\uBA74 \uAE30\uBCF8 \uBA54\uB274\uB97C \uB744\uC6B0\uC9C0 \uC54A\uB294\uB2E4.\n * \uADF8\uB798\uC11C \uB9C9\uB294 preventDefault \uB294 \uC18C\uBE44\uCC98\uB97C \uBD80\uB978 \uB4A4\uC5D0 \uD55C\uB2E4(\uBA3C\uC800 \uB9C9\uC73C\uBA74 \"\uCC98\uB9AC\uD588\uB2E4\" \uB97C \uAC00\uB824\uB0BC \uC218 \uC5C6\uB2E4).\n */\n const handleHeaderContextMenu = useCallback(\n (col: DataColumn<T> | null, event: React.MouseEvent<HTMLTableCellElement>) => {\n if (!col) {\n event.preventDefault();\n return;\n }\n col.headerProps?.onContextMenu?.(event);\n let handled = event.defaultPrevented;\n if (!handled) handled = onHeaderContextMenuRef.current?.(col, event) === true || event.defaultPrevented;\n event.preventDefault();\n if (handled || col.headerMenu === false) return;\n const canSort = Boolean((col.sortMenu ?? col.sortable) && onSortRef.current);\n if (!canSort && !hasColumnFilter(col)) return;\n const rect = event.currentTarget.getBoundingClientRect();\n setHeaderMenu({ colId: String(col.id), x: event.clientX, y: rect.bottom });\n },\n [],\n );\n\n /**\n * \uC5F4 \uD3ED \uB04C\uAE30 \uC2DC\uC791(1.8.0). \uBA38\uB9AC \uCE78\uC758 \uB04C\uC5B4 \uC62E\uAE30\uAE30(draggable) \u00B7 \uAE00\uC790 \uACE0\uB974\uAE30 \u00B7 \uC815\uB82C \uD074\uB9AD\uC774 \uD568\uAED8 \uC2DC\uC791\uB418\uC9C0 \uC54A\uAC8C \uC5EC\uAE30\uC11C \uB04A\uB294\uB2E4.\n * \uC2DC\uC791 \uD3ED\uC740 \uADF8\uB824\uC9C4 \uCE78 \uD3ED\uC744 \uC7B0\uB2E4 \u2014 \uD3ED\uC744 \uBE44\uC6B4 \uC5F4 \u00B7 % \uC5F4\uB3C4 \uC9C0\uAE08 \uBCF4\uC774\uB294 \uD3ED\uC5D0\uC11C \uC774\uC5B4 \uAC04\uB2E4.\n */\n const handleResizeMouseDown = useCallback(\n (col: DataColumn<T>, event: React.MouseEvent<HTMLElement>) => {\n if (event.button !== 0) return;\n event.preventDefault();\n event.stopPropagation();\n const handle = event.currentTarget;\n const th = handle.closest(\"th\");\n const box = tableBoxRef.current;\n if (!th || !box) return;\n const startWidth = headerCellWidth(th);\n const startX = event.clientX;\n const key = String(col.id);\n const min = col.minWidth ?? resizeMinDefault;\n let base = activeWidthsRef.current;\n // \uB0A8\uB294 \uD3ED\uC744 \uAC16\uB294 \uC5F4(width \uC5C6\uC74C)\uC774 \uC5C6\uB294 \uD45C\uB294 \uBE0C\uB77C\uC6B0\uC800\uAC00 \uB0A8\uB294 \uD3ED\uC744 \uBAA8\uB4E0 \uC5F4\uC5D0 \uB098\uB220 \uADF8\uB9B0\uB2E4. \uD55C \uC5F4\uC744 \uBC14\uAFB8\uBA74 \uD45C\uAC00 \uC5F4 \uD3ED \uD569\uC73C\uB85C \uC11C\uBA74\uC11C\n // \uB2E4\uB978 \uC5F4\uC774 \uBAA8\uB450 \uC120\uC5B8 \uD3ED\uC73C\uB85C \uC6C0\uCC14 \uC904\uC5C8\uB2E4(1.8.1) \u2014 \uADF8\uB798\uC11C \uC9C0\uAE08 \uADF8\uB824\uC9C4 \uD3ED\uC744 \uBAA8\uB4E0 \uC5F4\uC758 \uD3ED\uC73C\uB85C \uBD99\uC7A1\uACE0 \uC2DC\uC791\uD55C\uB2E4.\n const cols = columnsRef.current;\n const hasFlex = cols.some((c) => !(String(c.id) in base) && typeof c.width !== \"number\");\n if (!hasFlex) {\n const snap: VDTColumnWidths = { ...base };\n box.querySelectorAll<HTMLElement>(\"thead th [data-vdt-col]\").forEach((h) => {\n const c = cols[Number(h.getAttribute(\"data-vdt-col\"))];\n const cell = h.closest(\"th\");\n if (!c || !cell || String(c.id) in snap) return;\n snap[String(c.id)] = Math.round(headerCellWidth(cell));\n });\n base = snap;\n }\n let next = base;\n let moved = false;\n let raf = 0;\n handle.setAttribute(\"data-active\", \"\");\n // \uB044\uB294 \uB3D9\uC548 \uC190\uC774 \uCE78 \uBC16\uC73C\uB85C \uB098\uAC00\uB3C4 \uCEE4\uC11C\uAC00 \uBC14\uB00C\uC9C0 \uC54A\uAC8C\n const prevCursor = document.body.style.cursor;\n document.body.style.cursor = \"col-resize\";\n const onMove = (ev: MouseEvent) => {\n const dx = ev.clientX - startX;\n if (!moved && Math.abs(dx) < RESIZE_DRAG_THRESHOLD_PX) return;\n moved = true;\n next = { ...base, [key]: Math.max(min, Math.round(startWidth + dx)) };\n if (!raf) {\n raf = requestAnimationFrame(() => {\n raf = 0;\n applyResizeVars(box, computeResizeVarsRef.current(next));\n });\n }\n };\n const onUp = () => {\n document.removeEventListener(\"mousemove\", onMove);\n document.removeEventListener(\"mouseup\", onUp);\n if (raf) cancelAnimationFrame(raf);\n handle.removeAttribute(\"data-active\");\n document.body.style.cursor = prevCursor;\n if (!moved) return;\n applyResizeVars(box, computeResizeVarsRef.current(next));\n // \uB193\uC740 \uC790\uB9AC\uC758 click \uC774 \uBA38\uB9AC \uCE78(\uC815\uB82C \u00B7 \uC18C\uBE44\uCC98 \uBA38\uB9AC \uD074\uB9AD)\uC73C\uB85C \uAC00\uC9C0 \uC54A\uAC8C \uD55C \uBC88 \uC0BC\uD0A8\uB2E4 \u2014 click \uC740 mouseup \uBC14\uB85C \uB4A4 \uAC19\uC740 \uCC28\uB840\uC5D0 \uC628\uB2E4.\n const swallow = (ce: MouseEvent) => {\n ce.stopPropagation();\n ce.preventDefault();\n };\n window.addEventListener(\"click\", swallow, true);\n window.setTimeout(() => window.removeEventListener(\"click\", swallow, true), 0);\n setLocalWidths(next);\n onColumnWidthsChangeRef.current?.(next);\n };\n document.addEventListener(\"mousemove\", onMove);\n document.addEventListener(\"mouseup\", onUp);\n },\n [resizeMinDefault],\n );\n\n /**\n * \uACBD\uACC4 \uB450 \uBC88 \uB204\uB974\uAE30 \u2014 \uADF8 \uC5F4\uC744 \uCC98\uC74C \uD3ED\uC73C\uB85C. \uBC14\uAFBC \uC801 \uC5C6\uB294 \uC5F4\uC774\uBA74 \uC544\uBB34\uAC83\uB3C4 \uD558\uC9C0 \uC54A\uB294\uB2E4.\n * \uB0A8\uB294 \uD3ED\uC744 \uAC16\uB294 \uC5F4\uC774 \uC5C6\uB294 \uD45C\uB294 \uCCAB \uB04C\uAE30 \uB54C \uBAA8\uB4E0 \uC5F4 \uD3ED\uC744 \uBD99\uC7A1\uC558\uC73C\uBBC0\uB85C(handleResizeMouseDown) \uD0A4\uB9CC \uBE7C\uBA74 \uC120\uC5B8 \uD3ED(\uB298\uC5B4\uB098\uAE30 \uC804)\uC73C\uB85C \uC904\uC5B4\uB4E0\uB2E4 \u2014\n * \uCC98\uC74C \uD654\uBA74\uC5D0\uC11C \uB298\uC5B4\uB098 \uC788\uB358 \uD3ED(\uC120\uC5B8 \uD3ED \u00D7 \uD2C0 \uD3ED / \uC120\uC5B8 \uD3ED \uD569)\uC73C\uB85C \uB418\uB3CC\uB9AC\uACE0, \uBAA8\uB4E0 \uC5F4\uC774 \uADF8 \uD3ED\uC774\uBA74 \uBC14\uAFBC \uD3ED\uC744 \uD1B5\uC9F8\uB85C \uBE44\uC6B4\uB2E4(\uCC98\uC74C \uC0C1\uD0DC).\n */\n const handleResizeDoubleClick = useCallback((col: DataColumn<T>, event: React.MouseEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n const key = String(col.id);\n const base = activeWidthsRef.current;\n if (!(key in base)) return;\n let next: VDTColumnWidths = { ...base };\n delete next[key];\n const cols = columnsRef.current;\n const table = tableBoxRef.current?.querySelector(\"table\");\n const parent = table?.parentElement;\n if (table && parent && cols.every((c) => typeof c.width === \"number\")) {\n const declaredSum = cols.reduce((sum, c) => sum + (c.width as number), 0);\n // \uD45C\uB294 width 100% \uB77C \uBD80\uBAA8 \uD3ED\uC744 \uADF8\uB300\uB85C \uBC1B\uB294\uB2E4(\uC624\uB978\uCABD \uB367\uC5EC\uBC31\uC740 \uD3ED\uC744 \uC904\uC774\uC9C0 \uC54A\uACE0 \uBC14\uAE65\uC73C\uB85C \uBD99\uB294\uB2E4).\n const avail = parent.clientWidth;\n const scale = declaredSum > 0 ? Math.max(1, avail / declaredSum) : 1;\n const initial = (c: DataColumn<T>) => Math.round((c.width as number) * scale);\n if (scale > 1) next[key] = initial(col);\n // \uBAA8\uB450 \uCC98\uC74C \uD3ED\uC774\uBA74 \uBD99\uC7A1\uC740 \uD3ED\uC744 \uB2E4 \uBE44\uC6B4\uB2E4 \u2014 \uC800\uC7A5\uB41C \uAC12 \uC5C6\uC774 \uCC98\uC74C \uADF8\uB300\uB85C \uADF8\uB9AC\uAC8C(\uD2C0 \uD3ED\uC774 \uBC14\uB00C\uBA74 \uB2E4\uC2DC \uB298\uC5B4\uB09C\uB2E4).\n if (cols.every((c) => !(String(c.id) in next) || Math.abs(next[String(c.id)] - initial(c)) <= 1)) next = {};\n }\n setLocalWidths(next);\n onColumnWidthsChangeRef.current?.(next);\n }, []);\n\n /** \uBA38\uB9AC \uCE78 \uC624\uB978\uCABD \uACBD\uACC4\uC758 \uC190\uC7A1\uC774 \u2014 \uBAA8\uC591(\uD638\uBC84 \uB54C \uC587\uC740 \uC120)\uC740 \uD45C \uC0C1\uC790 sx \uC758 [data-vdt-resize] \uAC00 \uC815\uD55C\uB2E4. */\n const renderResizeHandle = useCallback(\n (col: DataColumn<T>) =>\n resizeOn && col.id !== REORDER_COLUMN_ID ? (\n <span\n data-vdt-resize=\"\"\n data-vdt-col={columns.indexOf(col)}\n aria-hidden\n onMouseDown={(e) => handleResizeMouseDown(col, e)}\n onDoubleClick={(e) => handleResizeDoubleClick(col, e)}\n // \uC190\uC7A1\uC774 \uD074\uB9AD\uC774 \uBA38\uB9AC \uCE78 \uD074\uB9AD(\uC18C\uBE44\uCC98 headerProps.onClick)\uC73C\uB85C \uBC88\uC9C0\uC9C0 \uC54A\uAC8C\n onClick={(e) => e.stopPropagation()}\n />\n ) : null,\n [resizeOn, handleResizeMouseDown, handleResizeDoubleClick, columns],\n );\n\n /** \uBA38\uB9AC\uAE00 \u2014 \uAC70\uB97C \uC218 \uC788\uB294 \uC5F4\uC740 \uAC70\uB974\uAE30 \uC544\uC774\uCF58\uC744 \uBD99\uC774\uACE0, \uAC78\uB824 \uC788\uC73C\uBA74 \uAC15\uC870\uC0C9\uC73C\uB85C \uC120\uB2E4(\uAC78\uB9B0 \uC904 \uBAA8\uB974\uACE0 \"\uC65C \uBA87 \uC904 \uC5C6\uC9C0\" \uD558\uC9C0 \uC54A\uAC8C). */\n const renderHeaderText = useCallback(\n (col: DataColumn<T>) => {\n if (!hasColumnFilter(col)) return col.text;\n const active = Boolean(col.filterValues && col.filterValues.length > 0);\n // \uAC70\uB974\uAE30 \uC544\uC774\uCF58\uC740 \uB298 \uBCF4\uC774\uB2C8 \uAE00\uC790\uC640 \uD55C \uBB36\uC74C\uC73C\uB85C \uC120\uB2E4 \u2014 \uAC00\uC6B4\uB370 \uB9DE\uCDA4\uC774\uBA74 \uBB36\uC74C\uC774 \uAC00\uC6B4\uB370(1.10.3, 1.10.1 \uC758 \uBC16\uC5D0 \uB744\uC6B0\uAE30\uB97C \uB418\uB3CC\uB9BC).\n // \uC815\uB82C \uD654\uC0B4\uD45C\uB9CC \uD638\uBC84 \uB54C \uBCF4\uC774\uB294 \uAC83\uC774\uB77C \uBB36\uC74C \uBC16(left: 100%)\uC5D0 \uB72C\uB2E4.\n return (\n <Box\n component=\"span\"\n sx={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 0.5,\n maxWidth: \"100%\",\n color: active ? \"primary.main\" : undefined,\n fontWeight: active ? 600 : undefined,\n verticalAlign: \"middle\",\n }}\n >\n <Box component=\"span\" sx={{ overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\n {col.text}\n </Box>\n <HeaderFilterIcon active={active} />\n </Box>\n );\n },\n [],\n );\n\n // \uC2A4\uD06C\uB864 \uB05D \uADFC\uCC98\uC5D0\uC11C\uB9CC \uCD94\uAC00 \uB85C\uB4DC\uB97C \uC2E4\uD589\uD574 scroll \uD56B\uD328\uC2A4 \uBD80\uB2F4\uC744 \uC904\uC778\uB2E4.\n const handleEndReached = useCallback(\n (endIndex: number) => {\n const rangeStart = perfDebugEnabled ? performance.now() : 0;\n onEndReachedRef.current?.();\n if (!onLoadMore) {\n if (perfDebugEnabled) {\n perfStatsRef.current.rangeChangedCalls += 1;\n perfStatsRef.current.rangeChangedMs +=\n performance.now() - rangeStart;\n }\n return;\n }\n\n if (loading && data.length === 0) {\n if (perfDebugEnabled) {\n perfStatsRef.current.rangeChangedCalls += 1;\n perfStatsRef.current.rangeChangedMs +=\n performance.now() - rangeStart;\n }\n return;\n }\n\n const hasMinimumData = data.length >= 30;\n const nearEnd = endIndex >= data.length - 1;\n\n // \uC9C1\uC804 \uC694\uCCAD \uC774\uD6C4 \uAE38\uC774\uAC00 \uADF8\uB300\uB85C\uBA74(\uC11C\uBC84\uC5D0 \uB354 \uC774\uC0C1 \uB370\uC774\uD130 \uC5C6\uC74C) \uC7AC\uC694\uCCAD\uD558\uC9C0 \uC54A\uB294\uB2E4.\n const alreadyRequestedAtThisLength =\n lastLoadMoreLengthRef.current === data.length;\n\n if (\n nearEnd &&\n hasMinimumData &&\n !isLoadingMoreRef.current &&\n !alreadyRequestedAtThisLength\n ) {\n isLoadingMoreRef.current = true;\n lastLoadMoreLengthRef.current = data.length;\n const offset = data.length;\n const limit = 50;\n onLoadMore(offset, limit);\n }\n\n if (perfDebugEnabled) {\n perfStatsRef.current.rangeChangedCalls += 1;\n perfStatsRef.current.rangeChangedMs +=\n performance.now() - rangeStart;\n }\n },\n [data.length, loading, onLoadMore, perfDebugEnabled],\n );\n\n // \uB85C\uB529 \uC0C1\uD0DC\uAC00 \uBCC0\uACBD\uB418\uBA74 isLoadingMoreRef \uC5C5\uB370\uC774\uD2B8 (\uAE30\uC874 VirtualDataTable \uBC29\uC2DD)\n useEffect(() => {\n if (!loading) {\n isLoadingMoreRef.current = false;\n }\n }, [loading]);\n\n // \uB370\uC774\uD130\uAC00 \uBE44\uC6CC\uC9C0\uBA74 \uD14C\uC774\uBE14\uC744 \uC7AC\uB9C8\uC6B4\uD2B8\uD558\uC5EC \uC2A4\uD06C\uB864\uC744 \uB9E8 \uC704\uB85C \uC774\uB3D9\n useEffect(() => {\n if (data.length === 0) {\n setTableKey((prev) => prev + 1);\n }\n }, [data.length]);\n\n const resetScrollOnDataChangeRef = useRef(resetScrollOnDataChange);\n resetScrollOnDataChangeRef.current = resetScrollOnDataChange;\n // \uC774\uC804 \uB370\uC774\uD130 \uAE38\uC774 / \uCCAB \uD589 \uC2DD\uBCC4\uC790\uB97C \uCD94\uC801\n const prevDataLengthRef = useRef(data.length);\n const prevFirstRowKeyRef = useRef<unknown>(undefined);\n\n // \uB370\uC774\uD130\uAC00 '\uC9C4\uC9DC\uB85C \uAD50\uCCB4'\uB41C \uACBD\uC6B0(\uC815\uB82C/\uD544\uD130/\uC7AC\uC870\uD68C)\uC5D0\uB9CC \uC2A4\uD06C\uB864\uC744 \uB9E8 \uC704\uB85C \uC774\uB3D9\uD55C\uB2E4.\n // \uB2E8\uC21C\uD788 \uAC19\uC740 \uBAA9\uB85D\uC758 \uD56D\uBAA9\uC774 in-place \uB85C \uBC14\uB00C\uC5C8\uC744 \uBFD0(\uCCB4\uD06C\uBC15\uC2A4 \uD1A0\uAE00, \uBB34\uD55C \uC2A4\uD06C\uB864\n // \uBE48 \uACB0\uACFC, \uBD80\uBAA8 \uB9AC\uB80C\uB354\uB85C \uC778\uD55C \uC0C8 \uBC30\uC5F4 \uCC38\uC870 \uB4F1)\uC778\uB370\uB3C4 \uB9E8 \uC704\uB85C \uD280\uB358 \uBB38\uC81C\uB97C \uB9C9\uB294\uB2E4.\n // \u2192 \uCCAB \uD589 \uC2DD\uBCC4\uC790(getRowId)\uC640 \uAE38\uC774\uB85C '\uAD50\uCCB4' \uC5EC\uBD80\uB97C \uD310\uBCC4\uD55C\uB2E4.\n useEffect(() => {\n const prevLength = prevDataLengthRef.current;\n const currentLength = data.length;\n\n // \uCCAB \uD589 \uD0A4: getRowId \uAC00 \uC788\uC73C\uBA74 \uAC12 \uAE30\uBC18(\uCC38\uC870\uAC00 \uB9E4\uBC88 \uBC14\uB00C\uC5B4\uB3C4 \uC548\uC815), \uC5C6\uC73C\uBA74 \uAC1D\uCCB4 \uCC38\uC870.\n const firstRowKey =\n currentLength > 0\n ? getRowIdRef.current\n ? getRowIdRef.current(data[0], 0)\n : (data[0] as unknown)\n : undefined;\n const prevFirstRowKey = prevFirstRowKeyRef.current;\n\n // \uB370\uC774\uD130 \uAE38\uC774\uAC00 \uC99D\uAC00\uD55C \uACBD\uC6B0 (\uBB34\uD55C \uC2A4\uD06C\uB864) - \uC2A4\uD06C\uB864 \uC704\uCE58 \uC720\uC9C0\n if (currentLength > prevLength && prevLength > 0) {\n prevDataLengthRef.current = currentLength;\n prevFirstRowKeyRef.current = firstRowKey;\n return;\n }\n\n // '\uAD50\uCCB4'\uB85C \uD310\uB2E8: \uAE38\uC774\uAC00 \uC904\uC5C8\uAC70\uB098, \uCCAB \uD589 \uC2DD\uBCC4\uC790\uAC00 \uBC14\uB010 \uACBD\uC6B0\uC5D0\uB9CC \uB9E8 \uC704\uB85C.\n // (\uAC19\uC740 \uAE38\uC774 + \uAC19\uC740 \uCCAB \uD589 = in-place \uC5C5\uB370\uC774\uD2B8 \u2192 \uC2A4\uD06C\uB864 \uC720\uC9C0)\n const dataReplaced =\n currentLength < prevLength ||\n (prevLength > 0 && firstRowKey !== prevFirstRowKey);\n\n // \uBAA9\uB85D\uC774 \uAD50\uCCB4(\uC815\uB82C/\uAC80\uC0C9/\uD544\uD130\uB85C 1\uD398\uC774\uC9C0 \uC7AC\uC870\uD68C)\uB418\uBA74 \uB354\uBCF4\uAE30 \uB798\uCE58\uB97C \uD480\uC5B4 \uBB34\uD55C \uC2A4\uD06C\uB864\uC774\n // \uB2E4\uC2DC \uB3D9\uC791\uD558\uAC8C \uD55C\uB2E4. \uB798\uCE58\uB294 \"\uC694\uCCAD\uD55C \uAE38\uC774\uC5D0\uC11C \uC548 \uB298\uBA74 \uC11C\uBC84 \uC18C\uC9C4\"\uC774\uB77C\uB294 \uC804\uC81C\uC778\uB370,\n // \uAD50\uCCB4\uB85C \uAE38\uC774\uAC00 \uC6B0\uC5F0\uD788 \uAC19\uC544\uC9C0\uBA74(\uC608: 100\u219250 \uC774 \uC544\uB2C8\uB77C \uC18C\uC9C4 \uD6C4 \uB2E4\uB978 \uAC80\uC0C9\uC774 50) \uADF8 \uC804\uC81C\uAC00\n // \uAE68\uC838 onLoadMore \uAC00 \uC601\uAD6C\uD788 \uBA48\uCD98\uB2E4. append/\uBE48\uC751\uB2F5\uC740 \uC704 early-return\u00B7\uB3D9\uC77C firstRowKey \uB85C\n // \uAC78\uB7EC\uC9C0\uBBC0\uB85C(=dataReplaced=false) 1.1.29 \uAC00 \uACE0\uCE5C \"\uBC14\uB2E5 \uB5A8\uB9BC\"\uC740 \uB418\uC0B4\uC544\uB098\uC9C0 \uC54A\uB294\uB2E4.\n if (dataReplaced) {\n lastLoadMoreLengthRef.current = -1;\n }\n\n if (virtuosoRef.current && currentLength > 0 && dataReplaced && resetScrollOnDataChangeRef.current) {\n virtuosoRef.current.scrollToIndex({\n index: 0,\n align: \"start\",\n behavior: \"auto\",\n });\n }\n\n prevDataLengthRef.current = currentLength;\n prevFirstRowKeyRef.current = firstRowKey;\n }, [data]);\n\n /**\n * \uD14C\uC774\uBE14 \uACE0\uC815 \uD5E4\uB354 \uCEE8\uD150\uCE20 \uC815\uC758 (\uAE30\uC874 VirtualDataTable \uC2A4\uD0C0\uC77C)\n * \uC815\uB82C \uAE30\uB2A5\uC774 \uD3EC\uD568\uB41C \uCEEC\uB7FC \uD5E4\uB354\uB97C \uB80C\uB354\uB9C1\n */\n const headerRowsContent = useCallback(() => {\n // 1. \uADF8\uB8F9 \uC815\uBCF4 \uCD94\uCD9C\n const groupMap: { [group: string]: DataColumn<T>[] } = {};\n const noGroupColumns: DataColumn<T>[] = [];\n\n columns.forEach((col) => {\n if (col.group) {\n if (!groupMap[col.group]) {\n groupMap[col.group] = [];\n }\n groupMap[col.group].push(col);\n } else {\n noGroupColumns.push(col);\n }\n });\n\n // \uADF8\uB8F9\uC774 \uC788\uB294 \uACBD\uC6B0 2\uC904 \uD5E4\uB354, \uC5C6\uB294 \uACBD\uC6B0 1\uC904 \uD5E4\uB354\n const hasGroups = Object.keys(groupMap).length > 0;\n\n if (!hasGroups) {\n // \uB2E8\uC77C \uD589 \uD5E4\uB354\n return (\n <MuiTableRow>\n {columns.map((col, colIndex) => (\n <TableCell\n key={String(col.id)}\n align={col.align || \"left\"}\n // \uB178\uC158\uD48D \uBA38\uB9AC\uB294 \uD55C \uC904 \uB9D0\uC904\uC784\uC774\uB77C \uAE00\uC790 \uBA38\uB9AC\uB294 \uC804\uCCB4 \uC774\uB984\uC744 \uD234\uD301\uC73C\uB85C \uBCF4\uC778\uB2E4(headerProps.title \uC774 \uC788\uC73C\uBA74 \uADF8\uAC83\uC774 \uC774\uAE34\uB2E4).\n title={typeof col.text === \"string\" ? col.text : undefined}\n {...col.headerProps}\n onContextMenu={(e: React.MouseEvent<HTMLTableCellElement>) => handleHeaderContextMenu(col, e)}\n // \uAE38\uAC8C \uB20C\uB7EC \uC5F4 \uC62E\uAE30\uAE30(1.12.0) \u2014 \uCF1C\uC9C0 \uC54A\uC558\uAC70\uB098 \uC62E\uAE38 \uC218 \uC5C6\uB294 \uC5F4\uC774\uBA74 \uC544\uBB34\uAC83\uB3C4 \uC5B9\uC9C0 \uC54A\uB294\uB2E4\n {...colReorder.headerCellProps(col)}\n style={{\n ...colWidthStyle(col, colIndex, col.width ?? col.minWidth),\n ...col.style,\n fontWeight: \"bold\",\n position: \"sticky\",\n top: 0,\n zIndex: 2,\n padding: \"16px\",\n ...pinnedStyle(col, true),\n ...col.headerProps?.style,\n }}\n >\n {col.sortable ? (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent:\n col.align === \"center\"\n ? \"center\"\n : col.align === \"right\"\n ? \"flex-end\"\n : \"flex-start\",\n position: \"relative\",\n width: \"100%\",\n }}\n >\n <Box\n className=\"vdt-sort-box\"\n data-align={col.align || \"left\"}\n data-filter={hasColumnFilter(col) ? \"1\" : undefined}\n sx={{\n position: \"relative\",\n ...sortPlacement(col.align).box,\n cursor: \"default\",\n \"&:hover .MuiTableSortLabel-root\": {\n opacity: \"1 !important\",\n \"& .MuiSvgIcon-root\": {\n color: \"#000\",\n opacity: \"1 !important\",\n },\n },\n }}\n onClick={() =>\n handleSort(String(col.id))\n }\n >\n {renderHeaderText(col)}\n <TableSortLabel\n active={sortBy === col.id}\n direction={\n sortBy === col.id\n ? sortDirection\n : \"desc\"\n }\n sx={{\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n ...sortPlacement(col.align).label,\n minWidth: \"auto\",\n width: \"16px\",\n height: \"16px\",\n cursor: \"default\",\n opacity:\n sortBy === col.id ? 1 : 0,\n transition: \"opacity 0.2s ease\",\n \"& .MuiTableSortLabel-icon\": {\n position: \"relative\",\n marginLeft: 0,\n marginRight: 0,\n opacity: 1,\n transition:\n \"color 0.2s ease\",\n },\n \"& .MuiTableSortLabel-iconDirectionAsc\":\n {\n transform:\n \"rotate(180deg)\",\n },\n \"& .MuiTableSortLabel-iconDirectionDesc\":\n {\n transform:\n \"rotate(0deg)\",\n },\n }}\n />\n </Box>\n </div>\n ) : (\n renderHeaderText(col)\n )}\n {renderResizeHandle(col)}\n </TableCell>\n ))}\n </MuiTableRow>\n );\n }\n\n // 2\uC904 \uD5E4\uB354 (\uADF8\uB8F9\uC774 \uC788\uB294 \uACBD\uC6B0)\n const firstRowCells = [\n ...noGroupColumns.map((col) => (\n <TableCell\n key={String(col.id)}\n rowSpan={2}\n align={col.align || \"left\"}\n // \uB178\uC158\uD48D \uBA38\uB9AC\uB294 \uD55C \uC904 \uB9D0\uC904\uC784\uC774\uB77C \uAE00\uC790 \uBA38\uB9AC\uB294 \uC804\uCCB4 \uC774\uB984\uC744 \uD234\uD301\uC73C\uB85C \uBCF4\uC778\uB2E4(headerProps.title \uC774 \uC788\uC73C\uBA74 \uADF8\uAC83\uC774 \uC774\uAE34\uB2E4).\n title={typeof col.text === \"string\" ? col.text : undefined}\n {...col.headerProps}\n onContextMenu={(e: React.MouseEvent<HTMLTableCellElement>) => handleHeaderContextMenu(col, e)}\n // \uAE38\uAC8C \uB20C\uB7EC \uC5F4 \uC62E\uAE30\uAE30(1.12.0) \u2014 \uCF1C\uC9C0 \uC54A\uC558\uAC70\uB098 \uC62E\uAE38 \uC218 \uC5C6\uB294 \uC5F4\uC774\uBA74 \uC544\uBB34\uAC83\uB3C4 \uC5B9\uC9C0 \uC54A\uB294\uB2E4\n {...colReorder.headerCellProps(col)}\n style={{\n ...colWidthStyle(col, columns.indexOf(col), col.width),\n ...col.style,\n fontWeight: \"bold\",\n position: \"sticky\",\n top: 0,\n zIndex: 2,\n padding: \"16px\",\n ...pinnedStyle(col, true),\n ...col.headerProps?.style,\n }}\n >\n {col.sortable && onSort ? (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent:\n col.align === \"center\"\n ? \"center\"\n : col.align === \"right\"\n ? \"flex-end\"\n : \"flex-start\",\n position: \"relative\",\n width: \"100%\",\n }}\n >\n <Box\n className=\"vdt-sort-box\"\n data-align={col.align || \"left\"}\n data-filter={hasColumnFilter(col) ? \"1\" : undefined}\n sx={{\n position: \"relative\",\n ...sortPlacement(col.align).box,\n cursor: \"default\",\n \"&:hover .MuiTableSortLabel-root\": {\n opacity: \"1 !important\",\n \"& .MuiSvgIcon-root\": {\n color: \"#000\",\n opacity: \"1 !important\",\n },\n },\n }}\n onClick={() => handleSort(String(col.id))}\n >\n {renderHeaderText(col)}\n <TableSortLabel\n active={sortBy === col.id}\n direction={\n sortBy === col.id\n ? sortDirection\n : \"desc\"\n }\n sx={{\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n ...sortPlacement(col.align).label,\n minWidth: \"auto\",\n width: \"16px\",\n height: \"16px\",\n cursor: \"default\",\n opacity: sortBy === col.id ? 1 : 0,\n transition: \"opacity 0.2s ease\",\n \"&:hover\": {\n opacity: \"1 !important\",\n \"& .MuiSvgIcon-root\": {\n color: \"#000\",\n opacity: \"1 !important\",\n },\n },\n \"& .MuiTableSortLabel-icon\": {\n position: \"relative\",\n marginLeft: 0,\n marginRight: 0,\n opacity: 1,\n transition: \"color 0.2s ease\",\n },\n \"& .MuiTableSortLabel-iconDirectionAsc\":\n {\n transform: \"rotate(180deg)\",\n },\n \"& .MuiTableSortLabel-iconDirectionDesc\":\n {\n transform: \"rotate(0deg)\",\n },\n }}\n />\n </Box>\n </div>\n ) : (\n renderHeaderText(col)\n )}\n {renderResizeHandle(col)}\n </TableCell>\n )),\n ...Object.entries(groupMap).map(([group, cols]) => (\n <TableCell\n key={group}\n align=\"center\"\n colSpan={cols.length}\n onContextMenu={(e: React.MouseEvent<HTMLTableCellElement>) => handleHeaderContextMenu(null, e)}\n style={{\n fontWeight: \"bold\",\n position: \"sticky\",\n top: 0,\n zIndex: 2,\n padding: \"16px\",\n }}\n >\n {group}\n </TableCell>\n )),\n ];\n\n const secondRowCells = [\n ...Object.values(groupMap)\n .flat()\n .map((col) => (\n <TableCell\n key={String(col.id)}\n align={col.align || \"left\"}\n // \uB178\uC158\uD48D \uBA38\uB9AC\uB294 \uD55C \uC904 \uB9D0\uC904\uC784\uC774\uB77C \uAE00\uC790 \uBA38\uB9AC\uB294 \uC804\uCCB4 \uC774\uB984\uC744 \uD234\uD301\uC73C\uB85C \uBCF4\uC778\uB2E4(headerProps.title \uC774 \uC788\uC73C\uBA74 \uADF8\uAC83\uC774 \uC774\uAE34\uB2E4).\n title={typeof col.text === \"string\" ? col.text : undefined}\n {...col.headerProps}\n onContextMenu={(e: React.MouseEvent<HTMLTableCellElement>) => handleHeaderContextMenu(col, e)}\n // \uAE38\uAC8C \uB20C\uB7EC \uC5F4 \uC62E\uAE30\uAE30(1.12.0) \u2014 \uCF1C\uC9C0 \uC54A\uC558\uAC70\uB098 \uC62E\uAE38 \uC218 \uC5C6\uB294 \uC5F4\uC774\uBA74 \uC544\uBB34\uAC83\uB3C4 \uC5B9\uC9C0 \uC54A\uB294\uB2E4\n {...colReorder.headerCellProps(col)}\n style={{\n ...colWidthStyle(col, columns.indexOf(col), col.width),\n ...col.style,\n fontWeight: \"bold\",\n position: \"sticky\",\n top: 0,\n zIndex: 2,\n padding: \"16px\",\n ...pinnedStyle(col, true),\n ...col.headerProps?.style,\n }}\n >\n {col.sortable && onSort ? (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent:\n col.align === \"center\"\n ? \"center\"\n : col.align === \"right\"\n ? \"flex-end\"\n : \"flex-start\",\n position: \"relative\",\n width: \"100%\",\n }}\n >\n <Box\n className=\"vdt-sort-box\"\n data-align={col.align || \"left\"}\n data-filter={hasColumnFilter(col) ? \"1\" : undefined}\n sx={{\n position: \"relative\",\n ...sortPlacement(col.align).box,\n cursor: \"default\",\n \"&:hover .MuiTableSortLabel-root\": {\n opacity: \"1 !important\",\n \"& .MuiSvgIcon-root\": {\n color: \"#000\",\n opacity: \"1 !important\",\n },\n },\n }}\n onClick={() => handleSort(String(col.id))}\n >\n {renderHeaderText(col)}\n <TableSortLabel\n active={sortBy === col.id}\n direction={\n sortBy === col.id\n ? sortDirection\n : \"desc\"\n }\n sx={{\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n ...sortPlacement(col.align).label,\n minWidth: \"auto\",\n width: \"16px\",\n height: \"16px\",\n cursor: \"default\",\n opacity: sortBy === col.id ? 1 : 0,\n transition: \"opacity 0.2s ease\",\n \"&:hover\": {\n opacity: \"1 !important\",\n \"& .MuiSvgIcon-root\": {\n color: \"#000\",\n opacity: \"1 !important\",\n },\n },\n \"& .MuiTableSortLabel-icon\": {\n position: \"relative\",\n marginLeft: 0,\n marginRight: 0,\n opacity: 1,\n transition: \"color 0.2s ease\",\n },\n \"& .MuiTableSortLabel-iconDirectionAsc\":\n {\n transform: \"rotate(0deg)\",\n },\n \"& .MuiTableSortLabel-iconDirectionDesc\":\n {\n transform: \"rotate(180deg)\",\n },\n }}\n />\n </Box>\n </div>\n ) : (\n renderHeaderText(col)\n )}\n {renderResizeHandle(col)}\n </TableCell>\n )),\n ];\n\n return (\n <>\n <MuiTableRow>{firstRowCells}</MuiTableRow>\n <MuiTableRow>{secondRowCells}</MuiTableRow>\n </>\n );\n }, [columns, sortBy, sortDirection, handleSort, onSort, columnHeight, pinnedStyle, handleHeaderContextMenu, renderHeaderText, colWidthStyle, renderResizeHandle, colReorder.headerCellProps]);\n\n /**\n * \uD14C\uC774\uBE14 \uD589 \uCEE8\uD150\uCE20 \uB80C\uB354\uB9C1 \uD568\uC218 (\uAE30\uC874 VirtualDataTable \uC2A4\uD0C0\uC77C)\n * \uAC01 \uB370\uC774\uD130 \uD56D\uBAA9\uC5D0 \uB300\uD55C \uC140 \uB0B4\uC6A9\uC744 \uC815\uC758\n */\n /** \uD3F0 \uBAA9\uB85D\uC758 \uC5F4 \uC790\uB9AC \u2014 \uC5F4\uC758 mobile \uD78C\uD2B8\uB85C \uB098\uB208\uB2E4(\uC5C6\uC73C\uBA74 \uCCAB \uC5F4\uC740 \uC81C\uBAA9, \uB098\uBA38\uC9C0\uB294 \uC815\uBCF4 \uC904) */\n const mobileSlots = useMemo(() => {\n const shown = columns.filter((c) => c.mobile !== false);\n const title = shown.find((c) => c.mobile === \"title\") ?? shown.find((c) => !c.mobile);\n return {\n title,\n thumb: shown.filter((c) => c.mobile === \"thumb\"),\n badge: shown.filter((c) => c.mobile === \"badge\"),\n sub: shown.filter((c) => c.mobile === \"sub\"),\n meta: shown.filter((c) => c !== title && (!c.mobile || c.mobile === \"meta\")),\n };\n }, [columns]);\n\n /** \uD3F0 \uBAA9\uB85D \uCE74\uB4DC \uD55C \uC904 \u2014 [\uC0AC\uC9C4] [\uC81C\uBAA9 \u00B7 \uCE69 / \uC544\uB798 \uD55C \uC904 / \uBA38\uB9AC\uAE00 \uAC12 \uBB36\uC74C] */\n const renderMobileRow = useCallback(\n (item: T, index: number): React.ReactNode => {\n if (mobileConfig?.renderRow) return mobileConfig.renderRow(item, index);\n const cell = (c: DataColumn<T>) => (c.render ? c.render(item, index) : String((item as any)[c.id] ?? \"\"));\n const { title, thumb, badge, sub, meta } = mobileSlots;\n return (\n <Box sx={{ display: \"flex\", gap: \"12px\", alignItems: \"flex-start\", py: \"12px\", px: \"14px\", minWidth: 0 }}>\n {thumb.map((c) => (\n <Box key={String(c.id)} sx={{ flexShrink: 0 }}>\n {cell(c)}\n </Box>\n ))}\n <Box sx={{ flex: 1, minWidth: 0, display: \"flex\", flexDirection: \"column\", gap: \"4px\" }}>\n {(title || badge.length > 0) && (\n <Box sx={{ display: \"flex\", alignItems: \"flex-start\", gap: \"8px\", minWidth: 0 }}>\n <Box sx={{ flex: 1, minWidth: 0, fontSize: 15, fontWeight: 500, overflowWrap: \"anywhere\" }}>\n {title ? cell(title) : null}\n </Box>\n {badge.map((c) => (\n <Box key={String(c.id)} sx={{ flexShrink: 0 }}>\n {cell(c)}\n </Box>\n ))}\n </Box>\n )}\n {sub.map((c) => (\n <Box key={String(c.id)} sx={{ fontSize: 13, color: notionTokens.headerColor, minWidth: 0 }}>\n {cell(c)}\n </Box>\n ))}\n {meta.length > 0 && (\n <Box sx={{ display: \"flex\", flexWrap: \"wrap\", gap: \"2px 12px\", fontSize: 13, minWidth: 0 }}>\n {meta.map((c) => {\n const label = c.mobileLabel === false ? null : (c.mobileLabel ?? (typeof c.text === \"string\" ? c.text : null));\n return (\n <Box key={String(c.id)} sx={{ display: \"inline-flex\", alignItems: \"center\", gap: \"4px\", minWidth: 0, maxWidth: \"100%\" }}>\n {label ? <Box component=\"span\" sx={{ color: notionTokens.headerColor, flexShrink: 0 }}>{label}</Box> : null}\n <Box component=\"span\" sx={{ minWidth: 0, \"& > *\": { width: \"auto !important\", textAlign: \"left !important\" } }}>\n {cell(c)}\n </Box>\n </Box>\n );\n })}\n </Box>\n )}\n </Box>\n </Box>\n );\n },\n [mobileConfig, mobileSlots, notionTokens],\n );\n\n const rowContent = useCallback(\n (index: number, item: T) => {\n const rowStart = perfDebugEnabled ? performance.now() : 0;\n // console.log(\"rowContent \uB80C\uB354\uB9C1:\", { index, item: item ? \"\uC788\uC74C\" : \"\uC5C6\uC74C\" });\n\n if (!item) {\n if (perfDebugEnabled) {\n perfStatsRef.current.rowContentCalls += 1;\n const rowDuration = performance.now() - rowStart;\n perfStatsRef.current.rowContentMs += rowDuration;\n perfStatsRef.current.rowContentMaxMs = Math.max(\n perfStatsRef.current.rowContentMaxMs,\n rowDuration,\n );\n }\n return null;\n }\n\n // \uD3F0 \uBAA9\uB85D \u2014 \uBAA8\uB4E0 \uC5F4\uC744 \uD569\uCE5C \uCE78 \uD558\uB098\uC5D0 \uCE74\uB4DC(\uBA38\uB9AC \uC904\uC774 \uC5C6\uC5B4 \uC5F4 \uD3ED\uC740 \uC758\uBBF8\uAC00 \uC5C6\uB2E4)\n if (mobileList) {\n const card = renderMobileRow(item, index);\n return (\n <TableCell colSpan={columns.length} data-vdt-pad=\"\" sx={{ padding: 0 }}>\n {reorder.on ? (\n // \uB04C\uC5B4 \uC62E\uAE30\uAE30(1.9.0) \u2014 \uCE74\uB4DC \uC67C\uCABD\uC5D0 \uC190\uC7A1\uC774. \uCE74\uB4DC \uC790\uCCB4\uC758 \uC5EC\uBC31\uC740 \uADF8\uB300\uB85C\uB2E4\n <Box sx={{ display: \"flex\", alignItems: \"stretch\", minWidth: 0 }}>\n <Box sx={{ display: \"flex\", alignItems: \"center\", pl: \"6px\", flexShrink: 0 }}>{reorder.renderHandle(item, index)}</Box>\n <Box sx={{ flex: 1, minWidth: 0 }}>{card}</Box>\n </Box>\n ) : (\n card\n )}\n </TableCell>\n );\n }\n\n // \uD55C \uCE78 \uC904(\uBB36\uC74C \uBA38\uB9AC \uB4F1) \u2014 \uBAA8\uB4E0 \uC5F4\uC744 \uD569\uCE5C \uCE78 \uD558\uB098. \uC5EC\uBC31 \u00B7 \uBC14\uD0D5\uC740 fullWidthRowSx \uAC00 \uC815\uD55C\uB2E4.\n const fullWidth = renderFullWidthRow\n ? renderFullWidthRow(item, index)\n : null;\n if (fullWidth !== null && fullWidth !== undefined) {\n return (\n <TableCell\n colSpan={columns.length}\n data-vdt-pad=\"\"\n sx={[\n { padding: notion ? \"0 14px\" : \"8px 16px\" },\n ...(Array.isArray(fullWidthRowSx)\n ? fullWidthRowSx\n : fullWidthRowSx\n ? [fullWidthRowSx]\n : []),\n ]}\n >\n {fullWidth}\n </TableCell>\n );\n }\n\n // \uC624\uB978\uCABD\uC73C\uB85C \uD569\uCE5C \uCE78(colSpan)\uC5D0 \uB36E\uC778 \uC5F4 \uC218 \u2014 \uADF8\uB9CC\uD07C \uB2E4\uC74C \uC5F4\uB4E4\uC758 \uCE78\uC744 \uADF8\uB9AC\uC9C0 \uC54A\uB294\uB2E4.\n let coveredByColSpan = 0;\n const cells = columns.map((column, columnIndex) => {\n if (coveredByColSpan > 0) {\n coveredByColSpan -= 1;\n return null;\n }\n const colSpan = column.colSpan\n ? Math.max(1, Math.min(column.colSpan(item, index), columns.length - columnIndex))\n : 1;\n coveredByColSpan = colSpan - 1;\n const cellStart = perfDebugEnabled ? performance.now() : 0;\n const cellValue = column.render\n ? column.render(item, index)\n : String((item as any)[column.id] || \"\");\n\n if (perfDebugEnabled) {\n const cellDuration = performance.now() - cellStart;\n perfStatsRef.current.cellRenderCalls += 1;\n perfStatsRef.current.cellRenderMs += cellDuration;\n perfStatsRef.current.cellRenderMaxMs = Math.max(\n perfStatsRef.current.cellRenderMaxMs,\n cellDuration,\n );\n }\n\n const pinned = pinnedLeft.has(String(column.id));\n const customPadding = column.cellPadding !== undefined;\n // \uC544\uB798\uB85C \uD569\uCE5C \uCE78\uC5D0 \uB36E\uC778 \uC904\uC740 \uCE78\uC744 \uADF8\uB9AC\uC9C0 \uC54A\uB294\uB2E4.\n const span = column.rowSpan ? column.rowSpan(item, index) : 1;\n if (span <= 0) return null;\n const onCellClick = column.onCellClick;\n return (\n <TableCell\n key={String(column.id)}\n align={column.align || \"left\"}\n rowSpan={span > 1 ? span : undefined}\n colSpan={colSpan > 1 ? colSpan : undefined}\n data-vdt-pad={customPadding ? \"\" : undefined}\n data-vdt-pinned={pinned ? \"\" : undefined}\n data-vdt-cell-click={onCellClick ? \"\" : undefined}\n onClick={\n onCellClick\n ? (e: React.MouseEvent) => {\n // \uB04C\uC5B4\uC11C \uBBFC \uB4A4\uC758 \uD074\uB9AD\uC740 \uCE78 \uB204\uB984\uC73C\uB85C \uCE58\uC9C0 \uC54A\uB294\uB2E4(\uC904 \uD074\uB9AD\uACFC \uAC19\uC740 \uAE30\uC900).\n const dx = e.clientX - mouseDownPositionRef.current.x;\n const dy = e.clientY - mouseDownPositionRef.current.y;\n e.stopPropagation();\n if (Math.sqrt(dx * dx + dy * dy) > ROW_CLICK_DRAG_THRESHOLD_PX) return;\n onCellClick(item, index, e);\n }\n : undefined\n }\n style={{\n // \uD569\uCE5C \uCE78\uC740 \uD3ED\uC744 \uBC15\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uC5F4 \uD3ED\uC740 \uBA38\uB9AC \uC904\uC774 \uC815\uD558\uACE0, \uBC15\uC73C\uBA74 \uD569\uCE5C \uD3ED\uC774 \uD55C \uC5F4 \uD3ED\uC73C\uB85C \uC904\uC5B4\uB4E0\uB2E4.\n ...(colSpan > 1 ? {} : colWidthStyle(column, columnIndex, column.width ?? column.minWidth)),\n ...(column.primary ? { fontSize: 15 } : {}),\n ...column.style,\n ...(column.cellStyle ? column.cellStyle(item, index) : {}),\n padding: customPadding ? column.cellPadding : \"8px 16px\",\n ...pinnedStyle(column, false),\n }}\n >\n {cellValue}\n </TableCell>\n );\n });\n\n if (perfDebugEnabled) {\n perfStatsRef.current.rowContentCalls += 1;\n const rowDuration = performance.now() - rowStart;\n perfStatsRef.current.rowContentMs += rowDuration;\n perfStatsRef.current.rowContentMaxMs = Math.max(\n perfStatsRef.current.rowContentMaxMs,\n rowDuration,\n );\n }\n\n return <>{cells}</>;\n },\n [columns, perfDebugEnabled, renderFullWidthRow, fullWidthRowSx, notion, pinnedLeft, pinnedStyle, mobileList, renderMobileRow, colWidthStyle, reorder.on, reorder.renderHandle],\n );\n\n /**\n * \uBA38\uB9AC \uB0B4\uC6A9 = \uBA38\uB9AC \uC904 + (\uC788\uC73C\uBA74) \uACE0\uC815 \uC904 \uC601\uC5ED. \uACE0\uC815 \uC904\uC740 \uBA38\uB9AC(thead)\uC640 \uD568\uAED8 \uC704\uC5D0 \uBD99\uC5B4 \uBCF8\uBB38 \uC2A4\uD06C\uB864\uACFC \uBB34\uAD00\uD558\uAC8C \uBCF4\uC778\uB2E4.\n * \uBA38\uB9AC \uC548\uC5D0 \uBCF8\uBB38 \uCE78\uC744 \uADF8\uB9AC\uB824\uBA74 \uD55C \uCE78(colSpan \uC804\uCCB4) \uC548\uC5D0 \uAC19\uC740 \uC5F4 \uAD6C\uC131\uC758 \uD45C\uB97C \uD558\uB098 \uB354 \uB454\uB2E4 \u2014 \uC5F4 \uD3ED\uC740 colgroup \uC73C\uB85C \uBC14\uAE65 \uD45C\uC640 \uB9DE\uCD94\uACE0\n * (\uCCAB \uC904\uC774 \uBB36\uC74C \uB760 \uC904\uC774\uBA74 \uADF8 \uC904\uB85C\uB294 \uC5F4 \uD3ED\uC744 \uBABB \uC815\uD55C\uB2E4), \uAC00\uB85C\uB85C \uBC00\uBA74 \uBC14\uAE65 \uD45C\uC640 \uD568\uAED8 \uC6C0\uC9C1\uC778\uB2E4.\n * \uC548\uCABD tbody \uB97C MUI TableBody \uB85C \uAC10\uC2F8\uC57C \uCE78\uC774 \uBA38\uB9AC \uCE78(th)\uC774 \uC544\uB2C8\uB77C \uBCF8\uBB38 \uCE78(td)\uC73C\uB85C \uADF8\uB824\uC9C4\uB2E4.\n */\n const fixedHeaderContent = useCallback(() => {\n const headerRows = headerRowsContent();\n if (!pinnedRows || pinnedRows.length === 0) return headerRows;\n const RowComponent = rowComponentRef.current;\n return (\n <>\n {headerRows}\n <tr data-vdt-pinned-area=\"\">\n <td colSpan={columns.length} style={{ padding: 0, border: 0 }}>\n <Box\n data-vdt-inner-scroll=\"\"\n sx={[\n {\n maxHeight: pinnedRowsMaxHeight,\n overflowY: pinnedRowsMaxHeight ? \"auto\" : \"visible\",\n overflowX: \"hidden\",\n scrollbarWidth: \"thin\",\n borderBottom: `1px solid ${notion ? notionTokens.borderStrong : \"rgba(224, 224, 224, 1)\"}`,\n // \uC601\uC5ED \uC544\uB7AB\uC120\uC774 \uACBD\uACC4\uB97C \uB9E1\uB294\uB2E4 \u2014 \uB9C8\uC9C0\uB9C9 \uC904 \uC544\uB798\uC120\uAE4C\uC9C0 \uADF8\uC73C\uBA74 \uC774\uC911\uC120\uC774\uB2E4.\n \"& tbody tr:last-of-type > td\": { borderBottom: \"none\" },\n },\n ...(Array.isArray(pinnedRowsSx) ? pinnedRowsSx : pinnedRowsSx ? [pinnedRowsSx] : []),\n ]}\n >\n <table\n style={{\n width: \"100%\",\n tableLayout,\n borderCollapse: \"separate\",\n borderSpacing: 0,\n }}\n >\n <colgroup>\n {columns.map((col, colIndex) => (\n <col key={String(col.id)} style={colWidthStyle(col, colIndex, col.width ?? col.minWidth)} />\n ))}\n </colgroup>\n <MuiTableBody>\n {pinnedRows.map((item, index) =>\n RowComponent ? (\n <RowComponent\n key={getRowId ? String(getRowId(item, index)) : `p${index}`}\n item={item}\n data-index={index}\n data-vdt-pinned-row=\"\"\n >\n {rowContent(index, item)}\n </RowComponent>\n ) : null,\n )}\n </MuiTableBody>\n </table>\n </Box>\n </td>\n </tr>\n </>\n );\n }, [headerRowsContent, pinnedRows, pinnedRowsMaxHeight, pinnedRowsSx, columns, rowContent, tableLayout, getRowId, notion, notionTokens, colWidthStyle]);\n\n // \uCEEC\uB7FC\uC5D0 footer \uB80C\uB354\uB7EC\uAC00 \uD558\uB098\uB77C\uB3C4 \uC788\uAC70\uB098 showFooter \uAC00 \uBA85\uC2DC\uB418\uBA74 \uD558\uB2E8 \uD569\uACC4 \uD589\uC744 \uD45C\uC2DC\uD55C\uB2E4.\n const hasFooter =\n showFooter ?? columns.some((col) => typeof col.footer === \"function\");\n\n /**\n * \uD14C\uC774\uBE14 \uD558\uB2E8 \uACE0\uC815 \uD569\uACC4 \uD589(tfoot) \uCEE8\uD150\uCE20 \uC815\uC758\n * \uAC01 \uCEEC\uB7FC\uC758 footer(data) \uACB0\uACFC\uB97C \uC140\uB85C \uB80C\uB354\uB9C1\uD55C\uB2E4. (footer \uC5C6\uB294 \uCEEC\uB7FC\uC740 \uBE48 \uC140)\n * tableLayout: fixed \uB77C \uD5E4\uB354/\uBC14\uB514\uC640 \uB3D9\uC77C\uD55C \uCEEC\uB7FC \uB108\uBE44\uB85C \uC790\uB3D9 \uC815\uB82C\uB41C\uB2E4.\n */\n const fixedFooterContent = useCallback(() => {\n if (!hasFooter) {\n return null;\n }\n\n // footerColSpan \uC73C\uB85C \uC140\uC744 \uBCD1\uD569\uD55C\uB2E4. \uC55E \uCEEC\uB7FC\uC774 colSpan \uC73C\uB85C \uB36E\uC740 \uCEEC\uB7FC\uC740 \uC140\uC744 \uC0DD\uB7B5\uD55C\uB2E4.\n const cells: React.ReactNode[] = [];\n for (let i = 0; i < columns.length; i += 1) {\n const col = columns[i];\n const colSpan =\n col.footerColSpan && col.footerColSpan > 1\n ? Math.min(col.footerColSpan, columns.length - i)\n : 1;\n\n cells.push(\n <TableCell\n key={String(col.id)}\n align={col.align || \"left\"}\n colSpan={colSpan > 1 ? colSpan : undefined}\n style={{\n // \uBCD1\uD569 \uC2DC \uB108\uBE44 \uACE0\uC815\uC744 \uD480\uC5B4 colSpan \uC774 \uC2E4\uC81C\uB85C \uB298\uC5B4\uB098\uAC8C \uD55C\uB2E4.\n ...(colSpan > 1\n ? {}\n : colWidthStyle(col, i, col.width)),\n ...col.style,\n fontWeight: \"bold\",\n // \uB178\uC158\uD48D\uC740 \uBCF8\uBB38 \uCE78\uACFC \uAC19\uC740 \uC88C\uC6B0 \uC5EC\uBC31 \u00B7 \uC138\uB85C 0(\uC904 \uB192\uC774\uB85C \uAC00\uC6B4\uB370) \u2014 16px \uC774\uBA74 \uD569\uACC4 \uC904\uB9CC \uB192\uACE0 \uAE00\uC790\uAC00 \uCE78\uACFC \uC5B4\uAE0B\uB0AC\uB2E4.\n padding: notion ? \"0 14px\" : \"16px\",\n }}\n >\n {col.footer ? col.footer(data) : null}\n </TableCell>,\n );\n\n // colSpan \uC73C\uB85C \uB36E\uC778 \uB4A4 \uCEEC\uB7FC\uC740 \uAC74\uB108\uB6F4\uB2E4.\n i += colSpan - 1;\n }\n\n return <MuiTableRow>{cells}</MuiTableRow>;\n }, [hasFooter, columns, data, notion, colWidthStyle]);\n\n // \uD14C\uC774\uBE14 \uCEF4\uD3EC\uB10C\uD2B8 \uC815\uC758 (\uAE30\uC874 VirtualDataTable \uC2A4\uD0C0\uC77C)\n const VirtuosoTableComponents: TableComponents<T> = useMemo(\n () => ({\n // \uC2A4\uD06C\uB864 \uCEE8\uD14C\uC774\uB108 (\uC678\uBD80\uC5D0\uC11C \uD55C \uBC88\uB9CC \uC0DD\uC131\uB41C \uC548\uC815\uC801\uC778 \uCEF4\uD3EC\uB10C\uD2B8 \uC0AC\uC6A9)\n // \uBC14\uAE65 \uC2A4\uD06C\uB864\uC774\uBA74 \uC790\uAE30 \uC2A4\uD06C\uB864 \uC0C1\uC790(OverlayScrollbar) \uC5C6\uC774 \uD3C9\uBC94\uD55C \uC0C1\uC790 \u2014 \uAD74\uB9AC\uB294 \uAC83\uC740 \uBC14\uAE65\uC774\uB2E4\n Scroller: external ? PlainScroller : VirtuosoScroller,\n // \uD14C\uC774\uBE14 \uCEF4\uD3EC\uB10C\uD2B8\n Table: (props) => (\n <Table\n {...props}\n sx={{\n borderCollapse: \"separate\",\n tableLayout,\n // \uD3F0 \uBAA9\uB85D\uC740 \uCE78 \uD558\uB098\uB77C \uC5F4 \uD3ED \uD569(\uCD5C\uC18C \uD3ED)\uC744 \uB450\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uB450\uBA74 \uD654\uBA74 \uBC16\uC73C\uB85C \uBC00\uB9B0\uB2E4\n // \uB04C\uC5B4 \uBC14\uAFB8\uAE30\uB97C \uCF1C\uBA74 \uD45C \uD3ED \u00B7 \uCD5C\uC18C \uD3ED\uB3C4 \uD45C \uC0C1\uC790\uC758 CSS \uBCC0\uC218\uB97C \uBCF8\uB2E4(\uB044\uB294 \uB3D9\uC548 \uBD80\uD488\uC744 \uB2E4\uC2DC \uB9CC\uB4E4\uC9C0 \uC54A\uAC8C).\n ...(resizeOn\n ? { width: \"var(--vdt-tw, 100%)\", minWidth: `var(--vdt-tmin, ${tableMinWidth ?? 0}px)` }\n : tableMinWidth && !mobileList\n ? { minWidth: tableMinWidth }\n : {}),\n // \uD2C0 \uC5C6\uC774 \uADF8\uB9B4 \uB54C\uB294 \uC624\uB978\uCABD \uB367\uC5EC\uBC31\uC774 \uAC00\uB85C \uB118\uCE68(\uAC00\uB85C \uB9C9\uB300)\uC744 \uB9CC\uB4E0\uB2E4 \u2014 \uD45C\uAC00 \uC0C1\uC790 \uD3ED\uC5D0 \uAF2D \uB9DE\uAC8C \uB454\uB2E4.\n marginRight: framed ? \"16px\" : 0,\n // \uD558\uB2E8 \uD569\uACC4 \uD589\uC774 \uC788\uC73C\uBA74 \uB370\uC774\uD130\uAC00 \uC801\uC5B4\uB3C4 \uD14C\uC774\uBE14\uC774 \uCEE8\uD14C\uC774\uB108\uB97C \uCC44\uC6B0\uAC8C \uD55C\uB2E4.\n // (\uC2E4\uC81C \uBC14\uB2E5 \uC815\uB82C\uC740 tbody \uAC00 \uB298\uC5B4\uB098\uBA70 \uCC98\uB9AC \u2014 \uD589 \uB192\uC774\uB294 \uADF8\uB300\uB85C \uC720\uC9C0)\n ...(hasFooter ? { height: \"100%\" } : {}),\n }}\n />\n ),\n // \uD14C\uC774\uBE14 \uD5E4\uB354 (\uACE0\uC815 \uC704\uCE58)\n TableHead: forwardRef<HTMLTableSectionElement, any>(\n (props, ref) => (\n <TableHead\n {...props}\n ref={ref}\n sx={{\n userSelect: \"none\",\n // \uBC14\uB85C \uC544\uB798 \uC904(\uBA38\uB9AC \uC904)\uB9CC \u2014 \uBA38\uB9AC \uC548 \uACE0\uC815 \uC904 \uC601\uC5ED(pinnedRows)\uC758 \uC904\uAE4C\uC9C0 \uBA38\uB9AC \uB192\uC774 \u00B7 \uAD75\uAE30\uB97C \uBC1B\uC73C\uBA74 \uC548 \uB41C\uB2E4.\n \"& > tr\": {\n height: columnHeight,\n \"& > th\": {\n padding: \"16px\",\n position: \"sticky\",\n top: 0,\n zIndex: 2,\n fontWeight: \"bold\",\n },\n },\n }}\n />\n ),\n ),\n // \uD14C\uC774\uBE14 \uD589 (\uD074\uB9AD \uC774\uBCA4\uD2B8 \uBC0F \uD638\uBC84 \uD6A8\uACFC \uD3EC\uD568)\n // \uD14C\uC774\uBE14 \uD589 (\uD074\uB9AD \uC774\uBCA4\uD2B8 \uBC0F \uD638\uBC84 \uD6A8\uACFC \uD3EC\uD568)\n TableRow: (props: any) => {\n const {\n item,\n selected: _selected,\n \"aria-selected\": _ariaSelected,\n className,\n ...rest\n } = props as any;\n // react-virtuoso\uB294 'data-index' \uC18D\uC131\uC73C\uB85C index\uB97C \uC804\uB2EC\uD569\uB2C8\uB2E4\n const rowIndex = rest[\"data-index\"] ?? 0;\n const isOddRow = rowIndex % 2 === 1;\n const rowId =\n item && getRowIdRef.current\n ? getRowIdRef.current(item, rowIndex)\n : rowIndex;\n // CSS \uD558\uC774\uB77C\uC774\uD2B8 \uBAA8\uB4DC\uC5D0\uC11C\uB294 \uD589 \uC790\uCCB4\uC5D0\uC11C \uC120\uD0DD\uC744 \uACC4\uC0B0\uD558\uC9C0 \uC54A\uB294\uB2E4(\uCEE8\uD14C\uC774\uB108 CSS \uAC00 \uCC98\uB9AC).\n // \u2192 selectedRowId \uBCC0\uACBD\uC774 \uD589 \uC7AC\uB80C\uB354\uB85C \uC774\uC5B4\uC9C0\uC9C0 \uC54A\uB294\uB2E4.\n const isSelected =\n !useCssRowHighlight &&\n selectedRowId !== null &&\n selectedRowId !== undefined &&\n rowId === selectedRowId;\n const resolvedSelectedRowSx =\n isSelected && selectedRowSx\n ? typeof selectedRowSx === \"function\"\n ? selectedRowSx(item, rowIndex)\n : selectedRowSx\n : undefined;\n const sanitizedClassName = String(className ?? \"\")\n .split(/\\s+/)\n .filter(\n (token) =>\n token !== \"Mui-selected\" &&\n token !== \"Mui-focusVisible\",\n )\n .join(\" \");\n\n return (\n <MuiTableRow\n {...rest}\n data-row-id={rowId !== null && rowId !== undefined ? String(rowId) : undefined}\n className={sanitizedClassName || undefined}\n selected={isSelected}\n onMouseDown={(e: any) => {\n // \uB9C8\uC6B0\uC2A4 \uB2E4\uC6B4 \uC2DC \uB4DC\uB798\uADF8 \uD50C\uB798\uADF8 \uCD08\uAE30\uD654 \uBC0F \uC2DC\uC791 \uC704\uCE58 \uC800\uC7A5\n isScrollDraggingRef.current = false;\n mouseDownPositionRef.current = {\n x: e.clientX,\n y: e.clientY,\n };\n }}\n onContextMenu={(e: React.MouseEvent) => {\n if (item && onRowContextMenuRef.current) {\n onRowContextMenuRef.current(item, rowIndex, e);\n }\n }}\n onClick={(e: React.MouseEvent) => {\n // mousedown \uC2DC\uC791 \uC704\uCE58\uC640 click \uC704\uCE58 \uCC28\uC774\uB85C \uB4DC\uB798\uADF8 \uC5EC\uBD80 \uD310\uBCC4\n const dx =\n e.clientX - mouseDownPositionRef.current.x;\n const dy =\n e.clientY - mouseDownPositionRef.current.y;\n const wasDrag =\n Math.sqrt(dx * dx + dy * dy) >\n ROW_CLICK_DRAG_THRESHOLD_PX ||\n isScrollDraggingRef.current;\n if (wasDrag) {\n e.preventDefault();\n e.stopPropagation();\n isScrollDraggingRef.current = false;\n return;\n }\n if (item && onRowClickRef.current) {\n onRowClickRef.current(item, rowIndex);\n }\n isScrollDraggingRef.current = false;\n }}\n sx={[\n {\n userSelect: \"none\",\n // \uD589 \uB192\uC774\uB97C estimatedItemHeight(=rowHeight + divider) \uB85C \uC815\uD655\uD788\n // \uACE0\uC815\uD55C\uB2E4. react-virtuoso \uB294 fixedItemHeight \uB97C \uC918\uB3C4\n // ResizeObserver \uB85C \uC2E4\uC81C \uD589 \uB192\uC774\uB97C \uC7AC\uCE21\uC815\uD574 \uBC18\uC601\uD558\uB294\uB370, \uC140\n // \uD3F0\uD2B8/\uB77C\uC778\uC758 \uC11C\uBE0C\uD53D\uC140 \uB54C\uBB38\uC5D0 \uCE21\uC815\uAC12\uC774 \uC815\uC218\uC5D0\uC11C \uC5B4\uAE0B\uB098\uBA74\n // \uD558\uB2E8 filler row \uB192\uC774(offsetBottom)\uAC00 \uC2A4\uD06C\uB864\uB9C8\uB2E4 \uC18C\uC218\uC810\uC73C\uB85C\n // \uD754\uB4E4\uB9AC\uACE0, \uADF8 \uC704\uC5D0 sticky \uB85C \uBD99\uC740 <tfoot> \uD569\uACC4\uD589\uC774 1px \uB5A8\uB9B0\uB2E4.\n // height/maxHeight \uB97C \uC815\uC218\uB85C \uBC15\uACE0 overflow:hidden \uC73C\uB85C \uB9C9\uC544\n // \uCE21\uC815\uAC12\uC774 \uD56D\uC0C1 estimatedItemHeight \uAC00 \uB418\uAC8C \uD55C\uB2E4.\n // \uC904 \uB192\uC774 \"auto\" \uB294 \uB0B4\uC6A9\uB9CC\uD07C \uB298\uC5B4\uB09C\uB2E4 \u2014 \uCE78 \uB192\uC774(rowHeight)\uAC00 \uCD5C\uC18C \uB192\uC774\uB85C \uB3D9\uC791\uD55C\uB2E4.\n ...(autoRowHeight\n ? { \"& > td\": { height: estimatedItemHeight } }\n : {\n height: estimatedItemHeight,\n maxHeight: estimatedItemHeight,\n }),\n boxSizing: \"border-box\",\n backgroundColor:\n isOddRow && stripedRowColor\n ? stripedRowColor\n : \"transparent\",\n // \uC5EC\uBC31\uC744 \uB530\uB85C \uBC1B\uC740 \uCE78(cellPadding \u00B7 \uD55C \uCE78 \uC904)\uC740 \uAE30\uBCF8 \uC5EC\uBC31\uC5D0\uC11C \uBE80\uB2E4.\n \"& td:not([data-vdt-pad])\": {\n padding: \"8px 16px\",\n },\n \"& td\": {\n boxSizing: \"border-box\",\n borderBottom: rowDivider\n ? \"1px solid rgba(224, 224, 224, 1)\"\n : \"none\",\n },\n \"& th\": {\n padding: \"8px 16px\",\n borderBottom: \"none\",\n },\n \"&:hover\":\n hasRowClick && !isSelected\n ? {\n backgroundColor: (theme) => {\n const isDark =\n theme.palette.mode ===\n \"dark\";\n const defaultColor =\n \"#000000\";\n const color =\n rowHoverColor ??\n defaultColor;\n const opacity =\n rowHoverOpacity ?? 0.06;\n\n if (!rowHoverColor) {\n return isDark\n ? `rgba(255, 255, 255, ${opacity})`\n : `rgba(0, 0, 0, ${opacity})`;\n }\n\n const hex = color\n .replace(\"#\", \"\")\n .trim();\n if (hex.length !== 6) {\n return color;\n }\n\n const r = parseInt(\n hex.substring(0, 2),\n 16,\n );\n const g = parseInt(\n hex.substring(2, 4),\n 16,\n );\n const b = parseInt(\n hex.substring(4, 6),\n 16,\n );\n\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n },\n }\n : undefined,\n cursor: hasRowClick ? \"pointer\" : undefined,\n },\n resolvedSelectedRowSx,\n ]}\n />\n );\n },\n // \uD14C\uC774\uBE14 \uBC14\uB514 \u2014 \uD558\uB2E8 \uD569\uACC4 \uD589\uC774 \uC788\uC73C\uBA74 row-group \uC744 \uB298\uB824 \uBE48 \uACF5\uAC04\uC774 \uB9C8\uC9C0\uB9C9 \uD589 '\uC544\uB798'\uB85C \uAC00\uAC8C \uD55C\uB2E4.\n // (\uAC1C\uBCC4 \uD589 \uB192\uC774\uB294 \uADF8\uB300\uB85C \uC720\uC9C0\uB418\uACE0, tfoot \uC740 \uADF8 \uC544\uB798 \uBC14\uB2E5\uC5D0 \uBD99\uB294\uB2E4)\n TableBody: forwardRef<HTMLTableSectionElement>((props, ref) => {\n const { children, ...rest } =\n props as React.HTMLAttributes<HTMLTableSectionElement>;\n return (\n <MuiTableBody\n {...rest}\n ref={ref}\n sx={hasFooter ? { height: \"100%\" } : undefined}\n >\n {children}\n {/* fill \uBAA8\uB4DC(hasFooter)\uC5D0\uC11C table/tbody \uC758 height:100% \uB54C\uBB38\uC5D0 \uB0A8\uB294 \uB192\uC774\uAC00\n \uB370\uC774\uD130 <tr> \uC5D0 \uBD84\uBC30\uB418\uC5B4 \uD589\uC774 rowHeight \uBCF4\uB2E4 \uCEE4\uC9C0\uB294 \uBB38\uC81C\uB97C \uB9C9\uB294 spacer.\n \uC720\uC5F0\uD55C \uBE48 \uD589\uC774 \uB0A8\uB294 \uACF5\uAC04\uC744 \uD761\uC218 \u2192 \uB370\uC774\uD130 \uD589\uC740 rowHeight \uB85C \uACE0\uC815\uB418\uACE0,\n sticky footer \uB294 \uADF8 \uC544\uB798 \uBC14\uB2E5\uC5D0 \uBD99\uB294\uB2E4. \uC2A4\uD06C\uB864\uC774 \uC0DD\uAE30\uBA74 0 \uC73C\uB85C \uC811\uD78C\uB2E4. */}\n {hasFooter && (\n <tr aria-hidden style={{ height: \"100%\" }}>\n <td\n colSpan={columns.length}\n style={{ padding: 0, border: 0 }}\n />\n </tr>\n )}\n </MuiTableBody>\n );\n }),\n // \uD14C\uC774\uBE14 \uD558\uB2E8 \uD569\uACC4 \uD589(tfoot) \u2014 \uBC14\uB2E5\uC5D0 \uACE0\uC815\n TableFoot: forwardRef<HTMLTableSectionElement, any>(\n (props, ref) => (\n <MuiTableFooter\n {...props}\n ref={ref}\n sx={[\n {\n // \uB5A8\uB9BC\uC758 \uADFC\uBCF8 \uC6D0\uC778(\uB370\uC774\uD130 \uD589 \uCE21\uC815 \uB192\uC774\uC758 \uC11C\uBE0C\uD53D\uC140)\uC740 TableRow\n // \uC5D0\uC11C height/maxHeight \uC815\uC218 \uACE0\uC815\uC73C\uB85C \uC7A1\uB294\uB2E4. \uC5EC\uAE30\uC11C\uB294 \uD569\uACC4\uD589\n // \uC140 \uC2A4\uD0C0\uC77C\uB9CC \uB454\uB2E4(virtuoso \uAC00 <tfoot> \uC5D0 \uC9C1\uC811 sticky \uB97C \uAC74\uB2E4).\n // \uD569\uACC4\uD589 \uB192\uC774\uB97C footerHeight(\uBBF8\uC9C0\uC815 \uC2DC rowHeight) \uB85C \uC815\uD655\uD788\n // \uACE0\uC815\uD55C\uB2E4. \uADF8\uB798\uC57C \uB85C\uB529 \uC624\uBC84\uB808\uC774\uC758 \uD558\uB2E8 \uCEF7\uC624\uD504(bottom:\n // footerHeight ?? rowHeight)\uC640 \uC2E4\uC81C footer \uB192\uC774\uAC00 \uC77C\uCE58\uD574\n // \uC624\uBC84\uB808\uC774\uAC00 footer \uC704\uAE4C\uC9C0\uB9CC \uB0B4\uB824\uC624\uACE0 footer \uB97C \uB36E\uC9C0 \uC54A\uB294\uB2E4.\n \"& tr\": {\n height: footerHeight ?? rowHeight,\n maxHeight: footerHeight ?? rowHeight,\n boxSizing: \"border-box\",\n },\n \"& td\": {\n height: footerHeight ?? rowHeight,\n boxSizing: \"border-box\",\n backgroundColor: (theme) =>\n theme.palette.mode === \"dark\"\n ? \"#1e1e1e\"\n : \"#ffffff\",\n // \uC138\uB85C padding \uC744 0 \uC73C\uB85C \uB450\uACE0 \uD589 \uB192\uC774\uB85C \uC815\uB82C\uC744 \uB9E1\uAE34\uB2E4.\n // (\uAC00\uB85C 16px \uC720\uC9C0) \u2014 16px \uC138\uB85C padding \uC774\uBA74 \uC2E4\uC81C footer \uAC00\n // footerHeight \uBCF4\uB2E4 \uCEE4\uC838 \uC624\uBC84\uB808\uC774 \uCEF7\uC624\uD504\uC640 \uC5B4\uAE0B\uB09C\uB2E4.\n padding: \"0 16px\",\n color: \"inherit\",\n fontSize: \"0.875rem\",\n // \uAD6C\uBD84\uC120\uC740 \uC2E4\uC81C border \uB300\uC2E0 inset box-shadow \uB85C \uADF8\uB9B0\uB2E4.\n // collapsed-border \uD53D\uC140 \uACBD\uACC4 \uACF5\uC720\uB85C \uC778\uD55C \uAE5C\uBE61\uC784\uC744 \uD53C\uD55C\uB2E4.\n border: \"none\",\n // \uB178\uC158\uD48D\uC740 \uBA38\uB9AC \uC544\uB798 \uC120\uACFC \uAC19\uC740 \uC9C4\uD55C \uD68C\uC0C9 \uC120 \u2014 \uAC80\uC740 \uC120\uC740 \uC605\uC740 \uD45C\uC5D0\uC11C \uD63C\uC790 \uD280\uC5C8\uB2E4.\n boxShadow: `inset 0 1px 0 0 ${notion ? notionTokens.borderStrong : \"#000000\"}`,\n },\n },\n ...(Array.isArray(footerSx)\n ? footerSx\n : footerSx\n ? [footerSx]\n : []),\n ]}\n />\n ),\n ),\n }),\n [\n // onRowClick/getRowId \uB294 ref \uB85C \uCC98\uB9AC\uD558\uBBC0\uB85C deps \uC5D0\uC11C \uC81C\uC678(\uC778\uB77C\uC778 \uCF5C\uBC31\uC774\uC5B4\uB3C4 \uD589 \uB9AC\uB9C8\uC6B4\uD2B8 \uC548 \uB428).\n hasRowClick,\n // CSS \uD558\uC774\uB77C\uC774\uD2B8 \uBAA8\uB4DC\uC5D0\uC11C\uB294 selectedRowId \uAC00 components \uB97C \uC7AC\uC0DD\uC131\uD558\uC9C0 \uC54A\uAC8C \uD55C\uB2E4(\uD589 \uC7AC\uB80C\uB354 \uBC29\uC9C0).\n // \uD568\uC218\uD615 selectedRowSx(per-row) \uC77C \uB54C\uB9CC selectedRowId \uBCC0\uACBD\uC73C\uB85C components \uB97C \uAC31\uC2E0\uD55C\uB2E4.\n useCssRowHighlight ? null : selectedRowId,\n selectedRowSx,\n rowHeight,\n stripedRowColor,\n rowDivider,\n columnHeight,\n rowHoverColor,\n rowHoverOpacity,\n VirtuosoScroller,\n footerHeight,\n footerSx,\n hasFooter,\n notion,\n notionTokens,\n // spacer \uD589\uC758 colSpan \uACC4\uC0B0\uC5D0 \uC0AC\uC6A9 (\uCEEC\uB7FC \uAD6C\uC870 \uBCC0\uACBD \uC2DC components \uC7AC\uC0DD\uC131)\n columns,\n tableLayout,\n framed,\n autoRowHeight,\n tableMinWidth,\n mobileList,\n external,\n resizeOn,\n ],\n );\n rowComponentRef.current = (VirtuosoTableComponents as Record<string, unknown>).TableRow as React.ComponentType<any>;\n\n const resolvedVirtuosoComponents = VirtuosoTableComponents;\n // autoHeight \uB294 \uAC19\uC740 \uD45C \uBD80\uD488(\uBA38\uB9AC \u00B7 \uC904 \u00B7 \uD569\uACC4)\uC744 \uAC00\uC0C1\uD654 \uC5C6\uC774 \uADF8\uB300\uB85C \uC4F4\uB2E4 \u2014 \uCE78 \uBAA8\uC591\uC774 \uAC00\uC0C1 \uD45C\uC640 \uAC19\uB2E4.\n const autoParts = VirtuosoTableComponents as Record<string, unknown>;\n const AutoTable = autoParts.Table as React.ComponentType<any>;\n const AutoTableHead = autoParts.TableHead as React.ComponentType<any>;\n const AutoTableBody = autoParts.TableBody as React.ComponentType<any>;\n const AutoTableRow = autoParts.TableRow as React.ComponentType<any>;\n const AutoTableFoot = autoParts.TableFoot as React.ComponentType<any>;\n\n // \uBA38\uB9AC \uC6B0\uD074\uB9AD \uBA54\uB274 \u2014 \uC5F4\uC740 \uB9E4 \uB80C\uB354 columns \uC5D0\uC11C \uB2E4\uC2DC \uCC3E\uB294\uB2E4(\uACE0\uB978 \uAC12 \u00B7 \uC815\uB82C \uD45C\uC2DC\uAC00 \uBC14\uB85C \uB530\uB77C\uC624\uAC8C). \uC5F4\uC774 \uC0AC\uB77C\uC84C\uC73C\uBA74 \uADF8\uB9AC\uC9C0 \uC54A\uB294\uB2E4.\n const menuColumn = headerMenu ? columns.find((col) => String(col.id) === headerMenu.colId) : undefined;\n const closeHeaderMenu = () => setHeaderMenu(null);\n let headerMenuNode: React.ReactNode = null;\n if (headerMenu && menuColumn) {\n const colId = String(menuColumn.id);\n const canSort = Boolean((menuColumn.sortMenu ?? menuColumn.sortable) && onSort);\n const canFilter = hasColumnFilter(menuColumn);\n const activeSort = sortBy === colId ? sortDirection : undefined;\n // \uBA54\uB274 \uBAA8\uC591\uC740 \uACF5\uC6A9 HeaderMenu \uD55C \uBC8C\uC774\uB2E4(1.5.0) \u2014 \uD654\uBA74\uC774 \uC9C1\uC811 \uB744\uC6B0\uB294 \uBA38\uB9AC \uBA54\uB274\uC640 \uAC19\uC740 \uD06C\uAE30 \u00B7 \uCCB4\uD06C \uBAA8\uC591.\n headerMenuNode = (\n <HeaderMenu\n open\n anchorPosition={{ left: headerMenu.x, top: headerMenu.y }}\n onClose={closeHeaderMenu}\n sort={\n canSort\n ? {\n active: activeSort ?? null,\n clearable: Boolean(onSortClear),\n onChange: (direction) => {\n if (direction) onSort?.(colId, direction);\n else onSortClear?.();\n },\n }\n : undefined\n }\n filter={\n canFilter\n ? {\n options: menuColumn.filterOptions ?? [],\n value: menuColumn.filterValues ?? [],\n onChange: (values) => menuColumn.onFilterChange?.(values),\n multiple: menuColumn.filterMultiple !== false,\n emptyLabel: menuColumn.filterEmptyLabel,\n searchable: menuColumn.filterSearchable,\n }\n : undefined\n }\n />\n );\n }\n\n // \uACF5\uD1B5 \uD14C\uC774\uBE14 \uB0B4\uC6A9\n const tableContent = (\n <Box\n ref={(el: HTMLDivElement | null) => {\n tableBoxRef.current = el;\n reorderBoxRef.current = el;\n colReorderBoxRef.current = el;\n }}\n // \uBC14\uAFBC \uC5F4 \uD3ED(1.8.0) \u2014 \uCE78 \u00B7 \uD45C \uD3ED\uC774 \uC774 \uBCC0\uC218\uB97C \uBCF8\uB2E4\n style={resizeVars ?? undefined}\n sx={\n {\n position: \"relative\",\n height: sizeAuto ? \"auto\" : \"100%\",\n width: \"100%\",\n // \uC904 \uB04C\uC5B4 \uC62E\uAE30\uAE30(1.9.0) \u2014 \uC190\uC7A1\uC774 \u00B7 \uB04C\uB358 \uC904 \uD750\uB9AC\uAC8C \u00B7 \uB193\uC744 \uC790\uB9AC \uC120. \uC904 DOM \uC740 \uC18D\uC131\uB9CC \uBC14\uB00C\uACE0 React \uB294 \uB2E4\uC2DC \uADF8\uB9AC\uC9C0 \uC54A\uB294\uB2E4\n ...(reorder.on\n ? {\n \"& .vdt-reorder-handle\": {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 28,\n height: 28,\n padding: 0,\n border: 0,\n borderRadius: \"4px\",\n background: \"none\",\n color: notion ? notionTokens.headerColor : muiTheme.palette.text.secondary,\n cursor: \"grab\",\n touchAction: \"none\",\n \"&:hover\": { color: muiTheme.palette.text.primary, backgroundColor: notion ? notionTokens.hoverBg : \"rgba(0,0,0,.06)\" },\n \"&:disabled\": { opacity: 0.35, cursor: \"not-allowed\" },\n \"&[aria-pressed=\\\"true\\\"]\": { color: notion ? notionTokens.selectedBar : muiTheme.palette.primary.main, backgroundColor: notion ? notionTokens.selectedBg : \"rgba(0,0,0,.06)\" },\n },\n // \uBA38\uB9AC \uC548 \uACE0\uC815 \uC904(pinnedRows)\uC740 \uC62E\uAE38 \uC218 \uC5C6\uB2E4 \u2014 \uC190\uC7A1\uC774\uB97C \uAC10\uCD98\uB2E4\n \"& thead tr[data-vdt-pinned-row] .vdt-reorder-handle\": { visibility: \"hidden\" },\n \"& tbody tr[data-vdt-dragging] > td\": { opacity: 0.45 },\n \"& [data-vdt-drop-indicator]\": { backgroundColor: notion ? notionTokens.selectedBar : muiTheme.palette.primary.main },\n }\n : {}),\n // \uC5F4 \uC21C\uC11C \uBC14\uAFB8\uAE30(1.12.0) \u2014 \uB4E0 \uBA38\uB9AC \uCE78 \uD750\uB9AC\uAC8C \u00B7 \uB193\uC744 \uC790\uB9AC \uC138\uB85C\uC120 \u00B7 \uB044\uB294 \uB3D9\uC548 \uC190 \uBAA8\uC591. \uD130\uCE58 \uAE38\uAC8C \uB204\uB974\uAE30\uC758 \uAE00\uC790 \uB9D0\uD48D\uC120\uC740 \uB9C9\uB294\uB2E4\n ...(colReorder.on\n ? {\n \"& thead th[data-vdt-colkey]\": { WebkitTouchCallout: \"none\" },\n \"& thead th[data-vdt-col-dragging]\": { opacity: 0.45 },\n \"& [data-vdt-col-drop-indicator]\": { backgroundColor: notion ? notionTokens.selectedBar : muiTheme.palette.primary.main },\n \"&[data-vdt-col-reordering], &[data-vdt-col-reordering] *\": { cursor: \"grabbing !important\" },\n }\n : {}),\n \"& .MuiTableHead-root\": {\n backgroundColor: (theme: Theme) =>\n notion\n ? `${notionTokens.bg} !important`\n : theme.palette.mode === \"dark\"\n ? \"#1e1e1e !important\"\n : \"#ffffff !important\",\n },\n // \uC120\uD0DD \uD589 CSS \uD558\uC774\uB77C\uC774\uD2B8 (selectedRowId \uBCC0\uACBD \uC2DC \uC774 \uCEE8\uD14C\uC774\uB108\uB9CC \uAC31\uC2E0, \uD589 \uC7AC\uB80C\uB354 \uC5C6\uC74C).\n ...(selectedRowCssSx ?? {}),\n // \uC5F4 \uD3ED \uC190\uC7A1\uC774(1.8.0) \u2014 \uBA38\uB9AC \uCE78(sticky \uB77C \uC790\uB9AC \uAE30\uC900\uC774 \uB41C\uB2E4) \uC624\uB978\uCABD \uB05D 7px. \uC120\uC740 \uD638\uBC84 \u00B7 \uB044\uB294 \uB3D9\uC548\uB9CC \uBCF4\uC778\uB2E4(\uD3C9\uC18C\uC5D0 \uADF8\uC73C\uBA74 \uCE78 \uC0AC\uC774 \uC138\uB85C\uC120\uC774 \uB450 \uACB9\uC774\uB2E4).\n ...(resizeOn\n ? {\n \"& thead th [data-vdt-resize]\": {\n position: \"absolute\",\n top: 0,\n right: 0,\n bottom: 0,\n width: \"7px\",\n cursor: \"col-resize\",\n zIndex: 1,\n \"&::after\": {\n content: '\"\"',\n position: \"absolute\",\n top: 0,\n bottom: 0,\n right: 0,\n width: \"2px\",\n backgroundColor: notion ? notionTokens.selectedBar : muiTheme.palette.primary.main,\n opacity: 0,\n transition: \"opacity 0.12s ease\",\n },\n \"&:hover::after, &[data-active]::after\": { opacity: 1 },\n },\n }\n : {}),\n // \uACE0\uC815 \uC5F4 \uCE78\uC740 \uB4A4\uB85C \uC9C0\uB098\uAC00\uB294 \uCE78\uC744 \uAC00\uB824\uC57C \uD574 \uBC14\uD0D5\uC744 \uCE60\uD55C\uB2E4. \uC904 \uD638\uBC84 \uC0C9\uC740 \uC904(tr)\uC5D0 \uCE60\uD574\uC9C0\uBBC0\uB85C \uACE0\uC815 \uCE78\uC5D0\uB3C4 \uAC19\uC740 \uC0C9\uC744 \uC900\uB2E4.\n \"& tbody td[data-vdt-pinned]\": {\n backgroundColor: notion\n ? notionTokens.bg\n : muiTheme.palette.background.paper,\n },\n // \uCE78 \uB2E8\uC704\uB85C \uB204\uB974\uB294 \uCE78 \u2014 \uCE78\uC5D0\uB9CC \uD638\uBC84 \uBC14\uD0D5.\n \"& tbody td[data-vdt-cell-click]\": { cursor: \"pointer\" },\n \"& tbody td[data-vdt-cell-click]:hover\": {\n backgroundColor: notion\n ? notionTokens.hoverBg\n : muiTheme.palette.mode === \"dark\"\n ? \"rgba(255, 255, 255, 0.06)\"\n : \"rgba(0, 0, 0, 0.04)\",\n },\n ...(notion && hasRowClick\n ? {\n \"& tbody tr:hover td[data-vdt-pinned]\": {\n backgroundColor: notionTokens.hoverBg,\n },\n }\n : {}),\n // \uB05D \uCE78 \uC2A4\uD06C\uB864\uBC14 \uC790\uB9AC(scrollbarGutter) \u2014 \uC544\uB798 \uB178\uC158\uD48D \uCE78 \uC5EC\uBC31(!important)\uBCF4\uB2E4 \uB4A4\uC5D0 \uC640\uC57C \uD558\uBBC0\uB85C \uAC1D\uCCB4 \uB05D\uC5D0\uC11C \uB2E4\uC2DC \uC900\uB2E4(gutterSx).\n // \uB178\uC158\uD48D \u2014 \uBA38\uB9AC\u00B7\uCE78\uC758 \uC778\uB77C\uC778 style(padding\u00B7fontWeight)\uC744 \uB36E\uC5B4\uC57C \uD574\uC11C !important \uB2E4.\n // \uC140\uB809\uD130\uB97C \uCEE8\uD14C\uC774\uB108\uC5D0\uC11C \uB0B4\uB9AC\uB294 \uAC83\uC740 \uD589 \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uAC74\uB4DC\uB9AC\uC9C0 \uC54A\uAE30 \uC704\uD574\uC11C\uB2E4(\uD589 \uC7AC\uB80C\uB354 \uBE44\uC6A9).\n ...(notion\n ? {\n // \uBC14\uAE65 \uD14C\uB450\uB9AC \u2014 \uC5C5\uBB34\uD568 \uD45C(border 1px + radius 4px)\uC640 \uAC19\uB2E4. \uAC00\uC0C1\uD654\uB77C \uB0B4\uC6A9 \uB192\uC774\uC5D0 \uB9DE\uCDB0 \uC904\uC774\uC9C0 \uBABB\uD558\uACE0\n // \uC885\uC774 \uC548\uCABD \uC5EC\uBC31 \uC548\uC5D0\uC11C \uC138\uB85C\uB97C \uAF49 \uCC44\uC6B4\uB2E4. \uBA38\uB9AC\uC758 \uC717\uC120\u00B7\uC88C\uC6B0\uC120\uC740 \uC774 \uD14C\uB450\uB9AC\uAC00 \uB300\uC2E0\uD55C\uB2E4.\n ...(framed\n ? {\n border: `1px solid ${notionTokens.borderStrong}`,\n borderRadius: \"4px\",\n }\n : {\n // \uD2C0 \uC5C6\uC774 \u2014 \uBC14\uAE65 \uC0C1\uC790 \uBC14\uD0D5\uC774 \uBE44\uCE58\uC9C0 \uC54A\uAC8C \uD45C\uB97C \uC885\uC774 \uC0C9\uC73C\uB85C \uCE60\uD55C\uB2E4.\n \"& table\": { backgroundColor: notionTokens.bg },\n }),\n overflow: \"hidden\",\n // \uBA38\uB9AC \uCE78 \uC548\uC758 \uC778\uB77C\uC778 \uC0C1\uC790(\uC544\uC774\uCF58 + \uAE00\uC790\uB97C \uBB36\uC740 inline-flex \uBA38\uB9AC \u00B7 \uBA38\uB9AC\uAE00 \uD544\uD130 \uB2E8\uCD94)\uB294 \uAE30\uC900\uC120\uC5D0 \uC11C\uC11C \uC544\uB798\uC5D0\n // \uAE00\uC790 \uB0B4\uB9BC \uC790\uB9AC\uAC00 \uB0A8\uC544 \uAE00\uC790\uAC00 1~3px \uC704\uB85C \uB5A0 \uBCF4\uC600\uB2E4(1.4.3) \u2014 \uCE78 \uAC00\uC6B4\uB370\uC5D0 \uC138\uC6B4\uB2E4.\n \"& thead tr th > *\": { verticalAlign: \"middle\" },\n // \uBA38\uB9AC \uCE78\uC740 \uD55C \uC904(1.5.0) \u2014 \uCE78 \uD3ED\uBCF4\uB2E4 \uAE34 \uBA38\uB9AC\uAE00 \u00B7 \uC544\uC774\uCF58\uC774 \uB450 \uC904\uB85C \uAEBE\uC5EC \uBA38\uB9AC \uC904\uC774 \uB192\uC544\uC84C\uB2E4(\uC870\uC9C1 \uCE78\uC774 \uB9CE\uC740 \uACC4\uC57D \uBAA9\uB85D).\n // \uB118\uCE58\uBA74 \uB9D0\uC904\uC784, \uC804\uCCB4 \uC774\uB984\uC740 title(\uAE00\uC790 \uBA38\uB9AC) \uD234\uD301\uC73C\uB85C \uBCF8\uB2E4. \uB192\uC774\uB294 columnHeight \uADF8\uB300\uB85C\uB2E4.\n \"& thead > tr > th\": { whiteSpace: \"nowrap\", overflow: \"hidden\", textOverflow: \"ellipsis\" },\n \"& thead > tr > th > *\": { maxWidth: \"100%\" },\n // \uC815\uB82C \uD654\uC0B4\uD45C \uC790\uB9AC\uB294 sortPlacement(\uCE78 \uB9DE\uCDA4)\uAC00 \uC815\uD55C\uB2E4(1.10.4 \u2014 \uD45C \uAF34\uACFC \uC0C1\uAD00\uC5C6\uC774)\n \"& thead tr th\": {\n height: columnHeight,\n boxSizing: \"border-box\",\n padding: \"0 14px !important\",\n fontSize: 13,\n fontWeight: \"500 !important\",\n color: notionTokens.headerColor,\n backgroundColor: `${notionTokens.bg} !important`,\n // \uD2C0 \uC5C6\uB294 \uD45C\uB97C \uB3C4\uAD6C \uC904\uACFC \uD55C \uC0C1\uC790\uC5D0 \uB123\uC73C\uBA74 \uBA38\uB9AC \uC704 \uACBD\uACC4\uAC00 \uC5C6\uB2E4 \u2014 \uADF8\uB54C\uB9CC \uC717\uC120(headerTopBorder).\n borderTop: !framed && headerTopBorder ? `1px solid ${notionTokens.borderStrong}` : \"none\",\n borderBottom: `1px solid ${notionTokens.borderStrong}`,\n // \uCE78 \uC0AC\uC774 \uC138\uB85C\uC120 \u2014 \uB9C8\uC9C0\uB9C9 \uCE78 \uB4A4\uC5D0\uB294 \uAE0B\uC9C0 \uC54A\uB294\uB2E4(\uBC14\uAE65 \uD14C\uB450\uB9AC\uC640 \uACB9\uCCD0 \uB450 \uC904\uB85C \uBCF4\uC778\uB2E4).\n borderRight: `1px solid ${notionTokens.border}`,\n \"&:last-of-type\": { borderRight: \"none\" },\n },\n \"& tbody tr td:not([data-vdt-pad])\": {\n padding: \"0 14px !important\",\n },\n \"& tbody tr td\": {\n fontSize: 14,\n borderBottom: `1px solid ${notionTokens.border}`,\n },\n // \uB9C8\uC9C0\uB9C9 \uC904 \uC544\uB798\uC120 \u2014 \uD2C0 \uBC14\uB2E5(\uB610\uB294 \uD569\uACC4 \uC904\uC758 \uC717\uC120)\uACFC \uB9DE\uB2FF\uC73C\uBA74 \uAE0B\uC9C0 \uC54A\uB294\uB2E4. \uB450 \uC120\uC774 \uACB9\uCCD0 \uAD75\uC740 \uC774\uC911\uC120\uC73C\uB85C \uBCF4\uC600\uB2E4(2026-10-17).\n // \uB9DE\uB2FF\uB294 \uACBD\uC6B0: \uB0B4\uC6A9 \uB192\uC774\uB9CC\uD07C \uC11C\uB294 \uD45C(autoHeight), \uC904\uC774 \uC601\uC5ED\uBCF4\uB2E4 \uAE38\uC5B4 \uB05D\uAE4C\uC9C0 \uB0B4\uB9AC\uBA74 \uBC14\uB2E5\uC5D0 \uB2FF\uB294 \uD45C, \uD569\uACC4 \uC904\uC774 \uC788\uB294 \uD45C.\n // \uC904\uC774 \uC801\uC5B4 \uC544\uB798\uAC00 \uBE44\uB294 \uD45C\uB294 \uADF8\uB300\uB85C \uAE0B\uB294\uB2E4 \u2014 \uC904\uC774 \uC5B4\uB514\uC11C \uB05D\uB098\uB294\uC9C0 \uBCF4\uC5EC\uC57C \uD55C\uB2E4.\n // autoHeight \uB77C\uB3C4 \uD2C0\uC774 \uC5C6\uC73C\uBA74(framed=false) \uB9DE\uB2FF\uB294 \uBC14\uB2E5\uC120\uC774 \uC5C6\uB2E4 \u2014 \uB9C8\uC9C0\uB9C9 \uC904 \uC544\uB798\uC120\uC744 \uB0A8\uAE34\uB2E4(1.9.3, \uC5C5\uBB34\uD568 \uAD6C\uC131\uC6D0 \uBAA9\uB85D \"\uB9C8\uC9C0\uB9C9 \uC904 \uC544\uB798 \uAD6C\uBD84\uC120\uC774 \uC5C6\uB2E4\").\n ...(data.length > 0 && ((sizeAuto && framed) || listOverflows || hasFooter)\n ? { [`& tbody tr[data-index=\"${data.length - 1}\"]:not([data-vdt-pinned-row]) td`]: { borderBottom: \"none\" } }\n : {}),\n }\n : {}),\n ...gutterSx,\n } as SxProps<Theme>\n }\n >\n {reorder.indicator}\n {colReorder.indicator}\n {/* \uD14C\uC774\uBE14 \u2014 autoHeight \uBA74 \uAC00\uC0C1\uD654 \uC5C6\uC774 \uBAA8\uB4E0 \uC904\uC744 \uADF8\uB9AC\uACE0 \uB192\uC774\uB294 \uB0B4\uC6A9\uC744 \uB530\uB978\uB2E4(\uD398\uC774\uC9C0\uAC00 \uAD74\uB9B0\uB2E4). */}\n {autoHeight ? (\n // \uD45C\uC758 \uC624\uB978\uCABD \uB367\uC5EC\uBC31(framed 16px)\uC740 \uAC00\uC0C1 \uC2A4\uD06C\uB864\uB7EC\uC6A9\uC774\uB2E4 \u2014 \uC5EC\uAE30\uC11C\uB294 \uC0C1\uC790 \uD3ED\uC744 16px \uB118\uACA8 \uB298 \uAC00\uB85C \uB9C9\uB300\uAC00 \uC130\uB2E4(1.9.2, \uC5C5\uBB34 \uAE30\uC5EC\uB3C4 \uC0C1\uC138 \uCC3D).\n <Box sx={{ overflowX: \"auto\", width: \"100%\", \"& > .MuiTable-root\": { marginRight: 0 } }}>\n <AutoTable>\n {mobileList ? null : <AutoTableHead>{fixedHeaderContent()}</AutoTableHead>}\n <AutoTableBody>\n {data.map((item, index) => (\n <AutoTableRow\n key={getRowId ? String(getRowId(item, index)) : index}\n item={item}\n data-index={index}\n >\n {rowContent(index, item)}\n </AutoTableRow>\n ))}\n </AutoTableBody>\n {hasFooter && !mobileList ? <AutoTableFoot>{fixedFooterContent()}</AutoTableFoot> : null}\n </AutoTable>\n </Box>\n ) : scrollParent === null ? null : ( // \uBC14\uAE65 \uC2A4\uD06C\uB864 \uC694\uC18C\uB97C \uC544\uC9C1 \uBABB \uC5BB\uC5C8\uC73C\uBA74 \uAE30\uB2E4\uB9B0\uB2E4\n <TableVirtuoso\n key={tableKey}\n ref={virtuosoRef}\n data={data}\n totalCount={onLoadMore ? data.length + 1 : data.length}\n defaultItemHeight={estimatedItemHeight}\n fixedItemHeight={autoRowHeight ? undefined : estimatedItemHeight}\n // \uD3F0 \uBAA9\uB85D\uC740 \uBA38\uB9AC \uC904 \u00B7 \uD569\uACC4 \uC904 \uC5C6\uC774 \uCE74\uB4DC\uB9CC\n fixedHeaderContent={mobileList ? undefined : fixedHeaderContent}\n fixedFooterContent={hasFooter && !mobileList ? fixedFooterContent : undefined}\n itemContent={rowContent}\n // \uD0A4 \uD568\uC218\uB294 \uC4F8 \uB54C\uB9CC \uB118\uAE34\uB2E4 \u2014 computeItemKey={undefined} \uB97C \uADF8\uB300\uB85C \uB118\uAE30\uBA74 react-virtuoso \uC758 \uAE30\uBCF8 \uD0A4 \uD568\uC218\uAC00 undefined \uB85C \uB36E\uC5EC\n // \"n is not a function\" \uC73C\uB85C \uD45C \uC804\uCCB4\uAC00 \uADF8\uB824\uC9C0\uC9C0 \uC54A\uC558\uB2E4(1.3.0, 2026-10-18).\n {...(rowKeyFromId && getRowId\n ? { computeItemKey: (index: number, item: T) => (item ? getRowId(item, index) : `vdt-${index}`) }\n : {})}\n endReached={handleEndReached}\n scrollerRef={(el) => {\n scrollerElRef.current = el instanceof HTMLElement ? el : null;\n checkListOverflow();\n }}\n totalListHeightChanged={checkListOverflow}\n style={external ? undefined : { height: \"100%\" }}\n // \uBC14\uAE65 \uC2A4\uD06C\uB864(1.7.0) \u2014 \uC571 \uC178\uCC98\uB7FC \uD398\uC774\uC9C0\uAC00 \uAD74\uB9AC\uB294 \uD654\uBA74(\uBA38\uB9AC \uC811\uAE30 \u00B7 \uB9E8 \uC704\uB85C \u00B7 \uB2F9\uACA8\uC11C \uC0C8\uB85C\uACE0\uCE68\uC740 \uBC14\uAE65 \uAC83\uC774 \uADF8\uB300\uB85C \uD55C\uB2E4)\n {...(external ? { customScrollParent: scrollParent as HTMLElement } : {})}\n increaseViewportBy={{\n top: viewportBufferTop,\n bottom: viewportBufferBottom,\n }}\n overscan={virtuosoOverscan}\n // \uCCAB \uADF8\uB9BC\uBD80\uD130 \uC55E\uCABD \uC904\uC744 \uADF8\uB9B0\uB2E4(1.7.3 \u2014 \uB2E4\uC2DC \uC5F0 \uD654\uBA74\uC774 \uC7A0\uAE50 \uBE44\uC9C0 \uC54A\uAC8C). \uC904 \uC218\uBCF4\uB2E4 \uB9CE\uC73C\uBA74 virtuoso \uAC00 \uACBD\uACE0\uD558\uBBC0\uB85C \uC904\uC778\uB2E4\n {...(initialItemCount && data.length > 0 ? { initialItemCount: Math.min(initialItemCount, data.length) } : {})}\n followOutput={false}\n components={resolvedVirtuosoComponents}\n />\n )}\n\n {/* \uBE48 \uB370\uC774\uD130 \uD45C\uC2DC \u2014 \uB178\uC158\uD48D\uC740 \uBA38\uB9AC \uC544\uB798\uC5D0 \uC605\uC740 \uAE00 \uD55C \uC904(\uC5C5\uBB34\uD568 \uBAA9\uB85D \uD45C\uC758 \uBE48 \uBAA9\uB85D\uACFC \uAC19\uC740 \uBAA8\uC591). */}\n {data.length === 0 && !loading && !hasPinnedRows && notion && typeof emptyMessage === \"string\" && (\n <Box\n sx={{\n position: sizeAuto ? \"static\" : \"absolute\",\n top: mobileList ? 0 : columnHeight,\n left: 0,\n right: 0,\n py: 6,\n // \uC88C\uC6B0 16px \u2014 \uD2C0 \uC5C6\uB294 \uD45C(framed=false \u00B7 \uD3F0 \uBAA9\uB85D)\uB294 \uC548\uCABD \uC5EC\uBC31\uC774 \uC5C6\uC5B4 \uAE34 \uC548\uB0B4 \uAE00\uC774 \uD654\uBA74 \uB05D\uAE4C\uC9C0 \uB2FF\uC558\uB2E4(1.6.1)\n px: 2,\n textAlign: \"center\",\n fontSize: 14,\n color: notionTokens.emptyColor,\n // \uAE00 \uD55C \uC904\uBFD0\uC774\uB77C \uB204\uB97C \uAC83\uC774 \uC5C6\uB2E4 \u2014 \uBA38\uB9AC \uCE78 \uD074\uB9AD \u00B7 \uC6B0\uD074\uB9AD\uC744 \uAC00\uB85C\uCC44\uC9C0 \uC54A\uAC8C.\n pointerEvents: \"none\",\n }}\n >\n {emptyMessage}\n </Box>\n )}\n {data.length === 0 && !loading && !hasPinnedRows && !(notion && typeof emptyMessage === \"string\") && (\n <Box\n sx={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 2,\n px: 2, // \uD2C0 \uC5C6\uB294 \uD45C\uC5D0\uC11C\uB3C4 \uC548\uB0B4 \uAE00\uC774 \uD654\uBA74 \uB05D\uC5D0 \uB2FF\uC9C0 \uC54A\uAC8C(1.6.1)\n textAlign: \"center\",\n // \uD45C \uC804\uCCB4(\uBA38\uB9AC \uD3EC\uD568)\uB97C \uB36E\uB294 \uC0C1\uC790\uB77C \uBE48 \uBAA9\uB85D\uC5D0\uC11C \uBA38\uB9AC \uCE78 \uC815\uB82C \u00B7 \uC6B0\uD074\uB9AD \uBA54\uB274\uAC00 \uBA39\uC9C0 \uC54A\uC558\uB2E4(1.4.2) \u2014\n // \uC0C1\uC790\uB294 \uD1B5\uACFC\uC2DC\uD0A4\uACE0 \uAC00\uC6B4\uB370 \uB0B4\uC6A9(\uC548\uB0B4 \u00B7 \uB2E8\uCD94)\uB9CC \uB20C\uB9AC\uAC8C \uD55C\uB2E4.\n pointerEvents: \"none\",\n \"& > *\": { pointerEvents: \"auto\" },\n }}\n >\n {typeof emptyMessage === \"string\" ? (\n <>\n <Box\n sx={{\n width: 48,\n height: 48,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"50%\",\n backgroundColor: \"#f5f5f5\",\n color: \"#999\",\n }}\n >\n \uD83D\uDCC4\n </Box>\n <Typography\n variant=\"body1\"\n sx={{ color: \"text.secondary\" }}\n >\n {emptyMessage}\n </Typography>\n </>\n ) : (\n emptyMessage\n )}\n </Box>\n )}\n\n {headerMenuNode}\n\n {/* \uB85C\uB529 \uC2A4\uD53C\uB108 */}\n {shouldShowLoading && (\n <>\n {LoadingComponent ? (\n <LoadingComponent\n visible={loading}\n onComplete={handleLoadingComplete}\n />\n ) : loadingGate ? (\n // \uC571 \uC804\uC5ED \uB85C\uB529 \uAD00\uBB38(1.11.0) \u2014 \uC571\uC774 \uAE30\uBCF8 \uB85C\uB529 \uD45C\uC2DC\uB97C \uB300\uC2E0 \uADF8\uB9B4\uC9C0 \uC815\uD55C\uB2E4(\uC608: \uC571 \uC2DC\uC791 \uD654\uBA74\uC744 \uBD99\uC7A1\uACE0 \uC544\uBB34\uAC83\uB3C4 \uC548 \uADF8\uB9BC).\n // \uAD00\uBB38\uC774 \uAE30\uBCF8 \uD45C\uC2DC\uB97C \uC4F0\uACA0\uB2E4\uBA74 fallback \uC744 \uADF8\uB300\uB85C \uADF8\uB9B0\uB2E4.\n React.createElement(loadingGate, {\n visible: Boolean(loading),\n onComplete: handleLoadingComplete,\n fallback: (\n <LoadingProgress\n visible={loading}\n onComplete={handleLoadingComplete}\n size={40}\n indicator={<CssSpinner />}\n sx={{\n top: `${columns.some((col) => col.group) ? columnHeight * 2 : columnHeight}px`,\n bottom: `${hasFooter ? footerHeight ?? rowHeight : 0}px`,\n }}\n background={{ show: data.length === 0, opacity: 0.8 }}\n />\n ),\n })\n ) : (\n <LoadingProgress\n visible={loading}\n onComplete={handleLoadingComplete}\n size={40}\n indicator={<CssSpinner />}\n sx={{\n top: `${\n columns.some((col) => col.group)\n ? columnHeight * 2\n : columnHeight\n }px`,\n // \uD478\uD130(\uD569\uACC4 \uD589)\uAC00 \uC788\uC73C\uBA74 \uADF8 \uB192\uC774\uB9CC\uD07C \uC544\uB798\uB97C \uC798\uB77C, \uD5E4\uB354~\uD478\uD130 \uC0AC\uC774 \uB0B4\uC6A9 \uC601\uC5ED \uC911\uC559\uC5D0 \uC2A4\uD53C\uB108\uB97C \uB454\uB2E4.\n bottom: `${hasFooter ? footerHeight ?? rowHeight : 0}px`,\n }}\n background={{\n show: data.length === 0, // \uCD5C\uCD08 \uB85C\uB529\uC5D0\uB9CC \uBC30\uACBD \uD45C\uC2DC\n opacity: 0.8,\n }}\n />\n )}\n </>\n )}\n </Box>\n );\n\n // \uB178\uC158\uD48D\uC740 \uC0AC\uBC29 \uC5EC\uBC31 \u2014 \uC5C5\uBB34\uD568\uCC98\uB7FC \uD45C\uAC00 \uC885\uC774 \uAC00\uC7A5\uC790\uB9AC\uC5D0 \uBD99\uC9C0 \uC54A\uB294\uB2E4(\uC88C\uC6B0 paddingX, \uC0C1\uD558 NOTION_PADDING_Y).\n const notionFramePadding = notion && framed\n ? { paddingRight: paddingX, paddingTop: NOTION_PADDING_Y, paddingBottom: NOTION_PADDING_Y }\n : {};\n\n return showPaper ? (\n <Paper\n className=\"grow\"\n elevation={1}\n sx={{\n padding: 0,\n paddingLeft: paddingX,\n ...notionFramePadding,\n boxSizing: \"border-box\",\n height: sizeAuto ? \"auto\" : \"100%\",\n minHeight: 0,\n flex: sizeAuto ? \"none\" : 1,\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {tableContent}\n </Paper>\n ) : (\n <Box\n className=\"grow\"\n style={{\n padding: 0,\n paddingLeft: paddingX,\n ...notionFramePadding,\n boxSizing: \"border-box\",\n height: sizeAuto ? \"auto\" : \"100%\",\n minHeight: 0,\n flex: sizeAuto ? \"none\" : 1,\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {tableContent}\n </Box>\n );\n}\n\n\n/**\n * \uC571 \uC804\uC5ED \uB85C\uB529 \uAD00\uBB38(1.11.0) \u2014 LoadingComponent \uB97C \uC8FC\uC9C0 \uC54A\uC740 \uD45C \uBAA8\uB450\uC5D0 \uAC78\uB9B0\uB2E4.\n * \uAD00\uBB38\uC740 { visible, onComplete, fallback } \uC744 \uBC1B\uC544, \uAE30\uBCF8 \uB85C\uB529 \uD45C\uC2DC(fallback)\uB97C \uADF8\uB9AC\uAC70\uB098 \uB2E4\uB978 \uAC83\uC744 \uADF8\uB9B0\uB2E4.\n * visible \uC774 false \uAC00 \uB418\uBA74 onComplete \uB97C \uBD88\uB7EC\uC57C \uD45C\uAC00 \uB85C\uB529 \uD45C\uC2DC\uB97C \uAC77\uB294\uB2E4(fallback \uC744 \uADF8\uB838\uC73C\uBA74 fallback \uC774 \uBD80\uB978\uB2E4).\n */\nexport interface VirtualDataTableLoadingGateProps {\n visible: boolean;\n onComplete: () => void;\n fallback: React.ReactNode;\n}\nlet loadingGate: React.ComponentType<VirtualDataTableLoadingGateProps> | null = null;\nexport function setVirtualDataTableLoadingGate(gate: React.ComponentType<VirtualDataTableLoadingGateProps> | null): void {\n loadingGate = gate;\n}\n\nexport const VirtualDataTable = memo(VirtualDataTableComponent) as <T>(\n props: VirtualDataTableProps<T>,\n) => React.JSX.Element;\n", "/**\n * rowReorder.tsx \u2014 \uC904 \uB04C\uC5B4 \uC62E\uAE30\uAE30(1.9.0)\n *\n * \uCCAB \uCE78\uC5D0 \uC190\uC7A1\uC774(\u22EE\u22EE)\uB97C \uC138\uC6B0\uACE0, \uC190\uC7A1\uC774\uB97C \uB04C\uBA74 \uB193\uC744 \uC790\uB9AC\uC5D0 \uC120\uC744 \uAE0B\uACE0 \uB193\uC744 \uB54C onReorder(from, to) \uB97C \uBD80\uB978\uB2E4. \uD45C\uB294 data \uB97C \uBC14\uAFB8\uC9C0 \uC54A\uB294\uB2E4 \u2014\n * \uC18C\uBE44\uCC98\uAC00 \uBC14\uAFD4 \uB118\uAE30\uBA74 \uADF8\uB300\uB85C \uB2E4\uC2DC \uADF8\uB9B0\uB2E4. \uAC00\uC0C1\uD654 \uD45C\uC5D0\uC11C\uB3C4 \uB418\uB3C4\uB85D \uC904 DOM \uC744 \uC190\uB300\uC9C0 \uC54A\uB294\uB2E4: \uB044\uB294 \uB3D9\uC548\uC740 \uD3EC\uC778\uD130 \uC544\uB798 \uC904(elementFromPoint)\uC758\n * \uC790\uB9AC\uB85C \uC120 \uC704\uCE58\uB9CC \uC815\uD558\uACE0, \uB04C\uB358 \uC904\uC740 data-vdt-dragging \uC18D\uC131\uC73C\uB85C \uD750\uB9AC\uAC8C \uBCF4\uC778\uB2E4(React \uC7AC\uB80C\uB354 \uC5C6\uC74C). \uBC14\uAE65 \uC758\uC874\uC131(dnd-kit \uB4F1) \uC5C6\uC774 \uD3EC\uC778\uD130 \uC774\uBCA4\uD2B8\uB85C \uD55C\uB2E4.\n * \uD0A4\uBCF4\uB4DC: \uC190\uC7A1\uC774\uC5D0 \uCD08\uC810 \u2192 Space(\uB4E4\uAE30) \u2192 \u2191 \u2193 \uB85C \uD55C \uCE78\uC529(\uBC14\uB85C onReorder) \u2192 Space \u00B7 Enter \u00B7 Esc \uB85C \uB193\uAE30.\n */\nimport React, { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport type { DataColumn, VDTRowReorderConfig } from \"./types\";\nimport { useI18n } from \"./i18n\";\n\n/** \uC190\uC7A1\uC774 \uC5F4\uC758 id \u2014 \uC18C\uBE44\uCC98 \uC5F4\uACFC \uACB9\uCE58\uC9C0 \uC54A\uAC8C */\nexport const REORDER_COLUMN_ID = \"__vdt_reorder\";\n/** \uC790\uB3D9 \uC2A4\uD06C\uB864\uC774 \uC2DC\uC791\uB418\uB294 \uAC00\uC7A5\uC790\uB9AC \uD3ED px */\nconst EDGE_PX = 40;\n/** \uC790\uB3D9 \uC2A4\uD06C\uB864 \uCD5C\uB300 \uC18D\uB3C4 px/\uD504\uB808\uC784 */\nconst EDGE_SPEED = 14;\n\n/** \uC190\uC7A1\uC774 \uADF8\uB9BC(Material DragIndicator \uACBD\uB85C) \u2014 @mui/icons-material \uC744 \uB4E4\uC774\uC9C0 \uC54A\uC73C\uB824\uACE0 \uACBD\uB85C\uB9CC \uB454\uB2E4 */\nconst HANDLE_ICON = (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" aria-hidden focusable=\"false\">\n <path fill=\"currentColor\" d=\"M11 18c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zm-2-8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 4c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\" />\n </svg>\n);\n\ninterface Drag {\n from: number; // \uB04C\uAE30 \uC2DC\uC791\uD55C \uC904\n item: unknown;\n pointerId: number;\n x: number;\n y: number;\n to: number | null; // \uB193\uC73C\uBA74 \uC124 \uC790\uB9AC(data \uC21C\uBC88) \u2014 null \uC774\uBA74 \uC544\uC9C1 \uBAA8\uB978\uB2E4\n tr: HTMLElement | null; // \uB04C\uB358 \uC904\n}\n\n/** \uBCF8\uBB38 \uC904\uB4E4(\uACE0\uC815 \uC904 \uC81C\uC678) \u2014 \uBCF4\uC774\uB294 \uAC83\uB9CC(\uAC00\uC0C1\uD654) */\nconst bodyRows = (box: HTMLElement) => Array.from(box.querySelectorAll<HTMLElement>(\"tbody tr[data-index]:not([data-vdt-pinned-row])\"));\n\n/** \uAC00\uC7A5 \uAC00\uAE4C\uC6B4 \uAD74\uB9AC\uB294 \uC870\uC0C1(autoHeight \uD45C\uAC00 \uC4F4\uB2E4) */\nfunction nearestScrollable(el: HTMLElement | null): HTMLElement | null {\n for (let e = el; e; e = e.parentElement) {\n const { overflowY } = getComputedStyle(e);\n if ((overflowY === \"auto\" || overflowY === \"scroll\") && e.scrollHeight > e.clientHeight) return e;\n }\n return null;\n}\n\nexport interface UseRowReorderArgs<T> {\n config: VDTRowReorderConfig<T> | undefined;\n tableBoxRef: React.RefObject<HTMLElement | null>; // \uD45C \uC0C1\uC790(position: relative) \u2014 \uC120\uC744 \uC774 \uC548\uC5D0 \uADF8\uB9B0\uB2E4\n getScroller: () => HTMLElement | null; // \uD45C\uB97C \uAD74\uB9AC\uB294 \uC694\uC18C(\uC5C6\uC73C\uBA74 \uBB38\uC11C)\n dataLengthRef: React.RefObject<number>;\n anyPinned: boolean; // \uACE0\uC815 \uC5F4\uC774 \uC788\uC73C\uBA74 \uC190\uC7A1\uC774 \uC5F4\uB3C4 \uACE0\uC815\uD55C\uB2E4(\uC544\uB2C8\uBA74 \uACE0\uC815 \uC5F4\uC774 \uC190\uC7A1\uC774\uB97C \uB36E\uB294\uB2E4)\n}\n\n/**\n * \uB04C\uC5B4 \uC62E\uAE30\uAE30 \u2014 \uC190\uC7A1\uC774 \uC5F4 \u00B7 \uC190\uC7A1\uC774 \uB80C\uB354 \u00B7 \uD45C \uC0C1\uC790\uC5D0 \uB123\uC744 \uC120 \uC694\uC18C\uB97C \uB3CC\uB824\uC900\uB2E4.\n * \uBAA8\uB4E0 \uD3EC\uC778\uD130 \uCC98\uB9AC\uB294 ref \uB85C \uD574 \uB044\uB294 \uB3D9\uC548 React \uAC00 \uB2E4\uC2DC \uADF8\uB9AC\uC9C0 \uC54A\uB294\uB2E4.\n */\nexport function useRowReorder<T>({ config, tableBoxRef, getScroller, dataLengthRef, anyPinned }: UseRowReorderArgs<T>) {\n const { t } = useI18n();\n const configRef = useRef(config);\n configRef.current = config;\n const on = Boolean(config);\n const dragRef = useRef<Drag | null>(null);\n const rafRef = useRef(0);\n const indicatorRef = useRef<HTMLDivElement | null>(null);\n const liftedRef = useRef<number | null>(null); // \uD0A4\uBCF4\uB4DC\uB85C \uB4E0 \uC904\n\n const hideIndicator = () => {\n if (indicatorRef.current) indicatorRef.current.style.display = \"none\";\n };\n\n /** \uD3EC\uC778\uD130 \uC790\uB9AC\uB85C \uB193\uC744 \uC790\uB9AC\uB97C \uC815\uD558\uACE0 \uC120\uC744 \uAE0B\uB294\uB2E4 */\n const updateTarget = useCallback(() => {\n const d = dragRef.current;\n const box = tableBoxRef.current;\n if (!d || !box) return;\n const rows = bodyRows(box);\n if (rows.length === 0) return;\n const under = document.elementFromPoint(d.x, d.y)?.closest<HTMLElement>(\"tr[data-index]\");\n let row: HTMLElement | null = under && box.contains(under) && !under.hasAttribute(\"data-vdt-pinned-row\") ? under : null;\n let edge: \"before\" | \"after\";\n if (row) {\n const r = row.getBoundingClientRect();\n edge = d.y < r.top + r.height / 2 ? \"before\" : \"after\";\n } else {\n const first = rows[0].getBoundingClientRect();\n const last = rows[rows.length - 1].getBoundingClientRect();\n if (d.y < first.top) {\n row = rows[0];\n edge = \"before\";\n } else if (d.y > last.bottom) {\n row = rows[rows.length - 1];\n edge = \"after\";\n } else return; // \uC904 \uC0AC\uC774 \uD2C8(\uAD6C\uBD84\uC120) \u2014 \uC9C0\uB09C \uC790\uB9AC\uB97C \uC9C0\uD0A8\uB2E4\n }\n const idx = Number(row.dataset.index);\n const insertAt = edge === \"before\" ? idx : idx + 1;\n const to = insertAt > d.from ? insertAt - 1 : insertAt;\n d.to = to;\n const ind = indicatorRef.current;\n if (!ind) return;\n if (to === d.from) {\n ind.style.display = \"none\";\n return;\n }\n const r = row.getBoundingClientRect();\n const b = box.getBoundingClientRect();\n const y = (edge === \"before\" ? r.top : r.bottom) - b.top;\n ind.style.top = `${Math.max(0, Math.min(b.height - 2, Math.round(y) - 1))}px`;\n ind.style.display = \"block\";\n }, [tableBoxRef]);\n\n /** \uAC00\uC7A5\uC790\uB9AC \uC790\uB3D9 \uC2A4\uD06C\uB864 \u2014 \uD3EC\uC778\uD130\uAC00 \uB05D \uAC00\uAE4C\uC774\uC5D0 \uC788\uB294 \uB3D9\uC548 \uD504\uB808\uC784\uB9C8\uB2E4 \uAD74\uB9B0\uB2E4 */\n const autoScroll = useCallback(() => {\n cancelAnimationFrame(rafRef.current);\n const step = () => {\n const d = dragRef.current;\n if (!d) return;\n const scroller = getScroller() ?? nearestScrollable(tableBoxRef.current) ?? null;\n const target: HTMLElement | null = scroller ?? (document.scrollingElement as HTMLElement | null);\n if (!target) return;\n const top = scroller ? scroller.getBoundingClientRect().top : 0;\n const bottom = scroller ? scroller.getBoundingClientRect().bottom : window.innerHeight;\n let dy = 0;\n if (d.y < top + EDGE_PX) dy = -Math.ceil(((top + EDGE_PX - d.y) / EDGE_PX) * EDGE_SPEED);\n else if (d.y > bottom - EDGE_PX) dy = Math.ceil(((d.y - (bottom - EDGE_PX)) / EDGE_PX) * EDGE_SPEED);\n if (dy !== 0) {\n target.scrollTop += dy;\n updateTarget();\n rafRef.current = requestAnimationFrame(step);\n }\n };\n rafRef.current = requestAnimationFrame(step);\n }, [getScroller, tableBoxRef, updateTarget]);\n\n const finish = useCallback(\n (commit: boolean) => {\n const d = dragRef.current;\n if (!d) return;\n dragRef.current = null;\n cancelAnimationFrame(rafRef.current);\n hideIndicator();\n d.tr?.removeAttribute(\"data-vdt-dragging\");\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n if (commit && d.to !== null && d.to !== d.from) configRef.current?.onReorder(d.from, d.to, d.item as T);\n },\n [],\n );\n\n // \uCC3D \uB2E8\uC704 \uC774\uBCA4\uD2B8 \u2014 \uB044\uB294 \uB3D9\uC548\uB9CC \uB4E3\uB294\uB2E4(\uD3EC\uC778\uD130\uB97C \uC190\uC7A1\uC774\uAC00 \uBD99\uC7A1\uC544\uB3C4 window \uAE4C\uC9C0 \uC62C\uB77C\uC628\uB2E4)\n useEffect(() => {\n if (!on) return;\n const move = (e: PointerEvent) => {\n const d = dragRef.current;\n if (!d || e.pointerId !== d.pointerId) return;\n d.x = e.clientX;\n d.y = e.clientY;\n updateTarget();\n autoScroll();\n };\n const up = (e: PointerEvent) => {\n const d = dragRef.current;\n if (!d || e.pointerId !== d.pointerId) return;\n finish(e.type === \"pointerup\");\n };\n const key = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && dragRef.current) finish(false);\n };\n window.addEventListener(\"pointermove\", move);\n window.addEventListener(\"pointerup\", up);\n window.addEventListener(\"pointercancel\", up);\n window.addEventListener(\"keydown\", key);\n return () => {\n window.removeEventListener(\"pointermove\", move);\n window.removeEventListener(\"pointerup\", up);\n window.removeEventListener(\"pointercancel\", up);\n window.removeEventListener(\"keydown\", key);\n finish(false);\n };\n }, [on, updateTarget, autoScroll, finish]);\n\n /** \uD0A4\uBCF4\uB4DC\uB85C \uB4E0 \uC904 \uD45C\uC2DC\uB97C \uB2E4\uC2DC \uBD99\uC778\uB2E4(\uC904\uC774 \uB2E4\uC2DC \uADF8\uB824\uC9C4 \uB4A4) */\n const markLifted = useCallback(\n (index: number | null) => {\n const box = tableBoxRef.current;\n if (!box) return;\n box.querySelectorAll(\"tbody tr[data-vdt-dragging]\").forEach((tr) => tr.removeAttribute(\"data-vdt-dragging\"));\n box.querySelectorAll(\".vdt-reorder-handle[aria-pressed=\\\"true\\\"]\").forEach((h) => h.setAttribute(\"aria-pressed\", \"false\"));\n if (index === null) return;\n const tr = box.querySelector<HTMLElement>(`tbody tr[data-index=\"${index}\"]:not([data-vdt-pinned-row])`);\n tr?.setAttribute(\"data-vdt-dragging\", \"\");\n tr?.querySelector(\".vdt-reorder-handle\")?.setAttribute(\"aria-pressed\", \"true\");\n },\n [tableBoxRef],\n );\n\n const onHandlePointerDown = useCallback(\n (e: React.PointerEvent<HTMLButtonElement>, index: number, item: T) => {\n e.stopPropagation();\n if (e.button !== 0 && e.pointerType === \"mouse\") return;\n if (configRef.current?.disabledReason) return;\n const tr = e.currentTarget.closest<HTMLElement>(\"tr\");\n if (tr?.hasAttribute(\"data-vdt-pinned-row\")) return;\n e.preventDefault();\n if (liftedRef.current !== null) {\n liftedRef.current = null;\n markLifted(null);\n }\n try {\n e.currentTarget.setPointerCapture(e.pointerId);\n } catch {\n /* \uD3EC\uC778\uD130\uB97C \uBABB \uBD99\uC7A1\uC544\uB3C4 window \uC774\uBCA4\uD2B8\uB85C \uC774\uC5B4 \uAC04\uB2E4 */\n }\n dragRef.current = { from: index, item, pointerId: e.pointerId, x: e.clientX, y: e.clientY, to: null, tr };\n tr?.setAttribute(\"data-vdt-dragging\", \"\");\n document.body.style.cursor = \"grabbing\";\n document.body.style.userSelect = \"none\";\n },\n [markLifted],\n );\n\n const onHandleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLButtonElement>, index: number, item: T) => {\n const cfg = configRef.current;\n if (!cfg || cfg.disabledReason) return;\n const lifted = liftedRef.current;\n if (e.key === \" \" || e.key === \"Enter\") {\n e.preventDefault();\n e.stopPropagation();\n liftedRef.current = lifted === null ? index : null;\n markLifted(liftedRef.current);\n return;\n }\n if (e.key === \"Escape\" && lifted !== null) {\n e.preventDefault();\n liftedRef.current = null;\n markLifted(null);\n return;\n }\n if ((e.key === \"ArrowUp\" || e.key === \"ArrowDown\") && lifted !== null) {\n e.preventDefault();\n e.stopPropagation();\n const to = Math.max(0, Math.min((dataLengthRef.current ?? 1) - 1, index + (e.key === \"ArrowUp\" ? -1 : 1)));\n if (to === index) return;\n cfg.onReorder(index, to, item);\n liftedRef.current = to;\n // \uC904\uC774 \uB2E4\uC2DC \uADF8\uB824\uC9C4 \uB4A4 \uC62E\uAE34 \uC904\uC758 \uC190\uC7A1\uC774\uB85C \uCD08\uC810\uC744 \uC62E\uAE30\uACE0 \uB4E0 \uD45C\uC2DC\uB97C \uB2E4\uC2DC \uBD99\uC778\uB2E4\n requestAnimationFrame(() =>\n requestAnimationFrame(() => {\n const box = tableBoxRef.current;\n const h = box?.querySelector<HTMLButtonElement>(`tbody tr[data-index=\"${to}\"]:not([data-vdt-pinned-row]) .vdt-reorder-handle`);\n h?.focus({ preventScroll: false });\n markLifted(to);\n }),\n );\n }\n },\n [dataLengthRef, markLifted, tableBoxRef],\n );\n\n /** \uC190\uC7A1\uC774 \uB2E8\uCD94 \u2014 \uCE78 \u00B7 \uD3F0 \uCE74\uB4DC\uAC00 \uD568\uAED8 \uC4F4\uB2E4 */\n const renderHandle = useCallback(\n (item: T, index: number): React.ReactNode => {\n const cfg = configRef.current;\n if (!cfg) return null;\n if (cfg.canDrag && !cfg.canDrag(item, index)) return null;\n const label = cfg.handleLabel ?? t(\"reorderHandle\");\n return (\n <button\n type=\"button\"\n className=\"vdt-reorder-handle\"\n aria-label={label}\n title={cfg.disabledReason ?? label}\n disabled={Boolean(cfg.disabledReason)}\n onPointerDown={(e) => onHandlePointerDown(e, index, item)}\n onKeyDown={(e) => onHandleKeyDown(e, index, item)}\n // \uC904 \uB204\uB984(onRowClick) \u00B7 \uB04C\uC5B4\uC11C \uAD74\uB9AC\uAE30 \uAC10\uC9C0\uB85C \uBC88\uC9C0\uC9C0 \uC54A\uAC8C\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onContextMenu={(e) => e.stopPropagation()}\n >\n {HANDLE_ICON}\n </button>\n );\n },\n [onHandlePointerDown, onHandleKeyDown, t],\n );\n\n const handleWidth = config?.handleWidth ?? 36;\n // \uB9C9\uB294 \uC774\uC720\uAC00 \uBC14\uB00C\uBA74 \uC5F4\uC744 \uC0C8\uB85C \uB9CC\uB4E4\uC5B4 \uC904\uC774 \uB2E4\uC2DC \uADF8\uB824\uC9C0\uAC8C \uD55C\uB2E4 \u2014 \uC190\uC7A1\uC774\uC758 disabled \u00B7 title \uC740 \uADF8\uB9B4 \uB54C \uC77D\uB294\uB2E4\n const disabledReason = config?.disabledReason;\n /** \uD45C \uB9E8 \uC55E\uC5D0 \uB07C\uC6B8 \uC190\uC7A1\uC774 \uC5F4 \u2014 \uD3F0 \uCE74\uB4DC\uC5D0\uC11C\uB294 \uC5F4 \uB300\uC2E0 \uCE74\uB4DC \uC67C\uCABD\uC5D0 \uC190\uC7A1\uC774\uB97C \uC138\uC6B4\uB2E4(mobile: false) */\n const handleColumn = useMemo<DataColumn<T> | null>(\n () =>\n on\n ? {\n id: REORDER_COLUMN_ID,\n text: \"\",\n width: handleWidth,\n align: \"center\",\n cellPadding: 0,\n headerMenu: false,\n mobile: false,\n ...(anyPinned ? { pinned: \"left\" as const } : {}),\n render: renderHandle,\n }\n : null,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [on, handleWidth, anyPinned, renderHandle, disabledReason],\n );\n\n /** \uB193\uC744 \uC790\uB9AC \uC120 \u2014 \uD45C \uC0C1\uC790(position: relative) \uC548\uC5D0 \uB454\uB2E4 */\n const indicator = on ? (\n <div\n ref={indicatorRef}\n data-vdt-drop-indicator=\"\"\n aria-hidden\n style={{ position: \"absolute\", left: 0, right: 0, height: 2, display: \"none\", zIndex: 4, pointerEvents: \"none\" }}\n />\n ) : null;\n\n return { on, handleColumn, renderHandle, indicator };\n}\n", "/**\n * mui-virtual-data-table \uD654\uBA74 \uBB38\uAD6C \uB2E4\uAD6D\uC5B4(2026-10-26).\n *\n * \uBB38\uAD6C\uB294 ./mui-virtual-data-table/<\uC5B8\uC5B4>.json(\uD3C9\uD3C9\uD55C { \uC5F4\uC1E0: \uAE00 }). ko \u00B7 en \uC740 \uC190\uC73C\uB85C, \uB098\uBA38\uC9C0\uB294 \uC5C5\uBB34\uD568 www/scripts/i18n-translate.mjs \uB85C \uCC44\uC6B4\uB2E4.\n * \uAE30\uBCF8 \uC5B8\uC5B4\uB294 \uD55C\uAD6D\uC5B4 \u2014 \uC571\uC774 setMuiVirtualDataTableLocale(lang) \uC744 \uBD80\uB974\uBA74 \uADF8 \uC5B8\uC5B4\uB85C \uBC14\uAFB8\uACE0, \uADF8 \uBB38\uAD6C\uB97C \uC4F0\uB294 \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uB2E4\uC2DC \uADF8\uB9B0\uB2E4.\n * \uBAA8\uB974\uB294 \uC5B8\uC5B4\uBA74 \uC601\uC5B4. \uC5F4\uC1E0\uAC00 \uADF8 \uC5B8\uC5B4\uC5D0 \uC5C6\uC73C\uBA74 \uC601\uC5B4 \u2192 \uD55C\uAD6D\uC5B4 \u2192 \uC5F4\uC1E0 \uC21C\uC73C\uB85C \uCC3E\uB294\uB2E4.\n */\nimport { useCallback, useSyncExternalStore } from \"react\";\nimport ko from \"./mui-virtual-data-table/ko.json\";\nimport en from \"./mui-virtual-data-table/en.json\";\nimport ja from \"./mui-virtual-data-table/ja.json\";\nimport zh from \"./mui-virtual-data-table/zh.json\";\nimport de from \"./mui-virtual-data-table/de.json\";\nimport fr from \"./mui-virtual-data-table/fr.json\";\nimport it from \"./mui-virtual-data-table/it.json\";\nimport vi from \"./mui-virtual-data-table/vi.json\";\n\n/** \uC774 \uD328\uD0A4\uC9C0\uAC00 \uC544\uB294 \uD654\uBA74 \uC5B8\uC5B4 */\nexport type MuiVirtualDataTableLang = \"ko\" | \"en\" | \"ja\" | \"zh\" | \"de\" | \"fr\" | \"it\" | \"vi\";\n\ntype Dict = Record<string, string>;\nconst DICTS: Record<MuiVirtualDataTableLang, Dict> = { ko, en, ja, zh, de, fr, it, vi };\nconst INTL_TAGS: Record<MuiVirtualDataTableLang, string> = { ko: \"ko-KR\", en: \"en-US\", ja: \"ja-JP\", zh: \"zh-CN\", de: \"de-DE\", fr: \"fr-FR\", it: \"it-IT\", vi: \"vi-VN\" };\n\nlet current: MuiVirtualDataTableLang = \"ko\";\nconst listeners = new Set<() => void>();\n\n/** \"en-US\" \u00B7 \"zh_CN\" \uAC19\uC740 \uAC12\uC744 \uC544\uB294 \uC5B8\uC5B4\uB85C \u2014 \uBAA8\uB974\uBA74 \uC601\uC5B4 */\nexport function normalizeLang(lang?: string | null): MuiVirtualDataTableLang {\n const base = String(lang ?? \"\").toLowerCase().split(/[-_]/)[0];\n return (base in DICTS ? base : \"en\") as MuiVirtualDataTableLang;\n}\n\n/** \uD654\uBA74 \uC5B8\uC5B4\uB97C \uC815\uD55C\uB2E4(\uC571 \uC804\uC5ED \u2014 \uC571\uC774 \uC5B8\uC5B4\uB97C \uBC14\uAFC0 \uB54C\uB9C8\uB2E4 \uBD80\uB978\uB2E4). */\nexport function setMuiVirtualDataTableLocale(lang: string): void {\n const next = normalizeLang(lang);\n if (next === current) return;\n current = next;\n listeners.forEach((fn) => fn());\n}\n\n/** \uC9C0\uAE08 \uD654\uBA74 \uC5B8\uC5B4 */\nexport function getMuiVirtualDataTableLocale(): MuiVirtualDataTableLang {\n return current;\n}\n\nfunction subscribe(fn: () => void): () => void {\n listeners.add(fn);\n return () => {\n listeners.delete(fn);\n };\n}\n\nexport type TParams = Record<string, string | number | null | undefined>;\n\n/** \uC5F4\uC1E0 \u2192 \uAE00. lang \uC744 \uC8FC\uBA74 \uADF8 \uC5B8\uC5B4(\uCEF4\uD3EC\uB10C\uD2B8 locale prop), \uC544\uB2C8\uBA74 \uC804\uC5ED \uC5B8\uC5B4. {{x}} \uC5D0 params \uB97C \uB123\uB294\uB2E4. */\nexport function t(key: string, params?: TParams, lang?: string | null): string {\n const l = lang ? normalizeLang(lang) : current;\n const raw = DICTS[l][key] ?? DICTS.en[key] ?? DICTS.ko[key] ?? key;\n if (!params) return raw;\n return raw.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (m, name) => (params[name] == null ? m : String(params[name])));\n}\n\n/** Intl \uC5D0 \uC904 \uC5B8\uC5B4 \uD0DC\uADF8(\uB0A0\uC9DC \u00B7 \uC22B\uC790) */\nexport function intlTag(lang?: string | null): string {\n return INTL_TAGS[lang ? normalizeLang(lang) : current];\n}\n\n/** \uCEF4\uD3EC\uB10C\uD2B8\uC6A9 \u2014 \uC804\uC5ED \uC5B8\uC5B4\uAC00 \uBC14\uB00C\uBA74 \uB2E4\uC2DC \uADF8\uB9B0\uB2E4. localeProp \uC744 \uC8FC\uBA74 \uADF8\uAC83\uC774 \uC774\uAE34\uB2E4. */\nexport function useI18n(localeProp?: string | null) {\n const globalLang = useSyncExternalStore(subscribe, getMuiVirtualDataTableLocale, getMuiVirtualDataTableLocale);\n const lang: MuiVirtualDataTableLang = localeProp ? normalizeLang(localeProp) : globalLang;\n const tt = useCallback((key: string, params?: TParams) => t(key, params, lang), [lang]);\n return { t: tt, lang, intlTag: INTL_TAGS[lang] };\n}\n", "{\n \"clearFilter\": \"\uAC70\uB974\uAE30 \uD480\uAE30\",\n \"clearSort\": \"\uC815\uB82C \uD480\uAE30\",\n \"noMatches\": \"\uCC3E\uB294 \uAC12\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.\",\n \"noOptions\": \"\uACE0\uB97C \uAC12\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.\",\n \"reorderHandle\": \"\uC21C\uC11C \uC62E\uAE30\uAE30\",\n \"search\": \"\uCC3E\uAE30\",\n \"sortAscending\": \"\uC624\uB984\uCC28\uC21C \uC815\uB82C\",\n \"sortDescending\": \"\uB0B4\uB9BC\uCC28\uC21C \uC815\uB82C\"\n}\n", "{\n \"clearFilter\": \"Clear filter\",\n \"clearSort\": \"Clear sort\",\n \"noMatches\": \"No matching values.\",\n \"noOptions\": \"No values to choose from.\",\n \"reorderHandle\": \"Drag to reorder\",\n \"search\": \"Search\",\n \"sortAscending\": \"Sort ascending\",\n \"sortDescending\": \"Sort descending\"\n}\n", "{\n \"clearFilter\": \"\u30D5\u30A3\u30EB\u30BF\u30FC\u89E3\u9664\",\n \"clearSort\": \"\u4E26\u3079\u66FF\u3048\u89E3\u9664\",\n \"noMatches\": \"\u4E00\u81F4\u3059\u308B\u9805\u76EE\u304C\u3042\u308A\u307E\u305B\u3093\u3002\",\n \"noOptions\": \"\u9078\u629E\u53EF\u80FD\u306A\u9805\u76EE\u304C\u3042\u308A\u307E\u305B\u3093\u3002\",\n \"reorderHandle\": \"\u30C9\u30E9\u30C3\u30B0\u3057\u3066\u4E26\u3079\u66FF\u3048\",\n \"search\": \"\u691C\u7D22\",\n \"sortAscending\": \"\u6607\u9806\u3067\u4E26\u3079\u66FF\u3048\",\n \"sortDescending\": \"\u964D\u9806\u3067\u4E26\u3079\u66FF\u3048\"\n}\n", "{\n \"clearFilter\": \"\u6E05\u9664\u7B5B\u9009\",\n \"clearSort\": \"\u6E05\u9664\u6392\u5E8F\",\n \"noMatches\": \"\u672A\u627E\u5230\u5339\u914D\u9879\u3002\",\n \"noOptions\": \"\u6682\u65E0\u53EF\u9009\u5185\u5BB9\u3002\",\n \"reorderHandle\": \"\u62D6\u52A8\u8C03\u6574\u987A\u5E8F\",\n \"search\": \"\u641C\u7D22\",\n \"sortAscending\": \"\u5347\u5E8F\u6392\u5E8F\",\n \"sortDescending\": \"\u964D\u5E8F\u6392\u5E8F\"\n}\n", "{\n \"clearFilter\": \"Filter zur\u00FCcksetzen\",\n \"clearSort\": \"Sortierung zur\u00FCcksetzen\",\n \"noMatches\": \"Keine passenden Werte.\",\n \"noOptions\": \"Keine Werte zur Auswahl.\",\n \"reorderHandle\": \"Ziehen zum Neuanordnen\",\n \"search\": \"Suchen\",\n \"sortAscending\": \"Aufsteigend sortieren\",\n \"sortDescending\": \"Absteigend sortieren\"\n}\n", "{\n \"clearFilter\": \"Effacer le filtre\",\n \"clearSort\": \"Effacer le tri\",\n \"noMatches\": \"Aucune valeur correspondante.\",\n \"noOptions\": \"Aucune option disponible.\",\n \"reorderHandle\": \"Glisser pour r\u00E9organiser\",\n \"search\": \"Rechercher\",\n \"sortAscending\": \"Tri croissant\",\n \"sortDescending\": \"Tri d\u00E9croissant\"\n}\n", "{\n \"clearFilter\": \"Cancella filtro\",\n \"clearSort\": \"Annulla ordinamento\",\n \"noMatches\": \"Nessun valore corrispondente.\",\n \"noOptions\": \"Nessuna opzione disponibile.\",\n \"reorderHandle\": \"Trascina per riordinare\",\n \"search\": \"Cerca\",\n \"sortAscending\": \"Ordina in ordine crescente\",\n \"sortDescending\": \"Ordina in ordine decrescente\"\n}\n", "{\n \"clearFilter\": \"X\u00F3a b\u1ED9 l\u1ECDc\",\n \"clearSort\": \"B\u1ECF s\u1EAFp x\u1EBFp\",\n \"noMatches\": \"Kh\u00F4ng t\u00ECm th\u1EA5y gi\u00E1 tr\u1ECB ph\u00F9 h\u1EE3p.\",\n \"noOptions\": \"Kh\u00F4ng c\u00F3 gi\u00E1 tr\u1ECB \u0111\u1EC3 ch\u1ECDn.\",\n \"reorderHandle\": \"K\u00E9o \u0111\u1EC3 \u0111\u1ED5i th\u1EE9 t\u1EF1\",\n \"search\": \"T\u00ECm ki\u1EBFm\",\n \"sortAscending\": \"S\u1EAFp x\u1EBFp t\u0103ng d\u1EA7n\",\n \"sortDescending\": \"S\u1EAFp x\u1EBFp gi\u1EA3m d\u1EA7n\"\n}\n", "/**\n * columnReorder.tsx \u2014 \uBA38\uB9AC \uCE78 \uAE38\uAC8C \uB20C\uB7EC \uC5F4 \uC21C\uC11C \uBC14\uAFB8\uAE30(1.12.0, 2026-11-14)\n *\n * \uBA38\uB9AC \uCE78(th)\uC744 holdMs(\uAE30\uBCF8 400ms) \uB3D9\uC548 \uB204\uB974\uACE0 \uC788\uC73C\uBA74 \uADF8 \uC5F4\uC744 \uB4E4\uACE0, \uC88C\uC6B0\uB85C \uB04C\uBA74 \uB193\uC744 \uC790\uB9AC\uC5D0 \uC138\uB85C\uC120\uC744 \uAE0B\uACE0, \uB193\uC73C\uBA74 \uC0C8 \uC21C\uC11C\uB97C \uC54C\uB9B0\uB2E4.\n * \uB204\uB978 \uCC44 holdMs \uC804\uC5D0 \uC190\uC774 THRESHOLD_PX \uB118\uAC8C \uC6C0\uC9C1\uC774\uBA74 \uB04C\uAE30\uAC00 \uC544\uB2C8\uB2E4 \u2014 \uC815\uB82C \uD074\uB9AD \u00B7 \uAE00\uC790 \uACE0\uB974\uAE30 \u00B7 \uC190\uAC00\uB77D \uAD74\uB9AC\uAE30\uAC00 \uC608\uC804 \uADF8\uB300\uB85C \uB41C\uB2E4.\n * \uB044\uB294 \uB3D9\uC548\uC740 th \uC18D\uC131 \u00B7 \uC120 \uC694\uC18C style \uB9CC \uBC14\uAFBC\uB2E4(React \uAC00 \uB2E4\uC2DC \uADF8\uB9AC\uC9C0 \uC54A\uB294\uB2E4). \uB193\uC744 \uB54C \uD55C \uBC88 \uC0C8 \uC21C\uC11C\uB97C \uB118\uAE34\uB2E4.\n * \uC62E\uAE38 \uC218 \uC5C6\uB294 \uC5F4: \uC904 \uC190\uC7A1\uC774 \uC5F4 \u00B7 \uACE0\uC815 \uC5F4(pinned) \u00B7 reorderable: false \uC5F4(\uC120\uD0DD \uCE78 \uB4F1). \uBB36\uC74C \uBA38\uB9AC(group)\uAC00 \uC788\uC73C\uBA74 \uAC19\uC740 \uBB36\uC74C \uC548\uC5D0\uC11C\uB9CC \uC62E\uAE34\uB2E4.\n */\nimport React, { useCallback, useEffect, useRef } from \"react\";\nimport type { DataColumn, VDTColumnReorderConfig } from \"./types\";\nimport { REORDER_COLUMN_ID } from \"./rowReorder\";\n\n/** \uAE38\uAC8C \uB204\uB974\uAE30 \uAE30\uBCF8 \uC2DC\uAC04 ms */\nconst DEFAULT_HOLD_MS = 400;\n/** \uAE38\uAC8C \uB204\uB974\uAE30 \uC804\uC5D0 \uC774\uB9CC\uD07C \uC6C0\uC9C1\uC774\uBA74 \uB04C\uAE30\uB97C \uADF8\uB9CC\uB454\uB2E4(\uD074\uB9AD \u00B7 \uACE0\uB974\uAE30 \u00B7 \uAD74\uB9AC\uAE30\uB85C \uBCF8\uB2E4) px */\nconst THRESHOLD_PX = 6;\n/** \uC790\uB3D9 \uAC00\uB85C \uC2A4\uD06C\uB864\uC774 \uC2DC\uC791\uB418\uB294 \uAC00\uC7A5\uC790\uB9AC \uD3ED px */\nconst EDGE_PX = 40;\n/** \uC790\uB3D9 \uAC00\uB85C \uC2A4\uD06C\uB864 \uCD5C\uB300 \uC18D\uB3C4 px/\uD504\uB808\uC784 */\nconst EDGE_SPEED = 14;\n/** \uB04C\uAE30\uB97C \uB9C8\uCE5C \uB4A4 \uB4A4\uB530\uB974\uB294 click \uC744 \uC0BC\uD0A4\uB294 \uC2DC\uAC04 ms(\uD130\uCE58\uB294 click \uC774 \uB2A6\uAC8C \uC628\uB2E4) */\nconst SWALLOW_CLICK_MS = 400;\n\n/** \uC5F4 \uD0A4 \u2014 \uC21C\uC11C \uBC30\uC5F4 \u00B7 th \uC18D\uC131\uC5D0 \uC4F4\uB2E4 */\nexport const columnKey = (col: DataColumn<unknown> | DataColumn<any>) => String(col.id);\n\n/** \uC774 \uC5F4\uC744 \uC62E\uAE38 \uC218 \uC788\uB098 \u2014 \uC190\uC7A1\uC774 \uC5F4 \u00B7 \uACE0\uC815 \uC5F4 \u00B7 reorderable: false \uB294 \uC81C\uC790\uB9AC */\nexport function isColumnMovable<T>(col: DataColumn<T>): boolean {\n return col.id !== REORDER_COLUMN_ID && col.pinned !== \"left\" && col.reorderable !== false;\n}\n\n/**\n * \uC21C\uC11C \uBC30\uC5F4\uC744 \uC5F4\uC5D0 \uC785\uD78C\uB2E4. \uC62E\uAE38 \uC218 \uC788\uB294 \uC5F4\uC774 \uC11C \uC788\uB358 \uC790\uB9AC\uB4E4\uC744, \uAC19\uC740 \uBB36\uC74C(group) \uC548\uC5D0\uC11C \uC21C\uC11C \uBC30\uC5F4 \uC21C\uC73C\uB85C \uB2E4\uC2DC \uCC44\uC6B4\uB2E4 \u2014\n * \uC21C\uC11C \uBC30\uC5F4\uC5D0 \uC5C6\uB294 \uC5F4 \u00B7 \uC62E\uAE38 \uC218 \uC5C6\uB294 \uC5F4\uC740 \uC81C\uC790\uB9AC\uC5D0 \uB0A8\uACE0, \uBAA8\uB974\uB294 \uD0A4\uB294 \uBC84\uB9B0\uB2E4. \uC21C\uC11C \uBC30\uC5F4\uC774 \uAC19\uC740 \uACB0\uACFC\uBA74 \uC6D0\uB798 \uBC30\uC5F4\uC744 \uADF8\uB300\uB85C \uB3CC\uB824\uC900\uB2E4.\n */\nexport function applyColumnOrder<T>(columns: DataColumn<T>[], order: string[] | null | undefined): DataColumn<T>[] {\n if (!order || order.length === 0) return columns;\n const rank = new Map<string, number>();\n order.forEach((key, i) => {\n if (!rank.has(key)) rank.set(key, i);\n });\n const result = columns.slice();\n const groups = new Map<string, number[]>(); // \uBB36\uC74C \u2192 \uC62E\uAE38 \uC5F4\uC774 \uC120 \uC790\uB9AC\uB4E4\n columns.forEach((col, i) => {\n if (!isColumnMovable(col) || !rank.has(columnKey(col))) return;\n const g = col.group ?? \"\";\n const slots = groups.get(g);\n if (slots) slots.push(i);\n else groups.set(g, [i]);\n });\n let changed = false;\n groups.forEach((slots) => {\n const sorted = slots\n .map((i) => columns[i])\n .sort((a, b) => (rank.get(columnKey(a)) as number) - (rank.get(columnKey(b)) as number));\n slots.forEach((slot, k) => {\n if (result[slot] !== sorted[k]) changed = true;\n result[slot] = sorted[k];\n });\n });\n return changed ? result : columns;\n}\n\n/** \uAC00\uC7A5 \uAC00\uAE4C\uC6B4 \uAC00\uB85C\uB85C \uAD74\uB9AC\uB294 \uC870\uC0C1 */\nfunction nearestScrollableX(el: HTMLElement | null): HTMLElement | null {\n for (let e = el; e; e = e.parentElement) {\n const { overflowX } = getComputedStyle(e);\n if ((overflowX === \"auto\" || overflowX === \"scroll\") && e.scrollWidth > e.clientWidth) return e;\n }\n return null;\n}\n\ninterface Pending {\n key: string;\n group: string;\n th: HTMLElement;\n pointerId: number;\n startX: number;\n startY: number;\n x: number;\n dragging: boolean; // \uAE38\uAC8C \uB204\uB974\uAE30\uAC00 \uB05D\uB098 \uC5F4\uC744 \uB4E4\uC5C8\uB098\n cancelled: boolean; // Esc \uB85C \uADF8\uB9CC\uB480\uB2E4 \u2014 \uB193\uC744 \uB54C click \uB9CC \uC0BC\uD0A8\uB2E4\n before: string | null; // \uB193\uC73C\uBA74 \uC774 \uC5F4 \uC55E\uC5D0 \uC120\uB2E4(null \uC774\uBA74 \uB05D \u2014 afterLast)\n afterLast: string | null; // \uAC19\uC740 \uBB36\uC74C \uB9C8\uC9C0\uB9C9 \uC5F4 \uD0A4\n timer: number;\n}\n\nexport interface UseColumnReorderArgs<T> {\n /** \uCF1C\uC84C\uB098(\uD3F0 \uBAA9\uB85D\uC774\uBA74 \uB048\uB2E4) */\n on: boolean;\n config: VDTColumnReorderConfig | null;\n tableBoxRef: React.RefObject<HTMLElement | null>; // \uD45C \uC0C1\uC790(position: relative) \u2014 \uC120\uC744 \uC774 \uC548\uC5D0 \uADF8\uB9B0\uB2E4\n /** \uC9C0\uAE08 \uADF8\uB824\uC9C4 \uC21C\uC11C\uC758 \uC18C\uBE44\uCC98 \uC5F4(\uC190\uC7A1\uC774 \uC5F4 \uC81C\uC678) */\n columnsRef: React.RefObject<DataColumn<T>[]>;\n /** \uB193\uC558\uC744 \uB54C \u2014 \uC0C8 \uC21C\uC11C(\uBAA8\uB4E0 \uC5F4 \uD0A4) */\n onCommit: (order: string[]) => void;\n}\n\n/**\n * \uBA38\uB9AC \uCE78 \uAE38\uAC8C \uB20C\uB7EC \uC5F4 \uC62E\uAE30\uAE30 \u2014 \uBA38\uB9AC \uCE78\uC5D0 \uC5B9\uC744 \uC18D\uC131\uACFC \uD45C \uC0C1\uC790\uC5D0 \uB123\uC744 \uC120 \uC694\uC18C\uB97C \uB3CC\uB824\uC900\uB2E4.\n * \uD3EC\uC778\uD130 \uCC98\uB9AC\uB294 ref \uB85C \uD574 \uB044\uB294 \uB3D9\uC548 React \uAC00 \uB2E4\uC2DC \uADF8\uB9AC\uC9C0 \uC54A\uB294\uB2E4.\n */\nexport function useColumnReorder<T>({ on, config, tableBoxRef, columnsRef, onCommit }: UseColumnReorderArgs<T>) {\n const holdMs = config?.holdMs ?? DEFAULT_HOLD_MS;\n const holdMsRef = useRef(holdMs);\n holdMsRef.current = holdMs;\n const onCommitRef = useRef(onCommit);\n onCommitRef.current = onCommit;\n const pendingRef = useRef<Pending | null>(null);\n const indicatorRef = useRef<HTMLDivElement | null>(null);\n const rafRef = useRef(0);\n const detachRef = useRef<(() => void) | null>(null);\n\n /** \uAC19\uC740 \uBB36\uC74C\uC758 \uC62E\uAE38 \uC218 \uC788\uB294 \uBA38\uB9AC \uCE78\uB4E4(\uC67C\uCABD\uBD80\uD130) */\n const candidateCells = useCallback(\n (group: string) => {\n const box = tableBoxRef.current;\n if (!box) return [] as { key: string; th: HTMLElement; rect: DOMRect }[];\n return Array.from(box.querySelectorAll<HTMLElement>(\"thead th[data-vdt-colkey]\"))\n .filter((th) => (th.getAttribute(\"data-vdt-colgroup\") ?? \"\") === group)\n .map((th) => ({ key: th.getAttribute(\"data-vdt-colkey\") as string, th, rect: th.getBoundingClientRect() }))\n .sort((a, b) => a.rect.left - b.rect.left);\n },\n [tableBoxRef],\n );\n\n /** \uD3EC\uC778\uD130 x \uB85C \uB193\uC744 \uC790\uB9AC\uB97C \uC815\uD558\uACE0 \uC138\uB85C\uC120\uC744 \uAE0B\uB294\uB2E4 */\n const updateTarget = useCallback(() => {\n const p = pendingRef.current;\n const box = tableBoxRef.current;\n const ind = indicatorRef.current;\n if (!p || !p.dragging || !box) return;\n const cells = candidateCells(p.group);\n if (cells.length === 0) return;\n let idx = cells.findIndex((c) => p.x < c.rect.left + c.rect.width / 2);\n if (idx < 0) idx = cells.length;\n p.before = idx < cells.length ? cells[idx].key : null;\n p.afterLast = cells[cells.length - 1].key;\n // \uC81C\uC790\uB9AC(\uC790\uAE30 \uC55E \u00B7 \uC790\uAE30 \uBC14\uB85C \uB4A4)\uBA74 \uC120\uC744 \uAC10\uCD98\uB2E4\n const self = cells.findIndex((c) => c.key === p.key);\n if (!ind) return;\n if (idx === self || idx === self + 1) {\n ind.style.display = \"none\";\n return;\n }\n const b = box.getBoundingClientRect();\n const x = idx < cells.length ? cells[idx].rect.left : cells[cells.length - 1].rect.right;\n ind.style.left = `${Math.max(0, Math.min(b.width - 2, Math.round(x - b.left) - 1))}px`;\n ind.style.display = \"block\";\n }, [tableBoxRef, candidateCells]);\n\n /** \uAC00\uC7A5\uC790\uB9AC \uC790\uB3D9 \uAC00\uB85C \uC2A4\uD06C\uB864 \u2014 \uB113\uC740 \uD45C\uC5D0\uC11C \uBCF4\uC774\uC9C0 \uC54A\uB294 \uC790\uB9AC\uB85C \uC62E\uAE38 \uB54C */\n const autoScroll = useCallback(() => {\n cancelAnimationFrame(rafRef.current);\n const step = () => {\n const p = pendingRef.current;\n if (!p || !p.dragging) return;\n const scroller = nearestScrollableX(p.th);\n if (!scroller) return;\n const r = scroller.getBoundingClientRect();\n let dx = 0;\n if (p.x < r.left + EDGE_PX) dx = -Math.ceil(((r.left + EDGE_PX - p.x) / EDGE_PX) * EDGE_SPEED);\n else if (p.x > r.right - EDGE_PX) dx = Math.ceil(((p.x - (r.right - EDGE_PX)) / EDGE_PX) * EDGE_SPEED);\n if (dx === 0) return;\n const before = scroller.scrollLeft;\n scroller.scrollLeft += dx;\n if (scroller.scrollLeft === before) return;\n updateTarget();\n rafRef.current = requestAnimationFrame(step);\n };\n rafRef.current = requestAnimationFrame(step);\n }, [updateTarget]);\n\n /** \uB05D \u2014 \uB4E4\uC5C8\uB358 \uC5F4\uC774\uBA74 \uB4A4\uB530\uB974\uB294 click(\uC815\uB82C \u00B7 \uBA38\uB9AC \uD074\uB9AD)\uC744 \uD55C \uBC88 \uC0BC\uD0A8\uB2E4 */\n const finish = useCallback((commit: boolean) => {\n const p = pendingRef.current;\n if (!p) return;\n pendingRef.current = null;\n window.clearTimeout(p.timer);\n cancelAnimationFrame(rafRef.current);\n detachRef.current?.();\n detachRef.current = null;\n if (indicatorRef.current) indicatorRef.current.style.display = \"none\";\n p.th.removeAttribute(\"data-vdt-col-dragging\");\n tableBoxRef.current?.removeAttribute(\"data-vdt-col-reordering\");\n if (!p.dragging) return;\n document.body.style.userSelect = \"\";\n if (commit) {\n const swallow = (ce: MouseEvent) => {\n ce.stopPropagation();\n ce.preventDefault();\n window.removeEventListener(\"click\", swallow, true);\n };\n window.addEventListener(\"click\", swallow, true);\n window.setTimeout(() => window.removeEventListener(\"click\", swallow, true), SWALLOW_CLICK_MS);\n const target = p.before ?? null;\n if (target === p.key) return;\n const keys = (columnsRef.current ?? []).map((c) => String(c.id));\n const from = keys.indexOf(p.key);\n if (from < 0) return;\n const next = keys.slice();\n next.splice(from, 1);\n if (target !== null) {\n const at = next.indexOf(target);\n if (at < 0) return;\n next.splice(at, 0, p.key);\n } else {\n const at = p.afterLast ? next.indexOf(p.afterLast) : -1;\n if (at < 0) return;\n next.splice(at + 1, 0, p.key);\n }\n // \uC62E\uAE38 \uC218 \uC5C6\uB294 \uC5F4\uC740 \uC81C\uC790\uB9AC \u2014 \uC2E4\uC81C\uB85C \uADF8\uB824\uC9C8 \uC21C\uC11C\uB85C \uB9DE\uCDB0 \uC54C\uB9B0\uB2E4\n const ordered = applyColumnOrder(columnsRef.current ?? [], next).map((c) => String(c.id));\n if (ordered.join(\"\\u0000\") === keys.join(\"\\u0000\")) return;\n onCommitRef.current(ordered);\n }\n }, [tableBoxRef, columnsRef]);\n\n // \uD45C\uAC00 \uC0AC\uB77C\uC9C0\uAC70\uB098 \uAE30\uB2A5\uC774 \uAEBC\uC9C0\uBA74 \uD558\uB358 \uAC83\uC744 \uC811\uB294\uB2E4\n useEffect(() => {\n if (!on) finish(false);\n return () => finish(false);\n }, [on, finish]);\n\n /** \uBA38\uB9AC \uCE78 pointerdown \u2014 \uAE38\uAC8C \uB204\uB974\uAE30\uB97C \uC7B0\uB2E4. \uAE30\uBCF8 \uB3D9\uC791(\uD074\uB9AD \u00B7 \uACE0\uB974\uAE30)\uC740 \uB9C9\uC9C0 \uC54A\uB294\uB2E4 */\n const onHeaderPointerDown = useCallback(\n (col: DataColumn<T>, e: React.PointerEvent<HTMLTableCellElement>) => {\n if (pendingRef.current) finish(false);\n if (e.pointerType === \"mouse\" && e.button !== 0) return;\n if (e.defaultPrevented) return;\n const target = e.target as HTMLElement | null;\n // \uC5F4 \uD3ED \uC190\uC7A1\uC774 \u00B7 \uC785\uB825 \uCE78\uC740 \uC81C \uC77C\uC744 \uD55C\uB2E4\n if (target?.closest?.(\"[data-vdt-resize], input, textarea, select, [contenteditable='true']\")) return;\n const th = e.currentTarget;\n const p: Pending = {\n key: String(col.id),\n group: col.group ?? \"\",\n th,\n pointerId: e.pointerId,\n startX: e.clientX,\n startY: e.clientY,\n x: e.clientX,\n dragging: false,\n cancelled: false,\n before: null,\n afterLast: null,\n timer: 0,\n };\n pendingRef.current = p;\n\n const move = (ev: PointerEvent) => {\n if (ev.pointerId !== p.pointerId || pendingRef.current !== p) return;\n if (!p.dragging) {\n if (Math.hypot(ev.clientX - p.startX, ev.clientY - p.startY) > THRESHOLD_PX) finish(false);\n return;\n }\n if (p.cancelled) return;\n p.x = ev.clientX;\n updateTarget();\n autoScroll();\n };\n const up = (ev: PointerEvent) => {\n if (ev.pointerId !== p.pointerId || pendingRef.current !== p) return;\n // Esc \uB85C \uADF8\uB9CC\uB480\uC5B4\uB3C4 \uB193\uC744 \uB54C click \uC740 \uC0BC\uD0A8\uB2E4(\uC815\uB82C\uC774 \uB418\uC9C0 \uC54A\uAC8C) \u2014 \uC21C\uC11C\uB294 \uADF8\uB300\uB85C\n if (p.cancelled) p.before = p.key;\n finish(ev.type === \"pointerup\");\n };\n const key = (ev: KeyboardEvent) => {\n if (ev.key !== \"Escape\" || pendingRef.current !== p) return;\n if (!p.dragging) {\n finish(false);\n return;\n }\n ev.preventDefault();\n p.cancelled = true;\n if (indicatorRef.current) indicatorRef.current.style.display = \"none\";\n p.th.removeAttribute(\"data-vdt-col-dragging\");\n tableBoxRef.current?.removeAttribute(\"data-vdt-col-reordering\");\n cancelAnimationFrame(rafRef.current);\n };\n // \uD130\uCE58 \uAE38\uAC8C \uB204\uB974\uAE30\uB294 \uBE0C\uB77C\uC6B0\uC800 \uBA54\uB274(\uBA38\uB9AC \uC6B0\uD074\uB9AD \uBA54\uB274)\uB97C \uBD80\uB978\uB2E4 \u2014 \uB204\uB974\uB294 \uB3D9\uC548\uC740 \uB9C9\uB294\uB2E4\n const ctx = (ev: Event) => {\n if (pendingRef.current !== p) return;\n if (p.dragging || e.pointerType !== \"mouse\") {\n ev.preventDefault();\n ev.stopPropagation();\n }\n };\n // \uB4E0 \uB4A4\uC5D0\uB294 \uC190\uAC00\uB77D \uAD74\uB9AC\uAE30 \u00B7 \uAE00\uC790 \uACE0\uB974\uAE30\uB97C \uB9C9\uB294\uB2E4\n const touchMove = (ev: TouchEvent) => {\n if (pendingRef.current === p && p.dragging) ev.preventDefault();\n };\n const selectStart = (ev: Event) => {\n if (pendingRef.current === p && p.dragging) ev.preventDefault();\n };\n window.addEventListener(\"pointermove\", move);\n window.addEventListener(\"pointerup\", up);\n window.addEventListener(\"pointercancel\", up);\n window.addEventListener(\"keydown\", key, true);\n window.addEventListener(\"contextmenu\", ctx, true);\n window.addEventListener(\"touchmove\", touchMove, { passive: false });\n document.addEventListener(\"selectstart\", selectStart);\n detachRef.current = () => {\n window.removeEventListener(\"pointermove\", move);\n window.removeEventListener(\"pointerup\", up);\n window.removeEventListener(\"pointercancel\", up);\n window.removeEventListener(\"keydown\", key, true);\n window.removeEventListener(\"contextmenu\", ctx, true);\n window.removeEventListener(\"touchmove\", touchMove);\n document.removeEventListener(\"selectstart\", selectStart);\n };\n\n p.timer = window.setTimeout(() => {\n if (pendingRef.current !== p) return;\n p.dragging = true;\n th.setAttribute(\"data-vdt-col-dragging\", \"\");\n tableBoxRef.current?.setAttribute(\"data-vdt-col-reordering\", \"\");\n document.body.style.userSelect = \"none\";\n try {\n window.getSelection()?.removeAllRanges();\n } catch {\n /* \uACE0\uB974\uAE30\uB97C \uBABB \uC9C0\uC6CC\uB3C4 \uB04C\uAE30\uB294 \uC774\uC5B4 \uAC04\uB2E4 */\n }\n updateTarget();\n }, holdMsRef.current);\n },\n [finish, updateTarget, autoScroll, tableBoxRef],\n );\n\n /** \uBA38\uB9AC \uCE78\uC5D0 \uC5B9\uC744 \uC18D\uC131 \u2014 \uC62E\uAE38 \uC218 \uC5C6\uB294 \uC5F4\uC774\uBA74 \uC5C6\uB2E4(\uC18C\uBE44\uCC98 headerProps \uB97C \uADF8\uB300\uB85C \uB454\uB2E4) */\n const headerCellProps = useCallback(\n (col: DataColumn<T>): {\n \"data-vdt-colkey\"?: string;\n \"data-vdt-colgroup\"?: string;\n onPointerDown?: React.PointerEventHandler<HTMLTableCellElement>;\n } => {\n if (!on || !isColumnMovable(col)) return {};\n const own = col.headerProps?.onPointerDown;\n return {\n \"data-vdt-colkey\": String(col.id),\n \"data-vdt-colgroup\": col.group ?? \"\",\n onPointerDown: (e: React.PointerEvent<HTMLTableCellElement>) => {\n own?.(e);\n onHeaderPointerDown(col, e);\n },\n };\n },\n [on, onHeaderPointerDown],\n );\n\n /** \uB193\uC744 \uC790\uB9AC \uC138\uB85C\uC120 \u2014 \uD45C \uC0C1\uC790(position: relative) \uC548\uC5D0 \uB454\uB2E4 */\n const indicator = on ? (\n <div\n ref={indicatorRef}\n data-vdt-col-drop-indicator=\"\"\n aria-hidden\n style={{ position: \"absolute\", top: 0, bottom: 0, width: 2, display: \"none\", zIndex: 5, pointerEvents: \"none\" }}\n />\n ) : null;\n\n return { on, headerCellProps, indicator };\n}\n", "/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n", "/**\n * MIT License\n *\n * Copyright (c) 2025 KIM YOUNG JIN (ehfuse@gmail.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { CSSProperties, ReactNode, useEffect, useRef, useState } from \"react\";\nimport { Box, CircularProgress, SxProps, Theme } from \"@mui/material\";\n\nexport interface BackgroundConfig {\n show?: boolean;\n color?: string; // Any CSS color: hex (#fff, #ffffff), rgb(255,255,255), rgba(), named colors, or RGB string \"255, 255, 255\"\n opacity?: number; // Applied to background (0.0 ~ 1.0). If color is already rgba, this is ignored\n}\n\nexport interface LoadingProgressProps {\n visible: boolean;\n onComplete?: () => void;\n fadeoutDuration?: number;\n exitDelay?: number;\n size?: number;\n className?: string;\n style?: CSSProperties;\n sx?: SxProps<Theme>;\n indicator?: ReactNode | string;\n background?: BackgroundConfig;\n}\n\nexport default function LoadingProgress({\n visible,\n onComplete,\n fadeoutDuration = 200,\n exitDelay = 0,\n size = 40,\n className,\n style,\n sx,\n indicator,\n background = {\n show: true,\n color: \"255, 255, 255\",\n opacity: 0.9,\n },\n}: LoadingProgressProps) {\n const prevVisibleRef = useRef<boolean | undefined>(undefined);\n const boxRef = useRef<HTMLDivElement>(null);\n const [shouldRender, setShouldRender] = useState(visible);\n\n // 배경 설정 기본값 처리\n const {\n show: showBackground = true,\n color: backgroundColor = \"255, 255, 255\",\n opacity: backgroundOpacity = 0.9,\n } = background;\n\n useEffect(() => {\n const prevVisible = prevVisibleRef.current;\n\n // visible이 true에서 false로 변경될 때 페이드아웃 후 onComplete 호출\n if (prevVisible === true && visible === false && boxRef.current) {\n // CSS transition으로 페이드아웃 시작\n const box = boxRef.current;\n box.style.opacity = \"0\";\n\n // fadeoutDuration + exitDelay 후 onComplete 호출 및 언마운트\n setTimeout(() => {\n setShouldRender(false); // 페이드아웃 완료 후 언마운트\n onComplete?.();\n }, fadeoutDuration + exitDelay);\n } else if (visible === true) {\n // visible이 true가 되면 다시 렌더링하고 opacity 복원\n setShouldRender(true);\n if (boxRef.current) {\n boxRef.current.style.opacity = \"1\";\n }\n }\n\n // 현재 visible 값을 ref에 저장\n prevVisibleRef.current = visible;\n }, [visible, onComplete, fadeoutDuration, exitDelay]);\n\n if (!shouldRender) {\n return null;\n }\n\n // indicator 렌더링 로직\n const renderIndicator = () => {\n // string이면 이미지 URL로 간주\n if (typeof indicator === \"string\") {\n return (\n <img\n src={indicator}\n alt=\"Loading\"\n style={{ width: size, height: size }}\n />\n );\n }\n // ReactNode가 제공되면 그대로 렌더링\n if (indicator) {\n return indicator;\n }\n // 기본값: MUI CircularProgress\n return <CircularProgress size={size} />;\n };\n\n // 배경색 처리: 다양한 색상 형식 지원\n const getBackgroundStyle = () => {\n if (!showBackground) {\n return { backgroundColor: \"transparent\" };\n }\n\n // 이미 rgba 형식이면 그대로 사용\n if (backgroundColor.startsWith(\"rgba\")) {\n return { backgroundColor };\n }\n\n // RGB 문자열 형식 (예: \"255, 255, 255\")\n if (/^\\d+,\\s*\\d+,\\s*\\d+$/.test(backgroundColor)) {\n return {\n backgroundColor: `rgba(${backgroundColor}, ${backgroundOpacity})`,\n };\n }\n\n // hex, rgb(), named color 등의 경우\n // CSS에서 color와 opacity를 함께 사용\n if (backgroundOpacity !== 1) {\n return {\n backgroundColor: backgroundColor,\n // 배경에만 opacity를 적용하기 위해 before pseudo-element 사용하거나\n // 직접 rgba로 변환하는 대신 CSS custom property 사용\n \"&::before\": {\n content: '\"\"',\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: backgroundColor,\n opacity: backgroundOpacity,\n zIndex: -1,\n },\n };\n }\n\n // opacity가 1이면 그냥 색상만\n return { backgroundColor };\n };\n\n return (\n <Box\n ref={boxRef}\n className={className}\n style={{ ...style }}\n sx={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 1000,\n opacity: visible ? 1 : 0,\n transition: `opacity ${fadeoutDuration}ms ease-out`,\n ...getBackgroundStyle(),\n ...sx,\n }}\n >\n {renderIndicator()}\n </Box>\n );\n}\n", "/**\n * \uC21C\uC218 CSS \uB85C\uB529 \uC2A4\uD53C\uB108. MUI CircularProgress \uB300\uC2E0 LoadingProgress \uC758 indicator \uB85C \uC8FC\uC785\uD55C\uB2E4.\n *\n * \uC2A4\uD0C0\uC77C\uC740 \uC790\uCCB4 <style> \uD074\uB798\uC2A4\uB85C \uC8FC\uC785\uD55C\uB2E4(\uC678\uBD80 \uC2A4\uD0C0\uC77C \uC758\uC874 \uC5C6\uC74C). \uBC30\uACBD \uB9C1(\uC5F0\uD55C \uD2B8\uB799)\uACFC\n * \uD68C\uC804 \uD638(\uC0C1\uB2E8 \uC0C9)\uB97C \uD55C \uD074\uB798\uC2A4\uC5D0 \uB2F4\uB294\uB2E4. \uC571 \uCD08\uAE30 \uC2A4\uD53C\uB108 \uBC0F \uB300\uC2DC\uBCF4\uB4DC \uB808\uC774\uC544\uC6C3 \uC2A4\uD53C\uB108\uC640 \uB3D9\uC77C\uD55C \uBAA8\uC591.\n */\nexport interface CssSpinnerProps {\n /** \uC2A4\uD53C\uB108 \uC9C0\uB984(px). \uAE30\uBCF8 54 */\n size?: number;\n}\n\nconst SPINNER_CSS = `\n.vdt-css-spinner{box-sizing:border-box;border-radius:50%;border:4px solid rgba(28,64,125,0.14);border-top-color:#1c407d;animation:vdt-css-spinner-spin .75s linear infinite}\n@keyframes vdt-css-spinner-spin{to{transform:rotate(360deg)}}\n`;\n\nexport function CssSpinner({ size = 54 }: CssSpinnerProps) {\n return (\n <>\n <style>{SPINNER_CSS}</style>\n <span\n className=\"vdt-css-spinner\"\n role=\"progressbar\"\n aria-label=\"loading\"\n style={{ display: \"inline-block\", width: size, height: size }}\n />\n </>\n );\n}\n\nexport default CssSpinner;\n", "/**\n * HeaderMenu.tsx - \uD45C \uBA38\uB9AC \uBA54\uB274 \uACF5\uC6A9 \uBD80\uD488(1.5.0)\n *\n * MIT License \u2014 Copyright (c) 2025 KIM YOUNG JIN (ehfuse@gmail.com)\n *\n * \uBA38\uB9AC \uCE78\uC758 \uC815\uB82C \u00B7 \uAC70\uB974\uAE30 \uBA54\uB274\uB97C \uD55C \uBC8C\uB85C \uB454\uB2E4. \uD654\uBA74\uB9C8\uB2E4(\uACE0\uAC1D \u00B7 \uACC4\uC57D \u00B7 \uC5C5\uBB34\uD568 \u00B7 \uC6D4\uBCC4 \uD45C \u2026) \uBA54\uB274\uB97C \uB530\uB85C \uB9CC\uB4E4\uC5B4\n * \uAE00\uC790 \uD06C\uAE30 \u00B7 \uC904 \uB192\uC774 \u00B7 \uCCB4\uD06C \uBAA8\uC591\uC774 \uC81C\uAC01\uAC01\uC774\uC5C8\uB2E4(\uACE0\uAC1D \uBAA9\uB85D \uBA54\uB274\uB9CC \uAE00\uC790\uAC00 \uCEF8\uB2E4). \uD06C\uAE30 \uADDC\uCE59\uC740 \uC774 \uD30C\uC77C\uC758 \uC0C1\uC218 \uD55C \uACF3\uC5D0\uC11C \uC815\uD55C\uB2E4 \u2014\n * \uD56D\uBAA9 \uAE00\uC790 14px \u00B7 \uC544\uC774\uCF58 18px \u00B7 \uC904 \uB192\uC774 34px \u00B7 \uC88C\uC6B0 \uC5EC\uBC31 12px. \uD45C\uC758 \uB0B4\uC7A5 \uBA38\uB9AC \uBA54\uB274(\uC5F4 \uC635\uC158 filterOptions)\uB3C4 \uC774 \uBD80\uD488\uC73C\uB85C \uADF8\uB9B0\uB2E4.\n */\n\nimport React, { useMemo, useState } from \"react\";\nimport { Box, Divider, InputBase, Menu, MenuItem, SvgIcon, type SxProps, type Theme } from \"@mui/material\";\nimport { useI18n } from \"./i18n\";\n\n/** \uBA54\uB274 \uD06C\uAE30 \uADDC\uCE59 \u2014 \uBAA8\uB4E0 \uBA38\uB9AC \uBA54\uB274\uAC00 \uAC19\uC740 \uAC12\uC744 \uC4F4\uB2E4. */\nexport const HEADER_MENU_FONT_SIZE = 14;\nexport const HEADER_MENU_ICON_SIZE = 18;\nexport const HEADER_MENU_ITEM_HEIGHT = 34;\n\n/** \uBA54\uB274 \uC544\uC774\uCF58(Material \uACBD\uB85C) \u2014 @mui/icons-material \uC744 \uC758\uC874\uC131\uC73C\uB85C \uB4E4\uC774\uC9C0 \uC54A\uC73C\uB824\uACE0 \uACBD\uB85C\uB9CC \uC62E\uACA8 \uB454\uB2E4. */\nexport const HEADER_MENU_ICON_PATHS = {\n asc: \"M4 12l1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z\",\n desc: \"M20 12l-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z\",\n checked: \"M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\",\n unchecked: \"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\",\n radioOn: \"M12 7c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5zm0-5C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\",\n radioOff: \"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\",\n filter: \"M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z\",\n search: \"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\",\n};\n\n/** \uACBD\uB85C \uD558\uB098\uB85C \uADF8\uB9B0 \uC544\uC774\uCF58 \u2014 \uD06C\uAE30 \uAE30\uBCF8\uC740 \uBA54\uB274 \uC544\uC774\uCF58 \uD06C\uAE30. */\nexport function HeaderMenuIcon({ d, size = HEADER_MENU_ICON_SIZE, color }: { d: string; size?: number; color?: string }) {\n return (\n <SvgIcon sx={{ fontSize: size, flexShrink: 0, color }}>\n <path d={d} />\n </SvgIcon>\n );\n}\n\n/**\n * \uBA38\uB9AC \uCE78\uC758 \uAC70\uB974\uAE30 \uD45C\uC2DC(1.5.1) \u2014 @ehfuse/mui-filter-button \uC758 TuneIcon(\uC120 \uB450 \uC904 + \uB3D9\uADF8\uB77C\uBBF8 \uB450 \uAC1C)\uACFC \uAC19\uC740 \uADF8\uB9BC\uC774\uB2E4(\uCD9C\uCC98: mui-filter-button\n * src/icons/TuneIcon.tsx). \uBA38\uB9AC \uC904 \uD544\uD130 \uB2E8\uCD94\uC640 \uBA38\uB9AC \uCE78 \uAC70\uB974\uAE30\uAC00 \uAC19\uC740 \uBB3C\uAC74\uC73C\uB85C \uC77D\uD788\uAC8C \uADF8 \uC544\uC774\uCF58\uC744 \uC4F0\uB418, \uD45C\uAC00 \uADF8 \uD328\uD0A4\uC9C0\uC5D0 \uAE30\uB300\uC9C0 \uC54A\uAC8C \uACBD\uB85C\uB97C \uC62E\uACA8 \uB454\uB2E4.\n * \uC0C9\uC740 \uAE00\uC790\uC0C9\uC744 \uB530\uB978\uB2E4(currentColor) \u2014 \uD3C9\uC18C \uBA38\uB9AC \uAE00\uC790\uC0C9, \uAC78\uB9AC\uBA74 \uAC15\uC870\uC0C9(active). 14px \uC5D0\uC11C\uB294 1.5 \uAD75\uAE30\uAC00 \uC815\uB82C \uD654\uC0B4\uD45C(\uCC44\uC6B4 \uC544\uC774\uCF58)\uBCF4\uB2E4 \uAC00\uB298\uC5B4 \uBCF4\uC5EC 1.8 \uB85C \uB454\uB2E4.\n */\nexport function HeaderFilterIcon({ size = 14, active, color }: { size?: number; active?: boolean; color?: string }) {\n const stroke = { stroke: \"currentColor\", strokeWidth: 1.8, strokeMiterlimit: 10, strokeLinecap: \"round\" as const, strokeLinejoin: \"round\" as const };\n return (\n <Box\n component=\"svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden\n sx={{ width: size, height: size, flexShrink: 0, color: active ? \"primary.main\" : color ?? \"currentColor\", verticalAlign: \"middle\" }}\n >\n <path d=\"M2 17.5H7\" {...stroke} />\n <path d=\"M22 6.5H17\" {...stroke} />\n <path d=\"M13 17.5H22\" {...stroke} />\n <path d=\"M11 6.5H2\" {...stroke} />\n <path d=\"M10 20.3999C8.34315 20.3999 7 19.0568 7 17.3999C7 15.743 8.34315 14.3999 10 14.3999C11.6569 14.3999 13 15.743 13 17.3999C13 19.0568 11.6569 20.3999 10 20.3999Z\" {...stroke} />\n <path d=\"M14 9.3999C15.6569 9.3999 17 8.05676 17 6.3999C17 4.74305 15.6569 3.3999 14 3.3999C12.3431 3.3999 11 4.74305 11 6.3999C11 8.05676 12.3431 9.3999 14 9.3999Z\" {...stroke} />\n </Box>\n );\n}\n\n/** \uD56D\uBAA9 \uBAA8\uC591 \u2014 \uB2E4\uB978 \uBA54\uB274(\uB3C4\uAD6C \uC904 \uB2E8\uCD94 \uBA54\uB274 \uB4F1)\uB3C4 \uC774 sx \uB85C \uAC19\uC740 \uD06C\uAE30\uB97C \uC4F4\uB2E4. */\nexport const HEADER_MENU_ITEM_SX = {\n gap: 1,\n fontSize: HEADER_MENU_FONT_SIZE,\n // \uB192\uC774\uB294 \uC904 \uB192\uC774 + \uC704\uC544\uB798 \uC5EC\uBC31\uC73C\uB85C \uC815\uD55C\uB2E4(20 + 7 + 7 = 34) \u2014 MenuItem \uC758 \uB113\uC740 \uD654\uBA74 \uADDC\uCE59(min-height: auto)\uC774 \uBBF8\uB514\uC5B4 \uCFFC\uB9AC\uB77C\n // sx \uC758 minHeight \uB97C \uC774\uACA8 28px \uB85C \uC904\uC5C8\uB2E4(1.5.2).\n lineHeight: \"20px\",\n minHeight: HEADER_MENU_ITEM_HEIGHT,\n py: \"7px\",\n px: 1.5,\n} as const;\n\nexport interface HeaderMenuItemProps {\n /** \uC55E \uC544\uC774\uCF58 \uC790\uB9AC(18px). \uC5C6\uC73C\uBA74 \uBE44\uC6B0\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uC544\uC774\uCF58 \uC904\uC744 \uB9DE\uCD94\uB824\uBA74 iconSpace \uB97C \uCF20\uB2E4. */\n icon?: React.ReactNode;\n /** \uC544\uC774\uCF58\uC774 \uC5C6\uB294 \uC904\uB3C4 \uC544\uC774\uCF58 \uD3ED\uB9CC\uD07C \uBE44\uC6CC \uAE00\uC790 \uC904\uC744 \uB9DE\uCD98\uB2E4. */\n iconSpace?: boolean;\n selected?: boolean;\n disabled?: boolean;\n /** \uD750\uB9B0 \uAE00\uC790(\uD480\uAE30 \u00B7 \uD574\uC81C \uAC19\uC740 \uBCF4\uC870 \uB3D9\uC791). */\n muted?: boolean;\n onClick?: (event: React.MouseEvent<HTMLLIElement>) => void;\n sx?: SxProps<Theme>;\n children?: React.ReactNode;\n}\n\n/** \uBA38\uB9AC \uBA54\uB274 \uD56D\uBAA9 \uD55C \uC904 \u2014 \uD06C\uAE30 \uADDC\uCE59(14px \u00B7 34px)\uC744 \uC9C0\uD0A8 MenuItem. */\nexport function HeaderMenuItem({ icon, iconSpace, selected, disabled, muted, onClick, sx, children }: HeaderMenuItemProps) {\n return (\n <MenuItem\n selected={selected}\n disabled={disabled}\n onClick={onClick}\n sx={[HEADER_MENU_ITEM_SX, muted ? { color: \"text.secondary\" } : {}, ...(Array.isArray(sx) ? sx : sx ? [sx] : [])]}\n >\n {icon ?? (iconSpace ? <Box component=\"span\" sx={{ width: HEADER_MENU_ICON_SIZE, flexShrink: 0 }} /> : null)}\n {children}\n </MenuItem>\n );\n}\n\n/** \uBA54\uB274 \uCE78 \uB098\uB204\uB294 \uC120 \u2014 \uC704\uC544\uB798 \uC5EC\uBC31\uC744 \uC904\uC778\uB2E4(\uAE30\uBCF8 8px \uC740 34px \uC904 \uC0AC\uC774\uC5D0\uC11C \uD5D0\uAC81\uB2E4). */\nexport function HeaderMenuDivider() {\n return <Divider sx={{ my: \"4px !important\" }} />;\n}\n\n/** \uBA38\uB9AC \uCE78(\uB610\uB294 \uB2E8\uCD94) \uBC14\uB85C \uC544\uB798 \uC67C\uCABD \uC790\uB9AC \u2014 \uBA54\uB274\uB294 \uC694\uC18C\uAC00 \uC544\uB2C8\uB77C \uC88C\uD45C\uC5D0 \uB744\uC6B4\uB2E4(\uD45C\uAC00 \uBA38\uB9AC \uCE78\uC744 \uB2E4\uC2DC \uBD99\uC5EC\uB3C4 \uBA54\uB274\uAC00 \uD280\uC9C0 \uC54A\uAC8C). */\nexport function headerMenuAnchor(element: Element, x?: number): { left: number; top: number } {\n const rect = element.getBoundingClientRect();\n return { left: x ?? rect.left, top: rect.bottom };\n}\n\nexport type HeaderMenuSortDirection = \"asc\" | \"desc\";\n\n/** \uACE0\uB97C \uAC12 \uD558\uB098. render \uB97C \uC8FC\uBA74 \uAE00\uC790 \uC790\uB9AC\uC5D0 \uADF8\uB300\uB85C \uADF8\uB9B0\uB2E4(\uC0C9 \uCE69 \u00B7 \uC544\uBC14\uD0C0 + \uC774\uB984). */\nexport interface HeaderMenuOption {\n value: string;\n label: string;\n /** \uAE00\uC790 \uC55E\uC5D0 \uBD99\uB294 \uC791\uC740 \uD45C\uC2DC(\uC0C9 \uC810 \u00B7 \uC544\uBC14\uD0C0). */\n icon?: React.ReactNode;\n /** \uAE00\uC790 \uC790\uB9AC\uB97C \uD1B5\uC9F8\uB85C \uBC14\uAFBC\uB2E4(\uC0C9 \uCE69). \uCC3E\uAE30\uB294 label \uB85C \uD55C\uB2E4. */\n render?: React.ReactNode;\n /** \uC624\uB978\uCABD \uC605\uC740 \uC22B\uC790(\uADF8 \uAC12\uC758 \uC904 \uC218). */\n count?: number;\n}\n\nexport interface HeaderMenuSortConfig {\n /** \uC9C0\uAE08 \uC774 \uCE78\uC758 \uC815\uB82C \uBC29\uD5A5(\uC774 \uCE78\uC73C\uB85C \uC815\uB82C \uC911\uC774 \uC544\uB2C8\uBA74 null). */\n active: HeaderMenuSortDirection | null | undefined;\n /** \uACE0\uB978 \uBC29\uD5A5 \u2014 \uD480\uBA74 null. */\n onChange: (direction: HeaderMenuSortDirection | null) => void;\n /** \"\uC815\uB82C \uD480\uAE30\" \uD56D\uBAA9\uC744 \uB454\uB2E4(\uC815\uB82C \uC911\uC77C \uB54C\uB9CC \uBCF4\uC778\uB2E4). \uAC19\uC740 \uBC29\uD5A5\uC744 \uB2E4\uC2DC \uACE0\uB974\uBA74 \uD480\uB9B0\uB2E4. \uAE30\uBCF8 true. */\n clearable?: boolean;\n}\n\nexport interface HeaderMenuFilterConfig {\n options: HeaderMenuOption[];\n /** \uC9C0\uAE08 \uACE0\uB978 \uAC12\uB4E4(\uBE48 \uBC30\uC5F4 = \uAC70\uB974\uC9C0 \uC54A\uC74C). */\n value: string[];\n onChange: (values: string[]) => void;\n /** \uC5EC\uB7EC \uAC1C \uACE0\uB974\uAE30(\uCCB4\uD06C \uBAA9\uB85D, \uAE30\uBCF8) / false = \uD558\uB098\uB9CC(\uB77C\uB514\uC624, \uACE0\uB974\uBA74 \uB2EB\uD78C\uB2E4). */\n multiple?: boolean;\n /** \uAC12 \"\"(\uBE44\uC5B4 \uC788\uC74C) \uD56D\uBAA9\uC744 \uB05D\uC5D0 \uB354\uD55C\uB2E4 \u2014 \uADF8 \uC774\uB984. options \uC5D0 \"\" \uAC00 \uC774\uBBF8 \uC788\uC73C\uBA74 \uB354\uD558\uC9C0 \uC54A\uB294\uB2E4. */\n emptyLabel?: string;\n /** \uD558\uB098 \uACE0\uB974\uAE30\uC5D0\uC11C \uB9E8 \uC704 \"\uC804\uCCB4\" \uD56D\uBAA9(\uACE0\uB974\uBA74 \uAC12 []). */\n allLabel?: string;\n /** \uB9E8 \uC704 \uCC3E\uAE30 \uCE78 \u2014 \uAE30\uBCF8: \uAC12\uC774 10\uAC1C\uB97C \uB118\uC73C\uBA74. */\n searchable?: boolean;\n searchPlaceholder?: string;\n /** \uD480\uAE30 \uD56D\uBAA9 \uC774\uB984(\uAE30\uBCF8 \"\uAC70\uB974\uAE30 \uD480\uAE30\"). \uAC78\uB824 \uC788\uC744 \uB54C\uB9CC \uBCF4\uC778\uB2E4. */\n clearLabel?: string;\n /** \uACE0\uB97C \uAC12\uC774 \uC5C6\uC744 \uB54C \uAE00(\uAE30\uBCF8 \"\uACE0\uB97C \uAC12\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.\"). */\n emptyText?: string;\n}\n\nexport interface HeaderMenuProps {\n open: boolean;\n /** \uB744\uC6B8 \uC790\uB9AC(\uC88C\uD45C) \u2014 headerMenuAnchor(\uC694\uC18C) \uB85C \uB9CC\uB4E0\uB2E4. anchorEl \uBCF4\uB2E4 \uC774\uAC83\uC744 \uAD8C\uD55C\uB2E4. */\n anchorPosition?: { left: number; top: number } | null;\n /** \uC694\uC18C\uC5D0 \uBD99\uC5EC \uB744\uC6B8 \uB54C(\uC694\uC18C\uAC00 \uB2E4\uC2DC \uBD99\uC9C0 \uC54A\uB294 \uACF3\uB9CC). */\n anchorEl?: HTMLElement | null;\n onClose: () => void;\n sort?: HeaderMenuSortConfig;\n filter?: HeaderMenuFilterConfig;\n /** \uC815\uB82C \u00B7 \uAC70\uB974\uAE30 \uC55E\uC5D0 \uB458 \uD56D\uBAA9(HeaderMenuItem \uB4E4). */\n header?: React.ReactNode;\n /** \uB9E8 \uB4A4\uC5D0 \uB458 \uD56D\uBAA9(HeaderMenuItem \uB4E4 \u00B7 \uBC94\uC704 \uC785\uB825 \uB4F1). */\n children?: React.ReactNode;\n minWidth?: number;\n maxHeight?: number;\n}\n\n/**\n * \uBA38\uB9AC \uBA54\uB274 \u2014 \uC815\uB82C(\uC624\uB984 \u00B7 \uB0B4\uB9BC \u00B7 \uD480\uAE30) \u00B7 \uAC12 \uAC70\uB974\uAE30(\uC5EC\uB7EC \uAC1C \uCCB4\uD06C / \uD558\uB098 \uB77C\uB514\uC624 \u00B7 \uBE44\uC5B4 \uC788\uC74C \u00B7 \uCC3E\uAE30 \u00B7 \uD480\uAE30)\uB97C \uD544\uC694\uD55C \uAC83\uB9CC \uADF8\uB9B0\uB2E4.\n * \uB204\uB978 \uC790\uB9AC\uC5D0\uC11C \uBC14\uB85C \uB72C\uB2E4(transitionDuration 0 \u2014 \uD3BC\uCE68 \uC560\uB2C8\uBA54\uC774\uC158\uC740 \uBA54\uB274\uAC00 \uB2A6\uAC8C \uB530\uB77C\uC624\uB294 \uAC83\uCC98\uB7FC \uBCF4\uC778\uB2E4).\n */\nexport function HeaderMenu({\n open,\n anchorPosition,\n anchorEl,\n onClose,\n sort,\n filter,\n header,\n children,\n minWidth = 180,\n maxHeight = 420,\n}: HeaderMenuProps) {\n const { t } = useI18n();\n const [query, setQuery] = useState(\"\");\n const multiple = filter?.multiple !== false;\n const picked = filter?.value ?? [];\n const options = useMemo(() => {\n if (!filter) return [];\n const list = filter.options;\n return filter.emptyLabel && !list.some((option) => option.value === \"\")\n ? [...list, { value: \"\", label: filter.emptyLabel }]\n : list;\n }, [filter]);\n const searchable = Boolean(filter) && (filter?.searchable ?? options.length > 10);\n const keyword = query.trim().toLowerCase();\n const shown = keyword ? options.filter((option) => option.label.toLowerCase().includes(keyword)) : options;\n const close = () => {\n setQuery(\"\");\n onClose();\n };\n\n const items: React.ReactNode[] = [];\n // \uBA38\uB9AC \u00B7 \uB367\uBD99\uC77C \uD56D\uBAA9\uC740 Fragment \uB85C \uAC10\uC2F8\uC9C0 \uC54A\uACE0 \uD480\uC5B4 \uB123\uB294\uB2E4 \u2014 MUI Menu \uB294 Fragment \uC790\uC2DD\uC744 \uBC1B\uC9C0 \uC54A\uB294\uB2E4(\uAC1C\uBC1C \uBAA8\uB4DC \uACBD\uACE0, 1.5.3).\n if (header) items.push(...React.Children.toArray(header).map((node, i) => (React.isValidElement(node) ? React.cloneElement(node, { key: `h${i}` }) : node)));\n if (sort) {\n const pickSort = (direction: HeaderMenuSortDirection) => {\n close();\n sort.onChange(sort.active === direction && sort.clearable !== false ? null : direction);\n };\n items.push(\n <HeaderMenuItem\n key=\"sort-asc\"\n selected={sort.active === \"asc\"}\n onClick={() => pickSort(\"asc\")}\n icon={<HeaderMenuIcon d={HEADER_MENU_ICON_PATHS.asc} color=\"text.secondary\" />}\n >\n {t(\"sortAscending\")}\n </HeaderMenuItem>,\n <HeaderMenuItem\n key=\"sort-desc\"\n selected={sort.active === \"desc\"}\n onClick={() => pickSort(\"desc\")}\n icon={<HeaderMenuIcon d={HEADER_MENU_ICON_PATHS.desc} color=\"text.secondary\" />}\n >\n {t(\"sortDescending\")}\n </HeaderMenuItem>,\n );\n if (sort.active && sort.clearable !== false) {\n items.push(\n <HeaderMenuItem\n key=\"sort-clear\"\n muted\n iconSpace\n onClick={() => {\n close();\n sort.onChange(null);\n }}\n >\n {t(\"clearSort\")}\n </HeaderMenuItem>,\n );\n }\n }\n if (sort && filter) items.push(<HeaderMenuDivider key=\"div-sort\" />);\n if (filter) {\n if (searchable) {\n items.push(\n <Box\n key=\"search\"\n // \uBA54\uB274\uC758 \uAE00\uC790 \uCC3E\uC544 \uAC00\uAE30(type-ahead)\uAC00 \uC785\uB825\uC744 \uAC00\uB85C\uCC44\uC9C0 \uC54A\uAC8C \uD0A4\uB294 \uC5EC\uAE30\uC11C \uBA48\uCD98\uB2E4.\n onKeyDown={(event) => event.stopPropagation()}\n sx={{ display: \"flex\", alignItems: \"center\", gap: 1, px: 1.5, pb: 0.5, minHeight: HEADER_MENU_ITEM_HEIGHT }}\n >\n <HeaderMenuIcon d={HEADER_MENU_ICON_PATHS.search} color=\"text.secondary\" />\n <InputBase\n autoFocus\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n placeholder={filter.searchPlaceholder ?? t(\"search\")}\n sx={{ flex: 1, fontSize: HEADER_MENU_FONT_SIZE }}\n />\n </Box>,\n );\n }\n if (!multiple && filter.allLabel) {\n items.push(\n <HeaderMenuItem\n key=\"f-all\"\n selected={picked.length === 0}\n onClick={() => {\n close();\n filter.onChange([]);\n }}\n icon={<HeaderMenuIcon d={picked.length === 0 ? HEADER_MENU_ICON_PATHS.radioOn : HEADER_MENU_ICON_PATHS.radioOff} color={picked.length === 0 ? \"primary.main\" : \"text.disabled\"} />}\n >\n {filter.allLabel}\n </HeaderMenuItem>,\n );\n }\n if (options.length === 0) {\n items.push(\n <HeaderMenuItem key=\"f-none\" disabled iconSpace>\n {filter.emptyText ?? t(\"noOptions\")}\n </HeaderMenuItem>,\n );\n }\n shown.forEach((option) => {\n const on = picked.includes(option.value);\n const toggle = () => {\n if (multiple) {\n filter.onChange(on ? picked.filter((item) => item !== option.value) : [...picked, option.value]);\n return;\n }\n close();\n filter.onChange(on ? [] : [option.value]);\n };\n const mark = multiple\n ? on\n ? HEADER_MENU_ICON_PATHS.checked\n : HEADER_MENU_ICON_PATHS.unchecked\n : on\n ? HEADER_MENU_ICON_PATHS.radioOn\n : HEADER_MENU_ICON_PATHS.radioOff;\n items.push(\n <HeaderMenuItem\n key={`f:${option.value || \"(empty)\"}`}\n selected={!multiple && on}\n onClick={toggle}\n icon={<HeaderMenuIcon d={mark} color={on ? \"primary.main\" : \"text.disabled\"} />}\n >\n {option.icon}\n <Box component=\"span\" sx={{ flex: 1, minWidth: 0, overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\n {option.render ?? option.label}\n </Box>\n {typeof option.count === \"number\" ? (\n <Box component=\"span\" sx={{ color: \"text.secondary\", ml: 1, fontVariantNumeric: \"tabular-nums\" }}>\n {option.count}\n </Box>\n ) : null}\n </HeaderMenuItem>,\n );\n });\n if (searchable && keyword && shown.length === 0) {\n items.push(\n <HeaderMenuItem key=\"f-nohit\" disabled iconSpace>\n {t(\"noMatches\")}\n </HeaderMenuItem>,\n );\n }\n // \uAC78\uB824 \uC788\uC744 \uB54C\uB9CC \u2014 \uD558\uB098\uC529 \uB044\uC9C0 \uC54A\uACE0 \uD55C \uBC88\uC5D0 \uD47C\uB2E4.\n if (picked.length > 0) {\n items.push(\n <HeaderMenuDivider key=\"div-filter\" />,\n <HeaderMenuItem\n key=\"f-clear\"\n muted\n iconSpace\n onClick={() => {\n close();\n filter.onChange([]);\n }}\n >\n {filter.clearLabel ?? t(\"clearFilter\")}\n </HeaderMenuItem>,\n );\n }\n }\n if (children) {\n if (items.length > 0) items.push(<HeaderMenuDivider key=\"div-children\" />);\n items.push(...React.Children.toArray(children));\n }\n\n const useAnchorEl = !anchorPosition && Boolean(anchorEl);\n return (\n <Menu\n open={open && (Boolean(anchorPosition) || Boolean(anchorEl))}\n {...(useAnchorEl\n ? { anchorEl }\n : { anchorReference: \"anchorPosition\" as const, anchorPosition: anchorPosition ?? undefined })}\n onClose={close}\n transitionDuration={0}\n // \uCC3E\uAE30 \uCE78\uC774 \uC788\uC73C\uBA74 \uCCAB \uD56D\uBAA9 \uB300\uC2E0 \uADF8 \uCE78\uC5D0 \uCD08\uC810\uC744 \uB454\uB2E4.\n disableAutoFocusItem={searchable}\n // \uBA54\uB274 \uC548 \uC6B0\uD074\uB9AD\uC5D0\uB3C4 \uBE0C\uB77C\uC6B0\uC800 \uBA54\uB274\uB97C \uB744\uC6B0\uC9C0 \uC54A\uB294\uB2E4. \uB204\uB974\uAE30\uAC00 \uD45C(\uBA38\uB9AC \uCE78 \uC815\uB82C)\uB85C \uC62C\uB77C\uAC00\uC9C0 \uC54A\uAC8C \uB9C9\uB294\uB2E4.\n onContextMenu={(event) => event.preventDefault()}\n onClick={(event) => event.stopPropagation()}\n slotProps={{ paper: { sx: { maxHeight, minWidth } }, list: { sx: { py: 0.5 } } }}\n >\n {items}\n </Menu>\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["React", "forwardRef", "useCallback", "useMemo", "useRef", "useEffect", "memo", "useState", "Box", "Table", "MuiTableBody", "TableCell", "TableContainer", "TableHead", "MuiTableFooter", "MuiTableRow", "TableSortLabel", "Paper", "Typography", "useTheme", "useMediaQuery", "TableVirtuoso", "useCallback", "useEffect", "useMemo", "useRef", "useCallback", "useSyncExternalStore", "ko_default", "en_default", "ja_default", "zh_default", "de_default", "fr_default", "it_default", "vi_default", "DICTS", "ko_default", "en_default", "ja_default", "zh_default", "de_default", "fr_default", "it_default", "vi_default", "INTL_TAGS", "current", "listeners", "normalizeLang", "lang", "base", "setMuiVirtualDataTableLocale", "next", "fn", "getMuiVirtualDataTableLocale", "subscribe", "t", "key", "params", "l", "raw", "m", "name", "useI18n", "localeProp", "globalLang", "useSyncExternalStore", "subscribe", "getMuiVirtualDataTableLocale", "lang", "normalizeLang", "useCallback", "key", "params", "t", "INTL_TAGS", "jsx", "REORDER_COLUMN_ID", "EDGE_PX", "EDGE_SPEED", "HANDLE_ICON", "bodyRows", "box", "nearestScrollable", "el", "e", "overflowY", "useRowReorder", "config", "tableBoxRef", "getScroller", "dataLengthRef", "anyPinned", "t", "useI18n", "configRef", "useRef", "on", "dragRef", "rafRef", "indicatorRef", "liftedRef", "hideIndicator", "updateTarget", "useCallback", "d", "rows", "under", "row", "edge", "r", "first", "last", "idx", "insertAt", "to", "ind", "b", "y", "autoScroll", "step", "scroller", "target", "top", "bottom", "dy", "finish", "commit", "useEffect", "move", "up", "key", "markLifted", "index", "tr", "h", "onHandlePointerDown", "item", "onHandleKeyDown", "cfg", "lifted", "renderHandle", "label", "handleWidth", "disabledReason", "handleColumn", "useMemo", "useCallback", "useEffect", "useRef", "jsx", "DEFAULT_HOLD_MS", "THRESHOLD_PX", "EDGE_PX", "EDGE_SPEED", "SWALLOW_CLICK_MS", "columnKey", "col", "isColumnMovable", "REORDER_COLUMN_ID", "applyColumnOrder", "columns", "order", "rank", "key", "i", "result", "groups", "g", "slots", "changed", "sorted", "a", "b", "slot", "k", "nearestScrollableX", "el", "e", "overflowX", "useColumnReorder", "on", "config", "tableBoxRef", "columnsRef", "onCommit", "holdMs", "holdMsRef", "useRef", "onCommitRef", "pendingRef", "indicatorRef", "rafRef", "detachRef", "candidateCells", "useCallback", "group", "box", "th", "updateTarget", "p", "ind", "cells", "idx", "c", "self", "autoScroll", "step", "scroller", "r", "dx", "before", "finish", "commit", "swallow", "ce", "target", "keys", "from", "next", "at", "ordered", "useEffect", "onHeaderPointerDown", "move", "ev", "up", "ctx", "touchMove", "selectStart", "headerCellProps", "own", "__assign", "t", "i", "n", "p", "LoadingProgress", "_a", "visible", "onComplete", "_b", "fadeoutDuration", "_c", "exitDelay", "_d", "size", "className", "style", "sx", "indicator", "_e", "background", "prevVisibleRef", "useRef", "boxRef", "_f", "useState", "shouldRender", "setShouldRender", "_g", "showBackground", "_h", "backgroundColor", "_j", "backgroundOpacity", "useEffect", "prevVisible", "box", "renderIndicator", "_jsx", "CircularProgress", "getBackgroundStyle", "Box", "__assign", "Fragment", "jsx", "jsxs", "SPINNER_CSS", "CssSpinner", "size", "React", "useMemo", "useState", "Box", "Divider", "InputBase", "Menu", "MenuItem", "SvgIcon", "jsx", "jsxs", "HEADER_MENU_FONT_SIZE", "HEADER_MENU_ICON_SIZE", "HEADER_MENU_ITEM_HEIGHT", "HEADER_MENU_ICON_PATHS", "HeaderMenuIcon", "d", "size", "color", "SvgIcon", "HeaderFilterIcon", "active", "stroke", "Box", "HEADER_MENU_ITEM_SX", "HeaderMenuItem", "icon", "iconSpace", "selected", "disabled", "muted", "onClick", "sx", "children", "MenuItem", "HeaderMenuDivider", "Divider", "headerMenuAnchor", "element", "x", "rect", "HeaderMenu", "open", "anchorPosition", "anchorEl", "onClose", "sort", "filter", "header", "minWidth", "maxHeight", "t", "useI18n", "query", "setQuery", "useState", "multiple", "picked", "options", "useMemo", "list", "option", "searchable", "keyword", "shown", "close", "items", "React", "node", "pickSort", "direction", "event", "InputBase", "on", "toggle", "item", "mark", "Menu", "OverlayScrollbar", "Fragment", "jsx", "jsxs", "OVERLAY_SCROLLBAR_TRACK_CONFIG", "ROW_CLICK_DRAG_THRESHOLD_PX", "EMPTY_WIDTHS", "RESIZE_DRAG_THRESHOLD_PX", "cssPx", "value", "headerCellWidth", "th", "cs", "extra", "applyResizeVars", "el", "vars", "stale", "i", "name", "NOTION_LINE_COLOR", "NOTION_LINE_COLOR_DARK", "NOTION_LIGHT", "NOTION_PADDING_Y", "NOTION_DARK", "PlainScroller", "forwardRef", "props", "ref", "DEFAULT_MOBILE_QUERY", "hasColumnFilter", "col", "sortPlacement", "align", "VirtualDataTableComponent", "data", "loading", "columnsProp", "onRowClick", "getRowId", "selectedRowId", "selectedRowSxProp", "rowHeightProp", "columnHeightProp", "striped", "rowDivider", "onSort", "onSortClear", "onHeaderContextMenu", "onLoadMore", "sortBy", "sortDirection", "showPaper", "paddingXProp", "paddingTop", "paddingBottom", "rowHoverColorProp", "rowHoverOpacityProp", "viewportBuffer", "overscan", "initialItemCount", "scrollbars", "emptyMessage", "autoHeight", "LoadingComponent", "showFooter", "footerHeight", "footerSx", "variant", "borderColor", "framed", "headerTopBorder", "scrollbarGutter", "rowHeightMode", "tableLayout", "renderFullWidthRow", "fullWidthRowSx", "onRowContextMenu", "pinnedRows", "pinnedRowsMaxHeight", "pinnedRowsSx", "resetScrollOnDataChange", "rowKeyFromId", "onEndReached", "colorMode", "mobile", "scrollParent", "columnResize", "columnWidths", "onColumnWidthsChange", "rowReorder", "columnReorder", "columnOrder", "onColumnOrderChange", "notion", "muiTheme", "useTheme", "baseNotionTokens", "notionTokens", "hasPinnedRows", "columnHeight", "rowHeight", "paddingX", "mobileConfig", "mobileMatch", "useMediaQuery", "mobileList", "reorderBoxRef", "useRef", "reorderScrollerRef", "dataLengthRef", "reorder", "useRowReorder", "c", "colReorderConfig", "colReorderOn", "localOrder", "setLocalOrder", "useState", "useEffect", "activeOrder", "orderedColumns", "useMemo", "applyColumnOrder", "orderedColumnsRef", "onColumnOrderChangeRef", "colReorderBoxRef", "colReorder", "useColumnReorder", "useCallback", "order", "columns", "external", "sizeAuto", "autoRowHeight", "gutterPx", "gutterSx", "rowHoverColor", "rowHoverOpacity", "defaultViewportBufferTop", "defaultViewportBufferBottom", "viewportBufferTop", "viewportBufferBottom", "defaultOverscanMain", "defaultOverscanReverse", "virtuosoOverscan", "estimatedItemHeight", "notionSelectedSx", "selectedRowSx", "useCssRowHighlight", "selectedRowCssSx", "isDev", "perfDebugEnabled", "perfStatsRef", "flushPerfStats", "reason", "stats", "rowAvgMs", "cellAvgMs", "intervalId", "VirtuosoScroller", "scrollContainerRef", "wheelDeltaRef", "wheelRafRef", "handleWheel", "e", "wheelStart", "inner", "delta", "rafStart", "maxStep", "batchedDelta", "TableContainer", "Box", "node", "stripedRowColor", "internalLoading", "setInternalLoading", "tableKey", "setTableKey", "handleLoadingComplete", "shouldShowLoading", "isLoadMoreLoading", "isLoadingMoreRef", "lastLoadMoreLengthRef", "virtuosoRef", "scrollerElRef", "listOverflows", "setListOverflows", "checkListOverflow", "observer", "onRowClickRef", "getRowIdRef", "onRowContextMenuRef", "onEndReachedRef", "rowComponentRef", "resizeConfig", "resizeOn", "resizeMinDefault", "localWidths", "setLocalWidths", "activeWidths", "activeWidthsRef", "onColumnWidthsChangeRef", "columnsRef", "tableBoxRef", "computeResizeVars", "widths", "changed", "allFixed", "minSum", "fixedSum", "index", "w", "cw", "computeResizeVarsRef", "resizeVars", "colWidthStyle", "minWidth", "m", "pinnedLeft", "map", "left", "parts", "tableMinWidth", "sum", "pinnedStyle", "head", "hasRowClick", "isScrollDraggingRef", "mouseDownPositionRef", "handleDocumentMouseMove", "event", "dx", "dy", "tableContainer", "label", "mouseLeaveEvent", "handleSort", "columnId", "headerMenu", "setHeaderMenu", "onHeaderContextMenuRef", "onSortRef", "handleHeaderContextMenu", "handled", "rect", "handleResizeMouseDown", "handle", "box", "startWidth", "startX", "key", "min", "base", "cols", "snap", "h", "cell", "next", "moved", "raf", "prevCursor", "onMove", "ev", "onUp", "swallow", "ce", "handleResizeDoubleClick", "table", "parent", "declaredSum", "avail", "scale", "initial", "renderResizeHandle", "REORDER_COLUMN_ID", "renderHeaderText", "active", "HeaderFilterIcon", "handleEndReached", "endIndex", "rangeStart", "hasMinimumData", "nearEnd", "alreadyRequestedAtThisLength", "offset", "prev", "resetScrollOnDataChangeRef", "prevDataLengthRef", "prevFirstRowKeyRef", "prevLength", "currentLength", "firstRowKey", "prevFirstRowKey", "dataReplaced", "headerRowsContent", "groupMap", "noGroupColumns", "MuiTableRow", "colIndex", "TableCell", "TableSortLabel", "firstRowCells", "group", "secondRowCells", "mobileSlots", "shown", "title", "renderMobileRow", "item", "thumb", "badge", "sub", "meta", "rowContent", "rowStart", "rowDuration", "card", "fullWidth", "coveredByColSpan", "cells", "column", "columnIndex", "colSpan", "cellStart", "cellValue", "cellDuration", "pinned", "customPadding", "span", "onCellClick", "fixedHeaderContent", "headerRows", "RowComponent", "MuiTableBody", "hasFooter", "fixedFooterContent", "VirtuosoTableComponents", "Table", "TableHead", "_selected", "_ariaSelected", "className", "rest", "rowIndex", "isOddRow", "rowId", "isSelected", "resolvedSelectedRowSx", "sanitizedClassName", "token", "theme", "isDark", "color", "opacity", "hex", "r", "g", "b", "children", "MuiTableFooter", "resolvedVirtuosoComponents", "autoParts", "AutoTable", "AutoTableHead", "AutoTableBody", "AutoTableRow", "AutoTableFoot", "menuColumn", "closeHeaderMenu", "headerMenuNode", "colId", "canSort", "canFilter", "activeSort", "HeaderMenu", "direction", "values", "tableContent", "TableVirtuoso", "Typography", "loadingGate", "React", "LoadingProgress", "CssSpinner", "notionFramePadding", "Paper", "setVirtualDataTableLoadingGate", "gate", "VirtualDataTable", "memo"]
|
|
7
7
|
}
|