@lemoncat7/dsh-theme-xiaohei 0.3.0-alpha.22

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 (164) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +84 -0
  3. package/cordis.patch.yml +4 -0
  4. package/lib/appearance.d.ts +12 -0
  5. package/lib/appearance.d.ts.map +1 -0
  6. package/lib/appearance.js +26 -0
  7. package/lib/appearance.js.map +1 -0
  8. package/lib/blink.d.ts +4 -0
  9. package/lib/blink.d.ts.map +1 -0
  10. package/lib/blink.js +110 -0
  11. package/lib/blink.js.map +1 -0
  12. package/lib/boot-appearance.d.ts +10 -0
  13. package/lib/boot-appearance.d.ts.map +1 -0
  14. package/lib/boot-appearance.js +47 -0
  15. package/lib/boot-appearance.js.map +1 -0
  16. package/lib/boot-loader.d.ts +5 -0
  17. package/lib/boot-loader.d.ts.map +1 -0
  18. package/lib/boot-loader.js +158 -0
  19. package/lib/boot-loader.js.map +1 -0
  20. package/lib/chrome/accessibility.d.ts +3 -0
  21. package/lib/chrome/accessibility.d.ts.map +1 -0
  22. package/lib/chrome/accessibility.js +77 -0
  23. package/lib/chrome/accessibility.js.map +1 -0
  24. package/lib/chrome/blink.d.ts +3 -0
  25. package/lib/chrome/blink.d.ts.map +1 -0
  26. package/lib/chrome/blink.js +15 -0
  27. package/lib/chrome/blink.js.map +1 -0
  28. package/lib/chrome/composer.d.ts +3 -0
  29. package/lib/chrome/composer.d.ts.map +1 -0
  30. package/lib/chrome/composer.js +146 -0
  31. package/lib/chrome/composer.js.map +1 -0
  32. package/lib/chrome/conversation-messages.d.ts +3 -0
  33. package/lib/chrome/conversation-messages.d.ts.map +1 -0
  34. package/lib/chrome/conversation-messages.js +96 -0
  35. package/lib/chrome/conversation-messages.js.map +1 -0
  36. package/lib/chrome/conversation.d.ts +3 -0
  37. package/lib/chrome/conversation.d.ts.map +1 -0
  38. package/lib/chrome/conversation.js +61 -0
  39. package/lib/chrome/conversation.js.map +1 -0
  40. package/lib/chrome/frames.d.ts +6 -0
  41. package/lib/chrome/frames.d.ts.map +1 -0
  42. package/lib/chrome/frames.js +120 -0
  43. package/lib/chrome/frames.js.map +1 -0
  44. package/lib/chrome/gaze.d.ts +3 -0
  45. package/lib/chrome/gaze.d.ts.map +1 -0
  46. package/lib/chrome/gaze.js +103 -0
  47. package/lib/chrome/gaze.js.map +1 -0
  48. package/lib/chrome/identity.d.ts +6 -0
  49. package/lib/chrome/identity.d.ts.map +1 -0
  50. package/lib/chrome/identity.js +61 -0
  51. package/lib/chrome/identity.js.map +1 -0
  52. package/lib/chrome/overlays.d.ts +3 -0
  53. package/lib/chrome/overlays.d.ts.map +1 -0
  54. package/lib/chrome/overlays.js +104 -0
  55. package/lib/chrome/overlays.js.map +1 -0
  56. package/lib/chrome/portal.d.ts +6 -0
  57. package/lib/chrome/portal.d.ts.map +1 -0
  58. package/lib/chrome/portal.js +169 -0
  59. package/lib/chrome/portal.js.map +1 -0
  60. package/lib/chrome/reactions.d.ts +3 -0
  61. package/lib/chrome/reactions.d.ts.map +1 -0
  62. package/lib/chrome/reactions.js +85 -0
  63. package/lib/chrome/reactions.js.map +1 -0
  64. package/lib/chrome/sidebar.d.ts +3 -0
  65. package/lib/chrome/sidebar.d.ts.map +1 -0
  66. package/lib/chrome/sidebar.js +305 -0
  67. package/lib/chrome/sidebar.js.map +1 -0
  68. package/lib/chrome/tokens.d.ts +3 -0
  69. package/lib/chrome/tokens.d.ts.map +1 -0
  70. package/lib/chrome/tokens.js +171 -0
  71. package/lib/chrome/tokens.js.map +1 -0
  72. package/lib/chrome/workspace.d.ts +3 -0
  73. package/lib/chrome/workspace.d.ts.map +1 -0
  74. package/lib/chrome/workspace.js +313 -0
  75. package/lib/chrome/workspace.js.map +1 -0
  76. package/lib/chrome.d.ts +10 -0
  77. package/lib/chrome.d.ts.map +1 -0
  78. package/lib/chrome.js +40 -0
  79. package/lib/chrome.js.map +1 -0
  80. package/lib/client.d.ts +17 -0
  81. package/lib/client.d.ts.map +1 -0
  82. package/lib/client.js +5505 -0
  83. package/lib/client.js.map +7 -0
  84. package/lib/gaze.d.ts +4 -0
  85. package/lib/gaze.d.ts.map +1 -0
  86. package/lib/gaze.js +217 -0
  87. package/lib/gaze.js.map +1 -0
  88. package/lib/generated-identity.d.ts +5 -0
  89. package/lib/generated-identity.d.ts.map +1 -0
  90. package/lib/generated-identity.js +5 -0
  91. package/lib/generated-identity.js.map +1 -0
  92. package/lib/generated-keyart.d.ts +19 -0
  93. package/lib/generated-keyart.d.ts.map +1 -0
  94. package/lib/generated-keyart.js +19 -0
  95. package/lib/generated-keyart.js.map +1 -0
  96. package/lib/generated-loading-assets.d.ts +4 -0
  97. package/lib/generated-loading-assets.d.ts.map +1 -0
  98. package/lib/generated-loading-assets.js +4 -0
  99. package/lib/generated-loading-assets.js.map +1 -0
  100. package/lib/generated-sidebar-assets.d.ts +4 -0
  101. package/lib/generated-sidebar-assets.d.ts.map +1 -0
  102. package/lib/generated-sidebar-assets.js +4 -0
  103. package/lib/generated-sidebar-assets.js.map +1 -0
  104. package/lib/heixiu-interactions.d.ts +10 -0
  105. package/lib/heixiu-interactions.d.ts.map +1 -0
  106. package/lib/heixiu-interactions.js +161 -0
  107. package/lib/heixiu-interactions.js.map +1 -0
  108. package/lib/index.d.ts +8 -0
  109. package/lib/index.d.ts.map +1 -0
  110. package/lib/index.js +11 -0
  111. package/lib/index.js.map +1 -0
  112. package/lib/loading-heixiu.d.ts +8 -0
  113. package/lib/loading-heixiu.d.ts.map +1 -0
  114. package/lib/loading-heixiu.js +287 -0
  115. package/lib/loading-heixiu.js.map +1 -0
  116. package/lib/plugin.d.ts +6 -0
  117. package/lib/plugin.d.ts.map +1 -0
  118. package/lib/plugin.js +38 -0
  119. package/lib/plugin.js.map +1 -0
  120. package/lib/portal.d.ts +40 -0
  121. package/lib/portal.d.ts.map +1 -0
  122. package/lib/portal.js +224 -0
  123. package/lib/portal.js.map +1 -0
  124. package/lib/reactions.d.ts +20 -0
  125. package/lib/reactions.d.ts.map +1 -0
  126. package/lib/reactions.js +380 -0
  127. package/lib/reactions.js.map +1 -0
  128. package/lib/scene/heixiu-feedback.d.ts +3 -0
  129. package/lib/scene/heixiu-feedback.d.ts.map +1 -0
  130. package/lib/scene/heixiu-feedback.js +81 -0
  131. package/lib/scene/heixiu-feedback.js.map +1 -0
  132. package/lib/scene/heixiu-interactions.d.ts +3 -0
  133. package/lib/scene/heixiu-interactions.d.ts.map +1 -0
  134. package/lib/scene/heixiu-interactions.js +92 -0
  135. package/lib/scene/heixiu-interactions.js.map +1 -0
  136. package/lib/scene/state-transitions.d.ts +3 -0
  137. package/lib/scene/state-transitions.d.ts.map +1 -0
  138. package/lib/scene/state-transitions.js +37 -0
  139. package/lib/scene/state-transitions.js.map +1 -0
  140. package/lib/scene.d.ts +14 -0
  141. package/lib/scene.d.ts.map +1 -0
  142. package/lib/scene.js +1024 -0
  143. package/lib/scene.js.map +1 -0
  144. package/lib/sidebar-glass.d.ts +16 -0
  145. package/lib/sidebar-glass.d.ts.map +1 -0
  146. package/lib/sidebar-glass.js +105 -0
  147. package/lib/sidebar-glass.js.map +1 -0
  148. package/lib/sidebar-heixiu-escape.d.ts +44 -0
  149. package/lib/sidebar-heixiu-escape.d.ts.map +1 -0
  150. package/lib/sidebar-heixiu-escape.js +340 -0
  151. package/lib/sidebar-heixiu-escape.js.map +1 -0
  152. package/lib/sidebar-heixiu-roaming.d.ts +27 -0
  153. package/lib/sidebar-heixiu-roaming.d.ts.map +1 -0
  154. package/lib/sidebar-heixiu-roaming.js +310 -0
  155. package/lib/sidebar-heixiu-roaming.js.map +1 -0
  156. package/lib/state.d.ts +9 -0
  157. package/lib/state.d.ts.map +1 -0
  158. package/lib/state.js +114 -0
  159. package/lib/state.js.map +1 -0
  160. package/lib/theme.d.ts +19 -0
  161. package/lib/theme.d.ts.map +1 -0
  162. package/lib/theme.js +188 -0
  163. package/lib/theme.js.map +1 -0
  164. package/package.json +74 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loading-heixiu.d.ts","sourceRoot":"","sources":["../src/loading-heixiu.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,+BAA+B,2CAA2C,CAAA;AACvF,eAAO,MAAM,4BAA4B,iCAAiC,CAAA;AAI1E,mFAAmF;AACnF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAEpF;AAED,eAAO,MAAM,0BAA0B,ujKAwLtC,CAAA;AAED,2EAA2E;AAC3E,wBAAgB,2BAA2B,CACzC,GAAG,GAAE,QAAQ,GAAG,SAAkE,GACjF,MAAM,IAAI,CAmEZ"}
