66import { createAppConfig } from '@nextcloud/vite-config'
77import { resolve } from 'node:path'
88
9- const patchPdfElementsTouchmovePassive = {
10- name : 'patch-pdf-elements-touchmove-passive ' ,
9+ const patchPdfElementsRuntimeFixes = {
10+ name : 'patch-pdf-elements-runtime-fixes ' ,
1111 enforce : 'pre' ,
1212 transform ( code , id ) {
1313 if ( ! id . includes ( '/@libresign/pdf-elements/' ) ) {
1414 return null
1515 }
16- if ( ! id . endsWith ( '/dist/index.mjs' ) && ! id . endsWith ( '/src/components/DraggableElement.vue' ) ) {
16+ if ( ! id . endsWith ( '/dist/index.mjs' )
17+ && ! id . endsWith ( '/src/components/DraggableElement.vue' )
18+ && ! id . endsWith ( '/src/components/PDFElements.vue' ) ) {
1719 return null
1820 }
1921
20- const replaced = code . replace (
22+ let replaced = code
23+
24+ // Drag/resize listeners must be non-passive because handleMove calls preventDefault.
25+ replaced = replaced . replace (
2126 / w i n d o w \. a d d E v e n t L i s t e n e r \( ( [ ' " ] ) t o u c h m o v e \1, \s * t h i s \. b o u n d H a n d l e M o v e \) / g,
2227 'window.addEventListener($1touchmove$1, this.boundHandleMove, { passive: false })' ,
2328 )
2429
30+ // Adding-mode touchmove also needs to be non-passive.
31+ replaced = replaced . replace (
32+ / d o c u m e n t \. a d d E v e n t L i s t e n e r \( ( [ ' " ] ) t o u c h m o v e \1, \s * t h i s \. h a n d l e M o u s e M o v e , \s * \{ \s * p a s s i v e : \s * (?: ! 0 | t r u e ) \s * \} \) / g,
33+ 'document.addEventListener($1touchmove$1, this.handleMouseMove, { passive: false })' ,
34+ )
35+
36+ // Guard against race where add mode ends while RAF callback is still queued.
37+ replaced = replaced . replace (
38+ / c o n s t s = t h i s \. p e n d i n g H o v e r C l i e n t P o s ; \s * i f \( ! s \) r e t u r n ; / g,
39+ 'if (!this.isAddingMode || !this.previewElement) { this.pendingHoverClientPos = null; return; } const s = this.pendingHoverClientPos; if (!s) return;' ,
40+ )
41+
42+ // Defensive access to preview element dimensions in async mobile flow.
43+ replaced = replaced . replace ( / t h i s \. p r e v i e w E l e m e n t \. w i d t h / g, '(this.previewElement?.width || 0)' )
44+ replaced = replaced . replace ( / t h i s \. p r e v i e w E l e m e n t \. h e i g h t / g, '(this.previewElement?.height || 0)' )
45+
46+ // Keep toolbar above by default, but place below when signature is near top.
47+ replaced = replaced . replace (
48+ / c o n s t e = t h i s \. p a g e s S c a l e \| \| 1 , t = t h i s \. m o d e = = = " d r a g " , i = t h i s \. m o d e = = = " r e s i z e " , s = t \? t h i s \. o f f s e t X : 0 , n = t \? t h i s \. o f f s e t Y : 0 , a = i \? t h i s \. r e s i z e O f f s e t X : 0 , o = i \? t h i s \. r e s i z e O f f s e t Y : 0 , r = i \? t h i s \. r e s i z e O f f s e t W : 0 , h = t h i s \. o b j e c t \. x \+ s \+ a , l = t h i s \. o b j e c t \. y \+ n \+ o , u = t h i s \. o b j e c t \. w i d t h \+ r , d = l - 6 0 , g = d < 0 \? l \+ 8 : d ; / g,
49+ 'const e = this.pagesScale || 1, t = this.mode === "drag", i = this.mode === "resize", s = t ? this.offsetX : 0, n = t ? this.offsetY : 0, a = i ? this.resizeOffsetX : 0, o = i ? this.resizeOffsetY : 0, r = i ? this.resizeOffsetW : 0, h = i ? this.resizeOffsetH : 0, l = this.object.x + s + a, u = this.object.y + n + o, c = this.object.width + r, d = this.object.height + h, g = u * e < 72, f = g ? u + d : u, b = g ? "translate(-50%, 8px)" : "translate(-50%, calc(-100% - 8px))";' ,
50+ )
51+ replaced = replaced . replace (
52+ / l e f t : ` \$ \{ \( h \+ u \/ 2 \) \* e \} p x ` , \s * t o p : ` \$ \{ g \* e \} p x ` , \s * t r a n s f o r m : " t r a n s l a t e X \( - 5 0 % \) " / g,
53+ 'left: `${(l + c / 2) * e}px`, top: `${f * e}px`, transform: b' ,
54+ )
55+
2556 return replaced === code ? null : { code : replaced , map : null }
2657 } ,
2758}
@@ -45,7 +76,7 @@ export default createAppConfig({
4576 } ,
4677 } ,
4778 plugins : [
48- patchPdfElementsTouchmovePassive ,
79+ patchPdfElementsRuntimeFixes ,
4980 {
5081 name : 'vue-devtools' ,
5182 config ( _ , { mode } ) {
0 commit comments