@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
@@ -0,0 +1,61 @@
1
+ import { XIAOHEI_IDENTITY_CAT_TAG, 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
+ #root [data-composer-card='true']::before {
9
+ content: '';
10
+ position: absolute;
11
+ z-index: 3;
12
+ width: 30px;
13
+ height: 48px;
14
+ border: 0;
15
+ border-radius: 0;
16
+ background-position: center;
17
+ background-size: contain;
18
+ background-repeat: no-repeat;
19
+ box-shadow: none;
20
+ filter: drop-shadow(0 3px 4px var(--xiaohei-shadow));
21
+ opacity: 0.92;
22
+ pointer-events: none;
23
+ transform: rotate(3deg);
24
+ transform-origin: 50% 8%;
25
+ transition: transform 320ms var(--xiaohei-motion-curve), filter var(--xiaohei-motion-base) ease;
26
+ }
27
+
28
+ :where([data-xiaohei-frame-ornament='spirit-knot'])::after {
29
+ background-image: url("${XIAOHEI_IDENTITY_CHARM}");
30
+ }
31
+
32
+ #root [data-composer-card='true']::before {
33
+ width: 34px;
34
+ height: 50px;
35
+ background-image: url("${XIAOHEI_IDENTITY_CAT_TAG}");
36
+ }
37
+
38
+ :where([data-xiaohei-frame-ornament='spirit-knot'])::after {
39
+ top: -6px;
40
+ right: 16px;
41
+ }
42
+
43
+ #root [data-composer-card='true']::before {
44
+ top: -10px;
45
+ right: 24px;
46
+ }
47
+
48
+ :where([data-xiaohei-frame-ornament='spirit-knot']):hover::after,
49
+ #root [data-composer-card='true']:focus-within::before {
50
+ filter: drop-shadow(0 4px 6px var(--xiaohei-focus-shadow));
51
+ transform: rotate(-4deg) scale(1.03);
52
+ }
53
+
54
+ @media (forced-colors: active) {
55
+ :where([data-xiaohei-frame-ornament])::after,
56
+ #root [data-composer-card='true']::before {
57
+ display: none;
58
+ }
59
+ }
60
+ `;
61
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/chrome/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,0BAA0B,CAAA;AAEjC;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;2BAuBT,sBAAsB;;;;;;2BAMtB,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;CAyBlD,CAAA"}
@@ -0,0 +1,3 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlays.d.ts","sourceRoot":"","sources":["../../src/chrome/overlays.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,eAAO,MAAM,mBAAmB,g+GAqG/B,CAAA"}
@@ -0,0 +1,104 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlays.js","sourceRoot":"","sources":["../../src/chrome/overlays.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqGlC,CAAA"}
@@ -0,0 +1,6 @@
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: 0;\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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal.d.ts","sourceRoot":"","sources":["../../src/chrome/portal.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,kBAAkB,i9LAmK9B,CAAA"}
@@ -0,0 +1,169 @@
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: 0;
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal.js","sourceRoot":"","sources":["../../src/chrome/portal.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmKjC,CAAA"}
@@ -0,0 +1,3 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactions.d.ts","sourceRoot":"","sources":["../../src/chrome/reactions.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,eAAO,MAAM,oBAAoB,k5EAkFhC,CAAA"}
@@ -0,0 +1,85 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactions.js","sourceRoot":"","sources":["../../src/chrome/reactions.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkFnC,CAAA"}
@@ -0,0 +1,3 @@
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/* 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 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-radius-panel);\n background:\n radial-gradient(96% 16% at 14% 0%, var(--xiaohei-sidebar-glass-highlight), transparent 64%),\n linear-gradient(\n 90deg,\n var(--xiaohei-sidebar-glass-refraction),\n transparent 6%,\n transparent 95%,\n var(--xiaohei-sidebar-glass-inner-edge)\n ),\n linear-gradient(\n 180deg,\n var(--xiaohei-sidebar-glass-refraction),\n transparent 9%,\n transparent 88%,\n var(--xiaohei-sidebar-glass-inner-edge)\n ),\n var(--xiaohei-sidebar-glass-fill);\n box-shadow:\n 0 0 0 1px var(--xiaohei-sidebar-glass-outline),\n inset 0 1px 0 var(--xiaohei-sidebar-glass-highlight),\n inset 1px 0 0 var(--xiaohei-sidebar-glass-refraction),\n inset -1px 0 0 var(--xiaohei-sidebar-glass-inner-edge),\n inset 0 -1px 0 var(--xiaohei-sidebar-glass-inner-edge),\n 0 1px 1px rgb(255 255 255 / 4%),\n 10px 0 30px -22px var(--xiaohei-sidebar-shadow),\n 0 24px 52px -30px var(--xiaohei-sidebar-shadow);\n -webkit-backdrop-filter:\n blur(28px)\n saturate(var(--xiaohei-sidebar-glass-saturation))\n brightness(var(--xiaohei-sidebar-glass-brightness));\n backdrop-filter:\n blur(28px)\n saturate(var(--xiaohei-sidebar-glass-saturation))\n brightness(var(--xiaohei-sidebar-glass-brightness));\n}\n\n/* Specular light and the inner lens rim are independent from the tint. This\n * keeps the surface recognisably glass without reducing control contrast. */\n#dsh-theme-xiaohei\\/sidebar-glass::before,\n#dsh-theme-xiaohei\\/sidebar-glass::after {\n content: '';\n position: absolute;\n pointer-events: none;\n}\n\n#dsh-theme-xiaohei\\/sidebar-glass::before {\n inset: 0;\n border-radius: inherit;\n background:\n linear-gradient(\n 112deg,\n var(--xiaohei-sidebar-glass-specular),\n transparent 14%,\n transparent 78%,\n var(--xiaohei-sidebar-glass-refraction)\n );\n opacity: .72;\n -webkit-mask-image: linear-gradient(180deg, black, rgb(0 0 0 / 18%) 26%, transparent 58%);\n mask-image: linear-gradient(180deg, black, rgb(0 0 0 / 18%) 26%, transparent 58%);\n}\n\n#dsh-theme-xiaohei\\/sidebar-glass::after {\n inset: 1px;\n border-radius: calc(var(--xiaohei-radius-panel) - 1px);\n box-shadow:\n inset 0 0 0 1px var(--xiaohei-sidebar-glass-refraction),\n inset 0 18px 24px -28px var(--xiaohei-sidebar-glass-highlight),\n inset 0 -20px 30px -30px var(--xiaohei-sidebar-shadow);\n}\n\n/* Generated ink-space artwork supplies the complex Xiaohei identity. It is a\n * paint-only layer inside the glass and never participates in host layout. */\n#dsh-theme-xiaohei\\/sidebar-glass > .xiaohei-sidebar-atmosphere {\n position: absolute;\n z-index: 0;\n inset: 0;\n display: block;\n width: 100%;\n height: 100%;\n object-fit: cover;\n object-position: left bottom;\n pointer-events: none;\n user-select: none;\n opacity: var(--xiaohei-sidebar-atmosphere-opacity);\n mix-blend-mode: screen;\n}\n\nhtml[data-xiaohei-appearance='light']\n #dsh-theme-xiaohei\\/sidebar-glass > .xiaohei-sidebar-atmosphere {\n mix-blend-mode: multiply;\n}\n\n/* Header toggle and the primary action keep the host's dimensions. */\n#root [data-slot='sidebar'] > div:not([class*='_collapsed']) > div:first-child button:last-child,\n#root [data-slot='sidebar'] > div:not([class*='_collapsed']) > button[aria-label='\u65B0\u5EFA\u4F1A\u8BDD'],\n#root [data-slot='sidebar'] > div:not([class*='_collapsed']) > button[aria-label='New session'] {\n color: var(--xiaohei-sidebar-icon);\n transition:\n color var(--xiaohei-motion-fast) ease,\n background-color var(--xiaohei-motion-base) ease,\n border-color var(--xiaohei-motion-base) ease;\n}\n\n#root [data-slot='sidebar'] > div:not([class*='_collapsed']) > div:first-child button:last-child:hover {\n color: var(--xiaohei-sidebar-emphasis);\n background: var(--xiaohei-sidebar-hover);\n}\n\n#root [data-slot='sidebar'] > div:not([class*='_collapsed']) > button[aria-label='\u65B0\u5EFA\u4F1A\u8BDD'],\n#root [data-slot='sidebar'] > div:not([class*='_collapsed']) > button[aria-label='New session'] {\n position: relative;\n isolation: isolate;\n overflow: hidden;\n border-color: transparent;\n background: transparent !important;\n box-shadow: none;\n justify-content: flex-start;\n gap: 8px;\n padding-inline: 12px;\n text-align: start;\n}\n\n/* One quiet horizontal ink stroke replaces the generic button card. The\n * brush is paint-only; the native button, label and focus target stay intact. */\n#root [data-slot='sidebar'] > div:not([class*='_collapsed']) > button[aria-label='\u65B0\u5EFA\u4F1A\u8BDD']::before,\n#root [data-slot='sidebar'] > div:not([class*='_collapsed']) > button[aria-label='New session']::before {\n content: '';\n position: absolute;\n z-index: -1;\n inset: 3px 7px 3px 5px;\n border-radius: 42% 9% 37% 12% / 28% 46% 36% 58%;\n background: linear-gradient(\n 94deg,\n transparent 0%,\n var(--xiaohei-sidebar-brush-ink) 5%,\n var(--xiaohei-sidebar-brush-ink) 72%,\n transparent 100%\n );\n -webkit-mask-image:\n radial-gradient(ellipse 12px 70% at 5% 48%, black 44%, transparent 76%),\n linear-gradient(90deg, black 5%, black 76%, transparent 100%);\n mask-image:\n radial-gradient(ellipse 12px 70% at 5% 48%, black 44%, transparent 76%),\n linear-gradient(90deg, black 5%, black 76%, transparent 100%);\n -webkit-mask-composite: source-over;\n mask-composite: add;\n opacity: .9;\n transform: scaleX(.985);\n transform-origin: left center;\n transition:\n background-color var(--xiaohei-motion-base) ease,\n opacity var(--xiaohei-motion-fast) ease,\n transform var(--xiaohei-motion-base) var(--xiaohei-motion-curve);\n}\n\n#root [data-slot='sidebar'] > div:not([class*='_collapsed']) > button[aria-label='\u65B0\u5EFA\u4F1A\u8BDD']:hover,\n#root [data-slot='sidebar'] > div:not([class*='_collapsed']) > button[aria-label='New session']:hover {\n color: var(--xiaohei-sidebar-emphasis);\n border-color: transparent;\n background: transparent !important;\n}\n\n#root [data-slot='sidebar'] > div:not([class*='_collapsed']) > button[aria-label='\u65B0\u5EFA\u4F1A\u8BDD']:hover::before,\n#root [data-slot='sidebar'] > div:not([class*='_collapsed']) > button[aria-label='New session']:hover::before {\n background: linear-gradient(\n 94deg,\n transparent 0%,\n var(--xiaohei-sidebar-brush-ink-hover) 5%,\n var(--xiaohei-sidebar-brush-ink-hover) 72%,\n transparent 100%\n );\n opacity: 1;\n transform: scaleX(1);\n}\n\n/* Footer occupants keep their native layout. Only their interaction surface\n * is shaded, avoiding a second card inside the sidebar glass. */\n#root [data-slot='sidebar'] > div:not([class*='_collapsed'])\n > :has(> div > [data-slot='sidebar.footer.action']) {\n box-sizing: border-box;\n gap: 2px;\n margin: 8px 2px 4px;\n padding: 4px;\n border: 1px solid var(--xiaohei-sidebar-control-edge);\n border-radius: calc(var(--xiaohei-radius-control) + 2px);\n background: color-mix(in srgb, var(--xiaohei-sidebar-control) 76%, transparent);\n box-shadow: inset 0 1px 0 var(--xiaohei-sidebar-control-highlight);\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 #root [data-slot='sidebar'] > div:not([class*='_collapsed']) > button[aria-label='\u65B0\u5EFA\u4F1A\u8BDD']::before,\n #root [data-slot='sidebar'] > div:not([class*='_collapsed']) > button[aria-label='New session']::before {\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 #dsh-theme-xiaohei\\/sidebar-glass > .xiaohei-sidebar-atmosphere {\n opacity: var(--xiaohei-sidebar-atmosphere-solid-opacity);\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 #dsh-theme-xiaohei\\/sidebar-glass > .xiaohei-sidebar-atmosphere {\n display: none;\n }\n\n #root [data-slot='sidebar'] > div:not([class*='_collapsed']) > button[aria-label='\u65B0\u5EFA\u4F1A\u8BDD'],\n #root [data-slot='sidebar'] > div:not([class*='_collapsed']) > button[aria-label='New session'] {\n border-color: ButtonText;\n }\n\n #root [data-slot='sidebar'] > div:not([class*='_collapsed']) > button[aria-label='\u65B0\u5EFA\u4F1A\u8BDD']::before,\n #root [data-slot='sidebar'] > div:not([class*='_collapsed']) > button[aria-label='New session']::before {\n display: none;\n }\n}\n";
3
+ //# sourceMappingURL=sidebar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar.d.ts","sourceRoot":"","sources":["../../src/chrome/sidebar.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,eAAO,MAAM,mBAAmB,+2VA8S/B,CAAA"}