@infinite-table/infinite-react 0.4.13 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/.vscode/settings.json +3 -0
  2. package/API.md +0 -0
  3. package/build/buildPackageJson.js +43 -0
  4. package/build/scripts/test.js +37 -0
  5. package/bundler.config.js +25 -0
  6. package/globals.d.ts +7 -0
  7. package/package.json +95 -3
  8. package/rollup.config.js +15 -0
  9. package/run-build-deepmap.js +47 -0
  10. package/run-build.js +45 -0
  11. package/run-dts-concat.js +21 -0
  12. package/src/components/CSSVariableWatch.tsx +82 -0
  13. package/src/components/DataSource/BooleanCollectionState.ts +214 -0
  14. package/src/components/DataSource/BooleanDeepCollectionState.ts +208 -0
  15. package/src/components/DataSource/DataSourceContext.ts +20 -0
  16. package/src/components/DataSource/GroupRowsState.ts +74 -0
  17. package/src/components/DataSource/Indexer.ts +27 -0
  18. package/src/components/DataSource/RowSelectionState.ts +763 -0
  19. package/src/components/DataSource/defaultFilterTypes.ts +64 -0
  20. package/src/components/DataSource/index.tsx +108 -0
  21. package/src/components/DataSource/privateHooks/getChangeDetect.ts +7 -0
  22. package/src/components/DataSource/privateHooks/useLoadData.ts +783 -0
  23. package/src/components/DataSource/publicHooks/useDataSource.ts +19 -0
  24. package/src/components/DataSource/publicHooks/useDataSourceActions.ts +14 -0
  25. package/src/components/DataSource/state/getInitialState.ts +494 -0
  26. package/src/components/DataSource/state/normalizeSortInfo.ts +35 -0
  27. package/src/components/DataSource/state/reducer.ts +466 -0
  28. package/src/components/DataSource/state/rowInfoStatus.ts +27 -0
  29. package/src/components/DataSource/types.ts +548 -0
  30. package/src/components/HeadlessTable/HeadlessTableWithPinnedContainers.tsx +142 -0
  31. package/src/components/HeadlessTable/MappedCells.ts +251 -0
  32. package/src/components/HeadlessTable/RawTable.tsx +98 -0
  33. package/src/components/HeadlessTable/ReactHeadlessTableRenderer.tsx +1516 -0
  34. package/src/components/HeadlessTable/index.tsx +234 -0
  35. package/src/components/InfiniteTable/InfiniteCls.css.ts +164 -0
  36. package/src/components/InfiniteTable/InfiniteTableContext.ts +16 -0
  37. package/src/components/InfiniteTable/api/getImperativeApi.ts +391 -0
  38. package/src/components/InfiniteTable/api/getSelectionApi.ts +364 -0
  39. package/src/components/InfiniteTable/api/type.ts +11 -0
  40. package/src/components/InfiniteTable/components/ActiveCellIndicator.css.ts +51 -0
  41. package/src/components/InfiniteTable/components/ActiveCellIndicator.tsx +116 -0
  42. package/src/components/InfiniteTable/components/ActiveRowIndicator.css.ts +56 -0
  43. package/src/components/InfiniteTable/components/ActiveRowIndicator.tsx +94 -0
  44. package/src/components/InfiniteTable/components/CheckBox.css.ts +13 -0
  45. package/src/components/InfiniteTable/components/CheckBox.tsx +96 -0
  46. package/src/components/InfiniteTable/components/FilterEditors.tsx +52 -0
  47. package/src/components/InfiniteTable/components/InfiniteTableBody/InfiniteTableBody.tsx +27 -0
  48. package/src/components/InfiniteTable/components/InfiniteTableBody/index.tsx +1 -0
  49. package/src/components/InfiniteTable/components/InfiniteTableFooter/InfiniteTableFooter.tsx +31 -0
  50. package/src/components/InfiniteTable/components/InfiniteTableFooter/index.tsx +1 -0
  51. package/src/components/InfiniteTable/components/InfiniteTableHeader/InfiniteTableColumnHeaderFilter.tsx +102 -0
  52. package/src/components/InfiniteTable/components/InfiniteTableHeader/InfiniteTableHeader.tsx +163 -0
  53. package/src/components/InfiniteTable/components/InfiniteTableHeader/InfiniteTableHeaderCell.tsx +574 -0
  54. package/src/components/InfiniteTable/components/InfiniteTableHeader/InfiniteTableHeaderGroup.tsx +79 -0
  55. package/src/components/InfiniteTable/components/InfiniteTableHeader/InfiniteTableHeaderTypes.tsx +25 -0
  56. package/src/components/InfiniteTable/components/InfiniteTableHeader/InfiniteTableHeaderWrapper.tsx +185 -0
  57. package/src/components/InfiniteTable/components/InfiniteTableHeader/ResizeHandle/GroupResizeHandle.tsx +159 -0
  58. package/src/components/InfiniteTable/components/InfiniteTableHeader/ResizeHandle/ResizeHandle.css.ts +124 -0
  59. package/src/components/InfiniteTable/components/InfiniteTableHeader/ResizeHandle/columnResizer.ts +166 -0
  60. package/src/components/InfiniteTable/components/InfiniteTableHeader/ResizeHandle/index.tsx +146 -0
  61. package/src/components/InfiniteTable/components/InfiniteTableHeader/buildColumnAndGroupTree.ts +240 -0
  62. package/src/components/InfiniteTable/components/InfiniteTableHeader/header.css.ts +358 -0
  63. package/src/components/InfiniteTable/components/InfiniteTableHeader/index.tsx +1 -0
  64. package/src/components/InfiniteTable/components/InfiniteTableHeader/useColumnGroupResizeHandle.tsx +114 -0
  65. package/src/components/InfiniteTable/components/InfiniteTableHeader/useColumnResizeHandle.tsx +146 -0
  66. package/src/components/InfiniteTable/components/InfiniteTableLicenseFooter/footer.css.ts +7 -0
  67. package/src/components/InfiniteTable/components/InfiniteTableLicenseFooter/index.tsx +110 -0
  68. package/src/components/InfiniteTable/components/InfiniteTableRow/InfiniteTableCell.tsx +120 -0
  69. package/src/components/InfiniteTable/components/InfiniteTableRow/InfiniteTableCellTypes.ts +74 -0
  70. package/src/components/InfiniteTable/components/InfiniteTableRow/InfiniteTableColumnCell.tsx +457 -0
  71. package/src/components/InfiniteTable/components/InfiniteTableRow/InfiniteTableRow.tsx +107 -0
  72. package/src/components/InfiniteTable/components/InfiniteTableRow/InfiniteTableRowClassName.ts +6 -0
  73. package/src/components/InfiniteTable/components/InfiniteTableRow/InfiniteTableRowTypes.ts +32 -0
  74. package/src/components/InfiniteTable/components/InfiniteTableRow/InfiniteTableRowUnvirtualized.tsx +75 -0
  75. package/src/components/InfiniteTable/components/InfiniteTableRow/columnRendering.tsx +263 -0
  76. package/src/components/InfiniteTable/components/InfiniteTableRow/index.tsx +1 -0
  77. package/src/components/InfiniteTable/components/InfiniteTableRow/row.css.ts +74 -0
  78. package/src/components/InfiniteTable/components/InfiniteTableRow/useRowDOMProps.ts +199 -0
  79. package/src/components/InfiniteTable/components/LoadMask.css.ts +34 -0
  80. package/src/components/InfiniteTable/components/LoadMask.tsx +27 -0
  81. package/src/components/InfiniteTable/components/ScrollbarPlaceholder.tsx +56 -0
  82. package/src/components/InfiniteTable/components/cell.css.ts +192 -0
  83. package/src/components/InfiniteTable/components/icons/ArrowDown.tsx +14 -0
  84. package/src/components/InfiniteTable/components/icons/ArrowUp.tsx +14 -0
  85. package/src/components/InfiniteTable/components/icons/ExpanderIcon.css.ts +31 -0
  86. package/src/components/InfiniteTable/components/icons/ExpanderIcon.tsx +63 -0
  87. package/src/components/InfiniteTable/components/icons/Icon.tsx +18 -0
  88. package/src/components/InfiniteTable/components/icons/InfiniteTableIconClassName.ts +1 -0
  89. package/src/components/InfiniteTable/components/icons/LoadingIcon.css.ts +8 -0
  90. package/src/components/InfiniteTable/components/icons/LoadingIcon.tsx +45 -0
  91. package/src/components/InfiniteTable/components/icons/MenuIcon.tsx +50 -0
  92. package/src/components/InfiniteTable/components/icons/SortIcon.tsx +113 -0
  93. package/src/components/InfiniteTable/eventHandlers/eventHandlerTypes.ts +57 -0
  94. package/src/components/InfiniteTable/eventHandlers/index.ts +95 -0
  95. package/src/components/InfiniteTable/eventHandlers/keyboardNavigation.ts +232 -0
  96. package/src/components/InfiniteTable/eventHandlers/keyboardSelection.ts +110 -0
  97. package/src/components/InfiniteTable/eventHandlers/onCellClick.ts +94 -0
  98. package/src/components/InfiniteTable/eventHandlers/onKeyDown.ts +25 -0
  99. package/src/components/InfiniteTable/hooks/adjustColumnOrderForAllColumns.ts +70 -0
  100. package/src/components/InfiniteTable/hooks/reorderColumnsOnDrag.ts +476 -0
  101. package/src/components/InfiniteTable/hooks/useAutoSizeColumns.ts +206 -0
  102. package/src/components/InfiniteTable/hooks/useCellClassName.ts +80 -0
  103. package/src/components/InfiniteTable/hooks/useCellRendering.tsx +217 -0
  104. package/src/components/InfiniteTable/hooks/useColumnGroups.ts +71 -0
  105. package/src/components/InfiniteTable/hooks/useColumnMenu.ts +72 -0
  106. package/src/components/InfiniteTable/hooks/useColumnPointerEvents.ts +258 -0
  107. package/src/components/InfiniteTable/hooks/useColumnRowspan.ts +43 -0
  108. package/src/components/InfiniteTable/hooks/useColumnSizeFn.ts +24 -0
  109. package/src/components/InfiniteTable/hooks/useColumnsWhen.ts +582 -0
  110. package/src/components/InfiniteTable/hooks/useComputed.ts +186 -0
  111. package/src/components/InfiniteTable/hooks/useComputedVisibleColumns.ts +219 -0
  112. package/src/components/InfiniteTable/hooks/useDOMProps.ts +306 -0
  113. package/src/components/InfiniteTable/hooks/useEffectWithRaf.ts +47 -0
  114. package/src/components/InfiniteTable/hooks/useInfiniteTable.ts +10 -0
  115. package/src/components/InfiniteTable/hooks/useInfiniteTableState.ts +11 -0
  116. package/src/components/InfiniteTable/hooks/useInternalProps.ts +8 -0
  117. package/src/components/InfiniteTable/hooks/useLicense/LicenseDetails.ts +13 -0
  118. package/src/components/InfiniteTable/hooks/useLicense/crc32.ts +56 -0
  119. package/src/components/InfiniteTable/hooks/useLicense/decode.ts +147 -0
  120. package/src/components/InfiniteTable/hooks/useLicense/useLicense.ts +39 -0
  121. package/src/components/InfiniteTable/hooks/useRerenderOnKeyChange.ts +21 -0
  122. package/src/components/InfiniteTable/hooks/useRowHover.ts +18 -0
  123. package/src/components/InfiniteTable/hooks/useScrollToActiveCell.ts +48 -0
  124. package/src/components/InfiniteTable/hooks/useScrollToActiveRow.ts +44 -0
  125. package/src/components/InfiniteTable/hooks/useScrollbars.ts +51 -0
  126. package/src/components/InfiniteTable/hooks/useToggleGroupRow.ts +56 -0
  127. package/src/components/InfiniteTable/hooks/useUnpinnedRendering.tsx +165 -0
  128. package/src/components/InfiniteTable/hooks/useYourBrain.ts +55 -0
  129. package/src/components/InfiniteTable/index.tsx +352 -0
  130. package/src/components/InfiniteTable/internalProps.ts +4 -0
  131. package/src/components/InfiniteTable/state/computeColumnGroupsDepths.ts +29 -0
  132. package/src/components/InfiniteTable/state/getColumnVisibilityForHideEmptyGroupColumns.ts +127 -0
  133. package/src/components/InfiniteTable/state/getInitialState.ts +375 -0
  134. package/src/components/InfiniteTable/theme.css.ts +556 -0
  135. package/src/components/InfiniteTable/types/InfiniteTableAction.ts +6 -0
  136. package/src/components/InfiniteTable/types/InfiniteTableActionType.ts +12 -0
  137. package/src/components/InfiniteTable/types/InfiniteTableColumn.ts +478 -0
  138. package/src/components/InfiniteTable/types/InfiniteTableComputedValues.ts +43 -0
  139. package/src/components/InfiniteTable/types/InfiniteTableContextValue.ts +12 -0
  140. package/src/components/InfiniteTable/types/InfiniteTableInternalProps.ts +3 -0
  141. package/src/components/InfiniteTable/types/InfiniteTableProps.ts +511 -0
  142. package/src/components/InfiniteTable/types/InfiniteTableState.ts +195 -0
  143. package/src/components/InfiniteTable/types/Utility.ts +35 -0
  144. package/src/components/InfiniteTable/types/index.ts +96 -0
  145. package/src/components/InfiniteTable/utilities.css.ts +179 -0
  146. package/src/components/InfiniteTable/utils/MultiRowSelector.ts +111 -0
  147. package/src/components/InfiniteTable/utils/RenderHookComponentForInfinite.tsx +52 -0
  148. package/src/components/InfiniteTable/utils/adjustColumnOrderForPinning.ts +33 -0
  149. package/src/components/InfiniteTable/utils/assignFiltered.ts +29 -0
  150. package/src/components/InfiniteTable/utils/defaultGetColumContextMenuItems.tsx +108 -0
  151. package/src/components/InfiniteTable/utils/getColumnComputedType.ts +33 -0
  152. package/src/components/InfiniteTable/utils/getColumnForGroupBy.tsx +313 -0
  153. package/src/components/InfiniteTable/utils/getComputedVisibleColumns.ts +773 -0
  154. package/src/components/InfiniteTable/utils/getContextMenuForColumn.tsx +72 -0
  155. package/src/components/InfiniteTable/utils/infiniteDOMUtils.ts +189 -0
  156. package/src/components/InfiniteTable/utils/mapToObject.ts +20 -0
  157. package/src/components/InfiniteTable/utils/moveXatY.ts +25 -0
  158. package/src/components/InfiniteTable/utils/objectValuesExcept.ts +9 -0
  159. package/src/components/InfiniteTable/utils/progressiveSpeedScroller.ts +158 -0
  160. package/src/components/InfiniteTable/utils/rafFn.ts +13 -0
  161. package/src/components/InfiniteTable/utils/toCSSVarName.ts +1 -0
  162. package/src/components/InfiniteTable/utils/toMap.ts +24 -0
  163. package/src/components/Menu/Menu.tsx +750 -0
  164. package/src/components/Menu/MenuCls.css.ts +139 -0
  165. package/src/components/Menu/MenuContext.ts +10 -0
  166. package/src/components/Menu/MenuContextValue.ts +15 -0
  167. package/src/components/Menu/MenuProps.ts +98 -0
  168. package/src/components/Menu/MenuState.ts +56 -0
  169. package/src/components/Menu/MenuTriangleContext.ts +352 -0
  170. package/src/components/Menu/childrenToRuntimeItems.tsx +103 -0
  171. package/src/components/Menu/getMenuState.tsx +119 -0
  172. package/src/components/Menu/index.tsx +88 -0
  173. package/src/components/Menu/propToIdentifyMenu.ts +1 -0
  174. package/src/components/RawList/AvoidReactDiff.tsx +48 -0
  175. package/src/components/RawList/MappedItems.ts +143 -0
  176. package/src/components/RawList/ReactVirtualRenderer.tsx +307 -0
  177. package/src/components/RawList/index.tsx +42 -0
  178. package/src/components/RawList/types.ts +23 -0
  179. package/src/components/RawList/useVirtualRenderer.ts +36 -0
  180. package/src/components/RenderHookComponent.tsx +10 -0
  181. package/src/components/ResizeObserver/index.tsx +170 -0
  182. package/src/components/VirtualBrain/MatrixBrain.ts +1621 -0
  183. package/src/components/VirtualBrain/ScrollListener.ts +39 -0
  184. package/src/components/VirtualBrain/index.ts +664 -0
  185. package/src/components/VirtualList/ColumnListWithExternalScrolling.tsx +78 -0
  186. package/src/components/VirtualList/InfiniteListRootClassName.ts +1 -0
  187. package/src/components/VirtualList/RowListWithExternalScrolling.tsx +120 -0
  188. package/src/components/VirtualList/SpacePlaceholder.tsx +32 -0
  189. package/src/components/VirtualList/VirtualList.css.ts +29 -0
  190. package/src/components/VirtualList/VirtualList.tsx +141 -0
  191. package/src/components/VirtualList/VirtualRowList.tsx +34 -0
  192. package/src/components/VirtualList/types.ts +56 -0
  193. package/src/components/VirtualList/useCorrectHeightForRowElements.ts +14 -0
  194. package/src/components/VirtualScrollContainer/VirtualScrollContainer.css.ts +51 -0
  195. package/src/components/VirtualScrollContainer/getScrollableClassName.ts +30 -0
  196. package/src/components/VirtualScrollContainer/index.tsx +63 -0
  197. package/src/components/flexbox/index.ts +562 -0
  198. package/src/components/hooks/useComponentState/index.tsx +562 -0
  199. package/src/components/hooks/useComponentState/types.ts +32 -0
  200. package/src/components/hooks/useEffectOnceWithProperUnmount.ts +33 -0
  201. package/src/components/hooks/useEffectWithChanges.ts +56 -0
  202. package/src/components/hooks/useImmutableRef.ts +7 -0
  203. package/src/components/hooks/useInterceptedMap.ts +71 -0
  204. package/src/components/hooks/useLatest.tsx +8 -0
  205. package/src/components/hooks/useLazyLatest.ts +23 -0
  206. package/src/components/hooks/useMemoShallowObjectMerge.ts +16 -0
  207. package/src/components/hooks/useMounted.ts +18 -0
  208. package/src/components/hooks/useOnMount.ts +21 -0
  209. package/src/components/hooks/useOnScroll.ts +34 -0
  210. package/src/components/hooks/useOnce.ts +10 -0
  211. package/src/components/hooks/useOverlay/index.tsx +418 -0
  212. package/src/components/hooks/usePrevious.ts +8 -0
  213. package/src/components/hooks/usePropertyOld.ts +168 -0
  214. package/src/components/hooks/useRerender.ts +12 -0
  215. package/src/components/hooks/xuseProperty.ts +165 -0
  216. package/src/components/types/CellPosition.ts +4 -0
  217. package/src/components/types/NonUndefined.ts +1 -0
  218. package/src/components/types/RemoveObject.ts +22 -0
  219. package/src/components/types/Renderable.ts +3 -0
  220. package/src/components/types/ScrollPosition.ts +7 -0
  221. package/src/components/types/Setter.ts +2 -0
  222. package/src/components/types/Size.ts +6 -0
  223. package/src/components/types/SubscriptionCallback.ts +10 -0
  224. package/src/components/types/VoidFn.ts +1 -0
  225. package/src/components/utils/buildSubscriptionCallback.tsx +60 -0
  226. package/src/components/utils/clamp.ts +3 -0
  227. package/src/components/utils/debounce.ts +16 -0
  228. package/src/components/utils/decamelize.ts +11 -0
  229. package/src/components/utils/discardCallsWithEqualArg.ts +42 -0
  230. package/src/components/utils/getRenderIndexes.ts +33 -0
  231. package/src/components/utils/getScrollbarWidth.ts +31 -0
  232. package/src/components/utils/getVirtualRenderCount.ts +21 -0
  233. package/src/components/utils/isControlled.ts +12 -0
  234. package/src/components/utils/isControlledValue.ts +5 -0
  235. package/src/index.tsx +34 -0
  236. package/src/test.tsx +18 -0
  237. package/src/utils/DeepMap/index.ts +588 -0
  238. package/src/utils/DeepMap/once.ts +16 -0
  239. package/src/utils/DeepMap/sortAscending.ts +1 -0
  240. package/src/utils/DeepMap/tsconfig.deepmap.json +17 -0
  241. package/src/utils/DeepMap/xpackage.json +26 -0
  242. package/src/utils/debug.ts +40 -0
  243. package/src/utils/deepClone.ts +38 -0
  244. package/src/utils/getGlobal.ts +3 -0
  245. package/src/utils/groupAndPivot/defaultToKey.ts +3 -0
  246. package/src/utils/groupAndPivot/getGroupKeysForDataItem.ts +19 -0
  247. package/src/utils/groupAndPivot/getPivotColumnsAndColumnGroups.ts +361 -0
  248. package/src/utils/groupAndPivot/index.ts +1229 -0
  249. package/src/utils/groupAndPivot/types.ts +10 -0
  250. package/src/utils/join.ts +4 -0
  251. package/src/utils/mathIntersection.ts +21 -0
  252. package/src/utils/minified.d.ts +2 -0
  253. package/src/utils/minified.js +6 -0
  254. package/src/utils/multisort/index.ts +151 -0
  255. package/src/utils/multisort/sortTypes.ts +25 -0
  256. package/src/utils/notes-status.md +92 -0
  257. package/src/utils/pageGeometry/ConvexPoly.ts +34 -0
  258. package/src/utils/pageGeometry/Point.ts +51 -0
  259. package/src/utils/pageGeometry/PolyWithPoints.ts +52 -0
  260. package/src/utils/pageGeometry/Rectangle.ts +98 -0
  261. package/src/utils/pageGeometry/Triangle.ts +16 -0
  262. package/src/utils/pageGeometry/alignment/index.ts +221 -0
  263. package/src/utils/pageGeometry/polyContainsPoint.ts +182 -0
  264. package/src/utils/pageGeometry/types.ts +3 -0
  265. package/src/utils/proxyFnCall.ts +46 -0
  266. package/src/utils/raf.ts +13 -0
  267. package/src/utils/selectParent.ts +18 -0
  268. package/src/utils/shallowEqualObjects.ts +49 -0
  269. package/src/utils/stripVar.ts +3 -0
  270. package/src/utils/toUpperFirst.ts +5 -0
  271. package/todo.md +2 -0
  272. package/tsconfig.build.json +8 -0
  273. package/tsconfig.dev.json +7 -0
  274. package/tsconfig.json +30 -0
  275. package/tsconfig.typebundler.json +13 -0
  276. package/typedoc.json +4 -0
  277. package/README.md +0 -104
  278. package/index.css +0 -857
  279. package/index.d.ts +0 -2111
  280. package/index.esm.css +0 -857
  281. package/index.esm.js +0 -13695
  282. package/index.js +0 -13565
