@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.
- package/LICENSE +21 -0
- package/README.md +84 -0
- package/cordis.patch.yml +4 -0
- package/lib/appearance.d.ts +12 -0
- package/lib/appearance.d.ts.map +1 -0
- package/lib/appearance.js +26 -0
- package/lib/appearance.js.map +1 -0
- package/lib/blink.d.ts +4 -0
- package/lib/blink.d.ts.map +1 -0
- package/lib/blink.js +110 -0
- package/lib/blink.js.map +1 -0
- package/lib/boot-appearance.d.ts +10 -0
- package/lib/boot-appearance.d.ts.map +1 -0
- package/lib/boot-appearance.js +47 -0
- package/lib/boot-appearance.js.map +1 -0
- package/lib/boot-loader.d.ts +5 -0
- package/lib/boot-loader.d.ts.map +1 -0
- package/lib/boot-loader.js +158 -0
- package/lib/boot-loader.js.map +1 -0
- package/lib/chrome/accessibility.d.ts +3 -0
- package/lib/chrome/accessibility.d.ts.map +1 -0
- package/lib/chrome/accessibility.js +77 -0
- package/lib/chrome/accessibility.js.map +1 -0
- package/lib/chrome/blink.d.ts +3 -0
- package/lib/chrome/blink.d.ts.map +1 -0
- package/lib/chrome/blink.js +15 -0
- package/lib/chrome/blink.js.map +1 -0
- package/lib/chrome/composer.d.ts +3 -0
- package/lib/chrome/composer.d.ts.map +1 -0
- package/lib/chrome/composer.js +146 -0
- package/lib/chrome/composer.js.map +1 -0
- package/lib/chrome/conversation-messages.d.ts +3 -0
- package/lib/chrome/conversation-messages.d.ts.map +1 -0
- package/lib/chrome/conversation-messages.js +96 -0
- package/lib/chrome/conversation-messages.js.map +1 -0
- package/lib/chrome/conversation.d.ts +3 -0
- package/lib/chrome/conversation.d.ts.map +1 -0
- package/lib/chrome/conversation.js +61 -0
- package/lib/chrome/conversation.js.map +1 -0
- package/lib/chrome/frames.d.ts +6 -0
- package/lib/chrome/frames.d.ts.map +1 -0
- package/lib/chrome/frames.js +120 -0
- package/lib/chrome/frames.js.map +1 -0
- package/lib/chrome/gaze.d.ts +3 -0
- package/lib/chrome/gaze.d.ts.map +1 -0
- package/lib/chrome/gaze.js +103 -0
- package/lib/chrome/gaze.js.map +1 -0
- package/lib/chrome/identity.d.ts +6 -0
- package/lib/chrome/identity.d.ts.map +1 -0
- package/lib/chrome/identity.js +61 -0
- package/lib/chrome/identity.js.map +1 -0
- package/lib/chrome/overlays.d.ts +3 -0
- package/lib/chrome/overlays.d.ts.map +1 -0
- package/lib/chrome/overlays.js +104 -0
- package/lib/chrome/overlays.js.map +1 -0
- package/lib/chrome/portal.d.ts +6 -0
- package/lib/chrome/portal.d.ts.map +1 -0
- package/lib/chrome/portal.js +169 -0
- package/lib/chrome/portal.js.map +1 -0
- package/lib/chrome/reactions.d.ts +3 -0
- package/lib/chrome/reactions.d.ts.map +1 -0
- package/lib/chrome/reactions.js +85 -0
- package/lib/chrome/reactions.js.map +1 -0
- package/lib/chrome/sidebar.d.ts +3 -0
- package/lib/chrome/sidebar.d.ts.map +1 -0
- package/lib/chrome/sidebar.js +305 -0
- package/lib/chrome/sidebar.js.map +1 -0
- package/lib/chrome/tokens.d.ts +3 -0
- package/lib/chrome/tokens.d.ts.map +1 -0
- package/lib/chrome/tokens.js +171 -0
- package/lib/chrome/tokens.js.map +1 -0
- package/lib/chrome/workspace.d.ts +3 -0
- package/lib/chrome/workspace.d.ts.map +1 -0
- package/lib/chrome/workspace.js +313 -0
- package/lib/chrome/workspace.js.map +1 -0
- package/lib/chrome.d.ts +10 -0
- package/lib/chrome.d.ts.map +1 -0
- package/lib/chrome.js +40 -0
- package/lib/chrome.js.map +1 -0
- package/lib/client.d.ts +17 -0
- package/lib/client.d.ts.map +1 -0
- package/lib/client.js +5505 -0
- package/lib/client.js.map +7 -0
- package/lib/gaze.d.ts +4 -0
- package/lib/gaze.d.ts.map +1 -0
- package/lib/gaze.js +217 -0
- package/lib/gaze.js.map +1 -0
- package/lib/generated-identity.d.ts +5 -0
- package/lib/generated-identity.d.ts.map +1 -0
- package/lib/generated-identity.js +5 -0
- package/lib/generated-identity.js.map +1 -0
- package/lib/generated-keyart.d.ts +19 -0
- package/lib/generated-keyart.d.ts.map +1 -0
- package/lib/generated-keyart.js +19 -0
- package/lib/generated-keyart.js.map +1 -0
- package/lib/generated-loading-assets.d.ts +4 -0
- package/lib/generated-loading-assets.d.ts.map +1 -0
- package/lib/generated-loading-assets.js +4 -0
- package/lib/generated-loading-assets.js.map +1 -0
- package/lib/generated-sidebar-assets.d.ts +4 -0
- package/lib/generated-sidebar-assets.d.ts.map +1 -0
- package/lib/generated-sidebar-assets.js +4 -0
- package/lib/generated-sidebar-assets.js.map +1 -0
- package/lib/heixiu-interactions.d.ts +10 -0
- package/lib/heixiu-interactions.d.ts.map +1 -0
- package/lib/heixiu-interactions.js +161 -0
- package/lib/heixiu-interactions.js.map +1 -0
- package/lib/index.d.ts +8 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +11 -0
- package/lib/index.js.map +1 -0
- package/lib/loading-heixiu.d.ts +8 -0
- package/lib/loading-heixiu.d.ts.map +1 -0
- package/lib/loading-heixiu.js +287 -0
- package/lib/loading-heixiu.js.map +1 -0
- package/lib/plugin.d.ts +6 -0
- package/lib/plugin.d.ts.map +1 -0
- package/lib/plugin.js +38 -0
- package/lib/plugin.js.map +1 -0
- package/lib/portal.d.ts +40 -0
- package/lib/portal.d.ts.map +1 -0
- package/lib/portal.js +224 -0
- package/lib/portal.js.map +1 -0
- package/lib/reactions.d.ts +20 -0
- package/lib/reactions.d.ts.map +1 -0
- package/lib/reactions.js +380 -0
- package/lib/reactions.js.map +1 -0
- package/lib/scene/heixiu-feedback.d.ts +3 -0
- package/lib/scene/heixiu-feedback.d.ts.map +1 -0
- package/lib/scene/heixiu-feedback.js +81 -0
- package/lib/scene/heixiu-feedback.js.map +1 -0
- package/lib/scene/heixiu-interactions.d.ts +3 -0
- package/lib/scene/heixiu-interactions.d.ts.map +1 -0
- package/lib/scene/heixiu-interactions.js +92 -0
- package/lib/scene/heixiu-interactions.js.map +1 -0
- package/lib/scene/state-transitions.d.ts +3 -0
- package/lib/scene/state-transitions.d.ts.map +1 -0
- package/lib/scene/state-transitions.js +37 -0
- package/lib/scene/state-transitions.js.map +1 -0
- package/lib/scene.d.ts +14 -0
- package/lib/scene.d.ts.map +1 -0
- package/lib/scene.js +1024 -0
- package/lib/scene.js.map +1 -0
- package/lib/sidebar-glass.d.ts +16 -0
- package/lib/sidebar-glass.d.ts.map +1 -0
- package/lib/sidebar-glass.js +105 -0
- package/lib/sidebar-glass.js.map +1 -0
- package/lib/sidebar-heixiu-escape.d.ts +44 -0
- package/lib/sidebar-heixiu-escape.d.ts.map +1 -0
- package/lib/sidebar-heixiu-escape.js +340 -0
- package/lib/sidebar-heixiu-escape.js.map +1 -0
- package/lib/sidebar-heixiu-roaming.d.ts +27 -0
- package/lib/sidebar-heixiu-roaming.d.ts.map +1 -0
- package/lib/sidebar-heixiu-roaming.js +310 -0
- package/lib/sidebar-heixiu-roaming.js.map +1 -0
- package/lib/state.d.ts +9 -0
- package/lib/state.d.ts.map +1 -0
- package/lib/state.js +114 -0
- package/lib/state.js.map +1 -0
- package/lib/theme.d.ts +19 -0
- package/lib/theme.d.ts.map +1 -0
- package/lib/theme.js +188 -0
- package/lib/theme.js.map +1 -0
- 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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"}
|
package/lib/plugin.d.ts
ADDED
|
@@ -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"}
|
package/lib/portal.d.ts
ADDED
|
@@ -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
|