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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/README.md +37 -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/frames.d.ts +1 -1
  40. package/lib/chrome/frames.js +14 -0
  41. package/lib/chrome/identity.js +4 -18
  42. package/lib/chrome/portal.d.ts +1 -1
  43. package/lib/chrome/portal.js +1 -1
  44. package/lib/chrome/sidebar.d.ts +1 -1
  45. package/lib/chrome/sidebar.js +118 -153
  46. package/lib/chrome/tokens.d.ts +1 -1
  47. package/lib/chrome/tokens.js +121 -68
  48. package/lib/chrome/workspace.d.ts +2 -2
  49. package/lib/chrome/workspace.js +35 -254
  50. package/lib/chrome.js +4 -0
  51. package/lib/client.d.ts +5 -12
  52. package/lib/client.js +5864 -4447
  53. package/lib/composer-avatar.d.ts +18 -0
  54. package/lib/composer-avatar.js +441 -0
  55. package/lib/composer-send-heixiu.d.ts +8 -0
  56. package/lib/composer-send-heixiu.js +133 -0
  57. package/lib/gaze.js +3 -3
  58. package/lib/generated-backgrounds.d.ts +14 -0
  59. package/lib/generated-backgrounds.js +14 -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 +309 -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-poses.d.ts +26 -0
  84. package/lib/scene/character-poses.js +11 -0
  85. package/lib/scene/heixiu-feedback.d.ts +1 -1
  86. package/lib/scene/heixiu-feedback.js +0 -17
  87. package/lib/scene/pointer-bridge.d.ts +21 -0
  88. package/lib/scene/pointer-bridge.js +155 -0
  89. package/lib/scene/runtime.d.ts +12 -0
  90. package/lib/scene/runtime.js +87 -0
  91. package/lib/scene/styles.d.ts +7 -0
  92. package/lib/scene/styles.js +75 -0
  93. package/lib/scene/sylva-performance.d.ts +11 -0
  94. package/lib/scene/sylva-performance.js +58 -0
  95. package/lib/scene/wallpaper-character-styles.d.ts +3 -0
  96. package/lib/scene/wallpaper-character-styles.js +43 -0
  97. package/lib/scene/wallpaper-character.d.ts +4 -0
  98. package/lib/scene/wallpaper-character.js +195 -0
  99. package/lib/scene.d.ts +7 -13
  100. package/lib/scene.js +7 -1023
  101. package/lib/sidebar-glass.js +88 -35
  102. package/lib/sidebar-heixiu-roaming.js +5 -5
  103. package/lib/state.d.ts +14 -2
  104. package/lib/state.js +12 -4
  105. package/lib/theme.js +2 -2
  106. package/lib/vendor/bloub/decor.d.ts +114 -0
  107. package/lib/vendor/bloub/decor.js +198 -0
  108. package/lib/vendor/bloub/engine.d.ts +213 -0
  109. package/lib/vendor/bloub/engine.js +452 -0
  110. package/lib/vendor/bloub/expressions.d.ts +35 -0
  111. package/lib/vendor/bloub/expressions.js +143 -0
  112. package/lib/vendor/bloub/eyefit.d.ts +75 -0
  113. package/lib/vendor/bloub/eyefit.js +393 -0
  114. package/lib/vendor/bloub/face.d.ts +63 -0
  115. package/lib/vendor/bloub/face.js +106 -0
  116. package/lib/vendor/bloub/math.d.ts +22 -0
  117. package/lib/vendor/bloub/math.js +36 -0
  118. package/lib/vendor/bloub/profiles.d.ts +8 -0
  119. package/lib/vendor/bloub/profiles.js +20 -0
  120. package/lib/vendor/bloub/repere.d.ts +30 -0
  121. package/lib/vendor/bloub/repere.js +32 -0
  122. package/lib/vendor/bloub/shape.d.ts +80 -0
  123. package/lib/vendor/bloub/shape.js +268 -0
  124. package/lib/vendor/bloub/skins.d.ts +36 -0
  125. package/lib/vendor/bloub/skins.js +74 -0
  126. package/lib/vendor/bloub/states.d.ts +87 -0
  127. package/lib/vendor/bloub/states.js +468 -0
  128. package/package.json +23 -6
  129. package/lib/appearance.d.ts.map +0 -1
  130. package/lib/appearance.js.map +0 -1
  131. package/lib/blink.d.ts.map +0 -1
  132. package/lib/blink.js.map +0 -1
  133. package/lib/boot-appearance.d.ts.map +0 -1
  134. package/lib/boot-appearance.js.map +0 -1
  135. package/lib/boot-loader.d.ts.map +0 -1
  136. package/lib/boot-loader.js.map +0 -1
  137. package/lib/chrome/accessibility.d.ts.map +0 -1
  138. package/lib/chrome/accessibility.js.map +0 -1
  139. package/lib/chrome/blink.d.ts.map +0 -1
  140. package/lib/chrome/blink.js.map +0 -1
  141. package/lib/chrome/composer.d.ts.map +0 -1
  142. package/lib/chrome/composer.js.map +0 -1
  143. package/lib/chrome/conversation-messages.d.ts.map +0 -1
  144. package/lib/chrome/conversation-messages.js.map +0 -1
  145. package/lib/chrome/conversation.d.ts.map +0 -1
  146. package/lib/chrome/conversation.js.map +0 -1
  147. package/lib/chrome/frames.d.ts.map +0 -1
  148. package/lib/chrome/frames.js.map +0 -1
  149. package/lib/chrome/gaze.d.ts.map +0 -1
  150. package/lib/chrome/gaze.js.map +0 -1
  151. package/lib/chrome/identity.d.ts.map +0 -1
  152. package/lib/chrome/identity.js.map +0 -1
  153. package/lib/chrome/overlays.d.ts.map +0 -1
  154. package/lib/chrome/overlays.js.map +0 -1
  155. package/lib/chrome/portal.d.ts.map +0 -1
  156. package/lib/chrome/portal.js.map +0 -1
  157. package/lib/chrome/reactions.d.ts.map +0 -1
  158. package/lib/chrome/reactions.js.map +0 -1
  159. package/lib/chrome/sidebar.d.ts.map +0 -1
  160. package/lib/chrome/sidebar.js.map +0 -1
  161. package/lib/chrome/tokens.d.ts.map +0 -1
  162. package/lib/chrome/tokens.js.map +0 -1
  163. package/lib/chrome/workspace.d.ts.map +0 -1
  164. package/lib/chrome/workspace.js.map +0 -1
  165. package/lib/chrome.d.ts.map +0 -1
  166. package/lib/chrome.js.map +0 -1
  167. package/lib/client.d.ts.map +0 -1
  168. package/lib/client.js.map +0 -7
  169. package/lib/gaze.d.ts.map +0 -1
  170. package/lib/gaze.js.map +0 -1
  171. package/lib/generated-identity.d.ts.map +0 -1
  172. package/lib/generated-identity.js.map +0 -1
  173. package/lib/generated-keyart.d.ts.map +0 -1
  174. package/lib/generated-keyart.js.map +0 -1
  175. package/lib/generated-loading-assets.d.ts.map +0 -1
  176. package/lib/generated-loading-assets.js.map +0 -1
  177. package/lib/generated-sidebar-assets.d.ts +0 -4
  178. package/lib/generated-sidebar-assets.d.ts.map +0 -1
  179. package/lib/generated-sidebar-assets.js +0 -4
  180. package/lib/generated-sidebar-assets.js.map +0 -1
  181. package/lib/heixiu-interactions.d.ts.map +0 -1
  182. package/lib/heixiu-interactions.js.map +0 -1
  183. package/lib/index.d.ts.map +0 -1
  184. package/lib/index.js.map +0 -1
  185. package/lib/loading-heixiu.d.ts.map +0 -1
  186. package/lib/loading-heixiu.js.map +0 -1
  187. package/lib/plugin.d.ts.map +0 -1
  188. package/lib/plugin.js.map +0 -1
  189. package/lib/portal.d.ts.map +0 -1
  190. package/lib/portal.js.map +0 -1
  191. package/lib/reactions.d.ts.map +0 -1
  192. package/lib/reactions.js.map +0 -1
  193. package/lib/scene/heixiu-feedback.d.ts.map +0 -1
  194. package/lib/scene/heixiu-feedback.js.map +0 -1
  195. package/lib/scene/heixiu-interactions.d.ts.map +0 -1
  196. package/lib/scene/heixiu-interactions.js.map +0 -1
  197. package/lib/scene/state-transitions.d.ts.map +0 -1
  198. package/lib/scene/state-transitions.js.map +0 -1
  199. package/lib/scene.d.ts.map +0 -1
  200. package/lib/scene.js.map +0 -1
  201. package/lib/sidebar-glass.d.ts.map +0 -1
  202. package/lib/sidebar-glass.js.map +0 -1
  203. package/lib/sidebar-heixiu-escape.d.ts.map +0 -1
  204. package/lib/sidebar-heixiu-escape.js.map +0 -1
  205. package/lib/sidebar-heixiu-roaming.d.ts.map +0 -1
  206. package/lib/sidebar-heixiu-roaming.js.map +0 -1
  207. package/lib/state.d.ts.map +0 -1
  208. package/lib/state.js.map +0 -1
  209. package/lib/theme.d.ts.map +0 -1
  210. package/lib/theme.js.map +0 -1