@@ -0,0 +1,221 @@
1
+ import { Point, PointCoords } from '../Point';
2
+ import { Rectangle, RectangleCoords } from '../Rectangle';
3
+
4
+ export type Alignable = RectangleCoords | HTMLElement | DOMRect;
5
+
6
+ export type AlignPositionEnum =
7
+ | 'TopLeft'
8
+ | 'TopCenter'
9
+ | 'TopRight'
10
+ | 'CenterRight'
11
+ | 'BottomRight'
12
+ | 'BottomCenter'
13
+ | 'BottomLeft'
14
+ | 'CenterLeft'
15
+ | 'Center';
16
+
17
+ type AlignPositionItem = [AlignPositionEnum, AlignPositionEnum];
18
+
19
+ export type AlignPositionOptions = {
20
+ alignPosition: AlignPositionItem[];
21
+ constrainTo?: Alignable;
22
+ alignAnchor: Alignable;
23
+ alignTarget: Alignable;
24
+ };
25
+
26
+ type AlignPositionResult = {
27
+ alignPosition: AlignPositionItem;
28
+ alignedRect: Rectangle;
29
+ distance: PointCoords;
30
+ valid: boolean;
31
+ index: number;
32
+ };
33
+
34
+ function isHTMLElement(v: Alignable): v is HTMLElement {
35
+ //@ts-ignore
36
+ return !!v.tagName;
37
+ }
38
+
39
+ export function getAlignPosition(
40
+ options: AlignPositionOptions,
41
+ ): AlignPositionResult {
42
+ const { alignTarget, alignAnchor, constrainTo, alignPosition } = options;
43
+
44
+ const alignTargetRectangle = Rectangle.from(
45
+ isHTMLElement(alignTarget)
46
+ ? alignTarget.getBoundingClientRect()
47
+ : alignTarget,
48
+ );
49
+
50
+ const alignAnchorRectangle = Rectangle.from(
51
+ isHTMLElement(alignAnchor)
52
+ ? alignAnchor.getBoundingClientRect()
53
+ : alignAnchor,
54
+ );
55
+
56
+ const constrainRectangle = constrainTo
57
+ ? Rectangle.from(
58
+ isHTMLElement(constrainTo)
59
+ ? constrainTo.getBoundingClientRect()
60
+ : constrainTo,
61
+ )
62
+ : null;
63
+
64
+ if (!constrainRectangle) {
65
+ // no constrain, so the first alignPosition will match
66
+ const alignResult = align({
67
+ anchorRect: alignAnchorRectangle,
68
+ targetRect: alignTargetRectangle,
69
+ position: alignPosition[0],
70
+ });
71
+ return {
72
+ ...alignResult,
73
+ index: 0,
74
+ };
75
+ }
76
+
77
+ let firstAlignResult: AlignPositionResult | null = null;
78
+
79
+ for (let i = 0, len = alignPosition.length; i < len; i++) {
80
+ const alignResult = align({
81
+ anchorRect: alignAnchorRectangle,
82
+ targetRect: alignTargetRectangle,
83
+ position: alignPosition[i],
84
+ constrainRect: constrainRectangle,
85
+ });
86
+
87
+ if (i === 0) {
88
+ firstAlignResult = {
89
+ ...alignResult,
90
+ index: 0,
91
+ };
92
+ }
93
+
94
+ if (alignResult.valid) {
95
+ return {
96
+ ...alignResult,
97
+
98
+ index: i,
99
+ };
100
+ }
101
+ }
102
+ return firstAlignResult!;
103
+ }
104
+
105
+ export function align(options: {
106
+ targetRect: Rectangle;
107
+ anchorRect: Rectangle;
108
+ position: AlignPositionItem;
109
+ constrainRect?: Rectangle | null;
110
+ }) {
111
+ const targetRect = Rectangle.from(options.targetRect);
112
+ const anchorRect = Rectangle.from(options.anchorRect);
113
+ const constrainRect = options.constrainRect
114
+ ? Rectangle.from(options.constrainRect)
115
+ : null;
116
+
117
+ const { position } = options;
118
+ const [targetPos, anchorPos] = position;
119
+
120
+ const targetPoint = getRectanglePointForPosition(targetRect, targetPos);
121
+ const anchorPoint = getRectanglePointForPosition(anchorRect, anchorPos);
122
+
123
+ const distance = targetPoint.getDistanceToPoint(anchorPoint);
124
+
125
+ targetRect.shift(distance);
126
+
127
+ const valid = constrainRect ? constrainRect.contains(targetRect) : true;
128
+
129
+ return {
130
+ alignPosition: position,
131
+ alignedRect: targetRect,
132
+ valid,
133
+ distance,
134
+ };
135
+ }
136
+
137
+ function getRectanglePointForPosition(
138
+ rect: Rectangle,
139
+ position: AlignPositionEnum,
140
+ ): Point {
141
+ if (position === 'TopLeft') {
142
+ return Point.from({
143
+ top: rect.top,
144
+ left: rect.left,
145
+ });
146
+ }
147
+
148
+ if (position === 'TopCenter') {
149
+ return Point.from({
150
+ top: rect.top,
151
+ left: rect.left + (rect.width > 0 ? Math.round(rect.width / 2) : 0),
152
+ });
153
+ }
154
+ if (position === 'TopRight') {
155
+ return Point.from({
156
+ top: rect.top,
157
+ left: rect.left + rect.width,
158
+ });
159
+ }
160
+ if (position === 'BottomLeft') {
161
+ return Point.from({
162
+ left: rect.left,
163
+ top: rect.top + rect.height,
164
+ });
165
+ }
166
+ if (position === 'BottomCenter') {
167
+ return Point.from({
168
+ left: rect.left + (rect.width > 0 ? Math.round(rect.width / 2) : 0),
169
+ top: rect.top + rect.height,
170
+ });
171
+ }
172
+ if (position === 'BottomRight') {
173
+ return Point.from({
174
+ left: rect.left + rect.width,
175
+ top: rect.top + rect.height,
176
+ });
177
+ }
178
+
179
+ if (position === 'CenterLeft') {
180
+ return Point.from({
181
+ left: rect.left,
182
+ top: rect.top + (rect.height > 0 ? Math.round(rect.height / 2) : 0),
183
+ });
184
+ }
185
+ if (position === 'CenterRight') {
186
+ return Point.from({
187
+ left: rect.left + rect.width,
188
+ top: rect.top + (rect.height > 0 ? Math.round(rect.height / 2) : 0),
189
+ });
190
+ }
191
+
192
+ // position === AlignPositionEnum.Center
193
+ return Point.from({
194
+ left: rect.left + (rect.width > 0 ? Math.round(rect.width / 2) : 0),
195
+ top: rect.top + (rect.height > 0 ? Math.round(rect.height / 2) : 0),
196
+ });
197
+ }
198
+
199
+ // function align(options: { targetRect: Rectangle; anchorRect: Rectangle }) {
200
+
201
+ // }
202
+
203
+ // getAlignPosition({
204
+ // alignPosition: [
205
+ // [AlignPositionEnum.TopLeft, AlignPositionEnum.TopCenter],
206
+ // [AlignPositionEnum.TopLeft, AlignPositionEnum.TopCenter],
207
+ // ],
208
+ // alignAnchor: {
209
+ // top: 0,
210
+ // left: 0,
211
+ // width: 100,
212
+ // height: 100,
213
+ // },
214
+
215
+ // alignTarget: {
216
+ // top: 0,
217
+ // left: 0,
218
+ // width: 100,
219
+ // height: 100,
220
+ // },
221
+ // });
@@ -0,0 +1,182 @@
1
+ import { PointCoords } from './Point';
2
+ import { ArrayWith3, ArrayWithAtLeast3 } from './types';
3
+
4
+ /*
5
+ *
6
+ * See https://www.baeldung.com/cs/sort-points-clockwise for a reference
7
+ */
8
+
9
+ function getAngle(p: PointCoords, center: PointCoords) {
10
+ let angle = Math.atan2(p.top - center.top, p.left - center.left);
11
+
12
+ if (angle <= 0) {
13
+ angle = 2 * Math.PI + angle;
14
+ }
15
+
16
+ return angle;
17
+ }
18
+
19
+ function getDistance(p1: PointCoords, p2: PointCoords) {
20
+ return Math.sqrt((p2.top - p1.top) ** 2 + (p2.left - p1.left) ** 2);
21
+ }
22
+
23
+ function comparePoints(p1: PointCoords, p2: PointCoords, center: PointCoords) {
24
+ const angle1 = getAngle(p1, center);
25
+ const angle2 = getAngle(p2, center);
26
+
27
+ if (angle1 === angle2) {
28
+ return getDistance(center, p2) - getDistance(center, p1);
29
+ }
30
+
31
+ return angle1 - angle2;
32
+ }
33
+
34
+ function sortPoints(
35
+ points: ArrayWithAtLeast3<PointCoords>,
36
+ ): ArrayWithAtLeast3<PointCoords> {
37
+ if (points.length < 3) {
38
+ return points;
39
+ }
40
+
41
+ const [...result] = points;
42
+
43
+ const center = { top: 0, left: 0 };
44
+
45
+ points.forEach((p) => {
46
+ center.top += p.top;
47
+ center.left += p.left;
48
+ });
49
+
50
+ center.top /= points.length;
51
+ center.left /= points.length;
52
+
53
+ result.sort((a, b) => comparePoints(a, b, center));
54
+
55
+ return result;
56
+ }
57
+
58
+ export function polyContainsPoint(
59
+ points: ArrayWithAtLeast3<PointCoords>,
60
+ point: PointCoords,
61
+ ): boolean {
62
+ // we need to sort the points so they are in clockwise or counter clockwise order
63
+ points = sortPoints(points);
64
+
65
+ const [rootPoint] = points;
66
+
67
+ // starting from the root point
68
+ // draw a triangle to any other 2 neighboring points, in sort order (as sorted above in previous step)
69
+ // and check if the point is inside that triangle
70
+
71
+ // this is a pretty effective way to check if a point is inside a polygon
72
+
73
+ for (
74
+ let i = 1, len = points.length - 1 /*yes, -1 is correct*/;
75
+ i < len;
76
+ i++
77
+ ) {
78
+ const p1 = points[i];
79
+ const p2 = points[i + 1];
80
+
81
+ if (triangleContainsPoint([rootPoint, p1, p2], point)) {
82
+ return true;
83
+ }
84
+ }
85
+
86
+ return false;
87
+ }
88
+
89
+ // function translateIntoPositive(points: PointCoords[]): PointCoords[] {
90
+ // if (!points.length) {
91
+ // return [];
92
+ // }
93
+
94
+ // let minLeft = points[0].left;
95
+ // let minTop = points[0].top;
96
+
97
+ // for (let i = 1, len = points.length; i < len; i++) {
98
+ // minLeft = Math.min(minLeft, points[i].left);
99
+ // minTop = Math.min(minTop, points[i].top);
100
+ // }
101
+
102
+ // const translateLeft = minLeft < 0;
103
+ // const translateTop = minTop < 0;
104
+
105
+ // if (!translateLeft && !translateTop) {
106
+ // // no need to translate points
107
+ // return points;
108
+ // }
109
+
110
+ // const result = points.map((p) => {
111
+ // const newPoint = { ...p };
112
+ // if (translateLeft) {
113
+ // newPoint.left = p.left - minLeft;
114
+ // }
115
+ // if (translateTop) {
116
+ // newPoint.top = p.top - minTop;
117
+ // }
118
+ // return newPoint;
119
+ // });
120
+
121
+ // return result;
122
+ // }
123
+
124
+ export function triangleContainsPoint(
125
+ points: ArrayWith3<PointCoords>,
126
+ point: PointCoords,
127
+ ): boolean {
128
+ // const [a, b, c, p] = translateIntoPositive([...points, point]);
129
+ const [a, b, c] = points;
130
+ const p = point;
131
+
132
+ // const s1 = c.top - a.top;
133
+ // const s2 = c.left - a.left;
134
+ // const s3 = b.top - a.top;
135
+ // const s4 = p.top - a.top;
136
+
137
+ // const w1 =
138
+ // (a.left * s1 + s4 * s2 - p.left * s1) / (s3 * s2 - (b.left - a.left) * s1);
139
+ // const w2 = (s4 - w1 * s3) / s1;
140
+
141
+ // return w1 >= 0 && w2 >= 0 && w1 + w2 <= 1;
142
+
143
+ // second try
144
+ let det =
145
+ (b.left - a.left) * (c.top - a.top) - (b.top - a.top) * (c.left - a.left);
146
+
147
+ return (
148
+ det *
149
+ ((b.left - a.left) * (p.top - a.top) -
150
+ (b.top - a.top) * (p.left - a.left)) >=
151
+ 0 &&
152
+ det *
153
+ ((c.left - b.left) * (p.top - b.top) -
154
+ (c.top - b.top) * (p.left - b.left)) >=
155
+ 0 &&
156
+ det *
157
+ ((a.left - c.left) * (p.top - c.top) -
158
+ (a.top - c.top) * (p.left - c.left)) >=
159
+ 0
160
+ );
161
+
162
+ // var cx = p.left,
163
+ // cy = p.top,
164
+ // v0x = c.left - a.left,
165
+ // v0y = c.top - a.top,
166
+ // v1x = b.left - a.left,
167
+ // v1y = b.top - a.top,
168
+ // v2x = cx - a.left,
169
+ // v2y = cy - a.top,
170
+ // dot00 = v0x * v0x + v0y * v0y,
171
+ // dot01 = v0x * v1x + v0y * v1y,
172
+ // dot02 = v0x * v2x + v0y * v2y,
173
+ // dot11 = v1x * v1x + v1y * v1y,
174
+ // dot12 = v1x * v2x + v1y * v2y;
175
+
176
+ // // Compute barycentric coordinates
177
+ // var bary = dot00 * dot11 - dot01 * dot01,
178
+ // inv = bary === 0 ? 0 : 1 / bary,
179
+ // u = (dot11 * dot02 - dot01 * dot12) * inv,
180
+ // v = (dot00 * dot12 - dot01 * dot02) * inv;
181
+ // return u >= 0 && v >= 0 && u + v < 1;
182
+ }
@@ -0,0 +1,3 @@
1
+ export type ArrayWithAtLeast3<T> = [T, T, T, ...T[]];
2
+ export type ArrayWith4<T> = [T, T, T, T];
3
+ export type ArrayWith3<T> = [T, T, T];
@@ -0,0 +1,46 @@
1
+ export function proxyFn<
2
+ T_PARAM_TO_PROXY,
3
+ T_FN_PARAMETERS,
4
+ T_RESULT extends any,
5
+ >(
6
+ fn: (...params: T_FN_PARAMETERS[]) => T_RESULT,
7
+ config?: {
8
+ getProxyTargetFromArgs: (...params: T_FN_PARAMETERS[]) => T_PARAM_TO_PROXY;
9
+ putProxyToArgs: (
10
+ proxy: T_PARAM_TO_PROXY,
11
+ ...params: T_FN_PARAMETERS[]
12
+ ) => T_FN_PARAMETERS[];
13
+ },
14
+ ) {
15
+ const propertyReads: Set<string> = new Set();
16
+ function proxiedFn(...params: T_FN_PARAMETERS[]) {
17
+ const paramToProxy = config
18
+ ? config.getProxyTargetFromArgs(...params)
19
+ : params[0];
20
+
21
+ propertyReads.clear();
22
+
23
+ const handler = {
24
+ get: function (obj: object, prop: string) {
25
+ propertyReads.add(prop);
26
+ return (obj as any as T_PARAM_TO_PROXY)[prop as keyof T_PARAM_TO_PROXY];
27
+ },
28
+ };
29
+ const proxy = new Proxy(
30
+ paramToProxy as any as object,
31
+ handler,
32
+ ) as any as T_PARAM_TO_PROXY;
33
+
34
+ const newParams = config
35
+ ? config.putProxyToArgs(proxy, ...params)
36
+ : [proxy];
37
+
38
+ //@ts-ignore
39
+ return fn.apply(this as unknown as any, newParams);
40
+ }
41
+
42
+ return {
43
+ fn: proxiedFn,
44
+ propertyReads,
45
+ };
46
+ }
@@ -0,0 +1,13 @@
1
+ import { getGlobal } from './getGlobal';
2
+
3
+ export const raf =
4
+ getGlobal().requestAnimationFrame ||
5
+ ((fn: Function) => {
6
+ return setTimeout(fn, 16);
7
+ });
8
+
9
+ export const cancelRaf =
10
+ getGlobal().cancelAnimationFrame ||
11
+ ((timeoutId: number) => {
12
+ return clearTimeout(timeoutId);
13
+ });
@@ -0,0 +1,18 @@
1
+ export function selectParent(el: HTMLElement, selector: string) {
2
+ let node: HTMLElement | null = el;
3
+
4
+ if (!node) {
5
+ return null;
6
+ }
7
+
8
+ if (node && node.matches(selector)) {
9
+ return node;
10
+ }
11
+ while ((node = node.parentElement)) {
12
+ if (node.matches(selector)) {
13
+ return node;
14
+ }
15
+ }
16
+
17
+ return null;
18
+ }
@@ -0,0 +1,49 @@
1
+ export function shallowEqualObjects<T extends object | null>(
2
+ objA: T,
3
+ objB: T,
4
+ ignoreKeys?: Set<string>,
5
+ ): boolean {
6
+ if (objA === objB) {
7
+ return true;
8
+ }
9
+
10
+ if (!objA || !objB) {
11
+ return false;
12
+ }
13
+
14
+ var aKeys = Object.keys(objA) as (keyof T)[];
15
+ var bKeys = Object.keys(objB) as (keyof T)[];
16
+
17
+ if (ignoreKeys) {
18
+ //@ts-ignore
19
+ aKeys = aKeys.filter((key) => !ignoreKeys.has(key));
20
+ //@ts-ignore
21
+ bKeys = bKeys.filter((key) => !ignoreKeys.has(key));
22
+ }
23
+
24
+ var len = aKeys.length;
25
+
26
+ if (bKeys.length !== len) {
27
+ return false;
28
+ }
29
+
30
+ for (var i = 0; i < len; i++) {
31
+ var key = aKeys[i];
32
+
33
+ if (ignoreKeys) {
34
+ //@ts-ignore
35
+ if (ignoreKeys.has(key)) {
36
+ continue;
37
+ }
38
+ }
39
+
40
+ if (
41
+ (objA as any)[key] !== (objB as any)[key] ||
42
+ !Object.prototype.hasOwnProperty.call(objB, key)
43
+ ) {
44
+ return false;
45
+ }
46
+ }
47
+
48
+ return true;
49
+ }
@@ -0,0 +1,3 @@
1
+ export function stripVar(cssVariableWithVarString: string) {
2
+ return cssVariableWithVarString.slice(4, -1);
3
+ }
@@ -0,0 +1,5 @@
1
+ export const toUpperFirst = (s: string): string => {
2
+ return s ? s.substr(0, 1).toUpperCase() + s.substr(1) : s;
3
+ };
4
+
5
+ export default toUpperFirst;
package/todo.md ADDED
@@ -0,0 +1,2 @@
1
+ * implement reducer - check it works with nested objects
2
+ * implement sort with nested objects or custom value
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "exclude": ["node_modules"],
4
+ "compilerOptions": {
5
+ "isolatedModules": false,
6
+ "rootDir": "./src"
7
+ }
8
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "noEmit": false,
5
+ "emitDeclarationOnly": false
6
+ }
7
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "include": ["src/**/*", "globals.d.ts"],
3
+ "compilerOptions": {
4
+ "target": "es6",
5
+ "module": "esnext",
6
+ "lib": ["dom", "esnext"],
7
+ "importHelpers": true,
8
+ "sourceMap": true,
9
+ "rootDir": "..",
10
+ "strict": true,
11
+ "noEmit": true,
12
+ "noImplicitAny": true,
13
+ "strictNullChecks": true,
14
+ "strictFunctionTypes": true,
15
+ "strictPropertyInitialization": true,
16
+ "forceConsistentCasingInFileNames": true,
17
+ "isolatedModules": true,
18
+ "noImplicitThis": true,
19
+ "alwaysStrict": true,
20
+ "noUnusedLocals": true,
21
+ "noUnusedParameters": true,
22
+ "noImplicitReturns": true,
23
+ "noFallthroughCasesInSwitch": true,
24
+ "moduleResolution": "node",
25
+ "resolveJsonModule": true,
26
+ "jsx": "react",
27
+ "esModuleInterop": true
28
+ },
29
+ "exclude": ["dist"]
30
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "exclude": ["dist"],
4
+ "include": ["dist/index.d.ts"],
5
+ "compilerOptions": {
6
+ "lib": [],
7
+ "module":"System",
8
+ "allowJs": false,
9
+ "checkJs": false,
10
+ "resolveJsonModule": false
11
+ }
12
+
13
+ }
package/typedoc.json ADDED
@@ -0,0 +1,4 @@
1
+ {
2
+ "entryPoints": ["src/index.tsx"],
3
+ "out": "../apidocs"
4
+ }