pptx-vue-viewer 1.1.18 → 1.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/gif-encoder-BfVA22Ng.cjs +106 -0
  2. package/dist/gif-encoder-BfVA22Ng.cjs.br +0 -0
  3. package/dist/gif-encoder-BfVA22Ng.cjs.gz +0 -0
  4. package/dist/gif-encoder-DKeGv43e.js +107 -0
  5. package/dist/gif-encoder-DKeGv43e.js.br +0 -0
  6. package/dist/gif-encoder-DKeGv43e.js.gz +0 -0
  7. package/dist/index.cjs +1 -1
  8. package/dist/index.cjs.br +0 -0
  9. package/dist/index.cjs.gz +0 -0
  10. package/dist/index.js +1 -1
  11. package/dist/index.js.br +0 -0
  12. package/dist/index.js.gz +0 -0
  13. package/dist/viewer/PowerPointViewer.vue.d.ts.map +1 -1
  14. package/dist/viewer/components/EquationEditorDialog.vue.d.ts.map +1 -1
  15. package/dist/viewer/components/ExportMenu.vue.d.ts +7 -2
  16. package/dist/viewer/components/ExportMenu.vue.d.ts.map +1 -1
  17. package/dist/viewer/components/FollowModeBar.vue.d.ts +15 -0
  18. package/dist/viewer/components/FollowModeBar.vue.d.ts.map +1 -0
  19. package/dist/viewer/components/PresentationMode.vue.d.ts.map +1 -1
  20. package/dist/viewer/components/PresentationTransitionOverlay.vue.d.ts +44 -0
  21. package/dist/viewer/components/PresentationTransitionOverlay.vue.d.ts.map +1 -0
  22. package/dist/viewer/components/RemoteSelectionOverlay.vue.d.ts +38 -0
  23. package/dist/viewer/components/RemoteSelectionOverlay.vue.d.ts.map +1 -0
  24. package/dist/viewer/composables/gif-encoder.d.ts +29 -0
  25. package/dist/viewer/composables/gif-encoder.d.ts.map +1 -0
  26. package/dist/viewer/composables/slide-transition-css.d.ts +53 -0
  27. package/dist/viewer/composables/slide-transition-css.d.ts.map +1 -0
  28. package/dist/viewer/composables/useCollaboration.d.ts +49 -8
  29. package/dist/viewer/composables/useCollaboration.d.ts.map +1 -1
  30. package/dist/viewer/composables/useLoadContent.d.ts +5 -1
  31. package/dist/viewer/composables/useLoadContent.d.ts.map +1 -1
  32. package/dist/viewer/composables/useMediaExport.d.ts +92 -0
  33. package/dist/viewer/composables/useMediaExport.d.ts.map +1 -0
  34. package/dist/viewer/index.cjs +1 -1
  35. package/dist/viewer/index.cjs.br +0 -0
  36. package/dist/viewer/index.cjs.gz +0 -0
  37. package/dist/viewer/index.js +1 -1
  38. package/dist/viewer/index.js.br +0 -0
  39. package/dist/viewer/index.js.gz +0 -0
  40. package/dist/{viewer-CeeHIv08.cjs → viewer-B_MKA5ks.cjs} +9142 -8415
  41. package/dist/viewer-B_MKA5ks.cjs.br +0 -0
  42. package/dist/viewer-B_MKA5ks.cjs.gz +0 -0
  43. package/dist/{viewer-BwIIU3HV.js → viewer-BsFcXVHv.js} +2868 -2141
  44. package/dist/viewer-BsFcXVHv.js.br +0 -0
  45. package/dist/viewer-BsFcXVHv.js.gz +0 -0
  46. package/package.json +1 -1
  47. package/dist/viewer/components/latex-to-omml.d.ts +0 -13
  48. package/dist/viewer/components/latex-to-omml.d.ts.map +0 -1
  49. package/dist/viewer-BwIIU3HV.js.br +0 -0
  50. package/dist/viewer-BwIIU3HV.js.gz +0 -0
  51. package/dist/viewer-CeeHIv08.cjs.br +0 -0
  52. package/dist/viewer-CeeHIv08.cjs.gz +0 -0
