@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.
- package/LICENSE +21 -0
- package/README.md +84 -0
- package/cordis.patch.yml +4 -0
- package/lib/appearance.d.ts +12 -0
- package/lib/appearance.d.ts.map +1 -0
- package/lib/appearance.js +26 -0
- package/lib/appearance.js.map +1 -0
- package/lib/blink.d.ts +4 -0
- package/lib/blink.d.ts.map +1 -0
- package/lib/blink.js +110 -0
- package/lib/blink.js.map +1 -0
- package/lib/boot-appearance.d.ts +10 -0
- package/lib/boot-appearance.d.ts.map +1 -0
- package/lib/boot-appearance.js +47 -0
- package/lib/boot-appearance.js.map +1 -0
- package/lib/boot-loader.d.ts +5 -0
- package/lib/boot-loader.d.ts.map +1 -0
- package/lib/boot-loader.js +158 -0
- package/lib/boot-loader.js.map +1 -0
- package/lib/chrome/accessibility.d.ts +3 -0
- package/lib/chrome/accessibility.d.ts.map +1 -0
- package/lib/chrome/accessibility.js +77 -0
- package/lib/chrome/accessibility.js.map +1 -0
- package/lib/chrome/blink.d.ts +3 -0
- package/lib/chrome/blink.d.ts.map +1 -0
- package/lib/chrome/blink.js +15 -0
- package/lib/chrome/blink.js.map +1 -0
- package/lib/chrome/composer.d.ts +3 -0
- package/lib/chrome/composer.d.ts.map +1 -0
- package/lib/chrome/composer.js +146 -0
- package/lib/chrome/composer.js.map +1 -0
- package/lib/chrome/conversation-messages.d.ts +3 -0
- package/lib/chrome/conversation-messages.d.ts.map +1 -0
- package/lib/chrome/conversation-messages.js +96 -0
- package/lib/chrome/conversation-messages.js.map +1 -0
- package/lib/chrome/conversation.d.ts +3 -0
- package/lib/chrome/conversation.d.ts.map +1 -0
- package/lib/chrome/conversation.js +61 -0
- package/lib/chrome/conversation.js.map +1 -0
- package/lib/chrome/frames.d.ts +6 -0
- package/lib/chrome/frames.d.ts.map +1 -0
- package/lib/chrome/frames.js +120 -0
- package/lib/chrome/frames.js.map +1 -0
- package/lib/chrome/gaze.d.ts +3 -0
- package/lib/chrome/gaze.d.ts.map +1 -0
- package/lib/chrome/gaze.js +103 -0
- package/lib/chrome/gaze.js.map +1 -0
- package/lib/chrome/identity.d.ts +6 -0
- package/lib/chrome/identity.d.ts.map +1 -0
- package/lib/chrome/identity.js +61 -0
- package/lib/chrome/identity.js.map +1 -0
- package/lib/chrome/overlays.d.ts +3 -0
- package/lib/chrome/overlays.d.ts.map +1 -0
- package/lib/chrome/overlays.js +104 -0
- package/lib/chrome/overlays.js.map +1 -0
- package/lib/chrome/portal.d.ts +6 -0
- package/lib/chrome/portal.d.ts.map +1 -0
- package/lib/chrome/portal.js +169 -0
- package/lib/chrome/portal.js.map +1 -0
- package/lib/chrome/reactions.d.ts +3 -0
- package/lib/chrome/reactions.d.ts.map +1 -0
- package/lib/chrome/reactions.js +85 -0
- package/lib/chrome/reactions.js.map +1 -0
- package/lib/chrome/sidebar.d.ts +3 -0
- package/lib/chrome/sidebar.d.ts.map +1 -0
- package/lib/chrome/sidebar.js +305 -0
- package/lib/chrome/sidebar.js.map +1 -0
- package/lib/chrome/tokens.d.ts +3 -0
- package/lib/chrome/tokens.d.ts.map +1 -0
- package/lib/chrome/tokens.js +171 -0
- package/lib/chrome/tokens.js.map +1 -0
- package/lib/chrome/workspace.d.ts +3 -0
- package/lib/chrome/workspace.d.ts.map +1 -0
- package/lib/chrome/workspace.js +313 -0
- package/lib/chrome/workspace.js.map +1 -0
- package/lib/chrome.d.ts +10 -0
- package/lib/chrome.d.ts.map +1 -0
- package/lib/chrome.js +40 -0
- package/lib/chrome.js.map +1 -0
- package/lib/client.d.ts +17 -0
- package/lib/client.d.ts.map +1 -0
- package/lib/client.js +5505 -0
- package/lib/client.js.map +7 -0
- package/lib/gaze.d.ts +4 -0
- package/lib/gaze.d.ts.map +1 -0
- package/lib/gaze.js +217 -0
- package/lib/gaze.js.map +1 -0
- package/lib/generated-identity.d.ts +5 -0
- package/lib/generated-identity.d.ts.map +1 -0
- package/lib/generated-identity.js +5 -0
- package/lib/generated-identity.js.map +1 -0
- package/lib/generated-keyart.d.ts +19 -0
- package/lib/generated-keyart.d.ts.map +1 -0
- package/lib/generated-keyart.js +19 -0
- package/lib/generated-keyart.js.map +1 -0
- package/lib/generated-loading-assets.d.ts +4 -0
- package/lib/generated-loading-assets.d.ts.map +1 -0
- package/lib/generated-loading-assets.js +4 -0
- package/lib/generated-loading-assets.js.map +1 -0
- package/lib/generated-sidebar-assets.d.ts +4 -0
- package/lib/generated-sidebar-assets.d.ts.map +1 -0
- package/lib/generated-sidebar-assets.js +4 -0
- package/lib/generated-sidebar-assets.js.map +1 -0
- package/lib/heixiu-interactions.d.ts +10 -0
- package/lib/heixiu-interactions.d.ts.map +1 -0
- package/lib/heixiu-interactions.js +161 -0
- package/lib/heixiu-interactions.js.map +1 -0
- package/lib/index.d.ts +8 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +11 -0
- package/lib/index.js.map +1 -0
- package/lib/loading-heixiu.d.ts +8 -0
- package/lib/loading-heixiu.d.ts.map +1 -0
- package/lib/loading-heixiu.js +287 -0
- package/lib/loading-heixiu.js.map +1 -0
- package/lib/plugin.d.ts +6 -0
- package/lib/plugin.d.ts.map +1 -0
- package/lib/plugin.js +38 -0
- package/lib/plugin.js.map +1 -0
- package/lib/portal.d.ts +40 -0
- package/lib/portal.d.ts.map +1 -0
- package/lib/portal.js +224 -0
- package/lib/portal.js.map +1 -0
- package/lib/reactions.d.ts +20 -0
- package/lib/reactions.d.ts.map +1 -0
- package/lib/reactions.js +380 -0
- package/lib/reactions.js.map +1 -0
- package/lib/scene/heixiu-feedback.d.ts +3 -0
- package/lib/scene/heixiu-feedback.d.ts.map +1 -0
- package/lib/scene/heixiu-feedback.js +81 -0
- package/lib/scene/heixiu-feedback.js.map +1 -0
- package/lib/scene/heixiu-interactions.d.ts +3 -0
- package/lib/scene/heixiu-interactions.d.ts.map +1 -0
- package/lib/scene/heixiu-interactions.js +92 -0
- package/lib/scene/heixiu-interactions.js.map +1 -0
- package/lib/scene/state-transitions.d.ts +3 -0
- package/lib/scene/state-transitions.d.ts.map +1 -0
- package/lib/scene/state-transitions.js +37 -0
- package/lib/scene/state-transitions.js.map +1 -0
- package/lib/scene.d.ts +14 -0
- package/lib/scene.d.ts.map +1 -0
- package/lib/scene.js +1024 -0
- package/lib/scene.js.map +1 -0
- package/lib/sidebar-glass.d.ts +16 -0
- package/lib/sidebar-glass.d.ts.map +1 -0
- package/lib/sidebar-glass.js +105 -0
- package/lib/sidebar-glass.js.map +1 -0
- package/lib/sidebar-heixiu-escape.d.ts +44 -0
- package/lib/sidebar-heixiu-escape.d.ts.map +1 -0
- package/lib/sidebar-heixiu-escape.js +340 -0
- package/lib/sidebar-heixiu-escape.js.map +1 -0
- package/lib/sidebar-heixiu-roaming.d.ts +27 -0
- package/lib/sidebar-heixiu-roaming.d.ts.map +1 -0
- package/lib/sidebar-heixiu-roaming.js +310 -0
- package/lib/sidebar-heixiu-roaming.js.map +1 -0
- package/lib/state.d.ts +9 -0
- package/lib/state.d.ts.map +1 -0
- package/lib/state.js +114 -0
- package/lib/state.js.map +1 -0
- package/lib/theme.d.ts +19 -0
- package/lib/theme.d.ts.map +1 -0
- package/lib/theme.js +188 -0
- package/lib/theme.js.map +1 -0
- 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"}
|