@lowdefy/blocks-table 0.0.0-experimental-20260929110023

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 (590) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +12 -0
  3. package/dist/blocks/Table/Table.js +25 -0
  4. package/dist/blocks/Table/Table.lazy.js +33 -0
  5. package/dist/blocks/Table/TableFallback.js +35 -0
  6. package/dist/blocks/Table/e2e.js +47 -0
  7. package/dist/blocks/Table/gallery.yaml +836 -0
  8. package/dist/blocks/Table/meta.js +964 -0
  9. package/dist/blocks/Table/tests/Table.e2e.yaml +434 -0
  10. package/dist/blocks/Table/tests/TableFeatures.e2e.yaml +291 -0
  11. package/dist/blocks/Table/tests/TableLinkTarget.e2e.yaml +25 -0
  12. package/dist/blocks/Table/tests/TableParity.e2e.yaml +101 -0
  13. package/dist/blocks/Table/tests/bulk.e2e.yaml +271 -0
  14. package/dist/blocks/Table/tests/deals.yaml +30 -0
  15. package/dist/blocks/Table/tests/deals_columns.yaml +37 -0
  16. package/dist/blocks/Table/tests/editing.e2e.yaml +501 -0
  17. package/dist/blocks/Table/tests/expandable.e2e.yaml +87 -0
  18. package/dist/blocks/Table/tests/filtering.e2e.yaml +251 -0
  19. package/dist/blocks/Table/tests/grouping.e2e.yaml +272 -0
  20. package/dist/blocks/Table/tests/grouping_deals.yaml +24 -0
  21. package/dist/blocks/Table/tests/grouping_deals_columns.yaml +32 -0
  22. package/dist/blocks/Table/tests/headerMenu.e2e.yaml +134 -0
  23. package/dist/blocks/Table/tests/parity_properties.yaml +144 -0
  24. package/dist/blocks/Table/tests/people.yaml +39 -0
  25. package/dist/blocks/Table/tests/people_columns.yaml +22 -0
  26. package/dist/blocks/Table/tests/polish.e2e.yaml +372 -0
  27. package/dist/blocks/Table/tests/server-mongodb.e2e.yaml +169 -0
  28. package/dist/blocks/Table/tests/server.e2e.yaml +267 -0
  29. package/dist/blocks/Table/tests/toolbar.e2e.yaml +140 -0
  30. package/dist/blocks/Table/tests/tree.e2e.yaml +245 -0
  31. package/dist/blocks/Table/tests/views.e2e.yaml +235 -0
  32. package/dist/blocks/TableInput/TableInput.js +24 -0
  33. package/dist/blocks/TableInput/TableInput.lazy.js +17 -0
  34. package/dist/blocks/TableInput/TableInputRoot.js +65 -0
  35. package/dist/blocks/TableInput/e2e.js +16 -0
  36. package/dist/blocks/TableInput/gallery.yaml +153 -0
  37. package/dist/blocks/TableInput/meta.js +93 -0
  38. package/dist/blocks/TableInput/tests/TableInput.e2e.yaml +272 -0
  39. package/dist/blocks.js +16 -0
  40. package/dist/core/Body.js +112 -0
  41. package/dist/core/Cell.js +86 -0
  42. package/dist/core/Chevron.js +32 -0
  43. package/dist/core/EmptyState.js +32 -0
  44. package/dist/core/Grid.js +219 -0
  45. package/dist/core/GroupHeaderRow.js +81 -0
  46. package/dist/core/HeaderCell.js +58 -0
  47. package/dist/core/HeaderRow.js +76 -0
  48. package/dist/core/HeaderTitle.js +49 -0
  49. package/dist/core/LazyCell.js +71 -0
  50. package/dist/core/LoadingRows.js +38 -0
  51. package/dist/core/RenderProbeContext.js +19 -0
  52. package/dist/core/Row.js +98 -0
  53. package/dist/core/SkeletonRow.js +42 -0
  54. package/dist/core/SummaryRow.js +86 -0
  55. package/dist/core/TableRoot.js +195 -0
  56. package/dist/core/aggregateShortLabels.js +25 -0
  57. package/dist/core/applyLayoutVars.js +22 -0
  58. package/dist/core/buildGroupSegments.js +36 -0
  59. package/dist/core/collectBodyOverlays.js +20 -0
  60. package/dist/core/collectCellLeads.js +21 -0
  61. package/dist/core/collectClaimedViewKeys.js +26 -0
  62. package/dist/core/collectGridHandlers.js +29 -0
  63. package/dist/core/collectHeaderParts.js +20 -0
  64. package/dist/core/collectRowRenderers.js +21 -0
  65. package/dist/core/collectSliceDefinitions.js +29 -0
  66. package/dist/core/computeLayout.js +133 -0
  67. package/dist/core/createAccessor.js +39 -0
  68. package/dist/core/createApi.js +86 -0
  69. package/dist/core/createCellActivity.js +47 -0
  70. package/dist/core/createColumnDefs.js +42 -0
  71. package/dist/core/createFeatureActions.js +24 -0
  72. package/dist/core/createFeatureSet.js +39 -0
  73. package/dist/core/createInitialState.js +63 -0
  74. package/dist/core/createKeyIndex.js +26 -0
  75. package/dist/core/createMethodStubs.js +30 -0
  76. package/dist/core/createSliceHandlers.js +26 -0
  77. package/dist/core/createStableCoreRowModel.js +91 -0
  78. package/dist/core/createTanstackFeatures.js +24 -0
  79. package/dist/core/createTextMeasure.js +106 -0
  80. package/dist/core/densityHeights.js +20 -0
  81. package/dist/core/deriveValue.js +53 -0
  82. package/dist/core/dispatchGridEvent.js +21 -0
  83. package/dist/core/distributeFlex.js +28 -0
  84. package/dist/core/getCellFit.js +34 -0
  85. package/dist/core/getHeaderCellProps.js +21 -0
  86. package/dist/core/getHeaderLevels.js +50 -0
  87. package/dist/core/getRecordCount.js +23 -0
  88. package/dist/core/getSummaryLabel.js +35 -0
  89. package/dist/core/getValueSignature.js +26 -0
  90. package/dist/core/isDataItem.js +21 -0
  91. package/dist/core/isDefaultViewColumns.js +36 -0
  92. package/dist/core/isRowEqual.js +40 -0
  93. package/dist/core/isSameSignature.js +19 -0
  94. package/dist/core/lazyCellTypes.js +33 -0
  95. package/dist/core/lazyComponent.js +30 -0
  96. package/dist/core/loadOptionalFeature.js +35 -0
  97. package/dist/core/normalizeViewColumn.js +29 -0
  98. package/dist/core/pickViewPart.js +23 -0
  99. package/dist/core/renderRegion.js +21 -0
  100. package/dist/core/resolveMountValue.js +31 -0
  101. package/dist/core/resolveViewColumns.js +65 -0
  102. package/dist/core/someColumnConfig.js +30 -0
  103. package/dist/core/stabilizeData.js +90 -0
  104. package/dist/core/table.css +557 -0
  105. package/dist/core/useFeatureData.js +35 -0
  106. package/dist/core/useFeatureFragments.js +55 -0
  107. package/dist/core/useFeatureItems.js +78 -0
  108. package/dist/core/useFeatureMethods.js +29 -0
  109. package/dist/core/useFeatureRows.js +36 -0
  110. package/dist/core/useFeatureSet.js +54 -0
  111. package/dist/core/useForeignKeys.js +38 -0
  112. package/dist/core/useGridFeatures.js +26 -0
  113. package/dist/core/useStableConfig.js +34 -0
  114. package/dist/core/useSummary.js +73 -0
  115. package/dist/core/useTableConfig.js +189 -0
  116. package/dist/core/useTableState.js +150 -0
  117. package/dist/core/useViewportSize.js +40 -0
  118. package/dist/e2e.js +16 -0
  119. package/dist/features/bulk/BulkBar.js +46 -0
  120. package/dist/features/bulk/bulk.css +57 -0
  121. package/dist/features/bulk/bulkFeature.js +28 -0
  122. package/dist/features/bulk/countSelection.js +27 -0
  123. package/dist/features/bulk/createSelectAllMatching.js +43 -0
  124. package/dist/features/bulk/useBulkBar.js +42 -0
  125. package/dist/features/clipboard/clipboardFeature.js +24 -0
  126. package/dist/features/clipboard/createPasteCells.js +61 -0
  127. package/dist/features/clipboard/getCopyText.js +57 -0
  128. package/dist/features/clipboard/handleCopyKeyDown.js +37 -0
  129. package/dist/features/clipboard/parseTsv.js +70 -0
  130. package/dist/features/clipboard/pasteFeature.js +26 -0
  131. package/dist/features/clipboard/planPaste.js +101 -0
  132. package/dist/features/clipboard/serializeTsv.js +25 -0
  133. package/dist/features/clipboard/usePasteListener.js +45 -0
  134. package/dist/features/columnManager/ColumnManager.js +253 -0
  135. package/dist/features/columnManager/ColumnManagerPopover.js +37 -0
  136. package/dist/features/columnManager/DragHandleIcon.js +39 -0
  137. package/dist/features/columnManager/LazyColumnManagerPopover.js +19 -0
  138. package/dist/features/columnManager/applyManagerRegions.js +43 -0
  139. package/dist/features/columnManager/boundaryIds.js +21 -0
  140. package/dist/features/columnManager/buildManagerSequence.js +38 -0
  141. package/dist/features/columnManager/columnManager.css +155 -0
  142. package/dist/features/columnManager/columnManagerFeature.js +37 -0
  143. package/dist/features/columnManager/createCloseColumnManager.js +21 -0
  144. package/dist/features/columnManager/createOpenColumnManager.js +21 -0
  145. package/dist/features/columnManager/createResetColumns.js +43 -0
  146. package/dist/features/columnManager/getColumnManagerMenuItems.js +26 -0
  147. package/dist/features/columnManager/getListRoom.js +31 -0
  148. package/dist/features/columnManager/getManagerEntries.js +31 -0
  149. package/dist/features/columnManager/moveSequenceEntry.js +25 -0
  150. package/dist/features/columnManager/sequenceToRegions.js +38 -0
  151. package/dist/features/columnManager/snapListHeight.js +35 -0
  152. package/dist/features/columnManager/updateScrollHints.js +23 -0
  153. package/dist/features/columnManager/useColumnManager.js +36 -0
  154. package/dist/features/density/densityFeature.js +39 -0
  155. package/dist/features/density/densityToValue.js +23 -0
  156. package/dist/features/density/getViewWrapColumn.js +53 -0
  157. package/dist/features/density/initDensity.js +27 -0
  158. package/dist/features/density/initWrap.js +23 -0
  159. package/dist/features/editing/AddRowButton.js +28 -0
  160. package/dist/features/editing/CellEditor.js +284 -0
  161. package/dist/features/editing/EditMarker.js +38 -0
  162. package/dist/features/editing/EditingLayer.js +148 -0
  163. package/dist/features/editing/RowControlsCell.js +89 -0
  164. package/dist/features/editing/RowControlsHeader.js +18 -0
  165. package/dist/features/editing/SelectedTag.js +33 -0
  166. package/dist/features/editing/addChangeRow.js +34 -0
  167. package/dist/features/editing/applyChangeUpdates.js +28 -0
  168. package/dist/features/editing/applyChanges.js +90 -0
  169. package/dist/features/editing/applyMoveOverlay.js +44 -0
  170. package/dist/features/editing/applyMoveToChanges.js +66 -0
  171. package/dist/features/editing/applyOverlay.js +41 -0
  172. package/dist/features/editing/coerceCellValue.js +187 -0
  173. package/dist/features/editing/collectRawColumns.js +38 -0
  174. package/dist/features/editing/computeEditTargets.js +108 -0
  175. package/dist/features/editing/computeRowMove.js +78 -0
  176. package/dist/features/editing/createAddRow.js +68 -0
  177. package/dist/features/editing/createCancelEdit.js +29 -0
  178. package/dist/features/editing/createCommitEdit.js +124 -0
  179. package/dist/features/editing/createDeleteRow.js +39 -0
  180. package/dist/features/editing/createEditSpecs.js +80 -0
  181. package/dist/features/editing/createEmptyChanges.js +23 -0
  182. package/dist/features/editing/createMoveRow.js +65 -0
  183. package/dist/features/editing/createNewRow.js +32 -0
  184. package/dist/features/editing/createResetChanges.js +29 -0
  185. package/dist/features/editing/createSaveCellEdit.js +113 -0
  186. package/dist/features/editing/createSaveRowMove.js +90 -0
  187. package/dist/features/editing/createStartEdit.js +57 -0
  188. package/dist/features/editing/createStepHistory.js +33 -0
  189. package/dist/features/editing/createUndoStack.js +67 -0
  190. package/dist/features/editing/createValueStore.js +34 -0
  191. package/dist/features/editing/createWriteCell.js +34 -0
  192. package/dist/features/editing/createWriteChanges.js +43 -0
  193. package/dist/features/editing/editing.css +223 -0
  194. package/dist/features/editing/editingFeature.js +66 -0
  195. package/dist/features/editing/findCellByKey.js +23 -0
  196. package/dist/features/editing/findInvalidCells.js +41 -0
  197. package/dist/features/editing/findNextEditableCell.js +54 -0
  198. package/dist/features/editing/focusCell.js +28 -0
  199. package/dist/features/editing/fromDateValue.js +29 -0
  200. package/dist/features/editing/fromEditorDraft.js +45 -0
  201. package/dist/features/editing/generateRowKey.js +25 -0
  202. package/dist/features/editing/getDataGap.js +28 -0
  203. package/dist/features/editing/getEditOptions.js +33 -0
  204. package/dist/features/editing/getEditorKind.js +36 -0
  205. package/dist/features/editing/getEventError.js +24 -0
  206. package/dist/features/editing/getKeyField.js +23 -0
  207. package/dist/features/editing/getReorderBlock.js +33 -0
  208. package/dist/features/editing/handleEditDoubleClick.js +34 -0
  209. package/dist/features/editing/handleEditKeyDown.js +123 -0
  210. package/dist/features/editing/handleRowControlsClick.js +29 -0
  211. package/dist/features/editing/handleRowDragPointerDown.js +95 -0
  212. package/dist/features/editing/isCellEditable.js +20 -0
  213. package/dist/features/editing/isPrintableKey.js +22 -0
  214. package/dist/features/editing/isSameTargets.js +19 -0
  215. package/dist/features/editing/matchOption.js +21 -0
  216. package/dist/features/editing/needsEditing.js +26 -0
  217. package/dist/features/editing/normalizeChanges.js +37 -0
  218. package/dist/features/editing/positionBetween.js +30 -0
  219. package/dist/features/editing/pruneOverlay.js +39 -0
  220. package/dist/features/editing/removeChangeRow.js +48 -0
  221. package/dist/features/editing/reorderByKeys.js +34 -0
  222. package/dist/features/editing/rowControlsColumn.js +33 -0
  223. package/dist/features/editing/setChangeField.js +72 -0
  224. package/dist/features/editing/setRowField.js +23 -0
  225. package/dist/features/editing/sortByPosition.js +31 -0
  226. package/dist/features/editing/toDateValue.js +38 -0
  227. package/dist/features/editing/toEditorDraft.js +56 -0
  228. package/dist/features/editing/toSelectOptions.js +39 -0
  229. package/dist/features/editing/useEditingData.js +199 -0
  230. package/dist/features/editing/useEditingFragments.js +77 -0
  231. package/dist/features/editing/useEditingGrid.js +25 -0
  232. package/dist/features/editing/validateCellValue.js +25 -0
  233. package/dist/features/editing/valuesEqual.js +31 -0
  234. package/dist/features/editing/warnMissingEvent.js +23 -0
  235. package/dist/features/events/createActivateRow.js +54 -0
  236. package/dist/features/events/eventsFeature.js +35 -0
  237. package/dist/features/events/getBodyTarget.js +27 -0
  238. package/dist/features/events/getRowIndex.js +24 -0
  239. package/dist/features/events/handleAuxClick.js +38 -0
  240. package/dist/features/events/handlePointerDown.js +22 -0
  241. package/dist/features/events/handleRowClick.js +57 -0
  242. package/dist/features/events/handleRowDoubleClick.js +45 -0
  243. package/dist/features/events/isTextDrag.js +30 -0
  244. package/dist/features/events/openRowLink.js +29 -0
  245. package/dist/features/expandable/DetailRow.js +57 -0
  246. package/dist/features/expandable/ExpandToggle.js +34 -0
  247. package/dist/features/expandable/expandable.css +40 -0
  248. package/dist/features/expandable/expandableFeature.js +34 -0
  249. package/dist/features/expandable/handleExpandClick.js +25 -0
  250. package/dist/features/expandable/needsExpandable.js +20 -0
  251. package/dist/features/expandable/normalizeExpandable.js +52 -0
  252. package/dist/features/expandable/useExpandableItems.js +101 -0
  253. package/dist/features/expansion/createToggleRowExpanded.js +52 -0
  254. package/dist/features/expansion/expansionFeature.js +31 -0
  255. package/dist/features/expansion/getExpandedIds.js +26 -0
  256. package/dist/features/expansion/initExpanded.js +22 -0
  257. package/dist/features/export/buildCsv.js +39 -0
  258. package/dist/features/export/createExportCsv.js +59 -0
  259. package/dist/features/export/exportFeature.js +25 -0
  260. package/dist/features/export/toCsvField.js +20 -0
  261. package/dist/features/filtering/ChoiceFilter.js +30 -0
  262. package/dist/features/filtering/CloseIcon.js +29 -0
  263. package/dist/features/filtering/ColumnFilter.js +192 -0
  264. package/dist/features/filtering/ColumnFilterPopover.js +38 -0
  265. package/dist/features/filtering/DateFilter.js +80 -0
  266. package/dist/features/filtering/DraftInput.js +37 -0
  267. package/dist/features/filtering/DraftInputNumber.js +36 -0
  268. package/dist/features/filtering/FilterBuilder.js +45 -0
  269. package/dist/features/filtering/FilterGroup.js +116 -0
  270. package/dist/features/filtering/FilterIcon.js +26 -0
  271. package/dist/features/filtering/FilterIndicator.js +40 -0
  272. package/dist/features/filtering/FilterLeaf.js +86 -0
  273. package/dist/features/filtering/LazyColumnFilterPopover.js +19 -0
  274. package/dist/features/filtering/LazyFilterBuilder.js +19 -0
  275. package/dist/features/filtering/NumberFilter.js +43 -0
  276. package/dist/features/filtering/OptionsFilter.js +72 -0
  277. package/dist/features/filtering/RelativeDateEditor.js +90 -0
  278. package/dist/features/filtering/TextFilter.js +51 -0
  279. package/dist/features/filtering/ValueEditor.js +210 -0
  280. package/dist/features/filtering/buildColumnFilter.js +95 -0
  281. package/dist/features/filtering/changeLeafOperator.js +46 -0
  282. package/dist/features/filtering/createApplyFiltering.js +78 -0
  283. package/dist/features/filtering/createClearFilters.js +24 -0
  284. package/dist/features/filtering/createCloseColumnFilter.js +28 -0
  285. package/dist/features/filtering/createConditionFilteredRowModel.js +40 -0
  286. package/dist/features/filtering/createDefaultLeaf.js +31 -0
  287. package/dist/features/filtering/createOpenColumnFilter.js +25 -0
  288. package/dist/features/filtering/createRowTest.js +32 -0
  289. package/dist/features/filtering/createSearchMatcher.js +35 -0
  290. package/dist/features/filtering/createSetFilter.js +27 -0
  291. package/dist/features/filtering/createSetSearch.js +29 -0
  292. package/dist/features/filtering/createUpdateColumnFilter.js +29 -0
  293. package/dist/features/filtering/defaultRelativeDate.js +20 -0
  294. package/dist/features/filtering/filterRowModel.js +66 -0
  295. package/dist/features/filtering/filtering.css +151 -0
  296. package/dist/features/filtering/filteringFeature.js +82 -0
  297. package/dist/features/filtering/filteringToValue.js +23 -0
  298. package/dist/features/filtering/formatFilterDate.js +24 -0
  299. package/dist/features/filtering/getColumnConditions.js +24 -0
  300. package/dist/features/filtering/getConditionKeys.js +31 -0
  301. package/dist/features/filtering/getDistinctOptions.js +52 -0
  302. package/dist/features/filtering/getFilterKind.js +37 -0
  303. package/dist/features/filtering/getFilterResultKey.js +26 -0
  304. package/dist/features/filtering/getFilterResults.js +53 -0
  305. package/dist/features/filtering/getFilteredKeys.js +31 -0
  306. package/dist/features/filtering/getFilteringHeaderProps.js +22 -0
  307. package/dist/features/filtering/getFilteringMenuItems.js +42 -0
  308. package/dist/features/filtering/getFilteringTableOptions.js +33 -0
  309. package/dist/features/filtering/getGroupOperator.js +23 -0
  310. package/dist/features/filtering/getOperatorLabel.js +50 -0
  311. package/dist/features/filtering/getPlainTitle.js +26 -0
  312. package/dist/features/filtering/getSearchColumns.js +23 -0
  313. package/dist/features/filtering/getSearchKey.js +19 -0
  314. package/dist/features/filtering/getSearchText.js +57 -0
  315. package/dist/features/filtering/getTopLevelConditions.js +25 -0
  316. package/dist/features/filtering/getValueShape.js +30 -0
  317. package/dist/features/filtering/handleFilterIndicatorClick.js +25 -0
  318. package/dist/features/filtering/initFilter.js +25 -0
  319. package/dist/features/filtering/initSearch.js +24 -0
  320. package/dist/features/filtering/isColumnCondition.js +22 -0
  321. package/dist/features/filtering/isCompleteLeaf.js +45 -0
  322. package/dist/features/filtering/isServerMode.js +21 -0
  323. package/dist/features/filtering/normalizeSearch.js +21 -0
  324. package/dist/features/filtering/parseColumnFilter.js +128 -0
  325. package/dist/features/filtering/parseFilterDate.js +24 -0
  326. package/dist/features/filtering/prepareFilterResult.js +63 -0
  327. package/dist/features/filtering/pruneCondition.js +35 -0
  328. package/dist/features/filtering/setColumnFilter.js +51 -0
  329. package/dist/features/filtering/textFilterOperators.js +26 -0
  330. package/dist/features/filtering/toRootGroup.js +34 -0
  331. package/dist/features/filtering/useDraft.js +65 -0
  332. package/dist/features/filtering/useFilteringState.js +32 -0
  333. package/dist/features/filtering/useSyncedState.js +45 -0
  334. package/dist/features/grouping/GroupCell.js +72 -0
  335. package/dist/features/grouping/GroupCheckbox.js +38 -0
  336. package/dist/features/grouping/GroupLabel.js +73 -0
  337. package/dist/features/grouping/GroupRow.js +103 -0
  338. package/dist/features/grouping/StickyGroupRow.js +136 -0
  339. package/dist/features/grouping/buildGroupTree.js +138 -0
  340. package/dist/features/grouping/buildStickyLevels.js +35 -0
  341. package/dist/features/grouping/countGroupSelection.js +26 -0
  342. package/dist/features/grouping/createAggregateColumns.js +38 -0
  343. package/dist/features/grouping/createCollapseAllGroups.js +26 -0
  344. package/dist/features/grouping/createExpandAllGroups.js +23 -0
  345. package/dist/features/grouping/createGroupLevels.js +46 -0
  346. package/dist/features/grouping/createSetCollapsedGroups.js +27 -0
  347. package/dist/features/grouping/createSetGroup.js +35 -0
  348. package/dist/features/grouping/createSetGroupKeys.js +27 -0
  349. package/dist/features/grouping/createToggleGroup.js +38 -0
  350. package/dist/features/grouping/createToggleGroupSelected.js +49 -0
  351. package/dist/features/grouping/findGroupIndices.js +25 -0
  352. package/dist/features/grouping/flattenGroups.js +58 -0
  353. package/dist/features/grouping/getGroupLabel.js +34 -0
  354. package/dist/features/grouping/getStickyGroups.js +60 -0
  355. package/dist/features/grouping/groupRowsFeature.js +57 -0
  356. package/dist/features/grouping/grouping.css +128 -0
  357. package/dist/features/grouping/groupingFeature.js +48 -0
  358. package/dist/features/grouping/groupingHeaderMenuItems.js +44 -0
  359. package/dist/features/grouping/groupingToValue.js +26 -0
  360. package/dist/features/grouping/handleGroupClick.js +51 -0
  361. package/dist/features/grouping/handleGroupKeyDown.js +60 -0
  362. package/dist/features/grouping/initAggregates.js +36 -0
  363. package/dist/features/grouping/initCollapsedGroups.js +29 -0
  364. package/dist/features/grouping/initGrouping.js +34 -0
  365. package/dist/features/grouping/needsGroupRows.js +23 -0
  366. package/dist/features/grouping/orderGroups.js +49 -0
  367. package/dist/features/grouping/resolveAggregates.js +29 -0
  368. package/dist/features/grouping/toGroupIdentity.js +24 -0
  369. package/dist/features/grouping/toGroupKeys.js +24 -0
  370. package/dist/features/grouping/useGrouping.js +91 -0
  371. package/dist/features/headerMenu/HeaderMenuDropdown.js +86 -0
  372. package/dist/features/headerMenu/HeaderMenuTrigger.js +44 -0
  373. package/dist/features/headerMenu/LazyHeaderMenuDropdown.js +19 -0
  374. package/dist/features/headerMenu/MenuIcon.js +38 -0
  375. package/dist/features/headerMenu/collectHeaderMenuItems.js +69 -0
  376. package/dist/features/headerMenu/createAutosizeColumn.js +35 -0
  377. package/dist/features/headerMenu/createCloseHeaderMenu.js +28 -0
  378. package/dist/features/headerMenu/createOpenHeaderMenu.js +30 -0
  379. package/dist/features/headerMenu/focusHeaderControl.js +31 -0
  380. package/dist/features/headerMenu/freezeColumns.js +31 -0
  381. package/dist/features/headerMenu/getChromeMenuItems.js +144 -0
  382. package/dist/features/headerMenu/getVisibleOrder.js +19 -0
  383. package/dist/features/headerMenu/handleHeaderButtonPointerDown.js +27 -0
  384. package/dist/features/headerMenu/handleHeaderMenuClick.js +26 -0
  385. package/dist/features/headerMenu/handleHeaderMenuKeyDown.js +28 -0
  386. package/dist/features/headerMenu/headerMenu.css +122 -0
  387. package/dist/features/headerMenu/headerMenuFeature.js +46 -0
  388. package/dist/features/headerMenu/measureColumnWidth.js +51 -0
  389. package/dist/features/headerMenu/pinColumn.js +27 -0
  390. package/dist/features/headerMenu/sectionOrder.js +25 -0
  391. package/dist/features/headerMenu/useHeaderMenuState.js +27 -0
  392. package/dist/features/index.js +149 -0
  393. package/dist/features/keyboard/findCellElement.js +21 -0
  394. package/dist/features/keyboard/getNextCell.js +74 -0
  395. package/dist/features/keyboard/handleGridFocus.js +31 -0
  396. package/dist/features/keyboard/handleGridKeyDown.js +72 -0
  397. package/dist/features/keyboard/isCellRendered.js +22 -0
  398. package/dist/features/keyboard/keyboardFeature.js +26 -0
  399. package/dist/features/keyboard/useKeyboard.js +84 -0
  400. package/dist/features/lazyCells/getBodyRowKey.js +19 -0
  401. package/dist/features/lazyCells/handlePointerLeave.js +21 -0
  402. package/dist/features/lazyCells/handlePointerOver.js +22 -0
  403. package/dist/features/lazyCells/handleRowBlur.js +22 -0
  404. package/dist/features/lazyCells/handleRowFocus.js +26 -0
  405. package/dist/features/lazyCells/lazyCellsFeature.js +33 -0
  406. package/dist/features/lazyCells/useFastScroll.js +57 -0
  407. package/dist/features/ordering/getColumnClientBounds.js +32 -0
  408. package/dist/features/ordering/handleReorderPointerDown.js +137 -0
  409. package/dist/features/ordering/initColumnOrder.js +18 -0
  410. package/dist/features/ordering/moveKeys.js +27 -0
  411. package/dist/features/ordering/orderingFeature.js +35 -0
  412. package/dist/features/pagination/TablePagination.js +31 -0
  413. package/dist/features/pagination/initPageSize.js +28 -0
  414. package/dist/features/pagination/paginationFeature.js +36 -0
  415. package/dist/features/pagination/paginationToValue.js +24 -0
  416. package/dist/features/pagination/usePager.js +32 -0
  417. package/dist/features/pagination/usePagination.js +58 -0
  418. package/dist/features/pinning/initColumnPinning.js +21 -0
  419. package/dist/features/pinning/pinningFeature.js +33 -0
  420. package/dist/features/pinning/pinningToViewColumn.js +24 -0
  421. package/dist/features/queue/createAfterRowAction.js +40 -0
  422. package/dist/features/queue/findNextRowId.js +26 -0
  423. package/dist/features/queue/findRowAction.js +77 -0
  424. package/dist/features/queue/handleRowActionKey.js +44 -0
  425. package/dist/features/queue/queueFeature.js +27 -0
  426. package/dist/features/selection/SelectAllHeader.js +40 -0
  427. package/dist/features/selection/SelectCell.js +30 -0
  428. package/dist/features/selection/countSelectedRows.js +31 -0
  429. package/dist/features/selection/createClearSelection.js +29 -0
  430. package/dist/features/selection/createToggleAllRowsSelected.js +60 -0
  431. package/dist/features/selection/createToggleRowSelected.js +86 -0
  432. package/dist/features/selection/getRawRowKey.js +23 -0
  433. package/dist/features/selection/getSelectAllExcept.js +23 -0
  434. package/dist/features/selection/getSelectAllState.js +42 -0
  435. package/dist/features/selection/handleSelectionClick.js +30 -0
  436. package/dist/features/selection/initRowSelection.js +36 -0
  437. package/dist/features/selection/initSelectionMode.js +19 -0
  438. package/dist/features/selection/initSelectionView.js +35 -0
  439. package/dist/features/selection/isSelectAllValue.js +19 -0
  440. package/dist/features/selection/isSelectionViewCurrent.js +22 -0
  441. package/dist/features/selection/notifySelectionChange.js +32 -0
  442. package/dist/features/selection/pruneRowSelection.js +26 -0
  443. package/dist/features/selection/selectionFeature.js +69 -0
  444. package/dist/features/selection/selectionToValue.js +48 -0
  445. package/dist/features/selection/useSelection.js +77 -0
  446. package/dist/features/serverData/buildServerItems.js +109 -0
  447. package/dist/features/serverData/createBlockCache.js +205 -0
  448. package/dist/features/serverData/createRefresh.js +23 -0
  449. package/dist/features/serverData/createServerStore.js +360 -0
  450. package/dist/features/serverData/getBlockRange.js +29 -0
  451. package/dist/features/serverData/getListKey.js +20 -0
  452. package/dist/features/serverData/getNeededBlocks.js +45 -0
  453. package/dist/features/serverData/needsServerData.js +20 -0
  454. package/dist/features/serverData/normalizeServerData.js +41 -0
  455. package/dist/features/serverData/pickServerView.js +43 -0
  456. package/dist/features/serverData/readFetchResult.js +36 -0
  457. package/dist/features/serverData/serverData.css +21 -0
  458. package/dist/features/serverData/serverDataFeature.js +38 -0
  459. package/dist/features/serverData/serverRangeFeature.js +22 -0
  460. package/dist/features/serverData/useServerData.js +48 -0
  461. package/dist/features/serverData/useServerItems.js +35 -0
  462. package/dist/features/serverData/useServerRange.js +35 -0
  463. package/dist/features/serverData/useServerView.js +70 -0
  464. package/dist/features/sizing/ResizeHandle.js +24 -0
  465. package/dist/features/sizing/handleResizePointerDown.js +66 -0
  466. package/dist/features/sizing/initColumnSizing.js +23 -0
  467. package/dist/features/sizing/sizingFeature.js +39 -0
  468. package/dist/features/sizing/sizingToViewColumn.js +24 -0
  469. package/dist/features/sorting/SortIndicator.js +37 -0
  470. package/dist/features/sorting/buildSortKeys.js +52 -0
  471. package/dist/features/sorting/collectSortKeys.js +30 -0
  472. package/dist/features/sorting/createClearSort.js +21 -0
  473. package/dist/features/sorting/createIndexSortedRowModel.js +33 -0
  474. package/dist/features/sorting/createSetSort.js +43 -0
  475. package/dist/features/sorting/createSortKeyCollector.js +59 -0
  476. package/dist/features/sorting/createToggleSort.js +42 -0
  477. package/dist/features/sorting/getCachedSortKeys.js +19 -0
  478. package/dist/features/sorting/getSortHeaderProps.js +25 -0
  479. package/dist/features/sorting/getSortKeys.js +38 -0
  480. package/dist/features/sorting/handleSortClick.js +27 -0
  481. package/dist/features/sorting/initSorting.js +37 -0
  482. package/dist/features/sorting/isNumericSortType.js +21 -0
  483. package/dist/features/sorting/prepareSortKeys.js +92 -0
  484. package/dist/features/sorting/rankSortKeys.js +33 -0
  485. package/dist/features/sorting/setCachedSortKeys.js +24 -0
  486. package/dist/features/sorting/sortInSlices.js +69 -0
  487. package/dist/features/sorting/sortIndices.js +40 -0
  488. package/dist/features/sorting/sortKeysCache.js +19 -0
  489. package/dist/features/sorting/sortRowModel.js +84 -0
  490. package/dist/features/sorting/sortingFeature.js +62 -0
  491. package/dist/features/sorting/sortingToValue.js +27 -0
  492. package/dist/features/sorting/toFloatSortKeys.js +24 -0
  493. package/dist/features/sorting/yieldToMain.js +27 -0
  494. package/dist/features/toolbar/ColumnTitle.js +28 -0
  495. package/dist/features/toolbar/DensityToggle.js +53 -0
  496. package/dist/features/toolbar/FilterButton.js +56 -0
  497. package/dist/features/toolbar/GroupButton.js +51 -0
  498. package/dist/features/toolbar/OptionsQuickFilter.js +72 -0
  499. package/dist/features/toolbar/QuickFilter.js +46 -0
  500. package/dist/features/toolbar/RecordCount.js +27 -0
  501. package/dist/features/toolbar/SaveViewAs.js +66 -0
  502. package/dist/features/toolbar/SortButton.js +94 -0
  503. package/dist/features/toolbar/Toolbar.js +88 -0
  504. package/dist/features/toolbar/ToolbarCount.js +25 -0
  505. package/dist/features/toolbar/ToolbarIcon.js +28 -0
  506. package/dist/features/toolbar/ToolbarList.js +100 -0
  507. package/dist/features/toolbar/ToolbarSearch.js +63 -0
  508. package/dist/features/toolbar/ViewActions.js +41 -0
  509. package/dist/features/toolbar/ViewTabLabel.js +39 -0
  510. package/dist/features/toolbar/ViewTabMenu.js +48 -0
  511. package/dist/features/toolbar/ViewTabs.js +44 -0
  512. package/dist/features/toolbar/countConditions.js +25 -0
  513. package/dist/features/toolbar/formatRecordCount.js +19 -0
  514. package/dist/features/toolbar/getQuickFilterValues.js +25 -0
  515. package/dist/features/toolbar/getRootConditions.js +25 -0
  516. package/dist/features/toolbar/handleToolbarKeyDown.js +28 -0
  517. package/dist/features/toolbar/isDefaultSorting.js +26 -0
  518. package/dist/features/toolbar/isQuickFilterLeaf.js +20 -0
  519. package/dist/features/toolbar/moveItem.js +25 -0
  520. package/dist/features/toolbar/needsToolbar.js +21 -0
  521. package/dist/features/toolbar/normalizeToolbar.js +61 -0
  522. package/dist/features/toolbar/setQuickFilterValues.js +35 -0
  523. package/dist/features/toolbar/toolbar.css +185 -0
  524. package/dist/features/toolbar/toolbarFeature.js +27 -0
  525. package/dist/features/toolbar/useToolbar.js +41 -0
  526. package/dist/features/toolbar/validateQuickFilters.js +28 -0
  527. package/dist/features/transactions/applyTransactionToRows.js +56 -0
  528. package/dist/features/transactions/createApplyTransaction.js +26 -0
  529. package/dist/features/transactions/normalizeTransaction.js +49 -0
  530. package/dist/features/transactions/transactionsFeature.js +24 -0
  531. package/dist/features/transactions/useTransactionData.js +44 -0
  532. package/dist/features/tree/TreeToggle.js +39 -0
  533. package/dist/features/tree/buildTreeIndex.js +60 -0
  534. package/dist/features/tree/buildTreeItems.js +96 -0
  535. package/dist/features/tree/flattenTreeData.js +45 -0
  536. package/dist/features/tree/getDescendantIds.js +28 -0
  537. package/dist/features/tree/handleTreeClick.js +25 -0
  538. package/dist/features/tree/handleTreeKeyDown.js +58 -0
  539. package/dist/features/tree/needsTree.js +20 -0
  540. package/dist/features/tree/normalizeTree.js +41 -0
  541. package/dist/features/tree/rowNeedsChildren.js +25 -0
  542. package/dist/features/tree/tree.css +55 -0
  543. package/dist/features/tree/treeFeature.js +35 -0
  544. package/dist/features/tree/useTreeData.js +33 -0
  545. package/dist/features/tree/useTreeItems.js +61 -0
  546. package/dist/features/views/compactView.js +30 -0
  547. package/dist/features/views/createViewsApi.js +74 -0
  548. package/dist/features/views/decodeViewParam.js +30 -0
  549. package/dist/features/views/encodeViewParam.js +25 -0
  550. package/dist/features/views/findActiveView.js +23 -0
  551. package/dist/features/views/getStorageKey.js +20 -0
  552. package/dist/features/views/getViewKey.js +27 -0
  553. package/dist/features/views/getViewSliceDeps.js +27 -0
  554. package/dist/features/views/isViewDirty.js +34 -0
  555. package/dist/features/views/mountViewValue.js +36 -0
  556. package/dist/features/views/needsViews.js +23 -0
  557. package/dist/features/views/normalizePersist.js +27 -0
  558. package/dist/features/views/normalizeViews.js +41 -0
  559. package/dist/features/views/notifyViewSelect.js +29 -0
  560. package/dist/features/views/readMountPayload.js +31 -0
  561. package/dist/features/views/readPersistedView.js +45 -0
  562. package/dist/features/views/sanitizePersistedView.js +49 -0
  563. package/dist/features/views/stableStringify.js +27 -0
  564. package/dist/features/views/useViews.js +136 -0
  565. package/dist/features/views/viewKeys.js +28 -0
  566. package/dist/features/views/viewsFeature.js +26 -0
  567. package/dist/features/views/writePersistedView.js +42 -0
  568. package/dist/features/virtualization/computeRowOffsets.js +29 -0
  569. package/dist/features/virtualization/computeWindow.js +92 -0
  570. package/dist/features/virtualization/createScrollToRow.js +36 -0
  571. package/dist/features/virtualization/firstIndexAbove.js +30 -0
  572. package/dist/features/virtualization/getMeasureKey.js +23 -0
  573. package/dist/features/virtualization/isMeasuredColumn.js +20 -0
  574. package/dist/features/virtualization/isSameRange.js +18 -0
  575. package/dist/features/virtualization/positionedRowsFeature.js +22 -0
  576. package/dist/features/virtualization/scrollToCell.js +49 -0
  577. package/dist/features/virtualization/shiftRowOffsets.js +35 -0
  578. package/dist/features/virtualization/usePositionedRows.js +37 -0
  579. package/dist/features/virtualization/useRowOffsets.js +123 -0
  580. package/dist/features/virtualization/useScrollWindow.js +114 -0
  581. package/dist/features/virtualization/useTanstackRowWindow.js +43 -0
  582. package/dist/features/virtualization/useVirtualization.js +64 -0
  583. package/dist/features/virtualization/virtualizationFeature.js +24 -0
  584. package/dist/features/virtualization/writeScrollEdges.js +33 -0
  585. package/dist/features/visibility/initColumnVisibility.js +22 -0
  586. package/dist/features/visibility/visibilityFeature.js +31 -0
  587. package/dist/features/visibility/visibilityToViewColumn.js +20 -0
  588. package/dist/metas.js +16 -0
  589. package/dist/types.js +17 -0
  590. package/package.json +91 -0
