@lemoncat7/dsh-theme-xiaohei 0.3.0-alpha.23 → 0.3.2
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/README.md +39 -17
- package/THIRD_PARTY_NOTICES.md +41 -0
- package/lib/appearance.js +26 -10
- package/lib/blink.js +3 -3
- package/lib/bloub-heixiu/ambient.d.ts +3 -0
- package/lib/bloub-heixiu/ambient.js +12 -0
- package/lib/bloub-heixiu/character.d.ts +33 -0
- package/lib/bloub-heixiu/character.js +124 -0
- package/lib/bloub-heixiu/effects.d.ts +4 -0
- package/lib/bloub-heixiu/effects.js +91 -0
- package/lib/bloub-heixiu/flight.d.ts +15 -0
- package/lib/bloub-heixiu/flight.js +66 -0
- package/lib/bloub-heixiu/follow.d.ts +13 -0
- package/lib/bloub-heixiu/follow.js +23 -0
- package/lib/bloub-heixiu/layout.d.ts +18 -0
- package/lib/bloub-heixiu/layout.js +12 -0
- package/lib/bloub-heixiu/renderer.d.ts +16 -0
- package/lib/bloub-heixiu/renderer.js +94 -0
- package/lib/bloub-heixiu/runtime.d.ts +6 -0
- package/lib/bloub-heixiu/runtime.js +395 -0
- package/lib/bloub-heixiu/signals.d.ts +17 -0
- package/lib/bloub-heixiu/signals.js +53 -0
- package/lib/bloub-heixiu/styles.d.ts +2 -0
- package/lib/bloub-heixiu/styles.js +98 -0
- package/lib/chrome/accessibility.d.ts +1 -1
- package/lib/chrome/accessibility.js +5 -13
- package/lib/chrome/composer-avatar.d.ts +10 -0
- package/lib/chrome/composer-avatar.js +599 -0
- package/lib/chrome/composer-send-heixiu.d.ts +3 -0
- package/lib/chrome/composer-send-heixiu.js +143 -0
- package/lib/chrome/composer.d.ts +2 -2
- package/lib/chrome/composer.js +84 -95
- package/lib/chrome/controls.d.ts +8 -0
- package/lib/chrome/controls.js +348 -0
- package/lib/chrome/conversation-messages.d.ts +1 -1
- package/lib/chrome/conversation-messages.js +207 -9
- package/lib/chrome/conversation.d.ts +1 -1
- package/lib/chrome/conversation.js +6 -0
- package/lib/chrome/identity.js +4 -18
- package/lib/chrome/portal.d.ts +1 -1
- package/lib/chrome/portal.js +1 -1
- package/lib/chrome/sidebar.d.ts +1 -1
- package/lib/chrome/sidebar.js +134 -153
- package/lib/chrome/tokens.d.ts +1 -1
- package/lib/chrome/tokens.js +121 -68
- package/lib/chrome/workspace.d.ts +2 -2
- package/lib/chrome/workspace.js +35 -254
- package/lib/chrome.js +4 -0
- package/lib/client.d.ts +5 -12
- package/lib/client.js +6262 -4455
- package/lib/composer-avatar.d.ts +18 -0
- package/lib/composer-avatar.js +441 -0
- package/lib/composer-send-heixiu.d.ts +8 -0
- package/lib/composer-send-heixiu.js +133 -0
- package/lib/gaze.js +3 -3
- package/lib/generated-backgrounds.d.ts +14 -0
- package/lib/generated-backgrounds.js +14 -0
- package/lib/generated-character-motion.d.ts +4 -0
- package/lib/generated-character-motion.js +2 -0
- package/lib/generated-identity.d.ts +1 -0
- package/lib/generated-identity.js +1 -0
- package/lib/generated-keyart.d.ts +18 -3
- package/lib/generated-keyart.js +18 -3
- package/lib/host-contract.d.ts +9 -0
- package/lib/host-contract.js +13 -0
- package/lib/host-dom.d.ts +11 -0
- package/lib/host-dom.js +60 -0
- package/lib/loading-heixiu.js +3 -3
- package/lib/metallic-brand-mark.d.ts +10 -0
- package/lib/metallic-brand-mark.js +323 -0
- package/lib/plugin.d.ts +1 -1
- package/lib/plugin.js +31 -16
- package/lib/portal.js +11 -10
- package/lib/reactions.js +3 -3
- package/lib/scene/avatar-model.d.ts +6 -0
- package/lib/scene/avatar-model.js +646 -0
- package/lib/scene/avatar-motion.d.ts +3 -0
- package/lib/scene/avatar-motion.js +799 -0
- package/lib/scene/character-idle.d.ts +17 -0
- package/lib/scene/character-idle.js +65 -0
- package/lib/scene/character-layout.d.ts +24 -0
- package/lib/scene/character-layout.js +51 -0
- package/lib/scene/character-motion-clock.d.ts +18 -0
- package/lib/scene/character-motion-clock.js +57 -0
- package/lib/scene/character-motion-types.d.ts +12 -0
- package/lib/scene/character-motion-types.js +2 -0
- package/lib/scene/character-motion.d.ts +6 -0
- package/lib/scene/character-motion.js +126 -0
- package/lib/scene/character-poses.d.ts +26 -0
- package/lib/scene/character-poses.js +11 -0
- package/lib/scene/character-rig-renderer.d.ts +4 -0
- package/lib/scene/character-rig-renderer.js +85 -0
- package/lib/scene/character-rig.d.ts +20 -0
- package/lib/scene/character-rig.js +53 -0
- package/lib/scene/heixiu-feedback.d.ts +1 -1
- package/lib/scene/heixiu-feedback.js +0 -17
- package/lib/scene/pointer-bridge.d.ts +21 -0
- package/lib/scene/pointer-bridge.js +155 -0
- package/lib/scene/runtime.d.ts +12 -0
- package/lib/scene/runtime.js +87 -0
- package/lib/scene/styles.d.ts +7 -0
- package/lib/scene/styles.js +75 -0
- package/lib/scene/sylva-performance.d.ts +11 -0
- package/lib/scene/sylva-performance.js +58 -0
- package/lib/scene/wallpaper-character-styles.d.ts +3 -0
- package/lib/scene/wallpaper-character-styles.js +53 -0
- package/lib/scene/wallpaper-character.d.ts +4 -0
- package/lib/scene/wallpaper-character.js +213 -0
- package/lib/scene.d.ts +7 -13
- package/lib/scene.js +7 -1023
- package/lib/sidebar-glass.js +99 -36
- package/lib/sidebar-heixiu-roaming.js +5 -5
- package/lib/sidebar-reveal.d.ts +8 -0
- package/lib/sidebar-reveal.js +51 -0
- package/lib/state.d.ts +14 -2
- package/lib/state.js +12 -4
- package/lib/theme.js +2 -2
- package/lib/vendor/bloub/decor.d.ts +114 -0
- package/lib/vendor/bloub/decor.js +198 -0
- package/lib/vendor/bloub/engine.d.ts +213 -0
- package/lib/vendor/bloub/engine.js +452 -0
- package/lib/vendor/bloub/expressions.d.ts +35 -0
- package/lib/vendor/bloub/expressions.js +143 -0
- package/lib/vendor/bloub/eyefit.d.ts +75 -0
- package/lib/vendor/bloub/eyefit.js +393 -0
- package/lib/vendor/bloub/face.d.ts +63 -0
- package/lib/vendor/bloub/face.js +106 -0
- package/lib/vendor/bloub/math.d.ts +22 -0
- package/lib/vendor/bloub/math.js +36 -0
- package/lib/vendor/bloub/profiles.d.ts +8 -0
- package/lib/vendor/bloub/profiles.js +20 -0
- package/lib/vendor/bloub/repere.d.ts +30 -0
- package/lib/vendor/bloub/repere.js +32 -0
- package/lib/vendor/bloub/shape.d.ts +80 -0
- package/lib/vendor/bloub/shape.js +268 -0
- package/lib/vendor/bloub/skins.d.ts +36 -0
- package/lib/vendor/bloub/skins.js +74 -0
- package/lib/vendor/bloub/states.d.ts +87 -0
- package/lib/vendor/bloub/states.js +468 -0
- package/package.json +23 -6
- package/lib/appearance.d.ts.map +0 -1
- package/lib/appearance.js.map +0 -1
- package/lib/blink.d.ts.map +0 -1
- package/lib/blink.js.map +0 -1
- package/lib/boot-appearance.d.ts.map +0 -1
- package/lib/boot-appearance.js.map +0 -1
- package/lib/boot-loader.d.ts.map +0 -1
- package/lib/boot-loader.js.map +0 -1
- package/lib/chrome/accessibility.d.ts.map +0 -1
- package/lib/chrome/accessibility.js.map +0 -1
- package/lib/chrome/blink.d.ts.map +0 -1
- package/lib/chrome/blink.js.map +0 -1
- package/lib/chrome/composer.d.ts.map +0 -1
- package/lib/chrome/composer.js.map +0 -1
- package/lib/chrome/conversation-messages.d.ts.map +0 -1
- package/lib/chrome/conversation-messages.js.map +0 -1
- package/lib/chrome/conversation.d.ts.map +0 -1
- package/lib/chrome/conversation.js.map +0 -1
- package/lib/chrome/frames.d.ts.map +0 -1
- package/lib/chrome/frames.js.map +0 -1
- package/lib/chrome/gaze.d.ts.map +0 -1
- package/lib/chrome/gaze.js.map +0 -1
- package/lib/chrome/identity.d.ts.map +0 -1
- package/lib/chrome/identity.js.map +0 -1
- package/lib/chrome/overlays.d.ts.map +0 -1
- package/lib/chrome/overlays.js.map +0 -1
- package/lib/chrome/portal.d.ts.map +0 -1
- package/lib/chrome/portal.js.map +0 -1
- package/lib/chrome/reactions.d.ts.map +0 -1
- package/lib/chrome/reactions.js.map +0 -1
- package/lib/chrome/sidebar.d.ts.map +0 -1
- package/lib/chrome/sidebar.js.map +0 -1
- package/lib/chrome/tokens.d.ts.map +0 -1
- package/lib/chrome/tokens.js.map +0 -1
- package/lib/chrome/workspace.d.ts.map +0 -1
- package/lib/chrome/workspace.js.map +0 -1
- package/lib/chrome.d.ts.map +0 -1
- package/lib/chrome.js.map +0 -1
- package/lib/client.d.ts.map +0 -1
- package/lib/client.js.map +0 -7
- package/lib/gaze.d.ts.map +0 -1
- package/lib/gaze.js.map +0 -1
- package/lib/generated-identity.d.ts.map +0 -1
- package/lib/generated-identity.js.map +0 -1
- package/lib/generated-keyart.d.ts.map +0 -1
- package/lib/generated-keyart.js.map +0 -1
- package/lib/generated-loading-assets.d.ts.map +0 -1
- package/lib/generated-loading-assets.js.map +0 -1
- package/lib/generated-sidebar-assets.d.ts +0 -4
- package/lib/generated-sidebar-assets.d.ts.map +0 -1
- package/lib/generated-sidebar-assets.js +0 -4
- package/lib/generated-sidebar-assets.js.map +0 -1
- package/lib/heixiu-interactions.d.ts.map +0 -1
- package/lib/heixiu-interactions.js.map +0 -1
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/loading-heixiu.d.ts.map +0 -1
- package/lib/loading-heixiu.js.map +0 -1
- package/lib/plugin.d.ts.map +0 -1
- package/lib/plugin.js.map +0 -1
- package/lib/portal.d.ts.map +0 -1
- package/lib/portal.js.map +0 -1
- package/lib/reactions.d.ts.map +0 -1
- package/lib/reactions.js.map +0 -1
- package/lib/scene/heixiu-feedback.d.ts.map +0 -1
- package/lib/scene/heixiu-feedback.js.map +0 -1
- package/lib/scene/heixiu-interactions.d.ts.map +0 -1
- package/lib/scene/heixiu-interactions.js.map +0 -1
- package/lib/scene/state-transitions.d.ts.map +0 -1
- package/lib/scene/state-transitions.js.map +0 -1
- package/lib/scene.d.ts.map +0 -1
- package/lib/scene.js.map +0 -1
- package/lib/sidebar-glass.d.ts.map +0 -1
- package/lib/sidebar-glass.js.map +0 -1
- package/lib/sidebar-heixiu-escape.d.ts.map +0 -1
- package/lib/sidebar-heixiu-escape.js.map +0 -1
- package/lib/sidebar-heixiu-roaming.d.ts.map +0 -1
- package/lib/sidebar-heixiu-roaming.js.map +0 -1
- package/lib/state.d.ts.map +0 -1
- package/lib/state.js.map +0 -1
- package/lib/theme.d.ts.map +0 -1
- package/lib/theme.js.map +0 -1
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { subscribeXiaoheiHostDom } from '../host-dom.js';
|
|
2
|
+
import { XIAOHEI_HOST_SELECTORS } from '../host-contract.js';
|
|
3
|
+
import { XIAOHEI_SCENE_LAYER_ID } from './styles.js';
|
|
4
|
+
import { resolveCharacterPlacement } from './character-layout.js';
|
|
5
|
+
import { createCharacterIdleController } from './character-idle.js';
|
|
6
|
+
import { CHARACTER_POSES, CHARACTER_POSE_NAMES } from './character-poses.js';
|
|
7
|
+
import { createCharacterMotion } from './character-motion.js';
|
|
8
|
+
export const XIAOHEI_WALLPAPER_CHARACTER_ID = 'dsh-theme-xiaohei/wallpaper-character';
|
|
9
|
+
/** Places the layered character only when the host geometry is settled. */
|
|
10
|
+
export function installXiaoheiWallpaperCharacter(doc = typeof document === 'undefined' ? undefined : document) {
|
|
11
|
+
const win = doc?.defaultView;
|
|
12
|
+
if (!doc || !win)
|
|
13
|
+
return () => { };
|
|
14
|
+
let disposed = false;
|
|
15
|
+
let frame;
|
|
16
|
+
let settled;
|
|
17
|
+
let host;
|
|
18
|
+
let targets = [];
|
|
19
|
+
let dirty = true;
|
|
20
|
+
let placement = { pose: 'hidden', left: 0, top: 0, width: 0, height: 0 };
|
|
21
|
+
const ready = new Set();
|
|
22
|
+
const loading = new Set();
|
|
23
|
+
const failed = new Set();
|
|
24
|
+
const motion = typeof win.matchMedia === 'function' ? createCharacterMotion(doc) : undefined;
|
|
25
|
+
const idle = createCharacterIdleController({ now: () => win.performance.now(),
|
|
26
|
+
setTimeout: (fn, delay) => win.setTimeout(fn, delay), clearTimeout: handle => win.clearTimeout(handle),
|
|
27
|
+
}, () => schedule());
|
|
28
|
+
const sizes = new WeakMap();
|
|
29
|
+
const observer = typeof win.ResizeObserver === 'function' ? new win.ResizeObserver(entries => {
|
|
30
|
+
for (const entry of entries) {
|
|
31
|
+
const previous = sizes.get(entry.target);
|
|
32
|
+
const width = entry.contentRect.width;
|
|
33
|
+
const height = entry.contentRect.height;
|
|
34
|
+
sizes.set(entry.target, { width, height });
|
|
35
|
+
// Appending streamed paragraphs changes flow height, not its horizontal
|
|
36
|
+
// safe area. Ignore that size change instead of measuring the whole UI.
|
|
37
|
+
if (!previous || previous.width !== width || (entry.target === targets[0] && previous.height !== height))
|
|
38
|
+
dirty = true;
|
|
39
|
+
}
|
|
40
|
+
if (dirty) {
|
|
41
|
+
schedule();
|
|
42
|
+
scheduleSettled();
|
|
43
|
+
}
|
|
44
|
+
}) : undefined;
|
|
45
|
+
function reconcile() {
|
|
46
|
+
if (disposed || !doc)
|
|
47
|
+
return;
|
|
48
|
+
// The glass owner already tracks the native column's animated geometry.
|
|
49
|
+
// Do not measure controls or rebuild a different rig at intermediate widths.
|
|
50
|
+
if (doc.documentElement?.hasAttribute('data-xiaohei-sidebar-resizing')) {
|
|
51
|
+
dirty = true;
|
|
52
|
+
if (host && host.dataset.pose !== 'hidden')
|
|
53
|
+
host.dataset.pose = 'hidden';
|
|
54
|
+
idle.setPaused(true);
|
|
55
|
+
motion?.setPose(undefined, 'hidden');
|
|
56
|
+
scheduleSettled();
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const layer = doc.getElementById(XIAOHEI_SCENE_LAYER_ID);
|
|
60
|
+
const next = [
|
|
61
|
+
doc.querySelector(XIAOHEI_HOST_SELECTORS.sidebarShell),
|
|
62
|
+
doc.querySelector('[data-conversation-scroll]'),
|
|
63
|
+
doc.querySelector('[data-chat-flow]'),
|
|
64
|
+
doc.querySelector(XIAOHEI_HOST_SELECTORS.composerCard),
|
|
65
|
+
];
|
|
66
|
+
if (next.some((element, i) => element !== targets[i])) {
|
|
67
|
+
targets = next;
|
|
68
|
+
observer?.disconnect();
|
|
69
|
+
for (const element of targets)
|
|
70
|
+
if (element)
|
|
71
|
+
observer?.observe(element);
|
|
72
|
+
dirty = true;
|
|
73
|
+
}
|
|
74
|
+
if (!layer) {
|
|
75
|
+
host?.remove();
|
|
76
|
+
host = undefined;
|
|
77
|
+
idle.setPaused(true);
|
|
78
|
+
motion?.setPose(undefined, 'hidden');
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (!host || host.parentElement !== layer) {
|
|
82
|
+
host?.remove();
|
|
83
|
+
doc.getElementById(XIAOHEI_WALLPAPER_CHARACTER_ID)?.remove();
|
|
84
|
+
host = doc.createElement('div');
|
|
85
|
+
host.id = XIAOHEI_WALLPAPER_CHARACTER_ID;
|
|
86
|
+
host.className = 'xiaohei-wallpaper-character';
|
|
87
|
+
host.setAttribute('aria-hidden', 'true');
|
|
88
|
+
host.dataset.pose = 'hidden';
|
|
89
|
+
for (const pose of CHARACTER_POSE_NAMES) {
|
|
90
|
+
const part = doc.createElement('span');
|
|
91
|
+
part.className = `xiaohei-wallpaper-character__${pose}`;
|
|
92
|
+
host.append(part);
|
|
93
|
+
}
|
|
94
|
+
layer.append(host);
|
|
95
|
+
dirty = true;
|
|
96
|
+
}
|
|
97
|
+
if (!dirty) {
|
|
98
|
+
renderPose();
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
dirty = false;
|
|
102
|
+
const [sidebar, scroll, flow, composer] = targets;
|
|
103
|
+
if (!sidebar || !scroll || !composer) {
|
|
104
|
+
placement = { ...placement, pose: 'hidden' };
|
|
105
|
+
renderPose();
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const sidebarBounds = sidebar.getBoundingClientRect();
|
|
109
|
+
const controls = sidebarBounds.width < 100
|
|
110
|
+
? [...sidebar.querySelectorAll('button,a,input,[role="button"],[role="treeitem"]')]
|
|
111
|
+
.map(e => e.getBoundingClientRect()).filter(r => r.width > 0 && r.height > 0)
|
|
112
|
+
: [];
|
|
113
|
+
const composerBounds = composer.getBoundingClientRect();
|
|
114
|
+
// Native message content is inset 16px from its composer column. Use the
|
|
115
|
+
// same horizontal footprint on the empty welcome page; never use its Y.
|
|
116
|
+
const flowBounds = flow?.getBoundingClientRect() ?? {
|
|
117
|
+
left: composerBounds.left + 16, right: composerBounds.right - 16, top: 0, bottom: 0
|
|
118
|
+
};
|
|
119
|
+
placement = resolveCharacterPlacement({ sidebar: sidebarBounds,
|
|
120
|
+
scroll: scroll.getBoundingClientRect(), flow: flowBounds,
|
|
121
|
+
viewportWidth: win.innerWidth, viewportHeight: win.innerHeight, controls });
|
|
122
|
+
renderPose();
|
|
123
|
+
}
|
|
124
|
+
function renderPose() {
|
|
125
|
+
if (!host || disposed)
|
|
126
|
+
return;
|
|
127
|
+
idle.setPaused(doc.hidden || placement.pose !== 'seated');
|
|
128
|
+
const pose = doc.hidden ? 'hidden' : placement.pose === 'seated' ? idle.pose : placement.pose;
|
|
129
|
+
if (pose === 'hidden') {
|
|
130
|
+
if (host.dataset.pose !== 'hidden')
|
|
131
|
+
host.dataset.pose = 'hidden';
|
|
132
|
+
motion?.setPose(undefined, 'hidden');
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (!ready.has(pose)) {
|
|
136
|
+
motion?.setPose(undefined, 'hidden');
|
|
137
|
+
// Do not retain the old location across a layout change: it could now
|
|
138
|
+
// overlap a message. Idle changes keep the already decoded seated pose.
|
|
139
|
+
if (placement.pose !== 'seated' || !['seated', 'chin', 'doze'].includes(host.dataset.pose ?? ''))
|
|
140
|
+
host.dataset.pose = 'hidden';
|
|
141
|
+
if (!loading.has(pose) && !failed.has(pose)) {
|
|
142
|
+
loading.add(pose);
|
|
143
|
+
// Decode only a requested pose, in both appearances so changing theme
|
|
144
|
+
// cannot produce a blank frame. No image fetch or perpetual RAF loop.
|
|
145
|
+
void Promise.all(Object.values(CHARACTER_POSES[pose]).map(src => {
|
|
146
|
+
const image = new win.Image();
|
|
147
|
+
image.src = src;
|
|
148
|
+
return image.decode();
|
|
149
|
+
})).then(() => {
|
|
150
|
+
if (disposed)
|
|
151
|
+
return;
|
|
152
|
+
loading.delete(pose);
|
|
153
|
+
ready.add(pose);
|
|
154
|
+
schedule();
|
|
155
|
+
}, () => { loading.delete(pose); failed.add(pose); });
|
|
156
|
+
}
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
// Each pose keeps its own coordinates during the short crossfade. No
|
|
160
|
+
// travelling from the right edge through the conversation to the sidebar.
|
|
161
|
+
const part = host.querySelector(`.xiaohei-wallpaper-character__${pose}`);
|
|
162
|
+
for (const key of ['left', 'top', 'width', 'height']) {
|
|
163
|
+
const value = `${Math.round(placement[key] * 100) / 100}px`;
|
|
164
|
+
if (part.style[key] !== value)
|
|
165
|
+
part.style[key] = value;
|
|
166
|
+
}
|
|
167
|
+
if (!part.dataset.ready)
|
|
168
|
+
part.dataset.ready = 'true';
|
|
169
|
+
if (host.dataset.pose !== pose)
|
|
170
|
+
host.dataset.pose = pose;
|
|
171
|
+
motion?.setPose(part, pose);
|
|
172
|
+
}
|
|
173
|
+
function schedule() {
|
|
174
|
+
if (disposed || frame !== undefined)
|
|
175
|
+
return;
|
|
176
|
+
frame = win.requestAnimationFrame(() => { frame = undefined; reconcile(); });
|
|
177
|
+
}
|
|
178
|
+
function scheduleSettled() {
|
|
179
|
+
if (settled !== undefined)
|
|
180
|
+
win.clearTimeout(settled);
|
|
181
|
+
// Native rail/collapse transitions can move the sidebar after its last
|
|
182
|
+
// size notification. One final measurement catches that resting position.
|
|
183
|
+
settled = win.setTimeout(() => { settled = undefined; dirty = true; schedule(); }, 240);
|
|
184
|
+
}
|
|
185
|
+
const unsubscribe = subscribeXiaoheiHostDom(doc, schedule);
|
|
186
|
+
const resized = () => { dirty = true; schedule(); scheduleSettled(); };
|
|
187
|
+
win.addEventListener('resize', resized, { passive: true });
|
|
188
|
+
const activity = () => idle.activity();
|
|
189
|
+
const events = ['pointermove', 'pointerdown', 'keydown', 'input', 'wheel'];
|
|
190
|
+
for (const event of events)
|
|
191
|
+
doc.addEventListener(event, activity, { passive: true, capture: true });
|
|
192
|
+
const visibility = () => { if (doc.hidden)
|
|
193
|
+
idle.setPaused(true); schedule(); };
|
|
194
|
+
doc.addEventListener('visibilitychange', visibility);
|
|
195
|
+
schedule();
|
|
196
|
+
return () => {
|
|
197
|
+
disposed = true;
|
|
198
|
+
if (frame !== undefined)
|
|
199
|
+
win.cancelAnimationFrame(frame);
|
|
200
|
+
if (settled !== undefined)
|
|
201
|
+
win.clearTimeout(settled);
|
|
202
|
+
unsubscribe();
|
|
203
|
+
observer?.disconnect();
|
|
204
|
+
idle.dispose();
|
|
205
|
+
motion?.dispose();
|
|
206
|
+
for (const event of events)
|
|
207
|
+
doc.removeEventListener(event, activity, true);
|
|
208
|
+
doc.removeEventListener('visibilitychange', visibility);
|
|
209
|
+
win.removeEventListener('resize', resized);
|
|
210
|
+
host?.remove();
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=wallpaper-character.js.map
|
package/lib/scene.d.ts
CHANGED
|
@@ -1,14 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
export
|
|
5
|
-
|
|
6
|
-
export
|
|
7
|
-
|
|
8
|
-
export declare function shouldRestoreXiaoheiHeixiuCompanions(creatures: readonly Pick<Node, 'isConnected'>[]): boolean;
|
|
9
|
-
/**
|
|
10
|
-
* Install the generated scene after plugin boot becomes idle. The theme tokens
|
|
11
|
-
* apply immediately, while image decoding never extends DSH's loading screen.
|
|
12
|
-
*/
|
|
13
|
-
export declare function installXiaoheiScene(doc?: Document | undefined): () => void;
|
|
1
|
+
/** Public scene facade. Runtime structure and visual styling evolve independently. */
|
|
2
|
+
export { XIAOHEI_SCENE_CSS, XIAOHEI_SCENE_LAYER_ID, XIAOHEI_SCENE_STYLE_ID, XIAOHEI_SCENE_WORLD_CLASS, } from './scene/styles.js';
|
|
3
|
+
export { configureXiaoheiWorldRenderer, installXiaoheiScene, XIAOHEI_SCENE_PART_COUNT, } from './scene/runtime.js';
|
|
4
|
+
export { injectXiaoheiSylvaAvatarModel, prepareXiaoheiSylvaAvatarFrame, XIAOHEI_SYLVA_AVATAR_MARKER, } from './scene/avatar-model.js';
|
|
5
|
+
export { XIAOHEI_AVATAR_MOTION_RUNTIME } from './scene/avatar-motion.js';
|
|
6
|
+
export { injectXiaoheiSylvaPerformanceProfile, XIAOHEI_SYLVA_PERFORMANCE_MARKER, } from './scene/sylva-performance.js';
|
|
7
|
+
export { injectXiaoheiSylvaPointerBridge, prepareXiaoheiSylvaPointerFrame, resolveXiaoheiSylvaPointer, XIAOHEI_SYLVA_POINTER_CHANNEL, XIAOHEI_SYLVA_POINTER_MARKER, } from './scene/pointer-bridge.js';
|
|
14
8
|
//# sourceMappingURL=scene.d.ts.map
|