@@ -0,0 +1,599 @@
1
+ import { XIAOHEI_SPIRIT_DOORWAY_RING } from '../generated-keyart.js';
2
+ /**
3
+ * Layered break-frame portrait.
4
+ *
5
+ * The character is rendered from authored raster poses. Only the body layer is
6
+ * clipped by the doorway. Hair, ears and action hands are repeated through
7
+ * dedicated masks above the front rim. Keeping one renderer and one state
8
+ * machine avoids the pose jumps caused by handing off between DOM and WebGL.
9
+ */
10
+ export const XIAOHEI_COMPOSER_AVATAR_CSS = `
11
+ .xiaohei-composer-avatar {
12
+ --xiaohei-composer-avatar-x: 0px;
13
+ --xiaohei-composer-avatar-y: 0px;
14
+ --xiaohei-composer-avatar-scale: 1;
15
+ --xiaohei-avatar-look-x: 0px;
16
+ --xiaohei-avatar-look-y: 0px;
17
+ --xiaohei-avatar-look-rotation: 0deg;
18
+ --xiaohei-avatar-stage-x: 0px;
19
+ --xiaohei-avatar-stage-y: 0px;
20
+ --xiaohei-avatar-stage-scale: 1;
21
+ --xiaohei-avatar-ring-scale-x: 1;
22
+ --xiaohei-avatar-ring-scale-y: 1;
23
+ position: fixed;
24
+ inset: 0 auto auto 0;
25
+ z-index: 4;
26
+ display: block;
27
+ box-sizing: border-box;
28
+ inline-size: 172px;
29
+ block-size: 184px;
30
+ opacity: 0;
31
+ cursor: pointer;
32
+ pointer-events: auto;
33
+ touch-action: manipulation;
34
+ contain: layout style;
35
+ transform:
36
+ translate3d(
37
+ var(--xiaohei-composer-avatar-x),
38
+ var(--xiaohei-composer-avatar-y),
39
+ 0
40
+ )
41
+ scale(var(--xiaohei-composer-avatar-scale));
42
+ transform-origin: 50% 100%;
43
+ transition:
44
+ opacity 180ms ease,
45
+ transform 440ms cubic-bezier(.2, .82, .2, 1);
46
+ will-change: transform;
47
+ }
48
+
49
+ .xiaohei-composer-avatar[data-xiaohei-avatar-ready='true'] {
50
+ opacity: 1;
51
+ }
52
+
53
+ .xiaohei-composer-avatar__effects-back,
54
+ .xiaohei-composer-avatar__ring-back,
55
+ .xiaohei-composer-avatar__circle,
56
+ .xiaohei-composer-avatar__overflow,
57
+ .xiaohei-composer-avatar__ring-front,
58
+ .xiaohei-composer-avatar__breakout-right,
59
+ .xiaohei-composer-avatar__effects-front {
60
+ position: absolute;
61
+ display: block;
62
+ box-sizing: border-box;
63
+ pointer-events: none;
64
+ }
65
+
66
+ .xiaohei-composer-avatar__effects-back {
67
+ z-index: 0;
68
+ inset: auto 3px -4px;
69
+ inline-size: 166px;
70
+ block-size: 166px;
71
+ border-radius: 50%;
72
+ opacity: .46;
73
+ background:
74
+ radial-gradient(ellipse at 50% 87%, rgb(17 23 22 / 24%), transparent 47%),
75
+ conic-gradient(
76
+ from 205deg,
77
+ transparent 0 18%,
78
+ rgb(133 164 126 / 12%) 24% 31%,
79
+ transparent 37% 79%,
80
+ rgb(184 204 169 / 10%) 85% 90%,
81
+ transparent 95%
82
+ );
83
+ filter: blur(5px);
84
+ transform: scale(.97);
85
+ transition:
86
+ opacity 300ms ease,
87
+ transform 500ms cubic-bezier(.2, .82, .2, 1);
88
+ }
89
+
90
+ .xiaohei-composer-avatar__ring-back,
91
+ .xiaohei-composer-avatar__ring-front {
92
+ inset-inline-start: 14px;
93
+ inset-block-end: 3px;
94
+ inline-size: 144px;
95
+ block-size: 144px;
96
+ border-radius: 50%;
97
+ border: 0;
98
+ background: url("${XIAOHEI_SPIRIT_DOORWAY_RING}") center / contain no-repeat;
99
+ transform:
100
+ scaleX(var(--xiaohei-avatar-ring-scale-x))
101
+ scaleY(var(--xiaohei-avatar-ring-scale-y));
102
+ transition:
103
+ filter 220ms ease,
104
+ transform 260ms cubic-bezier(.16, 1, .3, 1);
105
+ }
106
+
107
+ .xiaohei-composer-avatar__ring-back {
108
+ z-index: 1;
109
+ opacity: .94;
110
+ filter:
111
+ saturate(.82)
112
+ contrast(1.02)
113
+ drop-shadow(0 7px 9px rgb(9 13 12 / 19%));
114
+ }
115
+
116
+ .xiaohei-composer-avatar__circle,
117
+ .xiaohei-composer-avatar__overflow,
118
+ .xiaohei-composer-avatar__breakout-right {
119
+ inset-inline-start: 20px;
120
+ inset-block-end: 9px;
121
+ inline-size: 132px;
122
+ block-size: 132px;
123
+ border-radius: 50%;
124
+ }
125
+
126
+ .xiaohei-composer-avatar__circle {
127
+ z-index: 2;
128
+ overflow: hidden;
129
+ background: transparent;
130
+ }
131
+
132
+ .xiaohei-composer-avatar__overflow {
133
+ z-index: 3;
134
+ overflow: visible;
135
+ }
136
+
137
+ .xiaohei-composer-avatar__ring-front {
138
+ z-index: 4;
139
+ clip-path: inset(67% -8px -8px -8px);
140
+ filter:
141
+ saturate(.9)
142
+ contrast(1.05)
143
+ drop-shadow(0 2px 2px rgb(6 10 9 / 22%));
144
+ }
145
+
146
+ .xiaohei-composer-avatar__ring-front::after {
147
+ content: '';
148
+ position: absolute;
149
+ inset: auto 18px 3px;
150
+ block-size: 15px;
151
+ border-radius: 50%;
152
+ opacity: .34;
153
+ background: radial-gradient(ellipse, rgb(173 194 157 / 26%), transparent 69%);
154
+ filter: blur(4px);
155
+ }
156
+
157
+ .xiaohei-composer-avatar__breakout-right {
158
+ z-index: 6;
159
+ overflow: visible;
160
+ }
161
+
162
+ .xiaohei-composer-avatar__effects-front {
163
+ z-index: 7;
164
+ inset: auto 6px -1px;
165
+ inline-size: 160px;
166
+ block-size: 160px;
167
+ border-radius: 50%;
168
+ opacity: 0;
169
+ border: 1px solid rgb(173 194 157 / 42%);
170
+ border-inline-start-color: transparent;
171
+ border-block-start-color: transparent;
172
+ transform: scale(.78);
173
+ }
174
+
175
+ .xiaohei-composer-avatar__image {
176
+ --xiaohei-portrait-size: 244px;
177
+ --xiaohei-portrait-bottom: -76px;
178
+ --xiaohei-portrait-x: 0px;
179
+ position: absolute;
180
+ inset-inline-start: 50%;
181
+ inset-block-end: var(--xiaohei-portrait-bottom);
182
+ z-index: 1;
183
+ display: block;
184
+ inline-size: auto;
185
+ block-size: var(--xiaohei-portrait-size);
186
+ max-inline-size: none;
187
+ opacity: 0;
188
+ transform:
189
+ translate3d(
190
+ calc(
191
+ -50%
192
+ + var(--xiaohei-avatar-look-x)
193
+ + var(--xiaohei-portrait-x)
194
+ + var(--xiaohei-avatar-stage-x)
195
+ ),
196
+ calc(var(--xiaohei-avatar-look-y) + var(--xiaohei-avatar-stage-y)),
197
+ 0
198
+ )
199
+ rotate(var(--xiaohei-avatar-look-rotation))
200
+ scale(var(--xiaohei-avatar-stage-scale));
201
+ transform-origin: 50% 58%;
202
+ transition:
203
+ opacity 150ms cubic-bezier(.22, .72, .24, 1),
204
+ transform 260ms cubic-bezier(.16, 1, .3, 1);
205
+ user-select: none;
206
+ -webkit-user-drag: none;
207
+ pointer-events: none;
208
+ will-change: opacity, transform;
209
+ }
210
+
211
+ .xiaohei-composer-avatar__image--inside-brace,
212
+ .xiaohei-composer-avatar__image--overflow-brace,
213
+ .xiaohei-composer-avatar__image--breakout-right-brace {
214
+ --xiaohei-portrait-size: 202px;
215
+ --xiaohei-portrait-bottom: -43px;
216
+ --xiaohei-portrait-x: -3px;
217
+ }
218
+
219
+ .xiaohei-composer-avatar__image--inside-reach,
220
+ .xiaohei-composer-avatar__image--overflow-reach,
221
+ .xiaohei-composer-avatar__image--breakout-right-reach {
222
+ --xiaohei-portrait-size: 202px;
223
+ --xiaohei-portrait-bottom: -43px;
224
+ --xiaohei-portrait-x: -2px;
225
+ }
226
+
227
+ .xiaohei-composer-avatar__image--inside-working,
228
+ .xiaohei-composer-avatar__image--overflow-working,
229
+ .xiaohei-composer-avatar__image--inside-complete,
230
+ .xiaohei-composer-avatar__image--overflow-complete {
231
+ --xiaohei-portrait-size: 216px;
232
+ --xiaohei-portrait-bottom: -54px;
233
+ }
234
+
235
+ .xiaohei-composer-avatar__image--inside-error,
236
+ .xiaohei-composer-avatar__image--overflow-error {
237
+ --xiaohei-portrait-size: 260px;
238
+ --xiaohei-portrait-bottom: -84px;
239
+ }
240
+
241
+ .xiaohei-composer-avatar__overflow > .xiaohei-composer-avatar__image {
242
+ z-index: 1;
243
+ }
244
+
245
+ .xiaohei-composer-avatar__image--overflow-idle,
246
+ .xiaohei-composer-avatar__image--overflow-thinking,
247
+ .xiaohei-composer-avatar__image--overflow-working,
248
+ .xiaohei-composer-avatar__image--overflow-complete,
249
+ .xiaohei-composer-avatar__image--overflow-error {
250
+ clip-path: polygon(8% 0, 92% 0, 92% 47%, 77% 56%, 23% 56%, 8% 47%);
251
+ }
252
+
253
+ /* Blink is an eye patch, not a full portrait swap. The idle artwork remains
254
+ perfectly still underneath, so WebP compression differences cannot flash
255
+ the character's hair, clothes or silhouette. */
256
+ .xiaohei-composer-avatar__image--inside-blink {
257
+ display: none;
258
+ }
259
+
260
+ .xiaohei-composer-avatar__image--overflow-blink {
261
+ clip-path: none;
262
+ -webkit-mask-image: radial-gradient(
263
+ ellipse 28% 13% at 50% 40%,
264
+ #000 52%,
265
+ rgb(0 0 0 / 84%) 70%,
266
+ transparent 100%
267
+ );
268
+ mask-image: radial-gradient(
269
+ ellipse 28% 13% at 50% 40%,
270
+ #000 52%,
271
+ rgb(0 0 0 / 84%) 70%,
272
+ transparent 100%
273
+ );
274
+ transition: opacity 52ms ease-out;
275
+ }
276
+
277
+ .xiaohei-composer-avatar__image--overflow-brace {
278
+ clip-path: polygon(3% 0, 72% 0, 72% 52%, 60% 61%, 10% 61%, 3% 52%);
279
+ }
280
+
281
+ .xiaohei-composer-avatar__image--overflow-reach {
282
+ clip-path: polygon(0 0, 66% 0, 66% 54%, 58% 62%, 7% 62%, 0 54%);
283
+ }
284
+
285
+ .xiaohei-composer-avatar__breakout-right > .xiaohei-composer-avatar__image {
286
+ -webkit-mask-repeat: no-repeat;
287
+ mask-repeat: no-repeat;
288
+ }
289
+
290
+ .xiaohei-composer-avatar__image--breakout-right-brace {
291
+ -webkit-mask-image: radial-gradient(ellipse 20% 23% at 79% 60%, #000 0 69%, transparent 82%);
292
+ mask-image: radial-gradient(ellipse 20% 23% at 79% 60%, #000 0 69%, transparent 82%);
293
+ }
294
+
295
+ .xiaohei-composer-avatar__image--breakout-right-reach {
296
+ -webkit-mask-image: radial-gradient(ellipse 25% 30% at 81% 58%, #000 0 70%, transparent 83%);
297
+ mask-image: radial-gradient(ellipse 25% 30% at 81% 58%, #000 0 70%, transparent 83%);
298
+ }
299
+
300
+ .xiaohei-composer-avatar[data-xiaohei-portrait='idle'] :is(
301
+ .xiaohei-composer-avatar__image--inside-idle,
302
+ .xiaohei-composer-avatar__image--overflow-idle
303
+ ),
304
+ .xiaohei-composer-avatar[data-xiaohei-portrait='thinking'] :is(
305
+ .xiaohei-composer-avatar__image--inside-thinking,
306
+ .xiaohei-composer-avatar__image--overflow-thinking
307
+ ),
308
+ .xiaohei-composer-avatar[data-xiaohei-portrait='working'] :is(
309
+ .xiaohei-composer-avatar__image--inside-working,
310
+ .xiaohei-composer-avatar__image--overflow-working
311
+ ),
312
+ .xiaohei-composer-avatar[data-xiaohei-portrait='complete'] :is(
313
+ .xiaohei-composer-avatar__image--inside-complete,
314
+ .xiaohei-composer-avatar__image--overflow-complete
315
+ ),
316
+ .xiaohei-composer-avatar[data-xiaohei-portrait='error'] :is(
317
+ .xiaohei-composer-avatar__image--inside-error,
318
+ .xiaohei-composer-avatar__image--overflow-error
319
+ ),
320
+ .xiaohei-composer-avatar[data-xiaohei-portrait='brace'] :is(
321
+ .xiaohei-composer-avatar__image--inside-brace,
322
+ .xiaohei-composer-avatar__image--overflow-brace,
323
+ .xiaohei-composer-avatar__image--breakout-right-brace
324
+ ),
325
+ .xiaohei-composer-avatar[data-xiaohei-portrait='reach'] :is(
326
+ .xiaohei-composer-avatar__image--inside-reach,
327
+ .xiaohei-composer-avatar__image--overflow-reach,
328
+ .xiaohei-composer-avatar__image--breakout-right-reach
329
+ ) {
330
+ opacity: 1;
331
+ }
332
+
333
+ .xiaohei-composer-avatar[data-xiaohei-portrait='idle'][data-xiaohei-avatar-blink='true']
334
+ .xiaohei-composer-avatar__image--overflow-blink {
335
+ opacity: 1;
336
+ }
337
+
338
+ .xiaohei-composer-avatar:hover,
339
+ .xiaohei-composer-avatar[data-xiaohei-avatar-aware] {
340
+ --xiaohei-avatar-stage-y: -2px;
341
+ --xiaohei-avatar-stage-scale: 1.018;
342
+ }
343
+
344
+ .xiaohei-composer-avatar[data-xiaohei-avatar-near] {
345
+ --xiaohei-avatar-stage-y: -4px;
346
+ --xiaohei-avatar-stage-scale: 1.028;
347
+ }
348
+
349
+ .xiaohei-composer-avatar:hover .xiaohei-composer-avatar__effects-back,
350
+ .xiaohei-composer-avatar[data-xiaohei-avatar-aware] .xiaohei-composer-avatar__effects-back {
351
+ opacity: .72;
352
+ transform: scale(1.025) rotate(-1deg);
353
+ }
354
+
355
+ .xiaohei-composer-avatar:hover .xiaohei-composer-avatar__ring-back {
356
+ filter:
357
+ saturate(.9)
358
+ contrast(1.04)
359
+ drop-shadow(0 8px 11px rgb(9 13 12 / 23%));
360
+ }
361
+
362
+ .xiaohei-composer-avatar[data-xiaohei-avatar-reaction] {
363
+ --xiaohei-avatar-look-x: 0px;
364
+ --xiaohei-avatar-look-y: 0px;
365
+ --xiaohei-avatar-look-rotation: 0deg;
366
+ --xiaohei-avatar-stage-x: 0px;
367
+ --xiaohei-avatar-stage-y: 0px;
368
+ --xiaohei-avatar-stage-scale: 1;
369
+ }
370
+
371
+ .xiaohei-composer-avatar[data-xiaohei-avatar-reaction='touch'] .xiaohei-composer-avatar__image {
372
+ animation: xiaohei-avatar-touch-motion 1340ms cubic-bezier(.22, .72, .24, 1) both;
373
+ }
374
+
375
+ .xiaohei-composer-avatar[data-xiaohei-avatar-reaction='touch'] :is(
376
+ .xiaohei-composer-avatar__ring-back,
377
+ .xiaohei-composer-avatar__ring-front
378
+ ) {
379
+ animation: xiaohei-avatar-touch-ring 1340ms cubic-bezier(.22, .72, .24, 1) both;
380
+ }
381
+
382
+ .xiaohei-composer-avatar[data-xiaohei-avatar-reaction='touch'] .xiaohei-composer-avatar__effects-back {
383
+ animation: xiaohei-avatar-touch-shadow 1340ms cubic-bezier(.22, .72, .24, 1) both;
384
+ }
385
+
386
+ .xiaohei-composer-avatar[data-xiaohei-avatar-reaction='touch'] .xiaohei-composer-avatar__effects-front,
387
+ .xiaohei-composer-avatar[data-xiaohei-portrait='complete'] .xiaohei-composer-avatar__effects-front {
388
+ animation: xiaohei-avatar-ring-response 1340ms ease-out 1;
389
+ }
390
+
391
+ .xiaohei-composer-avatar:not([data-xiaohei-avatar-reaction]) :is(
392
+ .xiaohei-composer-avatar__circle,
393
+ .xiaohei-composer-avatar__overflow
394
+ ) > .xiaohei-composer-avatar__image {
395
+ animation: xiaohei-avatar-breathe 4.8s ease-in-out infinite;
396
+ }
397
+
398
+ .xiaohei-composer-avatar[data-xiaohei-avatar-idle='glance-left']:not([data-xiaohei-avatar-aware]) {
399
+ --xiaohei-avatar-look-x: -2px;
400
+ --xiaohei-avatar-look-rotation: -1deg;
401
+ }
402
+
403
+ .xiaohei-composer-avatar[data-xiaohei-avatar-idle='glance-right']:not([data-xiaohei-avatar-aware]) {
404
+ --xiaohei-avatar-look-x: 2px;
405
+ --xiaohei-avatar-look-rotation: 1deg;
406
+ }
407
+
408
+ .xiaohei-composer-avatar[data-xiaohei-avatar-idle='glance-left']:not([data-xiaohei-avatar-aware]) .xiaohei-composer-avatar__image {
409
+ animation: xiaohei-avatar-glance-left 1760ms cubic-bezier(.22, .72, .24, 1) both;
410
+ }
411
+
412
+ .xiaohei-composer-avatar[data-xiaohei-avatar-idle='glance-right']:not([data-xiaohei-avatar-aware]) .xiaohei-composer-avatar__image {
413
+ animation: xiaohei-avatar-glance-right 1760ms cubic-bezier(.22, .72, .24, 1) both;
414
+ }
415
+
416
+ .xiaohei-composer-avatar[data-xiaohei-avatar-idle='nod']:not([data-xiaohei-avatar-aware]) .xiaohei-composer-avatar__image {
417
+ animation: xiaohei-avatar-nod 1520ms cubic-bezier(.22, .72, .24, 1) both;
418
+ }
419
+
420
+ .xiaohei-composer-avatar[data-xiaohei-avatar-idle='perk']:not([data-xiaohei-avatar-aware]) {
421
+ --xiaohei-avatar-stage-y: -4px;
422
+ --xiaohei-avatar-stage-scale: 1.02;
423
+ }
424
+
425
+ .xiaohei-composer-avatar[data-xiaohei-avatar-idle='perk']:not([data-xiaohei-avatar-aware]) .xiaohei-composer-avatar__image {
426
+ animation: xiaohei-avatar-perk 1640ms cubic-bezier(.16, 1, .3, 1) both;
427
+ }
428
+
429
+ .xiaohei-composer-avatar[data-xiaohei-avatar-idle='peek']:not([data-xiaohei-avatar-aware]) {
430
+ --xiaohei-avatar-stage-x: 2px;
431
+ --xiaohei-avatar-stage-y: -5px;
432
+ --xiaohei-avatar-stage-scale: 1.024;
433
+ --xiaohei-avatar-look-rotation: 1.1deg;
434
+ }
435
+
436
+ .xiaohei-composer-avatar[data-xiaohei-avatar-idle='peek']:not([data-xiaohei-avatar-aware]) .xiaohei-composer-avatar__image {
437
+ animation: xiaohei-avatar-peek 1860ms cubic-bezier(.22, .72, .24, 1) both;
438
+ }
439
+
440
+ .xiaohei-composer-avatar[data-xiaohei-avatar-idle='ponder']:not([data-xiaohei-avatar-aware]) .xiaohei-composer-avatar__image {
441
+ animation: xiaohei-avatar-ponder 2260ms cubic-bezier(.22, .72, .24, 1) both;
442
+ }
443
+
444
+ .xiaohei-composer-avatar[data-xiaohei-portrait='idle'][data-xiaohei-avatar-idle='double-blink']
445
+ .xiaohei-composer-avatar__image--overflow-blink {
446
+ animation: xiaohei-avatar-double-blink-closed 760ms linear both;
447
+ }
448
+
449
+ .xiaohei-composer-avatar[data-xiaohei-portrait='working'] .xiaohei-composer-avatar__effects-back {
450
+ opacity: .68;
451
+ animation: xiaohei-avatar-focus 2.6s ease-in-out infinite;
452
+ }
453
+
454
+ .xiaohei-composer-avatar[data-xiaohei-portrait='complete'] :is(
455
+ .xiaohei-composer-avatar__image,
456
+ .xiaohei-composer-avatar__ring-back,
457
+ .xiaohei-composer-avatar__ring-front
458
+ ) {
459
+ animation: xiaohei-avatar-complete 880ms cubic-bezier(.16, 1, .3, 1) 1;
460
+ }
461
+
462
+ .xiaohei-composer-avatar[data-xiaohei-portrait='error'] :is(
463
+ .xiaohei-composer-avatar__image
464
+ ) {
465
+ animation: xiaohei-avatar-error 420ms ease-out 1;
466
+ }
467
+
468
+ html[data-xiaohei-appearance='light'] .xiaohei-composer-avatar__ring-back {
469
+ filter:
470
+ saturate(.78)
471
+ brightness(.97)
472
+ contrast(1.02)
473
+ drop-shadow(0 7px 9px rgb(42 47 44 / 14%));
474
+ }
475
+
476
+ html[data-xiaohei-appearance='light'] .xiaohei-composer-avatar__ring-front {
477
+ filter:
478
+ saturate(.84)
479
+ brightness(.98)
480
+ contrast(1.04)
481
+ drop-shadow(0 2px 2px rgb(42 47 44 / 16%));
482
+ }
483
+
484
+ @keyframes xiaohei-avatar-breathe {
485
+ 0%, 100% { translate: 0 0; }
486
+ 48% { translate: 0 -1.5px; }
487
+ }
488
+
489
+ @keyframes xiaohei-avatar-touch-motion {
490
+ 0%, 100% { translate: 0 0; scale: 1; rotate: 0deg; }
491
+ 10% { translate: 0 3px; scale: .982; rotate: 0deg; }
492
+ 27% { translate: -1px -5px; scale: 1.018; rotate: -0.4deg; }
493
+ 43% { translate: 0 -10px; scale: 1.058; rotate: 0.35deg; }
494
+ 58% { translate: 1px -7px; scale: 1.04; rotate: 0deg; }
495
+ 75% { translate: -1px -4px; scale: 1.016; rotate: -0.25deg; }
496
+ 89% { translate: 0 1px; scale: .994; rotate: 0deg; }
497
+ }
498
+
499
+ @keyframes xiaohei-avatar-touch-ring {
500
+ 0%, 100% { translate: 0 0; scale: 1 1; }
501
+ 10% { translate: 0 1px; scale: .96 1.018; }
502
+ 43% { translate: 0 -1px; scale: 1.065 1.035; }
503
+ 72% { translate: 0 0; scale: 1.018 1.01; }
504
+ 89% { translate: 0 1px; scale: .994 1.004; }
505
+ }
506
+
507
+ @keyframes xiaohei-avatar-touch-shadow {
508
+ 0%, 100% { opacity: .46; transform: scale(.97); }
509
+ 10% { opacity: .38; transform: scale(.93); }
510
+ 43% { opacity: .76; transform: scale(1.07); }
511
+ 72% { opacity: .58; transform: scale(1.015); }
512
+ }
513
+
514
+ @keyframes xiaohei-avatar-glance-left {
515
+ 0%, 100% { translate: 0 0; rotate: 0deg; }
516
+ 22%, 68% { translate: -1.5px 0; rotate: -1.15deg; }
517
+ 80% { translate: -1px .5px; rotate: -.65deg; }
518
+ }
519
+
520
+ @keyframes xiaohei-avatar-glance-right {
521
+ 0%, 100% { translate: 0 0; rotate: 0deg; }
522
+ 22%, 68% { translate: 1.5px 0; rotate: 1.15deg; }
523
+ 80% { translate: 1px .5px; rotate: .65deg; }
524
+ }
525
+
526
+ @keyframes xiaohei-avatar-nod {
527
+ 0%, 100% { translate: 0 0; rotate: 0deg; }
528
+ 24% { translate: 0 1px; rotate: 0deg; }
529
+ 43% { translate: 0 3px; rotate: .35deg; }
530
+ 61% { translate: 0 -1px; rotate: -.25deg; }
531
+ 78% { translate: 0 .4px; rotate: 0deg; }
532
+ }
533
+
534
+ @keyframes xiaohei-avatar-perk {
535
+ 0%, 100% { translate: 0 0; scale: 1; }
536
+ 24% { translate: 0 1px; scale: .992; }
537
+ 43%, 68% { translate: 0 -3px; scale: 1.018; }
538
+ 82% { translate: 0 -1px; scale: 1.006; }
539
+ }
540
+
541
+ @keyframes xiaohei-avatar-peek {
542
+ 0%, 100% { translate: 0 0; rotate: 0deg; }
543
+ 22% { translate: 1px -1px; rotate: .4deg; }
544
+ 42%, 70% { translate: 3px -3px; rotate: 1.15deg; }
545
+ 84% { translate: 1px -1px; rotate: .45deg; }
546
+ }
547
+
548
+ @keyframes xiaohei-avatar-ponder {
549
+ 0%, 100% { translate: 0 0; rotate: 0deg; }
550
+ 18% { translate: 0 1px; rotate: 0deg; }
551
+ 36%, 72% { translate: -1px -1px; rotate: -1deg; }
552
+ 84% { translate: -.5px 0; rotate: -.45deg; }
553
+ }
554
+
555
+ @keyframes xiaohei-avatar-double-blink-closed {
556
+ 0%, 12%, 29%, 45%, 100% { opacity: 0; }
557
+ 18%, 23%, 35%, 40% { opacity: 1; }
558
+ }
559
+
560
+ @keyframes xiaohei-avatar-ring-response {
561
+ 0%, 24% { opacity: 0; transform: scale(.78); }
562
+ 42% { opacity: .52; transform: scale(.96) rotate(1deg); }
563
+ 72%, 100% { opacity: 0; transform: scale(1.14) rotate(8deg); }
564
+ }
565
+
566
+ @keyframes xiaohei-avatar-focus {
567
+ 0%, 100% { opacity: .52; transform: scale(.98); }
568
+ 50% { opacity: .72; transform: scale(1.025); }
569
+ }
570
+
571
+ @keyframes xiaohei-avatar-complete {
572
+ 0%, 100% { translate: 0 0; scale: 1; }
573
+ 35% { translate: 0 -4px; scale: 1.025; }
574
+ 64% { translate: 0 -1px; scale: 1.01; }
575
+ }
576
+
577
+ @keyframes xiaohei-avatar-error {
578
+ 0%, 100% { translate: 0 0; }
579
+ 34% { translate: -2px 1px; }
580
+ 68% { translate: 2px 1px; }
581
+ }
582
+
583
+ @media (prefers-reduced-motion: reduce) {
584
+ .xiaohei-composer-avatar,
585
+ .xiaohei-composer-avatar *,
586
+ .xiaohei-composer-avatar *::before,
587
+ .xiaohei-composer-avatar *::after {
588
+ animation: none !important;
589
+ transition-duration: .01ms !important;
590
+ }
591
+ }
592
+
593
+ @media (forced-colors: active) {
594
+ .xiaohei-composer-avatar {
595
+ display: none;
596
+ }
597
+ }
598
+ `;
599
+ //# sourceMappingURL=composer-avatar.js.map
@@ -0,0 +1,3 @@
1
+ /** Heixiu is the Host send button, not a neighbouring ornament. */
2
+ export declare const XIAOHEI_COMPOSER_SEND_HEIXIU_CSS = "\n/* Official InputBar contract: row -> trailing controls -> last primary action. */\n#root [data-composer-card='true'] > :last-child > :last-child > button:last-child {\n position: relative;\n isolation: isolate;\n width: 38px;\n height: 38px;\n min-width: 38px;\n min-height: 38px;\n border: 1px solid var(--xiaohei-composer-control-edge) !important;\n border-radius: 50% !important;\n color: var(--xiaohei-composer-primary-icon) !important;\n background: var(--xiaohei-composer-disabled) !important;\n box-shadow: inset 0 1px 0 var(--xiaohei-composer-highlight) !important;\n}\n\n#root [data-composer-card='true'] > :last-child > :last-child > button:last-child[data-xiaohei-send-heixiu='true'] {\n overflow: visible;\n padding: 0;\n border-color: transparent !important;\n background: transparent !important;\n box-shadow: none !important;\n}\n\n/* Preserve the native glyph in the DOM; only the visual presentation changes. */\n#root [data-composer-card='true'] > :last-child > :last-child\n > button[data-xiaohei-send-heixiu='true'] > svg {\n opacity: 0;\n}\n\n.xiaohei-composer-send-heixiu {\n position: absolute;\n z-index: 1;\n inset: 0;\n overflow: visible;\n pointer-events: none;\n opacity: 1;\n transform: translateY(-1px) scale(1) translateZ(0);\n transform-origin: 50% 58%;\n transition:\n opacity 160ms ease,\n transform 180ms var(--xiaohei-motion-curve);\n}\n\n.xiaohei-composer-send-heixiu img {\n position: absolute;\n top: 50%;\n left: 50%;\n display: block;\n width: 60px;\n height: 60px;\n max-width: none;\n user-select: none;\n pointer-events: none;\n object-fit: contain;\n filter:\n drop-shadow(0 0 1px var(--xiaohei-composer-heixiu-edge))\n drop-shadow(0 3px 4px var(--xiaohei-composer-heixiu-shadow));\n transform: translate(-50%, -45%) translateZ(0);\n}\n\n.xiaohei-composer-send-heixiu__open {\n opacity: 1;\n}\n\n.xiaohei-composer-send-heixiu__blink {\n opacity: 0;\n}\n\n.xiaohei-composer-send-heixiu[data-xiaohei-blink='closed']\n .xiaohei-composer-send-heixiu__open {\n opacity: 0;\n}\n\n.xiaohei-composer-send-heixiu[data-xiaohei-blink='closed']\n .xiaohei-composer-send-heixiu__blink {\n opacity: 1;\n}\n\n#root [data-composer-card='true'] > :last-child > :last-child\n > button[data-xiaohei-send-heixiu='true']:not(:disabled):hover {\n border-color: transparent !important;\n background: transparent !important;\n box-shadow: none !important;\n transform: none;\n}\n\n#root [data-composer-card='true'] > :last-child > :last-child\n > button[data-xiaohei-send-heixiu='true']:not(:disabled):hover\n .xiaohei-composer-send-heixiu {\n transform: translateY(-2px) scale(1.055) translateZ(0);\n}\n\n#root [data-composer-card='true'] > :last-child > :last-child\n > button[data-xiaohei-send-heixiu='true']:not(:disabled):active {\n transform: none;\n}\n\n#root [data-composer-card='true'] > :last-child > :last-child\n > button[data-xiaohei-send-heixiu='true']:not(:disabled):active\n .xiaohei-composer-send-heixiu {\n transform: translateY(0) scale(.93) translateZ(0);\n}\n\n#root [data-composer-card='true'] > :last-child > :last-child\n > button[data-xiaohei-send-heixiu='true']:disabled {\n border-color: transparent !important;\n background: transparent !important;\n box-shadow: none !important;\n transform: none;\n}\n\n#root [data-composer-card='true'] > :last-child > :last-child\n > button[data-xiaohei-send-heixiu='true']:disabled\n .xiaohei-composer-send-heixiu {\n opacity: .42;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .xiaohei-composer-send-heixiu {\n transition-duration: 0.01ms !important;\n }\n}\n\n@media (forced-colors: active) {\n #root [data-composer-card='true'] > :last-child > :last-child\n > button[data-xiaohei-send-heixiu='true'] {\n border: 1px solid ButtonText !important;\n background: ButtonFace !important;\n }\n\n #root [data-composer-card='true'] > :last-child > :last-child\n > button[data-xiaohei-send-heixiu='true'] > svg {\n opacity: 1;\n }\n\n .xiaohei-composer-send-heixiu {\n display: none;\n }\n}\n";
3
+ //# sourceMappingURL=composer-send-heixiu.d.ts.map