@kkabuka/dsh-skin-solar-orbit 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -0
- package/hooks.mjs +393 -0
- package/package.json +25 -0
- package/patches.css +275 -0
- package/skin.css +315 -0
- package/skin.json +32 -0
package/README.md
ADDED
package/hooks.mjs
ADDED
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SOLAR ORBIT — 太阳系轨道(2.5D 透视巨物版)
|
|
3
|
+
* ============================================================
|
|
4
|
+
* 立体感太阳系背景皮肤(纯自动、零依赖、原生 Canvas):
|
|
5
|
+
*
|
|
6
|
+
* - 太阳固定在右上角,大光晕 + 呼吸微光,如旁观巨物悬停
|
|
7
|
+
* - 八大行星沿"投影椭圆"公转:轨道中心在太阳(右上),
|
|
8
|
+
* 椭圆长轴指向屏幕中心,大部分弧段甩在屏幕外,
|
|
9
|
+
* 只有一段弧扫过画面 → 星系只露出一角的巨物感
|
|
10
|
+
* - 行星由远到近循环:远端点(右上,缩至 ~35%、变淡)→
|
|
11
|
+
* 近端点(左下屏幕前,放大到 11~32px、清晰、可遮住太阳)
|
|
12
|
+
* - 每帧按深度 z 排序:远行星 → 太阳 → 近行星(遮挡关系成立)
|
|
13
|
+
* - 小行星带 = 同投影的椭圆带,缓慢自转
|
|
14
|
+
* - 星场带视差漂移 + 微闪烁;流星 3~7 秒一条(渐变尾迹)
|
|
15
|
+
*
|
|
16
|
+
* 数学:伪 3D = 椭圆参数方程 + z=cos(θ) 深度,近大远小 + 深浅排序,
|
|
17
|
+
* 无需 WebGL/three.js,每帧 < 1ms。
|
|
18
|
+
* 流星/星空技术参照 grok-shooting-stars(MIT,UsmanDevCraft)。
|
|
19
|
+
*
|
|
20
|
+
* 皮肤中心契约:default export defineSkinHooks() -> { apply(ctx) }
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
export default function defineSkinHooks() {
|
|
24
|
+
"use strict";
|
|
25
|
+
|
|
26
|
+
let canvas = null;
|
|
27
|
+
let ctx2d = null;
|
|
28
|
+
let animId = 0;
|
|
29
|
+
let mounted = false;
|
|
30
|
+
let lastNow = 0;
|
|
31
|
+
let stars = [];
|
|
32
|
+
let beltDots = [];
|
|
33
|
+
let beltRot = 0;
|
|
34
|
+
let meteors = [];
|
|
35
|
+
let meteorWait = 0;
|
|
36
|
+
let frostStyle = null;
|
|
37
|
+
|
|
38
|
+
const THEMES = {
|
|
39
|
+
dark: {
|
|
40
|
+
star: "rgba(224,232,255,",
|
|
41
|
+
orbit: "rgba(150,170,225,0.22)",
|
|
42
|
+
belt: "rgba(178,198,235,",
|
|
43
|
+
sunCore: "#fff3d8",
|
|
44
|
+
sunInner: "rgba(255,224,150,",
|
|
45
|
+
sunOuter: "rgba(255,180,90,",
|
|
46
|
+
meteorHead: "rgba(214,232,255,",
|
|
47
|
+
meteorTail: "rgba(190,220,255,"
|
|
48
|
+
},
|
|
49
|
+
light: {
|
|
50
|
+
star: "rgba(96,112,160,",
|
|
51
|
+
orbit: "rgba(84,104,164,0.24)",
|
|
52
|
+
belt: "rgba(108,130,182,",
|
|
53
|
+
sunCore: "#8a5a20",
|
|
54
|
+
sunInner: "rgba(214,152,62,",
|
|
55
|
+
sunOuter: "rgba(199,122,42,",
|
|
56
|
+
meteorHead: "rgba(118,148,210,",
|
|
57
|
+
meteorTail: "rgba(108,140,205,"
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* 行星表(2.5D 艺术化):
|
|
63
|
+
* near = 近端点(屏幕前)行星像素半径(夸张巨物感)
|
|
64
|
+
* o = 轨道长半轴比例(baseR = 屏宽×0.82,越大甩出屏幕越多)
|
|
65
|
+
* sp = 角速度倍率(omega = 0.17*sp rad/s)
|
|
66
|
+
* ring = 土星环
|
|
67
|
+
* 远端点半径 = near × 0.35(由远到近缩放比),透明度同样淡入淡出。
|
|
68
|
+
*/
|
|
69
|
+
const PLANETS = [
|
|
70
|
+
{ name: "水星", near: 11, o: 0.50, sp: 1.90, dark: "#b9bcc9", light: "#6f7488", ring: false },
|
|
71
|
+
{ name: "金星", near: 15, o: 0.60, sp: 1.55, dark: "#e8c98a", light: "#a8853f", ring: false },
|
|
72
|
+
{ name: "地球", near: 17, o: 0.68, sp: 1.28, dark: "#6fb1e8", light: "#2f6fb8", ring: false },
|
|
73
|
+
{ name: "火星", near: 14, o: 0.75, sp: 1.05, dark: "#e07050", light: "#b04a30", ring: false },
|
|
74
|
+
{ name: "木星", near: 32, o: 0.90, sp: 0.80, dark: "#d8a86a", light: "#8f6a3a", ring: false },
|
|
75
|
+
{ name: "土星", near: 27, o: 1.00, sp: 0.68, dark: "#e6cf8f", light: "#9d8748", ring: true },
|
|
76
|
+
{ name: "天王星", near: 19, o: 1.06, sp: 0.55, dark: "#9fd8d8", light: "#4a9a9a", ring: false },
|
|
77
|
+
{ name: "海王星", near: 20, o: 1.12, sp: 0.45, dark: "#7088e8", light: "#3a55b8", ring: false }
|
|
78
|
+
];
|
|
79
|
+
const angles = PLANETS.map(() => Math.random() * Math.PI * 2);
|
|
80
|
+
|
|
81
|
+
const CONFIG = {
|
|
82
|
+
aside: 0.78, // 太阳 X 位置(屏宽比例)
|
|
83
|
+
atop: 0.2, // 太阳 Y 位置(屏高比例)
|
|
84
|
+
axisFlat: 0.32, // 椭圆压扁系数 ry = rx × 轴
|
|
85
|
+
farScale: 0.35, // 远端行星相对近端的大小
|
|
86
|
+
sunScale: 0.05, // 太阳半径 = min(w,h) × 系数
|
|
87
|
+
starBase: 16000,
|
|
88
|
+
meteorMinWait: 3200,
|
|
89
|
+
meteorMaxWait: 7600,
|
|
90
|
+
beltCount: 90,
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
function isDarkMode() {
|
|
94
|
+
return !!document.body && document.body.hasAttribute("data-ds-dark-theme");
|
|
95
|
+
}
|
|
96
|
+
function rand(a, b) { return a + Math.random() * (b - a); }
|
|
97
|
+
function clamp(v, a, b) { return v < a ? a : v > b ? b : v; }
|
|
98
|
+
function theme() { return isDarkMode() ? THEMES.dark : THEMES.light; }
|
|
99
|
+
|
|
100
|
+
function resize() {
|
|
101
|
+
if (!canvas) return;
|
|
102
|
+
const dpr = Math.min(window.devicePixelRatio || 1, 2);
|
|
103
|
+
canvas.width = window.innerWidth * dpr;
|
|
104
|
+
canvas.height = window.innerHeight * dpr;
|
|
105
|
+
if (ctx2d) {
|
|
106
|
+
ctx2d.setTransform(1, 0, 0, 1, 0, 0);
|
|
107
|
+
ctx2d.scale(dpr, dpr);
|
|
108
|
+
}
|
|
109
|
+
initStars();
|
|
110
|
+
initBelt();
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function initStars() {
|
|
114
|
+
const n = clamp(Math.floor((window.innerWidth * window.innerHeight) / CONFIG.starBase), 40, 130);
|
|
115
|
+
stars = [];
|
|
116
|
+
for (let i = 0; i < n; i++) {
|
|
117
|
+
const depth = rand(0.3, 1); // 视差系数:远处的星移动慢
|
|
118
|
+
stars.push({
|
|
119
|
+
x: Math.random() * window.innerWidth,
|
|
120
|
+
y: Math.random() * window.innerHeight,
|
|
121
|
+
r: rand(0.4, 1.7),
|
|
122
|
+
tw: rand(0.6, 2.2) / 1000,
|
|
123
|
+
ph: Math.random() * Math.PI * 2,
|
|
124
|
+
vdx: rand(-0.05, 0.05) * depth, // 视差漂移速度(小)
|
|
125
|
+
vdy: rand(0.02, 0.07) * depth
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function initBelt() {
|
|
131
|
+
beltDots = [];
|
|
132
|
+
for (let i = 0; i < CONFIG.beltCount; i++) {
|
|
133
|
+
beltDots.push({
|
|
134
|
+
a: (i / CONFIG.beltCount) * Math.PI * 2 + rand(-0.05, 0.05),
|
|
135
|
+
rr: rand(-0.07, 0.07), // 径向抖动比例
|
|
136
|
+
s: rand(0.5, 1.3)
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function makeMeteor(w, h) {
|
|
142
|
+
const fromLeft = Math.random() < 0.5;
|
|
143
|
+
const ang = fromLeft ? rand(0.35, 0.7) : rand(2.5, 2.9);
|
|
144
|
+
const speed = rand(5.5, 9);
|
|
145
|
+
return {
|
|
146
|
+
x: fromLeft ? -80 : rand(w * 0.3, w * 0.9),
|
|
147
|
+
y: rand(0, h * 0.32),
|
|
148
|
+
vx: Math.cos(ang) * speed,
|
|
149
|
+
vy: Math.sin(ang) * speed,
|
|
150
|
+
age: 0,
|
|
151
|
+
life: Math.round(rand(70, 130)),
|
|
152
|
+
len: rand(55, 95),
|
|
153
|
+
w: rand(1.2, 2.2)
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/** 椭圆投影:绕太阳的公转角度 θ → 屏幕坐标 + 深度 z(-1 近 / +1 远) */
|
|
158
|
+
function orbitPoint(sx, sy, rx, ry, dirX, dirY, perpX, perpY, theta) {
|
|
159
|
+
const ex = Math.cos(theta) * rx;
|
|
160
|
+
const ey = Math.sin(theta) * ry;
|
|
161
|
+
return {
|
|
162
|
+
x: sx + ex * dirX + ey * perpX,
|
|
163
|
+
y: sy + ex * dirY + ey * perpY,
|
|
164
|
+
z: -Math.cos(theta) // θ=0(近端点,朝向屏幕中心)→ z=-1;θ=π(远端)→ z=+1
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function render(now, keepLoop) {
|
|
169
|
+
if (!mounted || !ctx2d || !canvas) return;
|
|
170
|
+
if (document.hidden) {
|
|
171
|
+
if (keepLoop) animId = requestAnimationFrame((t) => render(t, true));
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const w = window.innerWidth;
|
|
175
|
+
const h = window.innerHeight;
|
|
176
|
+
const dt = clamp(now - (lastNow || now), 0, 60);
|
|
177
|
+
lastNow = now;
|
|
178
|
+
const ms = now;
|
|
179
|
+
const T = theme();
|
|
180
|
+
|
|
181
|
+
ctx2d.clearRect(0, 0, w, h);
|
|
182
|
+
|
|
183
|
+
// ---- 1. 星场:视差漂移 + 闪烁 ----
|
|
184
|
+
for (const s of stars) {
|
|
185
|
+
s.x += s.vdx * (dt / 16.7);
|
|
186
|
+
s.y += s.vdy * (dt / 16.7);
|
|
187
|
+
if (s.x < -4) s.x = w + 4; else if (s.x > w + 4) s.x = -4;
|
|
188
|
+
if (s.y < -4) s.y = h + 4; else if (s.y > h + 4) s.y = -4;
|
|
189
|
+
const a = 0.35 + 0.55 * (0.5 + 0.5 * Math.sin(ms * s.tw + s.ph));
|
|
190
|
+
ctx2d.beginPath();
|
|
191
|
+
ctx2d.arc(s.x, s.y, s.r, 0, Math.PI * 2);
|
|
192
|
+
ctx2d.fillStyle = T.star + a.toFixed(3) + ")";
|
|
193
|
+
ctx2d.fill();
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// ---- 2. 星系几何:太阳右上 + 椭球平面朝向屏幕中心 ----
|
|
197
|
+
const sx = w * CONFIG.aside;
|
|
198
|
+
const sy = h * CONFIG.atop;
|
|
199
|
+
const cdx = w / 2 - sx;
|
|
200
|
+
const cdy = h / 2 - sy;
|
|
201
|
+
const cl = Math.hypot(cdx, cdy) || 1;
|
|
202
|
+
const dirX = cdx / cl; // 椭圆长轴方向:太阳 → 屏幕中心
|
|
203
|
+
const dirY = cdy / cl;
|
|
204
|
+
const perpX = -dirY; // 垂直方向
|
|
205
|
+
const perpY = dirX;
|
|
206
|
+
const baseR = w * 0.82; // 长半轴基数(让大部分弧段甩出屏幕)
|
|
207
|
+
const sunR = Math.max(34, Math.min(w, h) * CONFIG.sunScale);
|
|
208
|
+
const farAlpha = 0.4;
|
|
209
|
+
|
|
210
|
+
// 各行星当前屏幕位置(含深度)
|
|
211
|
+
const items = [];
|
|
212
|
+
for (let i = 0; i < PLANETS.length; i++) {
|
|
213
|
+
const p = PLANETS[i];
|
|
214
|
+
angles[i] += 0.17 * p.sp * (dt / 1000);
|
|
215
|
+
const rx = baseR * p.o;
|
|
216
|
+
const ry = rx * CONFIG.axisFlat;
|
|
217
|
+
const pt = orbitPoint(sx, sy, rx, ry, dirX, dirY, perpX, perpY, angles[i]);
|
|
218
|
+
items.push({ p, pt });
|
|
219
|
+
}
|
|
220
|
+
// 深度排序:远的先画(z 大在前),近的后画
|
|
221
|
+
items.sort((a, b) => b.pt.z - a.pt.z);
|
|
222
|
+
|
|
223
|
+
// 轨道椭圆(线稿只有一段可见)
|
|
224
|
+
ctx2d.strokeStyle = T.orbit;
|
|
225
|
+
ctx2d.lineWidth = 1;
|
|
226
|
+
for (const p of PLANETS) {
|
|
227
|
+
const rx = baseR * p.o;
|
|
228
|
+
const ry = rx * CONFIG.axisFlat;
|
|
229
|
+
ctx2d.beginPath();
|
|
230
|
+
ctx2d.ellipse(sx, sy, rx, ry, Math.atan2(dirY, dirX), 0, Math.PI * 2);
|
|
231
|
+
ctx2d.stroke();
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// ---- 3. 深度分层绘制:远行星 → 太阳 → 近行星 ----
|
|
235
|
+
const far = items.filter((it) => it.pt.z > 0);
|
|
236
|
+
const near = items.filter((it) => it.pt.z <= 0);
|
|
237
|
+
const drawPlanet = (it) => {
|
|
238
|
+
const p = it.p;
|
|
239
|
+
const t = (1 - it.pt.z) / 2; // 0=远, 1=近
|
|
240
|
+
const R = p.near * (CONFIG.farScale + t * (1 - CONFIG.farScale));
|
|
241
|
+
const alpha = farAlpha + (1 - farAlpha) * t;
|
|
242
|
+
const color = isDarkMode() ? p.dark : p.light;
|
|
243
|
+
if (t > 0.78 && R > 10) { // 近景行星加柔光,强化巨物感
|
|
244
|
+
const glow = ctx2d.createRadialGradient(it.pt.x, it.pt.y, R * 0.4, it.pt.x, it.pt.y, R * 2.6);
|
|
245
|
+
glow.addColorStop(0, color + "60"); // 8 位 hex:颜色 + 固定 alpha
|
|
246
|
+
glow.addColorStop(1, color + "00");
|
|
247
|
+
ctx2d.globalAlpha = (t - 0.78) * 1.4;
|
|
248
|
+
ctx2d.fillStyle = glow;
|
|
249
|
+
ctx2d.beginPath();
|
|
250
|
+
ctx2d.arc(it.pt.x, it.pt.y, R * 2.6, 0, Math.PI * 2);
|
|
251
|
+
ctx2d.fill();
|
|
252
|
+
ctx2d.globalAlpha = 1;
|
|
253
|
+
}
|
|
254
|
+
ctx2d.globalAlpha = alpha;
|
|
255
|
+
ctx2d.fillStyle = color;
|
|
256
|
+
ctx2d.beginPath();
|
|
257
|
+
ctx2d.arc(it.pt.x, it.pt.y, R, 0, Math.PI * 2);
|
|
258
|
+
ctx2d.fill();
|
|
259
|
+
if (p.ring) {
|
|
260
|
+
ctx2d.strokeStyle = color;
|
|
261
|
+
ctx2d.lineWidth = Math.max(0.6, R * 0.12);
|
|
262
|
+
ctx2d.beginPath();
|
|
263
|
+
ctx2d.ellipse(it.pt.x, it.pt.y, R * 1.9, R * 0.62, -0.5, 0, Math.PI * 2);
|
|
264
|
+
ctx2d.stroke();
|
|
265
|
+
}
|
|
266
|
+
ctx2d.globalAlpha = 1;
|
|
267
|
+
};
|
|
268
|
+
for (const it of far) drawPlanet(it);
|
|
269
|
+
|
|
270
|
+
// 太阳(远行星之上、近行星之下)
|
|
271
|
+
const breathe = 0.9 + 0.1 * Math.sin(ms / 2400);
|
|
272
|
+
const glowR = sunR * 4.4;
|
|
273
|
+
const grad = ctx2d.createRadialGradient(sx, sy, sunR * 0.4, sx, sy, glowR);
|
|
274
|
+
grad.addColorStop(0, T.sunInner + (0.30 * breathe).toFixed(3) + ")");
|
|
275
|
+
grad.addColorStop(1, T.sunOuter + "0)");
|
|
276
|
+
ctx2d.fillStyle = grad;
|
|
277
|
+
ctx2d.beginPath();
|
|
278
|
+
ctx2d.arc(sx, sy, glowR, 0, Math.PI * 2);
|
|
279
|
+
ctx2d.fill();
|
|
280
|
+
ctx2d.fillStyle = T.sunCore;
|
|
281
|
+
ctx2d.beginPath();
|
|
282
|
+
ctx2d.arc(sx, sy, sunR, 0, Math.PI * 2);
|
|
283
|
+
ctx2d.fill();
|
|
284
|
+
|
|
285
|
+
for (const it of near) drawPlanet(it);
|
|
286
|
+
|
|
287
|
+
// ---- 4. 小行星带(椭圆投影,缓慢自转)----
|
|
288
|
+
beltRot += dt * 0.00018;
|
|
289
|
+
const beltRx = baseR * (PLANETS[3].o + PLANETS[4].o) / 2; // 木火之间
|
|
290
|
+
const beltRy = beltRx * CONFIG.axisFlat;
|
|
291
|
+
ctx2d.fillStyle = T.belt + "0.7)";
|
|
292
|
+
for (const b of beltDots) {
|
|
293
|
+
const pt = orbitPoint(sx, sy, beltRx * (1 + b.rr), beltRy * (1 + b.rr),
|
|
294
|
+
dirX, dirY, perpX, perpY, b.a + beltRot);
|
|
295
|
+
ctx2d.beginPath();
|
|
296
|
+
ctx2d.arc(pt.x, pt.y, b.s, 0, Math.PI * 2);
|
|
297
|
+
ctx2d.fill();
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// ---- 5. 流星(渐变尾迹,画在最上层)----
|
|
301
|
+
meteorWait -= dt;
|
|
302
|
+
if (meteorWait <= 0 && meteors.length < 2) {
|
|
303
|
+
meteors.push(makeMeteor(w, h));
|
|
304
|
+
meteorWait = rand(CONFIG.meteorMinWait, CONFIG.meteorMaxWait);
|
|
305
|
+
}
|
|
306
|
+
for (let i = meteors.length - 1; i >= 0; i--) {
|
|
307
|
+
const m = meteors[i];
|
|
308
|
+
m.x += m.vx * (dt / 16.7);
|
|
309
|
+
m.y += m.vy * (dt / 16.7);
|
|
310
|
+
m.age++;
|
|
311
|
+
if (m.age > m.life || m.x < -160 || m.x > w + 160 || m.y > h + 160) {
|
|
312
|
+
meteors.splice(i, 1);
|
|
313
|
+
continue;
|
|
314
|
+
}
|
|
315
|
+
const fadeIn = clamp(m.age / 12, 0, 1);
|
|
316
|
+
const fadeOut = clamp((m.life - m.age) / 25, 0, 1);
|
|
317
|
+
const alpha = Math.min(fadeIn, fadeOut) * 0.9;
|
|
318
|
+
const tailX = m.x - m.vx * m.len * 0.05;
|
|
319
|
+
const tailY = m.y - m.vy * m.len * 0.05;
|
|
320
|
+
const tail = ctx2d.createLinearGradient(m.x, m.y, tailX, tailY);
|
|
321
|
+
tail.addColorStop(0, T.meteorTail + alpha.toFixed(3) + ")");
|
|
322
|
+
tail.addColorStop(1, T.meteorTail + "0)");
|
|
323
|
+
ctx2d.strokeStyle = tail;
|
|
324
|
+
ctx2d.lineWidth = m.w;
|
|
325
|
+
ctx2d.lineCap = "round";
|
|
326
|
+
ctx2d.beginPath();
|
|
327
|
+
ctx2d.moveTo(m.x, m.y);
|
|
328
|
+
ctx2d.lineTo(tailX, tailY);
|
|
329
|
+
ctx2d.stroke();
|
|
330
|
+
ctx2d.fillStyle = T.meteorHead + alpha.toFixed(3) + ")";
|
|
331
|
+
ctx2d.beginPath();
|
|
332
|
+
ctx2d.arc(m.x, m.y, m.w * 0.85, 0, Math.PI * 2);
|
|
333
|
+
ctx2d.fill();
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
if (keepLoop) animId = requestAnimationFrame((t) => render(t, true));
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
return {
|
|
340
|
+
apply(ctx) {
|
|
341
|
+
if (typeof document === "undefined") return;
|
|
342
|
+
mounted = true;
|
|
343
|
+
// 面板半透明:皮肤 CSS 的半透明公式引用 --dsw-skin-scrim。
|
|
344
|
+
// canvas 皮肤没有 backgroundMedia,激活时皮肤中心会把 scrim 写成 0
|
|
345
|
+
// → 输入框/两侧面板变实心遮住画布。这里自设 scrim=1 让面板恢复毛玻璃,
|
|
346
|
+
// 卸载时还原。
|
|
347
|
+
const prevScrim = document.body.style.getPropertyValue("--dsw-skin-scrim");
|
|
348
|
+
document.body.style.setProperty("--dsw-skin-scrim", "1");
|
|
349
|
+
// 毛玻璃中和器:canvas 皮肤没有 backgroundMedia,皮肤中心的官方
|
|
350
|
+
// backdrop 场景中和器不会激活(它只认 data-dsh-backdrop-active)。
|
|
351
|
+
// 这里按同款规则自注入:清除输入座位底部遮挡渐变 + 给输入卡加模糊。
|
|
352
|
+
// 模糊强度复用官方变量 --dsh-input-card-blur(设置里可调)。
|
|
353
|
+
frostStyle = document.createElement("style");
|
|
354
|
+
frostStyle.id = "dsh-canvas-frost";
|
|
355
|
+
frostStyle.textContent =
|
|
356
|
+
"[data-composer-seat],[data-composer-seat]::before{background:none !important;backdrop-filter:none !important;-webkit-backdrop-filter:none !important;}" +
|
|
357
|
+
"[data-composer-card]{backdrop-filter:blur(var(--dsh-input-card-blur,10px)) !important;-webkit-backdrop-filter:blur(var(--dsh-input-card-blur,10px)) !important;}";
|
|
358
|
+
document.head.appendChild(frostStyle);
|
|
359
|
+
canvas = document.createElement("canvas");
|
|
360
|
+
canvas.id = "dsh-solar-bg-canvas";
|
|
361
|
+
canvas.style.cssText = "position: fixed; inset: 0; width: 100vw; height: 100vh; pointer-events: none; z-index: 0;";
|
|
362
|
+
document.body.appendChild(canvas);
|
|
363
|
+
ctx2d = canvas.getContext("2d");
|
|
364
|
+
resize();
|
|
365
|
+
const reduced = window.matchMedia && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
366
|
+
if (reduced) {
|
|
367
|
+
lastNow = performance.now();
|
|
368
|
+
render(lastNow, false);
|
|
369
|
+
} else {
|
|
370
|
+
lastNow = performance.now();
|
|
371
|
+
animId = requestAnimationFrame((t) => render(t, true));
|
|
372
|
+
}
|
|
373
|
+
window.addEventListener("resize", resize);
|
|
374
|
+
|
|
375
|
+
ctx.onCleanup(() => {
|
|
376
|
+
mounted = false;
|
|
377
|
+
if (animId) cancelAnimationFrame(animId);
|
|
378
|
+
animId = 0;
|
|
379
|
+
if (prevScrim === "") document.body.style.removeProperty("--dsw-skin-scrim");
|
|
380
|
+
else document.body.style.setProperty("--dsw-skin-scrim", prevScrim);
|
|
381
|
+
if (frostStyle && frostStyle.parentNode) frostStyle.parentNode.removeChild(frostStyle);
|
|
382
|
+
frostStyle = null;
|
|
383
|
+
window.removeEventListener("resize", resize);
|
|
384
|
+
if (canvas && canvas.parentNode) canvas.parentNode.removeChild(canvas);
|
|
385
|
+
canvas = null;
|
|
386
|
+
ctx2d = null;
|
|
387
|
+
meteors = [];
|
|
388
|
+
stars = [];
|
|
389
|
+
beltDots = [];
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
};
|
|
393
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kkabuka/dsh-skin-solar-orbit",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "2.5D Solar System orbit skin for dsh skin center v2 — perspective giant planets, meteors, parallax starfield",
|
|
5
|
+
"main": "skin.json",
|
|
6
|
+
"files": [
|
|
7
|
+
"skin.json",
|
|
8
|
+
"hooks.mjs",
|
|
9
|
+
"skin.css",
|
|
10
|
+
"patches.css",
|
|
11
|
+
"README.md"
|
|
12
|
+
],
|
|
13
|
+
"keywords": [
|
|
14
|
+
"dsh",
|
|
15
|
+
"dsh-skin",
|
|
16
|
+
"solar",
|
|
17
|
+
"orbit",
|
|
18
|
+
"planets",
|
|
19
|
+
"meteor",
|
|
20
|
+
"canvas",
|
|
21
|
+
"skin-center"
|
|
22
|
+
],
|
|
23
|
+
"author": "kkabuka",
|
|
24
|
+
"license": "MIT"
|
|
25
|
+
}
|
package/patches.css
ADDED
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/* 浅色模式背景与深色模式背景自适应 */
|
|
2
|
+
html, body { background-color: #f4f6fb !important; }
|
|
3
|
+
body[data-ds-dark-theme], html:has(body[data-ds-dark-theme]) { background-color: #0a0f1e !important; }
|
|
4
|
+
#dsh-triangle-bg-canvas { z-index: 0 !important; }
|
|
5
|
+
|
|
6
|
+
#dsh-triangle-bg-canvas {
|
|
7
|
+
position: fixed !important;
|
|
8
|
+
inset: 0 !important;
|
|
9
|
+
width: 100vw !important;
|
|
10
|
+
height: 100vh !important;
|
|
11
|
+
pointer-events: none !important;
|
|
12
|
+
z-index: 1 !important;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
[id="root"] {
|
|
16
|
+
background: none;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
a {
|
|
20
|
+
color: #3c4e92;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
a:visited {
|
|
24
|
+
color: #6a5fa8;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
body[data-ds-dark-theme] a {
|
|
28
|
+
color: #94a8dc;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
body[data-ds-dark-theme] a:visited {
|
|
32
|
+
color: #a58fdc;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
:focus-visible {
|
|
36
|
+
outline: 2px solid var(--dsw-alias-state-business-primary);
|
|
37
|
+
outline-offset: 2px;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
[data-pane="sidebar"] {
|
|
41
|
+
color: var(--dsw-alias-label-primary);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
[role="tooltip"] {
|
|
45
|
+
background: var(--dsw-alias-tooltip-bg);
|
|
46
|
+
color: var(--dsw-alias-tooltip-fg);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
[role="dialog"], [role="dialog"] [class*="navCell"]:not([aria-current="true"]) {
|
|
50
|
+
color: var(--dsw-alias-label-primary);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
button[role="tab"], button[role="tab"]:hover, button[role="tab"]:active, button[role="tab"]:disabled, button[role="tab"]:hover:not(:disabled), button[role="tab"]:active:not(:disabled) {
|
|
54
|
+
box-shadow: none;
|
|
55
|
+
text-shadow: none;
|
|
56
|
+
color: var(--dsw-alias-label-primary);
|
|
57
|
+
filter: none;
|
|
58
|
+
opacity: 1;
|
|
59
|
+
background-color: #0000;
|
|
60
|
+
background-image: none;
|
|
61
|
+
border: 0;
|
|
62
|
+
transform: none;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
[data-aionui-explorer-col], [data-aionui-preview-col], .aionui-root {
|
|
66
|
+
backdrop-filter: blur(12px);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.aionui-dialog, .aionui-menu, .aionui-toast {
|
|
70
|
+
backdrop-filter: blur(14px);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.aionui-overlay {
|
|
74
|
+
background: #1c254666;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
body[data-ds-dark-theme] .aionui-overlay {
|
|
78
|
+
background: #0000008c;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
button, a, .aionui-btn, .aionui-menu-item, .aionui-explorer-handle, .aionui-preview-handle {
|
|
82
|
+
transition: background-color .13s, border-color .13s, box-shadow .13s, color .13s, opacity .13s;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
::-webkit-scrollbar-thumb {
|
|
86
|
+
transition: background-color .13s;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
a:hover {
|
|
90
|
+
color: #2c3765;
|
|
91
|
+
text-decoration: underline;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
a:active {
|
|
95
|
+
color: #222b4d;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
body[data-ds-dark-theme] a:hover {
|
|
99
|
+
color: #b4c3e8;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
body[data-ds-dark-theme] a:active {
|
|
103
|
+
color: #c9d4ef;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
button:disabled, .aionui-btn:disabled, .aionui-menu-item-disabled {
|
|
107
|
+
opacity: .55;
|
|
108
|
+
cursor: not-allowed;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.aionui-btn:disabled:hover, .aionui-menu-item-disabled:hover {
|
|
112
|
+
box-shadow: none;
|
|
113
|
+
background-color: #0000;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.aionui-explorer-handle, .aionui-preview-handle {
|
|
117
|
+
background: #d8dfec;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.aionui-explorer-handle:hover, .aionui-preview-handle:hover {
|
|
121
|
+
background: #7f96d2;
|
|
122
|
+
box-shadow: 0 0 6px #4a5fa866;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
body[data-ds-dark-theme] .aionui-explorer-handle, body[data-ds-dark-theme] .aionui-preview-handle {
|
|
126
|
+
background: #33406a;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
body[data-ds-dark-theme] .aionui-explorer-handle:hover, body[data-ds-dark-theme] .aionui-preview-handle:hover {
|
|
130
|
+
background: #6276a5;
|
|
131
|
+
box-shadow: 0 0 6px #7f96d266;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.aionui-floating-expand:hover {
|
|
135
|
+
background: #e4eaf7;
|
|
136
|
+
border-color: #647ebf;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.aionui-floating-expand:active {
|
|
140
|
+
background: #dce3f7;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
body[data-ds-dark-theme] .aionui-floating-expand:hover {
|
|
144
|
+
background: #2c3765;
|
|
145
|
+
border-color: #647ebf;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
body[data-ds-dark-theme] .aionui-floating-expand:active {
|
|
149
|
+
background: #33417a;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.aionui-collapse-chevron:hover {
|
|
153
|
+
color: #647ebf;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
body[data-ds-dark-theme] .aionui-collapse-chevron:hover {
|
|
157
|
+
color: #a5b7e2;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.aionui-menu-item:not(.aionui-menu-item-disabled):hover {
|
|
161
|
+
background: #4a5fa81f;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
body[data-ds-dark-theme] .aionui-menu-item:not(.aionui-menu-item-disabled):hover {
|
|
165
|
+
background: #a0b9eb29;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
@media (prefers-reduced-motion: reduce) {
|
|
169
|
+
button, a, .aionui-btn, .aionui-menu-item, .aionui-explorer-handle, .aionui-preview-handle, ::-webkit-scrollbar-thumb {
|
|
170
|
+
transition: none;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
[data-gitgraph-lanes] > [data-gitgraph-glyph="node"]:nth-child(6n+1), [data-gitgraph-lanes] > [data-gitgraph-glyph="merge"]:nth-child(6n+1) {
|
|
175
|
+
color: #4a5fa8;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
[data-gitgraph-lanes] > [data-gitgraph-glyph="node"]:nth-child(6n+2), [data-gitgraph-lanes] > [data-gitgraph-glyph="merge"]:nth-child(6n+2) {
|
|
179
|
+
color: #2e8e52;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
[data-gitgraph-lanes] > [data-gitgraph-glyph="node"]:nth-child(6n+3), [data-gitgraph-lanes] > [data-gitgraph-glyph="merge"]:nth-child(6n+3) {
|
|
183
|
+
color: #c08a33;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
[data-gitgraph-lanes] > [data-gitgraph-glyph="node"]:nth-child(6n+4), [data-gitgraph-lanes] > [data-gitgraph-glyph="merge"]:nth-child(6n+4) {
|
|
187
|
+
color: #647ebf;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
[data-gitgraph-lanes] > [data-gitgraph-glyph="node"]:nth-child(6n+5), [data-gitgraph-lanes] > [data-gitgraph-glyph="merge"]:nth-child(6n+5) {
|
|
191
|
+
color: #3c4e92;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
[data-gitgraph-lanes] > [data-gitgraph-glyph="node"]:nth-child(6n), [data-gitgraph-lanes] > [data-gitgraph-glyph="merge"]:nth-child(6n) {
|
|
195
|
+
color: #58b058;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
body[data-ds-dark-theme] [data-gitgraph-lanes] > [data-gitgraph-glyph="node"]:nth-child(6n+1), body[data-ds-dark-theme] [data-gitgraph-lanes] > [data-gitgraph-glyph="merge"]:nth-child(6n+1) {
|
|
199
|
+
color: #7f96d2;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
body[data-ds-dark-theme] [data-gitgraph-lanes] > [data-gitgraph-glyph="node"]:nth-child(6n+2), body[data-ds-dark-theme] [data-gitgraph-lanes] > [data-gitgraph-glyph="merge"]:nth-child(6n+2) {
|
|
203
|
+
color: #58b058;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
body[data-ds-dark-theme] [data-gitgraph-lanes] > [data-gitgraph-glyph="node"]:nth-child(6n+3), body[data-ds-dark-theme] [data-gitgraph-lanes] > [data-gitgraph-glyph="merge"]:nth-child(6n+3) {
|
|
207
|
+
color: #d9a94f;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
body[data-ds-dark-theme] [data-gitgraph-lanes] > [data-gitgraph-glyph="node"]:nth-child(6n+4), body[data-ds-dark-theme] [data-gitgraph-lanes] > [data-gitgraph-glyph="merge"]:nth-child(6n+4) {
|
|
211
|
+
color: #94a8dc;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
body[data-ds-dark-theme] [data-gitgraph-lanes] > [data-gitgraph-glyph="node"]:nth-child(6n+5), body[data-ds-dark-theme] [data-gitgraph-lanes] > [data-gitgraph-glyph="merge"]:nth-child(6n+5) {
|
|
215
|
+
color: #647ebf;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
body[data-ds-dark-theme] [data-gitgraph-lanes] > [data-gitgraph-glyph="node"]:nth-child(6n), body[data-ds-dark-theme] [data-gitgraph-lanes] > [data-gitgraph-glyph="merge"]:nth-child(6n) {
|
|
219
|
+
color: #7cc97c;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
[data-gitgraph-ref]:not([data-gitgraph-ref-current]) {
|
|
223
|
+
background: #4a5fa81f;
|
|
224
|
+
border: 1px solid #2c3a7333;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
body[data-ds-dark-theme] [data-gitgraph-ref]:not([data-gitgraph-ref-current]) {
|
|
228
|
+
background: #a0b9eb24;
|
|
229
|
+
border-color: #a0b4e633;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
div:has( > div > [data-gitgraph-chip]) {
|
|
233
|
+
--dsw-alias-button-tool-bar-fill: #4a5fa814;
|
|
234
|
+
--dsw-alias-border-l2: #4a5fa861;
|
|
235
|
+
--dsw-alias-label-secondary: #2c3765;
|
|
236
|
+
--dsw-alias-label-tertiary: #647ebf;
|
|
237
|
+
--dsw-alias-interactive-bg-hover: #4a5fa824;
|
|
238
|
+
--dsw-alias-interactive-bg-active: #4a5fa833;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
body[data-ds-dark-theme] div:has( > div > [data-gitgraph-chip]) {
|
|
242
|
+
--dsw-alias-button-tool-bar-fill: #a0b9eb14;
|
|
243
|
+
--dsw-alias-border-l2: #a0b4e661;
|
|
244
|
+
--dsw-alias-label-secondary: #c9d4ef;
|
|
245
|
+
--dsw-alias-label-tertiary: #8b9cbc;
|
|
246
|
+
--dsw-alias-interactive-bg-hover: #a0b9eb24;
|
|
247
|
+
--dsw-alias-interactive-bg-active: #a0b9eb38;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
div:has( > div > [data-gitgraph-chip]) > button[aria-expanded="true"], [data-gitgraph-chip][aria-expanded="true"] {
|
|
251
|
+
background-color: #4a5fa829;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
body[data-ds-dark-theme] div:has( > div > [data-gitgraph-chip]) > button[aria-expanded="true"], body[data-ds-dark-theme] [data-gitgraph-chip][aria-expanded="true"] {
|
|
255
|
+
background-color: #a0b9eb2e;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
[data-phase="active"] [class*="composerSeat"] {
|
|
259
|
+
background: none !important;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
[data-phase="active"] [class*="composerSeat"]:before {
|
|
263
|
+
content: "";
|
|
264
|
+
z-index: -1;
|
|
265
|
+
pointer-events: none;
|
|
266
|
+
backdrop-filter: blur(6px);
|
|
267
|
+
background: linear-gradient(#0000 0, #e8ecf5db 36px);
|
|
268
|
+
position: absolute;
|
|
269
|
+
inset: 0;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
body[data-ds-dark-theme] [data-phase="active"] [class*="composerSeat"]:before {
|
|
273
|
+
backdrop-filter: blur(6px);
|
|
274
|
+
background: linear-gradient(#0000 0, #101624d1 36px);
|
|
275
|
+
}
|
package/skin.css
ADDED
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
color: #1f2937;
|
|
3
|
+
background-color: transparent;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
body[data-ds-dark-theme] {
|
|
7
|
+
color: #dbe2f2;
|
|
8
|
+
background-color: transparent;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
:root {
|
|
12
|
+
--dsw-alias-bg-base: rgba(255, 255, 255, calc(var(--dsw-skin-scrim, 0) * .45));
|
|
13
|
+
--dsw-alias-bg-layer-1: rgba(243, 245, 251, calc(1 - var(--dsw-skin-scrim, 0) * .5));
|
|
14
|
+
--dsw-alias-bg-layer-2: rgba(233, 237, 247, calc(1 - var(--dsw-skin-scrim, 0) * .45));
|
|
15
|
+
--dsw-alias-bg-layer-3: rgba(221, 227, 241, calc(1 - var(--dsw-skin-scrim, 0) * .42));
|
|
16
|
+
--dsw-alias-bg-mask-1: #1c254666;
|
|
17
|
+
--dsw-alias-bg-mask-2: #1c254633;
|
|
18
|
+
--dsw-alias-bg-mask-3: #1c254680;
|
|
19
|
+
--dsw-alias-bg-mask-photo: #101424e0;
|
|
20
|
+
--dsw-alias-bg-module-platform: rgba(233, 237, 247, calc(1 - var(--dsw-skin-scrim, 0) * .45));
|
|
21
|
+
--dsw-alias-bg-multi-select: #dce3f7cc;
|
|
22
|
+
--dsw-alias-bg-overlay: #eef1f9eb;
|
|
23
|
+
--dsw-alias-bg-skeleton: #1c25460f;
|
|
24
|
+
--dsw-alias-border-inverted2: #fff9;
|
|
25
|
+
--dsw-alias-border-inverted: #fff6;
|
|
26
|
+
--dsw-alias-border-l1: #2c3a7326;
|
|
27
|
+
--dsw-alias-border-l2-darkmode-thin: #2c3a7333;
|
|
28
|
+
--dsw-alias-border-l2: #2c3a7338;
|
|
29
|
+
--dsw-alias-border-l3: #2c3a7352;
|
|
30
|
+
--dsw-alias-border-l4: #2c3a736b;
|
|
31
|
+
--dsw-alias-brand-primary-invert: #fff;
|
|
32
|
+
--dsw-alias-brand-primary-new-colorprimary-new-color: #4d86f8;
|
|
33
|
+
--dsw-alias-brand-primary: #4d86f8;
|
|
34
|
+
--dsw-alias-brand-text: #222b4d;
|
|
35
|
+
--dsw-alias-button-contrast-fill: #3b72e2;
|
|
36
|
+
--dsw-alias-button-elevated-fill: #fff;
|
|
37
|
+
--dsw-alias-button-floating-fill: #fff;
|
|
38
|
+
--dsw-alias-button-floating-hover: #e9edf7;
|
|
39
|
+
--dsw-alias-button-ghost-active-border: #a5b7e2;
|
|
40
|
+
--dsw-alias-button-ghost-active-fill: #dce3f7;
|
|
41
|
+
--dsw-alias-button-ghost-active-hover: #c3cfee;
|
|
42
|
+
--dsw-alias-button-info-fill: #4d86f8;
|
|
43
|
+
--dsw-alias-button-info-hover: #5d74c4;
|
|
44
|
+
--dsw-alias-button-primary-dimmed: #dce3f7;
|
|
45
|
+
--dsw-alias-button-primary-fill: #4d86f8;
|
|
46
|
+
--dsw-alias-button-primary-hover: #5d74c4;
|
|
47
|
+
--dsw-alias-button-tool-bar-fill-invisible: #4d86f85c;
|
|
48
|
+
--dsw-alias-button-tool-bar-fill: #4d86f880;
|
|
49
|
+
--dsw-alias-button-tool-bar-hover: #4d86f899;
|
|
50
|
+
--dsw-alias-interactive-bg-active: #4d86f824;
|
|
51
|
+
--dsw-alias-interactive-bg-hover-accent: #4d86f82e;
|
|
52
|
+
--dsw-alias-interactive-bg-hover-danger: #c000000f;
|
|
53
|
+
--dsw-alias-interactive-bg-hover-solid: #e4eaf7;
|
|
54
|
+
--dsw-alias-interactive-bg-hover: #4d86f814;
|
|
55
|
+
--dsw-alias-label-caption: #7c8bab;
|
|
56
|
+
--dsw-alias-label-dimmed: #909dbb;
|
|
57
|
+
--dsw-alias-label-primary-dimmed: #3e4b6d;
|
|
58
|
+
--dsw-alias-label-primary-foreground: #fff;
|
|
59
|
+
--dsw-alias-label-primary-inverted: #fff;
|
|
60
|
+
--dsw-alias-label-primary: #1f2937;
|
|
61
|
+
--dsw-alias-label-secondary: #3e4b6d;
|
|
62
|
+
--dsw-alias-label-tertiary: #5f6e93;
|
|
63
|
+
--dsw-alias-markdown-citation: #e9edf799;
|
|
64
|
+
--dsw-alias-markdown-code-block-banner: #f3f5fb94;
|
|
65
|
+
--dsw-alias-markdown-code-block: #f3f5fb94;
|
|
66
|
+
--dsw-alias-markdown-code-segment-selected: #fffc;
|
|
67
|
+
--dsw-alias-markdown-code-segment-unselected: #eef1f999;
|
|
68
|
+
--dsw-alias-markdown-inline-code: #e7ecf599;
|
|
69
|
+
--dsw-alias-markdown-placeholder: #f3f5fb94;
|
|
70
|
+
--dsw-alias-markdown-tag: #e7ecf599;
|
|
71
|
+
--dsw-alias-scrollbar-bg-l1: #d8dfec;
|
|
72
|
+
--dsw-alias-scrollbar-bg-l2: #d8dfec;
|
|
73
|
+
--dsw-alias-scrollbar-hover-l1: #a5b7e2;
|
|
74
|
+
--dsw-alias-scrollbar-hover-l2: #a5b7e2;
|
|
75
|
+
--dsw-alias-state-business-primary: #4d86f8;
|
|
76
|
+
--dsw-alias-state-business-tertiary: #dce3f7;
|
|
77
|
+
--dsw-alias-state-error-primary: #c00000;
|
|
78
|
+
--dsw-alias-state-error-secondary: #e05c5c;
|
|
79
|
+
--dsw-alias-state-success-primary: #2e8e52;
|
|
80
|
+
--dsw-alias-state-success-secondary: #58b058;
|
|
81
|
+
--dsw-alias-state-success-tertiary: #dcefe2;
|
|
82
|
+
--dsw-alias-state-warn-label: #a3732a;
|
|
83
|
+
--dsw-alias-state-warn-primary: #c08a33;
|
|
84
|
+
--dsw-alias-state-warn-secondary: #d9a94f;
|
|
85
|
+
--dsw-alias-state-warn-tertiary: #f7ecd8;
|
|
86
|
+
--dsw-alias-toast-bg: #3b72e2;
|
|
87
|
+
--dsw-alias-tooltip-bg: #ffffe1;
|
|
88
|
+
--dsw-alias-tooltip-fg: #1a2238;
|
|
89
|
+
--dsw-specific-bubble-highlight: #c3cfee;
|
|
90
|
+
--dsw-specific-bubble: #dce3f7;
|
|
91
|
+
--dsw-specific-input-major: rgba(255, 255, 255, calc(1 - var(--dsw-skin-scrim, 0) * .4));
|
|
92
|
+
--dsw-specific-login-input: rgba(255, 255, 255, calc(1 - var(--dsw-skin-scrim, 0) * .4));
|
|
93
|
+
--dsw-specific-menu: #f3f5fbf0;
|
|
94
|
+
--dsw-specific-selector: #e4eaf7d9;
|
|
95
|
+
--dsw-specific-sidebar-fill: rgba(242, 245, 250, calc(1 - var(--dsw-skin-scrim, 0) * .5));
|
|
96
|
+
--dsw-specific-sidebar-nav-item-active-accent: #a5b7e2;
|
|
97
|
+
--dsw-specific-sidebar-nav-item-active: #dce3f7;
|
|
98
|
+
--dsw-specific-sidebar-nav-item-hover: #e4eaf7;
|
|
99
|
+
--dsw-specific-tip: #f3f5fb;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
body[data-ds-dark-theme] {
|
|
103
|
+
--dsw-alias-bg-base: rgba(16, 22, 42, calc(var(--dsw-skin-scrim, 0) * .5));
|
|
104
|
+
--dsw-alias-bg-layer-1: rgba(26, 34, 56, calc(1 - var(--dsw-skin-scrim, 0) * .45));
|
|
105
|
+
--dsw-alias-bg-layer-2: rgba(32, 42, 68, calc(1 - var(--dsw-skin-scrim, 0) * .4));
|
|
106
|
+
--dsw-alias-bg-layer-3: rgba(38, 50, 79, calc(1 - var(--dsw-skin-scrim, 0) * .36));
|
|
107
|
+
--dsw-alias-bg-mask-1: #0000008c;
|
|
108
|
+
--dsw-alias-bg-mask-2: #0000004d;
|
|
109
|
+
--dsw-alias-bg-mask-3: #0009;
|
|
110
|
+
--dsw-alias-bg-mask-photo: #060914e6;
|
|
111
|
+
--dsw-alias-bg-module-platform: rgba(32, 42, 68, calc(1 - var(--dsw-skin-scrim, 0) * .4));
|
|
112
|
+
--dsw-alias-bg-multi-select: #2c3765cc;
|
|
113
|
+
--dsw-alias-bg-overlay: #1a2238eb;
|
|
114
|
+
--dsw-alias-bg-skeleton: #ffffff0f;
|
|
115
|
+
--dsw-alias-border-inverted2: #fff9;
|
|
116
|
+
--dsw-alias-border-inverted: #fff6;
|
|
117
|
+
--dsw-alias-border-l1: #a0b4e61f;
|
|
118
|
+
--dsw-alias-border-l2-darkmode-thin: #a0b4e626;
|
|
119
|
+
--dsw-alias-border-l2: #a0b4e62e;
|
|
120
|
+
--dsw-alias-border-l3: #a0b4e642;
|
|
121
|
+
--dsw-alias-border-l4: #a0b4e657;
|
|
122
|
+
--dsw-alias-brand-primary-invert: #10141f;
|
|
123
|
+
--dsw-alias-brand-primary-new-colorprimary-new-color: #7f96d2;
|
|
124
|
+
--dsw-alias-brand-primary: #7f96d2;
|
|
125
|
+
--dsw-alias-brand-text: #c3cfee;
|
|
126
|
+
--dsw-alias-button-contrast-fill: #3b72e2;
|
|
127
|
+
--dsw-alias-button-elevated-fill: #202a44;
|
|
128
|
+
--dsw-alias-button-floating-fill: #1a2238;
|
|
129
|
+
--dsw-alias-button-floating-hover: #2c3765;
|
|
130
|
+
--dsw-alias-button-ghost-active-border: #647ebf;
|
|
131
|
+
--dsw-alias-button-ghost-active-fill: #2c3765;
|
|
132
|
+
--dsw-alias-button-ghost-active-hover: #33417a;
|
|
133
|
+
--dsw-alias-button-info-fill: #3b72e2;
|
|
134
|
+
--dsw-alias-button-info-hover: #4d86f8;
|
|
135
|
+
--dsw-alias-button-primary-dimmed: #33417a;
|
|
136
|
+
--dsw-alias-button-primary-fill: #3b72e2;
|
|
137
|
+
--dsw-alias-button-primary-hover: #4d86f8;
|
|
138
|
+
--dsw-alias-button-tool-bar-fill-invisible: #a0b9eb5c;
|
|
139
|
+
--dsw-alias-button-tool-bar-fill: #a0b9eb80;
|
|
140
|
+
--dsw-alias-button-tool-bar-hover: #a0b9eb99;
|
|
141
|
+
--dsw-alias-interactive-bg-active: #a0b9eb24;
|
|
142
|
+
--dsw-alias-interactive-bg-hover-accent: #a0b9eb33;
|
|
143
|
+
--dsw-alias-interactive-bg-hover-danger: #e05c5c1f;
|
|
144
|
+
--dsw-alias-interactive-bg-hover-solid: #2c3765;
|
|
145
|
+
--dsw-alias-interactive-bg-hover: #ffffff12;
|
|
146
|
+
--dsw-alias-label-caption: #788bb4;
|
|
147
|
+
--dsw-alias-label-dimmed: #6276a5;
|
|
148
|
+
--dsw-alias-label-primary-dimmed: #b4c0d6;
|
|
149
|
+
--dsw-alias-label-primary-foreground: #fff;
|
|
150
|
+
--dsw-alias-label-primary-inverted: #10141f;
|
|
151
|
+
--dsw-alias-label-primary: #dbe2f2;
|
|
152
|
+
--dsw-alias-label-secondary: #a9b7d0;
|
|
153
|
+
--dsw-alias-label-tertiary: #8b9cbc;
|
|
154
|
+
--dsw-alias-markdown-citation: #202a449e;
|
|
155
|
+
--dsw-alias-markdown-code-block-banner: #171e33a8;
|
|
156
|
+
--dsw-alias-markdown-code-block: #171e33a8;
|
|
157
|
+
--dsw-alias-markdown-code-segment-selected: #26324fbf;
|
|
158
|
+
--dsw-alias-markdown-code-segment-unselected: #1a223899;
|
|
159
|
+
--dsw-alias-markdown-inline-code: #1e27409e;
|
|
160
|
+
--dsw-alias-markdown-placeholder: #1a223899;
|
|
161
|
+
--dsw-alias-markdown-tag: #1e27409e;
|
|
162
|
+
--dsw-alias-scrollbar-bg-l1: #33406a;
|
|
163
|
+
--dsw-alias-scrollbar-bg-l2: #33406a;
|
|
164
|
+
--dsw-alias-scrollbar-hover-l1: #4d86f8;
|
|
165
|
+
--dsw-alias-scrollbar-hover-l2: #4d86f8;
|
|
166
|
+
--dsw-alias-state-business-primary: #7f96d2;
|
|
167
|
+
--dsw-alias-state-business-tertiary: #2c3765;
|
|
168
|
+
--dsw-alias-state-error-primary: #e05c5c;
|
|
169
|
+
--dsw-alias-state-error-secondary: #e07070;
|
|
170
|
+
--dsw-alias-state-success-primary: #58b058;
|
|
171
|
+
--dsw-alias-state-success-secondary: #58b058;
|
|
172
|
+
--dsw-alias-state-success-tertiary: #1e3f2c;
|
|
173
|
+
--dsw-alias-state-warn-label: #d9a94f;
|
|
174
|
+
--dsw-alias-state-warn-primary: #d9a94f;
|
|
175
|
+
--dsw-alias-state-warn-secondary: #d9a94f;
|
|
176
|
+
--dsw-alias-state-warn-tertiary: #4a3515;
|
|
177
|
+
--dsw-alias-toast-bg: #33417a;
|
|
178
|
+
--dsw-alias-tooltip-bg: #ffffe1;
|
|
179
|
+
--dsw-alias-tooltip-fg: #1a2238;
|
|
180
|
+
--dsw-specific-bubble-highlight: #33417a;
|
|
181
|
+
--dsw-specific-bubble: #2c3765;
|
|
182
|
+
--dsw-specific-input-major: rgba(26, 34, 56, calc(1 - var(--dsw-skin-scrim, 0) * .35));
|
|
183
|
+
--dsw-specific-login-input: rgba(26, 34, 56, calc(1 - var(--dsw-skin-scrim, 0) * .35));
|
|
184
|
+
--dsw-specific-menu: #1a2238f0;
|
|
185
|
+
--dsw-specific-selector: #1e2740d9;
|
|
186
|
+
--dsw-specific-sidebar-fill: rgba(29, 37, 57, calc(1 - var(--dsw-skin-scrim, 0) * .45));
|
|
187
|
+
--dsw-specific-sidebar-nav-item-active-accent: #33417a;
|
|
188
|
+
--dsw-specific-sidebar-nav-item-active: #2c3765;
|
|
189
|
+
--dsw-specific-sidebar-nav-item-hover: #202a44;
|
|
190
|
+
--dsw-specific-tip: #1a2238;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
:root {
|
|
194
|
+
--dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);
|
|
195
|
+
--dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
body::-webkit-scrollbar {
|
|
199
|
+
width: 10px;
|
|
200
|
+
height: 10px;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
body::-webkit-scrollbar-track {
|
|
204
|
+
background: #eef1f9;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
body::-webkit-scrollbar-thumb {
|
|
208
|
+
background: #b4c3e8;
|
|
209
|
+
border: 2px solid #eef1f9;
|
|
210
|
+
border-radius: 5px;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
body::-webkit-scrollbar-thumb:hover {
|
|
214
|
+
background: #7f96d2;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
body::-webkit-scrollbar-corner {
|
|
218
|
+
background: #eef1f9;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
body[data-ds-dark-theme]::-webkit-scrollbar-track, body[data-ds-dark-theme]::-webkit-scrollbar-corner {
|
|
222
|
+
background: #141a2b;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
body[data-ds-dark-theme]::-webkit-scrollbar-thumb {
|
|
226
|
+
background: #455678;
|
|
227
|
+
border-color: #141a2b;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
body[data-ds-dark-theme]::-webkit-scrollbar-thumb:hover {
|
|
231
|
+
background: #6276a5;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
body::selection {
|
|
235
|
+
color: #fff;
|
|
236
|
+
background: #4d86f8;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
body[data-ds-dark-theme]::selection {
|
|
240
|
+
color: #10141f;
|
|
241
|
+
background: #7f96d2;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
body[data-ds-dark-theme] :focus-visible {
|
|
245
|
+
outline-color: var(--dsw-alias-state-business-primary);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
:root {
|
|
249
|
+
--aion-bg-base: #fff9;
|
|
250
|
+
--aion-bg-1: #f3f5fb80;
|
|
251
|
+
--aion-bg-2: #e9edf79e;
|
|
252
|
+
--aion-bg-3: #4d86f838;
|
|
253
|
+
--aion-bg-4: #4d86f857;
|
|
254
|
+
--aion-bg-hover: #4d86f814;
|
|
255
|
+
--aion-bg-active: #4d86f824;
|
|
256
|
+
--aion-text-primary: #1f2937;
|
|
257
|
+
--aion-text-secondary: #3e4b6d;
|
|
258
|
+
--aion-text-tertiary: #5f6e93;
|
|
259
|
+
--aion-text-disabled: #909dbb;
|
|
260
|
+
--aion-primary: #4d86f8;
|
|
261
|
+
--aion-success: #2e8e52;
|
|
262
|
+
--aion-warning: #c08a33;
|
|
263
|
+
--aion-danger: #c00000;
|
|
264
|
+
--aion-brand: #a5b7e2;
|
|
265
|
+
--aion-aou-1: #eef1fb;
|
|
266
|
+
--aion-aou-2: #dce3f7;
|
|
267
|
+
--aion-aou-3: #a5b7e2;
|
|
268
|
+
--aion-aou-4: #647ebf;
|
|
269
|
+
--aion-aou-5: #4d86f8;
|
|
270
|
+
--aion-aou-6: #33417a;
|
|
271
|
+
--aion-fill-2: #4d86f80f;
|
|
272
|
+
--aion-fill-3: #4d86f824;
|
|
273
|
+
--aion-border-base: #2c3a732e;
|
|
274
|
+
--aion-overlay-shadow: 0 8px 24px #1c254640;
|
|
275
|
+
--aion-font-sans: -apple-system, "system-ui", "Segoe UI", Roboto, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", sans-serif;
|
|
276
|
+
--aion-font-mono: ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
body[data-ds-dark-theme] {
|
|
280
|
+
--aion-bg-base: #1a2238d1;
|
|
281
|
+
--aion-bg-1: #1a223880;
|
|
282
|
+
--aion-bg-2: #202a4499;
|
|
283
|
+
--aion-bg-3: #a0b4e633;
|
|
284
|
+
--aion-bg-4: #a0b9eb4d;
|
|
285
|
+
--aion-bg-hover: #a0b9eb1f;
|
|
286
|
+
--aion-bg-active: #a0b9eb33;
|
|
287
|
+
--aion-text-primary: #dbe2f2;
|
|
288
|
+
--aion-text-secondary: #a9b7d0;
|
|
289
|
+
--aion-text-tertiary: #8b9cbc;
|
|
290
|
+
--aion-text-disabled: #6276a5;
|
|
291
|
+
--aion-primary: #7f96d2;
|
|
292
|
+
--aion-success: #58b058;
|
|
293
|
+
--aion-warning: #d9a94f;
|
|
294
|
+
--aion-danger: #e05c5c;
|
|
295
|
+
--aion-brand: #a5b7e2;
|
|
296
|
+
--aion-aou-1: #202a44;
|
|
297
|
+
--aion-aou-2: #26304f;
|
|
298
|
+
--aion-aou-3: #33417a;
|
|
299
|
+
--aion-aou-4: #4d86f8;
|
|
300
|
+
--aion-aou-5: #647ebf;
|
|
301
|
+
--aion-aou-6: #94a8dc;
|
|
302
|
+
--aion-fill-2: #a0b9eb1f;
|
|
303
|
+
--aion-fill-3: #a0b9eb33;
|
|
304
|
+
--aion-border-base: #a0b4e626;
|
|
305
|
+
--aion-overlay-shadow: 0 12px 32px #00000080;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
[data-dsh-part="dialog"] {
|
|
309
|
+
backdrop-filter: blur(14px);
|
|
310
|
+
border-color: #a0b4e666;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
body[data-ds-dark-theme] [data-dsh-part="dialog"] {
|
|
314
|
+
border-color: #a0b4e638;
|
|
315
|
+
}
|
package/skin.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://schemas.linxin666.org/dsh-skin/v2.json",
|
|
3
|
+
"skinManifestVersion": 2,
|
|
4
|
+
"id": "solar-orbit",
|
|
5
|
+
"name": "太阳系轨道",
|
|
6
|
+
"nameEn": "Solar Orbit",
|
|
7
|
+
"author": "kkabuka",
|
|
8
|
+
"tagline": "自动运行的线稿太阳系 · 行星按颜色区分 · 流星偶划夜空",
|
|
9
|
+
"description": "纯自动运行的艺术化太阳系背景皮肤:八颗行星绕日公转(内快外慢),火星红、地球蓝、土星带环…… 木火之间点缀小行星带,偶有流星划过。全部原生 Canvas 实现,配色随深浅主题自适应。",
|
|
10
|
+
"tags": [
|
|
11
|
+
"solar",
|
|
12
|
+
"orbit",
|
|
13
|
+
"planets",
|
|
14
|
+
"space",
|
|
15
|
+
"meteor",
|
|
16
|
+
"canvas",
|
|
17
|
+
"animation"
|
|
18
|
+
],
|
|
19
|
+
"accent": "#e8a33d",
|
|
20
|
+
"order": 5,
|
|
21
|
+
"version": "0.1.0",
|
|
22
|
+
"contributes": {
|
|
23
|
+
"stylesheet": "skin.css",
|
|
24
|
+
"patches": "patches.css"
|
|
25
|
+
},
|
|
26
|
+
"facets": {
|
|
27
|
+
"client": {
|
|
28
|
+
"entry": "hooks.mjs",
|
|
29
|
+
"apiVersion": "x-org.linxin666.skin-center/v1alpha1"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|