@@ -0,0 +1,106 @@
1
+ function t(t, n) {
2
+ t.push(255 & n), t.push(n >> 8 & 255);
3
+ }
4
+ function n(t, n) {
5
+ for (let e = 0; e < n.length; e++) t.push(n.charCodeAt(e));
6
+ }
7
+ function e(t) {
8
+ const n = t.data, e = t.width * t.height, h = Math.max(1, Math.floor(e / 1e4)), r = [];
9
+ for (let t = 0; t < e; t += h) {
10
+ const e = 4 * t;
11
+ r.push([
12
+ n[e],
13
+ n[e + 1],
14
+ n[e + 2]
15
+ ]);
16
+ }
17
+ const u = o(r, 8), c = new Uint8Array(768), l = [];
18
+ for (let t = 0; t < 256; t++) if (t < u.length && u[t].length > 0) {
19
+ let n = 0, e = 0, o = 0;
20
+ for (const [s, h, r] of u[t]) n += s, e += h, o += r;
21
+ const s = u[t].length, h = Math.round(n / s), r = Math.round(e / s), f = Math.round(o / s);
22
+ c[3 * t] = h, c[3 * t + 1] = r, c[3 * t + 2] = f, l.push([
23
+ h,
24
+ r,
25
+ f
26
+ ]);
27
+ } else l.push([
28
+ 0,
29
+ 0,
30
+ 0
31
+ ]);
32
+ const f = new Uint8Array(e);
33
+ for (let t = 0; t < e; t++) {
34
+ const e = 4 * t;
35
+ f[t] = s(l, n[e], n[e + 1], n[e + 2]);
36
+ }
37
+ return {
38
+ palette: c,
39
+ indexed: f
40
+ };
41
+ }
42
+ function o(t, n) {
43
+ if (0 === n || t.length <= 1) return [t];
44
+ let e = 255, s = 0, h = 255, r = 0, u = 255, c = 0;
45
+ for (const [n, o, l] of t) n < e && (e = n), n > s && (s = n), o < h && (h = o), o > r && (r = o), l < u && (u = l), l > c && (c = l);
46
+ const l = s - e, f = r - h, i = c - u;
47
+ let p = 0;
48
+ f >= l && f >= i ? p = 1 : i >= l && i >= f && (p = 2), t.sort((t, n) => t[p] - n[p]);
49
+ const a = Math.floor(t.length / 2);
50
+ return [...o(t.slice(0, a), n - 1), ...o(t.slice(a), n - 1)];
51
+ }
52
+ function s(t, n, e, o) {
53
+ let s = 0, h = Infinity;
54
+ for (let r = 0; r < t.length; r++) {
55
+ const [u, c, l] = t[r], f = (n - u) ** 2 + (e - c) ** 2 + (o - l) ** 2;
56
+ f < h && (h = f, s = r);
57
+ }
58
+ return s;
59
+ }
60
+ function h(t, n) {
61
+ const e = 1 << n, o = e + 1, s = [];
62
+ let h = n + 1, r = o + 1;
63
+ const u = /* @__PURE__ */ new Map(), c = () => {
64
+ u.clear();
65
+ for (let t = 0; t < e; t++) u.set(String(t), t);
66
+ h = n + 1, r = o + 1;
67
+ };
68
+ let l = 0, f = 0;
69
+ const i = (t, n) => {
70
+ for (l |= t << f, f += n; f >= 8;) s.push(255 & l), l >>= 8, f -= 8;
71
+ };
72
+ c(), i(e, h);
73
+ let p = String(t[0]);
74
+ for (let n = 1; n < t.length; n++) {
75
+ const o = `${p},${String(t[n])}`;
76
+ if (u.has(o)) p = o;
77
+ else {
78
+ const s = u.get(p);
79
+ void 0 !== s && i(s, h), r < 4096 ? (u.set(o, r++), r > 1 << h && h < 12 && h++) : (i(e, h), c()), p = String(t[n]);
80
+ }
81
+ }
82
+ const a = u.get(p);
83
+ return void 0 !== a && i(a, h), i(o, h), f > 0 && s.push(255 & l), new Uint8Array(s);
84
+ }
85
+ exports.encodeGif = function(o, s) {
86
+ if (0 === o.length) throw new Error("[gif-encoder] encodeGif: frames array must not be empty");
87
+ const r = o[0].width, u = o[0].height, c = [];
88
+ n(c, "GIF89a"), t(c, r), t(c, u), c.push(112), c.push(0), c.push(0), c.push(33, 255, 11), n(c, "NETSCAPE2.0"), c.push(3, 1), t(c, 0), c.push(0);
89
+ for (const n of o) {
90
+ const { palette: o, indexed: l } = e(n.imageData);
91
+ c.push(33, 249, 4), c.push(0), t(c, s), c.push(0), c.push(0), c.push(44), t(c, 0), t(c, 0), t(c, r), t(c, u), c.push(135);
92
+ for (let t = 0; t < 256; t++) c.push(o[3 * t] ?? 0), c.push(o[3 * t + 1] ?? 0), c.push(o[3 * t + 2] ?? 0);
93
+ const f = 8;
94
+ c.push(f);
95
+ const i = h(l, f);
96
+ let p = 0;
97
+ for (; p < i.length;) {
98
+ const t = Math.min(255, i.length - p);
99
+ c.push(t);
100
+ for (let n = 0; n < t; n++) c.push(i[p + n]);
101
+ p += t;
102
+ }
103
+ c.push(0);
104
+ }
105
+ return c.push(59), new Uint8Array(c);
106
+ };
Binary file
Binary file
@@ -0,0 +1,107 @@
1
+ function t(t, s) {
2
+ if (0 === t.length) throw new Error("[gif-encoder] encodeGif: frames array must not be empty");
3
+ const h = t[0].width, u = t[0].height, l = [];
4
+ e(l, "GIF89a"), n(l, h), n(l, u), l.push(112), l.push(0), l.push(0), l.push(33, 255, 11), e(l, "NETSCAPE2.0"), l.push(3, 1), n(l, 0), l.push(0);
5
+ for (const e of t) {
6
+ const { palette: t, indexed: c } = o(e.imageData);
7
+ l.push(33, 249, 4), l.push(0), n(l, s), l.push(0), l.push(0), l.push(44), n(l, 0), n(l, 0), n(l, h), n(l, u), l.push(135);
8
+ for (let n = 0; n < 256; n++) l.push(t[3 * n] ?? 0), l.push(t[3 * n + 1] ?? 0), l.push(t[3 * n + 2] ?? 0);
9
+ const f = 8;
10
+ l.push(f);
11
+ const i = r(c, f);
12
+ let p = 0;
13
+ for (; p < i.length;) {
14
+ const t = Math.min(255, i.length - p);
15
+ l.push(t);
16
+ for (let n = 0; n < t; n++) l.push(i[p + n]);
17
+ p += t;
18
+ }
19
+ l.push(0);
20
+ }
21
+ return l.push(59), new Uint8Array(l);
22
+ }
23
+ function n(t, n) {
24
+ t.push(255 & n), t.push(n >> 8 & 255);
25
+ }
26
+ function e(t, n) {
27
+ for (let e = 0; e < n.length; e++) t.push(n.charCodeAt(e));
28
+ }
29
+ function o(t) {
30
+ const n = t.data, e = t.width * t.height, o = Math.max(1, Math.floor(e / 1e4)), r = [];
31
+ for (let t = 0; t < e; t += o) {
32
+ const e = 4 * t;
33
+ r.push([
34
+ n[e],
35
+ n[e + 1],
36
+ n[e + 2]
37
+ ]);
38
+ }
39
+ const u = s(r, 8), l = new Uint8Array(768), c = [];
40
+ for (let t = 0; t < 256; t++) if (t < u.length && u[t].length > 0) {
41
+ let n = 0, e = 0, o = 0;
42
+ for (const [s, h, r] of u[t]) n += s, e += h, o += r;
43
+ const s = u[t].length, h = Math.round(n / s), r = Math.round(e / s), f = Math.round(o / s);
44
+ l[3 * t] = h, l[3 * t + 1] = r, l[3 * t + 2] = f, c.push([
45
+ h,
46
+ r,
47
+ f
48
+ ]);
49
+ } else c.push([
50
+ 0,
51
+ 0,
52
+ 0
53
+ ]);
54
+ const f = new Uint8Array(e);
55
+ for (let t = 0; t < e; t++) {
56
+ const e = 4 * t;
57
+ f[t] = h(c, n[e], n[e + 1], n[e + 2]);
58
+ }
59
+ return {
60
+ palette: l,
61
+ indexed: f
62
+ };
63
+ }
64
+ function s(t, n) {
65
+ if (0 === n || t.length <= 1) return [t];
66
+ let e = 255, o = 0, h = 255, r = 0, u = 255, l = 0;
67
+ for (const [n, s, c] of t) n < e && (e = n), n > o && (o = n), s < h && (h = s), s > r && (r = s), c < u && (u = c), c > l && (l = c);
68
+ const c = o - e, f = r - h, i = l - u;
69
+ let p = 0;
70
+ f >= c && f >= i ? p = 1 : i >= c && i >= f && (p = 2), t.sort((t, n) => t[p] - n[p]);
71
+ const a = Math.floor(t.length / 2);
72
+ return [...s(t.slice(0, a), n - 1), ...s(t.slice(a), n - 1)];
73
+ }
74
+ function h(t, n, e, o) {
75
+ let s = 0, h = Infinity;
76
+ for (let r = 0; r < t.length; r++) {
77
+ const [u, l, c] = t[r], f = (n - u) ** 2 + (e - l) ** 2 + (o - c) ** 2;
78
+ f < h && (h = f, s = r);
79
+ }
80
+ return s;
81
+ }
82
+ function r(t, n) {
83
+ const e = 1 << n, o = e + 1, s = [];
84
+ let h = n + 1, r = o + 1;
85
+ const u = /* @__PURE__ */ new Map(), l = () => {
86
+ u.clear();
87
+ for (let t = 0; t < e; t++) u.set(String(t), t);
88
+ h = n + 1, r = o + 1;
89
+ };
90
+ let c = 0, f = 0;
91
+ const i = (t, n) => {
92
+ for (c |= t << f, f += n; f >= 8;) s.push(255 & c), c >>= 8, f -= 8;
93
+ };
94
+ l(), i(e, h);
95
+ let p = String(t[0]);
96
+ for (let n = 1; n < t.length; n++) {
97
+ const o = `${p},${String(t[n])}`;
98
+ if (u.has(o)) p = o;
99
+ else {
100
+ const s = u.get(p);
101
+ void 0 !== s && i(s, h), r < 4096 ? (u.set(o, r++), r > 1 << h && h < 12 && h++) : (i(e, h), l()), p = String(t[n]);
102
+ }
103
+ }
104
+ const a = u.get(p);
105
+ return void 0 !== a && i(a, h), i(o, h), f > 0 && s.push(255 & c), new Uint8Array(s);
106
+ }
107
+ export { t as encodeGif };
Binary file
Binary file
package/dist/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const e = require("./viewer-CeeHIv08.cjs");
2
+ const e = require("./viewer-B_MKA5ks.cjs");
3
3
  let r = require("clsx"), t = require("tailwind-merge");