@@ -0,0 +1,51 @@
1
+ /*
2
+ Copyright 2020-2026 Lowdefy, Inc
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */ function horizontalPadding(element) {
16
+ const style = getComputedStyle(element);
17
+ return parseFloat(style.paddingLeft) + parseFloat(style.paddingRight);
18
+ }
19
+ // The width a column needs to show its rendered cells and its header without truncation. Only
20
+ // rendered cells can be measured (the virtual window); that is what the user is looking at.
21
+ function measureColumnWidth({ api, key }) {
22
+ const root = api.rootRef.current;
23
+ const selector = `[data-lf-cell][data-col-key="${CSS.escape(key)}"]`;
24
+ let width = 0;
25
+ root.querySelectorAll(`.lf-table-body ${selector}`).forEach((cell)=>{
26
+ // A cell lays its children out in a row: a tree row's indent and chevron, then the content.
27
+ // Portalled edit markers are absolutely positioned and take no room.
28
+ let content = 0;
29
+ Array.from(cell.children).forEach((child)=>{
30
+ if (getComputedStyle(child).position === 'absolute') return;
31
+ content += child.scrollWidth;
32
+ });
33
+ width = Math.max(width, content + horizontalPadding(cell));
34
+ });
35
+ const header = root.querySelector(`[data-lf-header]${selector}`);
36
+ if (header) {
37
+ const style = getComputedStyle(header);
38
+ const gap = parseFloat(style.columnGap) || 0;
39
+ let content = 0;
40
+ let parts = 0;
41
+ Array.from(header.children).forEach((child)=>{
42
+ if (getComputedStyle(child).position === 'absolute') return;
43
+ content += child.classList.contains('lf-table-header-title') ? child.scrollWidth : child.offsetWidth;
44
+ parts += 1;
45
+ });
46
+ width = Math.max(width, content + gap * Math.max(parts - 1, 0) + horizontalPadding(header));
47
+ }
48
+ // One pixel of slack: scrollWidth rounds down fractional text widths.
49
+ return Math.ceil(width) + 1;
50
+ }
51
+ export default measureColumnWidth;
@@ -0,0 +1,27 @@
1
+ /*
2
+ Copyright 2020-2026 Lowdefy, Inc
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */ // Pins a column to `side` ('start' | 'end'), or unpins it (side null). A newly pinned column goes
16
+ // to the inner edge of its region: the end of the start region, the start of the end region.
17
+ function pinColumn({ pinning, key, side }) {
18
+ const start = pinning.start.filter((entry)=>entry !== key);
19
+ const end = pinning.end.filter((entry)=>entry !== key);
20
+ if (side === 'start') start.push(key);
21
+ if (side === 'end') end.unshift(key);
22
+ return {
23
+ start,
24
+ end
25
+ };
26
+ }
27
+ export default pinColumn;
@@ -0,0 +1,25 @@
1
+ /*
2
+ Copyright 2020-2026 Lowdefy, Inc
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */ // Header menu sections, top to bottom. Items name their section; a section not listed here (a
16
+ // later feature's) goes before `manage`, in feature order.
17
+ const sectionOrder = [
18
+ 'sort',
19
+ 'filter',
20
+ 'group',
21
+ 'pin',
22
+ 'column',
23
+ 'manage'
24
+ ];
25
+ export default sectionOrder;
@@ -0,0 +1,27 @@
1
+ /*
2
+ Copyright 2020-2026 Lowdefy, Inc
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */ import { useState } from 'react';
16
+ // Which column's header menu is open. `pressedOpen` is set by the menu button's pointerdown
17
+ // (see handleHeaderButtonPointerDown) and read by the click that follows it.
18
+ function useHeaderMenuState({ api }) {
19
+ const [openKey, setOpenKey] = useState(null);
20
+ api.headerMenu = {
21
+ openKey,
22
+ setOpenKey,
23
+ pressedOpen: api.headerMenu?.pressedOpen ?? null
24
+ };
25
+ return null;
26
+ }
27
+ export default useHeaderMenuState;
@@ -0,0 +1,149 @@
1
+ /*
2
+ Copyright 2020-2026 Lowdefy, Inc
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */ import bulkFeature from './bulk/bulkFeature.js';
16
+ import clipboardFeature from './clipboard/clipboardFeature.js';
17
+ import columnManagerFeature from './columnManager/columnManagerFeature.js';
18
+ import densityFeature from './density/densityFeature.js';
19
+ import eventsFeature from './events/eventsFeature.js';
20
+ import expansionFeature from './expansion/expansionFeature.js';
21
+ import exportFeature from './export/exportFeature.js';
22
+ import filteringFeature from './filtering/filteringFeature.js';
23
+ import groupingFeature from './grouping/groupingFeature.js';
24
+ import headerMenuFeature from './headerMenu/headerMenuFeature.js';
25
+ import keyboardFeature from './keyboard/keyboardFeature.js';
26
+ import lazyCellsFeature from './lazyCells/lazyCellsFeature.js';
27
+ import needsEditing from './editing/needsEditing.js';
28
+ import needsExpandable from './expandable/needsExpandable.js';
29
+ import needsGroupRows from './grouping/needsGroupRows.js';
30
+ import needsServerData from './serverData/needsServerData.js';
31
+ import needsToolbar from './toolbar/needsToolbar.js';
32
+ import needsTree from './tree/needsTree.js';
33
+ import needsViews from './views/needsViews.js';
34
+ import orderingFeature from './ordering/orderingFeature.js';
35
+ import paginationFeature from './pagination/paginationFeature.js';
36
+ import pinningFeature from './pinning/pinningFeature.js';
37
+ import queueFeature from './queue/queueFeature.js';
38
+ import selectionFeature from './selection/selectionFeature.js';
39
+ import sizingFeature from './sizing/sizingFeature.js';
40
+ import sortingFeature from './sorting/sortingFeature.js';
41
+ import transactionsFeature from './transactions/transactionsFeature.js';
42
+ import virtualizationFeature from './virtualization/virtualizationFeature.js';
43
+ import visibilityFeature from './visibility/visibilityFeature.js';
44
+ // Optional features load in their own chunk, only for tables whose config needs them
45
+ // (core/useFeatureSet.js); `methods` are the block methods they own, registered as no-ops on
46
+ // tables without them so a CallMethod never fails.
47
+ function optional({ name, needs, load, methods = [] }) {
48
+ return {
49
+ load,
50
+ methods,
51
+ name,
52
+ needs,
53
+ optional: true
54
+ };
55
+ }
56
+ // The table's feature modules, in composition order. The core loops over a table's list for
57
+ // TanStack feature slots, state slices, view/value derivation, header parts, delegated event
58
+ // handlers, actions and block methods (see ARCHITECTURE.md). The order is the order handlers run
59
+ // in: a handler that returns true stops the chain for that event. Filtering and the header menu
60
+ // come first: the filtered row model feeds sorting, and their header buttons claim clicks and
61
+ // pointer presses before sorting and column reordering see them. Views come before the toolbar,
62
+ // which renders their tabs, and queue's single-key actions run before keyboard navigation sees
63
+ // the key (editing's keys, earlier, win on editable cells). It is also the order of the data
64
+ // pipeline's hooks (TableRoot): `useData` (server rows, tree flattening), `useRows`
65
+ // (transactions, then editing's overlay over them) and `useItems` (server items, client groups,
66
+ // tree rows, expandable detail rows, the page).
67
+ const features = [
68
+ filteringFeature,
69
+ headerMenuFeature,
70
+ columnManagerFeature,
71
+ sortingFeature,
72
+ sizingFeature,
73
+ orderingFeature,
74
+ pinningFeature,
75
+ visibilityFeature,
76
+ densityFeature,
77
+ transactionsFeature,
78
+ optional({
79
+ name: 'editing',
80
+ needs: needsEditing,
81
+ load: ()=>import('./editing/editingFeature.js')
82
+ }),
83
+ clipboardFeature,
84
+ optional({
85
+ name: 'paste',
86
+ needs: ({ input })=>input === true,
87
+ load: ()=>import('./clipboard/pasteFeature.js')
88
+ }),
89
+ selectionFeature,
90
+ expansionFeature,
91
+ optional({
92
+ name: 'serverData',
93
+ needs: needsServerData,
94
+ load: ()=>import('./serverData/serverDataFeature.js'),
95
+ methods: [
96
+ 'refresh'
97
+ ]
98
+ }),
99
+ groupingFeature,
100
+ optional({
101
+ name: 'groupRows',
102
+ needs: needsGroupRows,
103
+ load: ()=>import('./grouping/groupRowsFeature.js'),
104
+ methods: [
105
+ 'collapseAllGroups',
106
+ 'expandAllGroups',
107
+ 'setGroup'
108
+ ]
109
+ }),
110
+ optional({
111
+ name: 'tree',
112
+ needs: needsTree,
113
+ load: ()=>import('./tree/treeFeature.js')
114
+ }),
115
+ optional({
116
+ name: 'expandable',
117
+ needs: needsExpandable,
118
+ load: ()=>import('./expandable/expandableFeature.js')
119
+ }),
120
+ virtualizationFeature,
121
+ optional({
122
+ name: 'positionedRows',
123
+ needs: ({ rowWindowStrategy })=>rowWindowStrategy === 'positioned',
124
+ load: ()=>import('./virtualization/positionedRowsFeature.js')
125
+ }),
126
+ optional({
127
+ name: 'serverRange',
128
+ needs: needsServerData,
129
+ load: ()=>import('./serverData/serverRangeFeature.js')
130
+ }),
131
+ lazyCellsFeature,
132
+ optional({
133
+ name: 'views',
134
+ needs: needsViews,
135
+ load: ()=>import('./views/viewsFeature.js')
136
+ }),
137
+ optional({
138
+ name: 'toolbar',
139
+ needs: needsToolbar,
140
+ load: ()=>import('./toolbar/toolbarFeature.js')
141
+ }),
142
+ bulkFeature,
143
+ queueFeature,
144
+ keyboardFeature,
145
+ eventsFeature,
146
+ exportFeature,
147
+ paginationFeature
148
+ ];
149
+ export default features;
@@ -0,0 +1,21 @@
1
+ /*
2
+ Copyright 2020-2026 Lowdefy, Inc
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */ // Rows that are not data rows (an expanded detail row, a group header) may have fewer cells than
16
+ // the grid has columns; focus lands on their first cell.
17
+ function findCellElement({ api, row, col }) {
18
+ const scroller = api.scrollerRef.current;
19
+ return scroller?.querySelector(`[data-row-index="${row}"] [data-lf-cell][data-col-index="${col}"]`) ?? scroller?.querySelector(`[data-row-index="${row}"] [data-lf-cell]`);
20
+ }
21
+ export default findCellElement;
@@ -0,0 +1,74 @@
1
+ /*
2
+ Copyright 2020-2026 Lowdefy, Inc
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */ // Arrow keys, Home/End (row ends), Ctrl/Cmd+Home/End (grid corners) and PageUp/PageDown (one
16
+ // body height). Row -1 is the header row.
17
+ function getNextCell({ event, api, row, col }) {
18
+ const lastRow = api.rows.length - 1;
19
+ const lastCol = api.layout.cols.length - 1;
20
+ const modified = event.ctrlKey || event.metaKey;
21
+ const scroller = api.scrollerRef.current;
22
+ const pageRows = Math.max(1, Math.floor((scroller.clientHeight - api.headerHeight) / api.rowHeight) - 1);
23
+ switch(event.key){
24
+ case 'ArrowUp':
25
+ return {
26
+ row: Math.max(-1, row - 1),
27
+ col
28
+ };
29
+ case 'ArrowDown':
30
+ return {
31
+ row: Math.min(lastRow, row + 1),
32
+ col
33
+ };
34
+ case 'ArrowLeft':
35
+ return {
36
+ row,
37
+ col: Math.max(0, col - 1)
38
+ };
39
+ case 'ArrowRight':
40
+ return {
41
+ row,
42
+ col: Math.min(lastCol, col + 1)
43
+ };
44
+ case 'Home':
45
+ return modified ? {
46
+ row: Math.min(0, lastRow),
47
+ col: 0
48
+ } : {
49
+ row,
50
+ col: 0
51
+ };
52
+ case 'End':
53
+ return modified ? {
54
+ row: lastRow,
55
+ col: lastCol
56
+ } : {
57
+ row,
58
+ col: lastCol
59
+ };
60
+ case 'PageUp':
61
+ return {
62
+ row: row < 0 ? row : Math.max(0, row - pageRows),
63
+ col
64
+ };
65
+ case 'PageDown':
66
+ return {
67
+ row: Math.min(lastRow, Math.max(0, row) + pageRows),
68
+ col
69
+ };
70
+ default:
71
+ return null;
72
+ }
73
+ }
74
+ export default getNextCell;
@@ -0,0 +1,31 @@
1
+ /*
2
+ Copyright 2020-2026 Lowdefy, Inc
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */ // Focus that lands on a cell (click, Tab, programmatic) makes it the active cell. Focus on the
16
+ // scroller itself means the active cell is outside the rendered window: bring it back.
17
+ function handleGridFocus(event, api) {
18
+ if (event.target === api.scrollerRef.current) {
19
+ api.keyboard.moveTo(api.keyboard.activeCell);
20
+ return true;
21
+ }
22
+ const cell = event.target.closest('[data-lf-cell]');
23
+ if (!cell || !api.contains(cell)) return false;
24
+ const rowElement = cell.closest('[data-row-index]');
25
+ api.keyboard.setActive({
26
+ row: Number(rowElement.dataset.rowIndex),
27
+ col: Number(cell.dataset.colIndex)
28
+ });
29
+ return false;
30
+ }
31
+ export default handleGridFocus;
@@ -0,0 +1,72 @@
1
+ /*
2
+ Copyright 2020-2026 Lowdefy, Inc
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */ import getNextCell from './getNextCell.js';
16
+ function activate({ event, api, cell, row, rowElement }) {
17
+ if (row === -1) {
18
+ if (cell.dataset.special === 'select') return api.actions.toggleAllRowsSelected?.();
19
+ return api.actions.toggleSort?.({
20
+ key: cell.dataset.colKey,
21
+ multi: event.shiftKey
22
+ });
23
+ }
24
+ return api.actions.activateRow?.({
25
+ id: rowElement.dataset.rowKey,
26
+ event
27
+ });
28
+ }
29
+ function handleGridKeyDown(event, api) {
30
+ if (!api.config.keyboard) return false;
31
+ const cell = event.target.closest('[data-lf-cell]');
32
+ if (!cell || !api.contains(cell)) return false;
33
+ if (event.target !== cell) {
34
+ // Keys typed into a control inside a cell belong to the control; Escape returns to the grid.
35
+ if (event.key !== 'Escape') return false;
36
+ cell.focus();
37
+ return true;
38
+ }
39
+ const rowElement = cell.closest('[data-row-index]');
40
+ const row = Number(rowElement.dataset.rowIndex);
41
+ const col = Number(cell.dataset.colIndex);
42
+ if (event.key === ' ') {
43
+ if (row < 0 || !api.config.rowSelection) return false;
44
+ event.preventDefault();
45
+ api.actions.toggleRowSelected({
46
+ id: rowElement.dataset.rowKey
47
+ });
48
+ return true;
49
+ }
50
+ if (event.key === 'Enter') {
51
+ event.preventDefault();
52
+ activate({
53
+ event,
54
+ api,
55
+ cell,
56
+ row,
57
+ rowElement
58
+ });
59
+ return true;
60
+ }
61
+ const next = getNextCell({
62
+ event,
63
+ api,
64
+ row,
65
+ col
66
+ });
67
+ if (!next) return false;
68
+ event.preventDefault();
69
+ api.keyboard.moveTo(next);
70
+ return true;
71
+ }
72
+ export default handleGridKeyDown;
@@ -0,0 +1,22 @@
1
+ /*
2
+ Copyright 2020-2026 Lowdefy, Inc
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */ function isCellRendered({ cell, layout, range }) {
16
+ if (cell.row >= 0 && (cell.row < range.rowStart || cell.row >= range.rowEnd)) return false;
17
+ const col = layout.cols[cell.col];
18
+ if (!col || col.region !== 'center') return true;
19
+ const centerIndex = col.index - layout.start.length;
20
+ return centerIndex >= range.colStart && centerIndex < range.colEnd;
21
+ }
22
+ export default isCellRendered;
@@ -0,0 +1,26 @@
1
+ /*
2
+ Copyright 2020-2026 Lowdefy, Inc
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */ import handleGridFocus from './handleGridFocus.js';
16
+ import handleGridKeyDown from './handleGridKeyDown.js';
17
+ import useKeyboard from './useKeyboard.js';
18
+ const keyboardFeature = {
19
+ name: 'keyboard',
20
+ useGridFeature: useKeyboard,
21
+ gridHandlers: {
22
+ focus: handleGridFocus,
23
+ keydown: handleGridKeyDown
24
+ }
25
+ };
26
+ export default keyboardFeature;
@@ -0,0 +1,84 @@
1
+ /*
2
+ Copyright 2020-2026 Lowdefy, Inc
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */ import { useLayoutEffect, useRef, useState } from 'react';
16
+ import findCellElement from './findCellElement.js';
17
+ import isCellRendered from './isCellRendered.js';
18
+ import scrollToCell from '../virtualization/scrollToCell.js';
19
+ function clampCell({ cell, rowCount, colCount }) {
20
+ return {
21
+ row: Math.min(Math.max(cell.row, -1), rowCount - 1),
22
+ col: Math.min(Math.max(cell.col, 0), Math.max(colCount - 1, 0))
23
+ };
24
+ }
25
+ // Roving tabindex over the grid (D11): exactly one cell (header row -1 included) is tabbable. The
26
+ // active cell may be scrolled out of the rendered window; then the scroller itself takes the tab
27
+ // stop and hands focus back to the cell (scrolled into view) when it receives it.
28
+ function useKeyboard(ctx) {
29
+ const { api, layout, range, rows } = ctx;
30
+ const [active, setActive] = useState(null);
31
+ const pendingFocus = useRef(false);
32
+ const fallback = {
33
+ row: rows.length ? 0 : -1,
34
+ col: 0
35
+ };
36
+ const activeCell = clampCell({
37
+ cell: active ?? fallback,
38
+ rowCount: rows.length,
39
+ colCount: layout.cols.length
40
+ });
41
+ api.keyboard = {
42
+ activeCell,
43
+ moveTo (cell) {
44
+ const next = clampCell({
45
+ cell,
46
+ rowCount: api.rows.length,
47
+ colCount: api.layout.cols.length
48
+ });
49
+ pendingFocus.current = true;
50
+ setActive(next);
51
+ scrollToCell({
52
+ api,
53
+ row: next.row,
54
+ col: next.col
55
+ });
56
+ },
57
+ setActive (cell) {
58
+ setActive((previous)=>previous?.row === cell.row && previous?.col === cell.col ? previous : cell);
59
+ }
60
+ };
61
+ useLayoutEffect(()=>{
62
+ if (!pendingFocus.current) return;
63
+ const element = findCellElement({
64
+ api,
65
+ row: activeCell.row,
66
+ col: activeCell.col
67
+ });
68
+ if (!element) return;
69
+ pendingFocus.current = false;
70
+ element.focus({
71
+ preventScroll: true
72
+ });
73
+ });
74
+ const rendered = isCellRendered({
75
+ cell: activeCell,
76
+ layout,
77
+ range
78
+ });
79
+ return {
80
+ activeCell,
81
+ scrollerTabIndex: rendered ? -1 : 0
82
+ };
83
+ }
84
+ export default useKeyboard;
@@ -0,0 +1,19 @@
1
+ /*
2
+ Copyright 2020-2026 Lowdefy, Inc
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */ function getBodyRowKey(target) {
16
+ if (!(target instanceof Element)) return null;
17
+ return target.closest('.lf-table-body [data-row-key]')?.dataset.rowKey ?? null;
18
+ }
19
+ export default getBodyRowKey;
@@ -0,0 +1,21 @@
1
+ /*
2
+ Copyright 2020-2026 Lowdefy, Inc
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */ function handlePointerLeave(event, api) {
16
+ api.cellActivity.set({
17
+ hoveredRow: null
18
+ });
19
+ return false;
20
+ }
21
+ export default handlePointerLeave;