@lemoncat7/dsh-theme-xiaohei 0.4.6 → 0.5.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 (232) hide show
  1. package/README.md +15 -9
  2. package/THIRD_PARTY_NOTICES.md +13 -1
  3. package/docs/dsh-021-compatibility.md +23 -0
  4. package/docs/releases/0.5.0.md +24 -0
  5. package/docs/rift-interaction.md +35 -0
  6. package/docs/rift-preview.md +39 -0
  7. package/lib/client.companion.js +3 -4
  8. package/lib/client.decorations.js +224 -51
  9. package/lib/client.js +534 -2405
  10. package/lib/index.d.ts +1 -2
  11. package/lib/index.js +395 -11
  12. package/lib/rift/boot.d.ts +6 -0
  13. package/package.json +29 -19
  14. package/lib/appearance.d.ts +0 -12
  15. package/lib/appearance.js +0 -42
  16. package/lib/blink.d.ts +0 -4
  17. package/lib/blink.js +0 -110
  18. package/lib/bloub-heixiu/ambient.d.ts +0 -3
  19. package/lib/bloub-heixiu/ambient.js +0 -12
  20. package/lib/bloub-heixiu/character.d.ts +0 -33
  21. package/lib/bloub-heixiu/character.js +0 -124
  22. package/lib/bloub-heixiu/effects.d.ts +0 -4
  23. package/lib/bloub-heixiu/effects.js +0 -91
  24. package/lib/bloub-heixiu/flight.d.ts +0 -15
  25. package/lib/bloub-heixiu/flight.js +0 -66
  26. package/lib/bloub-heixiu/follow.d.ts +0 -13
  27. package/lib/bloub-heixiu/follow.js +0 -23
  28. package/lib/bloub-heixiu/layout.d.ts +0 -34
  29. package/lib/bloub-heixiu/layout.js +0 -26
  30. package/lib/bloub-heixiu/renderer.d.ts +0 -16
  31. package/lib/bloub-heixiu/renderer.js +0 -94
  32. package/lib/bloub-heixiu/runtime.d.ts +0 -6
  33. package/lib/bloub-heixiu/runtime.js +0 -440
  34. package/lib/bloub-heixiu/signals.d.ts +0 -17
  35. package/lib/bloub-heixiu/signals.js +0 -55
  36. package/lib/bloub-heixiu/styles.d.ts +0 -2
  37. package/lib/bloub-heixiu/styles.js +0 -98
  38. package/lib/boot-appearance.d.ts +0 -10
  39. package/lib/boot-appearance.js +0 -47
  40. package/lib/boot-loader.d.ts +0 -5
  41. package/lib/boot-loader.js +0 -158
  42. package/lib/chrome/accessibility.d.ts +0 -3
  43. package/lib/chrome/accessibility.js +0 -69
  44. package/lib/chrome/blink.d.ts +0 -3
  45. package/lib/chrome/blink.js +0 -15
  46. package/lib/chrome/composer-avatar.d.ts +0 -10
  47. package/lib/chrome/composer-avatar.js +0 -599
  48. package/lib/chrome/composer-send-heixiu.d.ts +0 -3
  49. package/lib/chrome/composer-send-heixiu.js +0 -143
  50. package/lib/chrome/composer.d.ts +0 -3
  51. package/lib/chrome/composer.js +0 -135
  52. package/lib/chrome/controls.d.ts +0 -8
  53. package/lib/chrome/controls.js +0 -348
  54. package/lib/chrome/conversation-messages.d.ts +0 -3
  55. package/lib/chrome/conversation-messages.js +0 -329
  56. package/lib/chrome/conversation-submissions.d.ts +0 -3
  57. package/lib/chrome/conversation-submissions.js +0 -68
  58. package/lib/chrome/conversation.d.ts +0 -3
  59. package/lib/chrome/conversation.js +0 -67
  60. package/lib/chrome/frames.d.ts +0 -6
  61. package/lib/chrome/frames.js +0 -134
  62. package/lib/chrome/gaze.d.ts +0 -3
  63. package/lib/chrome/gaze.js +0 -103
  64. package/lib/chrome/identity.d.ts +0 -6
  65. package/lib/chrome/identity.js +0 -47
  66. package/lib/chrome/overlays.d.ts +0 -3
  67. package/lib/chrome/overlays.js +0 -104
  68. package/lib/chrome/portal.d.ts +0 -6
  69. package/lib/chrome/portal.js +0 -169
  70. package/lib/chrome/reactions.d.ts +0 -3
  71. package/lib/chrome/reactions.js +0 -85
  72. package/lib/chrome/sidebar.d.ts +0 -3
  73. package/lib/chrome/sidebar.js +0 -313
  74. package/lib/chrome/tokens.d.ts +0 -3
  75. package/lib/chrome/tokens.js +0 -224
  76. package/lib/chrome/workspace.d.ts +0 -3
  77. package/lib/chrome/workspace.js +0 -94
  78. package/lib/chrome.d.ts +0 -10
  79. package/lib/chrome.js +0 -46
  80. package/lib/client-entry.d.ts +0 -3
  81. package/lib/client-entry.js +0 -3
  82. package/lib/client.d.ts +0 -10
  83. package/lib/client.pose-chin-dark.js +0 -4
  84. package/lib/client.pose-chin-light.js +0 -4
  85. package/lib/client.pose-doze-dark.js +0 -4
  86. package/lib/client.pose-doze-light.js +0 -4
  87. package/lib/client.pose-halfpeek-dark.js +0 -4
  88. package/lib/client.pose-halfpeek-light.js +0 -4
  89. package/lib/client.pose-peek-dark.js +0 -4
  90. package/lib/client.pose-peek-light.js +0 -4
  91. package/lib/client.pose-seated-dark.js +0 -4
  92. package/lib/client.pose-seated-light.js +0 -4
  93. package/lib/client.rig-chin-dark.js +0 -4
  94. package/lib/client.rig-chin-light.js +0 -4
  95. package/lib/client.rig-halfpeek-dark.js +0 -4
  96. package/lib/client.rig-halfpeek-light.js +0 -4
  97. package/lib/client.rig-peek-dark.js +0 -4
  98. package/lib/client.rig-peek-light.js +0 -4
  99. package/lib/client.rig-seated-dark.js +0 -4
  100. package/lib/client.rig-seated-light.js +0 -4
  101. package/lib/companion-entry.d.ts +0 -3
  102. package/lib/companion-entry.js +0 -3
  103. package/lib/composer-avatar.d.ts +0 -18
  104. package/lib/composer-avatar.js +0 -441
  105. package/lib/composer-draft-preview.d.ts +0 -4
  106. package/lib/composer-draft-preview.js +0 -8
  107. package/lib/composer-send-heixiu.d.ts +0 -8
  108. package/lib/composer-send-heixiu.js +0 -133
  109. package/lib/current-session.d.ts +0 -6
  110. package/lib/current-session.js +0 -5
  111. package/lib/decorations-entry.d.ts +0 -3
  112. package/lib/decorations-entry.js +0 -18
  113. package/lib/deferred-companion.d.ts +0 -5
  114. package/lib/deferred-companion.js +0 -9
  115. package/lib/deferred-decorations.d.ts +0 -3
  116. package/lib/deferred-decorations.js +0 -51
  117. package/lib/gaze.d.ts +0 -4
  118. package/lib/gaze.js +0 -230
  119. package/lib/generated-backgrounds.d.ts +0 -14
  120. package/lib/generated-backgrounds.js +0 -14
  121. package/lib/generated-character-motion.d.ts +0 -4
  122. package/lib/generated-character-motion.js +0 -2
  123. package/lib/generated-identity.d.ts +0 -6
  124. package/lib/generated-identity.js +0 -6
  125. package/lib/generated-keyart.d.ts +0 -34
  126. package/lib/generated-keyart.js +0 -34
  127. package/lib/generated-loading-assets.d.ts +0 -4
  128. package/lib/generated-loading-assets.js +0 -4
  129. package/lib/heixiu-interactions.d.ts +0 -10
  130. package/lib/heixiu-interactions.js +0 -161
  131. package/lib/host-contract.d.ts +0 -9
  132. package/lib/host-contract.js +0 -13
  133. package/lib/host-dom.d.ts +0 -11
  134. package/lib/host-dom.js +0 -72
  135. package/lib/loading-heixiu.d.ts +0 -8
  136. package/lib/loading-heixiu.js +0 -287
  137. package/lib/metallic-brand-mark.d.ts +0 -10
  138. package/lib/metallic-brand-mark.js +0 -296
  139. package/lib/plugin.d.ts +0 -6
  140. package/lib/plugin.js +0 -60
  141. package/lib/portal.d.ts +0 -40
  142. package/lib/portal.js +0 -225
  143. package/lib/reactions.d.ts +0 -20
  144. package/lib/reactions.js +0 -380
  145. package/lib/scene/avatar-model.d.ts +0 -6
  146. package/lib/scene/avatar-model.js +0 -646
  147. package/lib/scene/avatar-motion.d.ts +0 -3
  148. package/lib/scene/avatar-motion.js +0 -799
  149. package/lib/scene/character-assets.d.ts +0 -13
  150. package/lib/scene/character-assets.js +0 -26
  151. package/lib/scene/character-expression.d.ts +0 -4
  152. package/lib/scene/character-expression.js +0 -15
  153. package/lib/scene/character-eye-material.d.ts +0 -13
  154. package/lib/scene/character-eye-material.js +0 -88
  155. package/lib/scene/character-eye-renderer.d.ts +0 -5
  156. package/lib/scene/character-eye-renderer.js +0 -80
  157. package/lib/scene/character-eye-rig.d.ts +0 -20
  158. package/lib/scene/character-eye-rig.js +0 -35
  159. package/lib/scene/character-gaze.d.ts +0 -16
  160. package/lib/scene/character-gaze.js +0 -36
  161. package/lib/scene/character-idle.d.ts +0 -17
  162. package/lib/scene/character-idle.js +0 -65
  163. package/lib/scene/character-layout.d.ts +0 -24
  164. package/lib/scene/character-layout.js +0 -51
  165. package/lib/scene/character-motion-clock.d.ts +0 -18
  166. package/lib/scene/character-motion-clock.js +0 -70
  167. package/lib/scene/character-motion-types.d.ts +0 -12
  168. package/lib/scene/character-motion-types.js +0 -2
  169. package/lib/scene/character-motion.d.ts +0 -6
  170. package/lib/scene/character-motion.js +0 -187
  171. package/lib/scene/character-poses.d.ts +0 -26
  172. package/lib/scene/character-poses.js +0 -11
  173. package/lib/scene/character-rig-renderer.d.ts +0 -5
  174. package/lib/scene/character-rig-renderer.js +0 -95
  175. package/lib/scene/character-rig.d.ts +0 -22
  176. package/lib/scene/character-rig.js +0 -61
  177. package/lib/scene/heixiu-feedback.d.ts +0 -3
  178. package/lib/scene/heixiu-feedback.js +0 -64
  179. package/lib/scene/heixiu-interactions.d.ts +0 -3
  180. package/lib/scene/heixiu-interactions.js +0 -92
  181. package/lib/scene/ids.d.ts +0 -5
  182. package/lib/scene/ids.js +0 -5
  183. package/lib/scene/pointer-bridge.d.ts +0 -21
  184. package/lib/scene/pointer-bridge.js +0 -155
  185. package/lib/scene/runtime.d.ts +0 -12
  186. package/lib/scene/runtime.js +0 -74
  187. package/lib/scene/state-transitions.d.ts +0 -3
  188. package/lib/scene/state-transitions.js +0 -37
  189. package/lib/scene/styles.d.ts +0 -5
  190. package/lib/scene/styles.js +0 -69
  191. package/lib/scene/sylva-performance.d.ts +0 -11
  192. package/lib/scene/sylva-performance.js +0 -58
  193. package/lib/scene/wallpaper-character-styles.d.ts +0 -3
  194. package/lib/scene/wallpaper-character-styles.js +0 -49
  195. package/lib/scene/wallpaper-character.d.ts +0 -5
  196. package/lib/scene/wallpaper-character.js +0 -222
  197. package/lib/scene.d.ts +0 -8
  198. package/lib/scene.js +0 -8
  199. package/lib/sidebar-glass.d.ts +0 -16
  200. package/lib/sidebar-glass.js +0 -168
  201. package/lib/sidebar-heixiu-escape.d.ts +0 -44
  202. package/lib/sidebar-heixiu-escape.js +0 -340
  203. package/lib/sidebar-heixiu-roaming.d.ts +0 -27
  204. package/lib/sidebar-heixiu-roaming.js +0 -310
  205. package/lib/sidebar-reveal.d.ts +0 -8
  206. package/lib/sidebar-reveal.js +0 -59
  207. package/lib/state.d.ts +0 -21
  208. package/lib/state.js +0 -123
  209. package/lib/theme.d.ts +0 -19
  210. package/lib/theme.js +0 -188
  211. package/lib/vendor/bloub/decor.d.ts +0 -114
  212. package/lib/vendor/bloub/decor.js +0 -198
  213. package/lib/vendor/bloub/engine.d.ts +0 -213
  214. package/lib/vendor/bloub/engine.js +0 -452
  215. package/lib/vendor/bloub/expressions.d.ts +0 -35
  216. package/lib/vendor/bloub/expressions.js +0 -143
  217. package/lib/vendor/bloub/eyefit.d.ts +0 -75
  218. package/lib/vendor/bloub/eyefit.js +0 -393
  219. package/lib/vendor/bloub/face.d.ts +0 -63
  220. package/lib/vendor/bloub/face.js +0 -106
  221. package/lib/vendor/bloub/math.d.ts +0 -22
  222. package/lib/vendor/bloub/math.js +0 -36
  223. package/lib/vendor/bloub/profiles.d.ts +0 -8
  224. package/lib/vendor/bloub/profiles.js +0 -20
  225. package/lib/vendor/bloub/repere.d.ts +0 -30
  226. package/lib/vendor/bloub/repere.js +0 -32
  227. package/lib/vendor/bloub/shape.d.ts +0 -80
  228. package/lib/vendor/bloub/shape.js +0 -268
  229. package/lib/vendor/bloub/skins.d.ts +0 -36
  230. package/lib/vendor/bloub/skins.js +0 -74
  231. package/lib/vendor/bloub/states.d.ts +0 -87
  232. package/lib/vendor/bloub/states.js +0 -468
