@rebasepro/ui 0.24.0 → 0.24.1-canary.gcb918fc

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 (241) hide show
  1. package/dist/components/Alert.d.ts +6 -0
  2. package/dist/components/Alert.es.js +82 -0
  3. package/dist/components/Alert.es.js.map +1 -0
  4. package/dist/components/Autocomplete.es.js +53 -0
  5. package/dist/components/Autocomplete.es.js.map +1 -0
  6. package/dist/components/Avatar.d.ts +3 -1
  7. package/dist/components/Avatar.es.js +37 -0
  8. package/dist/components/Avatar.es.js.map +1 -0
  9. package/dist/components/Badge.es.js +27 -0
  10. package/dist/components/Badge.es.js.map +1 -0
  11. package/dist/components/BooleanSwitch.es.js +75 -0
  12. package/dist/components/BooleanSwitch.es.js.map +1 -0
  13. package/dist/components/BooleanSwitchWithLabel.es.js +55 -0
  14. package/dist/components/BooleanSwitchWithLabel.es.js.map +1 -0
  15. package/dist/components/Button.es.js +58 -0
  16. package/dist/components/Button.es.js.map +1 -0
  17. package/dist/components/Card.es.js +26 -0
  18. package/dist/components/Card.es.js.map +1 -0
  19. package/dist/components/CenteredView.es.js +23 -0
  20. package/dist/components/CenteredView.es.js.map +1 -0
  21. package/dist/components/Checkbox.es.js +62 -0
  22. package/dist/components/Checkbox.es.js.map +1 -0
  23. package/dist/components/Chip.es.js +72 -0
  24. package/dist/components/Chip.es.js.map +1 -0
  25. package/dist/components/CircularProgress.es.js +28 -0
  26. package/dist/components/CircularProgress.es.js.map +1 -0
  27. package/dist/components/CircularProgressCenter.es.js +30 -0
  28. package/dist/components/CircularProgressCenter.es.js.map +1 -0
  29. package/dist/components/Collapse.es.js +57 -0
  30. package/dist/components/Collapse.es.js.map +1 -0
  31. package/dist/components/ColorPicker.es.js +89 -0
  32. package/dist/components/ColorPicker.es.js.map +1 -0
  33. package/dist/components/Container.es.js +31 -0
  34. package/dist/components/Container.es.js.map +1 -0
  35. package/dist/components/DateTimeField.d.ts +11 -1
  36. package/dist/components/DateTimeField.es.js +253 -0
  37. package/dist/components/DateTimeField.es.js.map +1 -0
  38. package/dist/components/DebouncedTextField.es.js +93 -0
  39. package/dist/components/DebouncedTextField.es.js.map +1 -0
  40. package/dist/components/Dialog.es.js +98 -0
  41. package/dist/components/Dialog.es.js.map +1 -0
  42. package/dist/components/DialogActions.es.js +15 -0
  43. package/dist/components/DialogActions.es.js.map +1 -0
  44. package/dist/components/DialogContent.es.js +18 -0
  45. package/dist/components/DialogContent.es.js.map +1 -0
  46. package/dist/components/DialogTitle.es.js +26 -0
  47. package/dist/components/DialogTitle.es.js.map +1 -0
  48. package/dist/components/ErrorBoundary.es.js +158 -0
  49. package/dist/components/ErrorBoundary.es.js.map +1 -0
  50. package/dist/components/ExpandablePanel.es.js +91 -0
  51. package/dist/components/ExpandablePanel.es.js.map +1 -0
  52. package/dist/components/FileUpload.es.js +58 -0
  53. package/dist/components/FileUpload.es.js.map +1 -0
  54. package/dist/components/FilterChip.es.js +31 -0
  55. package/dist/components/FilterChip.es.js.map +1 -0
  56. package/dist/components/IconButton.es.js +52 -0
  57. package/dist/components/IconButton.es.js.map +1 -0
  58. package/dist/components/InfoLabel.es.js +18 -0
  59. package/dist/components/InfoLabel.es.js.map +1 -0
  60. package/dist/components/InputLabel.es.js +27 -0
  61. package/dist/components/InputLabel.es.js.map +1 -0
  62. package/dist/components/Label.es.js +18 -0
  63. package/dist/components/Label.es.js.map +1 -0
  64. package/dist/components/LoadingButton.es.js +21 -0
  65. package/dist/components/LoadingButton.es.js.map +1 -0
  66. package/dist/components/Markdown.es.js +88 -0
  67. package/dist/components/Markdown.es.js.map +1 -0
  68. package/dist/components/Menu.es.js +46 -0
  69. package/dist/components/Menu.es.js.map +1 -0
  70. package/dist/components/Menubar.es.js +142 -0
  71. package/dist/components/Menubar.es.js.map +1 -0
  72. package/dist/components/MultiSelect.d.ts +1 -7
  73. package/dist/components/MultiSelect.es.js +271 -0
  74. package/dist/components/MultiSelect.es.js.map +1 -0
  75. package/dist/components/Paper.es.js +16 -0
  76. package/dist/components/Paper.es.js.map +1 -0
  77. package/dist/components/Popover.es.js +113 -0
  78. package/dist/components/Popover.es.js.map +1 -0
  79. package/dist/components/RadioGroup.es.js +30 -0
  80. package/dist/components/RadioGroup.es.js.map +1 -0
  81. package/dist/components/ResizablePanels.d.ts +3 -1
  82. package/dist/components/ResizablePanels.es.js +137 -0
  83. package/dist/components/ResizablePanels.es.js.map +1 -0
  84. package/dist/components/SearchBar.es.js +82 -0
  85. package/dist/components/SearchBar.es.js.map +1 -0
  86. package/dist/components/Select.d.ts +8 -1
  87. package/dist/components/Select.es.js +300 -0
  88. package/dist/components/Select.es.js.map +1 -0
  89. package/dist/components/Separator.es.js +20 -0
  90. package/dist/components/Separator.es.js.map +1 -0
  91. package/dist/components/Sheet.es.js +73 -0
  92. package/dist/components/Sheet.es.js.map +1 -0
  93. package/dist/components/Skeleton.es.js +33 -0
  94. package/dist/components/Skeleton.es.js.map +1 -0
  95. package/dist/components/Slider.es.js +56 -0
  96. package/dist/components/Slider.es.js.map +1 -0
  97. package/dist/components/Table.d.ts +18 -3
  98. package/dist/components/Table.es.js +69 -0
  99. package/dist/components/Table.es.js.map +1 -0
  100. package/dist/components/Tabs.es.js +101 -0
  101. package/dist/components/Tabs.es.js.map +1 -0
  102. package/dist/components/TextField.d.ts +0 -8
  103. package/dist/components/TextField.es.js +111 -0
  104. package/dist/components/TextField.es.js.map +1 -0
  105. package/dist/components/TextareaAutosize.es.js +187 -0
  106. package/dist/components/TextareaAutosize.es.js.map +1 -0
  107. package/dist/components/ToggleButtonGroup.d.ts +6 -1
  108. package/dist/components/ToggleButtonGroup.es.js +35 -0
  109. package/dist/components/ToggleButtonGroup.es.js.map +1 -0
  110. package/dist/components/Tooltip.d.ts +24 -0
  111. package/dist/components/Tooltip.es.js +165 -0
  112. package/dist/components/Tooltip.es.js.map +1 -0
  113. package/dist/components/Typography.es.js +85 -0
  114. package/dist/components/Typography.es.js.map +1 -0
  115. package/dist/components/VirtualTable/VirtualTable.es.js +516 -0
  116. package/dist/components/VirtualTable/VirtualTable.es.js.map +1 -0
  117. package/dist/components/VirtualTable/VirtualTableCell.d.ts +1 -1
  118. package/dist/components/VirtualTable/VirtualTableCell.es.js +40 -0
  119. package/dist/components/VirtualTable/VirtualTableCell.es.js.map +1 -0
  120. package/dist/components/VirtualTable/VirtualTableHeader.es.js +209 -0
  121. package/dist/components/VirtualTable/VirtualTableHeader.es.js.map +1 -0
  122. package/dist/components/VirtualTable/VirtualTableHeaderRow.es.js +166 -0
  123. package/dist/components/VirtualTable/VirtualTableHeaderRow.es.js.map +1 -0
  124. package/dist/components/VirtualTable/VirtualTableProps.d.ts +13 -2
  125. package/dist/components/VirtualTable/VirtualTableRow.d.ts +6 -7
  126. package/dist/components/VirtualTable/VirtualTableRow.es.js +41 -0
  127. package/dist/components/VirtualTable/VirtualTableRow.es.js.map +1 -0
  128. package/dist/components/VirtualTable/fields/VirtualTableDateField.d.ts +2 -1
  129. package/dist/components/VirtualTable/fields/VirtualTableDateField.es.js +71 -0
  130. package/dist/components/VirtualTable/fields/VirtualTableDateField.es.js.map +1 -0
  131. package/dist/components/VirtualTable/fields/VirtualTableInput.es.js +73 -0
  132. package/dist/components/VirtualTable/fields/VirtualTableInput.es.js.map +1 -0
  133. package/dist/components/VirtualTable/fields/VirtualTableNumberInput.es.js +47 -0
  134. package/dist/components/VirtualTable/fields/VirtualTableNumberInput.es.js.map +1 -0
  135. package/dist/components/VirtualTable/fields/VirtualTableSelect.es.js +83 -0
  136. package/dist/components/VirtualTable/fields/VirtualTableSelect.es.js.map +1 -0
  137. package/dist/components/VirtualTable/fields/VirtualTableSwitch.es.js +22 -0
  138. package/dist/components/VirtualTable/fields/VirtualTableSwitch.es.js.map +1 -0
  139. package/dist/components/VirtualTable/selection/SelectionContext.es.js +23 -0
  140. package/dist/components/VirtualTable/selection/SelectionContext.es.js.map +1 -0
  141. package/dist/components/VirtualTable/selection/SelectionStore.es.js +43 -0
  142. package/dist/components/VirtualTable/selection/SelectionStore.es.js.map +1 -0
  143. package/dist/components/VirtualTable/types.d.ts +1 -1
  144. package/dist/components/common/SelectInputLabel.es.js +28 -0
  145. package/dist/components/common/SelectInputLabel.es.js.map +1 -0
  146. package/dist/components/index.es.js +64 -0
  147. package/dist/hooks/PortalContainerContext.es.js +40 -0
  148. package/dist/hooks/PortalContainerContext.es.js.map +1 -0
  149. package/dist/hooks/UiLabelsContext.d.ts +63 -0
  150. package/dist/hooks/UiLabelsContext.es.js +59 -0
  151. package/dist/hooks/UiLabelsContext.es.js.map +1 -0
  152. package/dist/hooks/useDebounceCallback.es.js +15 -0
  153. package/dist/hooks/useDebounceCallback.es.js.map +1 -0
  154. package/dist/hooks/useDebounceValue.es.js +19 -0
  155. package/dist/hooks/useDebounceValue.es.js.map +1 -0
  156. package/dist/hooks/useDebouncedCallback.es.js +36 -0
  157. package/dist/hooks/useDebouncedCallback.es.js.map +1 -0
  158. package/dist/hooks/useInjectStyles.es.js +27 -0
  159. package/dist/hooks/useInjectStyles.es.js.map +1 -0
  160. package/dist/hooks/useIsDarkMode.es.js +61 -0
  161. package/dist/hooks/useIsDarkMode.es.js.map +1 -0
  162. package/dist/hooks/useModalFocus.es.js +81 -0
  163. package/dist/hooks/useModalFocus.es.js.map +1 -0
  164. package/dist/hooks/useOutsideAlerter.es.js +41 -0
  165. package/dist/hooks/useOutsideAlerter.es.js.map +1 -0
  166. package/dist/hooks/useRestoreInterruptedFocus.es.js +61 -0
  167. package/dist/hooks/useRestoreInterruptedFocus.es.js.map +1 -0
  168. package/dist/icons/GitHubIcon.es.js +23 -0
  169. package/dist/icons/GitHubIcon.es.js.map +1 -0
  170. package/dist/icons/HandleIcon.es.js +60 -0
  171. package/dist/icons/HandleIcon.es.js.map +1 -0
  172. package/dist/icons/Icon.es.js +25 -0
  173. package/dist/icons/Icon.es.js.map +1 -0
  174. package/dist/icons/LucideIconByName.d.ts +12 -9
  175. package/dist/icons/LucideIconByName.es.js +83 -0
  176. package/dist/icons/LucideIconByName.es.js.map +1 -0
  177. package/dist/icons/cool_icon_keys.es.js +55 -0
  178. package/dist/icons/cool_icon_keys.es.js.map +1 -0
  179. package/dist/icons/icon_keys.es.js +1941 -0
  180. package/dist/icons/icon_keys.es.js.map +1 -0
  181. package/dist/icons/index.d.ts +4 -3
  182. package/dist/icons/index.es.js +8 -0
  183. package/dist/icons/lucide_icon_map.d.ts +12 -0
  184. package/dist/icons/lucide_icon_map.es.js +2 -0
  185. package/dist/index.d.ts +2 -0
  186. package/dist/index.es.js +87 -9563
  187. package/dist/styles.es.js +158 -0
  188. package/dist/styles.es.js.map +1 -0
  189. package/dist/util/chip_colors.es.js +290 -0
  190. package/dist/util/chip_colors.es.js.map +1 -0
  191. package/dist/util/cls.es.js +10 -0
  192. package/dist/util/cls.es.js.map +1 -0
  193. package/dist/util/debounce.es.js +22 -0
  194. package/dist/util/debounce.es.js.map +1 -0
  195. package/dist/util/hash.es.js +16 -0
  196. package/dist/util/hash.es.js.map +1 -0
  197. package/dist/util/keys.es.js +37 -0
  198. package/dist/util/keys.es.js.map +1 -0
  199. package/dist/util/lazy_chunk.es.js +96 -0
  200. package/dist/util/lazy_chunk.es.js.map +1 -0
  201. package/dist/views/CardView.d.ts +26 -2
  202. package/dist/views/CardView.es.js +435 -0
  203. package/dist/views/CardView.es.js.map +1 -0
  204. package/dist/views/CollectionView/CollectionCardView.es.js +179 -0
  205. package/dist/views/CollectionView/CollectionCardView.es.js.map +1 -0
  206. package/dist/views/CollectionView/CollectionKanbanView.es.js +172 -0
  207. package/dist/views/CollectionView/CollectionKanbanView.es.js.map +1 -0
  208. package/dist/views/CollectionView/CollectionListView.es.js +156 -0
  209. package/dist/views/CollectionView/CollectionListView.es.js.map +1 -0
  210. package/dist/views/CollectionView/CollectionTableView.es.js +149 -0
  211. package/dist/views/CollectionView/CollectionTableView.es.js.map +1 -0
  212. package/dist/views/CollectionView/CollectionView.es.js +197 -0
  213. package/dist/views/CollectionView/CollectionView.es.js.map +1 -0
  214. package/dist/views/CollectionView/CollectionViewToolbar.es.js +155 -0
  215. package/dist/views/CollectionView/CollectionViewToolbar.es.js.map +1 -0
  216. package/dist/views/CollectionView/DefaultCellRenderer.es.js +302 -0
  217. package/dist/views/CollectionView/DefaultCellRenderer.es.js.map +1 -0
  218. package/dist/views/CollectionView/resolveTitleProperty.es.js +56 -0
  219. package/dist/views/CollectionView/resolveTitleProperty.es.js.map +1 -0
  220. package/dist/views/CollectionView/utils.es.js +19 -0
  221. package/dist/views/CollectionView/utils.es.js.map +1 -0
  222. package/dist/views/Kanban/Board.es.js +237 -0
  223. package/dist/views/Kanban/Board.es.js.map +1 -0
  224. package/dist/views/Kanban/BoardColumn.es.js +81 -0
  225. package/dist/views/Kanban/BoardColumn.es.js.map +1 -0
  226. package/dist/views/Kanban/BoardColumnTitle.es.js +27 -0
  227. package/dist/views/Kanban/BoardColumnTitle.es.js.map +1 -0
  228. package/dist/views/Kanban/BoardSortableList.es.js +98 -0
  229. package/dist/views/Kanban/BoardSortableList.es.js.map +1 -0
  230. package/dist/views/Kanban/placement.es.js +27 -0
  231. package/dist/views/Kanban/placement.es.js.map +1 -0
  232. package/dist/views/KanbanView.es.js +11 -0
  233. package/dist/views/KanbanView.es.js.map +1 -0
  234. package/dist/views/ListView.d.ts +15 -2
  235. package/dist/views/ListView.es.js +245 -0
  236. package/dist/views/ListView.es.js.map +1 -0
  237. package/dist/views/useScrollParentRestoration.d.ts +8 -1
  238. package/dist/views/useScrollParentRestoration.es.js +75 -0
  239. package/dist/views/useScrollParentRestoration.es.js.map +1 -0
  240. package/package.json +2 -2
  241. package/dist/index.es.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListView.es.js","names":[],"sources":["../../src/views/ListView.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n CircularProgress,\n Skeleton,\n Typography\n} from \"../components\";\nimport { cls } from \"../util\";\nimport { useUiLabels } from \"../hooks/UiLabelsContext\";\nimport { getScrollParent, useScrollParentRestoration, type ViewScrollEvent } from \"./useScrollParentRestoration\";\n\nexport type CollectionSize = \"xs\" | \"s\" | \"m\" | \"l\" | \"xl\";\n\nexport type ListViewColumnDef<T> = {\n key: string;\n label: string;\n align?: \"left\" | \"center\" | \"right\";\n width?: string;\n renderCell: (item: T) => React.ReactNode;\n isTitle?: boolean;\n};\n\nexport type ListViewProps<T> = {\n /**\n * The rows, in order. A position holding `undefined` is a row that exists\n * but has not been read yet: a placeholder is drawn in its place.\n */\n data: (T | undefined)[];\n dataLoading?: boolean;\n noMoreToLoad?: boolean;\n dataLoadingError?: Error;\n itemCount?: number;\n setItemCount?: (itemCount: number) => void;\n pageSize?: number;\n paginationEnabled?: boolean;\n\n onItemClick?: (item: T) => void;\n selectedIds?: Set<string | number>;\n highlightedIds?: Set<string | number>;\n selectionEnabled?: boolean;\n onSelectionChange?: (item: T, selected: boolean) => void;\n emptyComponent?: React.ReactNode;\n\n /**\n * Called with the scroll parent's offset as it scrolls, and restored from\n * `initialScroll` on mount — the list does not scroll itself, the page\n * around it does.\n */\n onScroll?: (props: ViewScrollEvent) => void;\n initialScroll?: number;\n\n /**\n * Called with the positions in `data` of the rows on screen — not the\n * ones drawn ahead of them — end exclusive, each time they change. While\n * the list is still scrolling to `initialScroll`, the rows there.\n */\n onRowsRendered?: (range: { start: number; end: number }) => void;\n\n size?: CollectionSize;\n selectedEntityId?: string | number;\n\n /**\n * Rendered above the rows, inside the list's own frame, and only when there\n * are rows to head. A column header over an empty state or a spinner labels\n * nothing.\n */\n header?: React.ReactNode;\n\n renderRow: (params: {\n item: T;\n index: number;\n style: React.CSSProperties;\n className: string;\n selected: boolean;\n highlighted: boolean;\n isLast: boolean;\n onClick: (e: React.MouseEvent) => void;\n onSelectionChange: (selected: boolean) => void;\n }) => React.ReactNode;\n};\n\nfunction getEstimatedRowHeight(size: CollectionSize): number {\n switch (size) {\n case \"xs\": return 44;\n case \"s\": return 52;\n case \"m\": return 64;\n case \"l\": return 76;\n case \"xl\": return 88;\n default: return 64;\n }\n}\n\nconst OVERSCAN_COUNT = 8;\nconst LOAD_MORE_THRESHOLD = 400;\n\nexport function ListView<T>({\n data,\n dataLoading = false,\n noMoreToLoad = false,\n dataLoadingError,\n itemCount,\n setItemCount,\n pageSize = 50,\n paginationEnabled = true,\n\n onItemClick,\n selectedIds,\n highlightedIds,\n selectionEnabled = true,\n onSelectionChange,\n emptyComponent,\n\n onScroll,\n initialScroll,\n onRowsRendered,\n size = \"m\",\n selectedEntityId,\n header,\n renderRow\n}: ListViewProps<T>) {\n const labels = useUiLabels();\n const containerRef = useRef<HTMLDivElement>(null);\n // The rows' own box, which a header shifts down from the container's top.\n // Virtualization measures against it rather than against the container, so\n // the window of rendered rows stays the one the viewport is actually over.\n const rowsRef = useRef<HTMLDivElement>(null);\n const isLoadingMore = useRef(false);\n\n // Reset loading gate when loading stops\n useEffect(() => {\n if (!dataLoading) isLoadingMore.current = false;\n }, [dataLoading]);\n\n // Virtualization scroll states\n const estimatedRowHeight = getEstimatedRowHeight(size);\n const [effectiveScrollTop, setEffectiveScrollTop] = useState(0);\n const [viewportHeight, setViewportHeight] = useState(800);\n // Where the rows on screen start, for `onRowsRendered`: the scroll\n // position the list is being restored to, until it gets there.\n const [reportedScrollTop, setReportedScrollTop] = useState(0);\n const [reportedHeight, setReportedHeight] = useState(800);\n\n const paginationStateRef = useRef({ paginationEnabled, noMoreToLoad, itemCount, pageSize });\n useEffect(() => {\n paginationStateRef.current = { paginationEnabled, noMoreToLoad, itemCount, pageSize };\n }, [paginationEnabled, noMoreToLoad, itemCount, pageSize]);\n\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n const scrollEl = getScrollParent(el);\n if (!scrollEl) return;\n\n let rafId: number | null = null;\n\n const update = () => {\n rafId = null;\n const scrollRect = scrollEl.getBoundingClientRect();\n const listRect = (rowsRef.current ?? el).getBoundingClientRect();\n\n const listTopRelative = listRect.top - scrollRect.top;\n setEffectiveScrollTop(Math.max(0, -listTopRelative));\n setViewportHeight(scrollRect.height);\n const restoring = pendingScroll.current;\n const top = restoring\n ? restoring - (scrollEl.scrollTop + listTopRelative)\n : -listTopRelative;\n setReportedScrollTop(Math.max(0, top));\n // Only the part of the screen the rows are in: not the header above.\n setReportedHeight(Math.max(0, scrollRect.height + Math.min(0, top)));\n\n const { paginationEnabled: pe, noMoreToLoad: nm, itemCount: ic, pageSize: ps } = paginationStateRef.current;\n if (\n pe &&\n !nm &&\n !isLoadingMore.current &&\n scrollEl.scrollHeight - scrollEl.scrollTop - scrollEl.clientHeight < LOAD_MORE_THRESHOLD\n ) {\n isLoadingMore.current = true;\n setItemCount?.((ic ?? ps) + ps);\n }\n };\n\n const onScrollEvent = () => {\n if (rafId === null) rafId = requestAnimationFrame(update);\n };\n\n scrollEl.addEventListener(\"scroll\", onScrollEvent, { passive: true });\n const ro = new ResizeObserver(() => update());\n ro.observe(scrollEl);\n update();\n\n return () => {\n scrollEl.removeEventListener(\"scroll\", onScrollEvent);\n ro.disconnect();\n if (rafId !== null) cancelAnimationFrame(rafId);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- `pendingScroll` is the ref object `useScrollParentRestoration` returns, the same one for the component's life; `update` reads `.current` when it runs.\n }, [setItemCount]);\n\n const { pendingScroll } = useScrollParentRestoration({ containerRef, initialScroll, onScroll, dataLength: data.length });\n\n const visibleStart = Math.min(data.length, Math.floor(reportedScrollTop / estimatedRowHeight));\n const visibleEnd = Math.min(data.length, Math.ceil((reportedScrollTop + reportedHeight) / estimatedRowHeight));\n useEffect(() => {\n if (onRowsRendered && data.length > 0) onRowsRendered({ start: visibleStart, end: visibleEnd });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [visibleStart, visibleEnd, onRowsRendered]);\n\n const totalHeight = data.length * estimatedRowHeight;\n const startIndex = Math.max(0, Math.floor(effectiveScrollTop / estimatedRowHeight) - OVERSCAN_COUNT);\n const endIndex = Math.min(\n data.length,\n Math.ceil((effectiveScrollTop + viewportHeight) / estimatedRowHeight) + OVERSCAN_COUNT\n );\n const visibleData = data.slice(startIndex, endIndex);\n const offsetY = startIndex * estimatedRowHeight;\n\n const footerHeight = dataLoading ? 48 : (!dataLoading && noMoreToLoad && data.length > 0) ? 32 : 0;\n\n const isInitialLoading = dataLoading && data.length === 0;\n const isEmpty = !dataLoading && data.length === 0 && !dataLoadingError;\n\n const getItemId = useCallback((item: T | undefined): string | number => {\n if (item && typeof item === \"object\" && \"id\" in item) {\n const id = (item as Record<\"id\", unknown>).id;\n return typeof id === \"number\" ? id : String(id);\n }\n return String(item);\n }, []);\n\n const borderMixinClass = \"border-hairline\";\n\n return (\n <div\n ref={containerRef}\n className={cls(\n \"w-full\",\n selectedEntityId === undefined && `rounded-lg overflow-hidden border ${borderMixinClass}`\n )}\n >\n {dataLoadingError && data.length === 0 ? (\n <div className=\"flex items-center justify-center p-8\">\n <Typography className=\"text-red-500\">\n {labels.errorLoadingData(dataLoadingError.message)}\n </Typography>\n </div>\n ) : isInitialLoading ? (\n <div className=\"flex items-center justify-center py-12 px-8\">\n <CircularProgress size=\"small\" />\n </div>\n ) : isEmpty ? (\n <div className=\"w-full flex items-center justify-center py-12 px-8\">\n {emptyComponent ?? (\n <Typography variant=\"label\" color=\"secondary\">\n {labels.noEntriesFound}\n </Typography>\n )}\n </div>\n ) : (\n <>\n {header}\n {/* `my-1.5`, not padding: the rows are absolutely positioned\n inside this box, and `top: 0` lands on the padding edge,\n so padding would not move them. A margin does, and it is\n what keeps the first row's rounded highlight from sitting\n on the header's rule (and the last from touching the\n bottom edge). */}\n <div ref={rowsRef} className=\"my-1.5\" style={{ height: totalHeight + footerHeight, position: \"relative\" }}>\n <div style={{ position: \"absolute\", top: offsetY, left: 0, right: 0 }}>\n {visibleData.map((item, i) => {\n const actualIndex = startIndex + i;\n if (item === undefined) {\n return <UnreadRow key={`__unread_${actualIndex}`} height={estimatedRowHeight}/>;\n }\n const isLast = actualIndex === data.length - 1;\n const id = getItemId(item);\n const selected = selectedIds?.has(id) ?? false;\n const highlighted = highlightedIds?.has(id) ?? false;\n\n const handleClick = (e: React.MouseEvent) => {\n if ((e.metaKey || e.ctrlKey) && selectionEnabled) {\n e.preventDefault();\n onSelectionChange?.(item, !selected);\n return;\n }\n onItemClick?.(item);\n };\n\n const handleSelectionChange = (val: boolean) => {\n onSelectionChange?.(item, val);\n };\n\n return (\n <React.Fragment key={id || actualIndex}>\n {renderRow({\n item,\n index: actualIndex,\n style: { height: estimatedRowHeight, overflow: \"hidden\" },\n // No divider between rows. Rows are inset, rounded\n // highlights now (see the CMS list binding), and a\n // hairline under each one turned every highlight into\n // a pill floating on a ruled page. `py-0.5` inside the\n // fixed-height slot gives two adjacent highlights 4px\n // of air instead of a shared edge.\n className: \"py-0.5\",\n selected,\n highlighted,\n isLast,\n onClick: handleClick,\n onSelectionChange: handleSelectionChange\n })}\n </React.Fragment>\n );\n })}\n </div>\n\n {dataLoading && (\n <div\n className=\"flex items-center justify-center py-3\"\n style={{ position: \"absolute\", top: totalHeight, left: 0, right: 0 }}\n >\n <CircularProgress size=\"small\" />\n </div>\n )}\n {!dataLoading && noMoreToLoad && data.length > 0 && (\n <div\n className=\"flex items-center justify-center py-2\"\n style={{ position: \"absolute\", top: totalHeight, left: 0, right: 0 }}\n >\n <Typography variant=\"caption\" color=\"secondary\">\n {labels.allEntriesLoaded(data.length)}\n </Typography>\n </div>\n )}\n </div>\n </>\n )}\n </div>\n );\n}\n\n/** A row that exists but has not been read yet. */\nfunction UnreadRow({ height }: { height: number }) {\n return (\n <div className=\"py-0.5 flex items-center gap-3 px-4\" style={{ height, overflow: \"hidden\" }} aria-busy={true}>\n <Skeleton width={32} height={32}/>\n <div className=\"flex flex-col gap-1.5 grow\">\n <Skeleton width={160} height={12}/>\n <Skeleton width={96} height={10}/>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -23,4 +23,11 @@ export declare function useScrollParentRestoration({ containerRef, initialScroll
