@viceme-ai/sdk-poc 0.1.7-poc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +71 -0
  2. package/dist/bootstrap.min.js +2 -0
  3. package/dist/bootstrap.min.js.map +1 -0
  4. package/dist/chunks/client-DgGpWHrf.js +959 -0
  5. package/dist/chunks/client-DgGpWHrf.js.map +1 -0
  6. package/dist/chunks/version-mxCwx8AO.js +51 -0
  7. package/dist/chunks/version-mxCwx8AO.js.map +1 -0
  8. package/dist/core/build-endpoints.d.ts +9 -0
  9. package/dist/core/build-endpoints.d.ts.map +1 -0
  10. package/dist/core/capabilities.d.ts +63 -0
  11. package/dist/core/capabilities.d.ts.map +1 -0
  12. package/dist/core/client.d.ts +65 -0
  13. package/dist/core/client.d.ts.map +1 -0
  14. package/dist/core/config.d.ts +32 -0
  15. package/dist/core/config.d.ts.map +1 -0
  16. package/dist/core/errors.d.ts +37 -0
  17. package/dist/core/errors.d.ts.map +1 -0
  18. package/dist/core/lifecycle.d.ts +25 -0
  19. package/dist/core/lifecycle.d.ts.map +1 -0
  20. package/dist/core/presentation.d.ts +32 -0
  21. package/dist/core/presentation.d.ts.map +1 -0
  22. package/dist/danmaku/anchor.d.ts +14 -0
  23. package/dist/danmaku/anchor.d.ts.map +1 -0
  24. package/dist/danmaku/index.d.ts +8 -0
  25. package/dist/danmaku/index.d.ts.map +1 -0
  26. package/dist/danmaku/mount.d.ts +4 -0
  27. package/dist/danmaku/mount.d.ts.map +1 -0
  28. package/dist/danmaku.js +143 -0
  29. package/dist/danmaku.js.map +1 -0
  30. package/dist/generated/public-contract.d.ts +700 -0
  31. package/dist/generated/public-contract.d.ts.map +1 -0
  32. package/dist/index.d.ts +28 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +128 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/loader/attributes.d.ts +21 -0
  37. package/dist/loader/attributes.d.ts.map +1 -0
  38. package/dist/loader/auto-loader.d.ts +51 -0
  39. package/dist/loader/auto-loader.d.ts.map +1 -0
  40. package/dist/loader/bootstrap.d.ts +1 -0
  41. package/dist/loader/bootstrap.d.ts.map +1 -0
  42. package/dist/loader/events.d.ts +45 -0
  43. package/dist/loader/events.d.ts.map +1 -0
  44. package/dist/loader/main.d.ts +11 -0
  45. package/dist/loader/main.d.ts.map +1 -0
  46. package/dist/loader/mount-handle.d.ts +25 -0
  47. package/dist/loader/mount-handle.d.ts.map +1 -0
  48. package/dist/loader/registry.d.ts +42 -0
  49. package/dist/loader/registry.d.ts.map +1 -0
  50. package/dist/manifest.json +52 -0
  51. package/dist/session/session.d.ts +67 -0
  52. package/dist/session/session.d.ts.map +1 -0
  53. package/dist/testing/test-adapter.d.ts +59 -0
  54. package/dist/testing/test-adapter.d.ts.map +1 -0
  55. package/dist/testing.d.ts +9 -0
  56. package/dist/testing.d.ts.map +1 -0
  57. package/dist/testing.js +75 -0
  58. package/dist/testing.js.map +1 -0
  59. package/dist/transport/transport.d.ts +44 -0
  60. package/dist/transport/transport.d.ts.map +1 -0
  61. package/dist/version.d.ts +10 -0
  62. package/dist/version.d.ts.map +1 -0
  63. package/dist/viceme.min.js +2 -0
  64. package/dist/viceme.min.js.map +1 -0
  65. package/package.json +63 -0
