@lemoncat7/dsh-theme-xiaohei 0.4.5 → 0.5.0

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 (230) hide show
  1. package/README.md +25 -92
  2. package/THIRD_PARTY_NOTICES.md +13 -1
  3. package/docs/dsh-021-compatibility.md +23 -0
  4. package/docs/releases/0.4.6.md +17 -0
  5. package/docs/releases/0.5.0.md +24 -0
  6. package/docs/releases/README.md +14 -0
  7. package/docs/rift-interaction.md +35 -0
  8. package/docs/rift-preview.md +39 -0
  9. package/lib/client.companion.js +99 -0
  10. package/lib/client.decorations.js +224 -51
  11. package/lib/client.js +532 -2501
  12. package/lib/index.d.ts +1 -2
  13. package/lib/index.js +393 -11
  14. package/lib/rift/boot.d.ts +6 -0
  15. package/package.json +30 -19
  16. package/lib/appearance.d.ts +0 -12
  17. package/lib/appearance.js +0 -42
  18. package/lib/blink.d.ts +0 -4
  19. package/lib/blink.js +0 -110
  20. package/lib/bloub-heixiu/ambient.d.ts +0 -3
  21. package/lib/bloub-heixiu/ambient.js +0 -12
  22. package/lib/bloub-heixiu/character.d.ts +0 -33
  23. package/lib/bloub-heixiu/character.js +0 -124
  24. package/lib/bloub-heixiu/effects.d.ts +0 -4
  25. package/lib/bloub-heixiu/effects.js +0 -91
  26. package/lib/bloub-heixiu/flight.d.ts +0 -15
  27. package/lib/bloub-heixiu/flight.js +0 -66
  28. package/lib/bloub-heixiu/follow.d.ts +0 -13
  29. package/lib/bloub-heixiu/follow.js +0 -23
  30. package/lib/bloub-heixiu/layout.d.ts +0 -18
  31. package/lib/bloub-heixiu/layout.js +0 -12
  32. package/lib/bloub-heixiu/renderer.d.ts +0 -16
  33. package/lib/bloub-heixiu/renderer.js +0 -94
  34. package/lib/bloub-heixiu/runtime.d.ts +0 -6
  35. package/lib/bloub-heixiu/runtime.js +0 -409
  36. package/lib/bloub-heixiu/signals.d.ts +0 -17
  37. package/lib/bloub-heixiu/signals.js +0 -55
  38. package/lib/bloub-heixiu/styles.d.ts +0 -2
  39. package/lib/bloub-heixiu/styles.js +0 -98
  40. package/lib/boot-appearance.d.ts +0 -10
  41. package/lib/boot-appearance.js +0 -47
  42. package/lib/boot-loader.d.ts +0 -5
  43. package/lib/boot-loader.js +0 -158
  44. package/lib/chrome/accessibility.d.ts +0 -3
  45. package/lib/chrome/accessibility.js +0 -69
  46. package/lib/chrome/blink.d.ts +0 -3
  47. package/lib/chrome/blink.js +0 -15
  48. package/lib/chrome/composer-avatar.d.ts +0 -10
  49. package/lib/chrome/composer-avatar.js +0 -599
  50. package/lib/chrome/composer-send-heixiu.d.ts +0 -3
  51. package/lib/chrome/composer-send-heixiu.js +0 -143
  52. package/lib/chrome/composer.d.ts +0 -3
  53. package/lib/chrome/composer.js +0 -135
  54. package/lib/chrome/controls.d.ts +0 -8
  55. package/lib/chrome/controls.js +0 -348
  56. package/lib/chrome/conversation-messages.d.ts +0 -3
  57. package/lib/chrome/conversation-messages.js +0 -329
  58. package/lib/chrome/conversation-submissions.d.ts +0 -3
  59. package/lib/chrome/conversation-submissions.js +0 -68
  60. package/lib/chrome/conversation.d.ts +0 -3
  61. package/lib/chrome/conversation.js +0 -67
  62. package/lib/chrome/frames.d.ts +0 -6
  63. package/lib/chrome/frames.js +0 -134
  64. package/lib/chrome/gaze.d.ts +0 -3
  65. package/lib/chrome/gaze.js +0 -103
  66. package/lib/chrome/identity.d.ts +0 -6
  67. package/lib/chrome/identity.js +0 -47
  68. package/lib/chrome/overlays.d.ts +0 -3
  69. package/lib/chrome/overlays.js +0 -104
  70. package/lib/chrome/portal.d.ts +0 -6
  71. package/lib/chrome/portal.js +0 -169
  72. package/lib/chrome/reactions.d.ts +0 -3
  73. package/lib/chrome/reactions.js +0 -85
  74. package/lib/chrome/sidebar.d.ts +0 -3
  75. package/lib/chrome/sidebar.js +0 -313
  76. package/lib/chrome/tokens.d.ts +0 -3
  77. package/lib/chrome/tokens.js +0 -224
  78. package/lib/chrome/workspace.d.ts +0 -3
  79. package/lib/chrome/workspace.js +0 -94
  80. package/lib/chrome.d.ts +0 -10
  81. package/lib/chrome.js +0 -46
  82. package/lib/client-entry.d.ts +0 -3
  83. package/lib/client-entry.js +0 -3
  84. package/lib/client.d.ts +0 -10
  85. package/lib/client.pose-chin-dark.js +0 -4
  86. package/lib/client.pose-chin-light.js +0 -4
  87. package/lib/client.pose-doze-dark.js +0 -4
  88. package/lib/client.pose-doze-light.js +0 -4
  89. package/lib/client.pose-halfpeek-dark.js +0 -4
  90. package/lib/client.pose-halfpeek-light.js +0 -4
  91. package/lib/client.pose-peek-dark.js +0 -4
  92. package/lib/client.pose-peek-light.js +0 -4
  93. package/lib/client.pose-seated-dark.js +0 -4
  94. package/lib/client.pose-seated-light.js +0 -4
  95. package/lib/client.rig-chin-dark.js +0 -4
  96. package/lib/client.rig-chin-light.js +0 -4
  97. package/lib/client.rig-halfpeek-dark.js +0 -4
  98. package/lib/client.rig-halfpeek-light.js +0 -4
  99. package/lib/client.rig-peek-dark.js +0 -4
  100. package/lib/client.rig-peek-light.js +0 -4
  101. package/lib/client.rig-seated-dark.js +0 -4
  102. package/lib/client.rig-seated-light.js +0 -4
  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-decorations.d.ts +0 -3
  114. package/lib/deferred-decorations.js +0 -51
  115. package/lib/gaze.d.ts +0 -4
  116. package/lib/gaze.js +0 -230
  117. package/lib/generated-backgrounds.d.ts +0 -14
  118. package/lib/generated-backgrounds.js +0 -14
  119. package/lib/generated-character-motion.d.ts +0 -4
  120. package/lib/generated-character-motion.js +0 -2
  121. package/lib/generated-identity.d.ts +0 -6
  122. package/lib/generated-identity.js +0 -6
  123. package/lib/generated-keyart.d.ts +0 -34
  124. package/lib/generated-keyart.js +0 -34
  125. package/lib/generated-loading-assets.d.ts +0 -4
  126. package/lib/generated-loading-assets.js +0 -4
  127. package/lib/heixiu-interactions.d.ts +0 -10
  128. package/lib/heixiu-interactions.js +0 -161
  129. package/lib/host-contract.d.ts +0 -9
  130. package/lib/host-contract.js +0 -13
  131. package/lib/host-dom.d.ts +0 -11
  132. package/lib/host-dom.js +0 -68
  133. package/lib/loading-heixiu.d.ts +0 -8
  134. package/lib/loading-heixiu.js +0 -287
  135. package/lib/metallic-brand-mark.d.ts +0 -10
  136. package/lib/metallic-brand-mark.js +0 -296
  137. package/lib/plugin.d.ts +0 -6
  138. package/lib/plugin.js +0 -60
  139. package/lib/portal.d.ts +0 -40
  140. package/lib/portal.js +0 -225
  141. package/lib/reactions.d.ts +0 -20
  142. package/lib/reactions.js +0 -380
  143. package/lib/scene/avatar-model.d.ts +0 -6
  144. package/lib/scene/avatar-model.js +0 -646
  145. package/lib/scene/avatar-motion.d.ts +0 -3
  146. package/lib/scene/avatar-motion.js +0 -799
  147. package/lib/scene/character-assets.d.ts +0 -13
  148. package/lib/scene/character-assets.js +0 -26
  149. package/lib/scene/character-expression.d.ts +0 -4
  150. package/lib/scene/character-expression.js +0 -15
  151. package/lib/scene/character-eye-material.d.ts +0 -13
  152. package/lib/scene/character-eye-material.js +0 -88
  153. package/lib/scene/character-eye-renderer.d.ts +0 -5
  154. package/lib/scene/character-eye-renderer.js +0 -80
  155. package/lib/scene/character-eye-rig.d.ts +0 -20
  156. package/lib/scene/character-eye-rig.js +0 -35
  157. package/lib/scene/character-gaze.d.ts +0 -16
  158. package/lib/scene/character-gaze.js +0 -36
  159. package/lib/scene/character-idle.d.ts +0 -17
  160. package/lib/scene/character-idle.js +0 -65
  161. package/lib/scene/character-layout.d.ts +0 -24
  162. package/lib/scene/character-layout.js +0 -51
  163. package/lib/scene/character-motion-clock.d.ts +0 -18
  164. package/lib/scene/character-motion-clock.js +0 -70
  165. package/lib/scene/character-motion-types.d.ts +0 -12
  166. package/lib/scene/character-motion-types.js +0 -2
  167. package/lib/scene/character-motion.d.ts +0 -6
  168. package/lib/scene/character-motion.js +0 -187
  169. package/lib/scene/character-poses.d.ts +0 -26
  170. package/lib/scene/character-poses.js +0 -11
  171. package/lib/scene/character-rig-renderer.d.ts +0 -5
  172. package/lib/scene/character-rig-renderer.js +0 -95
  173. package/lib/scene/character-rig.d.ts +0 -22
  174. package/lib/scene/character-rig.js +0 -61
  175. package/lib/scene/heixiu-feedback.d.ts +0 -3
  176. package/lib/scene/heixiu-feedback.js +0 -64
  177. package/lib/scene/heixiu-interactions.d.ts +0 -3
  178. package/lib/scene/heixiu-interactions.js +0 -92
  179. package/lib/scene/ids.d.ts +0 -5
  180. package/lib/scene/ids.js +0 -5
  181. package/lib/scene/pointer-bridge.d.ts +0 -21
  182. package/lib/scene/pointer-bridge.js +0 -155
  183. package/lib/scene/runtime.d.ts +0 -12
  184. package/lib/scene/runtime.js +0 -74
  185. package/lib/scene/state-transitions.d.ts +0 -3
  186. package/lib/scene/state-transitions.js +0 -37
  187. package/lib/scene/styles.d.ts +0 -5
  188. package/lib/scene/styles.js +0 -69
  189. package/lib/scene/sylva-performance.d.ts +0 -11
  190. package/lib/scene/sylva-performance.js +0 -58
  191. package/lib/scene/wallpaper-character-styles.d.ts +0 -3
  192. package/lib/scene/wallpaper-character-styles.js +0 -49
  193. package/lib/scene/wallpaper-character.d.ts +0 -5
  194. package/lib/scene/wallpaper-character.js +0 -222
  195. package/lib/scene.d.ts +0 -8
  196. package/lib/scene.js +0 -8
  197. package/lib/sidebar-glass.d.ts +0 -16
  198. package/lib/sidebar-glass.js +0 -168
  199. package/lib/sidebar-heixiu-escape.d.ts +0 -44
  200. package/lib/sidebar-heixiu-escape.js +0 -340
  201. package/lib/sidebar-heixiu-roaming.d.ts +0 -27
  202. package/lib/sidebar-heixiu-roaming.js +0 -310
  203. package/lib/sidebar-reveal.d.ts +0 -8
  204. package/lib/sidebar-reveal.js +0 -59
  205. package/lib/state.d.ts +0 -21
  206. package/lib/state.js +0 -123
  207. package/lib/theme.d.ts +0 -19
  208. package/lib/theme.js +0 -188
  209. package/lib/vendor/bloub/decor.d.ts +0 -114
  210. package/lib/vendor/bloub/decor.js +0 -198
  211. package/lib/vendor/bloub/engine.d.ts +0 -213
  212. package/lib/vendor/bloub/engine.js +0 -452
  213. package/lib/vendor/bloub/expressions.d.ts +0 -35
  214. package/lib/vendor/bloub/expressions.js +0 -143
  215. package/lib/vendor/bloub/eyefit.d.ts +0 -75
  216. package/lib/vendor/bloub/eyefit.js +0 -393
  217. package/lib/vendor/bloub/face.d.ts +0 -63
  218. package/lib/vendor/bloub/face.js +0 -106
  219. package/lib/vendor/bloub/math.d.ts +0 -22
  220. package/lib/vendor/bloub/math.js +0 -36
  221. package/lib/vendor/bloub/profiles.d.ts +0 -8
  222. package/lib/vendor/bloub/profiles.js +0 -20
  223. package/lib/vendor/bloub/repere.d.ts +0 -30
  224. package/lib/vendor/bloub/repere.js +0 -32
  225. package/lib/vendor/bloub/shape.d.ts +0 -80
  226. package/lib/vendor/bloub/shape.js +0 -268
  227. package/lib/vendor/bloub/skins.d.ts +0 -36
  228. package/lib/vendor/bloub/skins.js +0 -74
  229. package/lib/vendor/bloub/states.d.ts +0 -87
  230. 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