@vertesia/ui 0.80.0-dev.20251121 → 0.80.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 (277) hide show
  1. package/README.md +105 -0
  2. package/lib/esm/core/components/MenuList.js +2 -5
  3. package/lib/esm/core/components/MenuList.js.map +1 -1
  4. package/lib/esm/core/components/MessageBox.js +1 -1
  5. package/lib/esm/core/components/MessageBox.js.map +1 -1
  6. package/lib/esm/core/components/shadcn/dialog.js +16 -2
  7. package/lib/esm/core/components/shadcn/dialog.js.map +1 -1
  8. package/lib/esm/core/components/shadcn/filters/filter/SelectFilter.js +6 -9
  9. package/lib/esm/core/components/shadcn/filters/filter/SelectFilter.js.map +1 -1
  10. package/lib/esm/core/components/shadcn/filters/filterBar.js +1 -1
  11. package/lib/esm/core/components/shadcn/filters/filterBar.js.map +1 -1
  12. package/lib/esm/core/components/shadcn/selectBox.js +23 -5
  13. package/lib/esm/core/components/shadcn/selectBox.js.map +1 -1
  14. package/lib/esm/core/components/shadcn/tabs.js +3 -3
  15. package/lib/esm/core/components/shadcn/tabs.js.map +1 -1
  16. package/lib/esm/env/index.js +3 -0
  17. package/lib/esm/env/index.js.map +1 -1
  18. package/lib/esm/features/agent/chat/AgentChart.js +184 -0
  19. package/lib/esm/features/agent/chat/AgentChart.js.map +1 -0
  20. package/lib/esm/features/agent/chat/ModernAgentConversation.js +87 -10
  21. package/lib/esm/features/agent/chat/ModernAgentConversation.js.map +1 -1
  22. package/lib/esm/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js +6 -2
  23. package/lib/esm/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js.map +1 -1
  24. package/lib/esm/features/agent/chat/ModernAgentOutput/Header.js +4 -4
  25. package/lib/esm/features/agent/chat/ModernAgentOutput/Header.js.map +1 -1
  26. package/lib/esm/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.js +4 -1
  27. package/lib/esm/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.js.map +1 -1
  28. package/lib/esm/features/agent/chat/ModernAgentOutput/MessageInput.js +12 -4
  29. package/lib/esm/features/agent/chat/ModernAgentOutput/MessageInput.js.map +1 -1
  30. package/lib/esm/features/agent/chat/ModernAgentOutput/MessageItem.js +60 -56
  31. package/lib/esm/features/agent/chat/ModernAgentOutput/MessageItem.js.map +1 -1
  32. package/lib/esm/features/agent/chat/index.js +1 -0
  33. package/lib/esm/features/agent/chat/index.js.map +1 -1
  34. package/lib/esm/features/agent/createChartTool.js +354 -0
  35. package/lib/esm/features/agent/createChartTool.js.map +1 -0
  36. package/lib/esm/features/agent/examples.js +295 -0
  37. package/lib/esm/features/agent/examples.js.map +1 -0
  38. package/lib/esm/features/agent/index.js +2 -0
  39. package/lib/esm/features/agent/index.js.map +1 -1
  40. package/lib/esm/features/agent/visualization.js +165 -0
  41. package/lib/esm/features/agent/visualization.js.map +1 -0
  42. package/lib/esm/features/facets/CollectionsFacetsNav.js +5 -1
  43. package/lib/esm/features/facets/CollectionsFacetsNav.js.map +1 -1
  44. package/lib/esm/features/index.js +1 -0
  45. package/lib/esm/features/index.js.map +1 -1
  46. package/lib/esm/features/layout/GenericPageNavHeader.js +14 -4
  47. package/lib/esm/features/layout/GenericPageNavHeader.js.map +1 -1
  48. package/lib/esm/features/magic-pdf/AnnotatedImageSlider.js +268 -0
  49. package/lib/esm/features/magic-pdf/AnnotatedImageSlider.js.map +1 -0
  50. package/lib/esm/features/magic-pdf/DownloadPopover.js +11 -11
  51. package/lib/esm/features/magic-pdf/DownloadPopover.js.map +1 -1
  52. package/lib/esm/features/magic-pdf/ExtractedContentView.js +77 -0
  53. package/lib/esm/features/magic-pdf/ExtractedContentView.js.map +1 -0
  54. package/lib/esm/features/magic-pdf/MagicPdfProvider.js +242 -0
  55. package/lib/esm/features/magic-pdf/MagicPdfProvider.js.map +1 -0
  56. package/lib/esm/features/magic-pdf/MagicPdfView.js +41 -47
  57. package/lib/esm/features/magic-pdf/MagicPdfView.js.map +1 -1
  58. package/lib/esm/features/pdf-viewer/PdfPageRenderer.js +261 -0
  59. package/lib/esm/features/pdf-viewer/PdfPageRenderer.js.map +1 -0
  60. package/lib/esm/features/pdf-viewer/PdfPageSlider.js +276 -0
  61. package/lib/esm/features/pdf-viewer/PdfPageSlider.js.map +1 -0
  62. package/lib/esm/features/pdf-viewer/SimplePdfViewer.js +71 -0
  63. package/lib/esm/features/pdf-viewer/SimplePdfViewer.js.map +1 -0
  64. package/lib/esm/features/pdf-viewer/index.js +4 -0
  65. package/lib/esm/features/pdf-viewer/index.js.map +1 -0
  66. package/lib/esm/features/store/collections/EditCollectionView.js +3 -5
  67. package/lib/esm/features/store/collections/EditCollectionView.js.map +1 -1
  68. package/lib/esm/features/store/collections/SharedPropsEditor.js +1 -2
  69. package/lib/esm/features/store/collections/SharedPropsEditor.js.map +1 -1
  70. package/lib/esm/features/store/objects/DocumentSearchResults.js +0 -7
  71. package/lib/esm/features/store/objects/DocumentSearchResults.js.map +1 -1
  72. package/lib/esm/features/store/objects/components/ContentOverview.js +273 -83
  73. package/lib/esm/features/store/objects/components/ContentOverview.js.map +1 -1
  74. package/lib/esm/features/store/objects/components/useContentPanelHooks.js +153 -0
  75. package/lib/esm/features/store/objects/components/useContentPanelHooks.js.map +1 -0
  76. package/lib/esm/features/store/objects/layout/DocumentTableColumn.js +3 -3
  77. package/lib/esm/features/store/objects/layout/DocumentTableColumn.js.map +1 -1
  78. package/lib/esm/features/store/objects/layout/renderers.js +13 -0
  79. package/lib/esm/features/store/objects/layout/renderers.js.map +1 -1
  80. package/lib/esm/features/utils/index.js +2 -0
  81. package/lib/esm/features/utils/index.js.map +1 -1
  82. package/lib/esm/features/utils/mimeType.js +8 -0
  83. package/lib/esm/features/utils/mimeType.js.map +1 -1
  84. package/lib/esm/features/utils/print.js +181 -0
  85. package/lib/esm/features/utils/print.js.map +1 -0
  86. package/lib/esm/features/utils/workflowStatus.js +43 -0
  87. package/lib/esm/features/utils/workflowStatus.js.map +1 -0
  88. package/lib/esm/router/HistoryNavigator.js +22 -2
  89. package/lib/esm/router/HistoryNavigator.js.map +1 -1
  90. package/lib/esm/shell/login/UserInfo.js +2 -1
  91. package/lib/esm/shell/login/UserInfo.js.map +1 -1
  92. package/lib/esm/shell/login/UserSessionMenu.js +7 -1
  93. package/lib/esm/shell/login/UserSessionMenu.js.map +1 -1
  94. package/lib/esm/widgets/form/Form.js +6 -2
  95. package/lib/esm/widgets/form/Form.js.map +1 -1
  96. package/lib/esm/widgets/markdown/MarkdownRenderer.js +226 -4
  97. package/lib/esm/widgets/markdown/MarkdownRenderer.js.map +1 -1
  98. package/lib/esm/widgets/schema-editor/ManagedSchema.js +0 -3
  99. package/lib/esm/widgets/schema-editor/ManagedSchema.js.map +1 -1
  100. package/lib/esm/widgets/schema-editor/json-schema4-utils.js +1 -1
  101. package/lib/esm/widgets/schema-editor/json-schema4-utils.js.map +1 -1
  102. package/lib/esm/widgets/xml-viewer/components/XMLViewer.js +18 -9
  103. package/lib/esm/widgets/xml-viewer/components/XMLViewer.js.map +1 -1
  104. package/lib/esm/widgets/xml-viewer/constants/index.js +10 -0
  105. package/lib/esm/widgets/xml-viewer/constants/index.js.map +1 -1
  106. package/lib/tsconfig.tsbuildinfo +1 -1
  107. package/lib/types/core/components/MessageBox.d.ts.map +1 -1
  108. package/lib/types/core/components/shadcn/dialog.d.ts +2 -1
  109. package/lib/types/core/components/shadcn/dialog.d.ts.map +1 -1
  110. package/lib/types/core/components/shadcn/filters/filterBar.d.ts.map +1 -1
  111. package/lib/types/core/components/shadcn/selectBox.d.ts +5 -1
  112. package/lib/types/core/components/shadcn/selectBox.d.ts.map +1 -1
  113. package/lib/types/core/components/shadcn/tabs.d.ts +3 -1
  114. package/lib/types/core/components/shadcn/tabs.d.ts.map +1 -1
  115. package/lib/types/env/index.d.ts +2 -0
  116. package/lib/types/env/index.d.ts.map +1 -1
  117. package/lib/types/features/agent/chat/AgentChart.d.ts +48 -0
  118. package/lib/types/features/agent/chat/AgentChart.d.ts.map +1 -0
  119. package/lib/types/features/agent/chat/ModernAgentConversation.d.ts.map +1 -1
  120. package/lib/types/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts +3 -2
  121. package/lib/types/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts.map +1 -1
  122. package/lib/types/features/agent/chat/ModernAgentOutput/Header.d.ts +2 -1
  123. package/lib/types/features/agent/chat/ModernAgentOutput/Header.d.ts.map +1 -1
  124. package/lib/types/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.d.ts +4 -2
  125. package/lib/types/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.d.ts.map +1 -1
  126. package/lib/types/features/agent/chat/ModernAgentOutput/MessageInput.d.ts +2 -4
  127. package/lib/types/features/agent/chat/ModernAgentOutput/MessageInput.d.ts.map +1 -1
  128. package/lib/types/features/agent/chat/ModernAgentOutput/MessageItem.d.ts.map +1 -1
  129. package/lib/types/features/agent/chat/index.d.ts +1 -0
  130. package/lib/types/features/agent/chat/index.d.ts.map +1 -1
  131. package/lib/types/features/agent/createChartTool.d.ts +178 -0
  132. package/lib/types/features/agent/createChartTool.d.ts.map +1 -0
  133. package/lib/types/features/agent/examples.d.ts +59 -0
  134. package/lib/types/features/agent/examples.d.ts.map +1 -0
  135. package/lib/types/features/agent/index.d.ts +2 -0
  136. package/lib/types/features/agent/index.d.ts.map +1 -1
  137. package/lib/types/features/agent/visualization.d.ts +95 -0
  138. package/lib/types/features/agent/visualization.d.ts.map +1 -0
  139. package/lib/types/features/facets/CollectionsFacetsNav.d.ts.map +1 -1
  140. package/lib/types/features/index.d.ts +1 -0
  141. package/lib/types/features/index.d.ts.map +1 -1
  142. package/lib/types/features/layout/GenericPageNavHeader.d.ts.map +1 -1
  143. package/lib/types/features/magic-pdf/AnnotatedImageSlider.d.ts +13 -0
  144. package/lib/types/features/magic-pdf/AnnotatedImageSlider.d.ts.map +1 -0
  145. package/lib/types/features/magic-pdf/DownloadPopover.d.ts.map +1 -1
  146. package/lib/types/features/magic-pdf/ExtractedContentView.d.ts +8 -0
  147. package/lib/types/features/magic-pdf/ExtractedContentView.d.ts.map +1 -0
  148. package/lib/types/features/magic-pdf/MagicPdfProvider.d.ts +58 -0
  149. package/lib/types/features/magic-pdf/MagicPdfProvider.d.ts.map +1 -0
  150. package/lib/types/features/magic-pdf/MagicPdfView.d.ts +1 -1
  151. package/lib/types/features/magic-pdf/MagicPdfView.d.ts.map +1 -1
  152. package/lib/types/features/pdf-viewer/PdfPageRenderer.d.ts +83 -0
  153. package/lib/types/features/pdf-viewer/PdfPageRenderer.d.ts.map +1 -0
  154. package/lib/types/features/pdf-viewer/PdfPageSlider.d.ts +29 -0
  155. package/lib/types/features/pdf-viewer/PdfPageSlider.d.ts.map +1 -0
  156. package/lib/types/features/pdf-viewer/SimplePdfViewer.d.ts +19 -0
  157. package/lib/types/features/pdf-viewer/SimplePdfViewer.d.ts.map +1 -0
  158. package/lib/types/features/pdf-viewer/index.d.ts +4 -0
  159. package/lib/types/features/pdf-viewer/index.d.ts.map +1 -0
  160. package/lib/types/features/store/collections/EditCollectionView.d.ts.map +1 -1
  161. package/lib/types/features/store/collections/SharedPropsEditor.d.ts.map +1 -1
  162. package/lib/types/features/store/objects/DocumentSearchResults.d.ts.map +1 -1
  163. package/lib/types/features/store/objects/components/ContentOverview.d.ts.map +1 -1
  164. package/lib/types/features/store/objects/components/useContentPanelHooks.d.ts +30 -0
  165. package/lib/types/features/store/objects/components/useContentPanelHooks.d.ts.map +1 -0
  166. package/lib/types/features/store/objects/layout/renderers.d.ts.map +1 -1
  167. package/lib/types/features/utils/index.d.ts +2 -0
  168. package/lib/types/features/utils/index.d.ts.map +1 -1
  169. package/lib/types/features/utils/mimeType.d.ts +1 -0
  170. package/lib/types/features/utils/mimeType.d.ts.map +1 -1
  171. package/lib/types/features/utils/print.d.ts +10 -0
  172. package/lib/types/features/utils/print.d.ts.map +1 -0
  173. package/lib/types/features/utils/workflowStatus.d.ts +10 -0
  174. package/lib/types/features/utils/workflowStatus.d.ts.map +1 -0
  175. package/lib/types/router/HistoryNavigator.d.ts +3 -0
  176. package/lib/types/router/HistoryNavigator.d.ts.map +1 -1
  177. package/lib/types/shell/login/UserInfo.d.ts.map +1 -1
  178. package/lib/types/shell/login/UserSessionMenu.d.ts.map +1 -1
  179. package/lib/types/widgets/form/Form.d.ts.map +1 -1
  180. package/lib/types/widgets/markdown/MarkdownRenderer.d.ts +5 -1
  181. package/lib/types/widgets/markdown/MarkdownRenderer.d.ts.map +1 -1
  182. package/lib/types/widgets/schema-editor/ManagedSchema.d.ts.map +1 -1
  183. package/lib/types/widgets/xml-viewer/components/XMLViewer.d.ts.map +1 -1
  184. package/lib/types/widgets/xml-viewer/constants/index.d.ts +10 -0
  185. package/lib/types/widgets/xml-viewer/constants/index.d.ts.map +1 -1
  186. package/lib/vertesia-ui-core.js +1 -1
  187. package/lib/vertesia-ui-core.js.map +1 -1
  188. package/lib/vertesia-ui-env.js +1 -1
  189. package/lib/vertesia-ui-env.js.map +1 -1
  190. package/lib/vertesia-ui-features.js +1 -1
  191. package/lib/vertesia-ui-features.js.map +1 -1
  192. package/lib/vertesia-ui-layout.js +1 -1
  193. package/lib/vertesia-ui-layout.js.map +1 -1
  194. package/lib/vertesia-ui-router.js +1 -1
  195. package/lib/vertesia-ui-router.js.map +1 -1
  196. package/lib/vertesia-ui-session.js +1 -1
  197. package/lib/vertesia-ui-session.js.map +1 -1
  198. package/lib/vertesia-ui-shell.js +1 -1
  199. package/lib/vertesia-ui-shell.js.map +1 -1
  200. package/lib/vertesia-ui-widgets.js +1 -1
  201. package/lib/vertesia-ui-widgets.js.map +1 -1
  202. package/package.json +11 -8
  203. package/src/core/components/MenuList.tsx +3 -6
  204. package/src/core/components/MessageBox.tsx +7 -2
  205. package/src/core/components/SelectBox.tsx +1 -1
  206. package/src/core/components/shadcn/dialog.tsx +19 -1
  207. package/src/core/components/shadcn/filters/filter/SelectFilter.tsx +31 -31
  208. package/src/core/components/shadcn/filters/filterBar.tsx +1 -0
  209. package/src/core/components/shadcn/selectBox.tsx +32 -6
  210. package/src/core/components/shadcn/tabs.tsx +3 -2
  211. package/src/env/index.ts +5 -0
  212. package/src/features/agent/CHART_INSTRUCTIONS.md +228 -0
  213. package/src/features/agent/chat/AgentChart.tsx +601 -0
  214. package/src/features/agent/chat/ModernAgentConversation.tsx +123 -11
  215. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.tsx +8 -2
  216. package/src/features/agent/chat/ModernAgentOutput/Header.tsx +12 -2
  217. package/src/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.tsx +6 -1
  218. package/src/features/agent/chat/ModernAgentOutput/MessageInput.tsx +15 -10
  219. package/src/features/agent/chat/ModernAgentOutput/MessageItem.tsx +122 -87
  220. package/src/features/agent/chat/index.ts +1 -0
  221. package/src/features/agent/createChartTool.ts +364 -0
  222. package/src/features/agent/examples.ts +321 -0
  223. package/src/features/agent/index.ts +2 -0
  224. package/src/features/agent/visualization.ts +227 -0
  225. package/src/features/facets/CollectionsFacetsNav.tsx +5 -1
  226. package/src/features/index.ts +1 -0
  227. package/src/features/layout/GenericPageNavHeader.tsx +15 -4
  228. package/src/features/magic-pdf/AnnotatedImageSlider.tsx +482 -0
  229. package/src/features/magic-pdf/DownloadPopover.tsx +45 -40
  230. package/src/features/magic-pdf/ExtractedContentView.tsx +132 -0
  231. package/src/features/magic-pdf/MagicPdfProvider.tsx +297 -0
  232. package/src/features/magic-pdf/MagicPdfView.tsx +184 -91
  233. package/src/features/pdf-viewer/PdfPageRenderer.tsx +612 -0
  234. package/src/features/pdf-viewer/PdfPageSlider.tsx +473 -0
  235. package/src/features/pdf-viewer/SimplePdfViewer.tsx +142 -0
  236. package/src/features/pdf-viewer/index.ts +3 -0
  237. package/src/features/store/collections/EditCollectionView.tsx +3 -5
  238. package/src/features/store/collections/SharedPropsEditor.tsx +1 -2
  239. package/src/features/store/objects/DocumentSearchResults.tsx +0 -7
  240. package/src/features/store/objects/components/ContentOverview.tsx +677 -210
  241. package/src/features/store/objects/components/useContentPanelHooks.ts +169 -0
  242. package/src/features/store/objects/layout/DocumentTableColumn.tsx +3 -3
  243. package/src/features/store/objects/layout/knowledge.md +1 -0
  244. package/src/features/store/objects/layout/renderers.tsx +25 -0
  245. package/src/features/utils/index.ts +3 -1
  246. package/src/features/utils/mimeType.ts +10 -1
  247. package/src/features/utils/print.ts +189 -0
  248. package/src/features/utils/workflowStatus.ts +44 -0
  249. package/src/router/HistoryNavigator.ts +30 -2
  250. package/src/shell/login/UserInfo.tsx +2 -0
  251. package/src/shell/login/UserSessionMenu.tsx +12 -1
  252. package/src/widgets/form/Form.tsx +8 -3
  253. package/src/widgets/markdown/MarkdownRenderer.tsx +350 -6
  254. package/src/widgets/schema-editor/ManagedSchema.ts +0 -3
  255. package/src/widgets/schema-editor/json-schema4-utils.ts +1 -1
  256. package/src/widgets/xml-viewer/components/XMLViewer.tsx +22 -10
  257. package/src/widgets/xml-viewer/constants/index.ts +11 -0
  258. package/lib/esm/features/magic-pdf/PageSlider.js +0 -70
  259. package/lib/esm/features/magic-pdf/PageSlider.js.map +0 -1
  260. package/lib/esm/features/magic-pdf/PdfPageProvider.js +0 -188
  261. package/lib/esm/features/magic-pdf/PdfPageProvider.js.map +0 -1
  262. package/lib/esm/features/magic-pdf/TextPageView.js +0 -62
  263. package/lib/esm/features/magic-pdf/TextPageView.js.map +0 -1
  264. package/lib/esm/features/magic-pdf/useResizeOnDrag.js +0 -34
  265. package/lib/esm/features/magic-pdf/useResizeOnDrag.js.map +0 -1
  266. package/lib/types/features/magic-pdf/PageSlider.d.ts +0 -9
  267. package/lib/types/features/magic-pdf/PageSlider.d.ts.map +0 -1
  268. package/lib/types/features/magic-pdf/PdfPageProvider.d.ts +0 -39
  269. package/lib/types/features/magic-pdf/PdfPageProvider.d.ts.map +0 -1
  270. package/lib/types/features/magic-pdf/TextPageView.d.ts +0 -8
  271. package/lib/types/features/magic-pdf/TextPageView.d.ts.map +0 -1
  272. package/lib/types/features/magic-pdf/useResizeOnDrag.d.ts +0 -9
  273. package/lib/types/features/magic-pdf/useResizeOnDrag.d.ts.map +0 -1
  274. package/src/features/magic-pdf/PageSlider.tsx +0 -142
  275. package/src/features/magic-pdf/PdfPageProvider.tsx +0 -310
  276. package/src/features/magic-pdf/TextPageView.tsx +0 -91
  277. package/src/features/magic-pdf/useResizeOnDrag.ts +0 -42
