kokotable 0.95.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (308) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +320 -0
  3. package/contract/table-request.schema.json +424 -0
  4. package/dist/core/src/adapters/sources.d.ts +59 -0
  5. package/dist/core/src/adapters/sources.js +235 -0
  6. package/dist/core/src/client/aggregate.d.ts +94 -0
  7. package/dist/core/src/client/aggregate.js +222 -0
  8. package/dist/core/src/client/groupRows.d.ts +40 -0
  9. package/dist/core/src/client/groupRows.js +145 -0
  10. package/dist/core/src/client/runClientQuery.d.ts +67 -0
  11. package/dist/core/src/client/runClientQuery.js +157 -0
  12. package/dist/core/src/columns/ColumnBuilder.d.ts +121 -0
  13. package/dist/core/src/columns/ColumnBuilder.js +273 -0
  14. package/dist/core/src/columns/cascade.d.ts +24 -0
  15. package/dist/core/src/columns/cascade.js +93 -0
  16. package/dist/core/src/columns/deriveOperators.d.ts +38 -0
  17. package/dist/core/src/columns/deriveOperators.js +94 -0
  18. package/dist/core/src/columns/expandSorting.d.ts +19 -0
  19. package/dist/core/src/columns/expandSorting.js +52 -0
  20. package/dist/core/src/columns/helper.d.ts +196 -0
  21. package/dist/core/src/columns/helper.js +250 -0
  22. package/dist/core/src/columns/labels.d.ts +12 -0
  23. package/dist/core/src/columns/labels.js +21 -0
  24. package/dist/core/src/contract.d.ts +12 -0
  25. package/dist/core/src/contract.js +12 -0
  26. package/dist/core/src/contracts/aiColumnMeta.d.ts +102 -0
  27. package/dist/core/src/contracts/aiColumnMeta.js +197 -0
  28. package/dist/core/src/contracts/describeColumns.d.ts +48 -0
  29. package/dist/core/src/contracts/describeColumns.js +40 -0
  30. package/dist/core/src/contracts/exportData.d.ts +150 -0
  31. package/dist/core/src/contracts/exportData.js +228 -0
  32. package/dist/core/src/contracts/index.d.ts +6 -0
  33. package/dist/core/src/contracts/index.js +12 -0
  34. package/dist/core/src/contracts/legacyUrl.d.ts +47 -0
  35. package/dist/core/src/contracts/legacyUrl.js +156 -0
  36. package/dist/core/src/contracts/preset.d.ts +104 -0
  37. package/dist/core/src/contracts/preset.js +141 -0
  38. package/dist/core/src/contracts/presetStore.d.ts +81 -0
  39. package/dist/core/src/contracts/presetStore.js +146 -0
  40. package/dist/core/src/contracts/usePresets.d.ts +51 -0
  41. package/dist/core/src/contracts/usePresets.js +170 -0
  42. package/dist/core/src/defaults.d.ts +7 -0
  43. package/dist/core/src/defaults.js +9 -0
  44. package/dist/core/src/filters/codec.d.ts +20 -0
  45. package/dist/core/src/filters/codec.js +61 -0
  46. package/dist/core/src/filters/date.d.ts +30 -0
  47. package/dist/core/src/filters/date.js +179 -0
  48. package/dist/core/src/filters/describe.d.ts +45 -0
  49. package/dist/core/src/filters/describe.js +189 -0
  50. package/dist/core/src/filters/kind.d.ts +52 -0
  51. package/dist/core/src/filters/kind.js +110 -0
  52. package/dist/core/src/filters/kinds/_list.d.ts +13 -0
  53. package/dist/core/src/filters/kinds/_list.js +42 -0
  54. package/dist/core/src/filters/kinds/boolean.d.ts +3 -0
  55. package/dist/core/src/filters/kinds/boolean.js +21 -0
  56. package/dist/core/src/filters/kinds/cascade.d.ts +6 -0
  57. package/dist/core/src/filters/kinds/cascade.js +16 -0
  58. package/dist/core/src/filters/kinds/commonCode.d.ts +3 -0
  59. package/dist/core/src/filters/kinds/commonCode.js +13 -0
  60. package/dist/core/src/filters/kinds/date.d.ts +9 -0
  61. package/dist/core/src/filters/kinds/date.js +32 -0
  62. package/dist/core/src/filters/kinds/enum.d.ts +4 -0
  63. package/dist/core/src/filters/kinds/enum.js +13 -0
  64. package/dist/core/src/filters/kinds/index.d.ts +49 -0
  65. package/dist/core/src/filters/kinds/index.js +39 -0
  66. package/dist/core/src/filters/kinds/linear.d.ts +5 -0
  67. package/dist/core/src/filters/kinds/linear.js +16 -0
  68. package/dist/core/src/filters/kinds/number.d.ts +5 -0
  69. package/dist/core/src/filters/kinds/number.js +19 -0
  70. package/dist/core/src/filters/kinds/period.d.ts +4 -0
  71. package/dist/core/src/filters/kinds/period.js +17 -0
  72. package/dist/core/src/filters/kinds/relation.d.ts +5 -0
  73. package/dist/core/src/filters/kinds/relation.js +17 -0
  74. package/dist/core/src/filters/kinds/schedule.d.ts +5 -0
  75. package/dist/core/src/filters/kinds/schedule.js +16 -0
  76. package/dist/core/src/filters/kinds/text.d.ts +4 -0
  77. package/dist/core/src/filters/kinds/text.js +18 -0
  78. package/dist/core/src/filters/linear.d.ts +33 -0
  79. package/dist/core/src/filters/linear.js +65 -0
  80. package/dist/core/src/filters/list.d.ts +32 -0
  81. package/dist/core/src/filters/list.js +87 -0
  82. package/dist/core/src/filters/number.d.ts +17 -0
  83. package/dist/core/src/filters/number.js +82 -0
  84. package/dist/core/src/filters/registry.d.ts +23 -0
  85. package/dist/core/src/filters/registry.js +121 -0
  86. package/dist/core/src/filters/relation.d.ts +26 -0
  87. package/dist/core/src/filters/relation.js +75 -0
  88. package/dist/core/src/filters/schedule.d.ts +21 -0
  89. package/dist/core/src/filters/schedule.js +60 -0
  90. package/dist/core/src/filters/text.d.ts +44 -0
  91. package/dist/core/src/filters/text.js +127 -0
  92. package/dist/core/src/hooks/index.d.ts +6 -0
  93. package/dist/core/src/hooks/index.js +6 -0
  94. package/dist/core/src/hooks/useDataTable.d.ts +13 -0
  95. package/dist/core/src/hooks/useDataTable.js +109 -0
  96. package/dist/core/src/hooks/useGrouping.d.ts +33 -0
  97. package/dist/core/src/hooks/useGrouping.js +57 -0
  98. package/dist/core/src/hooks/useSearchHistory.d.ts +20 -0
  99. package/dist/core/src/hooks/useSearchHistory.js +52 -0
  100. package/dist/core/src/hooks/useTableData.d.ts +25 -0
  101. package/dist/core/src/hooks/useTableData.js +49 -0
  102. package/dist/core/src/hooks/useTableFromDefinition.d.ts +47 -0
  103. package/dist/core/src/hooks/useTableFromDefinition.js +174 -0
  104. package/dist/core/src/hooks/useTableSearch.d.ts +10 -0
  105. package/dist/core/src/hooks/useTableSearch.js +434 -0
  106. package/dist/core/src/hooks/useUrlSync.d.ts +64 -0
  107. package/dist/core/src/hooks/useUrlSync.js +145 -0
  108. package/dist/core/src/index.d.ts +38 -0
  109. package/dist/core/src/index.js +43 -0
  110. package/dist/core/src/pivot/runClientPivot.d.ts +101 -0
  111. package/dist/core/src/pivot/runClientPivot.js +230 -0
  112. package/dist/core/src/pivot/transforms.d.ts +19 -0
  113. package/dist/core/src/pivot/transforms.js +105 -0
  114. package/dist/core/src/registry.d.ts +46 -0
  115. package/dist/core/src/registry.js +67 -0
  116. package/dist/core/src/types/column.d.ts +213 -0
  117. package/dist/core/src/types/column.js +1 -0
  118. package/dist/core/src/types/data.d.ts +63 -0
  119. package/dist/core/src/types/data.js +1 -0
  120. package/dist/core/src/types/definition.d.ts +239 -0
  121. package/dist/core/src/types/definition.js +59 -0
  122. package/dist/core/src/types/filter.d.ts +94 -0
  123. package/dist/core/src/types/filter.js +1 -0
  124. package/dist/core/src/types/filterKind.d.ts +204 -0
  125. package/dist/core/src/types/filterKind.js +1 -0
  126. package/dist/core/src/types/grouping.d.ts +80 -0
  127. package/dist/core/src/types/grouping.js +4 -0
  128. package/dist/core/src/types/index.d.ts +8 -0
  129. package/dist/core/src/types/index.js +8 -0
  130. package/dist/core/src/types/operators.d.ts +64 -0
  131. package/dist/core/src/types/operators.js +108 -0
  132. package/dist/core/src/types/request.d.ts +114 -0
  133. package/dist/core/src/types/request.js +1 -0
  134. package/dist/core/src/types/search.d.ts +112 -0
  135. package/dist/core/src/types/search.js +1 -0
  136. package/dist/core/src/types/sources.d.ts +84 -0
  137. package/dist/core/src/types/sources.js +1 -0
  138. package/dist/core/src/types/table.d.ts +40 -0
  139. package/dist/core/src/types/table.js +1 -0
  140. package/dist/core/src/utils/compare.d.ts +13 -0
  141. package/dist/core/src/utils/compare.js +53 -0
  142. package/dist/core/src/utils/dateText.d.ts +12 -0
  143. package/dist/core/src/utils/dateText.js +30 -0
  144. package/dist/core/src/utils/getValue.d.ts +9 -0
  145. package/dist/core/src/utils/getValue.js +32 -0
  146. package/dist/index.d.ts +1 -0
  147. package/dist/index.js +2 -0
  148. package/dist/mui/src/TableLayout.d.ts +75 -0
  149. package/dist/mui/src/TableLayout.js +162 -0
  150. package/dist/mui/src/TableScreen.d.ts +70 -0
  151. package/dist/mui/src/TableScreen.js +174 -0
  152. package/dist/mui/src/addons/FilterModal.d.ts +45 -0
  153. package/dist/mui/src/addons/FilterModal.js +39 -0
  154. package/dist/mui/src/addons/FilterStatusModal.d.ts +40 -0
  155. package/dist/mui/src/addons/FilterStatusModal.js +68 -0
  156. package/dist/mui/src/addons/PresetBar.d.ts +56 -0
  157. package/dist/mui/src/addons/PresetBar.js +145 -0
  158. package/dist/mui/src/addons/ShareDropdown.d.ts +35 -0
  159. package/dist/mui/src/addons/ShareDropdown.js +41 -0
  160. package/dist/mui/src/addons/searchStore.d.ts +44 -0
  161. package/dist/mui/src/addons/searchStore.js +112 -0
  162. package/dist/mui/src/addons/searchSummary.d.ts +106 -0
  163. package/dist/mui/src/addons/searchSummary.js +109 -0
  164. package/dist/mui/src/columns/displayColumns.d.ts +100 -0
  165. package/dist/mui/src/columns/displayColumns.js +174 -0
  166. package/dist/mui/src/content/CardContent.d.ts +24 -0
  167. package/dist/mui/src/content/CardContent.js +25 -0
  168. package/dist/mui/src/content/ColumnMenu.d.ts +43 -0
  169. package/dist/mui/src/content/ColumnMenu.js +40 -0
  170. package/dist/mui/src/content/ColumnVisibilityMenu.d.ts +14 -0
  171. package/dist/mui/src/content/ColumnVisibilityMenu.js +37 -0
  172. package/dist/mui/src/content/EditCell.d.ts +19 -0
  173. package/dist/mui/src/content/EditCell.js +61 -0
  174. package/dist/mui/src/content/HeaderCell.d.ts +59 -0
  175. package/dist/mui/src/content/HeaderCell.js +88 -0
  176. package/dist/mui/src/content/SelectionActionBar.d.ts +17 -0
  177. package/dist/mui/src/content/SelectionActionBar.js +19 -0
  178. package/dist/mui/src/content/SortControl.d.ts +17 -0
  179. package/dist/mui/src/content/SortControl.js +45 -0
  180. package/dist/mui/src/content/TableContent.d.ts +191 -0
  181. package/dist/mui/src/content/TableContent.js +525 -0
  182. package/dist/mui/src/content/TableErrorFallback.d.ts +24 -0
  183. package/dist/mui/src/content/TableErrorFallback.js +29 -0
  184. package/dist/mui/src/content/cellError.d.ts +13 -0
  185. package/dist/mui/src/content/cellError.js +20 -0
  186. package/dist/mui/src/content/cellRenderers.d.ts +71 -0
  187. package/dist/mui/src/content/cellRenderers.js +127 -0
  188. package/dist/mui/src/content/cellValue.d.ts +27 -0
  189. package/dist/mui/src/content/cellValue.js +82 -0
  190. package/dist/mui/src/content/columnOrder.d.ts +7 -0
  191. package/dist/mui/src/content/columnOrder.js +48 -0
  192. package/dist/mui/src/content/density.d.ts +13 -0
  193. package/dist/mui/src/content/density.js +12 -0
  194. package/dist/mui/src/content/menuItems.d.ts +118 -0
  195. package/dist/mui/src/content/menuItems.js +128 -0
  196. package/dist/mui/src/content/pinning.d.ts +17 -0
  197. package/dist/mui/src/content/pinning.js +65 -0
  198. package/dist/mui/src/exporters/index.d.ts +1 -0
  199. package/dist/mui/src/exporters/index.js +1 -0
  200. package/dist/mui/src/exporters/useExportFormatters.d.ts +13 -0
  201. package/dist/mui/src/exporters/useExportFormatters.js +17 -0
  202. package/dist/mui/src/filter/FilterArea.d.ts +40 -0
  203. package/dist/mui/src/filter/FilterArea.js +37 -0
  204. package/dist/mui/src/filter/FilterInput.d.ts +14 -0
  205. package/dist/mui/src/filter/FilterInput.js +18 -0
  206. package/dist/mui/src/filter/inputs/DateFilterInput.d.ts +14 -0
  207. package/dist/mui/src/filter/inputs/DateFilterInput.js +112 -0
  208. package/dist/mui/src/filter/inputs/LinearFilterInput.d.ts +10 -0
  209. package/dist/mui/src/filter/inputs/LinearFilterInput.js +35 -0
  210. package/dist/mui/src/filter/inputs/NumberFilterInput.d.ts +12 -0
  211. package/dist/mui/src/filter/inputs/NumberFilterInput.js +111 -0
  212. package/dist/mui/src/filter/inputs/OperatorMenu.d.ts +14 -0
  213. package/dist/mui/src/filter/inputs/OperatorMenu.js +25 -0
  214. package/dist/mui/src/filter/inputs/RelationFilterInput.d.ts +11 -0
  215. package/dist/mui/src/filter/inputs/RelationFilterInput.js +67 -0
  216. package/dist/mui/src/filter/inputs/ScheduleFilterInput.d.ts +8 -0
  217. package/dist/mui/src/filter/inputs/ScheduleFilterInput.js +17 -0
  218. package/dist/mui/src/filter/inputs/SelectFilterInput.d.ts +16 -0
  219. package/dist/mui/src/filter/inputs/SelectFilterInput.js +57 -0
  220. package/dist/mui/src/filter/inputs/TextFilterInput.d.ts +13 -0
  221. package/dist/mui/src/filter/inputs/TextFilterInput.js +55 -0
  222. package/dist/mui/src/filter/kinds.d.ts +58 -0
  223. package/dist/mui/src/filter/kinds.js +103 -0
  224. package/dist/mui/src/grouping/AggregateChip.d.ts +55 -0
  225. package/dist/mui/src/grouping/AggregateChip.js +128 -0
  226. package/dist/mui/src/grouping/AggregationChips.d.ts +49 -0
  227. package/dist/mui/src/grouping/AggregationChips.js +80 -0
  228. package/dist/mui/src/grouping/AggregationSettingsButton.d.ts +14 -0
  229. package/dist/mui/src/grouping/AggregationSettingsButton.js +19 -0
  230. package/dist/mui/src/grouping/GroupingBar.d.ts +59 -0
  231. package/dist/mui/src/grouping/GroupingBar.js +267 -0
  232. package/dist/mui/src/grouping/StepExpandButton.d.ts +12 -0
  233. package/dist/mui/src/grouping/StepExpandButton.js +18 -0
  234. package/dist/mui/src/grouping/groupRow.d.ts +68 -0
  235. package/dist/mui/src/grouping/groupRow.js +129 -0
  236. package/dist/mui/src/headers/defaultHeader.d.ts +28 -0
  237. package/dist/mui/src/headers/defaultHeader.js +90 -0
  238. package/dist/mui/src/headers/defineHeader.d.ts +21 -0
  239. package/dist/mui/src/headers/defineHeader.js +68 -0
  240. package/dist/mui/src/headers/index.d.ts +5 -0
  241. package/dist/mui/src/headers/index.js +3 -0
  242. package/dist/mui/src/headers/meta.d.ts +18 -0
  243. package/dist/mui/src/headers/meta.js +11 -0
  244. package/dist/mui/src/headers/types.d.ts +84 -0
  245. package/dist/mui/src/headers/types.js +1 -0
  246. package/dist/mui/src/index.d.ts +110 -0
  247. package/dist/mui/src/index.js +79 -0
  248. package/dist/mui/src/layout/ResizeHandle.d.ts +30 -0
  249. package/dist/mui/src/layout/ResizeHandle.js +66 -0
  250. package/dist/mui/src/menus/columnMenu.d.ts +45 -0
  251. package/dist/mui/src/menus/columnMenu.js +144 -0
  252. package/dist/mui/src/menus/copy.d.ts +5 -0
  253. package/dist/mui/src/menus/copy.js +25 -0
  254. package/dist/mui/src/menus/index.d.ts +6 -0
  255. package/dist/mui/src/menus/index.js +4 -0
  256. package/dist/mui/src/menus/resolve.d.ts +15 -0
  257. package/dist/mui/src/menus/resolve.js +60 -0
  258. package/dist/mui/src/menus/rowMenu.d.ts +46 -0
  259. package/dist/mui/src/menus/rowMenu.js +76 -0
  260. package/dist/mui/src/pagination/PaginationArea.d.ts +16 -0
  261. package/dist/mui/src/pagination/PaginationArea.js +23 -0
  262. package/dist/mui/src/pivot/PivotTable.d.ts +18 -0
  263. package/dist/mui/src/pivot/PivotTable.js +100 -0
  264. package/dist/mui/src/provider/KokoTableProvider.d.ts +184 -0
  265. package/dist/mui/src/provider/KokoTableProvider.js +118 -0
  266. package/dist/mui/src/provider/labels.d.ts +85 -0
  267. package/dist/mui/src/provider/labels.js +104 -0
  268. package/dist/mui/src/registry.d.ts +30 -0
  269. package/dist/mui/src/registry.js +5 -0
  270. package/dist/mui/src/toolbar/GlobalFilterField.d.ts +36 -0
  271. package/dist/mui/src/toolbar/GlobalFilterField.js +78 -0
  272. package/dist/mui/src/virtual/VirtualTableContent.d.ts +41 -0
  273. package/dist/mui/src/virtual/VirtualTableContent.js +58 -0
  274. package/dist/mui/src/virtual/VirtualTableScreen.d.ts +13 -0
  275. package/dist/mui/src/virtual/VirtualTableScreen.js +23 -0
  276. package/dist/mui/src/virtual.d.ts +4 -0
  277. package/dist/mui/src/virtual.js +4 -0
  278. package/dist/mui/src/virtualColumns/VirtualColumnCard.d.ts +26 -0
  279. package/dist/mui/src/virtualColumns/VirtualColumnCard.js +29 -0
  280. package/dist/mui/src/virtualColumns/VirtualColumnDialog.d.ts +27 -0
  281. package/dist/mui/src/virtualColumns/VirtualColumnDialog.js +154 -0
  282. package/dist/mui/src/virtualColumns/VirtualColumnSection.d.ts +31 -0
  283. package/dist/mui/src/virtualColumns/VirtualColumnSection.js +55 -0
  284. package/dist/mui/src/virtualColumns/expression.d.ts +68 -0
  285. package/dist/mui/src/virtualColumns/expression.js +489 -0
  286. package/dist/mui/src/virtualColumns/useVirtualColumns.d.ts +67 -0
  287. package/dist/mui/src/virtualColumns/useVirtualColumns.js +111 -0
  288. package/dist/mui/src/virtualColumns/virtualColumnDefs.d.ts +29 -0
  289. package/dist/mui/src/virtualColumns/virtualColumnDefs.js +51 -0
  290. package/dist/mui-virtual.d.ts +1 -0
  291. package/dist/mui-virtual.js +2 -0
  292. package/dist/mui.d.ts +1 -0
  293. package/dist/mui.js +2 -0
  294. package/dist/query/src/index.d.ts +6 -0
  295. package/dist/query/src/index.js +7 -0
  296. package/dist/query/src/serverPivot.d.ts +42 -0
  297. package/dist/query/src/serverPivot.js +153 -0
  298. package/dist/query/src/useServerGrouping.d.ts +52 -0
  299. package/dist/query/src/useServerGrouping.js +186 -0
  300. package/dist/query/src/useServerTable.d.ts +20 -0
  301. package/dist/query/src/useServerTable.js +106 -0
  302. package/dist/query/src/useServerTableData.d.ts +48 -0
  303. package/dist/query/src/useServerTableData.js +64 -0
  304. package/dist/query/src/wire.d.ts +16 -0
  305. package/dist/query/src/wire.js +32 -0
  306. package/dist/query.d.ts +1 -0
  307. package/dist/query.js +2 -0
  308. package/package.json +125 -0