@@ -0,0 +1,287 @@
1
+ import { XIAOHEI_LOADING_HEIXIU_BLINK, XIAOHEI_LOADING_HEIXIU_OPEN, } from './generated-loading-assets.js';
2
+ export const XIAOHEI_PLUGIN_LOADING_STYLE_ID = 'dsh-theme-xiaohei/plugin-loading-style';
3
+ export const XIAOHEI_PLUGIN_LOADING_CLASS = 'xiaohei-plugin-loader__track';
4
+ const LOADING_HINTS = new Set(['Loading plugins...', 'Loading plugins…']);
5
+ /** Only the normal plugin boot state is decorated. Failure output stays native. */
6
+ export function isXiaoheiPluginLoadingHint(value) {
7
+ return LOADING_HINTS.has(value?.trim() ?? '');
8
+ }
9
+ export const XIAOHEI_PLUGIN_LOADING_CSS = `
10
+ [data-xiaohei-plugin-loading='true'] {
11
+ border-color: transparent !important;
12
+ background: transparent !important;
13
+ box-shadow: none !important;
14
+ }
15
+
16
+ /* Replace the decorative wordmark while keeping DSH's accessible loading hint
17
+ * beneath the Heixiu track. */
18
+ [data-xiaohei-plugin-loading='true'] > :first-child:not([data-dsh-boot-spinner]) {
19
+ display: none !important;
20
+ }
21
+
22
+ [data-xiaohei-plugin-loading='true'] > [data-dsh-boot-spinner] + * {
23
+ margin-top: 0.65rem;
24
+ opacity: 0.68;
25
+ letter-spacing: 0.012em;
26
+ }
27
+
28
+ [data-xiaohei-plugin-loading='true'] > [class*='_spinner_'] {
29
+ position: relative;
30
+ overflow: visible;
31
+ border-color: transparent !important;
32
+ background: none !important;
33
+ box-shadow: none !important;
34
+ animation: none !important;
35
+ }
36
+
37
+ [data-xiaohei-plugin-loading='true'] > [data-dsh-boot-spinner]::before,
38
+ [data-xiaohei-plugin-loading='true'] > [data-dsh-boot-spinner]::after {
39
+ content: none !important;
40
+ display: none !important;
41
+ background: none !important;
42
+ animation: none !important;
43
+ }
44
+
45
+ .xiaohei-plugin-loader__track {
46
+ position: absolute;
47
+ left: 50%;
48
+ top: 50%;
49
+ display: block;
50
+ width: 12rem;
51
+ height: 3.25rem;
52
+ overflow: hidden;
53
+ contain: layout;
54
+ pointer-events: none;
55
+ user-select: none;
56
+ transform: translate3d(-50%, -50%, 0);
57
+ -webkit-mask-image: linear-gradient(90deg, transparent, #000 10%, #000 90%, transparent);
58
+ mask-image: linear-gradient(90deg, transparent, #000 10%, #000 90%, transparent);
59
+ }
60
+
61
+ .xiaohei-plugin-loader__runner {
62
+ position: absolute;
63
+ left: 0;
64
+ top: 50%;
65
+ display: block;
66
+ width: 2rem;
67
+ aspect-ratio: 1;
68
+ opacity: 0;
69
+ transform: translate3d(-2rem, -50%, 0);
70
+ animation: xiaohei-plugin-loader-travel 2.8s linear infinite;
71
+ animation-delay: var(--xiaohei-loader-delay);
72
+ will-change: transform, opacity;
73
+ }
74
+
75
+ .xiaohei-plugin-loader__sprite {
76
+ position: relative;
77
+ display: block;
78
+ width: 100%;
79
+ aspect-ratio: 1;
80
+ animation: xiaohei-plugin-loader-hop 700ms cubic-bezier(0.34, 0, 0.2, 1) infinite;
81
+ animation-delay: calc(var(--xiaohei-loader-index) * -90ms);
82
+ will-change: transform;
83
+ filter:
84
+ drop-shadow(0 0.18rem 0.38rem rgb(91 218 194 / 24%))
85
+ drop-shadow(0 0.36rem 0.7rem rgb(5 13 14 / 18%));
86
+ }
87
+
88
+ .xiaohei-plugin-loader__sprite > img {
89
+ position: absolute;
90
+ inset: 0;
91
+ display: block;
92
+ width: 100%;
93
+ height: 100%;
94
+ max-width: none;
95
+ max-height: none;
96
+ object-fit: contain;
97
+ filter: brightness(1.08) contrast(1.04) saturate(0.82);
98
+ }
99
+
100
+ .xiaohei-plugin-loader__runner-open {
101
+ opacity: 1;
102
+ animation: xiaohei-plugin-loader-open 2.7s step-end infinite;
103
+ animation-delay: calc(var(--xiaohei-loader-index) * -370ms);
104
+ }
105
+
106
+ .xiaohei-plugin-loader__runner-blink {
107
+ opacity: 0;
108
+ animation: xiaohei-plugin-loader-blink 2.7s step-end infinite;
109
+ animation-delay: calc(var(--xiaohei-loader-index) * -370ms);
110
+ }
111
+
112
+ html[data-xiaohei-appearance='light'] .xiaohei-plugin-loader__sprite,
113
+ html[data-xiaohei-boot-appearance='light'] .xiaohei-plugin-loader__sprite {
114
+ filter:
115
+ drop-shadow(0 0.16rem 0.32rem rgb(47 133 118 / 16%))
116
+ drop-shadow(0 0.32rem 0.58rem rgb(45 64 56 / 12%));
117
+ }
118
+
119
+ html[data-xiaohei-appearance='light'] .xiaohei-plugin-loader__sprite > img,
120
+ html[data-xiaohei-boot-appearance='light'] .xiaohei-plugin-loader__sprite > img {
121
+ filter: brightness(1.01) contrast(1.05) saturate(0.76);
122
+ }
123
+
124
+ @keyframes xiaohei-plugin-loader-travel {
125
+ 0% {
126
+ opacity: 0;
127
+ transform: translate3d(-2rem, -50%, 0);
128
+ }
129
+ 8%, 92% { opacity: 0.82; }
130
+ 100% {
131
+ opacity: 0;
132
+ transform: translate3d(12rem, -50%, 0);
133
+ }
134
+ }
135
+
136
+ @keyframes xiaohei-plugin-loader-hop {
137
+ 0%, 16%, 62%, 100% { transform: translate3d(0, 0, 0) scale(0.96, 1.02); }
138
+ 38% { transform: translate3d(0, -0.68rem, 0) scale(1, 0.98); }
139
+ 52% { transform: translate3d(0, 0, 0) scale(1.04, 0.93); }
140
+ }
141
+
142
+ @keyframes xiaohei-plugin-loader-open {
143
+ 0%, 71.9%, 78%, 100% { opacity: 1; }
144
+ 72%, 77.9% { opacity: 0; }
145
+ }
146
+
147
+ @keyframes xiaohei-plugin-loader-blink {
148
+ 0%, 71.9%, 78%, 100% { opacity: 0; }
149
+ 72%, 77.9% { opacity: 1; }
150
+ }
151
+
152
+ @media (prefers-reduced-motion: reduce) {
153
+ .xiaohei-plugin-loader__track {
154
+ display: flex;
155
+ align-items: center;
156
+ justify-content: space-between;
157
+ gap: 0.35rem;
158
+ overflow: visible;
159
+ -webkit-mask-image: none;
160
+ mask-image: none;
161
+ }
162
+
163
+ .xiaohei-plugin-loader__runner {
164
+ position: relative;
165
+ left: auto;
166
+ top: auto;
167
+ width: 2rem;
168
+ opacity: 0.72;
169
+ transform: none;
170
+ animation: none;
171
+ will-change: auto;
172
+ }
173
+
174
+ .xiaohei-plugin-loader__sprite,
175
+ .xiaohei-plugin-loader__runner-open,
176
+ .xiaohei-plugin-loader__runner-blink {
177
+ animation: none;
178
+ }
179
+ }
180
+
181
+ @media (forced-colors: active) {
182
+ .xiaohei-plugin-loader__track { display: none; }
183
+ [data-xiaohei-plugin-loading='true'] > [class*='_spinner_'] {
184
+ border-color: ButtonText !important;
185
+ border-top-color: Highlight !important;
186
+ animation: xiaohei-plugin-loader-fallback-spin 0.8s linear infinite !important;
187
+ }
188
+ }
189
+
190
+ @keyframes xiaohei-plugin-loader-fallback-spin {
191
+ to { transform: rotate(360deg); }
192
+ }
193
+ `;
194
+ /** Replace DSH's normal spinner after this plugin joins the boot queue. */
195
+ export function installXiaoheiPluginLoading(doc = typeof document === 'undefined' ? undefined : document) {
196
+ if (doc?.head === undefined || doc.body === undefined || doc.defaultView === null)
197
+ return () => { };
198
+ if (doc.documentElement.getAttribute('data-xiaohei-boot-loader') === 'host')
199
+ return () => { };
200
+ const win = doc.defaultView;
201
+ let disposed = false;
202
+ let decoratedCard;
203
+ doc.getElementById(XIAOHEI_PLUGIN_LOADING_STYLE_ID)?.remove();
204
+ const style = doc.createElement('style');
205
+ style.id = XIAOHEI_PLUGIN_LOADING_STYLE_ID;
206
+ style.textContent = XIAOHEI_PLUGIN_LOADING_CSS;
207
+ doc.head.append(style);
208
+ const clearCard = () => {
209
+ if (decoratedCard === undefined)
210
+ return;
211
+ decoratedCard.removeAttribute('data-xiaohei-plugin-loading');
212
+ decoratedCard.querySelector(`.${XIAOHEI_PLUGIN_LOADING_CLASS}`)?.remove();
213
+ decoratedCard = undefined;
214
+ };
215
+ const findHint = () => {
216
+ for (const element of doc.querySelectorAll('div')) {
217
+ if (isXiaoheiPluginLoadingHint(element.textContent) && element.children.length === 0)
218
+ return element;
219
+ }
220
+ return undefined;
221
+ };
222
+ const sync = () => {
223
+ if (disposed)
224
+ return;
225
+ const hint = findHint();
226
+ if (hint === undefined || hint.parentElement === null) {
227
+ clearCard();
228
+ return;
229
+ }
230
+ const card = hint.parentElement;
231
+ if (card === decoratedCard && card.querySelector(`.${XIAOHEI_PLUGIN_LOADING_CLASS}`) !== null)
232
+ return;
233
+ clearCard();
234
+ decoratedCard = card;
235
+ card.setAttribute('data-xiaohei-plugin-loading', 'true');
236
+ const track = createLoadingTrack(doc);
237
+ const spinner = card.querySelector(":scope > [class*='_spinner_']");
238
+ if (spinner === null)
239
+ return;
240
+ spinner.append(track);
241
+ };
242
+ let syncQueued = false;
243
+ const queueSync = () => {
244
+ if (syncQueued || disposed)
245
+ return;
246
+ syncQueued = true;
247
+ queueMicrotask(() => {
248
+ syncQueued = false;
249
+ sync();
250
+ });
251
+ };
252
+ sync();
253
+ const observer = new win.MutationObserver(queueSync);
254
+ observer.observe(doc.body, { childList: true, subtree: true });
255
+ return () => {
256
+ disposed = true;
257
+ observer.disconnect();
258
+ clearCard();
259
+ style.remove();
260
+ };
261
+ }
262
+ function createLoadingTrack(doc) {
263
+ const track = doc.createElement('div');
264
+ track.className = XIAOHEI_PLUGIN_LOADING_CLASS;
265
+ track.setAttribute('aria-hidden', 'true');
266
+ for (let index = 0; index < 4; index += 1) {
267
+ const runner = doc.createElement('span');
268
+ runner.className = 'xiaohei-plugin-loader__runner';
269
+ runner.style.setProperty('--xiaohei-loader-index', String(index));
270
+ runner.style.setProperty('--xiaohei-loader-delay', `${index * -700}ms`);
271
+ const sprite = doc.createElement('span');
272
+ sprite.className = 'xiaohei-plugin-loader__sprite';
273
+ sprite.append(createLoadingImage(doc, XIAOHEI_LOADING_HEIXIU_OPEN, 'xiaohei-plugin-loader__runner-open'), createLoadingImage(doc, XIAOHEI_LOADING_HEIXIU_BLINK, 'xiaohei-plugin-loader__runner-blink'));
274
+ runner.append(sprite);
275
+ track.append(runner);
276
+ }
277
+ return track;
278
+ }
279
+ function createLoadingImage(doc, source, className) {
280
+ const image = doc.createElement('img');
281
+ image.className = className;
282
+ image.alt = '';
283
+ image.decoding = 'async';
284
+ image.src = source;
285
+ return image;
286
+ }
287
+ //# sourceMappingURL=loading-heixiu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loading-heixiu.js","sourceRoot":"","sources":["../src/loading-heixiu.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client';
2
+ /** Boot decoration has no service dependency; the full theme waits below. */
3
+ export declare const inject: string[];
4
+ /** Shade DSH's native appearance modes without replacing its preference UI. */
5
+ export declare function apply(ctx: ClientContext): void;
6
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AAe3E,6EAA6E;AAC7E,eAAO,MAAM,MAAM,EAAE,MAAM,EAAO,CAAA;AAElC,+EAA+E;AAC/E,wBAAgB,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAG9C"}
package/lib/plugin.js ADDED
@@ -0,0 +1,38 @@
1
+ import { bindXiaoheiAppearance } from './appearance.js';
2
+ import { installXiaoheiBlink } from './blink.js';
3
+ import { installXiaoheiChrome } from './chrome.js';
4
+ import { installXiaoheiGaze } from './gaze.js';
5
+ import { installXiaoheiHeixiuInteractions } from './heixiu-interactions.js';
6
+ import { installXiaoheiPluginLoading } from './loading-heixiu.js';
7
+ import { installXiaoheiPortalTransit } from './portal.js';
8
+ import { installXiaoheiIdleReactions } from './reactions.js';
9
+ import { installXiaoheiScene } from './scene.js';
10
+ import { installXiaoheiSidebarGlass } from './sidebar-glass.js';
11
+ import { installXiaoheiSidebarHeixiuRoaming } from './sidebar-heixiu-roaming.js';
12
+ import { bindXiaoheiSessionState } from './state.js';
13
+ import { XIAOHEI_THEME_TOKEN_OVERRIDES } from './theme.js';
14
+ /** Boot decoration has no service dependency; the full theme waits below. */
15
+ export const inject = [];
16
+ /** Shade DSH's native appearance modes without replacing its preference UI. */
17
+ export function apply(ctx) {
18
+ ctx.effect(installXiaoheiPluginLoading, 'xiaohei-theme: replace plugin spinner with hopping Heixiu');
19
+ ctx.inject(['theme', 'sessions'], (readyCtx) => installXiaoheiTheme(readyCtx));
20
+ }
21
+ /** Mount the complete theme only after its runtime services become available. */
22
+ function installXiaoheiTheme(ctx) {
23
+ ctx.effect(() => {
24
+ return ctx.theme.overrideTokens('@lemoncat7/dsh-theme-xiaohei', XIAOHEI_THEME_TOKEN_OVERRIDES);
25
+ }, 'xiaohei-theme: shade native Light / Dark / System palettes');
26
+ ctx.effect(() => bindXiaoheiAppearance(ctx), 'xiaohei-theme: follow resolved appearance');
27
+ ctx.effect(installXiaoheiChrome, 'xiaohei-theme: install spirit control skin');
28
+ ctx.effect(installXiaoheiScene, 'xiaohei-theme: install moonlit forest scene');
29
+ ctx.effect(installXiaoheiSidebarGlass, 'xiaohei-theme: install isolated sidebar glass');
30
+ ctx.effect(installXiaoheiSidebarHeixiuRoaming, 'xiaohei-theme: let sidebar Heixiu roam safely');
31
+ ctx.effect(installXiaoheiHeixiuInteractions, 'xiaohei-theme: bind Heixiu companion interactions');
32
+ ctx.effect(installXiaoheiPortalTransit, 'xiaohei-theme: install random Heixiu portal visits');
33
+ ctx.effect(installXiaoheiGaze, 'xiaohei-theme: install proximity gaze');
34
+ ctx.effect(installXiaoheiBlink, 'xiaohei-theme: synchronize complete-frame blinking');
35
+ ctx.effect(installXiaoheiIdleReactions, 'xiaohei-theme: install sparse idle reactions');
36
+ ctx.effect(() => bindXiaoheiSessionState(ctx.sessions), 'xiaohei-theme: follow current session agent state');
37
+ }
38
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EAAE,gCAAgC,EAAE,MAAM,0BAA0B,CAAA;AAC3E,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAA;AACjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAA;AAC/D,OAAO,EAAE,kCAAkC,EAAE,MAAM,6BAA6B,CAAA;AAChF,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AACpD,OAAO,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAA;AAE1D,6EAA6E;AAC7E,MAAM,CAAC,MAAM,MAAM,GAAa,EAAE,CAAA;AAElC,+EAA+E;AAC/E,MAAM,UAAU,KAAK,CAAC,GAAkB;IACtC,GAAG,CAAC,MAAM,CAAC,2BAA2B,EAAE,2DAA2D,CAAC,CAAA;IACpG,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAA;AAChF,CAAC;AAED,iFAAiF;AACjF,SAAS,mBAAmB,CAAC,GAAkB;IAC7C,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,8BAA8B,EAAE,6BAA6B,CAAC,CAAA;IAChG,CAAC,EAAE,4DAA4D,CAAC,CAAA;IAEhE,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,GAAG,CAAC,EAAE,2CAA2C,CAAC,CAAA;IACzF,GAAG,CAAC,MAAM,CAAC,oBAAoB,EAAE,4CAA4C,CAAC,CAAA;IAC9E,GAAG,CAAC,MAAM,CAAC,mBAAmB,EAAE,6CAA6C,CAAC,CAAA;IAC9E,GAAG,CAAC,MAAM,CAAC,0BAA0B,EAAE,+CAA+C,CAAC,CAAA;IACvF,GAAG,CAAC,MAAM,CAAC,kCAAkC,EAAE,+CAA+C,CAAC,CAAA;IAC/F,GAAG,CAAC,MAAM,CAAC,gCAAgC,EAAE,mDAAmD,CAAC,CAAA;IACjG,GAAG,CAAC,MAAM,CAAC,2BAA2B,EAAE,oDAAoD,CAAC,CAAA;IAC7F,GAAG,CAAC,MAAM,CAAC,kBAAkB,EAAE,uCAAuC,CAAC,CAAA;IACvE,GAAG,CAAC,MAAM,CAAC,mBAAmB,EAAE,oDAAoD,CAAC,CAAA;IACrF,GAAG,CAAC,MAAM,CAAC,2BAA2B,EAAE,8CAA8C,CAAC,CAAA;IACvF,GAAG,CAAC,MAAM,CACR,GAAG,EAAE,CAAC,uBAAuB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAC3C,mDAAmD,CACpD,CAAA;AACH,CAAC"}
@@ -0,0 +1,40 @@
1
+ export declare const XIAOHEI_PORTAL_STYLE_ID = "dsh-theme-xiaohei/portal-style";
2
+ export declare const XIAOHEI_PORTAL_LAYER_ID = "dsh-theme-xiaohei/portal-layer";
3
+ export declare const XIAOHEI_PORTAL_DURATION_MS = 2600;
4
+ export declare const XIAOHEI_PORTAL_ACTIVITY_EVENT = "dsh-theme-xiaohei:portal-activity";
5
+ export declare const XIAOHEI_PORTAL_PROXIMITY_EVENT = "dsh-theme-xiaohei:portal-proximity";
6
+ export interface XiaoheiPortalActivityDetail {
7
+ active: boolean;
8
+ }
9
+ export interface XiaoheiPortalProximityDetail {
10
+ active: boolean;
11
+ target?: {
12
+ x: number;
13
+ y: number;
14
+ };
15
+ }
16
+ interface PortalPoint {
17
+ x: number;
18
+ y: number;
19
+ angle: number;
20
+ }
21
+ interface PortalInteraction {
22
+ phase: 'entry' | 'exit';
23
+ target: {
24
+ x: number;
25
+ y: number;
26
+ };
27
+ delayMs: number;
28
+ }
29
+ interface RectLike {
30
+ left: number;
31
+ top: number;
32
+ width: number;
33
+ height: number;
34
+ }
35
+ /** Resolve the closest visible portal phase without overlapping distant visits. */
36
+ export declare function resolveXiaoheiPortalInteraction(start: PortalPoint, finish: PortalPoint, mascotRect: RectLike): PortalInteraction | undefined;
37
+ /** Install ambient random visits without coupling them to conversation state. */
38
+ export declare function installXiaoheiPortalTransit(doc?: Document | undefined): () => void;
39
+ export {};
40
+ //# sourceMappingURL=portal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal.d.ts","sourceRoot":"","sources":["../src/portal.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,uBAAuB,mCAAmC,CAAA;AACvE,eAAO,MAAM,uBAAuB,mCAAmC,CAAA;AACvE,eAAO,MAAM,0BAA0B,OAAO,CAAA;AAC9C,eAAO,MAAM,6BAA6B,sCAAsC,CAAA;AAChF,eAAO,MAAM,8BAA8B,uCAAuC,CAAA;AAElF,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAClC;AAUD,UAAU,WAAW;IACnB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,KAAK,EAAE,MAAM,CAAA;CACd;AAED,UAAU,iBAAiB;IACzB,KAAK,EAAE,OAAO,GAAG,MAAM,CAAA;IACvB,MAAM,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAChC,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAED,mFAAmF;AACnF,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,QAAQ,GACnB,iBAAiB,GAAG,SAAS,CAiB/B;AAED,iFAAiF;AACjF,wBAAgB,2BAA2B,CACzC,GAAG,GAAE,QAAQ,GAAG,SAAkE,GACjF,MAAM,IAAI,CAgJZ"}
package/lib/portal.js ADDED
@@ -0,0 +1,224 @@
1
+ import { XIAOHEI_HEIXIU_BLINK, XIAOHEI_HEIXIU_OPEN } from './generated-keyart.js';
2
+ import { XIAOHEI_PORTAL_CSS } from './chrome/portal.js';
3
+ import { XIAOHEI_SCENE_LAYER_ID } from './scene.js';
4
+ export const XIAOHEI_PORTAL_STYLE_ID = 'dsh-theme-xiaohei/portal-style';
5
+ export const XIAOHEI_PORTAL_LAYER_ID = 'dsh-theme-xiaohei/portal-layer';
6
+ export const XIAOHEI_PORTAL_DURATION_MS = 2600;
7
+ export const XIAOHEI_PORTAL_ACTIVITY_EVENT = 'dsh-theme-xiaohei:portal-activity';
8
+ export const XIAOHEI_PORTAL_PROXIMITY_EVENT = 'dsh-theme-xiaohei:portal-proximity';
9
+ const INITIAL_VISIT_DELAY_MS = 1800;
10
+ const VISIT_MIN_DELAY_MS = 12_000;
11
+ const VISIT_DELAY_RANGE_MS = 9000;
12
+ const INTERACTION_RADIUS_PX = 420;
13
+ const INTERACTION_DURATION_MS = 520;
14
+ const ENTRY_INTERACTION_DELAY_MS = Math.round(XIAOHEI_PORTAL_DURATION_MS * 0.22);
15
+ const EXIT_INTERACTION_DELAY_MS = Math.round(XIAOHEI_PORTAL_DURATION_MS * 0.76);
16
+ /** Resolve the closest visible portal phase without overlapping distant visits. */
17
+ export function resolveXiaoheiPortalInteraction(start, finish, mascotRect) {
18
+ const head = {
19
+ x: mascotRect.left + mascotRect.width * 0.35,
20
+ y: mascotRect.top + mascotRect.height * 0.42,
21
+ };
22
+ const candidates = [
23
+ { phase: 'entry', target: { x: start.x, y: start.y }, delayMs: ENTRY_INTERACTION_DELAY_MS },
24
+ { phase: 'exit', target: { x: finish.x, y: finish.y }, delayMs: EXIT_INTERACTION_DELAY_MS },
25
+ ];
26
+ const distance = (candidate) => Math.hypot(candidate.target.x - head.x, candidate.target.y - head.y);
27
+ const nearest = distance(candidates[0]) <= distance(candidates[1])
28
+ ? candidates[0]
29
+ : candidates[1];
30
+ return distance(nearest) <= INTERACTION_RADIUS_PX ? nearest : undefined;
31
+ }
32
+ /** Install ambient random visits without coupling them to conversation state. */
33
+ export function installXiaoheiPortalTransit(doc = typeof document === 'undefined' ? undefined : document) {
34
+ if (doc?.body === undefined || doc.defaultView === null)
35
+ return () => { };
36
+ doc.getElementById(XIAOHEI_PORTAL_STYLE_ID)?.remove();
37
+ doc.getElementById(XIAOHEI_PORTAL_LAYER_ID)?.remove();
38
+ const style = doc.createElement('style');
39
+ style.id = XIAOHEI_PORTAL_STYLE_ID;
40
+ style.textContent = XIAOHEI_PORTAL_CSS;
41
+ doc.head.append(style);
42
+ const layer = doc.createElement('div');
43
+ layer.id = XIAOHEI_PORTAL_LAYER_ID;
44
+ layer.setAttribute('aria-hidden', 'true');
45
+ layer.dataset.running = 'false';
46
+ const entry = doc.createElement('span');
47
+ entry.className = 'xiaohei-portal__void xiaohei-portal__void--entry';
48
+ const exit = doc.createElement('span');
49
+ exit.className = 'xiaohei-portal__void xiaohei-portal__void--exit';
50
+ const traveler = doc.createElement('span');
51
+ traveler.className = 'xiaohei-portal__traveler';
52
+ traveler.append(createTravelerImage(doc, XIAOHEI_HEIXIU_OPEN, 'xiaohei-portal__traveler-open'), createTravelerImage(doc, XIAOHEI_HEIXIU_BLINK, 'xiaohei-portal__traveler-blink'));
53
+ layer.append(entry, exit, traveler);
54
+ const win = doc.defaultView;
55
+ let disposed = false;
56
+ let animationTimer = 0;
57
+ let visitTimer = 0;
58
+ let interactionStartTimer = 0;
59
+ let interactionEndTimer = 0;
60
+ let interactionActive = false;
61
+ let visitsStarted = false;
62
+ const mount = () => {
63
+ const scene = doc.getElementById(XIAOHEI_SCENE_LAYER_ID);
64
+ if (scene === null)
65
+ return false;
66
+ const veil = scene.querySelector('.xiaohei-scene__veil');
67
+ if (layer.parentElement !== scene) {
68
+ scene.insertBefore(layer, veil?.nextSibling ?? null);
69
+ }
70
+ return true;
71
+ };
72
+ const clearTimer = (timer) => {
73
+ if (timer !== 0)
74
+ win.clearTimeout(timer);
75
+ };
76
+ const endInteraction = () => {
77
+ clearTimer(interactionStartTimer);
78
+ clearTimer(interactionEndTimer);
79
+ interactionStartTimer = 0;
80
+ interactionEndTimer = 0;
81
+ if (!interactionActive)
82
+ return;
83
+ interactionActive = false;
84
+ dispatchPortalProximity(doc, false);
85
+ };
86
+ const scheduleVisit = (initial = false) => {
87
+ clearTimer(visitTimer);
88
+ if (disposed)
89
+ return;
90
+ const delay = initial
91
+ ? INITIAL_VISIT_DELAY_MS
92
+ : VISIT_MIN_DELAY_MS + Math.round(Math.random() * VISIT_DELAY_RANGE_MS);
93
+ visitTimer = win.setTimeout(play, delay);
94
+ };
95
+ const play = () => {
96
+ if (disposed || layer.dataset.running === 'true' || !mount())
97
+ return;
98
+ endInteraction();
99
+ const [start, finish] = choosePortalPoints(doc);
100
+ const styleMap = layer.style;
101
+ styleMap.setProperty('--portal-entry-x', `${start.x}px`);
102
+ styleMap.setProperty('--portal-entry-y', `${start.y}px`);
103
+ styleMap.setProperty('--portal-exit-x', `${finish.x}px`);
104
+ styleMap.setProperty('--portal-exit-y', `${finish.y}px`);
105
+ styleMap.setProperty('--portal-entry-angle', `${start.angle}deg`);
106
+ styleMap.setProperty('--portal-exit-angle', `${finish.angle}deg`);
107
+ styleMap.setProperty('--portal-travel-x', `${finish.x - start.x}px`);
108
+ styleMap.setProperty('--portal-travel-y', `${finish.y - start.y}px`);
109
+ const emergeDirection = finish.x < win.innerWidth / 2 ? -1 : 1;
110
+ styleMap.setProperty('--portal-emerge-near', `${emergeDirection * 20}px`);
111
+ styleMap.setProperty('--portal-emerge-far', `${emergeDirection * 69}px`);
112
+ styleMap.setProperty('--portal-emerge-end', `${emergeDirection * 86}px`);
113
+ layer.dataset.running = 'false';
114
+ void layer.offsetWidth;
115
+ layer.dataset.running = 'true';
116
+ dispatchPortalActivity(doc, true);
117
+ const mascotRect = doc.querySelector('.xiaohei-scene__mascot')?.getBoundingClientRect();
118
+ const interaction = mascotRect === undefined
119
+ ? undefined
120
+ : resolveXiaoheiPortalInteraction(start, finish, mascotRect);
121
+ layer.dataset.interaction = interaction?.phase ?? 'none';
122
+ if (interaction !== undefined) {
123
+ interactionStartTimer = win.setTimeout(() => {
124
+ interactionStartTimer = 0;
125
+ if (disposed || layer.dataset.running !== 'true')
126
+ return;
127
+ interactionActive = true;
128
+ dispatchPortalProximity(doc, true, interaction.target);
129
+ interactionEndTimer = win.setTimeout(endInteraction, INTERACTION_DURATION_MS);
130
+ }, interaction.delayMs);
131
+ }
132
+ clearTimer(animationTimer);
133
+ animationTimer = win.setTimeout(() => {
134
+ animationTimer = 0;
135
+ if (disposed)
136
+ return;
137
+ endInteraction();
138
+ layer.dataset.running = 'false';
139
+ dispatchPortalActivity(doc, false);
140
+ scheduleVisit();
141
+ }, XIAOHEI_PORTAL_DURATION_MS);
142
+ };
143
+ const startVisits = () => {
144
+ if (visitsStarted || disposed)
145
+ return;
146
+ visitsStarted = true;
147
+ scheduleVisit(true);
148
+ };
149
+ let mountObserver;
150
+ if (mount()) {
151
+ startVisits();
152
+ }
153
+ else {
154
+ mountObserver = new MutationObserver(() => {
155
+ if (!mount())
156
+ return;
157
+ mountObserver?.disconnect();
158
+ startVisits();
159
+ });
160
+ mountObserver.observe(doc.body, { childList: true });
161
+ }
162
+ return () => {
163
+ disposed = true;
164
+ clearTimer(animationTimer);
165
+ clearTimer(visitTimer);
166
+ endInteraction();
167
+ mountObserver?.disconnect();
168
+ if (layer.dataset.running === 'true')
169
+ dispatchPortalActivity(doc, false);
170
+ layer.remove();
171
+ style.remove();
172
+ };
173
+ }
174
+ function dispatchPortalProximity(doc, active, target) {
175
+ const EventConstructor = doc.defaultView?.CustomEvent;
176
+ if (EventConstructor === undefined)
177
+ return;
178
+ doc.dispatchEvent(new EventConstructor(XIAOHEI_PORTAL_PROXIMITY_EVENT, {
179
+ detail: target === undefined ? { active } : { active, target },
180
+ }));
181
+ }
182
+ function dispatchPortalActivity(doc, active) {
183
+ const EventConstructor = doc.defaultView?.CustomEvent;
184
+ if (EventConstructor === undefined)
185
+ return;
186
+ doc.dispatchEvent(new EventConstructor(XIAOHEI_PORTAL_ACTIVITY_EVENT, {
187
+ detail: { active },
188
+ }));
189
+ }
190
+ function createTravelerImage(doc, source, className) {
191
+ const image = doc.createElement('img');
192
+ image.className = className;
193
+ image.alt = '';
194
+ image.decoding = 'async';
195
+ image.fetchPriority = 'low';
196
+ image.src = source;
197
+ return image;
198
+ }
199
+ /** Pick separated positions from background-biased zones, away from key UI. */
200
+ function choosePortalPoints(doc) {
201
+ const win = doc.defaultView;
202
+ const width = Math.max(640, win?.innerWidth ?? 1280);
203
+ const height = Math.max(480, win?.innerHeight ?? 720);
204
+ const sidebarRight = doc.querySelector("#root [data-slot='sidebar']")?.getBoundingClientRect().right ?? 0;
205
+ const composerRect = doc.querySelector("#root [data-composer-card='true']")?.getBoundingClientRect();
206
+ const contentLeft = composerRect?.left ?? width * 0.37;
207
+ const contentRight = composerRect?.right ?? width * 0.77;
208
+ const leftMin = Math.max(sidebarRight + 80, 90);
209
+ const leftMax = Math.max(leftMin + 60, contentLeft - 90);
210
+ const rightMin = Math.min(width - 150, contentRight + 90);
211
+ const rightMax = width - 90;
212
+ const minY = 100;
213
+ const maxY = height - 130;
214
+ const point = (side) => {
215
+ const start = side === 'left' ? leftMin : rightMin;
216
+ const end = side === 'left' ? leftMax : rightMax;
217
+ const x = start + Math.random() * Math.max(40, end - start);
218
+ const y = minY + Math.random() * Math.max(120, maxY - minY);
219
+ return { x, y, angle: -8 + Math.round(Math.random() * 16) };
220
+ };
221
+ const leftFirst = Math.random() > 0.5;
222
+ return leftFirst ? [point('left'), point('right')] : [point('right'), point('left')];
223
+ }
224
+ //# sourceMappingURL=portal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal.js","sourceRoot":"","sources":["../src/portal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export declare const XIAOHEI_REACTION_STYLE_ID = "dsh-theme-xiaohei/reaction-style";
2
+ export type EarReaction = 'ear-left' | 'ear-right';
3
+ interface Point {
4
+ x: number;
5
+ y: number;
6
+ }
7
+ interface MascotBounds {
8
+ left: number;
9
+ top: number;
10
+ width: number;
11
+ height: number;
12
+ }
13
+ /** Resolve a pointer only inside the two local, non-overlapping ear regions. */
14
+ export declare function resolveXiaoheiPointerEar(bounds: MascotBounds, target: Point, activeEar?: EarReaction): EarReaction | undefined;
15
+ /** Resolve the next sparse tail visit; exported to keep the timing contract testable. */
16
+ export declare function resolveXiaoheiIdleTailDelay(randomValue?: number): number;
17
+ /** Install proximity ear motion and sparse idle tails without a JavaScript frame loop. */
18
+ export declare function installXiaoheiIdleReactions(doc?: Document | undefined): () => void;
19
+ export {};
20
+ //# sourceMappingURL=reactions.d.ts.map