4
4
  exports.ElementRenderer = e.ElementRenderer_default, exports.PowerPointViewer = e.PowerPointViewer_default, exports.SlideCanvas = e.SlideCanvas_default, exports.SlideStage = e.SlideStage_default, exports.cn = function(...e) {
5
5
  return (0, t.twMerge)((0, r.clsx)(e));
package/dist/index.cjs.br CHANGED
Binary file
package/dist/index.cjs.gz CHANGED
Binary file
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { C as a, F as s, N as e, P as r, R as i, S as o, a as t, o as m, s as n, t as l, w } from "./viewer-BwIIU3HV.js";
1
+ import { C as a, F as s, N as e, P as r, R as i, S as o, a as t, o as m, s as n, t as l, w } from "./viewer-BsFcXVHv.js";
2
2
  import { clsx as d } from "clsx";
3
3
  import { twMerge as f } from "tailwind-merge";
4
4
  function p(...a) {
package/dist/index.js.br CHANGED
Binary file
package/dist/index.js.gz CHANGED
Binary file
@@ -1 +1 @@
1
- {"version":3,"file":"PowerPointViewer.vue.d.ts","sourceRoot":"","sources":["../../src/viewer/PowerPointViewer.vue"],"names":[],"mappings":"AAgqDA,OAAO,KAAK,EACX,mBAAmB,EAEnB,sBAAsB,EACtB,qBAAqB,EACrB,MAAM,SAAS,CAAC;AA2nFjB,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;6EAKhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"PowerPointViewer.vue.d.ts","sourceRoot":"","sources":["../../src/viewer/PowerPointViewer.vue"],"names":[],"mappings":"AAwtDA,OAAO,KAAK,EACX,mBAAmB,EAEnB,sBAAsB,EACtB,qBAAqB,EACrB,MAAM,SAAS,CAAC;AAmtFjB,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;6EAKhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -1 +1 @@
1
- {"version":3,"file":"EquationEditorDialog.vue.d.ts","sourceRoot":"","sources":["../../../src/viewer/components/EquationEditorDialog.vue"],"names":[],"mappings":"AAqaA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAa,MAAM,kBAAkB,CAAC;AAQ5E;;;;;;;;;;;;;;;;;;GAkBG;AACH,KAAK,WAAW,GAAG;IAClB,kCAAkC;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC9C,CAAC;AAgWF,QAAA,MAAM,YAAY;;;;;;;;kFAGhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"EquationEditorDialog.vue.d.ts","sourceRoot":"","sources":["../../../src/viewer/components/EquationEditorDialog.vue"],"names":[],"mappings":"AAoaA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAa,MAAM,kBAAkB,CAAC;AAO5E;;;;;;;;;;;;;;;;;;GAkBG;AACH,KAAK,WAAW,GAAG;IAClB,kCAAkC;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC9C,CAAC;AAgWF,QAAA,MAAM,YAAY;;;;;;;;kFAGhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -1,6 +1,7 @@
1
1
  /**
2
- * ExportMenu — a small dropdown offering PNG (current slide) and PDF exports.
3
- * Emits intent; the host runs the actual export via `useExport`.
2
+ * ExportMenu — a small dropdown offering PNG (current slide), PDF, animated GIF
3
+ * and WebM video exports. Emits intent; the host runs the actual export via
4
+ * `useExport` / `useMediaExport`.
4
5
  */
5
6
  type __VLS_Props = {
6
7
  exporting: boolean;
@@ -8,9 +9,13 @@ type __VLS_Props = {
8
9
  declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
9
10
  "export-png": () => any;
10
11
  "export-pdf": () => any;
12
+ "export-gif": () => any;
13
+ "export-webm": () => any;
11
14
  }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
12
15
  "onExport-png"?: (() => any) | undefined;
13
16
  "onExport-pdf"?: (() => any) | undefined;
17
+ "onExport-gif"?: (() => any) | undefined;
18
+ "onExport-webm"?: (() => any) | undefined;
14
19
  }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
15
20
  declare const _default: typeof __VLS_export;
16
21
  export default _default;
@@ -1 +1 @@
1
- {"version":3,"file":"ExportMenu.vue.d.ts","sourceRoot":"","sources":["../../../src/viewer/components/ExportMenu.vue"],"names":[],"mappings":"AAwFA;;;GAGG;AACH,KAAK,WAAW,GAAG;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC;AAiG1C,QAAA,MAAM,YAAY;;;;;;kFAGhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"ExportMenu.vue.d.ts","sourceRoot":"","sources":["../../../src/viewer/components/ExportMenu.vue"],"names":[],"mappings":"AAwGA;;;;GAIG;AACH,KAAK,WAAW,GAAG;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC;AAkI1C,QAAA,MAAM,YAAY;;;;;;;;;;kFAGhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -0,0 +1,15 @@
1
+ import { RemotePresence } from '../composables/useCollaboration';
2
+ type __VLS_Props = {
3
+ /** Active remote collaborators (excludes self). */
4
+ presences: RemotePresence[];
5
+ /** The clientId currently being followed, or null. */
6
+ followedClientId: number | null;
7
+ };
8
+ declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
9
+ follow: (clientId: number | null) => any;
10
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
11
+ onFollow?: ((clientId: number | null) => any) | undefined;
12
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
13
+ declare const _default: typeof __VLS_export;
14
+ export default _default;
15
+ //# sourceMappingURL=FollowModeBar.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FollowModeBar.vue.d.ts","sourceRoot":"","sources":["../../../src/viewer/components/FollowModeBar.vue"],"names":[],"mappings":"AA0MA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE,KAAK,WAAW,GAAG;IAClB,mDAAmD;IACnD,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,sDAAsD;IACtD,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC,CAAC;AA4IF,QAAA,MAAM,YAAY;;;;kFAGhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -1 +1 @@
1
- {"version":3,"file":"PresentationMode.vue.d.ts","sourceRoot":"","sources":["../../../src/viewer/components/PresentationMode.vue"],"names":[],"mappings":"AAsiBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAOlD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAO3C;;;;;;;;;;;;;;;;GAgBG;AACH,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,UAAU,EAAE,UAAU,CAAC;IACvB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAmnBH,QAAA,MAAM,YAAY;;;;;;;gBApnBH,MAAM;6EAwnBnB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"PresentationMode.vue.d.ts","sourceRoot":"","sources":["../../../src/viewer/components/PresentationMode.vue"],"names":[],"mappings":"AAykBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAOlD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAQ3C;;;;;;;;;;;;;;;;GAgBG;AACH,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,UAAU,EAAE,UAAU,CAAC;IACvB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAyqBH,QAAA,MAAM,YAAY;;;;;;;gBA1qBH,MAAM;6EA8qBnB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -0,0 +1,44 @@
1
+ import { PptxSlide, PptxSlideTransition } from 'pptx-viewer-core';
2
+ import { CanvasSize } from '../types';
3
+ /**
4
+ * PresentationTransitionOverlay — animates a slide change in presentation mode.
5
+ *
6
+ * It stacks two {@link SlideStage} layers, both scaled-to-fit identically to the
7
+ * underlying presentation frame:
8
+ * - the **outgoing** (old) slide as a snapshot layer, and
9
+ * - the **incoming** (new) slide.
10
+ *
11
+ * The active slide's {@link PptxSlideTransition} is mapped to CSS `animation`
12
+ * shorthands (via {@link resolveSlideTransition}); each layer's `z-index` is set
13
+ * from `outgoingOnTop`. When the configured duration elapses the overlay emits
14
+ * `done`, at which point the host should drop the overlay and leave the static
15
+ * incoming slide rendered by its main stage.
16
+ *
17
+ * `PresentationMode` is expected to mount this **only while a transition is
18
+ * playing** (between the outgoing and incoming slides), render nothing of its
19
+ * own animated stage during that window, and remove it on `@done`.
20
+ */
21
+ type __VLS_Props = {
22
+ /** The outgoing (previous) slide rendered in the exit layer. */
23
+ outgoingSlide: PptxSlide | undefined;
24
+ /** The incoming (new) slide rendered in the entrance layer. */
25
+ incomingSlide: PptxSlide | undefined;
26
+ /** Slide surface dimensions (px). */
27
+ canvasSize: CanvasSize;
28
+ /** Resolved media data URLs, threaded to each {@link SlideStage}. */
29
+ mediaDataUrls: Map<string, string>;
30
+ /** Fit-to-viewport scale (same value the host applies to its main stage). */
31
+ scale?: number;
32
+ /** The transition definition from the incoming slide. */
33
+ transition: PptxSlideTransition | undefined;
34
+ };
35
+ declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
36
+ done: () => any;
37
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
38
+ onDone?: (() => any) | undefined;
39
+ }>, {
40
+ scale: number;
41
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
42
+ declare const _default: typeof __VLS_export;
43
+ export default _default;
44
+ //# sourceMappingURL=PresentationTransitionOverlay.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PresentationTransitionOverlay.vue.d.ts","sourceRoot":"","sources":["../../../src/viewer/components/PresentationTransitionOverlay.vue"],"names":[],"mappings":"AAmJA,OAAO,KAAK,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AASvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAG3C;;;;;;;;;;;;;;;;;GAiBG;AACH,KAAK,WAAW,GAAG;IACjB,gEAAgE;IAChE,aAAa,EAAE,SAAS,GAAG,SAAS,CAAC;IACrC,+DAA+D;IAC/D,aAAa,EAAE,SAAS,GAAG,SAAS,CAAC;IACrC,qCAAqC;IACrC,UAAU,EAAE,UAAU,CAAC;IACvB,qEAAqE;IACrE,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,UAAU,EAAE,mBAAmB,GAAG,SAAS,CAAC;CAC5C,CAAC;AA4IH,QAAA,MAAM,YAAY;;;;;WA/IR,MAAM;6EAmJd,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -0,0 +1,38 @@
1
+ import { PptxElement } from 'pptx-viewer-core';
2
+ import { RemotePresence } from '../composables/useCollaboration';
3
+ /** A single resolved remote selection box, in unscaled slide coordinates. */
4
+ export interface RemoteSelectionBox {
5
+ /** Stable key (peer clientId + element id). */
6
+ key: string;
7
+ /** Peer display name shown in the label chip. */
8
+ userName: string;
9
+ /** Outline + chip colour. */
10
+ color: string;
11
+ /** Unscaled slide-space geometry of the selected element. */
12
+ x: number;
13
+ y: number;
14
+ width: number;
15
+ height: number;
16
+ }
17
+ declare const _default: typeof __VLS_export;
18
+ export default _default;
19
+ declare const __VLS_export: import('vue').DefineComponent<{
20
+ /** Remote collaborators' presence (cursor + selection + active slide). */
21
+ presences: RemotePresence[];
22
+ /** Elements on the active slide (used to resolve selected ids → geometry). */
23
+ elements: PptxElement[];
24
+ /** The current slide index — only peers on this slide are drawn. */
25
+ activeSlideIndex: number;
26
+ /** Current canvas zoom factor; geometry scales by this. */
27
+ zoom: number;
28
+ }, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{
29
+ /** Remote collaborators' presence (cursor + selection + active slide). */
30
+ presences: RemotePresence[];
31
+ /** Elements on the active slide (used to resolve selected ids → geometry). */
32
+ elements: PptxElement[];
33
+ /** The current slide index — only peers on this slide are drawn. */
34
+ activeSlideIndex: number;
35
+ /** Current canvas zoom factor; geometry scales by this. */
36
+ zoom: number;
37
+ }> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
38
+ //# sourceMappingURL=RemoteSelectionOverlay.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RemoteSelectionOverlay.vue.d.ts","sourceRoot":"","sources":["../../../src/viewer/components/RemoteSelectionOverlay.vue"],"names":[],"mappings":"AAyKA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE,6EAA6E;AAC7E,MAAM,WAAW,kBAAkB;IAClC,+CAA+C;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CACf;wBACoB,OAAO,YAAY;AAAxC,wBAAyC;AACzC,QAAA,MAAM,YAAY;IAEjB,0EAA0E;eAC/D,cAAc,EAAE;IAC3B,8EAA8E;cACpE,WAAW,EAAE;IACvB,oEAAoE;sBAClD,MAAM;IACxB,2DAA2D;UACrD,MAAM;;IAPZ,0EAA0E;eAC/D,cAAc,EAAE;IAC3B,8EAA8E;cACpE,WAAW,EAAE;IACvB,oEAAoE;sBAClD,MAAM;IACxB,2DAA2D;UACrD,MAAM;iGA8GT,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Minimal GIF89a encoder (pure JS, no external dependency).
3
+ *
4
+ * Ported verbatim from the React package's
5
+ * `packages/react/src/viewer/utils/export-gif-encoder.ts` (median-cut colour
6
+ * quantisation + LZW). It carries no DOM/browser dependency — it operates on
7
+ * pre-extracted `ImageData` objects — so the caller (`useMediaExport`) owns the
8
+ * rasterisation.
9
+ *
10
+ * `useMediaExport` loads this module via a dynamic `import()` so the encoder
11
+ * stays out of the main viewer chunk (mirroring how `useExport` lazy-loads
12
+ * `jspdf`). No npm GIF library exists for the React package to depend on; the
13
+ * encoder is self-contained source in every binding (React/Angular/Vue).
14
+ */
15
+ /** A single animated-GIF frame: raw RGBA pixels plus its dimensions. */
16
+ export interface GifFrame {
17
+ imageData: ImageData;
18
+ width: number;
19
+ height: number;
20
+ }
21
+ /**
22
+ * Encode an ordered list of RGBA frames into an animated GIF89a byte sequence.
23
+ *
24
+ * @param frames Ordered frame descriptors (all must share identical dimensions).
25
+ * @param delayCs Per-frame display time in **centiseconds** (1 cs = 10 ms).
26
+ * @returns Raw GIF89a bytes.
27
+ */
28
+ export declare function encodeGif(frames: GifFrame[], delayCs: number): Uint8Array;
29
+ //# sourceMappingURL=gif-encoder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gif-encoder.d.ts","sourceRoot":"","sources":["../../../src/viewer/composables/gif-encoder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,wEAAwE;AACxE,MAAM,WAAW,QAAQ;IACxB,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,CAsEzE"}
@@ -0,0 +1,53 @@
1
+ import { PptxSlideTransition, PptxTransitionType } from 'pptx-viewer-core';
2
+ /** Resolved CSS `animation` shorthands for the two transition layers. */
3
+ export interface SlideTransitionAnimations {
4
+ /** CSS `animation` value for the outgoing (old) slide layer, or `'none'`. */
5
+ outgoing: string;
6
+ /** CSS `animation` value for the incoming (new) slide layer, or `'none'`. */
7
+ incoming: string;
8
+ /** Whether the outgoing layer should render above the incoming layer. */
9
+ outgoingOnTop: boolean;
10
+ }
11
+ /** The four cardinal directions a transition can resolve to. */
12
+ export type ResolvedDirection = 'left' | 'right' | 'up' | 'down';
13
+ /** Cardinal directions plus the four diagonals (for cover/uncover/strips). */
14
+ export type ResolvedDirection8 = ResolvedDirection | 'lu' | 'ld' | 'ru' | 'rd';
15
+ /** Map an OOXML `dir` token (`l`/`r`/`u`/`d`) to a cardinal direction. */
16
+ export declare function resolveDirection(direction: string | undefined, defaultDir: ResolvedDirection): ResolvedDirection;
17
+ /** Map an OOXML `dir` token to a cardinal **or diagonal** direction. */
18
+ export declare function resolveDirection8(direction: string | undefined, defaultDir: ResolvedDirection): ResolvedDirection8;
19
+ /** Resolve an orientation from the `orient` or `direction` attribute. */
20
+ export declare function resolveOrientation(direction: string | undefined, orient: string | undefined): 'horz' | 'vert';
21
+ /** Transition types eligible for `random` selection (kept deterministic-light). */
22
+ export declare const RANDOM_ELIGIBLE_TYPES: readonly PptxTransitionType[];
23
+ /** No-animation sentinel — used for `none`/`cut` (instant slide swap). */
24
+ export declare const INSTANT: SlideTransitionAnimations;
25
+ /**
26
+ * The full `@keyframes` block backing every resolved transition. Inject it once
27
+ * per overlay (the same pattern `PresentationMode` uses for
28
+ * `ANIMATION_KEYFRAMES_CSS`). Keyframe names are `pptx-tr-*`-prefixed so they
29
+ * never collide with the element-animation keyframes (`pptx-anim-*`).
30
+ */
31
+ export declare const SLIDE_TRANSITION_KEYFRAMES_CSS = "\n/* \u2500\u2500 Fade \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-fade-in {\n\tfrom { opacity: 0; }\n\tto { opacity: 1; }\n}\n@keyframes pptx-tr-fade-out {\n\tfrom { opacity: 1; }\n\tto { opacity: 0; }\n}\n\n/* \u2500\u2500 Push \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-push-in-from-right {\n\tfrom { transform: translateX(100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-push-out-to-left {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(-100%); }\n}\n@keyframes pptx-tr-push-in-from-left {\n\tfrom { transform: translateX(-100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-push-out-to-right {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(100%); }\n}\n@keyframes pptx-tr-push-in-from-bottom {\n\tfrom { transform: translateY(100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-push-out-to-top {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(-100%); }\n}\n@keyframes pptx-tr-push-in-from-top {\n\tfrom { transform: translateY(-100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-push-out-to-bottom {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(100%); }\n}\n\n/* \u2500\u2500 Cover (incoming slides over stationary outgoing) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-cover-from-right {\n\tfrom { transform: translateX(100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-cover-from-left {\n\tfrom { transform: translateX(-100%); }\n\tto { transform: translateX(0); }\n}\n@keyframes pptx-tr-cover-from-bottom {\n\tfrom { transform: translateY(100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-cover-from-top {\n\tfrom { transform: translateY(-100%); }\n\tto { transform: translateY(0); }\n}\n@keyframes pptx-tr-cover-from-lu {\n\tfrom { transform: translate(-100%, -100%); }\n\tto { transform: translate(0, 0); }\n}\n@keyframes pptx-tr-cover-from-ld {\n\tfrom { transform: translate(-100%, 100%); }\n\tto { transform: translate(0, 0); }\n}\n@keyframes pptx-tr-cover-from-ru {\n\tfrom { transform: translate(100%, -100%); }\n\tto { transform: translate(0, 0); }\n}\n@keyframes pptx-tr-cover-from-rd {\n\tfrom { transform: translate(100%, 100%); }\n\tto { transform: translate(0, 0); }\n}\n\n/* \u2500\u2500 Uncover (outgoing slides away revealing stationary incoming) \u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-uncover-to-left {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(-100%); }\n}\n@keyframes pptx-tr-uncover-to-right {\n\tfrom { transform: translateX(0); }\n\tto { transform: translateX(100%); }\n}\n@keyframes pptx-tr-uncover-to-top {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(-100%); }\n}\n@keyframes pptx-tr-uncover-to-bottom {\n\tfrom { transform: translateY(0); }\n\tto { transform: translateY(100%); }\n}\n@keyframes pptx-tr-uncover-to-lu {\n\tfrom { transform: translate(0, 0); }\n\tto { transform: translate(-100%, -100%); }\n}\n@keyframes pptx-tr-uncover-to-ld {\n\tfrom { transform: translate(0, 0); }\n\tto { transform: translate(-100%, 100%); }\n}\n@keyframes pptx-tr-uncover-to-ru {\n\tfrom { transform: translate(0, 0); }\n\tto { transform: translate(100%, -100%); }\n}\n@keyframes pptx-tr-uncover-to-rd {\n\tfrom { transform: translate(0, 0); }\n\tto { transform: translate(100%, 100%); }\n}\n\n/* \u2500\u2500 Wipe (clip-path reveal) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-wipe-from-left {\n\tfrom { clip-path: inset(0 100% 0 0); }\n\tto { clip-path: inset(0 0 0 0); }\n}\n@keyframes pptx-tr-wipe-from-right {\n\tfrom { clip-path: inset(0 0 0 100%); }\n\tto { clip-path: inset(0 0 0 0); }\n}\n@keyframes pptx-tr-wipe-from-top {\n\tfrom { clip-path: inset(0 0 100% 0); }\n\tto { clip-path: inset(0 0 0 0); }\n}\n@keyframes pptx-tr-wipe-from-bottom {\n\tfrom { clip-path: inset(100% 0 0 0); }\n\tto { clip-path: inset(0 0 0 0); }\n}\n\n/* \u2500\u2500 Split \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-split-h-out {\n\tfrom { clip-path: inset(0 50%); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-split-v-out {\n\tfrom { clip-path: inset(50% 0); }\n\tto { clip-path: inset(0 0); }\n}\n@keyframes pptx-tr-split-h-in {\n\tfrom { clip-path: inset(0 0); }\n\tto { clip-path: inset(0 50%); }\n}\n@keyframes pptx-tr-split-v-in {\n\tfrom { clip-path: inset(0 0); }\n\tto { clip-path: inset(50% 0); }\n}\n\n/* \u2500\u2500 Dissolve \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-dissolve-in {\n\tfrom { opacity: 0; filter: blur(4px); }\n\tto { opacity: 1; filter: blur(0px); }\n}\n\n/* \u2500\u2500 Circle / Diamond / Plus (clip-path shapes) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-circle-in {\n\tfrom { clip-path: circle(0% at 50% 50%); }\n\tto { clip-path: circle(75% at 50% 50%); }\n}\n@keyframes pptx-tr-diamond-in {\n\tfrom { clip-path: polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%); }\n\tto { clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%); }\n}\n@keyframes pptx-tr-plus-in {\n\tfrom {\n\t\tclip-path: polygon(\n\t\t\t50% 50%, 50% 50%, 50% 50%, 50% 50%,\n\t\t\t50% 50%, 50% 50%, 50% 50%, 50% 50%,\n\t\t\t50% 50%, 50% 50%, 50% 50%, 50% 50%\n\t\t);\n\t}\n\tto {\n\t\tclip-path: polygon(\n\t\t\t33% 0%, 66% 0%, 66% 33%, 100% 33%,\n\t\t\t100% 66%, 66% 66%, 66% 100%, 33% 100%,\n\t\t\t33% 66%, 0% 66%, 0% 33%, 33% 33%\n\t\t);\n\t}\n}\n\n/* \u2500\u2500 Wedge \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-wedge-in {\n\tfrom { clip-path: polygon(50% 0%, 50% 0%, 50% 0%); }\n\tto { clip-path: polygon(50% 0%, 100% 100%, 0% 100%); }\n}\n\n/* \u2500\u2500 Zoom \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-zoom-in {\n\tfrom { transform: scale(0); opacity: 0; }\n\tto { transform: scale(1); opacity: 1; }\n}\n@keyframes pptx-tr-zoom-out {\n\tfrom { transform: scale(1); opacity: 1; }\n\tto { transform: scale(2); opacity: 0; }\n}\n\n/* \u2500\u2500 Blinds \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-blinds-h {\n\tfrom { clip-path: inset(0 0 100% 0); }\n\tto { clip-path: inset(0); }\n}\n@keyframes pptx-tr-blinds-v {\n\tfrom { clip-path: inset(0 100% 0 0); }\n\tto { clip-path: inset(0); }\n}\n\n/* \u2500\u2500 Checker (approximate with dissolve + contrast) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-checker-in {\n\tfrom { opacity: 0; filter: contrast(2) blur(2px); }\n\tto { opacity: 1; filter: contrast(1) blur(0); }\n}\n\n/* \u2500\u2500 Comb \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-comb-h {\n\tfrom { clip-path: inset(0 100% 0 0); }\n\tto { clip-path: inset(0); }\n}\n@keyframes pptx-tr-comb-v {\n\tfrom { clip-path: inset(100% 0 0 0); }\n\tto { clip-path: inset(0); }\n}\n\n/* \u2500\u2500 Strips (diagonal) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-strips-lu {\n\tfrom { clip-path: polygon(0% 0%, 0% 0%, 0% 0%); }\n\tto { clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%); }\n}\n@keyframes pptx-tr-strips-ld {\n\tfrom { clip-path: polygon(0% 100%, 0% 100%, 0% 100%); }\n\tto { clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%); }\n}\n@keyframes pptx-tr-strips-ru {\n\tfrom { clip-path: polygon(100% 0%, 100% 0%, 100% 0%); }\n\tto { clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%); }\n}\n@keyframes pptx-tr-strips-rd {\n\tfrom { clip-path: polygon(100% 100%, 100% 100%, 100% 100%); }\n\tto { clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%); }\n}\n\n/* \u2500\u2500 RandomBar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-randombar-h {\n\tfrom { opacity: 0; clip-path: inset(0 0 100% 0); }\n\tto { opacity: 1; clip-path: inset(0); }\n}\n@keyframes pptx-tr-randombar-v {\n\tfrom { opacity: 0; clip-path: inset(0 100% 0 0); }\n\tto { opacity: 1; clip-path: inset(0); }\n}\n\n/* \u2500\u2500 Newsflash \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-newsflash-in {\n\tfrom { transform: rotate(720deg) scale(0); opacity: 0; }\n\tto { transform: rotate(0deg) scale(1); opacity: 1; }\n}\n\n/* \u2500\u2500 Wheel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@keyframes pptx-tr-wheel-in {\n\tfrom { clip-path: circle(0% at 50% 50%); transform: rotate(-180deg); }\n\tto { clip-path: circle(75% at 50% 50%); transform: rotate(0deg); }\n}\n";
32
+ /** Default transition duration (ms) when the transition omits `durationMs`. */
33
+ export declare const DEFAULT_TRANSITION_DURATION_MS = 1000;
34
+ /**
35
+ * Map a {@link PptxTransitionType} (+ duration/direction/orient/spokes) to the
36
+ * concrete CSS `animation` descriptors for the outgoing and incoming layers.
37
+ *
38
+ * Unknown types fall back to a symmetrical cross-fade.
39
+ */
40
+ export declare function getSlideTransitionAnimations(type: PptxTransitionType, durationMs: number, direction: string | undefined, orient?: string | undefined, spokes?: number | undefined): SlideTransitionAnimations;
41
+ /**
42
+ * Convenience wrapper that reads everything off a {@link PptxSlideTransition},
43
+ * applying the default duration when none is set. `none`/`cut` and a transition
44
+ * with a non-positive duration resolve to {@link INSTANT}.
45
+ */
46
+ export declare function resolveSlideTransition(transition: PptxSlideTransition | undefined): SlideTransitionAnimations;
47
+ /**
48
+ * The effective duration (ms) for a transition — the configured `durationMs`,
49
+ * or {@link DEFAULT_TRANSITION_DURATION_MS} when unset/invalid. `none`/`cut`
50
+ * resolve to `0` (instant).
51
+ */
52
+ export declare function resolveTransitionDurationMs(transition: PptxSlideTransition | undefined): number;
53
+ //# sourceMappingURL=slide-transition-css.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slide-transition-css.d.ts","sourceRoot":"","sources":["../../../src/viewer/composables/slide-transition-css.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAMhF,yEAAyE;AACzE,MAAM,WAAW,yBAAyB;IACzC,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,aAAa,EAAE,OAAO,CAAC;CACvB;AAMD,gEAAgE;AAChE,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,CAAC;AAEjE,8EAA8E;AAC9E,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE/E,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAC/B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,UAAU,EAAE,iBAAiB,GAC3B,iBAAiB,CAanB;AAED,wEAAwE;AACxE,wBAAgB,iBAAiB,CAChC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,UAAU,EAAE,iBAAiB,GAC3B,kBAAkB,CAkBpB;AAED,yEAAyE;AACzE,wBAAgB,kBAAkB,CACjC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,MAAM,EAAE,MAAM,GAAG,SAAS,GACxB,MAAM,GAAG,MAAM,CAQjB;AAED,mFAAmF;AACnF,eAAO,MAAM,qBAAqB,EAAE,SAAS,kBAAkB,EAQ9D,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,OAAO,EAAE,yBAIrB,CAAC;AAMF;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,w0YAsQ1C,CAAC;AAMF,+EAA+E;AAC/E,eAAO,MAAM,8BAA8B,OAAO,CAAC;AAKnD;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC3C,IAAI,EAAE,kBAAkB,EACxB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,EAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,GACzB,yBAAyB,CAuP3B;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACrC,UAAU,EAAE,mBAAmB,GAAG,SAAS,GACzC,yBAAyB,CAe3B;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,mBAAmB,GAAG,SAAS,GAAG,MAAM,CAO/F"}
@@ -1,18 +1,22 @@
1
1
  import { PptxSlide } from 'pptx-viewer-core';
2
- import { Ref } from 'vue';
2
+ import { ComputedRef, Ref } from 'vue';
3
3
  import { RemoteCursor } from '../components/CollaborationCursors.vue';
4
4
  import { CollaborationConfig } from '../types';
5
5
  /**
6
6
  * Minimal real-time collaboration over Yjs + y-websocket.
7
7
  *
8
- * Scope (foundational): the slide model is broadcast as a whole-document JSON
9
- * value in a shared `Y.Map` (last-write-wins, not per-field CRDT) and remote
10
- * collaborators' cursors are surfaced via the y-websocket **awareness** channel.
11
- * `yjs`/`y-websocket` are imported lazily so they stay out of the main chunk and
12
- * are only loaded when a session actually starts.
8
+ * Scope: the slide model is broadcast as a whole-document JSON value in a shared
9
+ * `Y.Map` (last-write-wins, not per-field CRDT) and remote collaborators'
10
+ * **presence** cursor position, selected element ids and active slide index —
11
+ * is surfaced via the y-websocket **awareness** channel. `yjs`/`y-websocket` are
12
+ * imported lazily so they stay out of the main chunk and are only loaded when a
13
+ * session actually starts.
13
14
  *
14
- * This is intentionally a pragmatic baseline fine-grained CRDT merging of the
15
- * element tree and presence (selection highlights, follow-mode) are future work.
15
+ * On top of presence this composable adds **follow-mode**: the local user can
16
+ * follow a chosen peer (`followUser(clientId)`), after which `followedSlideIndex`
17
+ * reactively mirrors that peer's active slide so the host can drive navigation.
18
+ *
19
+ * Fine-grained CRDT merging of the element tree remains future work.
16
20
  */
17
21
  export interface UseCollaborationOptions {
18
22
  /** The editor's reactive slides ref (broadcast on local change). */
@@ -22,19 +26,56 @@ export interface UseCollaborationOptions {
22
26
  /** This user's cursor/label colour. */
23
27
  userColor?: string;
24
28
  }
29
+ /**
30
+ * A remote peer's full presence: identity plus the live cursor, selection and
31
+ * active slide they have published over awareness. `cursor` is absent until the
32
+ * peer moves their pointer; `selectionIds`/`activeSlide` default to empty/0.
33
+ */
34
+ export interface RemotePresence {
35
+ /** The peer's awareness clientId. */
36
+ clientId: number;
37
+ /** Display name (falls back to `'Guest'`). */
38
+ userName: string;
39
+ /** Cursor + label colour. */
40
+ color: string;
41
+ /** Last published cursor position (unscaled slide px), if any. */
42
+ cursor?: {
43
+ x: number;
44
+ y: number;
45
+ };
46
+ /** Ids of elements the peer currently has selected. */
47
+ selectionIds: string[];
48
+ /** Slide index the peer is currently viewing. */
49
+ activeSlide: number;
50
+ }
25
51
  export interface UseCollaborationResult {
26
52
  /** True once the websocket provider reports a connection. */
27
53
  connected: Ref<boolean>;
28
54
  /** Remote collaborators' live cursors (excludes self). */
29
55
  cursors: Ref<RemoteCursor[]>;
56
+ /** Remote collaborators' full presence — cursor + selection + slide (excludes self). */
57
+ remotePresences: Ref<RemotePresence[]>;
30
58
  /** Whether a session is currently active. */
31
59
  active: Ref<boolean>;
60
+ /** The clientId of the peer currently being followed, or null. */
61
+ followedClientId: Ref<number | null>;
62
+ /**
63
+ * The active-slide index of the followed peer, or null when not following
64
+ * (or the followed peer has left). The host watches this to navigate.
65
+ */
66
+ followedSlideIndex: ComputedRef<number | null>;
32
67
  /** Connect to a room and begin syncing. */
33
68
  start: (config: CollaborationConfig) => Promise<void>;
34
69
  /** Disconnect and tear down the session. */
35
70
  stop: () => void;
36
71
  /** Publish this user's cursor position (unscaled slide px). */
37
72
  setCursor: (x: number, y: number) => void;
73
+ /** Publish this user's selected element ids. */
74
+ setSelection: (ids: string[]) => void;
75
+ /** Publish this user's active slide index. */
76
+ setActiveSlide: (index: number) => void;
77
+ /** Follow a peer's active slide (or `null` to stop following). */
78
+ followUser: (clientId: number | null) => void;
38
79
  }
39
80
  export declare function useCollaboration(options: UseCollaborationOptions): UseCollaborationResult;
40
81
  //# sourceMappingURL=useCollaboration.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useCollaboration.d.ts","sourceRoot":"","sources":["../../../src/viewer/composables/useCollaboration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEpD;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,uBAAuB;IACvC,oEAAoE;IACpE,MAAM,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;IACzB,8DAA8D;IAC9D,cAAc,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;IAC9C,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACtC,6DAA6D;IAC7D,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACxB,0DAA0D;IAC1D,OAAO,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;IAC7B,6CAA6C;IAC7C,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,2CAA2C;IAC3C,KAAK,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,4CAA4C;IAC5C,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,+DAA+D;IAC/D,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C;AAYD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,sBAAsB,CA0HzF"}
1
+ {"version":3,"file":"useCollaboration.d.ts","sourceRoot":"","sources":["../../../src/viewer/composables/useCollaboration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEpD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,uBAAuB;IACvC,oEAAoE;IACpE,MAAM,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;IACzB,8DAA8D;IAC9D,cAAc,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;IAC9C,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC9B,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,MAAM,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClC,uDAAuD;IACvD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACtC,6DAA6D;IAC7D,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACxB,0DAA0D;IAC1D,OAAO,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;IAC7B,wFAAwF;IACxF,eAAe,EAAE,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;IACvC,6CAA6C;IAC7C,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,kEAAkE;IAClE,gBAAgB,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACrC;;;OAGG;IACH,kBAAkB,EAAE,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC/C,2CAA2C;IAC3C,KAAK,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,4CAA4C;IAC5C,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,+DAA+D;IAC/D,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,gDAAgD;IAChD,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACtC,8CAA8C;IAC9C,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,kEAAkE;IAClE,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC9C;AA8CD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,sBAAsB,CAkMzF"}