@@ -0,0 +1,261 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState, useEffect, useRef, createContext, useContext, useCallback } from 'react';
3
+ import { Document, Page, pdfjs } from 'react-pdf';
4
+ import { Loader2 } from 'lucide-react';
5
+ // Configure PDF.js worker - use CDN for the worker
6
+ pdfjs.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.mjs`;
7
+ // Loading spinner component
8
+ function LoadingSpinner({ className, size = 'md' }) {
9
+ const sizeClasses = {
10
+ sm: 'w-4 h-4',
11
+ md: 'w-6 h-6',
12
+ lg: 'w-8 h-8'
13
+ };
14
+ return (_jsx("div", { className: `flex items-center justify-center ${className || ''}`, children: _jsx(Loader2, { className: `${sizeClasses[size]} animate-spin text-muted-foreground` }) }));
15
+ }
16
+ export function PdfPageRenderer({ pdfUrl, pageNumber, width, className, renderTextLayer = false, renderAnnotationLayer = false, onLoadSuccess, onError }) {
17
+ const [loading, setLoading] = useState(true);
18
+ const [error, setError] = useState(null);
19
+ const handleLoadSuccess = ({ numPages }) => {
20
+ setLoading(false);
21
+ onLoadSuccess?.(numPages);
22
+ };
23
+ const handleError = (err) => {
24
+ setLoading(false);
25
+ setError(err);
26
+ onError?.(err);
27
+ };
28
+ if (error) {
29
+ return (_jsx("div", { className: `flex items-center justify-center text-destructive text-sm ${className || ''}`, children: "Failed to load PDF" }));
30
+ }
31
+ return (_jsxs("div", { className: className, children: [loading && (_jsx(LoadingSpinner, { className: "py-4", size: "md" })), _jsx(Document, { file: pdfUrl, onLoadSuccess: handleLoadSuccess, onLoadError: handleError, loading: null, children: _jsx(Page, { pageNumber: pageNumber, width: width, renderTextLayer: renderTextLayer, renderAnnotationLayer: renderAnnotationLayer, loading: _jsx(LoadingSpinner, { className: "py-4", size: "sm" }) }) })] }));
32
+ }
33
+ const SharedPdfContext = createContext(null);
34
+ /**
35
+ * Provider that loads a PDF once using a single Document component.
36
+ * Children receive a renderPage function to render pages inside the Document.
37
+ */
38
+ export function SharedPdfProvider({ pdfUrl, urlLoading = false, children, onLoadSuccess }) {
39
+ const [numPages, setNumPages] = useState(0);
40
+ const [loading, setLoading] = useState(true);
41
+ const [error, setError] = useState(null);
42
+ const [pageDimensions, setPageDimensions] = useState(null);
43
+ const handleLoadSuccess = async (pdf) => {
44
+ setNumPages(pdf.numPages);
45
+ onLoadSuccess?.(pdf.numPages);
46
+ try {
47
+ const page = await pdf.getPage(1);
48
+ const viewport = page.getViewport({ scale: 1 });
49
+ setPageDimensions({
50
+ width: viewport.width,
51
+ height: viewport.height,
52
+ aspectRatio: viewport.width / viewport.height
53
+ });
54
+ }
55
+ catch (err) {
56
+ console.error('Failed to get page dimensions:', err);
57
+ }
58
+ setLoading(false);
59
+ };
60
+ const handleError = (err) => {
61
+ setLoading(false);
62
+ setError(err);
63
+ };
64
+ const isLoading = urlLoading || (pdfUrl ? loading : true);
65
+ const value = {
66
+ pdfUrl,
67
+ numPages,
68
+ loading: isLoading,
69
+ error,
70
+ pageDimensions
71
+ };
72
+ // Render function that children use to render pages
73
+ const renderPage = (pageNumber, width) => (_jsx(Page, { pageNumber: pageNumber, width: width, renderTextLayer: false, renderAnnotationLayer: false, loading: _jsx(LoadingSpinner, { className: "py-4", size: "sm" }) }, pageNumber));
74
+ if (error) {
75
+ return (_jsx("div", { className: "flex items-center justify-center text-destructive text-sm py-4", children: "Failed to load PDF" }));
76
+ }
77
+ return (_jsx(SharedPdfContext.Provider, { value: value, children: pdfUrl ? (_jsx(Document, { file: pdfUrl, onLoadSuccess: handleLoadSuccess, onLoadError: handleError, loading: _jsx(LoadingSpinner, { className: "py-4", size: "md" }), children: children(renderPage) })) : (_jsx(LoadingSpinner, { className: "py-4", size: "md" })) }));
78
+ }
79
+ export function useSharedPdf() {
80
+ return useContext(SharedPdfContext);
81
+ }
82
+ // A4 portrait aspect ratio
83
+ const A4_ASPECT_RATIO = 210 / 297;
84
+ /**
85
+ * Simple wrapper for a PDF page that adds styling.
86
+ * Must be used inside SharedPdfProvider's children render function.
87
+ */
88
+ export function SimplePdfPage({ pageNumber, width, className }) {
89
+ const context = useSharedPdf();
90
+ const aspectRatio = context?.pageDimensions?.aspectRatio ?? A4_ASPECT_RATIO;
91
+ const placeholderHeight = width ? Math.round(width / aspectRatio) : 200;
92
+ if (context?.loading) {
93
+ return (_jsx("div", { className: `flex items-center justify-center bg-muted ${className || ''}`, style: { height: placeholderHeight, width: width || '100%' }, children: _jsx(LoadingSpinner, { size: "md" }) }));
94
+ }
95
+ return (_jsx("div", { className: className, children: _jsx(Page, { pageNumber: pageNumber, width: width, renderTextLayer: false, renderAnnotationLayer: false, loading: _jsx(LoadingSpinner, { className: "py-4", size: "sm" }) }) }));
96
+ }
97
+ /**
98
+ * Virtualized PDF thumbnail that only renders the Page when visible.
99
+ * Uses IntersectionObserver for efficient visibility detection.
100
+ */
101
+ function VirtualizedThumbnail({ pageNumber, width, isSelected, onSelect, renderThumbnail, aspectRatio = A4_ASPECT_RATIO, rootMargin = '200px 0px' }) {
102
+ const containerRef = useRef(null);
103
+ const [hasBeenVisible, setHasBeenVisible] = useState(false);
104
+ // Set up intersection observer
105
+ useEffect(() => {
106
+ const container = containerRef.current;
107
+ if (!container)
108
+ return;
109
+ const observer = new IntersectionObserver((entries) => {
110
+ const entry = entries[0];
111
+ if (entry?.isIntersecting) {
112
+ setHasBeenVisible(true);
113
+ }
114
+ }, { rootMargin, threshold: 0 });
115
+ observer.observe(container);
116
+ return () => observer.disconnect();
117
+ }, [rootMargin]);
118
+ const placeholderHeight = width ? Math.round(width / aspectRatio) : 200;
119
+ // Only render the actual Page component if visible or has been visible
120
+ // Once rendered, keep it rendered to preserve the canvas
121
+ const shouldRenderPage = hasBeenVisible;
122
+ const pageElement = shouldRenderPage ? (_jsx(Page, { pageNumber: pageNumber, width: width, renderTextLayer: false, renderAnnotationLayer: false, loading: _jsx("div", { className: "flex items-center justify-center bg-muted", style: { height: placeholderHeight }, children: _jsx(LoadingSpinner, { size: "sm" }) }) })) : (_jsx("div", { className: "flex items-center justify-center bg-muted", style: { height: placeholderHeight, width: width || '100%' }, children: _jsx("span", { className: "text-muted-foreground text-xs", children: pageNumber }) }));
123
+ return (_jsx("div", { ref: containerRef, children: renderThumbnail({
124
+ pageNumber,
125
+ isSelected,
126
+ pageElement,
127
+ onSelect
128
+ }) }));
129
+ }
130
+ /**
131
+ * Renders a list of PDF page thumbnails using a single Document.
132
+ * Uses windowed virtualization for better performance with large PDFs.
133
+ * Only renders components for pages within a window around the current scroll position.
134
+ */
135
+ // Helper to find the scrollable ancestor element
136
+ function findScrollableAncestor(element) {
137
+ if (!element)
138
+ return null;
139
+ let current = element.parentElement;
140
+ while (current) {
141
+ const style = window.getComputedStyle(current);
142
+ const overflowY = style.overflowY;
143
+ if (overflowY === 'auto' || overflowY === 'scroll') {
144
+ return current;
145
+ }
146
+ current = current.parentElement;
147
+ }
148
+ return null;
149
+ }
150
+ export function PdfThumbnailList({ pdfUrl, urlLoading = false, pageCount, currentPage, thumbnailWidth, onPageSelect, renderThumbnail, scrollContainerRef, onAspectRatioChange, onItemHeightChange, calculateItemHeight, onPageCountChange }) {
151
+ const [error, setError] = useState(null);
152
+ const [visibleRange, setVisibleRange] = useState({ start: 0, end: Math.min(15, pageCount) });
153
+ // Start with null to indicate we haven't loaded the PDF yet
154
+ const [aspectRatio, setAspectRatio] = useState(null);
155
+ const containerRef = useRef(null);
156
+ const handleError = useCallback((err) => {
157
+ setError(err);
158
+ }, []);
159
+ // Get actual page dimensions and count from PDF on load
160
+ const handleLoadSuccess = useCallback(async (pdf) => {
161
+ // Report actual page count from PDF
162
+ onPageCountChange?.(pdf.numPages);
163
+ try {
164
+ const page = await pdf.getPage(1);
165
+ const viewport = page.getViewport({ scale: 1 });
166
+ const ratio = viewport.width / viewport.height;
167
+ setAspectRatio(ratio);
168
+ onAspectRatioChange?.(ratio);
169
+ }
170
+ catch (err) {
171
+ console.error('Failed to get page dimensions:', err);
172
+ // Fall back to A4 if we can't get dimensions
173
+ setAspectRatio(A4_ASPECT_RATIO);
174
+ onAspectRatioChange?.(A4_ASPECT_RATIO);
175
+ }
176
+ }, [onAspectRatioChange, onPageCountChange]);
177
+ // Use A4 as fallback if aspect ratio not yet determined
178
+ const effectiveAspectRatio = aspectRatio ?? A4_ASPECT_RATIO;
179
+ // Calculate placeholder height using actual aspect ratio from PDF
180
+ const placeholderHeight = thumbnailWidth ? Math.round(thumbnailWidth / effectiveAspectRatio) : 200;
181
+ // Total height per item - use custom calculator if provided, otherwise default formula
182
+ // Default: padding (p-2 = 8px top + 8px bottom) + page number text (~24px) + gap
183
+ const itemHeight = calculateItemHeight
184
+ ? calculateItemHeight(placeholderHeight)
185
+ : placeholderHeight + 16 + 24 + 8;
186
+ // Notify parent of item height changes for scroll calculations
187
+ useEffect(() => {
188
+ if (itemHeight > 0 && aspectRatio !== null) {
189
+ onItemHeightChange?.(itemHeight);
190
+ }
191
+ }, [itemHeight, aspectRatio, onItemHeightChange]);
192
+ // Window size: how many pages to render above and below visible area
193
+ const WINDOW_BUFFER = 5;
194
+ // Track scroll position to update visible range
195
+ useEffect(() => {
196
+ // Find the scroll container - either from prop or by searching ancestors
197
+ const container = scrollContainerRef?.current || findScrollableAncestor(containerRef.current);
198
+ if (!container)
199
+ return;
200
+ const updateVisibleRange = () => {
201
+ const scrollTop = container.scrollTop;
202
+ const viewportHeight = container.clientHeight;
203
+ // Calculate which pages are visible
204
+ const firstVisible = Math.floor(scrollTop / itemHeight);
205
+ const lastVisible = Math.ceil((scrollTop + viewportHeight) / itemHeight);
206
+ // Add buffer around visible range
207
+ const start = Math.max(0, firstVisible - WINDOW_BUFFER);
208
+ const end = Math.min(pageCount, lastVisible + WINDOW_BUFFER);
209
+ setVisibleRange(prev => {
210
+ if (prev.start !== start || prev.end !== end) {
211
+ return { start, end };
212
+ }
213
+ return prev;
214
+ });
215
+ };
216
+ // Initial calculation
217
+ updateVisibleRange();
218
+ // Listen to scroll events
219
+ container.addEventListener('scroll', updateVisibleRange, { passive: true });
220
+ return () => container.removeEventListener('scroll', updateVisibleRange);
221
+ }, [itemHeight, pageCount, scrollContainerRef]);
222
+ if (error) {
223
+ return (_jsx("div", { className: "flex items-center justify-center text-destructive text-sm py-4", children: "Failed to load PDF" }));
224
+ }
225
+ if (urlLoading || !pdfUrl) {
226
+ return _jsx(LoadingSpinner, { className: "py-4", size: "md" });
227
+ }
228
+ // Calculate spacer heights for virtual scrolling
229
+ const topSpacerHeight = visibleRange.start * itemHeight;
230
+ const bottomSpacerHeight = (pageCount - visibleRange.end) * itemHeight;
231
+ // Only render the virtualized list once we have the actual aspect ratio
232
+ // This prevents the total scroll height from changing after initial render
233
+ const hasAspectRatio = aspectRatio !== null;
234
+ return (_jsx("div", { ref: containerRef, children: _jsx(Document, { file: pdfUrl, onLoadSuccess: handleLoadSuccess, onLoadError: handleError, loading: _jsx(LoadingSpinner, { className: "py-4", size: "md" }), children: hasAspectRatio ? (_jsxs(_Fragment, { children: [topSpacerHeight > 0 && (_jsx("div", { style: { height: topSpacerHeight } })), Array.from({ length: visibleRange.end - visibleRange.start }, (_, index) => {
235
+ const pageNumber = visibleRange.start + index + 1;
236
+ return (_jsx("div", { "data-page-index": pageNumber - 1, style: { height: itemHeight, overflow: 'hidden' }, children: _jsx(VirtualizedThumbnail, { pageNumber: pageNumber, width: thumbnailWidth, isSelected: pageNumber === currentPage, onSelect: () => onPageSelect(pageNumber), renderThumbnail: renderThumbnail, aspectRatio: effectiveAspectRatio }) }, pageNumber));
237
+ }), bottomSpacerHeight > 0 && (_jsx("div", { style: { height: bottomSpacerHeight } }))] })) : (_jsx(LoadingSpinner, { className: "py-4", size: "md" })) }) }));
238
+ }
239
+ export function PdfDocumentRenderer({ pdfUrl, pageNumber, width, height, className, renderTextLayer = false, renderAnnotationLayer = false, onPageChange }) {
240
+ const [numPages, setNumPages] = useState(0);
241
+ const [loading, setLoading] = useState(true);
242
+ const [error, setError] = useState(null);
243
+ useEffect(() => {
244
+ if (numPages > 0) {
245
+ onPageChange?.(pageNumber, numPages);
246
+ }
247
+ }, [pageNumber, numPages, onPageChange]);
248
+ const handleLoadSuccess = ({ numPages: pages }) => {
249
+ setNumPages(pages);
250
+ setLoading(false);
251
+ };
252
+ const handleError = (err) => {
253
+ setLoading(false);
254
+ setError(err);
255
+ };
256
+ if (error) {
257
+ return (_jsx("div", { className: `flex items-center justify-center text-destructive ${className || ''}`, children: _jsxs("span", { children: ["Failed to load PDF: ", error.message] }) }));
258
+ }
259
+ return (_jsxs("div", { className: className, children: [loading && (_jsx(LoadingSpinner, { className: "py-8", size: "lg" })), _jsx(Document, { file: pdfUrl, onLoadSuccess: handleLoadSuccess, onLoadError: handleError, loading: null, children: _jsx(Page, { pageNumber: Math.min(pageNumber, numPages || 1), width: width, height: height, renderTextLayer: renderTextLayer, renderAnnotationLayer: renderAnnotationLayer, loading: _jsx(LoadingSpinner, { className: "py-8", size: "md" }) }) })] }));
260
+ }
261
+ //# sourceMappingURL=PdfPageRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PdfPageRenderer.js","sourceRoot":"","sources":["../../../../src/features/pdf-viewer/PdfPageRenderer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAC5F,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,mDAAmD;AACnD,KAAK,CAAC,mBAAmB,CAAC,SAAS,GAAG,0BAA0B,KAAK,CAAC,OAAO,2BAA2B,CAAC;AAEzG,4BAA4B;AAC5B,SAAS,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,GAAG,IAAI,EAAqD;IACjG,MAAM,WAAW,GAAG;QAChB,EAAE,EAAE,SAAS;QACb,EAAE,EAAE,SAAS;QACb,EAAE,EAAE,SAAS;KAChB,CAAC;IACF,OAAO,CACH,cAAK,SAAS,EAAE,oCAAoC,SAAS,IAAI,EAAE,EAAE,YACjE,KAAC,OAAO,IAAC,SAAS,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,qCAAqC,GAAI,GAC/E,CACT,CAAC;AACN,CAAC;AAaD,MAAM,UAAU,eAAe,CAAC,EAC5B,MAAM,EACN,UAAU,EACV,KAAK,EACL,SAAS,EACT,eAAe,GAAG,KAAK,EACvB,qBAAqB,GAAG,KAAK,EAC7B,aAAa,EACb,OAAO,EACY;IACnB,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IAEvD,MAAM,iBAAiB,GAAG,CAAC,EAAE,QAAQ,EAAwB,EAAE,EAAE;QAC7D,UAAU,CAAC,KAAK,CAAC,CAAC;QAClB,aAAa,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,GAAU,EAAE,EAAE;QAC/B,UAAU,CAAC,KAAK,CAAC,CAAC;QAClB,QAAQ,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC,CAAC;IAEF,IAAI,KAAK,EAAE,CAAC;QACR,OAAO,CACH,cAAK,SAAS,EAAE,6DAA6D,SAAS,IAAI,EAAE,EAAE,mCAExF,CACT,CAAC;IACN,CAAC;IAED,OAAO,CACH,eAAK,SAAS,EAAE,SAAS,aACpB,OAAO,IAAI,CACR,KAAC,cAAc,IAAC,SAAS,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,GAAG,CAChD,EACD,KAAC,QAAQ,IACL,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,iBAAiB,EAChC,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,IAAI,YAEb,KAAC,IAAI,IACD,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,KAAK,EACZ,eAAe,EAAE,eAAe,EAChC,qBAAqB,EAAE,qBAAqB,EAC5C,OAAO,EAAE,KAAC,cAAc,IAAC,SAAS,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,GAAG,GACxD,GACK,IACT,CACT,CAAC;AACN,CAAC;AAwBD,MAAM,gBAAgB,GAAG,aAAa,CAA+B,IAAI,CAAC,CAAC;AAS3E;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,KAAK,EAAE,QAAQ,EAAE,aAAa,EAA0B;IAC7G,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IACvD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAwB,IAAI,CAAC,CAAC;IAElF,MAAM,iBAAiB,GAAG,KAAK,EAAE,GAAqB,EAAE,EAAE;QACtD,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1B,aAAa,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE9B,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAChD,iBAAiB,CAAC;gBACd,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,WAAW,EAAE,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM;aAChD,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;QACzD,CAAC;QAED,UAAU,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,GAAU,EAAE,EAAE;QAC/B,UAAU,CAAC,KAAK,CAAC,CAAC;QAClB,QAAQ,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,UAAU,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAE1D,MAAM,KAAK,GAA0B;QACjC,MAAM;QACN,QAAQ;QACR,OAAO,EAAE,SAAS;QAClB,KAAK;QACL,cAAc;KACjB,CAAC;IAEF,oDAAoD;IACpD,MAAM,UAAU,GAAG,CAAC,UAAkB,EAAE,KAAc,EAAE,EAAE,CAAC,CACvD,KAAC,IAAI,IAED,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,KAAK,EACZ,eAAe,EAAE,KAAK,EACtB,qBAAqB,EAAE,KAAK,EAC5B,OAAO,EAAE,KAAC,cAAc,IAAC,SAAS,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,GAAG,IALjD,UAAU,CAMjB,CACL,CAAC;IAEF,IAAI,KAAK,EAAE,CAAC;QACR,OAAO,CACH,cAAK,SAAS,EAAC,gEAAgE,mCAEzE,CACT,CAAC;IACN,CAAC;IAED,OAAO,CACH,KAAC,gBAAgB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAClC,MAAM,CAAC,CAAC,CAAC,CACN,KAAC,QAAQ,IACL,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,iBAAiB,EAChC,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,KAAC,cAAc,IAAC,SAAS,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,GAAG,YAErD,QAAQ,CAAC,UAAU,CAAC,GACd,CACd,CAAC,CAAC,CAAC,CACA,KAAC,cAAc,IAAC,SAAS,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,GAAG,CAChD,GACuB,CAC/B,CAAC;AACN,CAAC;AAED,MAAM,UAAU,YAAY;IACxB,OAAO,UAAU,CAAC,gBAAgB,CAAC,CAAC;AACxC,CAAC;AAED,2BAA2B;AAC3B,MAAM,eAAe,GAAG,GAAG,GAAG,GAAG,CAAC;AAQlC;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAsB;IAC9E,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;IAC/B,MAAM,WAAW,GAAG,OAAO,EAAE,cAAc,EAAE,WAAW,IAAI,eAAe,CAAC;IAC5E,MAAM,iBAAiB,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAExE,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;QACnB,OAAO,CACH,cACI,SAAS,EAAE,6CAA6C,SAAS,IAAI,EAAE,EAAE,EACzE,KAAK,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,KAAK,IAAI,MAAM,EAAE,YAE5D,KAAC,cAAc,IAAC,IAAI,EAAC,IAAI,GAAG,GAC1B,CACT,CAAC;IACN,CAAC;IAED,OAAO,CACH,cAAK,SAAS,EAAE,SAAS,YACrB,KAAC,IAAI,IACD,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,KAAK,EACZ,eAAe,EAAE,KAAK,EACtB,qBAAqB,EAAE,KAAK,EAC5B,OAAO,EAAE,KAAC,cAAc,IAAC,SAAS,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,GAAG,GACxD,GACA,CACT,CAAC;AACN,CAAC;AA2BD;;;GAGG;AACH,SAAS,oBAAoB,CAAC,EAC1B,UAAU,EACV,KAAK,EACL,UAAU,EACV,QAAQ,EACR,eAAe,EACf,WAAW,GAAG,eAAe,EAC7B,UAAU,GAAG,WAAW,EAS3B;IACG,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAClD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5D,+BAA+B;IAC/B,SAAS,CAAC,GAAG,EAAE;QACX,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;QACvC,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CACrC,CAAC,OAAO,EAAE,EAAE;YACR,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,KAAK,EAAE,cAAc,EAAE,CAAC;gBACxB,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;QACL,CAAC,EACD,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,EAAE,CAC/B,CAAC;QAEF,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC5B,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;IACvC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,MAAM,iBAAiB,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAExE,uEAAuE;IACvE,yDAAyD;IACzD,MAAM,gBAAgB,GAAG,cAAc,CAAC;IAExC,MAAM,WAAW,GAAG,gBAAgB,CAAC,CAAC,CAAC,CACnC,KAAC,IAAI,IACD,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,KAAK,EACZ,eAAe,EAAE,KAAK,EACtB,qBAAqB,EAAE,KAAK,EAC5B,OAAO,EACH,cACI,SAAS,EAAC,2CAA2C,EACrD,KAAK,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,YAEpC,KAAC,cAAc,IAAC,IAAI,EAAC,IAAI,GAAG,GAC1B,GAEZ,CACL,CAAC,CAAC,CAAC,CACA,cACI,SAAS,EAAC,2CAA2C,EACrD,KAAK,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,KAAK,IAAI,MAAM,EAAE,YAE5D,eAAM,SAAS,EAAC,+BAA+B,YAAE,UAAU,GAAQ,GACjE,CACT,CAAC;IAEF,OAAO,CACH,cAAK,GAAG,EAAE,YAAY,YACjB,eAAe,CAAC;YACb,UAAU;YACV,UAAU;YACV,WAAW;YACX,QAAQ;SACX,CAAC,GACA,CACT,CAAC;AACN,CAAC;AAED;;;;GAIG;AACH,iDAAiD;AACjD,SAAS,sBAAsB,CAAC,OAA2B;IACvD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,IAAI,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC;IACpC,OAAO,OAAO,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QAClC,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;YACjD,OAAO,OAAO,CAAC;QACnB,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC;IACpC,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAC7B,MAAM,EACN,UAAU,GAAG,KAAK,EAClB,SAAS,EACT,WAAW,EACX,cAAc,EACd,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACG;IACpB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IACvD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IAC7F,4DAA4D;IAC5D,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACpE,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAElD,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,GAAU,EAAE,EAAE;QAC3C,QAAQ,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,wDAAwD;IACxD,MAAM,iBAAiB,GAAG,WAAW,CAAC,KAAK,EAAE,GAAqB,EAAE,EAAE;QAClE,oCAAoC;QACpC,iBAAiB,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAElC,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAChD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/C,cAAc,CAAC,KAAK,CAAC,CAAC;YACtB,mBAAmB,EAAE,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;YACrD,6CAA6C;YAC7C,cAAc,CAAC,eAAe,CAAC,CAAC;YAChC,mBAAmB,EAAE,CAAC,eAAe,CAAC,CAAC;QAC3C,CAAC;IACL,CAAC,EAAE,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAE7C,wDAAwD;IACxD,MAAM,oBAAoB,GAAG,WAAW,IAAI,eAAe,CAAC;IAE5D,kEAAkE;IAClE,MAAM,iBAAiB,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACnG,uFAAuF;IACvF,iFAAiF;IACjF,MAAM,UAAU,GAAG,mBAAmB;QAClC,CAAC,CAAC,mBAAmB,CAAC,iBAAiB,CAAC;QACxC,CAAC,CAAC,iBAAiB,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAEtC,+DAA+D;IAC/D,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,UAAU,GAAG,CAAC,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzC,kBAAkB,EAAE,CAAC,UAAU,CAAC,CAAC;QACrC,CAAC;IACL,CAAC,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAElD,qEAAqE;IACrE,MAAM,aAAa,GAAG,CAAC,CAAC;IAExB,gDAAgD;IAChD,SAAS,CAAC,GAAG,EAAE;QACX,yEAAyE;QACzE,MAAM,SAAS,GAAG,kBAAkB,EAAE,OAAO,IAAI,sBAAsB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC9F,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,MAAM,kBAAkB,GAAG,GAAG,EAAE;YAC5B,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;YACtC,MAAM,cAAc,GAAG,SAAS,CAAC,YAAY,CAAC;YAE9C,oCAAoC;YACpC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC;YACxD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,cAAc,CAAC,GAAG,UAAU,CAAC,CAAC;YAEzE,kCAAkC;YAClC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,aAAa,CAAC,CAAC;YACxD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,GAAG,aAAa,CAAC,CAAC;YAE7D,eAAe,CAAC,IAAI,CAAC,EAAE;gBACnB,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;oBAC3C,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;gBAC1B,CAAC;gBACD,OAAO,IAAI,CAAC;YAChB,CAAC,CAAC,CAAC;QACP,CAAC,CAAC;QAEF,sBAAsB;QACtB,kBAAkB,EAAE,CAAC;QAErB,0BAA0B;QAC1B,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5E,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,mBAAmB,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;IAC7E,CAAC,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAEhD,IAAI,KAAK,EAAE,CAAC;QACR,OAAO,CACH,cAAK,SAAS,EAAC,gEAAgE,mCAEzE,CACT,CAAC;IACN,CAAC;IAED,IAAI,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC;QACxB,OAAO,KAAC,cAAc,IAAC,SAAS,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,GAAG,CAAC;IACzD,CAAC;IAED,iDAAiD;IACjD,MAAM,eAAe,GAAG,YAAY,CAAC,KAAK,GAAG,UAAU,CAAC;IACxD,MAAM,kBAAkB,GAAG,CAAC,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;IAEvE,wEAAwE;IACxE,2EAA2E;IAC3E,MAAM,cAAc,GAAG,WAAW,KAAK,IAAI,CAAC;IAE5C,OAAO,CACH,cAAK,GAAG,EAAE,YAAY,YAClB,KAAC,QAAQ,IACL,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,iBAAiB,EAChC,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,KAAC,cAAc,IAAC,SAAS,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,GAAG,YAErD,cAAc,CAAC,CAAC,CAAC,CACd,8BAEK,eAAe,GAAG,CAAC,IAAI,CACpB,cAAK,KAAK,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,GAAI,CAC9C,EAGA,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,GAAG,GAAG,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;wBACxE,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;wBAClD,OAAO,CACH,iCAAuC,UAAU,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,YACpG,KAAC,oBAAoB,IACjB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,cAAc,EACrB,UAAU,EAAE,UAAU,KAAK,WAAW,EACtC,QAAQ,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,EACxC,eAAe,EAAE,eAAe,EAChC,WAAW,EAAE,oBAAoB,GACnC,IARI,UAAU,CASd,CACT,CAAC;oBACN,CAAC,CAAC,EAGD,kBAAkB,GAAG,CAAC,IAAI,CACvB,cAAK,KAAK,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAI,CACjD,IACF,CACN,CAAC,CAAC,CAAC,CACA,KAAC,cAAc,IAAC,SAAS,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,GAAG,CAChD,GACM,GACT,CACT,CAAC;AACN,CAAC;AAaD,MAAM,UAAU,mBAAmB,CAAC,EAChC,MAAM,EACN,UAAU,EACV,KAAK,EACL,MAAM,EACN,SAAS,EACT,eAAe,GAAG,KAAK,EACvB,qBAAqB,GAAG,KAAK,EAC7B,YAAY,EACW;IACvB,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAS,CAAC,CAAC,CAAC;IACpD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IAEvD,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACf,YAAY,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACzC,CAAC;IACL,CAAC,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IAEzC,MAAM,iBAAiB,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAwB,EAAE,EAAE;QACpE,WAAW,CAAC,KAAK,CAAC,CAAC;QACnB,UAAU,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,GAAU,EAAE,EAAE;QAC/B,UAAU,CAAC,KAAK,CAAC,CAAC;QAClB,QAAQ,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,IAAI,KAAK,EAAE,CAAC;QACR,OAAO,CACH,cAAK,SAAS,EAAE,qDAAqD,SAAS,IAAI,EAAE,EAAE,YAClF,mDAA2B,KAAK,CAAC,OAAO,IAAQ,GAC9C,CACT,CAAC;IACN,CAAC;IAED,OAAO,CACH,eAAK,SAAS,EAAE,SAAS,aACpB,OAAO,IAAI,CACR,KAAC,cAAc,IAAC,SAAS,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,GAAG,CAChD,EACD,KAAC,QAAQ,IACL,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,iBAAiB,EAChC,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,IAAI,YAEb,KAAC,IAAI,IACD,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,IAAI,CAAC,CAAC,EAC/C,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,eAAe,EAChC,qBAAqB,EAAE,qBAAqB,EAC5C,OAAO,EAAE,KAAC,cAAc,IAAC,SAAS,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,GAAG,GACxD,GACK,IACT,CACT,CAAC;AACN,CAAC"}
@@ -0,0 +1,276 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button, Center, VTooltip } from "@vertesia/ui/core";
3
+ import clsx from "clsx";
4
+ import { ChevronsDown, ChevronsUp, Maximize, Minus, Plus } from "lucide-react";
5
+ import { useRef, useEffect, useState, useCallback } from "react";
6
+ import { PdfThumbnailList } from "./PdfPageRenderer";
7
+ // A4 portrait aspect ratio - used as fallback
8
+ const A4_ASPECT_RATIO = 210 / 297;
9
+ // Zoom levels as percentages (100 = fit to width)
10
+ const ZOOM_LEVELS = [50, 75, 100, 125, 150, 200, 300];
11
+ const DEFAULT_ZOOM = 100;
12
+ /**
13
+ * Standalone PDF thumbnail slider component.
14
+ * Displays a vertical list of PDF page thumbnails with navigation controls.
15
+ * Does not depend on any context - all data is passed via props.
16
+ */
17
+ export function PdfPageSlider({ pdfUrl, pdfUrlLoading = false, pageCount, currentPage, onChange, onPageCountChange, className, compact = false, headerExtra }) {
18
+ const ref = useRef(null);
19
+ const scrollContainerRef = useRef(null);
20
+ const [baseWidth, setBaseWidth] = useState(undefined);
21
+ const [zoom, setZoom] = useState(DEFAULT_ZOOM);
22
+ const [aspectRatio, setAspectRatio] = useState(A4_ASPECT_RATIO);
23
+ // Track the actual item height from PdfThumbnailList for accurate scroll calculations
24
+ const [itemHeight, setItemHeight] = useState(null);
25
+ // Track the previous item height to preserve scroll position during resize
26
+ const prevItemHeightRef = useRef(null);
27
+ // Calculate thumbnail width based on zoom level
28
+ const thumbnailWidth = baseWidth ? Math.round(baseWidth * zoom / 100) : undefined;
29
+ const zoomIn = useCallback(() => {
30
+ let currentIndex = ZOOM_LEVELS.findIndex(level => level >= zoom);
31
+ if (currentIndex === -1) {
32
+ currentIndex = ZOOM_LEVELS.length - 1;
33
+ }
34
+ const nextIndex = Math.min(currentIndex + 1, ZOOM_LEVELS.length - 1);
35
+ setZoom(ZOOM_LEVELS[nextIndex]);
36
+ }, [zoom]);
37
+ const zoomOut = useCallback(() => {
38
+ let currentIndex = ZOOM_LEVELS.findIndex(level => level >= zoom);
39
+ if (currentIndex === -1) {
40
+ currentIndex = ZOOM_LEVELS.length - 1;
41
+ }
42
+ const prevIndex = Math.max(currentIndex - 1, 0);
43
+ setZoom(ZOOM_LEVELS[prevIndex]);
44
+ }, [zoom]);
45
+ const fitToView = useCallback(() => {
46
+ setZoom(DEFAULT_ZOOM);
47
+ }, []);
48
+ // Calculate item height based on placeholder height - this must match the renderThumbnail layout
49
+ // padding (p-1=8 or p-2=16) + text height (~16-20 for compact, ~24 for normal) + gap (gap-1=4 or gap-2=8)
50
+ const calculateItemHeight = useCallback((placeholderHeight) => {
51
+ const extraHeight = compact ? 8 + 16 + 4 : 16 + 24 + 8;
52
+ return placeholderHeight + extraHeight;
53
+ }, [compact]);
54
+ // Legacy function for resize preservation - kept for backwards compatibility
55
+ const getItemHeight = (width, ratio) => {
56
+ const placeholderHeight = width ? Math.round(width / ratio) : 200;
57
+ return calculateItemHeight(placeholderHeight);
58
+ };
59
+ // Single ResizeObserver at parent level to measure thumbnail width
60
+ // Debounced to avoid excessive re-renders during resize
61
+ useEffect(() => {
62
+ const container = scrollContainerRef.current;
63
+ if (!container)
64
+ return;
65
+ let debounceTimer = null;
66
+ const getAvailableWidth = () => {
67
+ // Container width minus padding (px-2 = 8px each side) minus thumbnail padding (p-2 = 8px each side) minus border (2px each side)
68
+ return container.clientWidth - 16 - 16 - 4;
69
+ };
70
+ const updateWidth = () => {
71
+ const newWidth = getAvailableWidth();
72
+ if (newWidth <= 0)
73
+ return;
74
+ // Before updating width, preserve scroll position by calculating which page is at top
75
+ const oldItemHeight = prevItemHeightRef.current;
76
+ if (oldItemHeight && oldItemHeight > 0) {
77
+ const currentScrollTop = container.scrollTop;
78
+ const currentTopPage = Math.round(currentScrollTop / oldItemHeight);
79
+ // Calculate new item height and adjust scroll position
80
+ const newItemHeight = getItemHeight(newWidth, aspectRatio);
81
+ const newScrollTop = currentTopPage * newItemHeight;
82
+ // Update width first, then scroll
83
+ setBaseWidth(newWidth);
84
+ // Use requestAnimationFrame to scroll after the DOM updates
85
+ requestAnimationFrame(() => {
86
+ container.scrollTo({ top: newScrollTop, behavior: 'instant' });
87
+ });
88
+ prevItemHeightRef.current = newItemHeight;
89
+ }
90
+ else {
91
+ setBaseWidth(newWidth);
92
+ prevItemHeightRef.current = getItemHeight(newWidth, aspectRatio);
93
+ }
94
+ };
95
+ // Initial width update
96
+ const initialWidth = getAvailableWidth();
97
+ if (initialWidth > 0) {
98
+ setBaseWidth(initialWidth);
99
+ prevItemHeightRef.current = getItemHeight(initialWidth, aspectRatio);
100
+ }
101
+ const handleResize = () => {
102
+ // Debounce width updates to avoid re-rendering PDFs during resize
103
+ if (debounceTimer)
104
+ clearTimeout(debounceTimer);
105
+ debounceTimer = setTimeout(updateWidth, 150);
106
+ };
107
+ const resizeObserver = new ResizeObserver(handleResize);
108
+ resizeObserver.observe(container);
109
+ return () => {
110
+ if (debounceTimer)
111
+ clearTimeout(debounceTimer);
112
+ resizeObserver.disconnect();
113
+ };
114
+ }, [aspectRatio]);
115
+ // Track whether we're programmatically scrolling to avoid feedback loops
116
+ const isProgrammaticScrollRef = useRef(false);
117
+ // Track pending zoom scroll - we need to wait for itemHeight to update after zoom change
118
+ const pendingZoomScrollRef = useRef(null);
119
+ // When zoom changes, mark that we need to scroll after itemHeight updates
120
+ const prevZoomRef = useRef(zoom);
121
+ useEffect(() => {
122
+ if (prevZoomRef.current !== zoom) {
123
+ prevZoomRef.current = zoom;
124
+ // Mark that we need to scroll to current page after itemHeight updates
125
+ pendingZoomScrollRef.current = { targetPage: currentPage };
126
+ isProgrammaticScrollRef.current = true;
127
+ }
128
+ }, [zoom, currentPage]);
129
+ // When itemHeight changes (after zoom), perform the pending scroll
130
+ useEffect(() => {
131
+ const container = scrollContainerRef.current;
132
+ const pendingScroll = pendingZoomScrollRef.current;
133
+ if (pendingScroll && container && itemHeight) {
134
+ pendingZoomScrollRef.current = null;
135
+ // Calculate scroll position using the NEW itemHeight
136
+ const targetScrollTop = (pendingScroll.targetPage - 1) * itemHeight;
137
+ // Use requestAnimationFrame to ensure DOM is updated
138
+ requestAnimationFrame(() => {
139
+ container.scrollTo({ top: targetScrollTop, behavior: 'instant' });
140
+ // Reset after scroll completes
141
+ requestAnimationFrame(() => {
142
+ isProgrammaticScrollRef.current = false;
143
+ });
144
+ });
145
+ }
146
+ }, [itemHeight]);
147
+ // Track if we've done the initial scroll on mount
148
+ const hasInitialScrolledRef = useRef(false);
149
+ // Initial scroll to current page when component mounts and itemHeight becomes available
150
+ useEffect(() => {
151
+ const container = scrollContainerRef.current;
152
+ if (!container || !itemHeight || hasInitialScrolledRef.current)
153
+ return;
154
+ // Only do initial scroll if not on page 1
155
+ if (currentPage > 1) {
156
+ hasInitialScrolledRef.current = true;
157
+ isProgrammaticScrollRef.current = true;
158
+ const targetScrollTop = (currentPage - 1) * itemHeight;
159
+ container.scrollTo({ top: targetScrollTop, behavior: 'instant' });
160
+ requestAnimationFrame(() => {
161
+ isProgrammaticScrollRef.current = false;
162
+ });
163
+ }
164
+ else {
165
+ hasInitialScrolledRef.current = true;
166
+ }
167
+ }, [itemHeight, currentPage]);
168
+ // Jump to current page when it changes (user navigation)
169
+ // Use a ref to track the previous page to avoid scrolling on resize
170
+ const prevPageRef = useRef(currentPage);
171
+ useEffect(() => {
172
+ const container = scrollContainerRef.current;
173
+ if (!container || !itemHeight)
174
+ return;
175
+ // Only scroll if the page actually changed (user navigation)
176
+ if (prevPageRef.current !== currentPage) {
177
+ prevPageRef.current = currentPage;
178
+ // Mark as programmatic scroll to avoid triggering onChange
179
+ isProgrammaticScrollRef.current = true;
180
+ // Calculate scroll position directly using itemHeight
181
+ // This is more reliable than DOM queries since virtualization uses spacers
182
+ const targetScrollTop = (currentPage - 1) * itemHeight;
183
+ container.scrollTo({ top: targetScrollTop, behavior: 'instant' });
184
+ // Reset after a short delay to allow scroll event to fire
185
+ requestAnimationFrame(() => {
186
+ isProgrammaticScrollRef.current = false;
187
+ });
188
+ }
189
+ }, [currentPage, itemHeight]);
190
+ // Update current page based on scroll position
191
+ useEffect(() => {
192
+ const container = scrollContainerRef.current;
193
+ if (!container || !itemHeight)
194
+ return;
195
+ let scrollDebounceTimer = null;
196
+ const handleScroll = () => {
197
+ // Skip if this is a programmatic scroll
198
+ if (isProgrammaticScrollRef.current)
199
+ return;
200
+ // Debounce scroll updates
201
+ if (scrollDebounceTimer)
202
+ clearTimeout(scrollDebounceTimer);
203
+ scrollDebounceTimer = setTimeout(() => {
204
+ // Calculate current page from scroll position using itemHeight
205
+ // This is more reliable than DOM queries since virtualization uses spacers
206
+ const scrollTop = container.scrollTop;
207
+ const calculatedPage = Math.round(scrollTop / itemHeight) + 1;
208
+ // Clamp to valid range and update if different
209
+ const clampedPage = Math.max(1, Math.min(calculatedPage, pageCount));
210
+ if (clampedPage !== currentPage) {
211
+ prevPageRef.current = clampedPage;
212
+ onChange(clampedPage);
213
+ }
214
+ }, 50);
215
+ };
216
+ container.addEventListener('scroll', handleScroll, { passive: true });
217
+ return () => {
218
+ if (scrollDebounceTimer)
219
+ clearTimeout(scrollDebounceTimer);
220
+ container.removeEventListener('scroll', handleScroll);
221
+ };
222
+ }, [itemHeight, pageCount, currentPage, onChange]);
223
+ const goPrev = () => {
224
+ if (currentPage > 1) {
225
+ onChange(currentPage - 1);
226
+ }
227
+ };
228
+ const goNext = () => {
229
+ if (currentPage < pageCount) {
230
+ onChange(currentPage + 1);
231
+ }
232
+ };
233
+ return (_jsxs("div", { ref: ref, className: clsx('flex flex-col items-stretch', compact ? 'gap-y-1' : 'gap-y-2', className), children: [_jsxs("div", { className: clsx("relative flex items-center justify-center px-2", compact ? "h-6" : "h-9"), children: [_jsx(Button, { variant: "ghost", size: "xs", onClick: goPrev, alt: "Previous page", children: _jsx(ChevronsUp, { className: 'size-4' }) }), _jsxs("div", { className: "absolute left-2 flex items-center gap-x-1", children: [_jsx(ZoomControls, { zoom: zoom, onZoomIn: zoomIn, onZoomOut: zoomOut, onFitToView: fitToView, canZoomIn: zoom < ZOOM_LEVELS[ZOOM_LEVELS.length - 1], canZoomOut: zoom > ZOOM_LEVELS[0] }), headerExtra && (_jsxs(_Fragment, { children: [_jsx("div", { className: "w-px h-4 bg-border mx-1" }), headerExtra] }))] }), _jsx("div", { className: "absolute right-2", children: _jsx(PageNavigator, { currentPage: currentPage, totalPages: pageCount, onChange: onChange }) })] }), _jsx("div", { ref: scrollContainerRef, className: clsx('flex flex-col items-center flex-1 overflow-y-auto px-2', compact ? 'gap-1' : 'gap-2'), children: _jsx(PdfThumbnailList, { pdfUrl: pdfUrl, urlLoading: pdfUrlLoading, pageCount: pageCount, currentPage: currentPage, thumbnailWidth: thumbnailWidth, onPageSelect: onChange, onPageCountChange: onPageCountChange, scrollContainerRef: scrollContainerRef, onAspectRatioChange: setAspectRatio, onItemHeightChange: setItemHeight, calculateItemHeight: calculateItemHeight, renderThumbnail: ({ pageNumber, isSelected, pageElement, onSelect }) => (_jsxs("div", { className: clsx("hover:bg-muted rounded-md w-full", compact ? "p-1" : "p-2"), children: [_jsx("div", { className: clsx('relative border-[2px] cursor-pointer overflow-hidden', isSelected ? "border-primary" : "border-border"), onClick: onSelect, children: pageElement }), _jsx(Center, { className: clsx("text-muted-foreground font-semibold", compact ? "text-xs pt-0.5" : "text-sm pt-1"), children: pageNumber })] }, pageNumber)) }) }), _jsx("div", { className: clsx("flex items-center justify-center", compact ? "h-6" : "h-9"), children: _jsx(Button, { variant: "ghost", size: "xs", onClick: goNext, alt: "Next page", children: _jsx(ChevronsDown, { className: 'size-4' }) }) })] }));
234
+ }
235
+ function PageNavigator({ currentPage, totalPages, onChange }) {
236
+ const inputRef = useRef(null);
237
+ const [inputValue, setInputValue] = useState(String(currentPage));
238
+ // Sync input value when currentPage changes externally
239
+ useEffect(() => {
240
+ setInputValue(String(currentPage));
241
+ }, [currentPage]);
242
+ const handleSubmit = () => {
243
+ const page = parseInt(inputValue, 10);
244
+ if (!isNaN(page) && page >= 1 && page <= totalPages) {
245
+ onChange(page);
246
+ }
247
+ else {
248
+ // Reset to current page if invalid
249
+ setInputValue(String(currentPage));
250
+ }
251
+ };
252
+ const handleKeyDown = (e) => {
253
+ if (e.key === 'Enter') {
254
+ handleSubmit();
255
+ inputRef.current?.blur();
256
+ }
257
+ else if (e.key === 'Escape') {
258
+ setInputValue(String(currentPage));
259
+ inputRef.current?.blur();
260
+ }
261
+ };
262
+ const handleBlur = () => {
263
+ handleSubmit();
264
+ };
265
+ return (_jsxs("div", { className: "flex items-center gap-1 text-xs text-muted-foreground", children: [_jsx("span", { children: "Page" }), _jsx("input", { ref: inputRef, type: "text", value: inputValue, onChange: (e) => setInputValue(e.target.value), onKeyDown: handleKeyDown, onBlur: handleBlur, className: "w-8 h-5 text-center text-xs px-1 py-0 bg-background border border-border rounded focus:outline-none focus:border-primary" }), _jsxs("span", { children: ["/ ", totalPages] })] }));
266
+ }
267
+ function ZoomControls({ zoom, onZoomIn, onZoomOut, onFitToView, canZoomIn, canZoomOut }) {
268
+ return (_jsxs("div", { className: "flex items-center gap-x-0.5", children: [_jsx(VTooltip, { description: "Zoom out", placement: "bottom", size: "xs", children: _jsx("button", { className: clsx("p-1 rounded cursor-pointer transition-colors", canZoomOut
269
+ ? "text-muted-foreground hover:text-foreground hover:bg-muted"
270
+ : "text-muted-foreground/40 cursor-not-allowed"), onClick: onZoomOut, disabled: !canZoomOut, children: _jsx(Minus, { className: "size-4" }) }) }), _jsxs("span", { className: "text-xs text-muted-foreground min-w-[32px] text-center", children: [zoom, "%"] }), _jsx(VTooltip, { description: "Zoom in", placement: "bottom", size: "xs", children: _jsx("button", { className: clsx("p-1 rounded cursor-pointer transition-colors", canZoomIn
271
+ ? "text-muted-foreground hover:text-foreground hover:bg-muted"
272
+ : "text-muted-foreground/40 cursor-not-allowed"), onClick: onZoomIn, disabled: !canZoomIn, children: _jsx(Plus, { className: "size-4" }) }) }), _jsx(VTooltip, { description: "Fit to width", placement: "bottom", size: "xs", children: _jsx("button", { className: clsx("p-1 rounded cursor-pointer transition-colors", zoom !== DEFAULT_ZOOM
273
+ ? "text-muted-foreground hover:text-foreground hover:bg-muted"
274
+ : "text-muted-foreground/40"), onClick: onFitToView, children: _jsx(Maximize, { className: "size-4" }) }) })] }));
275
+ }
276
+ //# sourceMappingURL=PdfPageSlider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PdfPageSlider.js","sourceRoot":"","sources":["../../../../src/features/pdf-viewer/PdfPageSlider.tsx"],"names":[],"mappings":"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"}