@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 ADDED
@@ -0,0 +1,10 @@
1
+ # 太阳系轨道 Solar Orbit
2
+
3
+ 纯自动运行的艺术化线稿太阳系背景皮肤(皮肤中心 v2 契约):
4
+
5
+ - 太阳居中,柔和光晕 + 呼吸微光
6
+ - 八大行星绕日公转(内快外慢),按特征配色:水星灰 / 金星淡金 / 地球蓝 / 火星红 / 木星棕褐 / 土星淡金带环 / 天王星青 / 海王星深蓝
7
+ - 木火之间小行星带缓慢自转
8
+ - 星场微闪烁 + 偶有流星划过(渐变尾迹)
9
+
10
+ 流星/星空技术参照 grok-shooting-stars(MIT)。
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
+ }