@@ -0,0 +1,143 @@
1
+ import { V as _, B as K, S as R } from "./chunks/version-mxCwx8AO.js";
2
+ function C(n = window, o = document) {
3
+ const t = U(n, o), e = V(n, o);
4
+ return {
5
+ anchorKey: `page:${z(t)}:scroll:${e}`,
6
+ scrollBucket: e
7
+ };
8
+ }
9
+ function U(n, o) {
10
+ const t = o.querySelector('link[rel="canonical"][href]'), e = t?.href || n.location.href;
11
+ try {
12
+ const l = new URL(e, n.location.href);
13
+ return l.username = "", l.password = "", t && !l.hash && n.location.hash && (l.hash = n.location.hash), l.toString();
14
+ } catch {
15
+ return n.location.href;
16
+ }
17
+ }
18
+ function V(n, o) {
19
+ const t = o.documentElement, e = o.body, l = n.scrollY || n.pageYOffset || t.scrollTop || e?.scrollTop || 0, d = Math.max(
20
+ t.scrollHeight,
21
+ t.offsetHeight,
22
+ t.clientHeight,
23
+ e?.scrollHeight ?? 0,
24
+ e?.offsetHeight ?? 0
25
+ ), k = Math.max(0, d - n.innerHeight);
26
+ if (k <= 1) return "0-100";
27
+ const b = Math.max(0, Math.min(99, l / k * 100)), u = Math.min(90, Math.floor(b / 10) * 10);
28
+ return `${u}-${u + 10}`;
29
+ }
30
+ function z(n) {
31
+ let o = 3735928559 ^ n.length, t = 1103547991 ^ n.length;
32
+ for (let e = 0; e < n.length; e += 1) {
33
+ const l = n.charCodeAt(e);
34
+ o = Math.imul(o ^ l, 2654435761), t = Math.imul(t ^ l, 1597334677);
35
+ }
36
+ return o = Math.imul(o ^ o >>> 16, 2246822507), o ^= Math.imul(t ^ t >>> 13, 3266489909), t = Math.imul(t ^ t >>> 16, 2246822507), t ^= Math.imul(o ^ o >>> 13, 3266489909), ((t >>> 0).toString(36).padStart(7, "0") + (o >>> 0).toString(36).padStart(7, "0")).slice(0, 16);
37
+ }
38
+ const w = 136, B = 360, O = 120, W = 1e3;
39
+ async function $(n, o) {
40
+ if (await n.ready(), !n.hasCapability("danmaku"))
41
+ throw new _({
42
+ code: "CAPABILITY_DISABLED",
43
+ message: "Danmaku is not enabled for this work.",
44
+ retryable: !1,
45
+ capability: "danmaku"
46
+ });
47
+ const t = o.target.ownerDocument, e = t.defaultView;
48
+ if (!e)
49
+ throw new _({
50
+ code: "CONFIG_INVALID",
51
+ message: "Danmaku requires a browser document.",
52
+ retryable: !1,
53
+ capability: "danmaku"
54
+ });
55
+ const l = K[n.region];
56
+ let d = C(e, t);
57
+ const k = t.documentElement.lang.trim() || e.navigator.language || "en";
58
+ let b = !1, u;
59
+ const S = /* @__PURE__ */ new WeakSet(), h = t.createElement("div");
60
+ h.dataset.vicemeDanmaku = "mounted", h.style.position = "fixed", h.style.inset = "0", h.style.width = "100%", h.style.height = "100%", h.style.pointerEvents = "none", h.style.zIndex = "2147483000", h.style.contain = "layout style size";
61
+ const H = h.attachShadow({ mode: "open" }), x = t.createElement("style");
62
+ x.textContent = `
63
+ :host { all: initial; }
64
+ *, *::before, *::after { box-sizing: border-box; }
65
+ iframe { color-scheme: normal; }
66
+ `;
67
+ const f = t.createElement("div");
68
+ f.style.position = "fixed", f.style.inset = "0", f.style.width = "100%", f.style.height = "100%", f.style.pointerEvents = "none", H.append(x, f);
69
+ const L = (s) => {
70
+ const i = new URL("/embed/danmaku", l);
71
+ return i.searchParams.set("mode", s), i.searchParams.set("workKey", n.workKey), i.searchParams.set("theme", o.theme), i.searchParams.set("locale", k), i.searchParams.set("sdk", R), i.searchParams.set("anchorKey", d.anchorKey), i;
72
+ }, M = (s, i, v) => {
73
+ const a = t.createElement("iframe");
74
+ return a.title = i, a.src = v, a.loading = "eager", a.referrerPolicy = "no-referrer", a.setAttribute("allowtransparency", "true"), a.setAttribute(
75
+ "sandbox",
76
+ "allow-forms allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts"
77
+ ), a.dataset.mode = s, a.style.position = "fixed", a.style.margin = "0", a.style.border = "0", a.style.background = "transparent", a.style.width = "100%", a.style.zIndex = "2147483000", a;
78
+ }, m = M("stage", "ViceMe Danmaku", L("stage").toString());
79
+ m.setAttribute("aria-hidden", "true"), m.style.inset = "0", m.style.height = "100%", m.style.pointerEvents = "none";
80
+ const c = M(
81
+ "controls",
82
+ "ViceMe Danmaku controls",
83
+ L("controls").toString()
84
+ );
85
+ c.style.left = "0", c.style.right = "0", c.style.bottom = "0", c.style.height = `calc(${w}px + env(safe-area-inset-bottom, 0px))`, c.style.pointerEvents = "auto";
86
+ const r = M("modal", "ViceMe Danmaku dialog", "about:blank");
87
+ r.dataset.src = L("modal").toString(), r.style.inset = "0", r.style.height = "100%", r.style.display = "none", r.style.pointerEvents = "auto", f.append(m, c, r), o.target.appendChild(h);
88
+ const E = (s) => {
89
+ S.has(s) && s.contentWindow?.postMessage(
90
+ {
91
+ source: "viceme-danmaku",
92
+ action: "anchor-change",
93
+ anchorKey: d.anchorKey
94
+ },
95
+ l
96
+ );
97
+ }, A = () => {
98
+ E(m), E(c), r.getAttribute("src") !== "about:blank" && E(r);
99
+ }, I = () => {
100
+ if (b) return d;
101
+ const s = C(e, t);
102
+ return s.anchorKey !== d.anchorKey && (d = s, A()), d;
103
+ }, g = () => {
104
+ u !== void 0 && e.clearTimeout(u), u = e.setTimeout(I, O);
105
+ }, p = (s) => {
106
+ const i = s.currentTarget;
107
+ i.getAttribute("src") !== "about:blank" && (S.add(i), E(i));
108
+ };
109
+ m.addEventListener("load", p), c.addEventListener("load", p), r.addEventListener("load", p);
110
+ const D = (s) => {
111
+ if (s.origin !== l) return;
112
+ const i = s.source === m.contentWindow, v = s.source === c.contentWindow, a = s.source === r.contentWindow;
113
+ if (!i && !v && !a) return;
114
+ const y = s.data;
115
+ if (!(!y || y.source !== "viceme-danmaku")) {
116
+ if (y.action === "resize-controls" && v) {
117
+ const T = Number(y.height), P = Math.max(
118
+ w,
119
+ Math.min(B, Number.isFinite(T) ? T : w)
120
+ );
121
+ c.style.height = `calc(${P}px + env(safe-area-inset-bottom, 0px))`;
122
+ }
123
+ y.action === "request-anchor" && E(a ? r : i ? m : c), y.action === "open-modal" && v && (r.getAttribute("src") === "about:blank" && (r.src = r.dataset.src ?? "about:blank"), r.style.display = "block"), y.action === "close-modal" && (a || v) && (r.style.display = "none");
124
+ }
125
+ };
126
+ e.addEventListener("message", D), e.addEventListener("scroll", g, { passive: !0 }), e.addEventListener("resize", g), e.addEventListener("popstate", g), e.addEventListener("hashchange", g);
127
+ const N = e.setInterval(I, W);
128
+ return A(), {
129
+ capability: "danmaku",
130
+ destroy() {
131
+ b || (b = !0, u !== void 0 && e.clearTimeout(u), e.clearInterval(N), e.removeEventListener("message", D), e.removeEventListener("scroll", g), e.removeEventListener("resize", g), e.removeEventListener("popstate", g), e.removeEventListener("hashchange", g), m.removeEventListener("load", p), c.removeEventListener("load", p), r.removeEventListener("load", p), h.remove());
132
+ }
133
+ };
134
+ }
135
+ function G(n, o) {
136
+ return $(n, o);
137
+ }
138
+ export {
139
+ $ as mount,
140
+ G as mountDanmaku,
141
+ C as readDanmakuPageAnchor
142
+ };
143
+ //# sourceMappingURL=danmaku.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"danmaku.js","sources":["../src/danmaku/anchor.ts","../src/danmaku/mount.ts","../src/danmaku/index.ts"],"sourcesContent":["export interface DanmakuPageAnchor {\n /** Stable page-and-position key sent to the hosted danmaku runtime. */\n anchorKey: string;\n /** Human-readable 10% scroll bucket, useful for diagnostics. */\n scrollBucket: string;\n}\n\n/**\n * Build a stable page-position anchor without exposing the page URL.\n *\n * Canonical URLs and SPA hash routes participate in the local hash. Only the\n * resulting opaque key leaves the host page.\n */\nexport function readDanmakuPageAnchor(\n windowObject: Window = window,\n documentObject: Document = document,\n): DanmakuPageAnchor {\n const pageUrl = canonicalPageUrl(windowObject, documentObject);\n const bucket = scrollBucket(windowObject, documentObject);\n return {\n anchorKey: `page:${hashString(pageUrl)}:scroll:${bucket}`,\n scrollBucket: bucket,\n };\n}\n\nfunction canonicalPageUrl(windowObject: Window, documentObject: Document): string {\n const canonical = documentObject.querySelector<HTMLLinkElement>('link[rel=\"canonical\"][href]');\n const rawUrl = canonical?.href || windowObject.location.href;\n try {\n const url = new URL(rawUrl, windowObject.location.href);\n url.username = '';\n url.password = '';\n if (canonical && !url.hash && windowObject.location.hash) {\n url.hash = windowObject.location.hash;\n }\n return url.toString();\n } catch {\n return windowObject.location.href;\n }\n}\n\nfunction scrollBucket(windowObject: Window, documentObject: Document): string {\n const root = documentObject.documentElement;\n const body = documentObject.body;\n const scrollTop =\n windowObject.scrollY || windowObject.pageYOffset || root.scrollTop || body?.scrollTop || 0;\n const scrollHeight = Math.max(\n root.scrollHeight,\n root.offsetHeight,\n root.clientHeight,\n body?.scrollHeight ?? 0,\n body?.offsetHeight ?? 0,\n );\n const maxScroll = Math.max(0, scrollHeight - windowObject.innerHeight);\n if (maxScroll <= 1) return '0-100';\n\n const percent = Math.max(0, Math.min(99, (scrollTop / maxScroll) * 100));\n const start = Math.min(90, Math.floor(percent / 10) * 10);\n return `${start}-${start + 10}`;\n}\n\n/** Deterministic 64-bit-style hash encoded as at most 16 base36 characters. */\nfunction hashString(value: string): string {\n let high = 0xdeadbeef ^ value.length;\n let low = 0x41c6ce57 ^ value.length;\n for (let index = 0; index < value.length; index += 1) {\n const character = value.charCodeAt(index);\n high = Math.imul(high ^ character, 2654435761);\n low = Math.imul(low ^ character, 1597334677);\n }\n high = Math.imul(high ^ (high >>> 16), 2246822507);\n high ^= Math.imul(low ^ (low >>> 13), 3266489909);\n low = Math.imul(low ^ (low >>> 16), 2246822507);\n low ^= Math.imul(high ^ (high >>> 13), 3266489909);\n return (\n (low >>> 0).toString(36).padStart(7, '0') + (high >>> 0).toString(36).padStart(7, '0')\n ).slice(0, 16);\n}\n","import type { ViceMeClient } from '../core/client.ts';\nimport { BUILD_WIDGET_ORIGINS } from '../core/build-endpoints.ts';\nimport { ViceMeError } from '../core/errors.ts';\nimport type { CapabilityMountHandle, CapabilityMountOptions } from '../loader/mount-handle.ts';\nimport { SDK_VERSION } from '../version.ts';\nimport { readDanmakuPageAnchor, type DanmakuPageAnchor } from './anchor.ts';\n\ntype DanmakuFrameMode = 'stage' | 'controls' | 'modal';\n\ninterface DanmakuBridgeMessage {\n source?: unknown;\n action?: unknown;\n height?: unknown;\n}\n\nconst CONTROLS_MIN_HEIGHT = 136;\nconst CONTROLS_MAX_HEIGHT = 360;\nconst ANCHOR_DEBOUNCE_MS = 120;\nconst LOCATION_POLL_MS = 1_000;\n\nexport async function mount(\n client: ViceMeClient,\n options: CapabilityMountOptions,\n): Promise<CapabilityMountHandle> {\n await client.ready();\n if (!client.hasCapability('danmaku')) {\n throw new ViceMeError({\n code: 'CAPABILITY_DISABLED',\n message: 'Danmaku is not enabled for this work.',\n retryable: false,\n capability: 'danmaku',\n });\n }\n\n const documentObject = options.target.ownerDocument;\n const windowObject = documentObject.defaultView;\n if (!windowObject) {\n throw new ViceMeError({\n code: 'CONFIG_INVALID',\n message: 'Danmaku requires a browser document.',\n retryable: false,\n capability: 'danmaku',\n });\n }\n\n const widgetOrigin = BUILD_WIDGET_ORIGINS[client.region];\n let currentAnchor = readDanmakuPageAnchor(windowObject, documentObject);\n const locale =\n documentObject.documentElement.lang.trim() || windowObject.navigator.language || 'en';\n let destroyed = false;\n let anchorTimer: number | undefined;\n const loadedFrames = new WeakSet<HTMLIFrameElement>();\n\n const portal = documentObject.createElement('div');\n portal.dataset.vicemeDanmaku = 'mounted';\n portal.style.position = 'fixed';\n portal.style.inset = '0';\n portal.style.width = '100%';\n portal.style.height = '100%';\n portal.style.pointerEvents = 'none';\n portal.style.zIndex = '2147483000';\n portal.style.contain = 'layout style size';\n\n const shadow = portal.attachShadow({ mode: 'open' });\n const style = documentObject.createElement('style');\n style.textContent = `\n :host { all: initial; }\n *, *::before, *::after { box-sizing: border-box; }\n iframe { color-scheme: normal; }\n `;\n const root = documentObject.createElement('div');\n root.style.position = 'fixed';\n root.style.inset = '0';\n root.style.width = '100%';\n root.style.height = '100%';\n root.style.pointerEvents = 'none';\n shadow.append(style, root);\n\n const frameUrl = (mode: DanmakuFrameMode): URL => {\n const url = new URL('/embed/danmaku', widgetOrigin);\n url.searchParams.set('mode', mode);\n url.searchParams.set('workKey', client.workKey);\n url.searchParams.set('theme', options.theme);\n url.searchParams.set('locale', locale);\n url.searchParams.set('sdk', SDK_VERSION);\n url.searchParams.set('anchorKey', currentAnchor.anchorKey);\n return url;\n };\n\n const createFrame = (\n mode: DanmakuFrameMode,\n title: string,\n source: string,\n ): HTMLIFrameElement => {\n const frame = documentObject.createElement('iframe');\n frame.title = title;\n frame.src = source;\n frame.loading = 'eager';\n frame.referrerPolicy = 'no-referrer';\n frame.setAttribute('allowtransparency', 'true');\n frame.setAttribute(\n 'sandbox',\n 'allow-forms allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts',\n );\n frame.dataset.mode = mode;\n frame.style.position = 'fixed';\n frame.style.margin = '0';\n frame.style.border = '0';\n frame.style.background = 'transparent';\n frame.style.width = '100%';\n frame.style.zIndex = '2147483000';\n return frame;\n };\n\n const stage = createFrame('stage', 'ViceMe Danmaku', frameUrl('stage').toString());\n stage.setAttribute('aria-hidden', 'true');\n stage.style.inset = '0';\n stage.style.height = '100%';\n stage.style.pointerEvents = 'none';\n\n const controls = createFrame(\n 'controls',\n 'ViceMe Danmaku controls',\n frameUrl('controls').toString(),\n );\n controls.style.left = '0';\n controls.style.right = '0';\n controls.style.bottom = '0';\n controls.style.height = `calc(${CONTROLS_MIN_HEIGHT}px + env(safe-area-inset-bottom, 0px))`;\n controls.style.pointerEvents = 'auto';\n\n const modal = createFrame('modal', 'ViceMe Danmaku dialog', 'about:blank');\n modal.dataset.src = frameUrl('modal').toString();\n modal.style.inset = '0';\n modal.style.height = '100%';\n modal.style.display = 'none';\n modal.style.pointerEvents = 'auto';\n\n root.append(stage, controls, modal);\n options.target.appendChild(portal);\n\n const postAnchor = (frame: HTMLIFrameElement): void => {\n if (!loadedFrames.has(frame)) return;\n frame.contentWindow?.postMessage(\n {\n source: 'viceme-danmaku',\n action: 'anchor-change',\n anchorKey: currentAnchor.anchorKey,\n },\n widgetOrigin,\n );\n };\n const postAnchorToMountedFrames = (): void => {\n postAnchor(stage);\n postAnchor(controls);\n if (modal.getAttribute('src') !== 'about:blank') postAnchor(modal);\n };\n\n const refreshAnchor = (): DanmakuPageAnchor => {\n if (destroyed) return currentAnchor;\n const next = readDanmakuPageAnchor(windowObject, documentObject);\n if (next.anchorKey !== currentAnchor.anchorKey) {\n currentAnchor = next;\n postAnchorToMountedFrames();\n }\n return currentAnchor;\n };\n const scheduleAnchorRefresh = (): void => {\n if (anchorTimer !== undefined) windowObject.clearTimeout(anchorTimer);\n anchorTimer = windowObject.setTimeout(refreshAnchor, ANCHOR_DEBOUNCE_MS);\n };\n\n const frameLoaded = (event: Event): void => {\n const frame = event.currentTarget as HTMLIFrameElement;\n if (frame.getAttribute('src') === 'about:blank') return;\n loadedFrames.add(frame);\n postAnchor(frame);\n };\n stage.addEventListener('load', frameLoaded);\n controls.addEventListener('load', frameLoaded);\n modal.addEventListener('load', frameLoaded);\n\n const onMessage = (event: MessageEvent): void => {\n if (event.origin !== widgetOrigin) return;\n const fromStage = event.source === stage.contentWindow;\n const fromControls = event.source === controls.contentWindow;\n const fromModal = event.source === modal.contentWindow;\n if (!fromStage && !fromControls && !fromModal) return;\n\n const message = event.data as DanmakuBridgeMessage | null;\n if (!message || message.source !== 'viceme-danmaku') return;\n\n if (message.action === 'resize-controls' && fromControls) {\n const requested = Number(message.height);\n const height = Math.max(\n CONTROLS_MIN_HEIGHT,\n Math.min(CONTROLS_MAX_HEIGHT, Number.isFinite(requested) ? requested : CONTROLS_MIN_HEIGHT),\n );\n controls.style.height = `calc(${height}px + env(safe-area-inset-bottom, 0px))`;\n }\n if (message.action === 'request-anchor') {\n postAnchor(fromModal ? modal : fromStage ? stage : controls);\n }\n if (message.action === 'open-modal' && fromControls) {\n if (modal.getAttribute('src') === 'about:blank') {\n modal.src = modal.dataset.src ?? 'about:blank';\n }\n modal.style.display = 'block';\n }\n if (message.action === 'close-modal' && (fromModal || fromControls)) {\n modal.style.display = 'none';\n }\n };\n\n windowObject.addEventListener('message', onMessage);\n windowObject.addEventListener('scroll', scheduleAnchorRefresh, { passive: true });\n windowObject.addEventListener('resize', scheduleAnchorRefresh);\n windowObject.addEventListener('popstate', scheduleAnchorRefresh);\n windowObject.addEventListener('hashchange', scheduleAnchorRefresh);\n const locationPoll = windowObject.setInterval(refreshAnchor, LOCATION_POLL_MS);\n postAnchorToMountedFrames();\n\n return {\n capability: 'danmaku',\n destroy(): void {\n if (destroyed) return;\n destroyed = true;\n if (anchorTimer !== undefined) windowObject.clearTimeout(anchorTimer);\n windowObject.clearInterval(locationPoll);\n windowObject.removeEventListener('message', onMessage);\n windowObject.removeEventListener('scroll', scheduleAnchorRefresh);\n windowObject.removeEventListener('resize', scheduleAnchorRefresh);\n windowObject.removeEventListener('popstate', scheduleAnchorRefresh);\n windowObject.removeEventListener('hashchange', scheduleAnchorRefresh);\n stage.removeEventListener('load', frameLoaded);\n controls.removeEventListener('load', frameLoaded);\n modal.removeEventListener('load', frameLoaded);\n portal.remove();\n },\n };\n}\n","import type { ViceMeClient } from '../core/client.ts';\nimport type { CapabilityMountHandle, CapabilityMountOptions } from '../loader/mount-handle.ts';\nimport { mount } from './mount.ts';\n\nexport { mount } from './mount.ts';\nexport { readDanmakuPageAnchor } from './anchor.ts';\nexport type { DanmakuPageAnchor } from './anchor.ts';\n\n/** Explicit ESM/npm entry point; the CDN loader calls the same mount function. */\nexport function mountDanmaku(\n client: ViceMeClient,\n options: CapabilityMountOptions,\n): Promise<CapabilityMountHandle> {\n return mount(client, options);\n}\n"],"names":["readDanmakuPageAnchor","windowObject","documentObject","pageUrl","canonicalPageUrl","bucket","scrollBucket","hashString","canonical","rawUrl","url","root","body","scrollTop","scrollHeight","maxScroll","percent","start","value","high","low","index","character","CONTROLS_MIN_HEIGHT","CONTROLS_MAX_HEIGHT","ANCHOR_DEBOUNCE_MS","LOCATION_POLL_MS","mount","client","options","ViceMeError","widgetOrigin","BUILD_WIDGET_ORIGINS","currentAnchor","locale","destroyed","anchorTimer","loadedFrames","portal","shadow","style","frameUrl","mode","SDK_VERSION","createFrame","title","source","frame","stage","controls","modal","postAnchor","postAnchorToMountedFrames","refreshAnchor","next","scheduleAnchorRefresh","frameLoaded","event","onMessage","fromStage","fromControls","fromModal","message","requested","height","locationPoll","mountDanmaku"],"mappings":"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"}