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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +84 -0
  3. package/cordis.patch.yml +4 -0
  4. package/lib/appearance.d.ts +12 -0
  5. package/lib/appearance.d.ts.map +1 -0
  6. package/lib/appearance.js +26 -0
  7. package/lib/appearance.js.map +1 -0
  8. package/lib/blink.d.ts +4 -0
  9. package/lib/blink.d.ts.map +1 -0
  10. package/lib/blink.js +110 -0
  11. package/lib/blink.js.map +1 -0
  12. package/lib/boot-appearance.d.ts +10 -0
  13. package/lib/boot-appearance.d.ts.map +1 -0
  14. package/lib/boot-appearance.js +47 -0
  15. package/lib/boot-appearance.js.map +1 -0
  16. package/lib/boot-loader.d.ts +5 -0
  17. package/lib/boot-loader.d.ts.map +1 -0
  18. package/lib/boot-loader.js +158 -0
  19. package/lib/boot-loader.js.map +1 -0
  20. package/lib/chrome/accessibility.d.ts +3 -0
  21. package/lib/chrome/accessibility.d.ts.map +1 -0
  22. package/lib/chrome/accessibility.js +77 -0
  23. package/lib/chrome/accessibility.js.map +1 -0
  24. package/lib/chrome/blink.d.ts +3 -0
  25. package/lib/chrome/blink.d.ts.map +1 -0
  26. package/lib/chrome/blink.js +15 -0
  27. package/lib/chrome/blink.js.map +1 -0
  28. package/lib/chrome/composer.d.ts +3 -0
  29. package/lib/chrome/composer.d.ts.map +1 -0
  30. package/lib/chrome/composer.js +146 -0
  31. package/lib/chrome/composer.js.map +1 -0
  32. package/lib/chrome/conversation-messages.d.ts +3 -0
  33. package/lib/chrome/conversation-messages.d.ts.map +1 -0
  34. package/lib/chrome/conversation-messages.js +96 -0
  35. package/lib/chrome/conversation-messages.js.map +1 -0
  36. package/lib/chrome/conversation.d.ts +3 -0
  37. package/lib/chrome/conversation.d.ts.map +1 -0
  38. package/lib/chrome/conversation.js +61 -0
  39. package/lib/chrome/conversation.js.map +1 -0
  40. package/lib/chrome/frames.d.ts +6 -0
  41. package/lib/chrome/frames.d.ts.map +1 -0
  42. package/lib/chrome/frames.js +120 -0
  43. package/lib/chrome/frames.js.map +1 -0
  44. package/lib/chrome/gaze.d.ts +3 -0
  45. package/lib/chrome/gaze.d.ts.map +1 -0
  46. package/lib/chrome/gaze.js +103 -0
  47. package/lib/chrome/gaze.js.map +1 -0
  48. package/lib/chrome/identity.d.ts +6 -0
  49. package/lib/chrome/identity.d.ts.map +1 -0
  50. package/lib/chrome/identity.js +61 -0
  51. package/lib/chrome/identity.js.map +1 -0
  52. package/lib/chrome/overlays.d.ts +3 -0
  53. package/lib/chrome/overlays.d.ts.map +1 -0
  54. package/lib/chrome/overlays.js +104 -0
  55. package/lib/chrome/overlays.js.map +1 -0
  56. package/lib/chrome/portal.d.ts +6 -0
  57. package/lib/chrome/portal.d.ts.map +1 -0
  58. package/lib/chrome/portal.js +169 -0
  59. package/lib/chrome/portal.js.map +1 -0
  60. package/lib/chrome/reactions.d.ts +3 -0
  61. package/lib/chrome/reactions.d.ts.map +1 -0
  62. package/lib/chrome/reactions.js +85 -0
  63. package/lib/chrome/reactions.js.map +1 -0
  64. package/lib/chrome/sidebar.d.ts +3 -0
  65. package/lib/chrome/sidebar.d.ts.map +1 -0
  66. package/lib/chrome/sidebar.js +305 -0
  67. package/lib/chrome/sidebar.js.map +1 -0
  68. package/lib/chrome/tokens.d.ts +3 -0
  69. package/lib/chrome/tokens.d.ts.map +1 -0
  70. package/lib/chrome/tokens.js +171 -0
  71. package/lib/chrome/tokens.js.map +1 -0
  72. package/lib/chrome/workspace.d.ts +3 -0
  73. package/lib/chrome/workspace.d.ts.map +1 -0
  74. package/lib/chrome/workspace.js +313 -0
  75. package/lib/chrome/workspace.js.map +1 -0
  76. package/lib/chrome.d.ts +10 -0
  77. package/lib/chrome.d.ts.map +1 -0
  78. package/lib/chrome.js +40 -0
  79. package/lib/chrome.js.map +1 -0
  80. package/lib/client.d.ts +17 -0
  81. package/lib/client.d.ts.map +1 -0
  82. package/lib/client.js +5505 -0
  83. package/lib/client.js.map +7 -0
  84. package/lib/gaze.d.ts +4 -0
  85. package/lib/gaze.d.ts.map +1 -0
  86. package/lib/gaze.js +217 -0
  87. package/lib/gaze.js.map +1 -0
  88. package/lib/generated-identity.d.ts +5 -0
  89. package/lib/generated-identity.d.ts.map +1 -0
  90. package/lib/generated-identity.js +5 -0
  91. package/lib/generated-identity.js.map +1 -0
  92. package/lib/generated-keyart.d.ts +19 -0
  93. package/lib/generated-keyart.d.ts.map +1 -0
  94. package/lib/generated-keyart.js +19 -0
  95. package/lib/generated-keyart.js.map +1 -0
  96. package/lib/generated-loading-assets.d.ts +4 -0
  97. package/lib/generated-loading-assets.d.ts.map +1 -0
  98. package/lib/generated-loading-assets.js +4 -0
  99. package/lib/generated-loading-assets.js.map +1 -0
  100. package/lib/generated-sidebar-assets.d.ts +4 -0
  101. package/lib/generated-sidebar-assets.d.ts.map +1 -0
  102. package/lib/generated-sidebar-assets.js +4 -0
  103. package/lib/generated-sidebar-assets.js.map +1 -0
  104. package/lib/heixiu-interactions.d.ts +10 -0
  105. package/lib/heixiu-interactions.d.ts.map +1 -0
  106. package/lib/heixiu-interactions.js +161 -0
  107. package/lib/heixiu-interactions.js.map +1 -0
  108. package/lib/index.d.ts +8 -0
  109. package/lib/index.d.ts.map +1 -0
  110. package/lib/index.js +11 -0
  111. package/lib/index.js.map +1 -0
  112. package/lib/loading-heixiu.d.ts +8 -0
  113. package/lib/loading-heixiu.d.ts.map +1 -0
  114. package/lib/loading-heixiu.js +287 -0
  115. package/lib/loading-heixiu.js.map +1 -0
  116. package/lib/plugin.d.ts +6 -0
  117. package/lib/plugin.d.ts.map +1 -0
  118. package/lib/plugin.js +38 -0
  119. package/lib/plugin.js.map +1 -0
  120. package/lib/portal.d.ts +40 -0
  121. package/lib/portal.d.ts.map +1 -0
  122. package/lib/portal.js +224 -0
  123. package/lib/portal.js.map +1 -0
  124. package/lib/reactions.d.ts +20 -0
  125. package/lib/reactions.d.ts.map +1 -0
  126. package/lib/reactions.js +380 -0
  127. package/lib/reactions.js.map +1 -0
  128. package/lib/scene/heixiu-feedback.d.ts +3 -0
  129. package/lib/scene/heixiu-feedback.d.ts.map +1 -0
  130. package/lib/scene/heixiu-feedback.js +81 -0
  131. package/lib/scene/heixiu-feedback.js.map +1 -0
  132. package/lib/scene/heixiu-interactions.d.ts +3 -0
  133. package/lib/scene/heixiu-interactions.d.ts.map +1 -0
  134. package/lib/scene/heixiu-interactions.js +92 -0
  135. package/lib/scene/heixiu-interactions.js.map +1 -0
  136. package/lib/scene/state-transitions.d.ts +3 -0
  137. package/lib/scene/state-transitions.d.ts.map +1 -0
  138. package/lib/scene/state-transitions.js +37 -0
  139. package/lib/scene/state-transitions.js.map +1 -0
  140. package/lib/scene.d.ts +14 -0
  141. package/lib/scene.d.ts.map +1 -0
  142. package/lib/scene.js +1024 -0
  143. package/lib/scene.js.map +1 -0
  144. package/lib/sidebar-glass.d.ts +16 -0
  145. package/lib/sidebar-glass.d.ts.map +1 -0
  146. package/lib/sidebar-glass.js +105 -0
  147. package/lib/sidebar-glass.js.map +1 -0
  148. package/lib/sidebar-heixiu-escape.d.ts +44 -0
  149. package/lib/sidebar-heixiu-escape.d.ts.map +1 -0
  150. package/lib/sidebar-heixiu-escape.js +340 -0
  151. package/lib/sidebar-heixiu-escape.js.map +1 -0
  152. package/lib/sidebar-heixiu-roaming.d.ts +27 -0
  153. package/lib/sidebar-heixiu-roaming.d.ts.map +1 -0
  154. package/lib/sidebar-heixiu-roaming.js +310 -0
  155. package/lib/sidebar-heixiu-roaming.js.map +1 -0
  156. package/lib/state.d.ts +9 -0
  157. package/lib/state.d.ts.map +1 -0
  158. package/lib/state.js +114 -0
  159. package/lib/state.js.map +1 -0
  160. package/lib/theme.d.ts +19 -0
  161. package/lib/theme.d.ts.map +1 -0
  162. package/lib/theme.js +188 -0
  163. package/lib/theme.js.map +1 -0
  164. package/package.json +74 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 lemoncat7
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,84 @@
1
+ # Xiaohei Night for DSH
2
+
3
+ `Xiaohei Night` 是一个基于 DeepSeek Harness 官方主题注册接口开发的非官方粉丝主题插件。主题使用成对的二维动画背景建立人类城市与妖灵森林共存的场景,并以炭黑、雾灰、林地绿和青色妖灵力统一 DSH 的工作界面。
4
+
5
+ ## 当前范围
6
+
7
+ - 保留 DSH 原有布局、密度和交互层级。
8
+ - 使用半透明墨黑表面,让背景可见但不压过对话内容。
9
+ - 使用青绿色作为唯一交互强调色,错误、成功、警告保留独立语义色。
10
+ - 背景与角色是独立位图图层,角色不使用 CSS 符号或几何块拼接。
11
+ - 角色没有常驻漂浮、缩放或抖动;待机时使用对齐精灵帧完成自然眨眼和稀疏微反应。
12
+ - 鼠标或嘿咻进入局部注视范围后,小黑会先注视再按方向轻动一次耳朵;纯待机 12–24 秒自然摆尾一次,回答完成后快速摆尾一次。
13
+ - 使用 DSH 官方会话快照呈现七种状态:待机、聚能思考、流式回答、工具执行、等待用户、完成庆祝与错误提示。
14
+ - 状态只跟随当前打开的会话;后台运行中的其他会话不会抢占角色,切换会话也不会误触发完成庆祝。
15
+ - 所有角色位图随插件内联并预载,运行时只切换状态与完整帧精灵表,不发起图片请求;非待机状态始终优先于待机微反应。
16
+ - 聚能、回答、工具、等待、完成和错误分别使用轻量局部光效,离开对应状态后动画立即停止。
17
+ - 深浅模式使用同一林城交界构图的昼夜背景:远处城市、古树会馆、小型空间门和沿树根流动的妖灵力共用一套位置,不在小黑脚下叠加底圈或常驻漩涡动效。
18
+ - 左侧栏直接共享全局水墨灵域,仅使用向主场景渐隐的半透明同色材质组织品牌区、主操作、工作区与底部工具,并以潦草竖写的生图“罗小黑”签名占据纵向留白,不新增无功能入口。
19
+ - 工作区、工具区和会话输入区不使用额外铭牌,分别以猫尾灵珠、空间裂环、蓝嘴黑猫牌作为轻量识别点;工作区右侧额外内收,收起后所有工具回到同一条 35px 视觉轴。
20
+ - 支持减少动态、增强对比度、强制颜色和打印模式降级。
21
+ - 插件加载后自动启用 `xiaohei-night`,卸载后由 DSH 主题服务恢复系统主题。
22
+
23
+ 状态优先级为:错误 → 等待用户 → 工具执行 → 流式回答 → 聚能思考 → 完成 → 待机。完成态仅在同一个当前会话结束后显示约 1.6 秒。
24
+
25
+ ## 安装
26
+
27
+ 从 [GitHub Releases](https://github.com/lemoncat7/dsh-theme-xiaohei/releases) 下载 `0.3.0-alpha.15` 的完整构建包后安装:
28
+
29
+ ```bash
30
+ dsh plugin --profile web add ./lemoncat7-dsh-theme-xiaohei-0.3.0-alpha.15.tgz
31
+ ```
32
+
33
+ 卸载:
34
+
35
+ ```bash
36
+ dsh plugin --profile web remove @lemoncat7/dsh-theme-xiaohei
37
+ ```
38
+
39
+ ## 开发与验证
40
+
41
+ 需要 Node.js 22.19+ 或 24+:
42
+
43
+ ```bash
44
+ npm install
45
+ npm test
46
+ npm run pack:check
47
+ ```
48
+
49
+ 使用 Docker 24 构建可安装包:
50
+
51
+ ```bash
52
+ npm run pack:docker
53
+ ```
54
+
55
+ ## 扩展工具接入主题
56
+
57
+ SSH、伙伴、Git 等后续工具不需要复制主题 CSS。插件根节点使用公开的框架属性即可继承小黑主题:
58
+
59
+ ```html
60
+ <section
61
+ data-xiaohei-frame="module"
62
+ data-xiaohei-frame-ornament="spirit-knot"
63
+ data-xiaohei-module-kind="ssh"
64
+ >
65
+ <header data-xiaohei-frame-header>
66
+ <strong>远程主机</strong>
67
+ <div data-xiaohei-frame-actions><!-- 工具按钮 --></div>
68
+ </header>
69
+ <!-- 模块内容 -->
70
+ </section>
71
+ ```
72
+
73
+ - `data-xiaohei-frame="module"`:完整区域框裱;紧凑控件可使用 `compact`。
74
+ - `data-xiaohei-frame-ornament="spirit-knot"`:兼容既有扩展的猫尾灵珠挂饰入口;挂饰固定在框角,悬停时提供轻微转动反馈。
75
+ - `data-xiaohei-module-kind`:保留模块身份,方便主题以后为 SSH、伙伴、Git 等提供差异化细节。
76
+ - `data-xiaohei-frame-header` 与 `data-xiaohei-frame-actions`:统一标题栏和操作区对齐。
77
+
78
+ ## 视觉资产
79
+
80
+ 主题主视觉使用 `gpt-image-2` 通过标准 Images API 生成,并压缩为 WebP 后以内联资源打入浏览器插件。深浅两张背景共享连续的水墨山林构图:左侧和中央保持低对比度以承载导航与对话,青色灵流贯穿墨域,右下角以较亮雾池和冷色背光托起独立角色图层;背景本身不含人物、动物、文字或水印。待机耳朵和尾巴动作从正式待机帧通过平滑局部形变离线生成,每一格都是完整角色画面,运行时不切割耳朵或尾巴。
81
+
82
+ ## License
83
+
84
+ 代码使用 MIT License。角色及相关作品权利归原权利方所有,本项目与官方无关。
@@ -0,0 +1,4 @@
1
+ # The Host row exists so DSH discovers and loads this package's browser half.
2
+ - insert:
3
+ - id: xiaohei-theme
4
+ name: '@lemoncat7/dsh-theme-xiaohei'
@@ -0,0 +1,12 @@
1
+ import type { ThemeSnapshot } from '@deepseek-ai/dsh-client-ui-theme/client';
2
+ export declare const XIAOHEI_APPEARANCE_ATTRIBUTE = "data-xiaohei-appearance";
3
+ interface XiaoheiAppearanceContext {
4
+ theme: {
5
+ getTheme(): ThemeSnapshot;
6
+ };
7
+ on(event: 'theme/change', listener: (snapshot: ThemeSnapshot) => void): () => void;
8
+ }
9
+ /** Mirror DSH's resolved Light / Dark / System appearance onto the scene. */
10
+ export declare function bindXiaoheiAppearance(ctx: XiaoheiAppearanceContext, doc?: Document | undefined): () => void;
11
+ export {};
12
+ //# sourceMappingURL=appearance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appearance.d.ts","sourceRoot":"","sources":["../src/appearance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAA;AAM5E,eAAO,MAAM,4BAA4B,4BAA4B,CAAA;AAErE,UAAU,wBAAwB;IAChC,KAAK,EAAE;QACL,QAAQ,IAAI,aAAa,CAAA;KAC1B,CAAA;IACD,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;CACnF;AAED,6EAA6E;AAC7E,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,wBAAwB,EAC7B,GAAG,GAAE,QAAQ,GAAG,SAAkE,GACjF,MAAM,IAAI,CAoBZ"}
@@ -0,0 +1,26 @@
1
+ import { releaseXiaoheiBootAppearance, XIAOHEI_BOOT_APPEARANCE_ATTRIBUTE, } from './boot-appearance.js';
2
+ export const XIAOHEI_APPEARANCE_ATTRIBUTE = 'data-xiaohei-appearance';
3
+ /** Mirror DSH's resolved Light / Dark / System appearance onto the scene. */
4
+ export function bindXiaoheiAppearance(ctx, doc = typeof document === 'undefined' ? undefined : document) {
5
+ if (doc === undefined)
6
+ return () => { };
7
+ const sync = (snapshot) => {
8
+ const bootAppearance = doc.documentElement.getAttribute(XIAOHEI_BOOT_APPEARANCE_ATTRIBUTE);
9
+ if (bootAppearance === 'light' || bootAppearance === 'dark') {
10
+ doc.documentElement.setAttribute(XIAOHEI_APPEARANCE_ATTRIBUTE, bootAppearance);
11
+ if (snapshot.active.colorScheme !== bootAppearance)
12
+ return;
13
+ }
14
+ else {
15
+ doc.documentElement.setAttribute(XIAOHEI_APPEARANCE_ATTRIBUTE, snapshot.active.colorScheme);
16
+ }
17
+ releaseXiaoheiBootAppearance(doc);
18
+ };
19
+ const off = ctx.on('theme/change', sync);
20
+ sync(ctx.theme.getTheme());
21
+ return () => {
22
+ off();
23
+ doc.documentElement.removeAttribute(XIAOHEI_APPEARANCE_ATTRIBUTE);
24
+ };
25
+ }
26
+ //# sourceMappingURL=appearance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appearance.js","sourceRoot":"","sources":["../src/appearance.ts"],"names":[],"mappings":"AACA,OAAO,EACL,4BAA4B,EAC5B,iCAAiC,GAClC,MAAM,sBAAsB,CAAA;AAE7B,MAAM,CAAC,MAAM,4BAA4B,GAAG,yBAAyB,CAAA;AASrE,6EAA6E;AAC7E,MAAM,UAAU,qBAAqB,CACnC,GAA6B,EAC7B,MAA4B,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;IAElF,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAA;IAEtC,MAAM,IAAI,GAAG,CAAC,QAAuB,EAAQ,EAAE;QAC7C,MAAM,cAAc,GAAG,GAAG,CAAC,eAAe,CAAC,YAAY,CAAC,iCAAiC,CAAC,CAAA;QAC1F,IAAI,cAAc,KAAK,OAAO,IAAI,cAAc,KAAK,MAAM,EAAE,CAAC;YAC5D,GAAG,CAAC,eAAe,CAAC,YAAY,CAAC,4BAA4B,EAAE,cAAc,CAAC,CAAA;YAC9E,IAAI,QAAQ,CAAC,MAAM,CAAC,WAAW,KAAK,cAAc;gBAAE,OAAM;QAC5D,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,eAAe,CAAC,YAAY,CAAC,4BAA4B,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;QAC7F,CAAC;QACD,4BAA4B,CAAC,GAAG,CAAC,CAAA;IACnC,CAAC,CAAA;IACD,MAAM,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;IACxC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;IAE1B,OAAO,GAAG,EAAE;QACV,GAAG,EAAE,CAAA;QACL,GAAG,CAAC,eAAe,CAAC,eAAe,CAAC,4BAA4B,CAAC,CAAA;IACnE,CAAC,CAAA;AACH,CAAC"}
package/lib/blink.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export declare const XIAOHEI_BLINK_STYLE_ID = "dsh-theme-xiaohei/blink-style";
2
+ /** Own every blink from one DOM state so pupils and the closed frame change atomically. */
3
+ export declare function installXiaoheiBlink(doc?: Document | undefined): () => void;
4
+ //# sourceMappingURL=blink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blink.d.ts","sourceRoot":"","sources":["../src/blink.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,sBAAsB,kCAAkC,CAAA;AAkBrE,2FAA2F;AAC3F,wBAAgB,mBAAmB,CACjC,GAAG,GAAE,QAAQ,GAAG,SAAkE,GACjF,MAAM,IAAI,CAoGZ"}
package/lib/blink.js ADDED
@@ -0,0 +1,110 @@
1
+ import { XIAOHEI_BLINK_CSS } from './chrome/blink.js';
2
+ import { XIAOHEI_HEIXIU_GREETING_EVENT } from './heixiu-interactions.js';
3
+ export const XIAOHEI_BLINK_STYLE_ID = 'dsh-theme-xiaohei/blink-style';
4
+ const INITIAL_BLINK_DELAY_MS = 4780;
5
+ const IDLE_BLINK_INTERVAL_MS = 5065;
6
+ const IDLE_BLINK_CLOSED_MS = 135;
7
+ const HEIXIU_GREETING_BLINK_STEPS = [
8
+ { at: 78, closed: true },
9
+ { at: 224, closed: false },
10
+ { at: 348, closed: true },
11
+ { at: 447, closed: false },
12
+ ];
13
+ /** Own every blink from one DOM state so pupils and the closed frame change atomically. */
14
+ export function installXiaoheiBlink(doc = typeof document === 'undefined' ? undefined : document) {
15
+ if (doc?.body === undefined || doc.defaultView === null)
16
+ return () => { };
17
+ const win = doc.defaultView;
18
+ doc.getElementById(XIAOHEI_BLINK_STYLE_ID)?.remove();
19
+ const style = doc.createElement('style');
20
+ style.id = XIAOHEI_BLINK_STYLE_ID;
21
+ style.textContent = XIAOHEI_BLINK_CSS;
22
+ doc.head.append(style);
23
+ const reducedMotion = win.matchMedia('(prefers-reduced-motion: reduce)');
24
+ const timers = new Set();
25
+ let disposed = false;
26
+ let mascot;
27
+ const isIdle = () => (doc.documentElement.getAttribute('data-xiaohei-state') ?? 'idle') === 'idle' && doc.visibilityState !== 'hidden' && !reducedMotion.matches;
28
+ const setClosed = (closed) => {
29
+ if (closed)
30
+ mascot?.setAttribute('data-xiaohei-blink', 'closed');
31
+ else
32
+ mascot?.removeAttribute('data-xiaohei-blink');
33
+ };
34
+ const clearTimers = () => {
35
+ for (const timer of timers)
36
+ win.clearTimeout(timer);
37
+ timers.clear();
38
+ };
39
+ const queue = (delay, callback) => {
40
+ const timer = win.setTimeout(() => {
41
+ timers.delete(timer);
42
+ if (!disposed)
43
+ callback();
44
+ }, delay);
45
+ timers.add(timer);
46
+ };
47
+ const scheduleIdleBlink = (initial = false) => {
48
+ if (!isIdle() || mascot === undefined)
49
+ return;
50
+ queue(initial ? INITIAL_BLINK_DELAY_MS : IDLE_BLINK_INTERVAL_MS, () => {
51
+ if (!isIdle())
52
+ return;
53
+ setClosed(true);
54
+ queue(IDLE_BLINK_CLOSED_MS, () => {
55
+ setClosed(false);
56
+ scheduleIdleBlink();
57
+ });
58
+ });
59
+ };
60
+ const restartIdleBlink = (initial = false) => {
61
+ clearTimers();
62
+ setClosed(false);
63
+ scheduleIdleBlink(initial);
64
+ };
65
+ const attach = () => {
66
+ const nextMascot = doc.querySelector('.xiaohei-scene__mascot') ?? undefined;
67
+ if (nextMascot === mascot)
68
+ return;
69
+ mascot?.removeAttribute('data-xiaohei-blink');
70
+ mascot = nextMascot;
71
+ restartIdleBlink(true);
72
+ };
73
+ const onHeixiuGreeting = () => {
74
+ if (!isIdle() || mascot === undefined)
75
+ return;
76
+ clearTimers();
77
+ setClosed(false);
78
+ for (const step of HEIXIU_GREETING_BLINK_STEPS) {
79
+ queue(step.at, () => setClosed(step.closed));
80
+ }
81
+ queue(520, () => {
82
+ setClosed(false);
83
+ scheduleIdleBlink();
84
+ });
85
+ };
86
+ const onEnvironmentChange = () => restartIdleBlink();
87
+ const mountObserver = new win.MutationObserver(attach);
88
+ mountObserver.observe(doc.body, { childList: true, subtree: true });
89
+ const stateObserver = new win.MutationObserver(onEnvironmentChange);
90
+ stateObserver.observe(doc.documentElement, {
91
+ attributes: true,
92
+ attributeFilter: ['data-xiaohei-state'],
93
+ });
94
+ doc.addEventListener('visibilitychange', onEnvironmentChange);
95
+ doc.addEventListener(XIAOHEI_HEIXIU_GREETING_EVENT, onHeixiuGreeting);
96
+ reducedMotion.addEventListener('change', onEnvironmentChange);
97
+ attach();
98
+ return () => {
99
+ disposed = true;
100
+ clearTimers();
101
+ mountObserver.disconnect();
102
+ stateObserver.disconnect();
103
+ doc.removeEventListener('visibilitychange', onEnvironmentChange);
104
+ doc.removeEventListener(XIAOHEI_HEIXIU_GREETING_EVENT, onHeixiuGreeting);
105
+ reducedMotion.removeEventListener('change', onEnvironmentChange);
106
+ mascot?.removeAttribute('data-xiaohei-blink');
107
+ style.remove();
108
+ };
109
+ }
110
+ //# sourceMappingURL=blink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blink.js","sourceRoot":"","sources":["../src/blink.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAA;AAExE,MAAM,CAAC,MAAM,sBAAsB,GAAG,+BAA+B,CAAA;AAErE,MAAM,sBAAsB,GAAG,IAAI,CAAA;AACnC,MAAM,sBAAsB,GAAG,IAAI,CAAA;AACnC,MAAM,oBAAoB,GAAG,GAAG,CAAA;AAOhC,MAAM,2BAA2B,GAAyB;IACxD,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;IACxB,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE;IAC1B,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IACzB,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE;CAC3B,CAAA;AAED,2FAA2F;AAC3F,MAAM,UAAU,mBAAmB,CACjC,MAA4B,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;IAElF,IAAI,GAAG,EAAE,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,WAAW,KAAK,IAAI;QAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAA;IAExE,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,CAAA;IAC3B,GAAG,CAAC,cAAc,CAAC,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAA;IACpD,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;IACxC,KAAK,CAAC,EAAE,GAAG,sBAAsB,CAAA;IACjC,KAAK,CAAC,WAAW,GAAG,iBAAiB,CAAA;IACrC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAEtB,MAAM,aAAa,GAAG,GAAG,CAAC,UAAU,CAAC,kCAAkC,CAAC,CAAA;IACxE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAA;IAChC,IAAI,QAAQ,GAAG,KAAK,CAAA;IACpB,IAAI,MAA+B,CAAA;IAEnC,MAAM,MAAM,GAAG,GAAY,EAAE,CAAC,CAC5B,GAAG,CAAC,eAAe,CAAC,YAAY,CAAC,oBAAoB,CAAC,IAAI,MAAM,CACjE,KAAK,MAAM,IAAI,GAAG,CAAC,eAAe,KAAK,QAAQ,IAAI,CAAC,aAAa,CAAC,OAAO,CAAA;IAE1E,MAAM,SAAS,GAAG,CAAC,MAAe,EAAQ,EAAE;QAC1C,IAAI,MAAM;YAAE,MAAM,EAAE,YAAY,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAA;;YAC3D,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAA;IACpD,CAAC,CAAA;IAED,MAAM,WAAW,GAAG,GAAS,EAAE;QAC7B,KAAK,MAAM,KAAK,IAAI,MAAM;YAAE,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;QACnD,MAAM,CAAC,KAAK,EAAE,CAAA;IAChB,CAAC,CAAA;IAED,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,QAAoB,EAAQ,EAAE;QAC1D,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE;YAChC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACpB,IAAI,CAAC,QAAQ;gBAAE,QAAQ,EAAE,CAAA;QAC3B,CAAC,EAAE,KAAK,CAAC,CAAA;QACT,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACnB,CAAC,CAAA;IAED,MAAM,iBAAiB,GAAG,CAAC,OAAO,GAAG,KAAK,EAAQ,EAAE;QAClD,IAAI,CAAC,MAAM,EAAE,IAAI,MAAM,KAAK,SAAS;YAAE,OAAM;QAC7C,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,sBAAsB,EAAE,GAAG,EAAE;YACpE,IAAI,CAAC,MAAM,EAAE;gBAAE,OAAM;YACrB,SAAS,CAAC,IAAI,CAAC,CAAA;YACf,KAAK,CAAC,oBAAoB,EAAE,GAAG,EAAE;gBAC/B,SAAS,CAAC,KAAK,CAAC,CAAA;gBAChB,iBAAiB,EAAE,CAAA;YACrB,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,MAAM,gBAAgB,GAAG,CAAC,OAAO,GAAG,KAAK,EAAQ,EAAE;QACjD,WAAW,EAAE,CAAA;QACb,SAAS,CAAC,KAAK,CAAC,CAAA;QAChB,iBAAiB,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC,CAAA;IAED,MAAM,MAAM,GAAG,GAAS,EAAE;QACxB,MAAM,UAAU,GAAG,GAAG,CAAC,aAAa,CAAc,wBAAwB,CAAC,IAAI,SAAS,CAAA;QACxF,IAAI,UAAU,KAAK,MAAM;YAAE,OAAM;QACjC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAA;QAC7C,MAAM,GAAG,UAAU,CAAA;QACnB,gBAAgB,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC,CAAA;IAED,MAAM,gBAAgB,GAAG,GAAS,EAAE;QAClC,IAAI,CAAC,MAAM,EAAE,IAAI,MAAM,KAAK,SAAS;YAAE,OAAM;QAC7C,WAAW,EAAE,CAAA;QACb,SAAS,CAAC,KAAK,CAAC,CAAA;QAChB,KAAK,MAAM,IAAI,IAAI,2BAA2B,EAAE,CAAC;YAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;QAC9C,CAAC;QACD,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE;YACd,SAAS,CAAC,KAAK,CAAC,CAAA;YAChB,iBAAiB,EAAE,CAAA;QACrB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,MAAM,mBAAmB,GAAG,GAAS,EAAE,CAAC,gBAAgB,EAAE,CAAA;IAC1D,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAA;IACtD,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;IACnE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAA;IACnE,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE;QACzC,UAAU,EAAE,IAAI;QAChB,eAAe,EAAE,CAAC,oBAAoB,CAAC;KACxC,CAAC,CAAA;IACF,GAAG,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,CAAA;IAC7D,GAAG,CAAC,gBAAgB,CAAC,6BAA6B,EAAE,gBAAgB,CAAC,CAAA;IACrE,aAAa,CAAC,gBAAgB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAA;IAC7D,MAAM,EAAE,CAAA;IAER,OAAO,GAAG,EAAE;QACV,QAAQ,GAAG,IAAI,CAAA;QACf,WAAW,EAAE,CAAA;QACb,aAAa,CAAC,UAAU,EAAE,CAAA;QAC1B,aAAa,CAAC,UAAU,EAAE,CAAA;QAC1B,GAAG,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,CAAA;QAChE,GAAG,CAAC,mBAAmB,CAAC,6BAA6B,EAAE,gBAAgB,CAAC,CAAA;QACxE,aAAa,CAAC,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAA;QAChE,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAA;QAC7C,KAAK,CAAC,MAAM,EAAE,CAAA;IAChB,CAAC,CAAA;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare const XIAOHEI_BOOT_APPEARANCE_ATTRIBUTE = "data-xiaohei-boot-appearance";
2
+ export declare const XIAOHEI_BOOT_APPEARANCE_STYLE_ID = "dsh-theme-xiaohei/boot-appearance-style";
3
+ /**
4
+ * Keep the document on the resolved DSH palette until the complete Xiaohei
5
+ * theme has synchronously taken ownership of the page.
6
+ */
7
+ export declare const XIAOHEI_BOOT_APPEARANCE_CSS = "\nhtml:not([data-xiaohei-boot-appearance]) body:not([data-ds-dark-theme]),\nhtml:not([data-xiaohei-boot-appearance]) body:not([data-ds-dark-theme]) > #root {\n color: #364044;\n background-color: #E7ECEC !important;\n}\n\nhtml:not([data-xiaohei-boot-appearance]) body[data-ds-dark-theme],\nhtml:not([data-xiaohei-boot-appearance]) body[data-ds-dark-theme] > #root {\n color: #D5DEDC;\n background-color: #151C1E !important;\n}\n\nhtml[data-xiaohei-boot-appearance='light'] {\n color-scheme: light !important;\n background-color: #E7ECEC !important;\n}\n\nhtml[data-xiaohei-boot-appearance='light'] body,\nhtml[data-xiaohei-boot-appearance='light'] body > #root {\n color: #364044;\n background-color: #E7ECEC !important;\n}\n\nhtml[data-xiaohei-boot-appearance='dark'] {\n color-scheme: dark !important;\n background-color: #151C1E !important;\n}\n\nhtml[data-xiaohei-boot-appearance='dark'] body,\nhtml[data-xiaohei-boot-appearance='dark'] body > #root {\n color: #D5DEDC;\n background-color: #151C1E !important;\n}\n";
8
+ /** Release the first-frame palette only after ThemeRuntime is authoritative. */
9
+ export declare function releaseXiaoheiBootAppearance(doc: Document): void;
10
+ //# sourceMappingURL=boot-appearance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boot-appearance.d.ts","sourceRoot":"","sources":["../src/boot-appearance.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iCAAiC,iCAAiC,CAAA;AAC/E,eAAO,MAAM,gCAAgC,4CAA4C,CAAA;AAEzF;;;GAGG;AACH,eAAO,MAAM,2BAA2B,2gCAkCvC,CAAA;AAED,gFAAgF;AAChF,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAGhE"}
@@ -0,0 +1,47 @@
1
+ export const XIAOHEI_BOOT_APPEARANCE_ATTRIBUTE = 'data-xiaohei-boot-appearance';
2
+ export const XIAOHEI_BOOT_APPEARANCE_STYLE_ID = 'dsh-theme-xiaohei/boot-appearance-style';
3
+ /**
4
+ * Keep the document on the resolved DSH palette until the complete Xiaohei
5
+ * theme has synchronously taken ownership of the page.
6
+ */
7
+ export const XIAOHEI_BOOT_APPEARANCE_CSS = `
8
+ html:not([data-xiaohei-boot-appearance]) body:not([data-ds-dark-theme]),
9
+ html:not([data-xiaohei-boot-appearance]) body:not([data-ds-dark-theme]) > #root {
10
+ color: #364044;
11
+ background-color: #E7ECEC !important;
12
+ }
13
+
14
+ html:not([data-xiaohei-boot-appearance]) body[data-ds-dark-theme],
15
+ html:not([data-xiaohei-boot-appearance]) body[data-ds-dark-theme] > #root {
16
+ color: #D5DEDC;
17
+ background-color: #151C1E !important;
18
+ }
19
+
20
+ html[data-xiaohei-boot-appearance='light'] {
21
+ color-scheme: light !important;
22
+ background-color: #E7ECEC !important;
23
+ }
24
+
25
+ html[data-xiaohei-boot-appearance='light'] body,
26
+ html[data-xiaohei-boot-appearance='light'] body > #root {
27
+ color: #364044;
28
+ background-color: #E7ECEC !important;
29
+ }
30
+
31
+ html[data-xiaohei-boot-appearance='dark'] {
32
+ color-scheme: dark !important;
33
+ background-color: #151C1E !important;
34
+ }
35
+
36
+ html[data-xiaohei-boot-appearance='dark'] body,
37
+ html[data-xiaohei-boot-appearance='dark'] body > #root {
38
+ color: #D5DEDC;
39
+ background-color: #151C1E !important;
40
+ }
41
+ `;
42
+ /** Release the first-frame palette only after ThemeRuntime is authoritative. */
43
+ export function releaseXiaoheiBootAppearance(doc) {
44
+ doc.documentElement.removeAttribute(XIAOHEI_BOOT_APPEARANCE_ATTRIBUTE);
45
+ doc.getElementById(XIAOHEI_BOOT_APPEARANCE_STYLE_ID)?.remove();
46
+ }
47
+ //# sourceMappingURL=boot-appearance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boot-appearance.js","sourceRoot":"","sources":["../src/boot-appearance.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iCAAiC,GAAG,8BAA8B,CAAA;AAC/E,MAAM,CAAC,MAAM,gCAAgC,GAAG,yCAAyC,CAAA;AAEzF;;;GAGG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkC1C,CAAA;AAED,gFAAgF;AAChF,MAAM,UAAU,4BAA4B,CAAC,GAAa;IACxD,GAAG,CAAC,eAAe,CAAC,eAAe,CAAC,iCAAiC,CAAC,CAAA;IACtE,GAAG,CAAC,cAAc,CAAC,gCAAgC,CAAC,EAAE,MAAM,EAAE,CAAA;AAChE,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const XIAOHEI_BOOT_LOADER_SCRIPT_ID = "dsh-theme-xiaohei/boot-loader-script";
2
+ export declare const XIAOHEI_BOOT_LOADER_MARKER = "data-xiaohei-boot-loader";
3
+ /** Inject the bootstrap immediately after body opens, before DSH's module script. */
4
+ export declare function injectXiaoheiBootLoader(html: string): string;
5
+ //# sourceMappingURL=boot-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boot-loader.d.ts","sourceRoot":"","sources":["../src/boot-loader.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,6BAA6B,yCAAyC,CAAA;AACnF,eAAO,MAAM,0BAA0B,6BAA6B,CAAA;AAUpE,qFAAqF;AACrF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAmB5D"}
@@ -0,0 +1,158 @@
1
+ import { XIAOHEI_LOADING_HEIXIU_BLINK, XIAOHEI_LOADING_HEIXIU_OPEN, } from './generated-loading-assets.js';
2
+ import { XIAOHEI_PLUGIN_LOADING_CSS } from './loading-heixiu.js';
3
+ import { XIAOHEI_BOOT_APPEARANCE_ATTRIBUTE, XIAOHEI_BOOT_APPEARANCE_CSS, XIAOHEI_BOOT_APPEARANCE_STYLE_ID, } from './boot-appearance.js';
4
+ export const XIAOHEI_BOOT_LOADER_SCRIPT_ID = 'dsh-theme-xiaohei/boot-loader-script';
5
+ export const XIAOHEI_BOOT_LOADER_MARKER = 'data-xiaohei-boot-loader';
6
+ /** Inject the bootstrap immediately after body opens, before DSH's module script. */
7
+ export function injectXiaoheiBootLoader(html) {
8
+ if (html.includes(`id="${XIAOHEI_BOOT_LOADER_SCRIPT_ID}"`))
9
+ return html;
10
+ const config = {
11
+ appearanceAttribute: XIAOHEI_BOOT_APPEARANCE_ATTRIBUTE,
12
+ css: XIAOHEI_PLUGIN_LOADING_CSS,
13
+ openImage: XIAOHEI_LOADING_HEIXIU_OPEN,
14
+ blinkImage: XIAOHEI_LOADING_HEIXIU_BLINK,
15
+ scriptId: XIAOHEI_BOOT_LOADER_SCRIPT_ID,
16
+ };
17
+ const payload = escapeInlineScriptJson(config);
18
+ const script = `<script id="${XIAOHEI_BOOT_LOADER_SCRIPT_ID}">(${runXiaoheiBootLoader.toString()})(${payload});</script>`;
19
+ const withAppearance = injectBootAppearanceStyle(html);
20
+ const body = /<body(?:\s[^>]*)?>/i.exec(withAppearance);
21
+ if (body === null)
22
+ return `${withAppearance}${script}`;
23
+ const insertionPoint = resolveBootLoaderInsertionPoint(withAppearance, body.index + body[0].length);
24
+ return `${withAppearance.slice(0, insertionPoint)}${script}${withAppearance.slice(insertionPoint)}`;
25
+ }
26
+ /** Install the critical palette before the parser reaches the body. */
27
+ function injectBootAppearanceStyle(html) {
28
+ const style = `<style id="${XIAOHEI_BOOT_APPEARANCE_STYLE_ID}">${XIAOHEI_BOOT_APPEARANCE_CSS}</style>`;
29
+ const headEnd = /<\/head\s*>/i.exec(html);
30
+ if (headEnd !== null) {
31
+ return `${html.slice(0, headEnd.index)}${style}${html.slice(headEnd.index)}`;
32
+ }
33
+ return `${style}${html}`;
34
+ }
35
+ /** Start after DSH has synchronously resolved its persisted theme preference. */
36
+ function resolveBootLoaderInsertionPoint(html, bodyStart) {
37
+ const themeMutation = html.indexOf('document.body.toggleAttribute', bodyStart);
38
+ const themeMarker = themeMutation < 0
39
+ ? -1
40
+ : html.indexOf('data-ds-dark-theme', themeMutation);
41
+ if (themeMarker < 0)
42
+ return bodyStart;
43
+ const themeScriptEnd = html.indexOf('</script>', themeMarker);
44
+ return themeScriptEnd < 0 ? bodyStart : themeScriptEnd + '</script>'.length;
45
+ }
46
+ function escapeInlineScriptJson(value) {
47
+ return JSON.stringify(value)
48
+ .replaceAll('<', '\\u003c')
49
+ .replaceAll('\u2028', '\\u2028')
50
+ .replaceAll('\u2029', '\\u2029');
51
+ }
52
+ /** Self-contained browser bootstrap serialized into index.html by the Host. */
53
+ function runXiaoheiBootLoader(config) {
54
+ const root = document.documentElement;
55
+ if (root.getAttribute('data-xiaohei-boot-loader') === 'host')
56
+ return;
57
+ root.setAttribute('data-xiaohei-boot-loader', 'host');
58
+ const syncAppearance = () => {
59
+ const dark = root.style.colorScheme === 'dark'
60
+ || document.body.hasAttribute('data-ds-dark-theme');
61
+ root.setAttribute(config.appearanceAttribute, dark ? 'dark' : 'light');
62
+ };
63
+ syncAppearance();
64
+ const style = document.createElement('style');
65
+ style.id = `${config.scriptId}/style`;
66
+ style.textContent = config.css;
67
+ document.head.append(style);
68
+ let decoratedCard;
69
+ let loadingSeen = false;
70
+ let disposed = false;
71
+ const isLoadingHint = (value) => {
72
+ const normalized = value?.trim() ?? '';
73
+ return normalized === 'Loading plugins...' || normalized === 'Loading plugins…';
74
+ };
75
+ const findHint = () => {
76
+ for (const element of document.querySelectorAll('div')) {
77
+ if (element.children.length === 0 && isLoadingHint(element.textContent))
78
+ return element;
79
+ }
80
+ return undefined;
81
+ };
82
+ const createImage = (source, className) => {
83
+ const image = document.createElement('img');
84
+ image.className = className;
85
+ image.alt = '';
86
+ image.decoding = 'async';
87
+ image.src = source;
88
+ return image;
89
+ };
90
+ const createTrack = () => {
91
+ const track = document.createElement('div');
92
+ track.className = 'xiaohei-plugin-loader__track';
93
+ track.setAttribute('aria-hidden', 'true');
94
+ for (let index = 0; index < 4; index += 1) {
95
+ const runner = document.createElement('span');
96
+ runner.className = 'xiaohei-plugin-loader__runner';
97
+ runner.style.setProperty('--xiaohei-loader-index', String(index));
98
+ runner.style.setProperty('--xiaohei-loader-delay', `${index * -700}ms`);
99
+ const sprite = document.createElement('span');
100
+ sprite.className = 'xiaohei-plugin-loader__sprite';
101
+ sprite.append(createImage(config.openImage, 'xiaohei-plugin-loader__runner-open'), createImage(config.blinkImage, 'xiaohei-plugin-loader__runner-blink'));
102
+ runner.append(sprite);
103
+ track.append(runner);
104
+ }
105
+ return track;
106
+ };
107
+ const clearCard = () => {
108
+ if (decoratedCard === undefined)
109
+ return;
110
+ decoratedCard.removeAttribute('data-xiaohei-plugin-loading');
111
+ decoratedCard.querySelector('.xiaohei-plugin-loader__track')?.remove();
112
+ decoratedCard = undefined;
113
+ };
114
+ let observer;
115
+ const dispose = () => {
116
+ if (disposed)
117
+ return;
118
+ disposed = true;
119
+ observer.disconnect();
120
+ clearCard();
121
+ style.remove();
122
+ };
123
+ const sync = () => {
124
+ if (disposed)
125
+ return;
126
+ const hint = findHint();
127
+ if (hint === undefined || hint.parentElement === null) {
128
+ if (loadingSeen)
129
+ dispose();
130
+ return;
131
+ }
132
+ loadingSeen = true;
133
+ const card = hint.parentElement;
134
+ if (card === decoratedCard && card.querySelector('.xiaohei-plugin-loader__track') !== null)
135
+ return;
136
+ clearCard();
137
+ decoratedCard = card;
138
+ const spinner = card.querySelector(":scope > [class*='_spinner_']");
139
+ if (spinner === null)
140
+ return;
141
+ card.setAttribute('data-xiaohei-plugin-loading', 'true');
142
+ spinner.append(createTrack());
143
+ };
144
+ let syncQueued = false;
145
+ const queueSync = () => {
146
+ if (syncQueued || disposed)
147
+ return;
148
+ syncQueued = true;
149
+ queueMicrotask(() => {
150
+ syncQueued = false;
151
+ sync();
152
+ });
153
+ };
154
+ observer = new MutationObserver(queueSync);
155
+ observer.observe(document, { childList: true, subtree: true });
156
+ sync();
157
+ }
158
+ //# sourceMappingURL=boot-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boot-loader.js","sourceRoot":"","sources":["../src/boot-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,4BAA4B,EAC5B,2BAA2B,GAC5B,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,EACL,iCAAiC,EACjC,2BAA2B,EAC3B,gCAAgC,GACjC,MAAM,sBAAsB,CAAA;AAE7B,MAAM,CAAC,MAAM,6BAA6B,GAAG,sCAAsC,CAAA;AACnF,MAAM,CAAC,MAAM,0BAA0B,GAAG,0BAA0B,CAAA;AAUpE,qFAAqF;AACrF,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,6BAA6B,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IACvE,MAAM,MAAM,GAA4B;QACtC,mBAAmB,EAAE,iCAAiC;QACtD,GAAG,EAAE,0BAA0B;QAC/B,SAAS,EAAE,2BAA2B;QACtC,UAAU,EAAE,4BAA4B;QACxC,QAAQ,EAAE,6BAA6B;KACxC,CAAA;IACD,MAAM,OAAO,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAA;IAC9C,MAAM,MAAM,GAAG,eAAe,6BAA6B,MAAM,oBAAoB,CAAC,QAAQ,EAAE,KAAK,OAAO,aAAa,CAAA;IACzH,MAAM,cAAc,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAA;IACtD,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IACvD,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,GAAG,cAAc,GAAG,MAAM,EAAE,CAAA;IACtD,MAAM,cAAc,GAAG,+BAA+B,CACpD,cAAc,EACd,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAC5B,CAAA;IACD,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,GAAG,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAA;AACrG,CAAC;AAED,uEAAuE;AACvE,SAAS,yBAAyB,CAAC,IAAY;IAC7C,MAAM,KAAK,GAAG,cAAc,gCAAgC,KAAK,2BAA2B,UAAU,CAAA;IACtG,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAA;IAC9E,CAAC;IACD,OAAO,GAAG,KAAK,GAAG,IAAI,EAAE,CAAA;AAC1B,CAAC;AAED,iFAAiF;AACjF,SAAS,+BAA+B,CAAC,IAAY,EAAE,SAAiB;IACtE,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,+BAA+B,EAAE,SAAS,CAAC,CAAA;IAC9E,MAAM,WAAW,GAAG,aAAa,GAAG,CAAC;QACnC,CAAC,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,aAAa,CAAC,CAAA;IACrD,IAAI,WAAW,GAAG,CAAC;QAAE,OAAO,SAAS,CAAA;IAErC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;IAC7D,OAAO,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,GAAG,WAAW,CAAC,MAAM,CAAA;AAC7E,CAAC;AAED,SAAS,sBAAsB,CAAC,KAA8B;IAC5D,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SACzB,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC;SAC1B,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC;SAC/B,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;AACpC,CAAC;AAED,+EAA+E;AAC/E,SAAS,oBAAoB,CAAC,MAA+B;IAC3D,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAA;IACrC,IAAI,IAAI,CAAC,YAAY,CAAC,0BAA0B,CAAC,KAAK,MAAM;QAAE,OAAM;IACpE,IAAI,CAAC,YAAY,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAA;IAErD,MAAM,cAAc,GAAG,GAAS,EAAE;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,KAAK,MAAM;eACzC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAA;QACrD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;IACxE,CAAC,CAAA;IAED,cAAc,EAAE,CAAA;IAEhB,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;IAC7C,KAAK,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,QAAQ,QAAQ,CAAA;IACrC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,GAAG,CAAA;IAC9B,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAE3B,IAAI,aAAsC,CAAA;IAC1C,IAAI,WAAW,GAAG,KAAK,CAAA;IACvB,IAAI,QAAQ,GAAG,KAAK,CAAA;IAEpB,MAAM,aAAa,GAAG,CAAC,KAAgC,EAAW,EAAE;QAClE,MAAM,UAAU,GAAG,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;QACtC,OAAO,UAAU,KAAK,oBAAoB,IAAI,UAAU,KAAK,kBAAkB,CAAA;IACjF,CAAC,CAAA;IAED,MAAM,QAAQ,GAAG,GAA4B,EAAE;QAC7C,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,gBAAgB,CAAc,KAAK,CAAC,EAAE,CAAC;YACpE,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC;gBAAE,OAAO,OAAO,CAAA;QACzF,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC,CAAA;IAED,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,SAAiB,EAAoB,EAAE;QAC1E,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;QAC3C,KAAK,CAAC,SAAS,GAAG,SAAS,CAAA;QAC3B,KAAK,CAAC,GAAG,GAAG,EAAE,CAAA;QACd,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAA;QACxB,KAAK,CAAC,GAAG,GAAG,MAAM,CAAA;QAClB,OAAO,KAAK,CAAA;IACd,CAAC,CAAA;IAED,MAAM,WAAW,GAAG,GAAmB,EAAE;QACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;QAC3C,KAAK,CAAC,SAAS,GAAG,8BAA8B,CAAA;QAChD,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;QACzC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YAC1C,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;YAC7C,MAAM,CAAC,SAAS,GAAG,+BAA+B,CAAA;YAClD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,wBAAwB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;YACjE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,wBAAwB,EAAE,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,CAAA;YACvE,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;YAC7C,MAAM,CAAC,SAAS,GAAG,+BAA+B,CAAA;YAClD,MAAM,CAAC,MAAM,CACX,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,oCAAoC,CAAC,EACnE,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,qCAAqC,CAAC,CACtE,CAAA;YACD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YACrB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACtB,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC,CAAA;IAED,MAAM,SAAS,GAAG,GAAS,EAAE;QAC3B,IAAI,aAAa,KAAK,SAAS;YAAE,OAAM;QACvC,aAAa,CAAC,eAAe,CAAC,6BAA6B,CAAC,CAAA;QAC5D,aAAa,CAAC,aAAa,CAAC,+BAA+B,CAAC,EAAE,MAAM,EAAE,CAAA;QACtE,aAAa,GAAG,SAAS,CAAA;IAC3B,CAAC,CAAA;IAED,IAAI,QAA0B,CAAA;IAC9B,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,IAAI,QAAQ;YAAE,OAAM;QACpB,QAAQ,GAAG,IAAI,CAAA;QACf,QAAQ,CAAC,UAAU,EAAE,CAAA;QACrB,SAAS,EAAE,CAAA;QACX,KAAK,CAAC,MAAM,EAAE,CAAA;IAChB,CAAC,CAAA;IAED,MAAM,IAAI,GAAG,GAAS,EAAE;QACtB,IAAI,QAAQ;YAAE,OAAM;QACpB,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAA;QACvB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;YACtD,IAAI,WAAW;gBAAE,OAAO,EAAE,CAAA;YAC1B,OAAM;QACR,CAAC;QACD,WAAW,GAAG,IAAI,CAAA;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAA;QAC/B,IAAI,IAAI,KAAK,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,+BAA+B,CAAC,KAAK,IAAI;YAAE,OAAM;QAClG,SAAS,EAAE,CAAA;QACX,aAAa,GAAG,IAAI,CAAA;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAc,+BAA+B,CAAC,CAAA;QAChF,IAAI,OAAO,KAAK,IAAI;YAAE,OAAM;QAC5B,IAAI,CAAC,YAAY,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAA;QACxD,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAA;IAC/B,CAAC,CAAA;IAED,IAAI,UAAU,GAAG,KAAK,CAAA;IACtB,MAAM,SAAS,GAAG,GAAS,EAAE;QAC3B,IAAI,UAAU,IAAI,QAAQ;YAAE,OAAM;QAClC,UAAU,GAAG,IAAI,CAAA;QACjB,cAAc,CAAC,GAAG,EAAE;YAClB,UAAU,GAAG,KAAK,CAAA;YAClB,IAAI,EAAE,CAAA;QACR,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,QAAQ,GAAG,IAAI,gBAAgB,CAAC,SAAS,CAAC,CAAA;IAC1C,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;IAC9D,IAAI,EAAE,CAAA;AACR,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Reduced-motion, reduced-transparency, unsupported-browser, and forced-color fallbacks. */
2
+ export declare const XIAOHEI_CHROME_ACCESSIBILITY_CSS = "\n@media (prefers-reduced-motion: reduce) {\n #root [data-composer-card='true'],\n #root [data-composer-card='true']::before,\n #root [data-composer-card='true']::after,\n #root button[aria-label='\u53D1\u9001\u6D88\u606F'],\n #root button[aria-label='Send message'],\n #root button[aria-label='\u53D1\u9001\u6D88\u606F']::after,\n #root button[aria-label='Send message']::after,\n #root [data-slot='conversation.composer'] button,\n #root [data-slot='sidebar'] button,\n #root [role='dialog']::before,\n #root [role='dialog']::after,\n #root [role='dialog'] button,\n #root [role='menu'] button,\n #root [role='listbox'] button {\n transition-duration: 0.01ms !important;\n animation: none !important;\n }\n}\n\n@media (prefers-reduced-transparency: reduce) {\n #root [data-composer-card='true'],\n #root [role='dialog'],\n #root [role='menu'],\n #root [role='listbox'] {\n background: var(--xiaohei-surface-raised) !important;\n -webkit-backdrop-filter: none !important;\n backdrop-filter: none !important;\n }\n\n #root [data-composer-card='true']::before,\n #root [role='dialog']::before {\n -webkit-backdrop-filter: none !important;\n backdrop-filter: none !important;\n background: transparent !important;\n border: 1px solid var(--xiaohei-edge-strong);\n }\n}\n\n@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {\n #root [role='dialog'],\n #root [role='menu'],\n #root [role='listbox'] {\n background: var(--xiaohei-surface-raised) !important;\n }\n #root [data-composer-card='true']::before,\n #root [role='dialog']::before {\n background: transparent;\n border: 1px solid var(--xiaohei-edge-strong);\n }\n}\n\n@media (forced-colors: active) {\n #root [data-composer-card='true'],\n #root [role='dialog'],\n #root [role='menu'],\n #root [role='listbox'],\n #root button[aria-label='\u53D1\u9001\u6D88\u606F'],\n #root button[aria-label='Send message'] {\n border: 1px solid CanvasText !important;\n background: Canvas !important;\n box-shadow: none !important;\n }\n\n #root [data-composer-card='true']::before,\n #root [data-composer-card='true']::after,\n #root [role='dialog']::before,\n #root [role='dialog']::after,\n #root button[aria-label='\u53D1\u9001\u6D88\u606F']::after,\n #root button[aria-label='Send message']::after {\n display: none;\n }\n}\n";
3
+ //# sourceMappingURL=accessibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accessibility.d.ts","sourceRoot":"","sources":["../../src/chrome/accessibility.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,eAAO,MAAM,gCAAgC,i2EA0E5C,CAAA"}
@@ -0,0 +1,77 @@
1
+ /** Reduced-motion, reduced-transparency, unsupported-browser, and forced-color fallbacks. */
2
+ export const XIAOHEI_CHROME_ACCESSIBILITY_CSS = `
3
+ @media (prefers-reduced-motion: reduce) {
4
+ #root [data-composer-card='true'],
5
+ #root [data-composer-card='true']::before,
6
+ #root [data-composer-card='true']::after,
7
+ #root button[aria-label='发送消息'],
8
+ #root button[aria-label='Send message'],
9
+ #root button[aria-label='发送消息']::after,
10
+ #root button[aria-label='Send message']::after,
11
+ #root [data-slot='conversation.composer'] button,
12
+ #root [data-slot='sidebar'] button,
13
+ #root [role='dialog']::before,
14
+ #root [role='dialog']::after,
15
+ #root [role='dialog'] button,
16
+ #root [role='menu'] button,
17
+ #root [role='listbox'] button {
18
+ transition-duration: 0.01ms !important;
19
+ animation: none !important;
20
+ }
21
+ }
22
+
23
+ @media (prefers-reduced-transparency: reduce) {
24
+ #root [data-composer-card='true'],
25
+ #root [role='dialog'],
26
+ #root [role='menu'],
27
+ #root [role='listbox'] {
28
+ background: var(--xiaohei-surface-raised) !important;
29
+ -webkit-backdrop-filter: none !important;
30
+ backdrop-filter: none !important;
31
+ }
32
+
33
+ #root [data-composer-card='true']::before,
34
+ #root [role='dialog']::before {
35
+ -webkit-backdrop-filter: none !important;
36
+ backdrop-filter: none !important;
37
+ background: transparent !important;
38
+ border: 1px solid var(--xiaohei-edge-strong);
39
+ }
40
+ }
41
+
42
+ @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
43
+ #root [role='dialog'],
44
+ #root [role='menu'],
45
+ #root [role='listbox'] {
46
+ background: var(--xiaohei-surface-raised) !important;
47
+ }
48
+ #root [data-composer-card='true']::before,
49
+ #root [role='dialog']::before {
50
+ background: transparent;
51
+ border: 1px solid var(--xiaohei-edge-strong);
52
+ }
53
+ }
54
+
55
+ @media (forced-colors: active) {
56
+ #root [data-composer-card='true'],
57
+ #root [role='dialog'],
58
+ #root [role='menu'],
59
+ #root [role='listbox'],
60
+ #root button[aria-label='发送消息'],
61
+ #root button[aria-label='Send message'] {
62
+ border: 1px solid CanvasText !important;
63
+ background: Canvas !important;
64
+ box-shadow: none !important;
65
+ }
66
+
67
+ #root [data-composer-card='true']::before,
68
+ #root [data-composer-card='true']::after,
69
+ #root [role='dialog']::before,
70
+ #root [role='dialog']::after,
71
+ #root button[aria-label='发送消息']::after,
72
+ #root button[aria-label='Send message']::after {
73
+ display: none;
74
+ }
75
+ }
76
+ `;
77
+ //# sourceMappingURL=accessibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accessibility.js","sourceRoot":"","sources":["../../src/chrome/accessibility.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,MAAM,CAAC,MAAM,gCAAgC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0E/C,CAAA"}
@@ -0,0 +1,3 @@
1
+ /** Atomic blink rendering: one state hides live eyes and reveals the complete closed frame. */
2
+ export declare const XIAOHEI_BLINK_CSS = "\n.xiaohei-scene__mascot-blink {\n animation: none;\n}\n\n.xiaohei-scene__mascot[data-xiaohei-blink='closed'] .xiaohei-scene__mascot-blink {\n opacity: 1;\n}\n\n.xiaohei-scene__mascot[data-xiaohei-blink='closed'] .xiaohei-gaze__eye {\n visibility: hidden;\n}\n";
3
+ //# sourceMappingURL=blink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blink.d.ts","sourceRoot":"","sources":["../../src/chrome/blink.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,eAAO,MAAM,iBAAiB,4QAY7B,CAAA"}