@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.
Files changed (222) hide show
  1. package/README.md +39 -17
  2. package/THIRD_PARTY_NOTICES.md +41 -0
  3. package/lib/appearance.js +26 -10
  4. package/lib/blink.js +3 -3
  5. package/lib/bloub-heixiu/ambient.d.ts +3 -0
  6. package/lib/bloub-heixiu/ambient.js +12 -0
  7. package/lib/bloub-heixiu/character.d.ts +33 -0
  8. package/lib/bloub-heixiu/character.js +124 -0
  9. package/lib/bloub-heixiu/effects.d.ts +4 -0
  10. package/lib/bloub-heixiu/effects.js +91 -0
  11. package/lib/bloub-heixiu/flight.d.ts +15 -0
  12. package/lib/bloub-heixiu/flight.js +66 -0
  13. package/lib/bloub-heixiu/follow.d.ts +13 -0
  14. package/lib/bloub-heixiu/follow.js +23 -0
  15. package/lib/bloub-heixiu/layout.d.ts +18 -0
  16. package/lib/bloub-heixiu/layout.js +12 -0
  17. package/lib/bloub-heixiu/renderer.d.ts +16 -0
  18. package/lib/bloub-heixiu/renderer.js +94 -0
  19. package/lib/bloub-heixiu/runtime.d.ts +6 -0
  20. package/lib/bloub-heixiu/runtime.js +395 -0
  21. package/lib/bloub-heixiu/signals.d.ts +17 -0
  22. package/lib/bloub-heixiu/signals.js +53 -0
  23. package/lib/bloub-heixiu/styles.d.ts +2 -0
  24. package/lib/bloub-heixiu/styles.js +98 -0
  25. package/lib/chrome/accessibility.d.ts +1 -1
  26. package/lib/chrome/accessibility.js +5 -13
  27. package/lib/chrome/composer-avatar.d.ts +10 -0
  28. package/lib/chrome/composer-avatar.js +599 -0
  29. package/lib/chrome/composer-send-heixiu.d.ts +3 -0
  30. package/lib/chrome/composer-send-heixiu.js +143 -0
  31. package/lib/chrome/composer.d.ts +2 -2
  32. package/lib/chrome/composer.js +84 -95
  33. package/lib/chrome/controls.d.ts +8 -0
  34. package/lib/chrome/controls.js +348 -0
  35. package/lib/chrome/conversation-messages.d.ts +1 -1
  36. package/lib/chrome/conversation-messages.js +207 -9
  37. package/lib/chrome/conversation.d.ts +1 -1
  38. package/lib/chrome/conversation.js +6 -0
  39. package/lib/chrome/identity.js +4 -18
  40. package/lib/chrome/portal.d.ts +1 -1
  41. package/lib/chrome/portal.js +1 -1
  42. package/lib/chrome/sidebar.d.ts +1 -1
  43. package/lib/chrome/sidebar.js +134 -153
  44. package/lib/chrome/tokens.d.ts +1 -1
  45. package/lib/chrome/tokens.js +121 -68
  46. package/lib/chrome/workspace.d.ts +2 -2
  47. package/lib/chrome/workspace.js +35 -254
  48. package/lib/chrome.js +4 -0
  49. package/lib/client.d.ts +5 -12
  50. package/lib/client.js +6262 -4455
  51. package/lib/composer-avatar.d.ts +18 -0
  52. package/lib/composer-avatar.js +441 -0
  53. package/lib/composer-send-heixiu.d.ts +8 -0
  54. package/lib/composer-send-heixiu.js +133 -0
  55. package/lib/gaze.js +3 -3
  56. package/lib/generated-backgrounds.d.ts +14 -0
  57. package/lib/generated-backgrounds.js +14 -0
  58. package/lib/generated-character-motion.d.ts +4 -0
  59. package/lib/generated-character-motion.js +2 -0
  60. package/lib/generated-identity.d.ts +1 -0
  61. package/lib/generated-identity.js +1 -0
  62. package/lib/generated-keyart.d.ts +18 -3
  63. package/lib/generated-keyart.js +18 -3
  64. package/lib/host-contract.d.ts +9 -0
  65. package/lib/host-contract.js +13 -0
  66. package/lib/host-dom.d.ts +11 -0
  67. package/lib/host-dom.js +60 -0
  68. package/lib/loading-heixiu.js +3 -3
  69. package/lib/metallic-brand-mark.d.ts +10 -0
  70. package/lib/metallic-brand-mark.js +323 -0
  71. package/lib/plugin.d.ts +1 -1
  72. package/lib/plugin.js +31 -16
  73. package/lib/portal.js +11 -10
  74. package/lib/reactions.js +3 -3
  75. package/lib/scene/avatar-model.d.ts +6 -0
  76. package/lib/scene/avatar-model.js +646 -0
  77. package/lib/scene/avatar-motion.d.ts +3 -0
  78. package/lib/scene/avatar-motion.js +799 -0
  79. package/lib/scene/character-idle.d.ts +17 -0
  80. package/lib/scene/character-idle.js +65 -0
  81. package/lib/scene/character-layout.d.ts +24 -0
  82. package/lib/scene/character-layout.js +51 -0
  83. package/lib/scene/character-motion-clock.d.ts +18 -0
  84. package/lib/scene/character-motion-clock.js +57 -0
  85. package/lib/scene/character-motion-types.d.ts +12 -0
  86. package/lib/scene/character-motion-types.js +2 -0
  87. package/lib/scene/character-motion.d.ts +6 -0
  88. package/lib/scene/character-motion.js +126 -0
  89. package/lib/scene/character-poses.d.ts +26 -0
  90. package/lib/scene/character-poses.js +11 -0
  91. package/lib/scene/character-rig-renderer.d.ts +4 -0
  92. package/lib/scene/character-rig-renderer.js +85 -0
  93. package/lib/scene/character-rig.d.ts +20 -0
  94. package/lib/scene/character-rig.js +53 -0
  95. package/lib/scene/heixiu-feedback.d.ts +1 -1
  96. package/lib/scene/heixiu-feedback.js +0 -17
  97. package/lib/scene/pointer-bridge.d.ts +21 -0
  98. package/lib/scene/pointer-bridge.js +155 -0
  99. package/lib/scene/runtime.d.ts +12 -0
  100. package/lib/scene/runtime.js +87 -0
  101. package/lib/scene/styles.d.ts +7 -0
  102. package/lib/scene/styles.js +75 -0
  103. package/lib/scene/sylva-performance.d.ts +11 -0
  104. package/lib/scene/sylva-performance.js +58 -0
  105. package/lib/scene/wallpaper-character-styles.d.ts +3 -0
  106. package/lib/scene/wallpaper-character-styles.js +53 -0
  107. package/lib/scene/wallpaper-character.d.ts +4 -0
  108. package/lib/scene/wallpaper-character.js +213 -0
  109. package/lib/scene.d.ts +7 -13
  110. package/lib/scene.js +7 -1023
  111. package/lib/sidebar-glass.js +99 -36
  112. package/lib/sidebar-heixiu-roaming.js +5 -5
  113. package/lib/sidebar-reveal.d.ts +8 -0
  114. package/lib/sidebar-reveal.js +51 -0
  115. package/lib/state.d.ts +14 -2
  116. package/lib/state.js +12 -4
  117. package/lib/theme.js +2 -2
  118. package/lib/vendor/bloub/decor.d.ts +114 -0
  119. package/lib/vendor/bloub/decor.js +198 -0
  120. package/lib/vendor/bloub/engine.d.ts +213 -0
  121. package/lib/vendor/bloub/engine.js +452 -0
  122. package/lib/vendor/bloub/expressions.d.ts +35 -0
  123. package/lib/vendor/bloub/expressions.js +143 -0
  124. package/lib/vendor/bloub/eyefit.d.ts +75 -0
  125. package/lib/vendor/bloub/eyefit.js +393 -0
  126. package/lib/vendor/bloub/face.d.ts +63 -0
  127. package/lib/vendor/bloub/face.js +106 -0
  128. package/lib/vendor/bloub/math.d.ts +22 -0
  129. package/lib/vendor/bloub/math.js +36 -0
  130. package/lib/vendor/bloub/profiles.d.ts +8 -0
  131. package/lib/vendor/bloub/profiles.js +20 -0
  132. package/lib/vendor/bloub/repere.d.ts +30 -0
  133. package/lib/vendor/bloub/repere.js +32 -0
  134. package/lib/vendor/bloub/shape.d.ts +80 -0
  135. package/lib/vendor/bloub/shape.js +268 -0
  136. package/lib/vendor/bloub/skins.d.ts +36 -0
  137. package/lib/vendor/bloub/skins.js +74 -0
  138. package/lib/vendor/bloub/states.d.ts +87 -0
  139. package/lib/vendor/bloub/states.js +468 -0
  140. package/package.json +23 -6
  141. package/lib/appearance.d.ts.map +0 -1
  142. package/lib/appearance.js.map +0 -1
  143. package/lib/blink.d.ts.map +0 -1
  144. package/lib/blink.js.map +0 -1
  145. package/lib/boot-appearance.d.ts.map +0 -1
  146. package/lib/boot-appearance.js.map +0 -1
  147. package/lib/boot-loader.d.ts.map +0 -1
  148. package/lib/boot-loader.js.map +0 -1
  149. package/lib/chrome/accessibility.d.ts.map +0 -1
  150. package/lib/chrome/accessibility.js.map +0 -1
  151. package/lib/chrome/blink.d.ts.map +0 -1
  152. package/lib/chrome/blink.js.map +0 -1
  153. package/lib/chrome/composer.d.ts.map +0 -1
  154. package/lib/chrome/composer.js.map +0 -1
  155. package/lib/chrome/conversation-messages.d.ts.map +0 -1
  156. package/lib/chrome/conversation-messages.js.map +0 -1
  157. package/lib/chrome/conversation.d.ts.map +0 -1
  158. package/lib/chrome/conversation.js.map +0 -1
  159. package/lib/chrome/frames.d.ts.map +0 -1
  160. package/lib/chrome/frames.js.map +0 -1
  161. package/lib/chrome/gaze.d.ts.map +0 -1
  162. package/lib/chrome/gaze.js.map +0 -1
  163. package/lib/chrome/identity.d.ts.map +0 -1
  164. package/lib/chrome/identity.js.map +0 -1
  165. package/lib/chrome/overlays.d.ts.map +0 -1
  166. package/lib/chrome/overlays.js.map +0 -1
  167. package/lib/chrome/portal.d.ts.map +0 -1
  168. package/lib/chrome/portal.js.map +0 -1
  169. package/lib/chrome/reactions.d.ts.map +0 -1
  170. package/lib/chrome/reactions.js.map +0 -1
  171. package/lib/chrome/sidebar.d.ts.map +0 -1
  172. package/lib/chrome/sidebar.js.map +0 -1
  173. package/lib/chrome/tokens.d.ts.map +0 -1
  174. package/lib/chrome/tokens.js.map +0 -1
  175. package/lib/chrome/workspace.d.ts.map +0 -1
  176. package/lib/chrome/workspace.js.map +0 -1
  177. package/lib/chrome.d.ts.map +0 -1
  178. package/lib/chrome.js.map +0 -1
  179. package/lib/client.d.ts.map +0 -1
  180. package/lib/client.js.map +0 -7
  181. package/lib/gaze.d.ts.map +0 -1
  182. package/lib/gaze.js.map +0 -1
  183. package/lib/generated-identity.d.ts.map +0 -1
  184. package/lib/generated-identity.js.map +0 -1
  185. package/lib/generated-keyart.d.ts.map +0 -1
  186. package/lib/generated-keyart.js.map +0 -1
  187. package/lib/generated-loading-assets.d.ts.map +0 -1
  188. package/lib/generated-loading-assets.js.map +0 -1
  189. package/lib/generated-sidebar-assets.d.ts +0 -4
  190. package/lib/generated-sidebar-assets.d.ts.map +0 -1
  191. package/lib/generated-sidebar-assets.js +0 -4
  192. package/lib/generated-sidebar-assets.js.map +0 -1
  193. package/lib/heixiu-interactions.d.ts.map +0 -1
  194. package/lib/heixiu-interactions.js.map +0 -1
  195. package/lib/index.d.ts.map +0 -1
  196. package/lib/index.js.map +0 -1
  197. package/lib/loading-heixiu.d.ts.map +0 -1
  198. package/lib/loading-heixiu.js.map +0 -1
  199. package/lib/plugin.d.ts.map +0 -1
  200. package/lib/plugin.js.map +0 -1
  201. package/lib/portal.d.ts.map +0 -1
  202. package/lib/portal.js.map +0 -1
  203. package/lib/reactions.d.ts.map +0 -1
  204. package/lib/reactions.js.map +0 -1
  205. package/lib/scene/heixiu-feedback.d.ts.map +0 -1
  206. package/lib/scene/heixiu-feedback.js.map +0 -1
  207. package/lib/scene/heixiu-interactions.d.ts.map +0 -1
  208. package/lib/scene/heixiu-interactions.js.map +0 -1
  209. package/lib/scene/state-transitions.d.ts.map +0 -1
  210. package/lib/scene/state-transitions.js.map +0 -1
  211. package/lib/scene.d.ts.map +0 -1
  212. package/lib/scene.js.map +0 -1
  213. package/lib/sidebar-glass.d.ts.map +0 -1
  214. package/lib/sidebar-glass.js.map +0 -1
  215. package/lib/sidebar-heixiu-escape.d.ts.map +0 -1
  216. package/lib/sidebar-heixiu-escape.js.map +0 -1
  217. package/lib/sidebar-heixiu-roaming.d.ts.map +0 -1
  218. package/lib/sidebar-heixiu-roaming.js.map +0 -1
  219. package/lib/state.d.ts.map +0 -1
  220. package/lib/state.js.map +0 -1
  221. package/lib/theme.d.ts.map +0 -1
  222. 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
- /** DOM ids are exported so lifecycle and browser tests can detect leaks. */
2
- export declare const XIAOHEI_SCENE_STYLE_ID = "dsh-theme-xiaohei/scene-style";
3
- export declare const XIAOHEI_SCENE_LAYER_ID = "dsh-theme-xiaohei/scene-layer";
4
- export declare const XIAOHEI_SCENE_CSS: string;
5
- /** Number of top-level decorative parts installed into the ambient layer. */
6
- export declare const XIAOHEI_SCENE_PART_COUNT: 8;
7
- /** Skip host lookups while every companion remains attached to the document. */
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