@vertesia/ui 0.80.0-dev-20251118 → 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.
- package/README.md +105 -0
- package/lib/esm/core/components/MenuList.js +2 -5
- package/lib/esm/core/components/MenuList.js.map +1 -1
- package/lib/esm/core/components/MessageBox.js +1 -1
- package/lib/esm/core/components/MessageBox.js.map +1 -1
- package/lib/esm/core/components/TagsInput.js +194 -0
- package/lib/esm/core/components/TagsInput.js.map +1 -0
- package/lib/esm/core/components/index.js +2 -1
- package/lib/esm/core/components/index.js.map +1 -1
- package/lib/esm/core/components/shadcn/dialog.js +16 -2
- package/lib/esm/core/components/shadcn/dialog.js.map +1 -1
- package/lib/esm/core/components/shadcn/filters/filter/SelectFilter.js +6 -9
- package/lib/esm/core/components/shadcn/filters/filter/SelectFilter.js.map +1 -1
- package/lib/esm/core/components/shadcn/filters/filterBar.js +1 -1
- package/lib/esm/core/components/shadcn/filters/filterBar.js.map +1 -1
- package/lib/esm/core/components/shadcn/popover.js +1 -1
- package/lib/esm/core/components/shadcn/popover.js.map +1 -1
- package/lib/esm/core/components/shadcn/selectBox.js +23 -5
- package/lib/esm/core/components/shadcn/selectBox.js.map +1 -1
- package/lib/esm/core/components/shadcn/tabs.js +3 -3
- package/lib/esm/core/components/shadcn/tabs.js.map +1 -1
- package/lib/esm/env/index.js +4 -1
- package/lib/esm/env/index.js.map +1 -1
- package/lib/esm/features/agent/chat/AgentChart.js +184 -0
- package/lib/esm/features/agent/chat/AgentChart.js.map +1 -0
- package/lib/esm/features/agent/chat/ModernAgentConversation.js +87 -10
- package/lib/esm/features/agent/chat/ModernAgentConversation.js.map +1 -1
- package/lib/esm/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js +6 -2
- package/lib/esm/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js.map +1 -1
- package/lib/esm/features/agent/chat/ModernAgentOutput/Header.js +4 -4
- package/lib/esm/features/agent/chat/ModernAgentOutput/Header.js.map +1 -1
- package/lib/esm/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.js +4 -1
- package/lib/esm/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.js.map +1 -1
- package/lib/esm/features/agent/chat/ModernAgentOutput/MessageInput.js +12 -4
- package/lib/esm/features/agent/chat/ModernAgentOutput/MessageInput.js.map +1 -1
- package/lib/esm/features/agent/chat/ModernAgentOutput/MessageItem.js +60 -56
- package/lib/esm/features/agent/chat/ModernAgentOutput/MessageItem.js.map +1 -1
- package/lib/esm/features/agent/chat/index.js +1 -0
- package/lib/esm/features/agent/chat/index.js.map +1 -1
- package/lib/esm/features/agent/createChartTool.js +354 -0
- package/lib/esm/features/agent/createChartTool.js.map +1 -0
- package/lib/esm/features/agent/examples.js +295 -0
- package/lib/esm/features/agent/examples.js.map +1 -0
- package/lib/esm/features/agent/index.js +2 -0
- package/lib/esm/features/agent/index.js.map +1 -1
- package/lib/esm/features/agent/visualization.js +165 -0
- package/lib/esm/features/agent/visualization.js.map +1 -0
- package/lib/esm/features/facets/CollectionsFacetsNav.js +5 -1
- package/lib/esm/features/facets/CollectionsFacetsNav.js.map +1 -1
- package/lib/esm/features/index.js +1 -0
- package/lib/esm/features/index.js.map +1 -1
- package/lib/esm/features/layout/GenericPageNavHeader.js +14 -4
- package/lib/esm/features/layout/GenericPageNavHeader.js.map +1 -1
- package/lib/esm/features/magic-pdf/AnnotatedImageSlider.js +268 -0
- package/lib/esm/features/magic-pdf/AnnotatedImageSlider.js.map +1 -0
- package/lib/esm/features/magic-pdf/DownloadPopover.js +11 -11
- package/lib/esm/features/magic-pdf/DownloadPopover.js.map +1 -1
- package/lib/esm/features/magic-pdf/ExtractedContentView.js +77 -0
- package/lib/esm/features/magic-pdf/ExtractedContentView.js.map +1 -0
- package/lib/esm/features/magic-pdf/MagicPdfProvider.js +242 -0
- package/lib/esm/features/magic-pdf/MagicPdfProvider.js.map +1 -0
- package/lib/esm/features/magic-pdf/MagicPdfView.js +41 -47
- package/lib/esm/features/magic-pdf/MagicPdfView.js.map +1 -1
- package/lib/esm/features/pdf-viewer/PdfPageRenderer.js +261 -0
- package/lib/esm/features/pdf-viewer/PdfPageRenderer.js.map +1 -0
- package/lib/esm/features/pdf-viewer/PdfPageSlider.js +276 -0
- package/lib/esm/features/pdf-viewer/PdfPageSlider.js.map +1 -0
- package/lib/esm/features/pdf-viewer/SimplePdfViewer.js +71 -0
- package/lib/esm/features/pdf-viewer/SimplePdfViewer.js.map +1 -0
- package/lib/esm/features/pdf-viewer/index.js +4 -0
- package/lib/esm/features/pdf-viewer/index.js.map +1 -0
- package/lib/esm/features/store/collections/EditCollectionView.js +19 -10
- package/lib/esm/features/store/collections/EditCollectionView.js.map +1 -1
- package/lib/esm/features/store/collections/SelectCollection.js +104 -39
- package/lib/esm/features/store/collections/SelectCollection.js.map +1 -1
- package/lib/esm/features/store/collections/SharedPropsEditor.js +39 -0
- package/lib/esm/features/store/collections/SharedPropsEditor.js.map +1 -0
- package/lib/esm/features/store/collections/SyncMemberHeadsToggle.js +35 -0
- package/lib/esm/features/store/collections/SyncMemberHeadsToggle.js.map +1 -0
- package/lib/esm/features/store/collections/index.js +2 -0
- package/lib/esm/features/store/collections/index.js.map +1 -1
- package/lib/esm/features/store/objects/DocumentSearchResults.js +0 -7
- package/lib/esm/features/store/objects/DocumentSearchResults.js.map +1 -1
- package/lib/esm/features/store/objects/components/ContentOverview.js +273 -83
- package/lib/esm/features/store/objects/components/ContentOverview.js.map +1 -1
- package/lib/esm/features/store/objects/components/useContentPanelHooks.js +153 -0
- package/lib/esm/features/store/objects/components/useContentPanelHooks.js.map +1 -0
- package/lib/esm/features/store/objects/layout/DocumentTableColumn.js +3 -3
- package/lib/esm/features/store/objects/layout/DocumentTableColumn.js.map +1 -1
- package/lib/esm/features/store/objects/layout/renderers.js +13 -0
- package/lib/esm/features/store/objects/layout/renderers.js.map +1 -1
- package/lib/esm/features/store/objects/upload/useSmartFileUploadProcessing.js +10 -9
- package/lib/esm/features/store/objects/upload/useSmartFileUploadProcessing.js.map +1 -1
- package/lib/esm/features/utils/index.js +2 -0
- package/lib/esm/features/utils/index.js.map +1 -1
- package/lib/esm/features/utils/mimeType.js +8 -0
- package/lib/esm/features/utils/mimeType.js.map +1 -1
- package/lib/esm/features/utils/print.js +181 -0
- package/lib/esm/features/utils/print.js.map +1 -0
- package/lib/esm/features/utils/workflowStatus.js +43 -0
- package/lib/esm/features/utils/workflowStatus.js.map +1 -0
- package/lib/esm/router/HistoryNavigator.js +22 -2
- package/lib/esm/router/HistoryNavigator.js.map +1 -1
- package/lib/esm/session/UserSessionProvider.js +2 -2
- package/lib/esm/session/UserSessionProvider.js.map +1 -1
- package/lib/esm/shell/apps/AppProjectSelector.js +2 -2
- package/lib/esm/shell/apps/AppProjectSelector.js.map +1 -1
- package/lib/esm/shell/login/UserInfo.js +2 -1
- package/lib/esm/shell/login/UserInfo.js.map +1 -1
- package/lib/esm/shell/login/UserSessionMenu.js +7 -1
- package/lib/esm/shell/login/UserSessionMenu.js.map +1 -1
- package/lib/esm/widgets/form/Form.js +6 -2
- package/lib/esm/widgets/form/Form.js.map +1 -1
- package/lib/esm/widgets/markdown/MarkdownRenderer.js +226 -4
- package/lib/esm/widgets/markdown/MarkdownRenderer.js.map +1 -1
- package/lib/esm/widgets/schema-editor/ManagedSchema.js +0 -3
- package/lib/esm/widgets/schema-editor/ManagedSchema.js.map +1 -1
- package/lib/esm/widgets/schema-editor/json-schema4-utils.js +1 -1
- package/lib/esm/widgets/schema-editor/json-schema4-utils.js.map +1 -1
- package/lib/esm/widgets/xml-viewer/components/XMLViewer.js +18 -9
- package/lib/esm/widgets/xml-viewer/components/XMLViewer.js.map +1 -1
- package/lib/esm/widgets/xml-viewer/constants/index.js +10 -0
- package/lib/esm/widgets/xml-viewer/constants/index.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/types/core/components/MessageBox.d.ts.map +1 -1
- package/lib/types/core/components/TagsInput.d.ts +16 -0
- package/lib/types/core/components/TagsInput.d.ts.map +1 -0
- package/lib/types/core/components/index.d.ts +2 -1
- package/lib/types/core/components/index.d.ts.map +1 -1
- package/lib/types/core/components/shadcn/dialog.d.ts +2 -1
- package/lib/types/core/components/shadcn/dialog.d.ts.map +1 -1
- package/lib/types/core/components/shadcn/filters/filterBar.d.ts.map +1 -1
- package/lib/types/core/components/shadcn/popover.d.ts +7 -0
- package/lib/types/core/components/shadcn/popover.d.ts.map +1 -1
- package/lib/types/core/components/shadcn/selectBox.d.ts +5 -1
- package/lib/types/core/components/shadcn/selectBox.d.ts.map +1 -1
- package/lib/types/core/components/shadcn/tabs.d.ts +3 -1
- package/lib/types/core/components/shadcn/tabs.d.ts.map +1 -1
- package/lib/types/env/index.d.ts +2 -0
- package/lib/types/env/index.d.ts.map +1 -1
- package/lib/types/features/agent/chat/AgentChart.d.ts +48 -0
- package/lib/types/features/agent/chat/AgentChart.d.ts.map +1 -0
- package/lib/types/features/agent/chat/ModernAgentConversation.d.ts.map +1 -1
- package/lib/types/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts +3 -2
- package/lib/types/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts.map +1 -1
- package/lib/types/features/agent/chat/ModernAgentOutput/Header.d.ts +2 -1
- package/lib/types/features/agent/chat/ModernAgentOutput/Header.d.ts.map +1 -1
- package/lib/types/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.d.ts +4 -2
- package/lib/types/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.d.ts.map +1 -1
- package/lib/types/features/agent/chat/ModernAgentOutput/MessageInput.d.ts +2 -4
- package/lib/types/features/agent/chat/ModernAgentOutput/MessageInput.d.ts.map +1 -1
- package/lib/types/features/agent/chat/ModernAgentOutput/MessageItem.d.ts.map +1 -1
- package/lib/types/features/agent/chat/index.d.ts +1 -0
- package/lib/types/features/agent/chat/index.d.ts.map +1 -1
- package/lib/types/features/agent/createChartTool.d.ts +178 -0
- package/lib/types/features/agent/createChartTool.d.ts.map +1 -0
- package/lib/types/features/agent/examples.d.ts +59 -0
- package/lib/types/features/agent/examples.d.ts.map +1 -0
- package/lib/types/features/agent/index.d.ts +2 -0
- package/lib/types/features/agent/index.d.ts.map +1 -1
- package/lib/types/features/agent/visualization.d.ts +95 -0
- package/lib/types/features/agent/visualization.d.ts.map +1 -0
- package/lib/types/features/facets/CollectionsFacetsNav.d.ts.map +1 -1
- package/lib/types/features/index.d.ts +1 -0
- package/lib/types/features/index.d.ts.map +1 -1
- package/lib/types/features/layout/GenericPageNavHeader.d.ts.map +1 -1
- package/lib/types/features/magic-pdf/AnnotatedImageSlider.d.ts +13 -0
- package/lib/types/features/magic-pdf/AnnotatedImageSlider.d.ts.map +1 -0
- package/lib/types/features/magic-pdf/DownloadPopover.d.ts.map +1 -1
- package/lib/types/features/magic-pdf/ExtractedContentView.d.ts +8 -0
- package/lib/types/features/magic-pdf/ExtractedContentView.d.ts.map +1 -0
- package/lib/types/features/magic-pdf/MagicPdfProvider.d.ts +58 -0
- package/lib/types/features/magic-pdf/MagicPdfProvider.d.ts.map +1 -0
- package/lib/types/features/magic-pdf/MagicPdfView.d.ts +1 -1
- package/lib/types/features/magic-pdf/MagicPdfView.d.ts.map +1 -1
- package/lib/types/features/pdf-viewer/PdfPageRenderer.d.ts +83 -0
- package/lib/types/features/pdf-viewer/PdfPageRenderer.d.ts.map +1 -0
- package/lib/types/features/pdf-viewer/PdfPageSlider.d.ts +29 -0
- package/lib/types/features/pdf-viewer/PdfPageSlider.d.ts.map +1 -0
- package/lib/types/features/pdf-viewer/SimplePdfViewer.d.ts +19 -0
- package/lib/types/features/pdf-viewer/SimplePdfViewer.d.ts.map +1 -0
- package/lib/types/features/pdf-viewer/index.d.ts +4 -0
- package/lib/types/features/pdf-viewer/index.d.ts.map +1 -0
- package/lib/types/features/store/collections/EditCollectionView.d.ts.map +1 -1
- package/lib/types/features/store/collections/SelectCollection.d.ts +2 -1
- package/lib/types/features/store/collections/SelectCollection.d.ts.map +1 -1
- package/lib/types/features/store/collections/SharedPropsEditor.d.ts +7 -0
- package/lib/types/features/store/collections/SharedPropsEditor.d.ts.map +1 -0
- package/lib/types/features/store/collections/SyncMemberHeadsToggle.d.ts +7 -0
- package/lib/types/features/store/collections/SyncMemberHeadsToggle.d.ts.map +1 -0
- package/lib/types/features/store/collections/index.d.ts +2 -0
- package/lib/types/features/store/collections/index.d.ts.map +1 -1
- package/lib/types/features/store/objects/DocumentSearchResults.d.ts.map +1 -1
- package/lib/types/features/store/objects/components/ContentOverview.d.ts.map +1 -1
- package/lib/types/features/store/objects/components/useContentPanelHooks.d.ts +30 -0
- package/lib/types/features/store/objects/components/useContentPanelHooks.d.ts.map +1 -0
- package/lib/types/features/store/objects/layout/renderers.d.ts.map +1 -1
- package/lib/types/features/store/objects/upload/useSmartFileUploadProcessing.d.ts.map +1 -1
- package/lib/types/features/utils/index.d.ts +2 -0
- package/lib/types/features/utils/index.d.ts.map +1 -1
- package/lib/types/features/utils/mimeType.d.ts +1 -0
- package/lib/types/features/utils/mimeType.d.ts.map +1 -1
- package/lib/types/features/utils/print.d.ts +10 -0
- package/lib/types/features/utils/print.d.ts.map +1 -0
- package/lib/types/features/utils/workflowStatus.d.ts +10 -0
- package/lib/types/features/utils/workflowStatus.d.ts.map +1 -0
- package/lib/types/router/HistoryNavigator.d.ts +3 -0
- package/lib/types/router/HistoryNavigator.d.ts.map +1 -1
- package/lib/types/shell/login/UserInfo.d.ts.map +1 -1
- package/lib/types/shell/login/UserSessionMenu.d.ts.map +1 -1
- package/lib/types/widgets/form/Form.d.ts.map +1 -1
- package/lib/types/widgets/markdown/MarkdownRenderer.d.ts +5 -1
- package/lib/types/widgets/markdown/MarkdownRenderer.d.ts.map +1 -1
- package/lib/types/widgets/schema-editor/ManagedSchema.d.ts.map +1 -1
- package/lib/types/widgets/xml-viewer/components/XMLViewer.d.ts.map +1 -1
- package/lib/types/widgets/xml-viewer/constants/index.d.ts +10 -0
- package/lib/types/widgets/xml-viewer/constants/index.d.ts.map +1 -1
- package/lib/vertesia-ui-core.js +1 -1
- package/lib/vertesia-ui-core.js.map +1 -1
- package/lib/vertesia-ui-env.js +1 -1
- package/lib/vertesia-ui-env.js.map +1 -1
- package/lib/vertesia-ui-features.js +1 -1
- package/lib/vertesia-ui-features.js.map +1 -1
- package/lib/vertesia-ui-layout.js +1 -1
- package/lib/vertesia-ui-layout.js.map +1 -1
- package/lib/vertesia-ui-router.js +1 -1
- package/lib/vertesia-ui-router.js.map +1 -1
- package/lib/vertesia-ui-session.js +1 -1
- package/lib/vertesia-ui-session.js.map +1 -1
- package/lib/vertesia-ui-shell.js +1 -1
- package/lib/vertesia-ui-shell.js.map +1 -1
- package/lib/vertesia-ui-widgets.js +1 -1
- package/lib/vertesia-ui-widgets.js.map +1 -1
- package/package.json +173 -170
- package/src/core/components/MenuList.tsx +3 -6
- package/src/core/components/MessageBox.tsx +7 -2
- package/src/core/components/SelectBox.tsx +1 -1
- package/src/core/components/shadcn/dialog.tsx +19 -1
- package/src/core/components/shadcn/filters/filter/SelectFilter.tsx +31 -31
- package/src/core/components/shadcn/filters/filterBar.tsx +1 -0
- package/src/core/components/shadcn/selectBox.tsx +32 -6
- package/src/core/components/shadcn/tabs.tsx +3 -2
- package/src/env/index.ts +6 -1
- package/src/features/agent/CHART_INSTRUCTIONS.md +228 -0
- package/src/features/agent/chat/AgentChart.tsx +601 -0
- package/src/features/agent/chat/ModernAgentConversation.tsx +123 -11
- package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.tsx +8 -2
- package/src/features/agent/chat/ModernAgentOutput/Header.tsx +12 -2
- package/src/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.tsx +6 -1
- package/src/features/agent/chat/ModernAgentOutput/MessageInput.tsx +15 -10
- package/src/features/agent/chat/ModernAgentOutput/MessageItem.tsx +122 -87
- package/src/features/agent/chat/index.ts +1 -0
- package/src/features/agent/createChartTool.ts +364 -0
- package/src/features/agent/examples.ts +321 -0
- package/src/features/agent/index.ts +2 -0
- package/src/features/agent/visualization.ts +227 -0
- package/src/features/facets/CollectionsFacetsNav.tsx +5 -1
- package/src/features/index.ts +1 -0
- package/src/features/layout/GenericPageNavHeader.tsx +15 -4
- package/src/features/magic-pdf/AnnotatedImageSlider.tsx +482 -0
- package/src/features/magic-pdf/DownloadPopover.tsx +45 -40
- package/src/features/magic-pdf/ExtractedContentView.tsx +132 -0
- package/src/features/magic-pdf/MagicPdfProvider.tsx +297 -0
- package/src/features/magic-pdf/MagicPdfView.tsx +184 -91
- package/src/features/pdf-viewer/PdfPageRenderer.tsx +612 -0
- package/src/features/pdf-viewer/PdfPageSlider.tsx +473 -0
- package/src/features/pdf-viewer/SimplePdfViewer.tsx +142 -0
- package/src/features/pdf-viewer/index.ts +3 -0
- package/src/features/store/collections/EditCollectionView.tsx +3 -5
- package/src/features/store/collections/SharedPropsEditor.tsx +1 -2
- package/src/features/store/objects/DocumentSearchResults.tsx +0 -7
- package/src/features/store/objects/components/ContentOverview.tsx +677 -210
- package/src/features/store/objects/components/useContentPanelHooks.ts +169 -0
- package/src/features/store/objects/layout/DocumentTableColumn.tsx +3 -3
- package/src/features/store/objects/layout/knowledge.md +1 -0
- package/src/features/store/objects/layout/renderers.tsx +25 -0
- package/src/features/store/objects/upload/useSmartFileUploadProcessing.ts +1 -3
- package/src/features/utils/index.ts +3 -1
- package/src/features/utils/mimeType.ts +10 -1
- package/src/features/utils/print.ts +189 -0
- package/src/features/utils/workflowStatus.ts +44 -0
- package/src/router/HistoryNavigator.ts +30 -2
- package/src/session/UserSessionProvider.tsx +2 -2
- package/src/shell/login/UserInfo.tsx +2 -0
- package/src/shell/login/UserSessionMenu.tsx +12 -1
- package/src/widgets/form/Form.tsx +8 -3
- package/src/widgets/markdown/MarkdownRenderer.tsx +350 -6
- package/src/widgets/schema-editor/ManagedSchema.ts +0 -3
- package/src/widgets/schema-editor/json-schema4-utils.ts +1 -1
- package/src/widgets/xml-viewer/components/XMLViewer.tsx +22 -10
- package/src/widgets/xml-viewer/constants/index.ts +11 -0
- package/lib/esm/features/magic-pdf/PageSlider.js +0 -70
- package/lib/esm/features/magic-pdf/PageSlider.js.map +0 -1
- package/lib/esm/features/magic-pdf/PdfPageProvider.js +0 -188
- package/lib/esm/features/magic-pdf/PdfPageProvider.js.map +0 -1
- package/lib/esm/features/magic-pdf/TextPageView.js +0 -62
- package/lib/esm/features/magic-pdf/TextPageView.js.map +0 -1
- package/lib/esm/features/magic-pdf/useResizeOnDrag.js +0 -34
- package/lib/esm/features/magic-pdf/useResizeOnDrag.js.map +0 -1
- package/lib/types/features/magic-pdf/PageSlider.d.ts +0 -9
- package/lib/types/features/magic-pdf/PageSlider.d.ts.map +0 -1
- package/lib/types/features/magic-pdf/PdfPageProvider.d.ts +0 -39
- package/lib/types/features/magic-pdf/PdfPageProvider.d.ts.map +0 -1
- package/lib/types/features/magic-pdf/TextPageView.d.ts +0 -8
- package/lib/types/features/magic-pdf/TextPageView.d.ts.map +0 -1
- package/lib/types/features/magic-pdf/useResizeOnDrag.d.ts +0 -9
- package/lib/types/features/magic-pdf/useResizeOnDrag.d.ts.map +0 -1
- package/src/features/magic-pdf/PageSlider.tsx +0 -142
- package/src/features/magic-pdf/PdfPageProvider.tsx +0 -310
- package/src/features/magic-pdf/TextPageView.tsx +0 -91
- 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":"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"}
|
|
@@ -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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"}
|