@@ -0,0 +1,88 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { TableCell } from "@mui/material";
4
+ import { flexRender } from "@tanstack/react-table";
5
+ import { ColumnMenu } from "./ColumnMenu";
6
+ import { isDisplayColumnId } from "../columns/displayColumns";
7
+ import { explicitWidth, pinnedSx } from "./pinning";
8
+ import { useKokoTableConfig } from "../provider/KokoTableProvider";
9
+ import { createHeaderContext } from "./menuItems";
10
+ import { applyHeaderRules, resolveHeaderDef } from "../headers/defineHeader";
11
+ import { defaultHeader, headerRegistry, materializeHeader } from "../headers/defaultHeader";
12
+ import { headerRuleMetaOf, resolveCellAlign } from "../headers/meta";
13
+ export { headerRuleMetaOf, resolveCellAlign } from "../headers/meta";
14
+ /**
15
+ * 헤더 셀 — 바깥 `<th>`(colSpan · 고정 sticky · 폭 · 드래그 · 우클릭 메뉴)를 맡고,
16
+ * 안쪽 내용은 **헤더 정의**(`defineHeader`)가 그린다.
17
+ *
18
+ * 정의 적용 순서: `headerDef` prop → `column.meta.header`(id 또는 정의) → Provider `headers[]` 중 `when` 이 참인 첫 정의 → 기본.
19
+ * 정의의 `rules` 는 여기서 해석돼 정렬 클릭·리사이즈 핸들·드래그·메뉴 항목 `when` 과 TanStack `column.getCan*()` 모두에 반영된다.
20
+ *
21
+ * 정렬은 `SortSource` 로만 받는다. 콘텐츠 계약에 섞지 않은 이유는
22
+ * 카드 화면처럼 헤더가 없는 곳에서도 정렬 컨트롤을 따로 둘 수 있어야 하기 때문이다.
23
+ * 컬럼 단위 규칙은 `meta.headerTooltip` / `meta.headerAlign` / `meta.align` 을 읽는다.
24
+ */
25
+ export function HeaderCell({ header, sort, table: tableProp, enableColumnMenu = true, size, draggableGroup, columnMenuItems, grouping, onGroupingChange, aggregation, onAggregationChange, onOpenFilter, headerCellProps, renderHeader, headerDef, }) {
26
+ const { components, labels, headers } = useKokoTableConfig();
27
+ const ColumnMenuComponent = (components.ColumnMenu ?? ColumnMenu);
28
+ const column = header.column;
29
+ const table = tableProp ?? header.getContext().table;
30
+ const rule = headerRuleMetaOf(column.columnDef);
31
+ const isDisplay = isDisplayColumnId(column.id);
32
+ const resizingEnabled = !!table.options.enableColumnResizing;
33
+ const [menuAnchor, setMenuAnchor] = useState(null);
34
+ // ── 헤더 정의 해석 ──
35
+ const baseCtx = createHeaderContext({ header, column, table, sort, labels });
36
+ const def = headerDef ?? resolveHeaderDef(baseCtx, headers, headerRegistry, defaultHeader);
37
+ const can = applyHeaderRules(baseCtx, def);
38
+ const { render, slots } = materializeHeader(def);
39
+ const canDragGroup = (draggableGroup ?? table.options.enableGrouping === true)
40
+ && !isDisplay && !header.isPlaceholder && can.canGroup;
41
+ const canResize = resizingEnabled && can.canResize;
42
+ const showMenu = !!tableProp && enableColumnMenu && !isDisplay && !header.isPlaceholder && header.subHeaders.length === 0;
43
+ const width = explicitWidth(column, table);
44
+ const align = isDisplay ? "center" : (rule.headerAlign ?? resolveCellAlign(column.columnDef));
45
+ const rawContent = header.isPlaceholder ? null : flexRender(column.columnDef.header, header.getContext());
46
+ const defaultContent = renderHeader ? renderHeader({ header, table, defaultContent: rawContent }) : rawContent;
47
+ const renderCtx = {
48
+ ...baseCtx,
49
+ can,
50
+ defaultContent,
51
+ align,
52
+ menuEnabled: showMenu,
53
+ openMenu: (anchor) => { if (showMenu)
54
+ setMenuAnchor(anchor); },
55
+ size,
56
+ };
57
+ const extra = headerCellProps?.(header, tableProp) ?? {};
58
+ const { sx: extraSx, onContextMenu: extraOnContextMenu, ...extraRest } = extra;
59
+ const state = baseCtx.sortState;
60
+ return (_jsxs(TableCell, { colSpan: header.colSpan, align: align, size: size, "data-column-id": column.id, "data-header-def": def.id, ...extraRest, sx: [
61
+ {
62
+ fontWeight: 600,
63
+ whiteSpace: "nowrap",
64
+ backgroundColor: "background.paper",
65
+ borderBottom: "2px solid",
66
+ borderColor: "divider",
67
+ width,
68
+ minWidth: width,
69
+ maxWidth: canResize ? width : undefined,
70
+ position: "relative",
71
+ // 메뉴 버튼은 hover 전까지 흐리게 — 헤더가 버튼으로 어지러워지지 않게
72
+ "&:hover .koko-column-menu-button": { opacity: 1 },
73
+ // sticky header(z 2) 위에 고정 컬럼 헤더가 오도록
74
+ ...(pinnedSx(column, 3) ?? {}),
75
+ ...(column.getIsPinned() ? { top: 0 } : {}),
76
+ },
77
+ ...(Array.isArray(extraSx) ? extraSx : extraSx ? [extraSx] : []),
78
+ ], sortDirection: state ? (state.desc ? "desc" : "asc") : false, draggable: canDragGroup || undefined, onDragStart: canDragGroup ? (event) => {
79
+ event.dataTransfer.effectAllowed = "copyMove";
80
+ event.dataTransfer.setData("text/koko-column", column.id);
81
+ } : undefined, onContextMenu: (event) => {
82
+ extraOnContextMenu?.(event);
83
+ if (!showMenu || event.defaultPrevented)
84
+ return;
85
+ event.preventDefault();
86
+ setMenuAnchor({ top: event.clientY, left: event.clientX });
87
+ }, children: [render(renderCtx, slots), showMenu && (_jsx(ColumnMenuComponent, { table: table, column: column, header: header, sort: sort, grouping: grouping, onGroupingChange: onGroupingChange, aggregation: aggregation, onAggregationChange: onAggregationChange, onOpenFilter: onOpenFilter, items: columnMenuItems, hideButton: true, anchor: menuAnchor, onAnchorClose: () => setMenuAnchor(null) }))] }));
88
+ }
@@ -0,0 +1,17 @@
1
+ import type { ReactNode } from "react";
2
+ import type { RowData } from "@tanstack/react-table";
3
+ import { type AnySelectionSource } from "../../../core/src/index";
4
+ export interface SelectionActionBarProps<T extends RowData> {
5
+ /** 테이블 인스턴스 또는 `SelectionSource` */
6
+ source: AnySelectionSource<T>;
7
+ /** 선택된 행에 대한 액션 — 기존 `renderSelectAction({ table, selectedRows })` 대응 */
8
+ renderActions?: (selectedRows: T[]) => ReactNode;
9
+ children?: ReactNode;
10
+ /** 선택이 없어도 자리를 유지할지. 기본은 접힌다 */
11
+ keepMounted?: boolean;
12
+ }
13
+ /**
14
+ * 선택 액션바 — 행이 하나라도 선택되면 슬라이드로 나타난다.
15
+ * `SelectionSource` 계약 위에서 동작하므로 테이블 없는 카드 화면에서도 같은 바를 쓴다.
16
+ */
17
+ export declare function SelectionActionBar<T extends RowData>({ source, renderActions, children, keepMounted, }: SelectionActionBarProps<T>): import("react").JSX.Element;
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Button, Checkbox, Collapse, Typography } from "@mui/material";
3
+ import CloseIcon from "@mui/icons-material/Close";
4
+ import { toSelectionSource } from "../../../core/src/index";
5
+ /**
6
+ * 선택 액션바 — 행이 하나라도 선택되면 슬라이드로 나타난다.
7
+ * `SelectionSource` 계약 위에서 동작하므로 테이블 없는 카드 화면에서도 같은 바를 쓴다.
8
+ */
9
+ export function SelectionActionBar({ source, renderActions, children, keepMounted = false, }) {
10
+ const selection = toSelectionSource(source);
11
+ const selectedRows = selection.getSelectedRows();
12
+ const count = selectedRows.length;
13
+ const visible = count > 0;
14
+ const allSelected = selection.isAllSelected();
15
+ return (_jsx(Collapse, { in: visible, timeout: 250, unmountOnExit: !keepMounted, children: _jsxs(Box, { role: "toolbar", "aria-label": "\uC120\uD0DD \uC561\uC158", sx: {
16
+ display: "flex", alignItems: "center", gap: 1.5, px: 1.5, py: 0.75, mb: 1,
17
+ bgcolor: "primary.50", borderRadius: 1, border: "1px solid", borderColor: "primary.200",
18
+ }, children: [_jsx(Checkbox, { size: "small", checked: allSelected, indeterminate: !allSelected && visible, inputProps: { "aria-label": allSelected ? "전체 해제" : "전체 선택" }, onChange: () => (allSelected ? selection.deselectAll() : selection.selectAll()), sx: { p: 0.25 } }), _jsxs(Typography, { variant: "body2", fontWeight: 600, color: "primary.main", sx: { whiteSpace: "nowrap" }, children: [count, "\uAC1C \uC120\uD0DD"] }), _jsxs(Box, { sx: { display: "flex", gap: 0.5, flex: 1, alignItems: "center" }, children: [renderActions?.(selectedRows), children] }), _jsx(Button, { size: "small", color: "inherit", startIcon: _jsx(CloseIcon, { fontSize: "small" }), onClick: () => selection.deselectAll(), sx: { minWidth: "auto", color: "text.secondary", fontSize: "0.75rem" }, children: "\uD574\uC81C" })] }) }));
19
+ }
@@ -0,0 +1,17 @@
1
+ import type { RowData } from "@tanstack/react-table";
2
+ import type { AnySortSource, TableColumnDefs } from "../../../core/src/index";
3
+ export interface SortControlProps<T extends RowData> {
4
+ source: AnySortSource<T>;
5
+ /** 정렬 후보 컬럼. `search.columns` 를 그대로 넘기면 된다 */
6
+ columns: TableColumnDefs<T>;
7
+ /** 정렬이 하나도 없을 때 보여줄 문구 */
8
+ placeholder?: string;
9
+ }
10
+ /**
11
+ * 단독 정렬 컨트롤 — **테이블 헤더 없이** 정렬을 조작한다.
12
+ *
13
+ * 정렬을 `ContentSource` 에 넣지 않고 `SortSource` 로 분리한 이유가 이것이다.
14
+ * 카드 그리드·차트처럼 헤더가 없는 화면에서도 같은 정렬 상태를 그대로 쓴다.
15
+ * 테이블 화면에서는 헤더(`HeaderCell`)가 같은 계약을 쓰므로 둘이 항상 일치한다.
16
+ */
17
+ export declare function SortControl<T extends RowData>({ source, columns, placeholder, }: SortControlProps<T>): import("react").JSX.Element;
@@ -0,0 +1,45 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { Button, Chip, ListItemText, Menu, MenuItem, Stack, Tooltip, Typography, } from "@mui/material";
4
+ import ArrowDownwardIcon from "@mui/icons-material/ArrowDownward";
5
+ import ArrowUpwardIcon from "@mui/icons-material/ArrowUpward";
6
+ import SortIcon from "@mui/icons-material/Sort";
7
+ import { columnKey, toSortSource } from "../../../core/src/index";
8
+ function candidates(columns) {
9
+ const list = [];
10
+ for (const column of columns) {
11
+ const id = columnKey(column);
12
+ if (!id)
13
+ continue;
14
+ if (column.enableSorting === false)
15
+ continue;
16
+ if (column.meta?.forceHidden)
17
+ continue;
18
+ const header = column.filterLabel ?? column.header;
19
+ list.push({ id, label: typeof header === "string" ? header : id });
20
+ }
21
+ return list;
22
+ }
23
+ /**
24
+ * 단독 정렬 컨트롤 — **테이블 헤더 없이** 정렬을 조작한다.
25
+ *
26
+ * 정렬을 `ContentSource` 에 넣지 않고 `SortSource` 로 분리한 이유가 이것이다.
27
+ * 카드 그리드·차트처럼 헤더가 없는 화면에서도 같은 정렬 상태를 그대로 쓴다.
28
+ * 테이블 화면에서는 헤더(`HeaderCell`)가 같은 계약을 쓰므로 둘이 항상 일치한다.
29
+ */
30
+ export function SortControl({ source, columns, placeholder = "정렬 없음", }) {
31
+ const sort = toSortSource(source);
32
+ const [anchorEl, setAnchorEl] = useState(null);
33
+ const all = candidates(columns);
34
+ const labelOf = (id) => all.find((c) => c.id === id)?.label ?? id;
35
+ const current = sort.getSort();
36
+ const remaining = all.filter((c) => !current.some((s) => s.id === c.id));
37
+ return (_jsxs(Stack, { direction: "row", alignItems: "center", spacing: 1, sx: { flexWrap: "wrap", gap: 0.5 }, children: [_jsx(SortIcon, { fontSize: "small", sx: { color: "text.disabled" } }), current.length === 0 ? (_jsx(Typography, { variant: "body2", color: "text.disabled", children: placeholder })) : (current.map((entry, index) => (_jsx(Tooltip, { title: "\uD074\uB9AD: \uBC29\uD5A5 \uC804\uD658", children: _jsx(Chip, { size: "small", variant: "outlined", color: "primary", icon: entry.desc ? _jsx(ArrowDownwardIcon, {}) : _jsx(ArrowUpwardIcon, {}), label: current.length > 1
38
+ ? `${index + 1}. ${labelOf(entry.id)}`
39
+ : labelOf(entry.id),
40
+ // 방향 전환은 multi 로 — 아니면 다른 정렬 기준이 함께 날아간다
41
+ onClick: () => sort.toggleSort(entry.id, { desc: !entry.desc, multi: true }), onDelete: () => sort.clearSort(entry.id) }) }, entry.id)))), _jsx(Button, { size: "small", disabled: remaining.length === 0, onClick: (event) => setAnchorEl(event.currentTarget), children: "\uC815\uB82C \uCD94\uAC00" }), current.length > 0 && (_jsx(Button, { size: "small", color: "inherit", onClick: () => sort.clearSort(), children: "\uD574\uC81C" })), _jsx(Menu, { anchorEl: anchorEl, open: !!anchorEl, onClose: () => setAnchorEl(null), children: remaining.map((candidate) => (_jsx(MenuItem, { onClick: () => {
42
+ sort.toggleSort(candidate.id, { multi: current.length > 0 });
43
+ setAnchorEl(null);
44
+ }, children: _jsx(ListItemText, { primary: candidate.label }) }, candidate.id))) })] }));
45
+ }
@@ -0,0 +1,191 @@
1
+ import type { AggregationSpec } from "../../../core/src/index";
2
+ import { type ReactNode, type Ref } from "react";
3
+ import { type TableCellProps, type TableRowProps } from "@mui/material";
4
+ import { type Column, type Header, type Row, type RowData, type Table as TanTable } from "@tanstack/react-table";
5
+ import type { AggFnKey, ContentSource, FieldErrors, FlatItem, GroupPath, GroupTreeNode, SortSource } from "../../../core/src/index";
6
+ import { type RenderHeaderContext } from "./HeaderCell";
7
+ import { type CellValueOptions } from "./cellValue";
8
+ import { type Density } from "./density";
9
+ import { type ColumnMenuItemsFn, type RowMenuItemsFn } from "./menuItems";
10
+ /** 행에 얹을 MUI `TableRow` props — 기존 `muiTableBodyRowProps` 대응 */
11
+ export type RowProps = Omit<TableRowProps, "children" | "ref">;
12
+ /** detail panel 행·셀에 얹을 props — 기존 `muiDetailPanelProps`(셀) 대응 + 행 */
13
+ export interface DetailPanelProps {
14
+ row?: RowProps;
15
+ cell?: Omit<TableCellProps, "children" | "ref" | "colSpan">;
16
+ }
17
+ export type EditMode = "cell" | "row" | "modal";
18
+ export interface EditingOptions<T extends RowData> {
19
+ /**
20
+ * cell — 셀 더블클릭으로 그 셀만 편집. Enter/blur 확정, Escape 취소.
21
+ * row — `editingRowId` 행의 편집 가능 컬럼을 모두 입력으로 그린다(행 더블클릭 또는 외부 제어).
22
+ * modal — 행 더블클릭 시 `onEditRow` 를 부르고 `renderEditDialog` 가 있으면 그것을 띄운다.
23
+ */
24
+ mode: EditMode;
25
+ /** row 모드에서 편집 중인 행 id (제어형). 없으면 행 더블클릭으로 내부 상태가 정한다 */
26
+ editingRowId?: string | null;
27
+ /**
28
+ * 값 확정. 없으면 `meta.edit.onCommit(value, row.original)`, 그것도 없으면
29
+ * `row.original[columnId]` 에 직접 반영한다(EditSpec 의 기본 규칙).
30
+ */
31
+ onCommit?: (value: unknown, row: Row<T>, columnId: string) => void;
32
+ /** row/modal 모드에서 편집 진입(행 더블클릭) 알림 */
33
+ onEditRow?: (row: Row<T>) => void;
34
+ onCancel?: (row: Row<T>) => void;
35
+ }
36
+ /** 가상화 어댑터 — `VirtualTableContent` 가 채운다. 이 파일은 virtualizer 라이브러리를 모른다 */
37
+ export interface VirtualRows {
38
+ items: Array<{
39
+ index: number;
40
+ start: number;
41
+ end: number;
42
+ }>;
43
+ totalSize: number;
44
+ measureElement?: (element: Element | null) => void;
45
+ }
46
+ /**
47
+ * 열 가상화 어댑터 — **가운데(고정되지 않은) 보이는 리프 컬럼** 의 인덱스 범위다.
48
+ * 고정 컬럼은 항상 그린다. `VirtualTableContent({ virtualizeColumns })` 가 채운다.
49
+ */
50
+ export interface VirtualColumns {
51
+ items: Array<{
52
+ index: number;
53
+ start: number;
54
+ end: number;
55
+ }>;
56
+ totalSize: number;
57
+ }
58
+ export interface TableContentProps<T extends RowData> {
59
+ /** 헤더·셀 렌더에 필요하므로 콘텐츠 구역 중 **테이블 본문만** 인스턴스를 요구한다 */
60
+ table: TanTable<T>;
61
+ content?: ContentSource<T>;
62
+ sort?: SortSource;
63
+ /** 그룹핑이 켜져 있으면 평탄화된 항목을 넘긴다 */
64
+ groupItems?: Array<FlatItem<T>>;
65
+ onToggleGroup?: (node: GroupTreeNode<T>) => void;
66
+ isGroupExpanded?: (node: GroupTreeNode<T>) => boolean;
67
+ /** 서버 그룹핑의 "더 보기" — 그 경로의 하위를 배치만큼 더 받는다 */
68
+ onLoadMore?: (path: GroupPath) => void;
69
+ emptyMessage?: ReactNode;
70
+ /** 빈 상태 슬롯 — 있으면 `emptyMessage` 대신 그린다 (기존 `renderEmptyRowsFallback`) */
71
+ renderEmpty?: () => ReactNode;
72
+ /** 초기 로딩 스켈레톤 행 수. 0 이면 "불러오는 중…" 텍스트 */
73
+ skeletonRows?: number;
74
+ /** 에러 UI 의 "필터 초기화" — 있으면 버튼이 생긴다 (`search.reset`) */
75
+ onResetFilters?: () => void;
76
+ /** 에러 UI 교체 슬롯 */
77
+ renderError?: (error: Error | undefined, retry: () => void) => ReactNode;
78
+ /** 조밀도 (`density` 가 있으면 무시) */
79
+ dense?: boolean;
80
+ /** 프리셋 `density` 값을 그대로 받는다 */
81
+ density?: Density;
82
+ maxHeight?: number | string;
83
+ stickyHeader?: boolean;
84
+ /** 행별 `TableRow` props — 기존 `muiTableBodyRowProps({ row, table })` 대응 */
85
+ getRowProps?: (row: Row<T>, table: TanTable<T>) => RowProps | undefined;
86
+ /** 행 클릭으로 선택 토글 (`tableOptions.enableRowSelection` 이 허용하는 행만) */
87
+ selectOnRowClick?: boolean;
88
+ /** 펼친 행 아래 전체 폭 패널 — `expandColumn()` 과 짝. 기존 `renderDetailPanel({ row, table })` */
89
+ renderDetailPanel?: (row: Row<T>, table: TanTable<T>) => ReactNode;
90
+ /** detail panel 행·셀 props — 기존 `muiDetailPanelProps({ row, table })` */
91
+ getDetailPanelProps?: (row: Row<T>, table: TanTable<T>) => DetailPanelProps | undefined;
92
+ editing?: EditingOptions<T>;
93
+ /** modal 모드의 편집 다이얼로그 — 내용은 소비자가 그린다 */
94
+ renderEditDialog?: (row: Row<T>, close: () => void) => ReactNode;
95
+ /** 셀 단위 에러. 없으면 `useDataTable({ fieldErrors })` 로 얹은 값을 읽는다 */
96
+ fieldErrors?: FieldErrors;
97
+ /** 링크 셀(`meta.link`) 클릭 — SPA 라우터 연결 자리 */
98
+ onNavigate?: CellValueOptions<T>["onNavigate"];
99
+ /** 헤더 컬럼 메뉴(정렬·고정·이동·숨기기). 기본 true (Provider `defaults.enableColumnMenu`). 우클릭 메뉴도 같이 꺼진다 */
100
+ enableColumnMenu?: boolean;
101
+ /**
102
+ * 컬럼 메뉴(버튼·헤더 우클릭) 항목 추가·제거·재배열.
103
+ * `ctx.defaultItems` 가 기본 항목(정렬·고정·이동·숨기기·그룹·너비 초기화)이다.
104
+ */
105
+ columnMenuItems?: ColumnMenuItemsFn<T>;
106
+ /** 있으면 컬럼 메뉴에 "그룹 기준 추가/제거" 항목이 생긴다 (`search.setGrouping` 등) */
107
+ onGroupingChange?: (grouping: string[]) => void;
108
+ /** 그룹핑 중 헤더 메뉴 "집계" 항목 — `search.params.aggregation` / `patchParams({ aggregation })` */
109
+ aggregation?: AggregationSpec;
110
+ onAggregationChange?: (next: AggregationSpec) => void;
111
+ /** 있으면 컬럼 메뉴에 "필터 열기" 항목이 생긴다 (미지정 시 Provider `onOpenFilter`) */
112
+ onOpenFilter?: (column: Column<T, unknown>, table: TanTable<T>) => void;
113
+ /** 헤더 `TableCell` props — 기존 `muiTableHeadCellProps({ column, table })` 대응 */
114
+ headerCellProps?: (header: Header<T, unknown>, table: TanTable<T>) => TableCellProps | undefined;
115
+ /** 헤더 내용 규칙 덮어쓰기 — 단위·필수 표시·툴팁. `ctx.defaultContent` 를 감싸거나 대체한다 */
116
+ renderHeader?: (ctx: RenderHeaderContext<T>) => ReactNode;
117
+ /**
118
+ * 본문 행 우클릭 메뉴. 말단 행은 `ctx.row`, 그룹 행은 `ctx.group` 이 있다.
119
+ * 기본 항목(Provider `menus.row` 레지스트리 — 말단: 행 복사 / 그룹: 펼치기·접기·N단계까지 펼치기)은
120
+ * `ctx.defaultItems` 로 온다 — 미지정이면 그 기본 항목이 그대로 뜬다. 빈 배열을 돌려주면 메뉴를 열지 않는다(브라우저 기본 메뉴).
121
+ */
122
+ rowMenuItems?: RowMenuItemsFn<T>;
123
+ /** 그룹 행 메뉴의 "N단계까지 펼치기" — `group.expand.expandToDepth` 를 넘긴다. 없으면 그 항목이 빠진다 */
124
+ onExpandGroupToDepth?: (depth: number, node: GroupTreeNode<T>) => void;
125
+ /**
126
+ * 그룹핑이 켜져 있을 때(`groupItems` 있음) 그룹 기준 컬럼을 어떻게 놓을지.
127
+ * - `reorder`(기본) — 그룹 컬럼을 맨 앞(왼쪽 고정 컬럼 다음)으로 당긴다. TanStack 상태는 건드리지
128
+ * 않고 **렌더 순서만** 바꾼다 (`row.getVisibleCells()` / `headerGroup.headers` 재배열).
129
+ * - `remove` — 그룹 컬럼을 헤더·본문에서 뺀다. 값은 그룹 행 헤더에 이미 보인다. colSpan 도 줄어든다.
130
+ * - `false` — 선언 순서 그대로.
131
+ * 열 가상화(`VirtualTableContent({ virtualizeColumns })`)가 켜져 있거나 헤더가 2단 이상이면
132
+ * 순서·colSpan 을 맞출 수 없어 **둘 다 건너뛴다**(선언 순서 그대로).
133
+ */
134
+ groupedColumnMode?: GroupedColumnMode;
135
+ /**
136
+ * 그룹 기준 컬럼 id. 기본은 `table.getState().grouping` — `useDataTable` 이 `search.params.grouping`
137
+ * 을 넣어 준다. TanStack 상태와 다른 기준으로 그리고 있으면 여기로 덮어쓴다.
138
+ */
139
+ grouping?: string[];
140
+ /**
141
+ * 그룹 행 배치.
142
+ * - `columns`(기본) — 그룹 행도 **컬럼별 셀**로 그린다. 현재 depth 의 그룹 컬럼 셀에 펼침 아이콘 + 그룹값 + `(n)`,
143
+ * 다른 그룹 컬럼은 빈 셀, 나머지 컬럼에는 그 컬럼의 집계 칩(`AggregateChip`)이 **그 컬럼 아래** 놓인다.
144
+ * - `inline` — 한 셀(colSpan)에 그룹값과 집계 캡션을 줄줄이 붙인다. 카드·좁은 화면용.
145
+ */
146
+ groupRowLayout?: GroupRowLayout;
147
+ /** 그룹 행 높이(px). 미지정 시 내용에 맞춘다 */
148
+ groupRowHeight?: number;
149
+ /**
150
+ * 컬럼별로 그룹 행에 보일 집계 함수 `{ 컬럼: 함수 }` (제어형). 컬럼에 집계가 둘 이상이면 칩을 눌러 바꾼다.
151
+ * 없으면 내부 상태로 관리한다. 목록에 없는 컬럼은 첫 집계 값을 보인다.
152
+ */
153
+ aggregateSelection?: Record<string, AggFnKey>;
154
+ /** 칩으로 함수를 바꿨을 때. `aggregateSelection` 없이 주면 내부 상태도 함께 바뀐다 */
155
+ onAggregateSelectionChange?: (columnId: string, fn: AggFnKey) => void;
156
+ }
157
+ export type GroupRowLayout = "columns" | "inline";
158
+ export type GroupedColumnMode = "reorder" | "remove" | false;
159
+ /**
160
+ * 그룹 컬럼 배치 — 렌더 순서만 바꾼다.
161
+ * `reorder`: 왼쪽 고정 → 그룹 컬럼(grouping 순) → 나머지 → 오른쪽 고정.
162
+ * `remove`: 그룹 컬럼 제외.
163
+ * `false`: 선언 순서. `declaredRank`(선언 순서 + `columnOrder`, 그룹핑 무시)를 주면 그 순서로 되돌린다 —
164
+ * TanStack 은 `grouping` 상태가 있으면 자체 `groupedColumnMode`(기본 `reorder`)로 이미 그룹 컬럼을
165
+ * 앞으로 당겨 놓기 때문에, "그대로" 를 그리려면 되돌려야 한다.
166
+ * 고정 컬럼은 sticky 오프셋(`getStart`)이 TanStack 순서 기준이므로 자리를 옮기지 않는다.
167
+ */
168
+ export declare function arrangeGroupedColumns<C extends {
169
+ id: string;
170
+ getIsPinned: () => false | "left" | "right";
171
+ }>(columns: C[], grouping: readonly string[], mode: GroupedColumnMode, declaredRank?: ReadonlyMap<string, number>): C[];
172
+ /** 내부 전용 — `VirtualTableContent` 가 컨테이너 ref 와 가상 행 범위를 넘긴다 */
173
+ export interface TableContentInternalProps<T extends RowData> extends TableContentProps<T> {
174
+ virtual?: VirtualRows;
175
+ virtualColumns?: VirtualColumns;
176
+ containerRef?: Ref<HTMLDivElement>;
177
+ }
178
+ /**
179
+ * 콘텐츠 구역 — 테이블 본문.
180
+ *
181
+ * 로딩·에러·빈 상태를 **제자리에서** 그린다. 조회 실패를 throw 해서 상위
182
+ * ErrorBoundary 로 올리면 테이블 트리가 통째로 파괴되고, 리마운트가 캐시의
183
+ * 에러를 다시 읽어 즉시 재-throw 하므로 경계 리셋으로 복구가 안 된다.
184
+ *
185
+ * 행 선택·확장·고정·리사이즈·순서는 TanStack 상태를 그대로 그린다. 기능을 켜는 것은
186
+ * `useDataTable` 의 `tableOptions` (`enableRowSelection`, `enableColumnResizing`,
187
+ * `getRowCanExpand` …) 몫이고, 체크박스·확장 토글·행 번호·행 액션 열은
188
+ * `withDisplayColumns()` 로 컬럼 목록에 끼운다.
189
+ */
190
+ export declare function TableContent<T extends RowData>(props: TableContentProps<T>): import("react").JSX.Element;
191
+ export declare function TableContentBase<T extends RowData>(rawProps: TableContentInternalProps<T>): import("react").JSX.Element;