23
23
  initialScroll?: number;
24
24
  onScroll?: (props: ViewScrollEvent) => void;
25
25
  dataLength: number;
26
- }): void;
26
+ }): {
27
+ /**
28
+ * The scroll parent's offset this view is on its way back to, until it has
29
+ * been put there. The rows at the top are drawn first, and are not the
30
+ * ones the view is about to show.
31
+ */
32
+ pendingScroll: React.RefObject<number | undefined>;
33
+ };
@@ -0,0 +1,75 @@
1
+ import { useEffect, useRef } from "react";
2
+ //#region src/views/useScrollParentRestoration.ts
3
+ /**
4
+ * The nearest ancestor that scrolls vertically. The list and card views do not
5
+ * scroll themselves: the page around them does, so that is the element whose
6
+ * offset is worth keeping.
7
+ */
8
+ function getScrollParent(element) {
9
+ if (!element) return null;
10
+ let parent = element.parentElement;
11
+ while (parent) {
12
+ const overflowY = window.getComputedStyle(parent).overflowY;
13
+ if (overflowY === "auto" || overflowY === "scroll") return parent;
14
+ parent = parent.parentElement;
15
+ }
16
+ return document.documentElement;
17
+ }
18
+ /**
19
+ * Report the scroll parent's offset through `onScroll`, and put it back at
20
+ * `initialScroll` once there are rows to scroll over.
21
+ *
22
+ * Opening a record full screen unmounts the collection view, so coming back
23
+ * mounts a fresh one. The caller keeps the offset (and the rows it was over)
24
+ * outside the component; this is what hands it over and applies it again.
25
+ */
26
+ function useScrollParentRestoration({ containerRef, initialScroll, onScroll, dataLength }) {
27
+ const restoreTo = useRef(initialScroll);
28
+ useEffect(() => {
29
+ const target = restoreTo.current;
30
+ if (!containerRef.current || !target || dataLength === 0) return;
31
+ const scrollEl = getScrollParent(containerRef.current);
32
+ if (!scrollEl) return;
33
+ let attempts = 0;
34
+ const maxAttempts = 5;
35
+ let rafId = null;
36
+ const tryRestore = () => {
37
+ rafId = null;
38
+ if (scrollEl.scrollHeight >= target || attempts >= maxAttempts) {
39
+ scrollEl.scrollTop = target;
40
+ restoreTo.current = void 0;
41
+ } else {
42
+ attempts++;
43
+ rafId = requestAnimationFrame(tryRestore);
44
+ }
45
+ };
46
+ rafId = requestAnimationFrame(tryRestore);
47
+ return () => {
48
+ if (rafId !== null) cancelAnimationFrame(rafId);
49
+ };
50
+ }, [containerRef, dataLength]);
51
+ const lastScrollOffset = useRef(0);
52
+ useEffect(() => {
53
+ const el = containerRef.current;
54
+ if (!el || !onScroll) return;
55
+ const scrollEl = getScrollParent(el);
56
+ if (!scrollEl) return;
57
+ const handleScroll = () => {
58
+ const currentOffset = scrollEl.scrollTop;
59
+ const direction = currentOffset > lastScrollOffset.current ? "forward" : "backward";
60
+ lastScrollOffset.current = currentOffset;
61
+ onScroll({
62
+ scrollDirection: direction,
63
+ scrollOffset: currentOffset,
64
+ scrollUpdateWasRequested: false
65
+ });
66
+ };
67
+ scrollEl.addEventListener("scroll", handleScroll, { passive: true });
68
+ return () => scrollEl.removeEventListener("scroll", handleScroll);
69
+ }, [containerRef, onScroll]);
70
+ return { pendingScroll: restoreTo };
71
+ }
72
+ //#endregion
73
+ export { getScrollParent, useScrollParentRestoration };
74
+
75
+ //# sourceMappingURL=useScrollParentRestoration.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScrollParentRestoration.es.js","names":[],"sources":["../../src/views/useScrollParentRestoration.ts"],"sourcesContent":["import React, { useEffect, useRef } from \"react\";\n\nexport type ViewScrollEvent = {\n scrollDirection: \"forward\" | \"backward\";\n scrollOffset: number;\n scrollUpdateWasRequested: boolean;\n};\n\n/**\n * The nearest ancestor that scrolls vertically. The list and card views do not\n * scroll themselves: the page around them does, so that is the element whose\n * offset is worth keeping.\n */\nexport function getScrollParent(element: HTMLElement | null): HTMLElement | null {\n if (!element) return null;\n let parent = element.parentElement;\n while (parent) {\n const overflowY = window.getComputedStyle(parent).overflowY;\n if (overflowY === \"auto\" || overflowY === \"scroll\") {\n return parent;\n }\n parent = parent.parentElement;\n }\n return document.documentElement;\n}\n\n/**\n * Report the scroll parent's offset through `onScroll`, and put it back at\n * `initialScroll` once there are rows to scroll over.\n *\n * Opening a record full screen unmounts the collection view, so coming back\n * mounts a fresh one. The caller keeps the offset (and the rows it was over)\n * outside the component; this is what hands it over and applies it again.\n */\nexport function useScrollParentRestoration({\n containerRef,\n initialScroll,\n onScroll,\n dataLength\n}: {\n containerRef: React.RefObject<HTMLElement | null>;\n initialScroll?: number;\n onScroll?: (props: ViewScrollEvent) => void;\n dataLength: number;\n}): {\n /**\n * The scroll parent's offset this view is on its way back to, until it has\n * been put there. The rows at the top are drawn first, and are not the\n * ones the view is about to show.\n */\n pendingScroll: React.RefObject<number | undefined>;\n} {\n // The offset this mount started with, and only that one. `initialScroll`\n // goes on changing after mount — callers read it back from the store\n // `onScroll` writes — so following the prop would scroll the view to where\n // it was a moment ago, under a user who is scrolling it.\n const restoreTo = useRef(initialScroll);\n\n useEffect(() => {\n const target = restoreTo.current;\n if (!containerRef.current || !target || dataLength === 0) return;\n\n const scrollEl = getScrollParent(containerRef.current);\n if (!scrollEl) return;\n\n let attempts = 0;\n const maxAttempts = 5;\n let rafId: number | null = null;\n\n const tryRestore = () => {\n rafId = null;\n if (scrollEl.scrollHeight >= target || attempts >= maxAttempts) {\n scrollEl.scrollTop = target;\n restoreTo.current = undefined;\n } else {\n attempts++;\n rafId = requestAnimationFrame(tryRestore);\n }\n };\n\n rafId = requestAnimationFrame(tryRestore);\n return () => {\n if (rafId !== null) cancelAnimationFrame(rafId);\n };\n }, [containerRef, dataLength]);\n\n const lastScrollOffset = useRef(0);\n useEffect(() => {\n const el = containerRef.current;\n if (!el || !onScroll) return;\n const scrollEl = getScrollParent(el);\n if (!scrollEl) return;\n\n const handleScroll = () => {\n const currentOffset = scrollEl.scrollTop;\n const direction = currentOffset > lastScrollOffset.current ? \"forward\" : \"backward\";\n lastScrollOffset.current = currentOffset;\n onScroll({\n scrollDirection: direction,\n scrollOffset: currentOffset,\n scrollUpdateWasRequested: false\n });\n };\n\n scrollEl.addEventListener(\"scroll\", handleScroll, { passive: true });\n return () => scrollEl.removeEventListener(\"scroll\", handleScroll);\n }, [containerRef, onScroll]);\n\n return { pendingScroll: restoreTo };\n}\n"],"mappings":";;;;;;;AAaA,SAAgB,gBAAgB,SAAiD;CAC7E,IAAI,CAAC,SAAS,OAAO;CACrB,IAAI,SAAS,QAAQ;CACrB,OAAO,QAAQ;EACX,MAAM,YAAY,OAAO,iBAAiB,MAAM,CAAC,CAAC;EAClD,IAAI,cAAc,UAAU,cAAc,UACtC,OAAO;EAEX,SAAS,OAAO;CACpB;CACA,OAAO,SAAS;AACpB;;;;;;;;;AAUA,SAAgB,2BAA2B,EACvC,cACA,eACA,UACA,cAaF;CAKE,MAAM,YAAY,OAAO,aAAa;CAEtC,gBAAgB;EACZ,MAAM,SAAS,UAAU;EACzB,IAAI,CAAC,aAAa,WAAW,CAAC,UAAU,eAAe,GAAG;EAE1D,MAAM,WAAW,gBAAgB,aAAa,OAAO;EACrD,IAAI,CAAC,UAAU;EAEf,IAAI,WAAW;EACf,MAAM,cAAc;EACpB,IAAI,QAAuB;EAE3B,MAAM,mBAAmB;GACrB,QAAQ;GACR,IAAI,SAAS,gBAAgB,UAAU,YAAY,aAAa;IAC5D,SAAS,YAAY;IACrB,UAAU,UAAU,KAAA;GACxB,OAAO;IACH;IACA,QAAQ,sBAAsB,UAAU;GAC5C;EACJ;EAEA,QAAQ,sBAAsB,UAAU;EACxC,aAAa;GACT,IAAI,UAAU,MAAM,qBAAqB,KAAK;EAClD;CACJ,GAAG,CAAC,cAAc,UAAU,CAAC;CAE7B,MAAM,mBAAmB,OAAO,CAAC;CACjC,gBAAgB;EACZ,MAAM,KAAK,aAAa;EACxB,IAAI,CAAC,MAAM,CAAC,UAAU;EACtB,MAAM,WAAW,gBAAgB,EAAE;EACnC,IAAI,CAAC,UAAU;EAEf,MAAM,qBAAqB;GACvB,MAAM,gBAAgB,SAAS;GAC/B,MAAM,YAAY,gBAAgB,iBAAiB,UAAU,YAAY;GACzE,iBAAiB,UAAU;GAC3B,SAAS;IACL,iBAAiB;IACjB,cAAc;IACd,0BAA0B;GAC9B,CAAC;EACL;EAEA,SAAS,iBAAiB,UAAU,cAAc,EAAE,SAAS,KAAK,CAAC;EACnE,aAAa,SAAS,oBAAoB,UAAU,YAAY;CACpE,GAAG,CAAC,cAAc,QAAQ,CAAC;CAE3B,OAAO,EAAE,eAAe,UAAU;AACtC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rebasepro/ui",
3
- "version": "0.24.0",
3
+ "version": "0.24.1-canary.gcb918fc",
4
4
  "description": "Rebase design system — React components and design tokens built on Radix UI, Tailwind CSS and lucide-react",
5
5
  "keywords": [
6
6
  "rebase",
@@ -119,7 +119,7 @@
119
119
  },
120
120
  "scripts": {
121
121
  "watch": "vite build --watch",
122
- "build": "rm -rf dist || true && vite build && cp dist/src/index.css dist/src/theme.css dist/ && tsc --emitDeclarationOnly -p tsconfig.prod.json && node ../../tooling/scripts/add-dts-extensions.mjs dist && node ../../tooling/scripts/assert-build-output.mjs",
122
+ "build": "rm -rf dist || true && vite build && cp dist/src/index.css dist/src/theme.css dist/ && tsc --emitDeclarationOnly -p tsconfig.prod.json && node ../../tooling/scripts/add-dts-extensions.mjs dist && node ../../tooling/scripts/assert-build-output.mjs && node ../../tooling/scripts/check-ui-dist-tree-shakes.mjs",
123
123
  "test:lint": "eslint \"src/**\" --quiet",
124
124
  "test": "jest --passWithNoTests",
125
125
  "test:watch": "jest --watch",