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.
- package/dist/gif-encoder-BfVA22Ng.cjs +106 -0
- package/dist/gif-encoder-BfVA22Ng.cjs.br +0 -0
- package/dist/gif-encoder-BfVA22Ng.cjs.gz +0 -0
- package/dist/gif-encoder-DKeGv43e.js +107 -0
- package/dist/gif-encoder-DKeGv43e.js.br +0 -0
- package/dist/gif-encoder-DKeGv43e.js.gz +0 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.br +0 -0
- package/dist/index.cjs.gz +0 -0
- package/dist/index.js +1 -1
- package/dist/index.js.br +0 -0
- package/dist/index.js.gz +0 -0
- package/dist/viewer/PowerPointViewer.vue.d.ts.map +1 -1
- package/dist/viewer/components/EquationEditorDialog.vue.d.ts.map +1 -1
- package/dist/viewer/components/ExportMenu.vue.d.ts +7 -2
- package/dist/viewer/components/ExportMenu.vue.d.ts.map +1 -1
- package/dist/viewer/components/FollowModeBar.vue.d.ts +15 -0
- package/dist/viewer/components/FollowModeBar.vue.d.ts.map +1 -0
- package/dist/viewer/components/PresentationMode.vue.d.ts.map +1 -1
- package/dist/viewer/components/PresentationTransitionOverlay.vue.d.ts +44 -0
- package/dist/viewer/components/PresentationTransitionOverlay.vue.d.ts.map +1 -0
- package/dist/viewer/components/RemoteSelectionOverlay.vue.d.ts +38 -0
- package/dist/viewer/components/RemoteSelectionOverlay.vue.d.ts.map +1 -0
- package/dist/viewer/composables/gif-encoder.d.ts +29 -0
- package/dist/viewer/composables/gif-encoder.d.ts.map +1 -0
- package/dist/viewer/composables/slide-transition-css.d.ts +53 -0
- package/dist/viewer/composables/slide-transition-css.d.ts.map +1 -0
- package/dist/viewer/composables/useCollaboration.d.ts +49 -8
- package/dist/viewer/composables/useCollaboration.d.ts.map +1 -1
- package/dist/viewer/composables/useLoadContent.d.ts +5 -1
- package/dist/viewer/composables/useLoadContent.d.ts.map +1 -1
- package/dist/viewer/composables/useMediaExport.d.ts +92 -0
- package/dist/viewer/composables/useMediaExport.d.ts.map +1 -0
- package/dist/viewer/index.cjs +1 -1
- package/dist/viewer/index.cjs.br +0 -0
- package/dist/viewer/index.cjs.gz +0 -0
- package/dist/viewer/index.js +1 -1
- package/dist/viewer/index.js.br +0 -0
- package/dist/viewer/index.js.gz +0 -0
- package/dist/{viewer-CeeHIv08.cjs → viewer-B_MKA5ks.cjs} +9142 -8415
- package/dist/viewer-B_MKA5ks.cjs.br +0 -0
- package/dist/viewer-B_MKA5ks.cjs.gz +0 -0
- package/dist/{viewer-BwIIU3HV.js → viewer-BsFcXVHv.js} +2868 -2141
- package/dist/viewer-BsFcXVHv.js.br +0 -0
- package/dist/viewer-BsFcXVHv.js.gz +0 -0
- package/package.json +1 -1
- package/dist/viewer/components/latex-to-omml.d.ts +0 -13
- package/dist/viewer/components/latex-to-omml.d.ts.map +0 -1
- package/dist/viewer-BwIIU3HV.js.br +0 -0
- package/dist/viewer-BwIIU3HV.js.gz +0 -0
- package/dist/viewer-CeeHIv08.cjs.br +0 -0
- 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-
|
|
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-
|
|
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":"
|
|
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":"
|
|
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)
|
|
3
|
-
* Emits intent; the host runs the actual export via
|
|
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":"
|
|
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":"
|
|
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
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* `yjs`/`y-websocket` are
|
|
12
|
-
* are only loaded when a
|
|
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
|
-
*
|
|
15
|
-
*
|
|
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;
|
|
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"}
|