@embedpdf/plugin-scroll 1.5.0 → 2.0.0-next.1
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/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +522 -266
- package/dist/index.js.map +1 -1
- package/dist/lib/actions.d.ts +30 -27
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/reducer.d.ts +3 -4
- package/dist/lib/scroll-plugin.d.ts +40 -27
- package/dist/lib/selectors.d.ts +2 -2
- package/dist/lib/types.d.ts +65 -30
- package/dist/preact/adapter.d.ts +1 -1
- package/dist/preact/index.cjs +1 -1
- package/dist/preact/index.cjs.map +1 -1
- package/dist/preact/index.js +33 -114
- package/dist/preact/index.js.map +1 -1
- package/dist/react/adapter.d.ts +1 -1
- package/dist/react/index.cjs +1 -1
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.js +33 -114
- package/dist/react/index.js.map +1 -1
- package/dist/shared/components/scroller.d.ts +4 -4
- package/dist/shared/hooks/use-scroll.d.ts +4 -15
- package/dist/shared-preact/components/scroller.d.ts +4 -4
- package/dist/shared-preact/hooks/use-scroll.d.ts +4 -15
- package/dist/shared-react/components/scroller.d.ts +4 -4
- package/dist/shared-react/hooks/use-scroll.d.ts +4 -15
- package/dist/svelte/components/Scroller.svelte.d.ts +4 -4
- package/dist/svelte/hooks/use-scroll.svelte.d.ts +11 -5
- package/dist/svelte/index.cjs +1 -1
- package/dist/svelte/index.cjs.map +1 -1
- package/dist/svelte/index.js +90 -102
- package/dist/svelte/index.js.map +1 -1
- package/dist/vue/components/scroller.vue.d.ts +6 -9
- package/dist/vue/hooks/use-scroll.d.ts +12 -8
- package/dist/vue/index.cjs +1 -1
- package/dist/vue/index.cjs.map +1 -1
- package/dist/vue/index.js +115 -115
- package/dist/vue/index.js.map +1 -1
- package/package.json +7 -6
package/dist/react/index.js
CHANGED
|
@@ -1,132 +1,55 @@
|
|
|
1
|
-
import { useState, useEffect } from "react";
|
|
2
|
-
import { usePlugin, useCapability
|
|
1
|
+
import { useState, useEffect, useLayoutEffect } from "react";
|
|
2
|
+
import { usePlugin, useCapability } from "@embedpdf/core/react";
|
|
3
3
|
import { ScrollPlugin, ScrollStrategy } from "@embedpdf/plugin-scroll";
|
|
4
4
|
export * from "@embedpdf/plugin-scroll";
|
|
5
5
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
6
6
|
const useScrollPlugin = () => usePlugin(ScrollPlugin.id);
|
|
7
7
|
const useScrollCapability = () => useCapability(ScrollPlugin.id);
|
|
8
|
-
const useScroll = () => {
|
|
8
|
+
const useScroll = (documentId) => {
|
|
9
9
|
const { provides } = useScrollCapability();
|
|
10
10
|
const [currentPage, setCurrentPage] = useState(1);
|
|
11
11
|
const [totalPages, setTotalPages] = useState(1);
|
|
12
12
|
useEffect(() => {
|
|
13
|
-
if (!provides) return;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
if (!provides || !documentId) return;
|
|
14
|
+
const scope = provides.forDocument(documentId);
|
|
15
|
+
setCurrentPage(scope.getCurrentPage());
|
|
16
|
+
setTotalPages(scope.getTotalPages());
|
|
17
|
+
return provides.onPageChange((event) => {
|
|
18
|
+
if (event.documentId === documentId) {
|
|
19
|
+
setCurrentPage(event.pageNumber);
|
|
20
|
+
setTotalPages(event.totalPages);
|
|
21
|
+
}
|
|
17
22
|
});
|
|
18
|
-
}, [provides]);
|
|
23
|
+
}, [provides, documentId]);
|
|
19
24
|
return {
|
|
20
25
|
// New format (preferred)
|
|
21
|
-
provides,
|
|
26
|
+
provides: (provides == null ? void 0 : provides.forDocument(documentId)) ?? null,
|
|
22
27
|
state: {
|
|
23
28
|
currentPage,
|
|
24
29
|
totalPages
|
|
25
|
-
},
|
|
26
|
-
// Deprecated properties with getters that show warnings
|
|
27
|
-
get currentPage() {
|
|
28
|
-
console.warn(
|
|
29
|
-
`Accessing 'currentPage' directly on useScroll() is deprecated. Use useScroll().state.currentPage instead.`
|
|
30
|
-
);
|
|
31
|
-
return currentPage;
|
|
32
|
-
},
|
|
33
|
-
get totalPages() {
|
|
34
|
-
console.warn(
|
|
35
|
-
`Accessing 'totalPages' directly on useScroll() is deprecated. Use useScroll().state.totalPages instead.`
|
|
36
|
-
);
|
|
37
|
-
return totalPages;
|
|
38
|
-
},
|
|
39
|
-
get scrollToPage() {
|
|
40
|
-
if (provides == null ? void 0 : provides.scrollToPage) {
|
|
41
|
-
console.warn(
|
|
42
|
-
`Accessing 'scrollToPage' directly on useScroll() is deprecated. Use useScroll().provides.scrollToPage instead.`
|
|
43
|
-
);
|
|
44
|
-
}
|
|
45
|
-
return provides == null ? void 0 : provides.scrollToPage;
|
|
46
|
-
},
|
|
47
|
-
get scrollToNextPage() {
|
|
48
|
-
if (provides == null ? void 0 : provides.scrollToNextPage) {
|
|
49
|
-
console.warn(
|
|
50
|
-
`Accessing 'scrollToNextPage' directly on useScroll() is deprecated. Use useScroll().provides.scrollToNextPage instead.`
|
|
51
|
-
);
|
|
52
|
-
}
|
|
53
|
-
return provides == null ? void 0 : provides.scrollToNextPage;
|
|
54
|
-
},
|
|
55
|
-
get scrollToPreviousPage() {
|
|
56
|
-
if (provides == null ? void 0 : provides.scrollToPreviousPage) {
|
|
57
|
-
console.warn(
|
|
58
|
-
`Accessing 'scrollToPreviousPage' directly on useScroll() is deprecated. Use useScroll().provides.scrollToPreviousPage instead.`
|
|
59
|
-
);
|
|
60
|
-
}
|
|
61
|
-
return provides == null ? void 0 : provides.scrollToPreviousPage;
|
|
62
|
-
},
|
|
63
|
-
get getMetrics() {
|
|
64
|
-
if (provides == null ? void 0 : provides.getMetrics) {
|
|
65
|
-
console.warn(
|
|
66
|
-
`Accessing 'getMetrics' directly on useScroll() is deprecated. Use useScroll().provides.getMetrics instead.`
|
|
67
|
-
);
|
|
68
|
-
}
|
|
69
|
-
return provides == null ? void 0 : provides.getMetrics;
|
|
70
|
-
},
|
|
71
|
-
get onPageChange() {
|
|
72
|
-
if (provides == null ? void 0 : provides.onPageChange) {
|
|
73
|
-
console.warn(
|
|
74
|
-
`Accessing 'onPageChange' directly on useScroll() is deprecated. Use useScroll().provides.onPageChange instead.`
|
|
75
|
-
);
|
|
76
|
-
}
|
|
77
|
-
return provides == null ? void 0 : provides.onPageChange;
|
|
78
|
-
},
|
|
79
|
-
get onScroll() {
|
|
80
|
-
if (provides == null ? void 0 : provides.onScroll) {
|
|
81
|
-
console.warn(
|
|
82
|
-
`Accessing 'onScroll' directly on useScroll() is deprecated. Use useScroll().provides.onScroll instead.`
|
|
83
|
-
);
|
|
84
|
-
}
|
|
85
|
-
return provides == null ? void 0 : provides.onScroll;
|
|
86
|
-
},
|
|
87
|
-
get onLayoutChange() {
|
|
88
|
-
if (provides == null ? void 0 : provides.onLayoutChange) {
|
|
89
|
-
console.warn(
|
|
90
|
-
`Accessing 'onLayoutChange' directly on useScroll() is deprecated. Use useScroll().provides.onLayoutChange instead.`
|
|
91
|
-
);
|
|
92
|
-
}
|
|
93
|
-
return provides == null ? void 0 : provides.onLayoutChange;
|
|
94
|
-
},
|
|
95
|
-
get getCurrentPage() {
|
|
96
|
-
if (provides == null ? void 0 : provides.getCurrentPage) {
|
|
97
|
-
console.warn(
|
|
98
|
-
`Accessing 'getCurrentPage' directly on useScroll() is deprecated. Use useScroll().provides.getCurrentPage instead.`
|
|
99
|
-
);
|
|
100
|
-
}
|
|
101
|
-
return provides == null ? void 0 : provides.getCurrentPage;
|
|
102
|
-
},
|
|
103
|
-
get getTotalPages() {
|
|
104
|
-
if (provides == null ? void 0 : provides.getTotalPages) {
|
|
105
|
-
console.warn(
|
|
106
|
-
`Accessing 'getTotalPages' directly on useScroll() is deprecated. Use useScroll().provides.getTotalPages instead.`
|
|
107
|
-
);
|
|
108
|
-
}
|
|
109
|
-
return provides == null ? void 0 : provides.getTotalPages;
|
|
110
30
|
}
|
|
111
31
|
};
|
|
112
32
|
};
|
|
113
|
-
function Scroller({
|
|
33
|
+
function Scroller({ documentId, renderPage, ...props }) {
|
|
114
34
|
const { plugin: scrollPlugin } = useScrollPlugin();
|
|
115
|
-
const {
|
|
116
|
-
const [scrollerLayout, setScrollerLayout] = useState(
|
|
117
|
-
() => (scrollPlugin == null ? void 0 : scrollPlugin.getScrollerLayout()) ?? null
|
|
118
|
-
);
|
|
35
|
+
const [layoutData, setLayoutData] = useState({ layout: null, docId: null });
|
|
119
36
|
useEffect(() => {
|
|
120
|
-
if (!scrollPlugin) return;
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
37
|
+
if (!scrollPlugin || !documentId) return;
|
|
38
|
+
const unsubscribe = scrollPlugin.onScrollerData(documentId, (newLayout) => {
|
|
39
|
+
setLayoutData({ layout: newLayout, docId: documentId });
|
|
40
|
+
});
|
|
41
|
+
return () => {
|
|
42
|
+
unsubscribe();
|
|
43
|
+
setLayoutData({ layout: null, docId: null });
|
|
44
|
+
scrollPlugin.clearLayoutReady(documentId);
|
|
45
|
+
};
|
|
46
|
+
}, [scrollPlugin, documentId]);
|
|
47
|
+
const scrollerLayout = layoutData.docId === documentId ? layoutData.layout : null;
|
|
48
|
+
useLayoutEffect(() => {
|
|
49
|
+
if (!scrollPlugin || !documentId || !scrollerLayout) return;
|
|
50
|
+
scrollPlugin.setLayoutReady(documentId);
|
|
51
|
+
}, [scrollPlugin, documentId, scrollerLayout]);
|
|
127
52
|
if (!scrollerLayout) return null;
|
|
128
|
-
if (!registry) return null;
|
|
129
|
-
const coreState = registry.getStore().getState();
|
|
130
53
|
return /* @__PURE__ */ jsxs(
|
|
131
54
|
"div",
|
|
132
55
|
{
|
|
@@ -191,10 +114,7 @@ function Scroller({ renderPage, overlayElements, ...props }) {
|
|
|
191
114
|
height: `${layout.rotatedHeight}px`
|
|
192
115
|
},
|
|
193
116
|
children: renderPage({
|
|
194
|
-
...layout
|
|
195
|
-
rotation: coreState.core.rotation,
|
|
196
|
-
scale: coreState.core.scale,
|
|
197
|
-
document: coreState.core.document
|
|
117
|
+
...layout
|
|
198
118
|
})
|
|
199
119
|
},
|
|
200
120
|
layout.pageNumber
|
|
@@ -218,8 +138,7 @@ function Scroller({ renderPage, overlayElements, ...props }) {
|
|
|
218
138
|
}
|
|
219
139
|
}
|
|
220
140
|
}
|
|
221
|
-
)
|
|
222
|
-
overlayElements
|
|
141
|
+
)
|
|
223
142
|
]
|
|
224
143
|
}
|
|
225
144
|
);
|
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/shared/hooks/use-scroll.ts","../../src/shared/components/scroller.tsx"],"sourcesContent":["import { useState, useEffect } from '@framework';\nimport { useCapability, usePlugin } from '@embedpdf/core/@framework';\nimport { ScrollCapability, ScrollPlugin } from '@embedpdf/plugin-scroll';\n\nexport const useScrollPlugin = () => usePlugin<ScrollPlugin>(ScrollPlugin.id);\nexport const useScrollCapability = () => useCapability<ScrollPlugin>(ScrollPlugin.id);\n\n// Define the return type explicitly to maintain type safety\ninterface UseScrollReturn {\n provides: ScrollCapability | null;\n state: {\n currentPage: number;\n totalPages: number;\n };\n // Deprecated properties (for backward compatibility)\n readonly currentPage: number;\n readonly totalPages: number;\n readonly scrollToPage: ScrollCapability['scrollToPage'] | undefined;\n readonly scrollToNextPage: ScrollCapability['scrollToNextPage'] | undefined;\n readonly scrollToPreviousPage: ScrollCapability['scrollToPreviousPage'] | undefined;\n readonly getMetrics: ScrollCapability['getMetrics'] | undefined;\n readonly onPageChange: ScrollCapability['onPageChange'] | undefined;\n readonly onScroll: ScrollCapability['onScroll'] | undefined;\n readonly onLayoutChange: ScrollCapability['onLayoutChange'] | undefined;\n readonly getCurrentPage: ScrollCapability['getCurrentPage'] | undefined;\n readonly getTotalPages: ScrollCapability['getTotalPages'] | undefined;\n}\n\nexport const useScroll = (): UseScrollReturn => {\n const { provides } = useScrollCapability();\n const [currentPage, setCurrentPage] = useState(1);\n const [totalPages, setTotalPages] = useState(1);\n\n useEffect(() => {\n if (!provides) return;\n return provides.onPageChange(({ pageNumber, totalPages }) => {\n setCurrentPage(pageNumber);\n setTotalPages(totalPages);\n });\n }, [provides]);\n\n return {\n // New format (preferred)\n provides,\n state: {\n currentPage,\n totalPages,\n },\n\n // Deprecated properties with getters that show warnings\n get currentPage() {\n console.warn(\n `Accessing 'currentPage' directly on useScroll() is deprecated. Use useScroll().state.currentPage instead.`,\n );\n return currentPage;\n },\n\n get totalPages() {\n console.warn(\n `Accessing 'totalPages' directly on useScroll() is deprecated. Use useScroll().state.totalPages instead.`,\n );\n return totalPages;\n },\n\n get scrollToPage() {\n if (provides?.scrollToPage) {\n console.warn(\n `Accessing 'scrollToPage' directly on useScroll() is deprecated. Use useScroll().provides.scrollToPage instead.`,\n );\n }\n return provides?.scrollToPage;\n },\n\n get scrollToNextPage() {\n if (provides?.scrollToNextPage) {\n console.warn(\n `Accessing 'scrollToNextPage' directly on useScroll() is deprecated. Use useScroll().provides.scrollToNextPage instead.`,\n );\n }\n return provides?.scrollToNextPage;\n },\n\n get scrollToPreviousPage() {\n if (provides?.scrollToPreviousPage) {\n console.warn(\n `Accessing 'scrollToPreviousPage' directly on useScroll() is deprecated. Use useScroll().provides.scrollToPreviousPage instead.`,\n );\n }\n return provides?.scrollToPreviousPage;\n },\n\n get getMetrics() {\n if (provides?.getMetrics) {\n console.warn(\n `Accessing 'getMetrics' directly on useScroll() is deprecated. Use useScroll().provides.getMetrics instead.`,\n );\n }\n return provides?.getMetrics;\n },\n\n get onPageChange() {\n if (provides?.onPageChange) {\n console.warn(\n `Accessing 'onPageChange' directly on useScroll() is deprecated. Use useScroll().provides.onPageChange instead.`,\n );\n }\n return provides?.onPageChange;\n },\n\n get onScroll() {\n if (provides?.onScroll) {\n console.warn(\n `Accessing 'onScroll' directly on useScroll() is deprecated. Use useScroll().provides.onScroll instead.`,\n );\n }\n return provides?.onScroll;\n },\n\n get onLayoutChange() {\n if (provides?.onLayoutChange) {\n console.warn(\n `Accessing 'onLayoutChange' directly on useScroll() is deprecated. Use useScroll().provides.onLayoutChange instead.`,\n );\n }\n return provides?.onLayoutChange;\n },\n\n get getCurrentPage() {\n if (provides?.getCurrentPage) {\n console.warn(\n `Accessing 'getCurrentPage' directly on useScroll() is deprecated. Use useScroll().provides.getCurrentPage instead.`,\n );\n }\n return provides?.getCurrentPage;\n },\n\n get getTotalPages() {\n if (provides?.getTotalPages) {\n console.warn(\n `Accessing 'getTotalPages' directly on useScroll() is deprecated. Use useScroll().provides.getTotalPages instead.`,\n );\n }\n return provides?.getTotalPages;\n },\n };\n};\n","import { ReactNode, useEffect, useState, HTMLAttributes } from '@framework';\nimport { ScrollStrategy, ScrollerLayout } from '@embedpdf/plugin-scroll';\nimport { useRegistry } from '@embedpdf/core/@framework';\n\nimport { useScrollPlugin } from '../hooks';\nimport { RenderPageProps } from '../types';\n\ntype ScrollerProps = HTMLAttributes<HTMLDivElement> & {\n renderPage: (props: RenderPageProps) => ReactNode;\n overlayElements?: ReactNode[];\n};\n\nexport function Scroller({ renderPage, overlayElements, ...props }: ScrollerProps) {\n const { plugin: scrollPlugin } = useScrollPlugin();\n const { registry } = useRegistry();\n const [scrollerLayout, setScrollerLayout] = useState<ScrollerLayout | null>(\n () => scrollPlugin?.getScrollerLayout() ?? null,\n );\n\n useEffect(() => {\n if (!scrollPlugin) return;\n\n return scrollPlugin.onScrollerData(setScrollerLayout);\n }, [scrollPlugin]);\n\n useEffect(() => {\n if (!scrollPlugin) return;\n\n scrollPlugin.setLayoutReady();\n }, [scrollPlugin]);\n\n if (!scrollerLayout) return null;\n if (!registry) return null;\n\n const coreState = registry.getStore().getState();\n\n return (\n <div\n {...props}\n style={{\n width: `${scrollerLayout.totalWidth}px`,\n height: `${scrollerLayout.totalHeight}px`,\n position: 'relative',\n boxSizing: 'border-box',\n margin: '0 auto',\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal && {\n display: 'flex',\n flexDirection: 'row',\n }),\n }}\n >\n <div\n style={{\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n width: scrollerLayout.startSpacing,\n height: '100%',\n flexShrink: 0,\n }\n : {\n height: scrollerLayout.startSpacing,\n width: '100%',\n }),\n }}\n />\n <div\n style={{\n gap: scrollerLayout.pageGap,\n display: 'flex',\n alignItems: 'center',\n position: 'relative',\n boxSizing: 'border-box',\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n flexDirection: 'row',\n minHeight: '100%',\n }\n : {\n flexDirection: 'column',\n minWidth: 'fit-content',\n }),\n }}\n >\n {scrollerLayout.items.map((item) => (\n <div\n key={item.pageNumbers[0]}\n style={{\n display: 'flex',\n justifyContent: 'center',\n gap: scrollerLayout.pageGap,\n }}\n >\n {item.pageLayouts.map((layout) => (\n <div\n key={layout.pageNumber}\n style={{\n width: `${layout.rotatedWidth}px`,\n height: `${layout.rotatedHeight}px`,\n }}\n >\n {renderPage({\n ...layout,\n rotation: coreState.core.rotation,\n scale: coreState.core.scale,\n document: coreState.core.document,\n })}\n </div>\n ))}\n </div>\n ))}\n </div>\n <div\n style={{\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n width: scrollerLayout.endSpacing,\n height: '100%',\n flexShrink: 0,\n }\n : {\n height: scrollerLayout.endSpacing,\n width: '100%',\n }),\n }}\n />\n {overlayElements}\n </div>\n );\n}\n"],"names":["totalPages"],"mappings":";;;;;AAIO,MAAM,kBAAkB,MAAM,UAAwB,aAAa,EAAE;AACrE,MAAM,sBAAsB,MAAM,cAA4B,aAAa,EAAE;AAuB7E,MAAM,YAAY,MAAuB;AACxC,QAAA,EAAE,SAAS,IAAI,oBAAoB;AACzC,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,CAAC;AAChD,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,CAAC;AAE9C,YAAU,MAAM;AACd,QAAI,CAAC,SAAU;AACf,WAAO,SAAS,aAAa,CAAC,EAAE,YAAY,YAAAA,kBAAiB;AAC3D,qBAAe,UAAU;AACzB,oBAAcA,WAAU;AAAA,IAAA,CACzB;AAAA,EAAA,GACA,CAAC,QAAQ,CAAC;AAEN,SAAA;AAAA;AAAA,IAEL;AAAA,IACA,OAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA;AAAA,IAGA,IAAI,cAAc;AACR,cAAA;AAAA,QACN;AAAA,MACF;AACO,aAAA;AAAA,IACT;AAAA,IAEA,IAAI,aAAa;AACP,cAAA;AAAA,QACN;AAAA,MACF;AACO,aAAA;AAAA,IACT;AAAA,IAEA,IAAI,eAAe;AACjB,UAAI,qCAAU,cAAc;AAClB,gBAAA;AAAA,UACN;AAAA,QACF;AAAA,MAAA;AAEF,aAAO,qCAAU;AAAA,IACnB;AAAA,IAEA,IAAI,mBAAmB;AACrB,UAAI,qCAAU,kBAAkB;AACtB,gBAAA;AAAA,UACN;AAAA,QACF;AAAA,MAAA;AAEF,aAAO,qCAAU;AAAA,IACnB;AAAA,IAEA,IAAI,uBAAuB;AACzB,UAAI,qCAAU,sBAAsB;AAC1B,gBAAA;AAAA,UACN;AAAA,QACF;AAAA,MAAA;AAEF,aAAO,qCAAU;AAAA,IACnB;AAAA,IAEA,IAAI,aAAa;AACf,UAAI,qCAAU,YAAY;AAChB,gBAAA;AAAA,UACN;AAAA,QACF;AAAA,MAAA;AAEF,aAAO,qCAAU;AAAA,IACnB;AAAA,IAEA,IAAI,eAAe;AACjB,UAAI,qCAAU,cAAc;AAClB,gBAAA;AAAA,UACN;AAAA,QACF;AAAA,MAAA;AAEF,aAAO,qCAAU;AAAA,IACnB;AAAA,IAEA,IAAI,WAAW;AACb,UAAI,qCAAU,UAAU;AACd,gBAAA;AAAA,UACN;AAAA,QACF;AAAA,MAAA;AAEF,aAAO,qCAAU;AAAA,IACnB;AAAA,IAEA,IAAI,iBAAiB;AACnB,UAAI,qCAAU,gBAAgB;AACpB,gBAAA;AAAA,UACN;AAAA,QACF;AAAA,MAAA;AAEF,aAAO,qCAAU;AAAA,IACnB;AAAA,IAEA,IAAI,iBAAiB;AACnB,UAAI,qCAAU,gBAAgB;AACpB,gBAAA;AAAA,UACN;AAAA,QACF;AAAA,MAAA;AAEF,aAAO,qCAAU;AAAA,IACnB;AAAA,IAEA,IAAI,gBAAgB;AAClB,UAAI,qCAAU,eAAe;AACnB,gBAAA;AAAA,UACN;AAAA,QACF;AAAA,MAAA;AAEF,aAAO,qCAAU;AAAA,IAAA;AAAA,EAErB;AACF;ACrIO,SAAS,SAAS,EAAE,YAAY,iBAAiB,GAAG,SAAwB;AACjF,QAAM,EAAE,QAAQ,aAAa,IAAI,gBAAgB;AAC3C,QAAA,EAAE,SAAS,IAAI,YAAY;AAC3B,QAAA,CAAC,gBAAgB,iBAAiB,IAAI;AAAA,IAC1C,OAAM,6CAAc,wBAAuB;AAAA,EAC7C;AAEA,YAAU,MAAM;AACd,QAAI,CAAC,aAAc;AAEZ,WAAA,aAAa,eAAe,iBAAiB;AAAA,EAAA,GACnD,CAAC,YAAY,CAAC;AAEjB,YAAU,MAAM;AACd,QAAI,CAAC,aAAc;AAEnB,iBAAa,eAAe;AAAA,EAAA,GAC3B,CAAC,YAAY,CAAC;AAEb,MAAA,CAAC,eAAuB,QAAA;AACxB,MAAA,CAAC,SAAiB,QAAA;AAEtB,QAAM,YAAY,SAAS,SAAS,EAAE,SAAS;AAG7C,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACE,GAAG;AAAA,MACJ,OAAO;AAAA,QACL,OAAO,GAAG,eAAe,UAAU;AAAA,QACnC,QAAQ,GAAG,eAAe,WAAW;AAAA,QACrC,UAAU;AAAA,QACV,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,GAAI,eAAe,aAAa,eAAe,cAAc;AAAA,UAC3D,SAAS;AAAA,UACT,eAAe;AAAA,QAAA;AAAA,MAEnB;AAAA,MAEA,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO;AAAA,cACL,GAAI,eAAe,aAAa,eAAe,aAC3C;AAAA,gBACE,OAAO,eAAe;AAAA,gBACtB,QAAQ;AAAA,gBACR,YAAY;AAAA,cAAA,IAEd;AAAA,gBACE,QAAQ,eAAe;AAAA,gBACvB,OAAO;AAAA,cAAA;AAAA,YACT;AAAA,UACN;AAAA,QACF;AAAA,QACA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO;AAAA,cACL,KAAK,eAAe;AAAA,cACpB,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,WAAW;AAAA,cACX,GAAI,eAAe,aAAa,eAAe,aAC3C;AAAA,gBACE,eAAe;AAAA,gBACf,WAAW;AAAA,cAAA,IAEb;AAAA,gBACE,eAAe;AAAA,gBACf,UAAU;AAAA,cAAA;AAAA,YAElB;AAAA,YAEC,UAAe,eAAA,MAAM,IAAI,CAAC,SACzB;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,gBAAgB;AAAA,kBAChB,KAAK,eAAe;AAAA,gBACtB;AAAA,gBAEC,UAAK,KAAA,YAAY,IAAI,CAAC,WACrB;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBAEC,OAAO;AAAA,sBACL,OAAO,GAAG,OAAO,YAAY;AAAA,sBAC7B,QAAQ,GAAG,OAAO,aAAa;AAAA,oBACjC;AAAA,oBAEC,UAAW,WAAA;AAAA,sBACV,GAAG;AAAA,sBACH,UAAU,UAAU,KAAK;AAAA,sBACzB,OAAO,UAAU,KAAK;AAAA,sBACtB,UAAU,UAAU,KAAK;AAAA,oBAC1B,CAAA;AAAA,kBAAA;AAAA,kBAXI,OAAO;AAAA,gBAaf,CAAA;AAAA,cAAA;AAAA,cAtBI,KAAK,YAAY,CAAC;AAAA,YAwB1B,CAAA;AAAA,UAAA;AAAA,QACH;AAAA,QACA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO;AAAA,cACL,GAAI,eAAe,aAAa,eAAe,aAC3C;AAAA,gBACE,OAAO,eAAe;AAAA,gBACtB,QAAQ;AAAA,gBACR,YAAY;AAAA,cAAA,IAEd;AAAA,gBACE,QAAQ,eAAe;AAAA,gBACvB,OAAO;AAAA,cAAA;AAAA,YACT;AAAA,UACN;AAAA,QACF;AAAA,QACC;AAAA,MAAA;AAAA,IAAA;AAAA,EACH;AAEJ;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/shared/hooks/use-scroll.ts","../../src/shared/components/scroller.tsx"],"sourcesContent":["import { useState, useEffect } from '@framework';\nimport { useCapability, usePlugin } from '@embedpdf/core/@framework';\nimport { ScrollPlugin, ScrollScope } from '@embedpdf/plugin-scroll';\n\nexport const useScrollPlugin = () => usePlugin<ScrollPlugin>(ScrollPlugin.id);\nexport const useScrollCapability = () => useCapability<ScrollPlugin>(ScrollPlugin.id);\n\n// Define the return type explicitly to maintain type safety\ninterface UseScrollReturn {\n provides: ScrollScope | null;\n state: {\n currentPage: number;\n totalPages: number;\n };\n}\n\nexport const useScroll = (documentId: string): UseScrollReturn => {\n const { provides } = useScrollCapability();\n const [currentPage, setCurrentPage] = useState(1);\n const [totalPages, setTotalPages] = useState(1);\n\n useEffect(() => {\n if (!provides || !documentId) return;\n\n const scope = provides.forDocument(documentId);\n setCurrentPage(scope.getCurrentPage());\n setTotalPages(scope.getTotalPages());\n\n return provides.onPageChange((event) => {\n if (event.documentId === documentId) {\n setCurrentPage(event.pageNumber);\n setTotalPages(event.totalPages);\n }\n });\n }, [provides, documentId]);\n\n return {\n // New format (preferred)\n provides: provides?.forDocument(documentId) ?? null,\n state: {\n currentPage,\n totalPages,\n },\n };\n};\n","import { ReactNode, useEffect, useState, HTMLAttributes, useLayoutEffect } from '@framework';\nimport { ScrollStrategy, ScrollerLayout, PageLayout } from '@embedpdf/plugin-scroll';\n\nimport { useScrollPlugin } from '../hooks';\n\ntype ScrollerProps = HTMLAttributes<HTMLDivElement> & {\n documentId: string;\n renderPage: (props: PageLayout) => ReactNode;\n};\n\nexport function Scroller({ documentId, renderPage, ...props }: ScrollerProps) {\n const { plugin: scrollPlugin } = useScrollPlugin();\n const [layoutData, setLayoutData] = useState<{\n layout: ScrollerLayout | null;\n docId: string | null;\n }>({ layout: null, docId: null });\n\n useEffect(() => {\n if (!scrollPlugin || !documentId) return;\n\n // When we get new data, store it along with the current documentId\n const unsubscribe = scrollPlugin.onScrollerData(documentId, (newLayout) => {\n setLayoutData({ layout: newLayout, docId: documentId });\n });\n\n // When the component unmounts or documentId changes, clear the state\n return () => {\n unsubscribe();\n setLayoutData({ layout: null, docId: null });\n scrollPlugin.clearLayoutReady(documentId);\n };\n }, [scrollPlugin, documentId]);\n\n const scrollerLayout = layoutData.docId === documentId ? layoutData.layout : null;\n\n useLayoutEffect(() => {\n if (!scrollPlugin || !documentId || !scrollerLayout) return;\n\n scrollPlugin.setLayoutReady(documentId);\n }, [scrollPlugin, documentId, scrollerLayout]);\n\n if (!scrollerLayout) return null;\n\n return (\n <div\n {...props}\n style={{\n width: `${scrollerLayout.totalWidth}px`,\n height: `${scrollerLayout.totalHeight}px`,\n position: 'relative',\n boxSizing: 'border-box',\n margin: '0 auto',\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal && {\n display: 'flex',\n flexDirection: 'row',\n }),\n }}\n >\n <div\n style={{\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n width: scrollerLayout.startSpacing,\n height: '100%',\n flexShrink: 0,\n }\n : {\n height: scrollerLayout.startSpacing,\n width: '100%',\n }),\n }}\n />\n <div\n style={{\n gap: scrollerLayout.pageGap,\n display: 'flex',\n alignItems: 'center',\n position: 'relative',\n boxSizing: 'border-box',\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n flexDirection: 'row',\n minHeight: '100%',\n }\n : {\n flexDirection: 'column',\n minWidth: 'fit-content',\n }),\n }}\n >\n {scrollerLayout.items.map((item) => (\n <div\n key={item.pageNumbers[0]}\n style={{\n display: 'flex',\n justifyContent: 'center',\n gap: scrollerLayout.pageGap,\n }}\n >\n {item.pageLayouts.map((layout) => (\n <div\n key={layout.pageNumber}\n style={{\n width: `${layout.rotatedWidth}px`,\n height: `${layout.rotatedHeight}px`,\n }}\n >\n {renderPage({\n ...layout,\n })}\n </div>\n ))}\n </div>\n ))}\n </div>\n <div\n style={{\n ...(scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? {\n width: scrollerLayout.endSpacing,\n height: '100%',\n flexShrink: 0,\n }\n : {\n height: scrollerLayout.endSpacing,\n width: '100%',\n }),\n }}\n />\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ReactNode, HTMLAttributes } from '../../react/adapter.ts';
|
|
2
|
-
import {
|
|
2
|
+
import { PageLayout } from '../../index.ts';
|
|
3
3
|
type ScrollerProps = HTMLAttributes<HTMLDivElement> & {
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
documentId: string;
|
|
5
|
+
renderPage: (props: PageLayout) => ReactNode;
|
|
6
6
|
};
|
|
7
|
-
export declare function Scroller({
|
|
7
|
+
export declare function Scroller({ documentId, renderPage, ...props }: ScrollerProps): import("react/jsx-runtime").JSX.Element | null;
|
|
8
8
|
export {};
|
|
@@ -1,31 +1,20 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ScrollPlugin, ScrollScope } from '../../index.ts';
|
|
2
2
|
export declare const useScrollPlugin: () => {
|
|
3
3
|
plugin: ScrollPlugin | null;
|
|
4
4
|
isLoading: boolean;
|
|
5
5
|
ready: Promise<void>;
|
|
6
6
|
};
|
|
7
7
|
export declare const useScrollCapability: () => {
|
|
8
|
-
provides: Readonly<ScrollCapability> | null;
|
|
8
|
+
provides: Readonly<import('../../index.ts').ScrollCapability> | null;
|
|
9
9
|
isLoading: boolean;
|
|
10
10
|
ready: Promise<void>;
|
|
11
11
|
};
|
|
12
12
|
interface UseScrollReturn {
|
|
13
|
-
provides:
|
|
13
|
+
provides: ScrollScope | null;
|
|
14
14
|
state: {
|
|
15
15
|
currentPage: number;
|
|
16
16
|
totalPages: number;
|
|
17
17
|
};
|
|
18
|
-
readonly currentPage: number;
|
|
19
|
-
readonly totalPages: number;
|
|
20
|
-
readonly scrollToPage: ScrollCapability['scrollToPage'] | undefined;
|
|
21
|
-
readonly scrollToNextPage: ScrollCapability['scrollToNextPage'] | undefined;
|
|
22
|
-
readonly scrollToPreviousPage: ScrollCapability['scrollToPreviousPage'] | undefined;
|
|
23
|
-
readonly getMetrics: ScrollCapability['getMetrics'] | undefined;
|
|
24
|
-
readonly onPageChange: ScrollCapability['onPageChange'] | undefined;
|
|
25
|
-
readonly onScroll: ScrollCapability['onScroll'] | undefined;
|
|
26
|
-
readonly onLayoutChange: ScrollCapability['onLayoutChange'] | undefined;
|
|
27
|
-
readonly getCurrentPage: ScrollCapability['getCurrentPage'] | undefined;
|
|
28
|
-
readonly getTotalPages: ScrollCapability['getTotalPages'] | undefined;
|
|
29
18
|
}
|
|
30
|
-
export declare const useScroll: () => UseScrollReturn;
|
|
19
|
+
export declare const useScroll: (documentId: string) => UseScrollReturn;
|
|
31
20
|
export {};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ReactNode, HTMLAttributes } from '../../preact/adapter.ts';
|
|
2
|
-
import {
|
|
2
|
+
import { PageLayout } from '../../lib/index.ts';
|
|
3
3
|
type ScrollerProps = HTMLAttributes<HTMLDivElement> & {
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
documentId: string;
|
|
5
|
+
renderPage: (props: PageLayout) => ReactNode;
|
|
6
6
|
};
|
|
7
|
-
export declare function Scroller({
|
|
7
|
+
export declare function Scroller({ documentId, renderPage, ...props }: ScrollerProps): import("preact").JSX.Element | null;
|
|
8
8
|
export {};
|
|
@@ -1,31 +1,20 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ScrollPlugin, ScrollScope } from '../../lib/index.ts';
|
|
2
2
|
export declare const useScrollPlugin: () => {
|
|
3
3
|
plugin: ScrollPlugin | null;
|
|
4
4
|
isLoading: boolean;
|
|
5
5
|
ready: Promise<void>;
|
|
6
6
|
};
|
|
7
7
|
export declare const useScrollCapability: () => {
|
|
8
|
-
provides: Readonly<ScrollCapability> | null;
|
|
8
|
+
provides: Readonly<import('../../lib/index.ts').ScrollCapability> | null;
|
|
9
9
|
isLoading: boolean;
|
|
10
10
|
ready: Promise<void>;
|
|
11
11
|
};
|
|
12
12
|
interface UseScrollReturn {
|
|
13
|
-
provides:
|
|
13
|
+
provides: ScrollScope | null;
|
|
14
14
|
state: {
|
|
15
15
|
currentPage: number;
|
|
16
16
|
totalPages: number;
|
|
17
17
|
};
|
|
18
|
-
readonly currentPage: number;
|
|
19
|
-
readonly totalPages: number;
|
|
20
|
-
readonly scrollToPage: ScrollCapability['scrollToPage'] | undefined;
|
|
21
|
-
readonly scrollToNextPage: ScrollCapability['scrollToNextPage'] | undefined;
|
|
22
|
-
readonly scrollToPreviousPage: ScrollCapability['scrollToPreviousPage'] | undefined;
|
|
23
|
-
readonly getMetrics: ScrollCapability['getMetrics'] | undefined;
|
|
24
|
-
readonly onPageChange: ScrollCapability['onPageChange'] | undefined;
|
|
25
|
-
readonly onScroll: ScrollCapability['onScroll'] | undefined;
|
|
26
|
-
readonly onLayoutChange: ScrollCapability['onLayoutChange'] | undefined;
|
|
27
|
-
readonly getCurrentPage: ScrollCapability['getCurrentPage'] | undefined;
|
|
28
|
-
readonly getTotalPages: ScrollCapability['getTotalPages'] | undefined;
|
|
29
18
|
}
|
|
30
|
-
export declare const useScroll: () => UseScrollReturn;
|
|
19
|
+
export declare const useScroll: (documentId: string) => UseScrollReturn;
|
|
31
20
|
export {};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ReactNode, HTMLAttributes } from '../../react/adapter.ts';
|
|
2
|
-
import {
|
|
2
|
+
import { PageLayout } from '../../lib/index.ts';
|
|
3
3
|
type ScrollerProps = HTMLAttributes<HTMLDivElement> & {
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
documentId: string;
|
|
5
|
+
renderPage: (props: PageLayout) => ReactNode;
|
|
6
6
|
};
|
|
7
|
-
export declare function Scroller({
|
|
7
|
+
export declare function Scroller({ documentId, renderPage, ...props }: ScrollerProps): import("react/jsx-runtime").JSX.Element | null;
|
|
8
8
|
export {};
|
|
@@ -1,31 +1,20 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ScrollPlugin, ScrollScope } from '../../lib/index.ts';
|
|
2
2
|
export declare const useScrollPlugin: () => {
|
|
3
3
|
plugin: ScrollPlugin | null;
|
|
4
4
|
isLoading: boolean;
|
|
5
5
|
ready: Promise<void>;
|
|
6
6
|
};
|
|
7
7
|
export declare const useScrollCapability: () => {
|
|
8
|
-
provides: Readonly<ScrollCapability> | null;
|
|
8
|
+
provides: Readonly<import('../../lib/index.ts').ScrollCapability> | null;
|
|
9
9
|
isLoading: boolean;
|
|
10
10
|
ready: Promise<void>;
|
|
11
11
|
};
|
|
12
12
|
interface UseScrollReturn {
|
|
13
|
-
provides:
|
|
13
|
+
provides: ScrollScope | null;
|
|
14
14
|
state: {
|
|
15
15
|
currentPage: number;
|
|
16
16
|
totalPages: number;
|
|
17
17
|
};
|
|
18
|
-
readonly currentPage: number;
|
|
19
|
-
readonly totalPages: number;
|
|
20
|
-
readonly scrollToPage: ScrollCapability['scrollToPage'] | undefined;
|
|
21
|
-
readonly scrollToNextPage: ScrollCapability['scrollToNextPage'] | undefined;
|
|
22
|
-
readonly scrollToPreviousPage: ScrollCapability['scrollToPreviousPage'] | undefined;
|
|
23
|
-
readonly getMetrics: ScrollCapability['getMetrics'] | undefined;
|
|
24
|
-
readonly onPageChange: ScrollCapability['onPageChange'] | undefined;
|
|
25
|
-
readonly onScroll: ScrollCapability['onScroll'] | undefined;
|
|
26
|
-
readonly onLayoutChange: ScrollCapability['onLayoutChange'] | undefined;
|
|
27
|
-
readonly getCurrentPage: ScrollCapability['getCurrentPage'] | undefined;
|
|
28
|
-
readonly getTotalPages: ScrollCapability['getTotalPages'] | undefined;
|
|
29
18
|
}
|
|
30
|
-
export declare const useScroll: () => UseScrollReturn;
|
|
19
|
+
export declare const useScroll: (documentId: string) => UseScrollReturn;
|
|
31
20
|
export {};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { HTMLAttributes } from 'svelte/elements';
|
|
2
|
-
import { RenderPageProps } from '../../shared-svelte/types';
|
|
3
1
|
import { Snippet } from 'svelte';
|
|
2
|
+
import { HTMLAttributes } from 'svelte/elements';
|
|
3
|
+
import { PageLayout } from '../../lib/index.ts';
|
|
4
4
|
type ScrollerProps = HTMLAttributes<HTMLDivElement> & {
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
documentId: string;
|
|
6
|
+
renderPage: Snippet<[PageLayout]>;
|
|
7
7
|
};
|
|
8
8
|
declare const Scroller: import('svelte', { with: { "resolution-mode": "import" } }).Component<ScrollerProps, {}, "">;
|
|
9
9
|
type Scroller = ReturnType<typeof Scroller>;
|
|
@@ -1,18 +1,24 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ScrollPlugin, ScrollScope } from '../../lib/index.ts';
|
|
2
2
|
export declare const useScrollPlugin: () => {
|
|
3
3
|
plugin: ScrollPlugin | null;
|
|
4
4
|
isLoading: boolean;
|
|
5
5
|
ready: Promise<void>;
|
|
6
6
|
};
|
|
7
7
|
export declare const useScrollCapability: () => {
|
|
8
|
-
provides: Readonly<ScrollCapability> | null;
|
|
8
|
+
provides: Readonly<import('../../lib/index.ts').ScrollCapability> | null;
|
|
9
9
|
isLoading: boolean;
|
|
10
10
|
ready: Promise<void>;
|
|
11
11
|
};
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
interface UseScrollReturn {
|
|
13
|
+
provides: ScrollScope | null;
|
|
14
14
|
state: {
|
|
15
15
|
currentPage: number;
|
|
16
16
|
totalPages: number;
|
|
17
17
|
};
|
|
18
|
-
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Hook for scroll state for a specific document
|
|
21
|
+
* @param documentId Document ID.
|
|
22
|
+
*/
|
|
23
|
+
export declare const useScroll: (getDocumentId: () => string | null) => UseScrollReturn;
|
|
24
|
+
export {};
|
package/dist/svelte/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"}),require("svelte/internal/disclose-version");const e=require("svelte/internal/client"),t=require("@embedpdf/
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"}),require("svelte/internal/disclose-version");const e=require("svelte/internal/client"),t=require("@embedpdf/core/svelte"),r=require("@embedpdf/plugin-scroll");function o(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e)for(const r in e)if("default"!==r){const o=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,o.get?o:{enumerable:!0,get:()=>e[r]})}return t.default=e,Object.freeze(t)}const l=o(e),a=()=>t.usePlugin(r.ScrollPlugin.id),i=()=>t.useCapability(r.ScrollPlugin.id);var n=l.from_html("<div><!></div>"),g=l.from_html("<div></div>"),s=l.from_html("<div><div></div> <div></div> <div></div></div>");exports.Scroller=function(e,t){l.push(t,!0);let o=l.rest_props(t,["$$slots","$$events","$$legacy","documentId","renderPage"]);const{plugin:i}=a();let d=l.state(l.proxy({layout:null,docId:null}));l.user_effect(()=>{if(!i||!t.documentId)return void l.set(d,{layout:null,docId:null},!0);const e=i.onScrollerData(t.documentId,e=>{l.set(d,{layout:e,docId:t.documentId},!0)});return()=>{e(),l.set(d,{layout:null,docId:null},!0),i.clearLayoutReady(t.documentId)}});const c=l.derived(()=>l.get(d).docId===t.documentId?l.get(d).layout:null);l.user_pre_effect(()=>{i&&t.documentId&&l.get(c)&&i.setLayoutReady(t.documentId)});var u=l.comment(),p=l.first_child(u),y=e=>{var a=s();l.attribute_effect(a,()=>({...o,[l.STYLE]:{width:`${l.get(c).totalWidth}px`,height:`${l.get(c).totalHeight}px`,position:"relative","box-sizing":"border-box",margin:"0 auto",display:l.get(c).strategy===r.ScrollStrategy.Horizontal?"flex":void 0,"flex-direction":l.get(c).strategy===r.ScrollStrategy.Horizontal?"row":void 0}}));var i=l.child(a);let d;var u=l.sibling(i,2);let p;l.each(u,21,()=>l.get(c).items,e=>e.pageNumbers[0],(e,r)=>{var o=g();let a;l.each(o,21,()=>l.get(r).pageLayouts,e=>e.pageNumber,(e,r)=>{var o=n();let a;var i=l.child(o);l.snippet(i,()=>t.renderPage,()=>l.get(r)),l.reset(o),l.template_effect(()=>a=l.set_style(o,"",a,{width:`${l.get(r).rotatedWidth}px`,height:`${l.get(r).rotatedHeight}px`})),l.append(e,o)}),l.reset(o),l.template_effect(()=>a=l.set_style(o,"",a,{display:"flex","justify-content":"center",gap:`${l.get(c).pageGap}px`})),l.append(e,o)}),l.reset(u);var y=l.sibling(u,2);let f;l.reset(a),l.template_effect(()=>{d=l.set_style(i,"",d,{width:l.get(c).strategy===r.ScrollStrategy.Horizontal?`${l.get(c).startSpacing}px`:"100%",height:l.get(c).strategy===r.ScrollStrategy.Horizontal?"100%":`${l.get(c).startSpacing}px`,"flex-shrink":l.get(c).strategy===r.ScrollStrategy.Horizontal?"0":void 0}),p=l.set_style(u,"",p,{gap:`${l.get(c).pageGap}px`,display:"flex","align-items":"center",position:"relative","box-sizing":"border-box","flex-direction":l.get(c).strategy===r.ScrollStrategy.Horizontal?"row":"column","min-height":l.get(c).strategy===r.ScrollStrategy.Horizontal?"100%":void 0,"min-width":l.get(c).strategy===r.ScrollStrategy.Horizontal?void 0:"fit-content"}),f=l.set_style(y,"",f,{width:l.get(c).strategy===r.ScrollStrategy.Horizontal?`${l.get(c).endSpacing}px`:"100%",height:l.get(c).strategy===r.ScrollStrategy.Horizontal?"100%":`${l.get(c).endSpacing}px`,"flex-shrink":l.get(c).strategy===r.ScrollStrategy.Horizontal?"0":void 0})}),l.append(e,a)};l.if(p,e=>{l.get(c)&&e(y)}),l.append(e,u),l.pop()},exports.useScroll=e=>{const t=i();let r=l.proxy({currentPage:1,totalPages:1});const o=l.derived(e),a=l.derived(()=>t.provides&&l.get(o)?t.provides.forDocument(l.get(o)):null);return l.user_effect(()=>{const e=t.provides,a=l.get(o);if(!e||!a)return r.currentPage=1,void(r.totalPages=1);const i=e.forDocument(a);return r.currentPage=i.getCurrentPage(),r.totalPages=i.getTotalPages(),e.onPageChange(e=>{e.documentId===a&&(r.currentPage=e.pageNumber,r.totalPages=e.totalPages)})}),{get provides(){return l.get(a)},get state(){return r}}},exports.useScrollCapability=i,exports.useScrollPlugin=a,Object.keys(r).forEach(e=>{"default"===e||Object.prototype.hasOwnProperty.call(exports,e)||Object.defineProperty(exports,e,{enumerable:!0,get:()=>r[e]})});
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../src/svelte/hooks/use-scroll.svelte.ts","../../src/svelte/components/Scroller.svelte"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/svelte/hooks/use-scroll.svelte.ts","../../src/svelte/components/Scroller.svelte"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/svelte';\nimport { ScrollPlugin, ScrollScope } from '@embedpdf/plugin-scroll';\n\nexport const useScrollPlugin = () => usePlugin<ScrollPlugin>(ScrollPlugin.id);\nexport const useScrollCapability = () => useCapability<ScrollPlugin>(ScrollPlugin.id);\n\n// Define the return type explicitly to maintain type safety\ninterface UseScrollReturn {\n provides: ScrollScope | null;\n state: {\n currentPage: number;\n totalPages: number;\n };\n}\n\n/**\n * Hook for scroll state for a specific document\n * @param documentId Document ID.\n */\nexport const useScroll = (getDocumentId: () => string | null): UseScrollReturn => {\n const capability = useScrollCapability();\n\n let state = $state({\n currentPage: 1,\n totalPages: 1,\n });\n\n // Reactive documentId\n const documentId = $derived(getDocumentId());\n\n // Scoped capability for current docId\n const scopedProvides = $derived(\n capability.provides && documentId ? capability.provides.forDocument(documentId) : null,\n );\n\n $effect(() => {\n const provides = capability.provides;\n const docId = documentId;\n\n if (!provides || !docId) {\n state.currentPage = 1;\n state.totalPages = 1;\n return;\n }\n\n const scope = provides.forDocument(docId);\n\n // Initial values\n state.currentPage = scope.getCurrentPage();\n state.totalPages = scope.getTotalPages();\n\n // Subscribe to page changes for THIS docId\n return provides.onPageChange((event) => {\n if (event.documentId === docId) {\n state.currentPage = event.pageNumber;\n state.totalPages = event.totalPages;\n }\n });\n });\n\n return {\n get provides() {\n return scopedProvides;\n },\n get state() {\n return state;\n },\n };\n};\n","<script lang=\"ts\">\n import type { Snippet } from 'svelte';\n import type { HTMLAttributes } from 'svelte/elements';\n import { useScrollPlugin } from '../hooks';\n import { type ScrollerLayout, ScrollStrategy } from '@embedpdf/plugin-scroll';\n import type { PageLayout } from '@embedpdf/plugin-scroll';\n\n type ScrollerProps = HTMLAttributes<HTMLDivElement> & {\n documentId: string;\n renderPage: Snippet<[PageLayout]>;\n };\n\n let { documentId, renderPage, ...restProps }: ScrollerProps = $props();\n\n const { plugin: scrollPlugin } = useScrollPlugin();\n\n let layoutData = $state<{\n layout: ScrollerLayout | null;\n docId: string | null;\n }>({ layout: null, docId: null });\n\n $effect(() => {\n if (!scrollPlugin || !documentId) {\n layoutData = { layout: null, docId: null };\n return;\n }\n\n // When we get new data, store it along with the current documentId\n const unsubscribe = scrollPlugin.onScrollerData(documentId, (newLayout) => {\n layoutData = { layout: newLayout, docId: documentId };\n });\n\n // When the effect re-runs or component unmounts, clear the state\n return () => {\n unsubscribe();\n layoutData = { layout: null, docId: null };\n scrollPlugin.clearLayoutReady(documentId);\n };\n });\n\n // Only use layout if it matches the current documentId (prevents stale data)\n const scrollerLayout = $derived(layoutData.docId === documentId ? layoutData.layout : null);\n\n // Call setLayoutReady after layout is rendered (Svelte's equivalent to useLayoutEffect)\n $effect.pre(() => {\n if (!scrollPlugin || !documentId || !scrollerLayout) return;\n\n scrollPlugin.setLayoutReady(documentId);\n });\n</script>\n\n{#if scrollerLayout}\n <div\n {...restProps}\n style:width={`${scrollerLayout.totalWidth}px`}\n style:height={`${scrollerLayout.totalHeight}px`}\n style:position=\"relative\"\n style:box-sizing=\"border-box\"\n style:margin=\"0 auto\"\n style:display={scrollerLayout.strategy === ScrollStrategy.Horizontal ? 'flex' : undefined}\n style:flex-direction={scrollerLayout.strategy === ScrollStrategy.Horizontal ? 'row' : undefined}\n >\n <!-- Leading spacer -->\n <div\n style:width={scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? `${scrollerLayout.startSpacing}px`\n : '100%'}\n style:height={scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? '100%'\n : `${scrollerLayout.startSpacing}px`}\n style:flex-shrink={scrollerLayout.strategy === ScrollStrategy.Horizontal ? '0' : undefined}\n ></div>\n\n <!-- Page grid -->\n <div\n style:gap={`${scrollerLayout.pageGap}px`}\n style:display=\"flex\"\n style:align-items=\"center\"\n style:position=\"relative\"\n style:box-sizing=\"border-box\"\n style:flex-direction={scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? 'row'\n : 'column'}\n style:min-height={scrollerLayout.strategy === ScrollStrategy.Horizontal ? '100%' : undefined}\n style:min-width={scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? undefined\n : 'fit-content'}\n >\n {#each scrollerLayout.items as item (item.pageNumbers[0])}\n <div\n style:display=\"flex\"\n style:justify-content=\"center\"\n style:gap={`${scrollerLayout.pageGap}px`}\n >\n {#each item.pageLayouts as layout (layout.pageNumber)}\n <div\n style:width={`${layout.rotatedWidth}px`}\n style:height={`${layout.rotatedHeight}px`}\n >\n {@render renderPage(layout)}\n </div>\n {/each}\n </div>\n {/each}\n </div>\n\n <!-- Trailing spacer -->\n <div\n style:width={scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? `${scrollerLayout.endSpacing}px`\n : '100%'}\n style:height={scrollerLayout.strategy === ScrollStrategy.Horizontal\n ? '100%'\n : `${scrollerLayout.endSpacing}px`}\n style:flex-shrink={scrollerLayout.strategy === ScrollStrategy.Horizontal ? '0' : undefined}\n ></div>\n </div>\n{/if}\n"],"names":["useScrollPlugin","usePlugin","ScrollPlugin","id","useScrollCapability","useCapability","restProps","$","rest_props","$$props","plugin","scrollPlugin","layoutData","layout","docId","user_effect","documentId","set","unsubscribe","onScrollerData","newLayout","clearLayoutReady","scrollerLayout","derived","get","user_pre_effect","setLayoutReady","width","totalWidth","height","totalHeight","strategy","ScrollStrategy","Horizontal","items","item","pageNumbers","$$anchor","pageLayouts","pageNumber","rotatedWidth","rotatedHeight","gap","pageGap","startSpacing","endSpacing","consequent","getDocumentId","capability","state","currentPage","totalPages","scopedProvides","provides","forDocument","scope","getCurrentPage","getTotalPages","onPageChange","event"],"mappings":"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"}
|