@@ -1,103 +0,0 @@
1
- /** Visual geometry for Xiaohei's idle gaze. Behavior lives in ../gaze.ts. */
2
- export const XIAOHEI_GAZE_CSS = `
3
- .xiaohei-scene__mascot-blink {
4
- z-index: 3;
5
- }
6
-
7
- .xiaohei-gaze {
8
- --xiaohei-gaze-x: 0px;
9
- --xiaohei-gaze-y: 0px;
10
- position: absolute;
11
- inset: 0;
12
- z-index: 2;
13
- display: block;
14
- overflow: hidden;
15
- opacity: 0;
16
- pointer-events: none;
17
- transition: opacity 80ms ease-out;
18
- }
19
-
20
- html[data-xiaohei-state='idle'] .xiaohei-gaze {
21
- opacity: 1;
22
- }
23
-
24
- /* The complete blink frame owns eye occlusion; a second visibility clock can expose pupil-free frames. */
25
-
26
- .xiaohei-gaze__base {
27
- position: absolute;
28
- inset: 0;
29
- display: block;
30
- width: 100%;
31
- height: 100%;
32
- max-width: none;
33
- max-height: none;
34
- object-fit: contain;
35
- filter: brightness(1.32) contrast(1.02) saturate(1.04);
36
- }
37
-
38
- html[data-xiaohei-appearance='light'] .xiaohei-gaze__base {
39
- filter: brightness(1.02) contrast(1.07) saturate(0.9);
40
- }
41
-
42
- .xiaohei-gaze__eye {
43
- position: absolute;
44
- display: block;
45
- overflow: hidden;
46
- border-radius: 50%;
47
- pointer-events: none;
48
- }
49
-
50
- .xiaohei-gaze__eye--left {
51
- left: 22.65%;
52
- top: 34.35%;
53
- width: 9%;
54
- height: 13.7%;
55
- }
56
-
57
- .xiaohei-gaze__eye--right {
58
- left: 38.25%;
59
- top: 35.15%;
60
- width: 13.3%;
61
- height: 14.5%;
62
- }
63
-
64
- .xiaohei-gaze__pupil {
65
- position: absolute;
66
- display: block;
67
- border-radius: 48% 52% 49% 51%;
68
- background:
69
- radial-gradient(circle at 39% 27%, #F3F7F3 0 12%, transparent 15%),
70
- #020505;
71
- transform: translate3d(
72
- calc(-50% + var(--xiaohei-gaze-x)),
73
- calc(-50% + var(--xiaohei-gaze-y)),
74
- 0
75
- );
76
- transform-origin: 50% 50%;
77
- }
78
-
79
- .xiaohei-gaze[data-moving='true'] .xiaohei-gaze__pupil {
80
- will-change: transform;
81
- }
82
-
83
- .xiaohei-gaze__pupil--left {
84
- left: 50%;
85
- top: 49%;
86
- width: 57.25%;
87
- height: 67.5%;
88
- }
89
-
90
- .xiaohei-gaze__pupil--right {
91
- left: 33.5%;
92
- top: 48.7%;
93
- width: 40.25%;
94
- height: 65.2%;
95
- }
96
-
97
- @media (prefers-reduced-motion: reduce), (hover: none) and (pointer: coarse) {
98
- .xiaohei-gaze {
99
- display: none;
100
- }
101
- }
102
- `;
103
- //# sourceMappingURL=gaze.js.map
@@ -1,6 +0,0 @@
1
- /**
2
- * Xiaohei ornaments shared by native DSH chrome and opt-in feature plugins.
3
- * Frames own geometry and headings; this layer owns generated hanging art only.
4
- */
5
- export declare const XIAOHEI_IDENTITY_CSS: string;
6
- //# sourceMappingURL=identity.d.ts.map
@@ -1,47 +0,0 @@
1
- import { XIAOHEI_IDENTITY_CHARM } from '../generated-identity.js';
2
- /**
3
- * Xiaohei ornaments shared by native DSH chrome and opt-in feature plugins.
4
- * Frames own geometry and headings; this layer owns generated hanging art only.
5
- */
6
- export const XIAOHEI_IDENTITY_CSS = `
7
- :where([data-xiaohei-frame-ornament='spirit-knot'])::after {
8
- content: '';
9
- position: absolute;
10
- z-index: 3;
11
- width: 30px;
12
- height: 48px;
13
- border: 0;
14
- border-radius: 0;
15
- background-position: center;
16
- background-size: contain;
17
- background-repeat: no-repeat;
18
- box-shadow: none;
19
- filter: drop-shadow(0 3px 4px var(--xiaohei-shadow));
20
- opacity: 0.92;
21
- pointer-events: none;
22
- transform: rotate(3deg);
23
- transform-origin: 50% 8%;
24
- transition: transform 320ms var(--xiaohei-motion-curve), filter var(--xiaohei-motion-base) ease;
25
- }
26
-
27
- :where([data-xiaohei-frame-ornament='spirit-knot'])::after {
28
- background-image: url("${XIAOHEI_IDENTITY_CHARM}");
29
- }
30
-
31
- :where([data-xiaohei-frame-ornament='spirit-knot'])::after {
32
- top: -6px;
33
- right: 16px;
34
- }
35
-
36
- :where([data-xiaohei-frame-ornament='spirit-knot']):hover::after {
37
- filter: drop-shadow(0 4px 6px var(--xiaohei-focus-shadow));
38
- transform: rotate(-4deg) scale(1.03);
39
- }
40
-
41
- @media (forced-colors: active) {
42
- :where([data-xiaohei-frame-ornament])::after {
43
- display: none;
44
- }
45
- }
46
- `;
47
- //# sourceMappingURL=identity.js.map
@@ -1,3 +0,0 @@
1
- /** Dialog, menu, listbox, focus, and separator surfaces. */
2
- export declare const XIAOHEI_OVERLAY_CSS = "\n#root [role='dialog'],\n#root [role='menu'],\n#root [role='listbox'] {\n isolation: isolate;\n border: 1px solid var(--xiaohei-edge) !important;\n color: var(--dsw-alias-label-primary);\n background-color: var(--xiaohei-overlay-fill) !important;\n -webkit-backdrop-filter: blur(var(--xiaohei-overlay-blur)) saturate(var(--xiaohei-overlay-saturation));\n backdrop-filter: blur(var(--xiaohei-overlay-blur)) saturate(var(--xiaohei-overlay-saturation));\n box-shadow:\n inset 0 0 0 1px var(--xiaohei-frame-inner),\n inset 0 1px rgb(255 255 255 / 7%),\n 0 22px 64px var(--xiaohei-shadow) !important;\n}\n\n#root [role='dialog'] {\n border-radius: calc(var(--xiaohei-radius-panel) + 2px) !important;\n background-image:\n linear-gradient(var(--xiaohei-frame-line-strong), var(--xiaohei-frame-line-strong)),\n linear-gradient(var(--xiaohei-frame-line), var(--xiaohei-frame-line)),\n linear-gradient(var(--xiaohei-frame-line), var(--xiaohei-frame-line)),\n linear-gradient(145deg, rgb(255 255 255 / 3%), transparent 34%) !important;\n background-position: 18px 0, 0 18px, 100% calc(100% - 18px), 0 0 !important;\n background-size: 48px 1px, 1px 34px, 1px 34px, auto !important;\n background-repeat: no-repeat !important;\n}\n\n#root [role='dialog'] > nav {\n border-right: 1px solid var(--xiaohei-edge);\n background: linear-gradient(180deg, var(--xiaohei-spirit-faint), transparent 46%);\n}\n\n#root [role='menu'],\n#root [role='listbox'] {\n border-radius: var(--xiaohei-radius-control) !important;\n}\n\n@media (max-width: 700px) {\n #root [role='dialog'],\n #root [role='menu'],\n #root [role='listbox'] {\n --xiaohei-overlay-blur: 12px;\n }\n}\n\n#root [role='menuitem'],\n#root [role='option'],\n#root [role='dialog'] button,\n#root [role='menu'] button,\n#root [role='listbox'] button {\n border: 1px solid transparent;\n border-radius: var(--xiaohei-radius-small);\n transition:\n color var(--xiaohei-motion-fast) ease,\n background-color var(--xiaohei-motion-fast) ease,\n border-color var(--xiaohei-motion-fast) ease,\n transform var(--xiaohei-motion-fast) var(--xiaohei-motion-curve);\n}\n\n#root [role='menuitem']:hover,\n#root [role='option']:hover,\n#root [role='dialog'] button:not(:disabled):hover,\n#root [role='menu'] button:not(:disabled):hover,\n#root [role='listbox'] button:not(:disabled):hover {\n color: var(--xiaohei-spirit-strong);\n border-color: var(--xiaohei-edge);\n background: var(--xiaohei-spirit-soft);\n}\n\n#root [role='menuitem']:active,\n#root [role='option']:active,\n#root [role='dialog'] button:not(:disabled):active,\n#root [role='menu'] button:not(:disabled):active,\n#root [role='listbox'] button:not(:disabled):active {\n transform: translateY(1px) scale(0.99);\n}\n\n#root [role='dialog'] button[aria-current='true'],\n#root [role='menu'] [aria-current='true'],\n#root [role='listbox'] [aria-selected='true'] {\n color: var(--xiaohei-spirit-strong);\n background: var(--xiaohei-spirit-soft);\n box-shadow: inset 3px 0 var(--xiaohei-spirit);\n}\n\n#root button:focus-visible,\n#root input:focus-visible,\n#root textarea:focus-visible,\n#root select:focus-visible,\n#root [tabindex]:focus-visible {\n outline: 2px solid var(--xiaohei-spirit-strong) !important;\n outline-offset: 2px !important;\n box-shadow: 0 0 0 5px var(--xiaohei-focus-shadow);\n}\n\n#root [role='separator'] {\n border-color: transparent !important;\n background: linear-gradient(90deg, transparent, var(--xiaohei-edge), transparent) !important;\n opacity: 0.82;\n}\n";
3
- //# sourceMappingURL=overlays.d.ts.map
@@ -1,104 +0,0 @@
1
- /** Dialog, menu, listbox, focus, and separator surfaces. */
2
- export const XIAOHEI_OVERLAY_CSS = `
3
- #root [role='dialog'],
4
- #root [role='menu'],
5
- #root [role='listbox'] {
6
- isolation: isolate;
7
- border: 1px solid var(--xiaohei-edge) !important;
8
- color: var(--dsw-alias-label-primary);
9
- background-color: var(--xiaohei-overlay-fill) !important;
10
- -webkit-backdrop-filter: blur(var(--xiaohei-overlay-blur)) saturate(var(--xiaohei-overlay-saturation));
11
- backdrop-filter: blur(var(--xiaohei-overlay-blur)) saturate(var(--xiaohei-overlay-saturation));
12
- box-shadow:
13
- inset 0 0 0 1px var(--xiaohei-frame-inner),
14
- inset 0 1px rgb(255 255 255 / 7%),
15
- 0 22px 64px var(--xiaohei-shadow) !important;
16
- }
17
-
18
- #root [role='dialog'] {
19
- border-radius: calc(var(--xiaohei-radius-panel) + 2px) !important;
20
- background-image:
21
- linear-gradient(var(--xiaohei-frame-line-strong), var(--xiaohei-frame-line-strong)),
22
- linear-gradient(var(--xiaohei-frame-line), var(--xiaohei-frame-line)),
23
- linear-gradient(var(--xiaohei-frame-line), var(--xiaohei-frame-line)),
24
- linear-gradient(145deg, rgb(255 255 255 / 3%), transparent 34%) !important;
25
- background-position: 18px 0, 0 18px, 100% calc(100% - 18px), 0 0 !important;
26
- background-size: 48px 1px, 1px 34px, 1px 34px, auto !important;
27
- background-repeat: no-repeat !important;
28
- }
29
-
30
- #root [role='dialog'] > nav {
31
- border-right: 1px solid var(--xiaohei-edge);
32
- background: linear-gradient(180deg, var(--xiaohei-spirit-faint), transparent 46%);
33
- }
34
-
35
- #root [role='menu'],
36
- #root [role='listbox'] {
37
- border-radius: var(--xiaohei-radius-control) !important;
38
- }
39
-
40
- @media (max-width: 700px) {
41
- #root [role='dialog'],
42
- #root [role='menu'],
43
- #root [role='listbox'] {
44
- --xiaohei-overlay-blur: 12px;
45
- }
46
- }
47
-
48
- #root [role='menuitem'],
49
- #root [role='option'],
50
- #root [role='dialog'] button,
51
- #root [role='menu'] button,
52
- #root [role='listbox'] button {
53
- border: 1px solid transparent;
54
- border-radius: var(--xiaohei-radius-small);
55
- transition:
56
- color var(--xiaohei-motion-fast) ease,
57
- background-color var(--xiaohei-motion-fast) ease,
58
- border-color var(--xiaohei-motion-fast) ease,
59
- transform var(--xiaohei-motion-fast) var(--xiaohei-motion-curve);
60
- }
61
-
62
- #root [role='menuitem']:hover,
63
- #root [role='option']:hover,
64
- #root [role='dialog'] button:not(:disabled):hover,
65
- #root [role='menu'] button:not(:disabled):hover,
66
- #root [role='listbox'] button:not(:disabled):hover {
67
- color: var(--xiaohei-spirit-strong);
68
- border-color: var(--xiaohei-edge);
69
- background: var(--xiaohei-spirit-soft);
70
- }
71
-
72
- #root [role='menuitem']:active,
73
- #root [role='option']:active,
74
- #root [role='dialog'] button:not(:disabled):active,
75
- #root [role='menu'] button:not(:disabled):active,
76
- #root [role='listbox'] button:not(:disabled):active {
77
- transform: translateY(1px) scale(0.99);
78
- }
79
-
80
- #root [role='dialog'] button[aria-current='true'],
81
- #root [role='menu'] [aria-current='true'],
82
- #root [role='listbox'] [aria-selected='true'] {
83
- color: var(--xiaohei-spirit-strong);
84
- background: var(--xiaohei-spirit-soft);
85
- box-shadow: inset 3px 0 var(--xiaohei-spirit);
86
- }
87
-
88
- #root button:focus-visible,
89
- #root input:focus-visible,
90
- #root textarea:focus-visible,
91
- #root select:focus-visible,
92
- #root [tabindex]:focus-visible {
93
- outline: 2px solid var(--xiaohei-spirit-strong) !important;
94
- outline-offset: 2px !important;
95
- box-shadow: 0 0 0 5px var(--xiaohei-focus-shadow);
96
- }
97
-
98
- #root [role='separator'] {
99
- border-color: transparent !important;
100
- background: linear-gradient(90deg, transparent, var(--xiaohei-edge), transparent) !important;
101
- opacity: 0.82;
102
- }
103
- `;
104
- //# sourceMappingURL=overlays.js.map
@@ -1,6 +0,0 @@
1
- /**
2
- * Two compact voids and one travelling Heixiu. The portals are matte spatial
3
- * gaps rather than rings; all keyframes stay on compositor-safe properties.
4
- */
5
- export declare const XIAOHEI_PORTAL_CSS = "\n#dsh-theme-xiaohei\\/portal-layer {\n position: absolute;\n inset: 0;\n z-index: 2;\n overflow: hidden;\n contain: strict;\n pointer-events: none;\n user-select: none;\n}\n\n#dsh-theme-xiaohei\\/portal-layer > * {\n position: absolute;\n display: block;\n pointer-events: none;\n}\n\n.xiaohei-portal__void {\n width: clamp(2.8rem, 3.6vw, 4rem);\n aspect-ratio: 0.76;\n border-radius: 48% 52% 46% 54% / 52% 46% 54% 48%;\n opacity: 0;\n background:\n radial-gradient(ellipse at 46% 48%, #010304 0%, #020609 58%, #092027 72%, rgb(66 188 170 / 36%) 78%, transparent 82%);\n box-shadow:\n inset 0 0 0.7rem rgb(0 0 0 / 92%),\n 0 0 0.85rem rgb(78 214 191 / 18%);\n will-change: transform, opacity;\n}\n\n.xiaohei-portal__void::after {\n position: absolute;\n inset: 13% 18%;\n display: block;\n content: '';\n border-radius: inherit;\n background: #000102;\n box-shadow: inset 0.18rem 0 0.45rem rgb(16 56 64 / 42%);\n}\n\n.xiaohei-portal__void--entry {\n left: var(--portal-entry-x);\n top: var(--portal-entry-y);\n transform: translate3d(-50%, -50%, 0) rotate(var(--portal-entry-angle)) scale3d(0.04, 0.12, 1);\n}\n\n.xiaohei-portal__void--exit {\n left: var(--portal-exit-x);\n top: var(--portal-exit-y);\n transform: translate3d(-50%, -50%, 0) rotate(var(--portal-exit-angle)) scale3d(0.04, 0.12, 1);\n}\n\n.xiaohei-portal__traveler {\n left: var(--portal-entry-x);\n top: var(--portal-entry-y);\n z-index: 1;\n width: clamp(2.7rem, 3.4vw, 3.7rem);\n aspect-ratio: 1;\n opacity: 0;\n transform: translate3d(-5rem, -50%, 0) scale(0.9);\n filter:\n drop-shadow(0 0.25rem 0.45rem rgb(90 221 199 / 20%))\n drop-shadow(0 0.58rem 0.9rem rgb(1 9 10 / 22%));\n will-change: transform, opacity;\n}\n\n.xiaohei-portal__traveler > img {\n position: absolute;\n inset: 0;\n display: block;\n width: 100%;\n height: 100%;\n max-width: none;\n max-height: none;\n object-fit: contain;\n filter: brightness(1.1) contrast(1.05) saturate(0.82);\n}\n\n.xiaohei-portal__traveler-blink { opacity: 0; }\n\n#dsh-theme-xiaohei\\/portal-layer[data-running='true'] .xiaohei-portal__void--entry {\n animation: xiaohei-portal-entry 2.6s cubic-bezier(0.4, 0, 0.2, 1) both;\n}\n\n#dsh-theme-xiaohei\\/portal-layer[data-running='true'] .xiaohei-portal__void--exit {\n animation: xiaohei-portal-exit 2.6s cubic-bezier(0.4, 0, 0.2, 1) both;\n}\n\n#dsh-theme-xiaohei\\/portal-layer[data-running='true'] .xiaohei-portal__traveler {\n animation: xiaohei-portal-traveler 2.6s cubic-bezier(0.45, 0, 0.25, 1) both;\n}\n\n#dsh-theme-xiaohei\\/portal-layer[data-running='true'] .xiaohei-portal__traveler-open {\n animation: xiaohei-portal-eyes-open 2.6s step-end both;\n}\n\n#dsh-theme-xiaohei\\/portal-layer[data-running='true'] .xiaohei-portal__traveler-blink {\n animation: xiaohei-portal-eyes-blink 2.6s step-end both;\n}\n\n@keyframes xiaohei-portal-entry {\n 0% { transform: translate3d(-50%, -50%, 0) rotate(var(--portal-entry-angle)) scale3d(0.04, 0.12, 1); opacity: 0; }\n 10%, 55% { transform: translate3d(-50%, -50%, 0) rotate(var(--portal-entry-angle)) scale3d(1, 1, 1); opacity: 0.96; }\n 68%, 100% { transform: translate3d(-50%, -50%, 0) rotate(var(--portal-entry-angle)) scale3d(0.04, 0.12, 1); opacity: 0; }\n}\n\n@keyframes xiaohei-portal-exit {\n 0%, 40% { transform: translate3d(-50%, -50%, 0) rotate(var(--portal-exit-angle)) scale3d(0.04, 0.12, 1); opacity: 0; }\n 51%, 86% { transform: translate3d(-50%, -50%, 0) rotate(var(--portal-exit-angle)) scale3d(1, 1, 1); opacity: 0.96; }\n 100% { transform: translate3d(-50%, -50%, 0) rotate(var(--portal-exit-angle)) scale3d(0.04, 0.12, 1); opacity: 0; }\n}\n\n@keyframes xiaohei-portal-traveler {\n 0% { transform: translate3d(-5rem, -50%, 0) scale(0.88); opacity: 0; }\n 9% { transform: translate3d(-4rem, -50%, 0) scale(0.92); opacity: 0.82; }\n 29% { transform: translate3d(-1rem, -50%, 0) scale(0.92); opacity: 1; }\n 43% { transform: translate3d(0, -50%, 0) scale(0.12); opacity: 0; }\n 50% { transform: translate3d(var(--portal-travel-x), var(--portal-travel-y), 0) scale(0.12); opacity: 0; }\n 59% { transform: translate3d(var(--portal-travel-x), var(--portal-travel-y), 0) scale(0.16); opacity: 0; }\n 70% { transform: translate3d(calc(var(--portal-travel-x) + var(--portal-emerge-near)), var(--portal-travel-y), 0) scale(0.94); opacity: 1; }\n 90% { transform: translate3d(calc(var(--portal-travel-x) + var(--portal-emerge-far)), var(--portal-travel-y), 0) scale(0.92); opacity: 0.9; }\n 100% { transform: translate3d(calc(var(--portal-travel-x) + var(--portal-emerge-end)), var(--portal-travel-y), 0) scale(0.9); opacity: 0; }\n}\n\n@keyframes xiaohei-portal-eyes-open {\n 0%, 20.9% { opacity: 1; transform: translate3d(0, 0, 0); }\n 21%, 23.5% { opacity: 0; transform: translate3d(0, 0, 0); }\n 23.6%, 75.9% { opacity: 1; transform: translate3d(0, 0, 0); }\n 76%, 78.5% { opacity: 0; transform: translate3d(0, 0, 0); }\n 78.6%, 100% { opacity: 1; transform: translate3d(0, 0, 0); }\n}\n\n@keyframes xiaohei-portal-eyes-blink {\n 0%, 20.9% { opacity: 0; transform: translate3d(0, 0, 0); }\n 21%, 23.5% { opacity: 1; transform: translate3d(0, 0, 0); }\n 23.6%, 75.9% { opacity: 0; transform: translate3d(0, 0, 0); }\n 76%, 78.5% { opacity: 1; transform: translate3d(0, 0, 0); }\n 78.6%, 100% { opacity: 0; transform: translate3d(0, 0, 0); }\n}\n\nhtml[data-xiaohei-appearance='light'] .xiaohei-portal__void {\n box-shadow:\n inset 0 0 0.7rem rgb(0 0 0 / 94%),\n 0 0 0.75rem rgb(47 125 108 / 22%);\n}\n\nhtml[data-xiaohei-appearance='light'] .xiaohei-portal__traveler {\n filter:\n drop-shadow(0 0.25rem 0.4rem rgb(48 96 81 / 16%))\n drop-shadow(0 0.55rem 0.8rem rgb(43 61 54 / 12%));\n}\n\nhtml[data-xiaohei-appearance='light'] .xiaohei-portal__traveler > img {\n filter: brightness(1.01) contrast(1.06) saturate(0.76);\n}\n\n@media (max-width: 768px) {\n #dsh-theme-xiaohei\\/portal-layer { display: none; }\n}\n\n@media (prefers-reduced-motion: reduce), (forced-colors: active), print {\n #dsh-theme-xiaohei\\/portal-layer { display: none; }\n}\n";
6
- //# sourceMappingURL=portal.d.ts.map
@@ -1,169 +0,0 @@
1
- /**
2
- * Two compact voids and one travelling Heixiu. The portals are matte spatial
3
- * gaps rather than rings; all keyframes stay on compositor-safe properties.
4
- */
5
- export const XIAOHEI_PORTAL_CSS = `
6
- #dsh-theme-xiaohei\\/portal-layer {
7
- position: absolute;
8
- inset: 0;
9
- z-index: 2;
10
- overflow: hidden;
11
- contain: strict;
12
- pointer-events: none;
13
- user-select: none;
14
- }
15
-
16
- #dsh-theme-xiaohei\\/portal-layer > * {
17
- position: absolute;
18
- display: block;
19
- pointer-events: none;
20
- }
21
-
22
- .xiaohei-portal__void {
23
- width: clamp(2.8rem, 3.6vw, 4rem);
24
- aspect-ratio: 0.76;
25
- border-radius: 48% 52% 46% 54% / 52% 46% 54% 48%;
26
- opacity: 0;
27
- background:
28
- radial-gradient(ellipse at 46% 48%, #010304 0%, #020609 58%, #092027 72%, rgb(66 188 170 / 36%) 78%, transparent 82%);
29
- box-shadow:
30
- inset 0 0 0.7rem rgb(0 0 0 / 92%),
31
- 0 0 0.85rem rgb(78 214 191 / 18%);
32
- will-change: transform, opacity;
33
- }
34
-
35
- .xiaohei-portal__void::after {
36
- position: absolute;
37
- inset: 13% 18%;
38
- display: block;
39
- content: '';
40
- border-radius: inherit;
41
- background: #000102;
42
- box-shadow: inset 0.18rem 0 0.45rem rgb(16 56 64 / 42%);
43
- }
44
-
45
- .xiaohei-portal__void--entry {
46
- left: var(--portal-entry-x);
47
- top: var(--portal-entry-y);
48
- transform: translate3d(-50%, -50%, 0) rotate(var(--portal-entry-angle)) scale3d(0.04, 0.12, 1);
49
- }
50
-
51
- .xiaohei-portal__void--exit {
52
- left: var(--portal-exit-x);
53
- top: var(--portal-exit-y);
54
- transform: translate3d(-50%, -50%, 0) rotate(var(--portal-exit-angle)) scale3d(0.04, 0.12, 1);
55
- }
56
-
57
- .xiaohei-portal__traveler {
58
- left: var(--portal-entry-x);
59
- top: var(--portal-entry-y);
60
- z-index: 1;
61
- width: clamp(2.7rem, 3.4vw, 3.7rem);
62
- aspect-ratio: 1;
63
- opacity: 0;
64
- transform: translate3d(-5rem, -50%, 0) scale(0.9);
65
- filter:
66
- drop-shadow(0 0.25rem 0.45rem rgb(90 221 199 / 20%))
67
- drop-shadow(0 0.58rem 0.9rem rgb(1 9 10 / 22%));
68
- will-change: transform, opacity;
69
- }
70
-
71
- .xiaohei-portal__traveler > img {
72
- position: absolute;
73
- inset: 0;
74
- display: block;
75
- width: 100%;
76
- height: 100%;
77
- max-width: none;
78
- max-height: none;
79
- object-fit: contain;
80
- filter: brightness(1.1) contrast(1.05) saturate(0.82);
81
- }
82
-
83
- .xiaohei-portal__traveler-blink { opacity: 0; }
84
-
85
- #dsh-theme-xiaohei\\/portal-layer[data-running='true'] .xiaohei-portal__void--entry {
86
- animation: xiaohei-portal-entry 2.6s cubic-bezier(0.4, 0, 0.2, 1) both;
87
- }
88
-
89
- #dsh-theme-xiaohei\\/portal-layer[data-running='true'] .xiaohei-portal__void--exit {
90
- animation: xiaohei-portal-exit 2.6s cubic-bezier(0.4, 0, 0.2, 1) both;
91
- }
92
-
93
- #dsh-theme-xiaohei\\/portal-layer[data-running='true'] .xiaohei-portal__traveler {
94
- animation: xiaohei-portal-traveler 2.6s cubic-bezier(0.45, 0, 0.25, 1) both;
95
- }
96
-
97
- #dsh-theme-xiaohei\\/portal-layer[data-running='true'] .xiaohei-portal__traveler-open {
98
- animation: xiaohei-portal-eyes-open 2.6s step-end both;
99
- }
100
-
101
- #dsh-theme-xiaohei\\/portal-layer[data-running='true'] .xiaohei-portal__traveler-blink {
102
- animation: xiaohei-portal-eyes-blink 2.6s step-end both;
103
- }
104
-
105
- @keyframes xiaohei-portal-entry {
106
- 0% { transform: translate3d(-50%, -50%, 0) rotate(var(--portal-entry-angle)) scale3d(0.04, 0.12, 1); opacity: 0; }
107
- 10%, 55% { transform: translate3d(-50%, -50%, 0) rotate(var(--portal-entry-angle)) scale3d(1, 1, 1); opacity: 0.96; }
108
- 68%, 100% { transform: translate3d(-50%, -50%, 0) rotate(var(--portal-entry-angle)) scale3d(0.04, 0.12, 1); opacity: 0; }
109
- }
110
-
111
- @keyframes xiaohei-portal-exit {
112
- 0%, 40% { transform: translate3d(-50%, -50%, 0) rotate(var(--portal-exit-angle)) scale3d(0.04, 0.12, 1); opacity: 0; }
113
- 51%, 86% { transform: translate3d(-50%, -50%, 0) rotate(var(--portal-exit-angle)) scale3d(1, 1, 1); opacity: 0.96; }
114
- 100% { transform: translate3d(-50%, -50%, 0) rotate(var(--portal-exit-angle)) scale3d(0.04, 0.12, 1); opacity: 0; }
115
- }
116
-
117
- @keyframes xiaohei-portal-traveler {
118
- 0% { transform: translate3d(-5rem, -50%, 0) scale(0.88); opacity: 0; }
119
- 9% { transform: translate3d(-4rem, -50%, 0) scale(0.92); opacity: 0.82; }
120
- 29% { transform: translate3d(-1rem, -50%, 0) scale(0.92); opacity: 1; }
121
- 43% { transform: translate3d(0, -50%, 0) scale(0.12); opacity: 0; }
122
- 50% { transform: translate3d(var(--portal-travel-x), var(--portal-travel-y), 0) scale(0.12); opacity: 0; }
123
- 59% { transform: translate3d(var(--portal-travel-x), var(--portal-travel-y), 0) scale(0.16); opacity: 0; }
124
- 70% { transform: translate3d(calc(var(--portal-travel-x) + var(--portal-emerge-near)), var(--portal-travel-y), 0) scale(0.94); opacity: 1; }
125
- 90% { transform: translate3d(calc(var(--portal-travel-x) + var(--portal-emerge-far)), var(--portal-travel-y), 0) scale(0.92); opacity: 0.9; }
126
- 100% { transform: translate3d(calc(var(--portal-travel-x) + var(--portal-emerge-end)), var(--portal-travel-y), 0) scale(0.9); opacity: 0; }
127
- }
128
-
129
- @keyframes xiaohei-portal-eyes-open {
130
- 0%, 20.9% { opacity: 1; transform: translate3d(0, 0, 0); }
131
- 21%, 23.5% { opacity: 0; transform: translate3d(0, 0, 0); }
132
- 23.6%, 75.9% { opacity: 1; transform: translate3d(0, 0, 0); }
133
- 76%, 78.5% { opacity: 0; transform: translate3d(0, 0, 0); }
134
- 78.6%, 100% { opacity: 1; transform: translate3d(0, 0, 0); }
135
- }
136
-
137
- @keyframes xiaohei-portal-eyes-blink {
138
- 0%, 20.9% { opacity: 0; transform: translate3d(0, 0, 0); }
139
- 21%, 23.5% { opacity: 1; transform: translate3d(0, 0, 0); }
140
- 23.6%, 75.9% { opacity: 0; transform: translate3d(0, 0, 0); }
141
- 76%, 78.5% { opacity: 1; transform: translate3d(0, 0, 0); }
142
- 78.6%, 100% { opacity: 0; transform: translate3d(0, 0, 0); }
143
- }
144
-
145
- html[data-xiaohei-appearance='light'] .xiaohei-portal__void {
146
- box-shadow:
147
- inset 0 0 0.7rem rgb(0 0 0 / 94%),
148
- 0 0 0.75rem rgb(47 125 108 / 22%);
149
- }
150
-
151
- html[data-xiaohei-appearance='light'] .xiaohei-portal__traveler {
152
- filter:
153
- drop-shadow(0 0.25rem 0.4rem rgb(48 96 81 / 16%))
154
- drop-shadow(0 0.55rem 0.8rem rgb(43 61 54 / 12%));
155
- }
156
-
157
- html[data-xiaohei-appearance='light'] .xiaohei-portal__traveler > img {
158
- filter: brightness(1.01) contrast(1.06) saturate(0.76);
159
- }
160
-
161
- @media (max-width: 768px) {
162
- #dsh-theme-xiaohei\\/portal-layer { display: none; }
163
- }
164
-
165
- @media (prefers-reduced-motion: reduce), (forced-colors: active), print {
166
- #dsh-theme-xiaohei\\/portal-layer { display: none; }
167
- }
168
- `;
169
- //# sourceMappingURL=portal.js.map
@@ -1,3 +0,0 @@
1
- /** Complete-frame reaction strips. Timing and triggers live in ../reactions.ts. */
2
- export declare const XIAOHEI_REACTION_CSS = "\n.xiaohei-scene__idle-reaction {\n position: absolute;\n display: block;\n inset: 0 auto auto 0;\n width: 900%;\n height: 100%;\n max-width: none;\n max-height: none;\n object-fit: fill;\n z-index: 2;\n opacity: 0;\n pointer-events: none;\n transform: translate3d(0, 0, 0);\n filter: brightness(1.32) contrast(1.02) saturate(1.04);\n}\n\nhtml[data-xiaohei-appearance='light'] .xiaohei-scene__idle-reaction {\n filter: brightness(1.02) contrast(1.07) saturate(0.9);\n}\n\n.xiaohei-scene__mascot[data-xiaohei-reaction='ear-left'] .xiaohei-scene__idle-reaction,\n.xiaohei-scene__mascot[data-xiaohei-reaction='ear-right'] .xiaohei-scene__idle-reaction {\n opacity: 1;\n animation: xiaohei-idle-ear-reaction 560ms steps(8, end) both;\n}\n\n.xiaohei-scene__mascot[data-xiaohei-ear-loop='true'] .xiaohei-scene__idle-reaction {\n animation-iteration-count: infinite;\n}\n\n.xiaohei-scene__mascot[data-xiaohei-reaction='tail-slow'] .xiaohei-scene__idle-reaction,\n.xiaohei-scene__mascot[data-xiaohei-reaction='tail-complete'] .xiaohei-scene__idle-reaction {\n width: 1000%;\n opacity: 1;\n animation-name: xiaohei-idle-tail-reaction;\n animation-timing-function: steps(9, end);\n animation-fill-mode: both;\n animation-iteration-count: 1;\n}\n\n.xiaohei-scene__mascot[data-xiaohei-reaction='tail-slow'] .xiaohei-scene__idle-reaction {\n animation-duration: 1280ms;\n}\n\n.xiaohei-scene__mascot[data-xiaohei-reaction='tail-complete'] .xiaohei-scene__idle-reaction {\n animation-duration: 700ms;\n}\n\n/* Keep the live pupils while the pupil-free complete frame supplies motion. */\n.xiaohei-scene__mascot[data-xiaohei-reaction] .xiaohei-gaze {\n z-index: 3;\n opacity: 1;\n}\n\n.xiaohei-scene__mascot[data-xiaohei-reaction] .xiaohei-gaze__base {\n opacity: 0;\n}\n\n/* Blink remains the highest character frame and naturally covers the pupils. */\n.xiaohei-scene__mascot-blink {\n z-index: 4;\n}\n\nhtml:not([data-xiaohei-state='idle']) .xiaohei-scene__idle-reaction {\n opacity: 0;\n animation: none;\n}\n\n@keyframes xiaohei-idle-ear-reaction {\n from { transform: translate3d(0, 0, 0); }\n to { transform: translate3d(-88.888889%, 0, 0); }\n}\n\n@keyframes xiaohei-idle-tail-reaction {\n from { transform: translate3d(0, 0, 0); }\n to { transform: translate3d(-90%, 0, 0); }\n}\n\n@media (prefers-reduced-motion: reduce), (hover: none) and (pointer: coarse) {\n .xiaohei-scene__idle-reaction { display: none; }\n}\n";
3
- //# sourceMappingURL=reactions.d.ts.map
@@ -1,85 +0,0 @@
1
- /** Complete-frame reaction strips. Timing and triggers live in ../reactions.ts. */
2
- export const XIAOHEI_REACTION_CSS = `
3
- .xiaohei-scene__idle-reaction {
4
- position: absolute;
5
- display: block;
6
- inset: 0 auto auto 0;
7
- width: 900%;
8
- height: 100%;
9
- max-width: none;
10
- max-height: none;
11
- object-fit: fill;
12
- z-index: 2;
13
- opacity: 0;
14
- pointer-events: none;
15
- transform: translate3d(0, 0, 0);
16
- filter: brightness(1.32) contrast(1.02) saturate(1.04);
17
- }
18
-
19
- html[data-xiaohei-appearance='light'] .xiaohei-scene__idle-reaction {
20
- filter: brightness(1.02) contrast(1.07) saturate(0.9);
21
- }
22
-
23
- .xiaohei-scene__mascot[data-xiaohei-reaction='ear-left'] .xiaohei-scene__idle-reaction,
24
- .xiaohei-scene__mascot[data-xiaohei-reaction='ear-right'] .xiaohei-scene__idle-reaction {
25
- opacity: 1;
26
- animation: xiaohei-idle-ear-reaction 560ms steps(8, end) both;
27
- }
28
-
29
- .xiaohei-scene__mascot[data-xiaohei-ear-loop='true'] .xiaohei-scene__idle-reaction {
30
- animation-iteration-count: infinite;
31
- }
32
-
33
- .xiaohei-scene__mascot[data-xiaohei-reaction='tail-slow'] .xiaohei-scene__idle-reaction,
34
- .xiaohei-scene__mascot[data-xiaohei-reaction='tail-complete'] .xiaohei-scene__idle-reaction {
35
- width: 1000%;
36
- opacity: 1;
37
- animation-name: xiaohei-idle-tail-reaction;
38
- animation-timing-function: steps(9, end);
39
- animation-fill-mode: both;
40
- animation-iteration-count: 1;
41
- }
42
-
43
- .xiaohei-scene__mascot[data-xiaohei-reaction='tail-slow'] .xiaohei-scene__idle-reaction {
44
- animation-duration: 1280ms;
45
- }
46
-
47
- .xiaohei-scene__mascot[data-xiaohei-reaction='tail-complete'] .xiaohei-scene__idle-reaction {
48
- animation-duration: 700ms;
49
- }
50
-
51
- /* Keep the live pupils while the pupil-free complete frame supplies motion. */
52
- .xiaohei-scene__mascot[data-xiaohei-reaction] .xiaohei-gaze {
53
- z-index: 3;
54
- opacity: 1;
55
- }
56
-
57
- .xiaohei-scene__mascot[data-xiaohei-reaction] .xiaohei-gaze__base {
58
- opacity: 0;
59
- }
60
-
61
- /* Blink remains the highest character frame and naturally covers the pupils. */
62
- .xiaohei-scene__mascot-blink {
63
- z-index: 4;
64
- }
65
-
66
- html:not([data-xiaohei-state='idle']) .xiaohei-scene__idle-reaction {
67
- opacity: 0;
68
- animation: none;
69
- }
70
-
71
- @keyframes xiaohei-idle-ear-reaction {
72
- from { transform: translate3d(0, 0, 0); }
73
- to { transform: translate3d(-88.888889%, 0, 0); }
74
- }
75
-
76
- @keyframes xiaohei-idle-tail-reaction {
77
- from { transform: translate3d(0, 0, 0); }
78
- to { transform: translate3d(-90%, 0, 0); }
79
- }
80
-
81
- @media (prefers-reduced-motion: reduce), (hover: none) and (pointer: coarse) {
82
- .xiaohei-scene__idle-reaction { display: none; }
83
- }
84
- `;
85
- //# sourceMappingURL=reactions.js.map
@@ -1,3 +0,0 @@
1
- /** One glass surface over DSH's native sidebar geometry and controls. */
2
- export declare const XIAOHEI_SIDEBAR_CSS = "\n/* The layout column and SidebarRoot both consume the native sidebar fill.\n * The theme token makes those surfaces transparent; this stable slot\n * relationship removes the layout column's remaining straight divider. */\n#root :has(> [data-slot='sidebar']) {\n background: transparent !important;\n border-right-color: transparent !important;\n}\n\n#root [data-slot='sidebar'] {\n position: relative;\n}\n\n/* Target the native control by its accessible identity, not DOM order.\n * Do not resurrect controls explicitly hidden/disabled by the Host. */\n#root [data-slot='sidebar'] button:is([aria-label='Collapse sidebar'], [aria-label='\u6536\u8D77\u4FA7\u8FB9\u680F']):not([hidden]):not([disabled]):not([aria-hidden='true']) {\n display: inline-flex !important;\n visibility: visible !important;\n opacity: 1 !important;\n pointer-events: auto !important;\n}\n\n/* Reveal wide navigation only after its column has reached the target width.\n * Keep the toggle itself native. Opacity is applied to content, never the shell\n * (which also hosts fixed-position settings dialogs). */\n@media (prefers-reduced-motion: no-preference) {\n #root [data-xiaohei-sidebar-reveal] [data-xiaohei-sidebar-brand] {\n transition: opacity 100ms ease-out;\n }\n #root [data-xiaohei-sidebar-reveal='waiting'] [data-xiaohei-sidebar-brand] {\n opacity: 0 !important;\n visibility: hidden;\n transition: none;\n }\n}\n\n/* Hide the tree scrollbar's paint, retaining its gutter so rows do not grow\n * into the glass edge. Wheel, touch and keyboard remain native; dialogs and\n * other plugin panels keep their normal scrollbar affordance. */\n#root [data-slot='sidebar.workspaces'] [role='tree'] {\n scrollbar-color: transparent transparent !important;\n}\n\n#root [data-slot='sidebar.workspaces'] [role='tree']::-webkit-scrollbar,\n#root [data-slot='sidebar.workspaces'] [role='tree']::-webkit-scrollbar-thumb,\n#root [data-slot='sidebar.workspaces'] [role='tree']::-webkit-scrollbar-track {\n background: transparent !important;\n border-color: transparent !important;\n box-shadow: none !important;\n}\n\n/* The host shell remains paint- and filter-free because Settings is a fixed\n * descendant. The glass itself lives outside #root in the scene layer. */\n#root [data-slot='sidebar'] > div {\n --dsh-sidebar-inline-padding: 18px;\n position: relative;\n background: transparent !important;\n border-right: 0;\n box-shadow: none;\n}\n\n#dsh-theme-xiaohei\\/sidebar-glass {\n position: absolute;\n box-sizing: border-box;\n left: var(--xiaohei-sidebar-glass-left, 7px);\n top: var(--xiaohei-sidebar-glass-top, 8px);\n width: var(--xiaohei-sidebar-glass-width, 0px);\n height: var(--xiaohei-sidebar-glass-height, 0px);\n pointer-events: none;\n overflow: hidden;\n border: 1px solid var(--xiaohei-sidebar-glass-edge);\n border-radius: var(--xiaohei-sidebar-glass-radius);\n background: var(--xiaohei-sidebar-glass-fill);\n box-shadow:\n inset 0 1px var(--xiaohei-sidebar-glass-highlight),\n inset 1px 0 var(--xiaohei-sidebar-glass-refraction),\n 0 18px 50px -32px var(--xiaohei-sidebar-shadow);\n -webkit-backdrop-filter:\n blur(var(--xiaohei-sidebar-glass-blur))\n saturate(var(--xiaohei-sidebar-glass-saturation));\n backdrop-filter:\n blur(var(--xiaohei-sidebar-glass-blur))\n saturate(var(--xiaohei-sidebar-glass-saturation));\n}\n\n/* Width dragging changes the full-height glass raster every frame. Suspend\n * only the filters while geometry is moving; the translucent surface remains\n * visible and the settled glass returns after the resize gesture ends. */\nhtml[data-xiaohei-sidebar-resizing] #dsh-theme-xiaohei\\/sidebar-glass {\n -webkit-backdrop-filter: none;\n backdrop-filter: none;\n}\n\n/* One restrained inner rim completes the glass edge without tinting content. */\n#dsh-theme-xiaohei\\/sidebar-glass::after {\n content: '';\n position: absolute;\n pointer-events: none;\n inset: 1px;\n border-radius: calc(var(--xiaohei-sidebar-glass-radius) - 1px);\n box-shadow:\n inset 0 1px var(--xiaohei-sidebar-glass-refraction),\n inset 0 -20px 28px -32px var(--xiaohei-sidebar-shadow-soft);\n}\n\n/* The official brand slot owns geometry in both the wide sidebar and rail.\n * The bitmap remains visible as a no-WebGL fallback while the compact\n * MetallicPaint canvas adds a restrained liquid-metal pass above it. */\n.xiaohei-brand-mark {\n position: relative;\n display: inline-grid;\n flex: none;\n place-items: center;\n width: var(--xiaohei-brand-mark-size);\n height: var(--xiaohei-brand-mark-size);\n margin: -2px;\n overflow: visible;\n pointer-events: none;\n filter: drop-shadow(0 2px 3px rgb(8 13 15 / 18%));\n transform: translateY(-1px);\n}\n\n.xiaohei-brand-mark__fallback,\n.xiaohei-brand-mark__metal {\n position: absolute;\n inset: 0;\n display: block;\n width: 100%;\n height: 100%;\n object-fit: contain;\n}\n\n.xiaohei-brand-mark__fallback {\n opacity: .94;\n transition: opacity var(--xiaohei-motion-base) ease;\n}\n\n.xiaohei-brand-mark__metal {\n opacity: 0;\n transition:\n opacity var(--xiaohei-motion-base) ease,\n filter var(--xiaohei-motion-base) ease;\n}\n\n.xiaohei-brand-mark[data-metallic-ready='true'] .xiaohei-brand-mark__fallback {\n opacity: .28;\n}\n\n.xiaohei-brand-mark[data-metallic-ready='true'] .xiaohei-brand-mark__metal {\n opacity: .92;\n}\n\n.xiaohei-brand-name {\n white-space: nowrap;\n letter-spacing: .025em;\n font-size: 17px;\n font-weight: 600;\n}\n\n/* ui-conversation currently exposes the Hero mark but not its headline as a\n * slot. Anchor the visual copy to that official mark occupant so hashed Host\n * class names and unrelated headings remain untouched. */\n#root span:has(> .xiaohei-brand-mark[data-brand-context='hero']) + span {\n font-size: 0;\n}\n\n#root span:has(> .xiaohei-brand-mark[data-brand-context='hero']) + span::after {\n content: '\u4E07\u7269\u6709\u7075\uFF0C\u81EA\u5728\u540C\u884C';\n font-size: 26px;\n font-weight: 500;\n line-height: 32px;\n}\n\n#root [data-slot='sidebar'] button:hover .xiaohei-brand-mark__metal {\n filter: brightness(1.12) contrast(1.04);\n}\n\n/* Keep native rail/wide geometry and one consistent control material. */\n#root [data-slot='sidebar'] button:is([aria-label='Collapse sidebar'], [aria-label='\u6536\u8D77\u4FA7\u8FB9\u680F']),\n#root [data-slot='sidebar'] > div:has(button:is([aria-label='Collapse sidebar'], [aria-label='\u6536\u8D77\u4FA7\u8FB9\u680F'])) > button[aria-label='\u65B0\u5EFA\u4F1A\u8BDD'],\n#root [data-slot='sidebar'] > div:has(button:is([aria-label='Collapse sidebar'], [aria-label='\u6536\u8D77\u4FA7\u8FB9\u680F'])) > button[aria-label='New session'] {\n color: var(--xiaohei-sidebar-emphasis);\n transition:\n background-color var(--xiaohei-motion-fast) ease,\n border-color var(--xiaohei-motion-fast) ease,\n transform var(--xiaohei-motion-fast) var(--xiaohei-motion-curve);\n}\n\n#root [data-slot='sidebar'] button:is([aria-label='Collapse sidebar'], [aria-label='\u6536\u8D77\u4FA7\u8FB9\u680F']):hover {\n background: var(--xiaohei-sidebar-hover);\n}\n\n#root [data-slot='sidebar'] > div:has(button:is([aria-label='Collapse sidebar'], [aria-label='\u6536\u8D77\u4FA7\u8FB9\u680F'])) > button[aria-label='\u65B0\u5EFA\u4F1A\u8BDD'],\n#root [data-slot='sidebar'] > div:has(button:is([aria-label='Collapse sidebar'], [aria-label='\u6536\u8D77\u4FA7\u8FB9\u680F'])) > button[aria-label='New session'] {\n border: 1px solid var(--xiaohei-sidebar-control-edge);\n border-radius: var(--xiaohei-radius-control);\n background: var(--xiaohei-sidebar-control);\n box-shadow: inset 0 1px var(--xiaohei-sidebar-control-highlight);\n justify-content: flex-start;\n gap: 8px;\n padding-inline: 12px;\n text-align: start;\n}\n\n#root [data-slot='sidebar'] > div:has(button:is([aria-label='Collapse sidebar'], [aria-label='\u6536\u8D77\u4FA7\u8FB9\u680F'])) > button[aria-label='\u65B0\u5EFA\u4F1A\u8BDD']:hover,\n#root [data-slot='sidebar'] > div:has(button:is([aria-label='Collapse sidebar'], [aria-label='\u6536\u8D77\u4FA7\u8FB9\u680F'])) > button[aria-label='New session']:hover {\n border-color: var(--xiaohei-sidebar-control-edge-hover);\n background: var(--xiaohei-sidebar-hover);\n}\n\n/* rc.2 renders footer contributions in a horizontal flex row. Stack only\n * this slot and its immediate host so full-width actions cannot displace\n * siblings. Leave settings, plugin interiors, hidden states and order alone.\n * This is also idempotent with Desktop's column-layout compatibility patch. */\n#root [data-slot='sidebar'] :has(> [data-slot='sidebar.footer.action']),\n#root [data-slot='sidebar'] [data-slot='sidebar.footer.action'] {\n flex-direction: column;\n align-items: stretch;\n min-width: 0;\n max-width: 100%;\n gap: 4px;\n}\n\n#root [data-slot='sidebar'] [data-slot='sidebar.footer.action'] > * {\n box-sizing: border-box;\n flex: 0 0 auto;\n min-width: 0;\n max-width: 100%;\n}\n\n/* The footer uses a divider instead of another framed card. */\n#root [data-slot='sidebar'] > div:has(button:is([aria-label='Collapse sidebar'], [aria-label='\u6536\u8D77\u4FA7\u8FB9\u680F']))\n > :has(> div > [data-slot='sidebar.footer.action']) {\n box-sizing: border-box;\n gap: 2px;\n margin-top: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--xiaohei-sidebar-control-edge);\n}\n\n#root [data-slot='sidebar.footer.action'] > button,\n#root [data-slot='sidebar.settings'] > button {\n color: var(--dsw-alias-label-secondary);\n border-radius: var(--xiaohei-radius-small) !important;\n transition:\n color var(--xiaohei-motion-fast) ease,\n background-color var(--xiaohei-motion-fast) ease,\n transform var(--xiaohei-motion-fast) var(--xiaohei-motion-curve);\n}\n\n#root [data-slot='sidebar.footer.action'] > button:hover,\n#root [data-slot='sidebar.settings'] > button:hover,\n#root [data-slot='sidebar.footer.action'] > button[aria-expanded='true'],\n#root [data-slot='sidebar.settings'] > button[aria-expanded='true'] {\n color: var(--xiaohei-sidebar-emphasis);\n background: var(--xiaohei-sidebar-hover);\n}\n\n#root [data-slot='sidebar.footer.action'] > button:active,\n#root [data-slot='sidebar.settings'] > button:active {\n transform: translateY(1px);\n}\n\n#root [data-slot='sidebar'] button:focus-visible {\n outline: 2px solid var(--xiaohei-sidebar-emphasis);\n outline-offset: 2px;\n}\n\n@media (prefers-reduced-motion: reduce) {\n #root [data-slot='sidebar'] button {\n transition-duration: 0ms !important;\n }\n\n\n .xiaohei-brand-mark__fallback,\n .xiaohei-brand-mark__metal {\n transition-duration: 0ms !important;\n }\n}\n\n@media (prefers-reduced-transparency: reduce) {\n #dsh-theme-xiaohei\\/sidebar-glass {\n background: var(--xiaohei-sidebar-glass-solid);\n -webkit-backdrop-filter: none;\n backdrop-filter: none;\n }\n\n}\n\n@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {\n #dsh-theme-xiaohei\\/sidebar-glass {\n background: var(--xiaohei-sidebar-glass-solid);\n }\n}\n\n@media (forced-colors: active) {\n #dsh-theme-xiaohei\\/sidebar-glass {\n border-color: CanvasText;\n background: Canvas;\n box-shadow: none;\n -webkit-backdrop-filter: none;\n backdrop-filter: none;\n }\n\n #root [data-slot='sidebar'] > div:has(button:is([aria-label='Collapse sidebar'], [aria-label='\u6536\u8D77\u4FA7\u8FB9\u680F'])) > button[aria-label='\u65B0\u5EFA\u4F1A\u8BDD'],\n #root [data-slot='sidebar'] > div:has(button:is([aria-label='Collapse sidebar'], [aria-label='\u6536\u8D77\u4FA7\u8FB9\u680F'])) > button[aria-label='New session'] {\n border-color: ButtonText;\n }\n\n}\n";
3
- //# sourceMappingURL=sidebar.d.ts.map