dsh-theme-mineradio 2.1.1 → 2.2.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 +12 -0
- package/README.zh.md +12 -0
- package/lib/client.js +134 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -5,6 +5,18 @@ English | [中文](README.zh.md)
|
|
|
5
5
|
|
|
6
6
|
**Mineradio** is a cinematic glassmorphism theme for the DeepSeek Harness web UI — a faithful re-skin of the Mineradio "private visual radio" identity. The header, sidebar, composer, stats line, and trajectory view become panes of warm champagne glass over a near-black studio backdrop. You can put a video as wallpaper and switch it off and the stock UI comes back exactly, with no source changes to DSH itself.
|
|
7
7
|
|
|
8
|
+
## Screenshots
|
|
9
|
+
|
|
10
|
+
Real captures of the theme on the DeepSeek Harness UI — dark, light, and the settings panel:
|
|
11
|
+
|
|
12
|
+
| Dark | Light |
|
|
13
|
+
| --- | --- |
|
|
14
|
+
|  |  |
|
|
15
|
+
|
|
16
|
+

|
|
17
|
+
|
|
18
|
+
A full-size gallery is also hosted at **https://dhicoc.github.io/dsh-theme-mineradio/**.
|
|
19
|
+
|
|
8
20
|
## What ports from Mineradio
|
|
9
21
|
|
|
10
22
|
- **Champagne-gold identity** — the signature palette (`#f4d28a` champagne, `#7ad7c2` mint, `#ff5367` ember rose over a warm near-black `#08090B`) drives every alias token: surfaces, hairline strokes, text ink, buttons, scrollbars, and warm-tinted shadows with a gold bloom.
|
package/README.zh.md
CHANGED
|
@@ -5,6 +5,18 @@
|
|
|
5
5
|
|
|
6
6
|
**Mineradio** 是一套为 DeepSeek Harness Web UI 打造的影院级玻璃拟态主题——对 Mineradio「私人视觉电台」气质的忠实移植。顶栏、侧栏、输入框、状态行与轨迹视图都化作近黑演播室背景上一块块温暖的香槟金玻璃。你可以把视频设为壁纸,一键关闭后原样还原官方界面,无需改动 DSH 任何源码。
|
|
7
7
|
|
|
8
|
+
## 截图
|
|
9
|
+
|
|
10
|
+
主题在 DeepSeek Harness UI 上的实机截图——深色、浅色与设置面板:
|
|
11
|
+
|
|
12
|
+
| 深色 | 浅色 |
|
|
13
|
+
| --- | --- |
|
|
14
|
+
|  |  |
|
|
15
|
+
|
|
16
|
+

|
|
17
|
+
|
|
18
|
+
原图相册也托管在 **https://dhicoc.github.io/dsh-theme-mineradio/**。
|
|
19
|
+
|
|
8
20
|
## 从 Mineradio 移植了什么
|
|
9
21
|
|
|
10
22
|
- **香槟金身份标识** —— 招牌调色板(香槟金 `#f4d28a`、薄荷 `#7ad7c2`、余烬玫瑰 `#ff5367`,压在一层温暖的近黑 `#08090B` 之上)驱动全部 alias token:表面、发丝描边、文字墨色、按钮、滚动条,以及带金色辉光的暖调阴影。
|
package/lib/client.js
CHANGED
|
@@ -408,6 +408,7 @@ function MineradioAppearanceRow(props) {
|
|
|
408
408
|
const {
|
|
409
409
|
t,
|
|
410
410
|
setMode,
|
|
411
|
+
setTextStyle,
|
|
411
412
|
setBlur,
|
|
412
413
|
setFrost,
|
|
413
414
|
setFluidHue,
|
|
@@ -437,6 +438,7 @@ function MineradioAppearanceRow(props) {
|
|
|
437
438
|
} = props;
|
|
438
439
|
const enabled = useStore((s) => s.enabled);
|
|
439
440
|
const mode = useStore((s) => s.mode);
|
|
441
|
+
const textStyle = useStore((s) => s.textStyle);
|
|
440
442
|
const blur = useStore((s) => s.blur);
|
|
441
443
|
const frost = useStore((s) => s.frost);
|
|
442
444
|
const fluidHue = useStore((s) => s.fluidHue);
|
|
@@ -538,6 +540,23 @@ function MineradioAppearanceRow(props) {
|
|
|
538
540
|
}
|
|
539
541
|
) }) })
|
|
540
542
|
] }),
|
|
543
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: MineradioAppearanceRow_default.subGroup, children: [
|
|
544
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: MineradioAppearanceRow_default.subTitle, children: t("mineradio.textColor") }),
|
|
545
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: MineradioAppearanceRow_default.controls, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: MineradioAppearanceRow_default.row, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
546
|
+
Segmented,
|
|
547
|
+
{
|
|
548
|
+
label: t("mineradio.textColor"),
|
|
549
|
+
value: textStyle,
|
|
550
|
+
options: [
|
|
551
|
+
{ id: "champagne", label: t("mineradio.textColorChampagne") },
|
|
552
|
+
{ id: "neutral", label: t("mineradio.textColorNeutral") },
|
|
553
|
+
{ id: "mint", label: t("mineradio.textColorMint") },
|
|
554
|
+
{ id: "rose", label: t("mineradio.textColorRose") }
|
|
555
|
+
],
|
|
556
|
+
onSelect: setTextStyle
|
|
557
|
+
}
|
|
558
|
+
) }) })
|
|
559
|
+
] }),
|
|
541
560
|
mode === "mica" && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: MineradioAppearanceRow_default.subGroup, children: [
|
|
542
561
|
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: MineradioAppearanceRow_default.subTitle, children: t("mineradio.materialGroup") }),
|
|
543
562
|
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: MineradioAppearanceRow_default.controls, children: [
|
|
@@ -803,6 +822,7 @@ function createMineradioRowStore() {
|
|
|
803
822
|
init: () => ({
|
|
804
823
|
enabled: true,
|
|
805
824
|
mode: "mica",
|
|
825
|
+
textStyle: "champagne",
|
|
806
826
|
blur: 24,
|
|
807
827
|
frost: 14,
|
|
808
828
|
fluidHue: 44,
|
|
@@ -835,6 +855,7 @@ function createMineradioRowStore() {
|
|
|
835
855
|
if (revision <= d.revision) return;
|
|
836
856
|
d.enabled = next.enabled;
|
|
837
857
|
d.mode = next.mode;
|
|
858
|
+
d.textStyle = next.textStyle;
|
|
838
859
|
d.blur = next.blur;
|
|
839
860
|
d.frost = next.frost;
|
|
840
861
|
d.fluidHue = next.fluidHue;
|
|
@@ -876,6 +897,11 @@ var zh = {
|
|
|
876
897
|
"mineradio.mode": "\u6A21\u5F0F",
|
|
877
898
|
"mineradio.modeMica": "\u4E91\u6BCD\u6548\u679C",
|
|
878
899
|
"mineradio.modeCompat": "\u517C\u5BB9\u6A21\u5F0F",
|
|
900
|
+
"mineradio.textColor": "\u6587\u5B57\u989C\u8272",
|
|
901
|
+
"mineradio.textColorChampagne": "\u9999\u69DF\u91D1",
|
|
902
|
+
"mineradio.textColorNeutral": "\u4E2D\u6027",
|
|
903
|
+
"mineradio.textColorMint": "\u8584\u8377",
|
|
904
|
+
"mineradio.textColorRose": "\u73AB\u7470",
|
|
879
905
|
"mineradio.materialGroup": "\u73BB\u7483\u6750\u8D28",
|
|
880
906
|
"mineradio.decorAmbient": "\u73AF\u5883\u88C5\u9970",
|
|
881
907
|
"mineradio.decorHover": "\u60AC\u505C\u6548\u679C",
|
|
@@ -921,6 +947,11 @@ var en = {
|
|
|
921
947
|
"mineradio.mode": "Mode",
|
|
922
948
|
"mineradio.modeMica": "Mica",
|
|
923
949
|
"mineradio.modeCompat": "Compatibility",
|
|
950
|
+
"mineradio.textColor": "Text color",
|
|
951
|
+
"mineradio.textColorChampagne": "Champagne",
|
|
952
|
+
"mineradio.textColorNeutral": "Neutral",
|
|
953
|
+
"mineradio.textColorMint": "Mint",
|
|
954
|
+
"mineradio.textColorRose": "Rose",
|
|
924
955
|
"mineradio.materialGroup": "Glass material",
|
|
925
956
|
"mineradio.decorAmbient": "Ambient",
|
|
926
957
|
"mineradio.decorHover": "Hover effects",
|
|
@@ -3220,6 +3251,63 @@ var MINERADIO_TOKEN_OVERRIDES = {
|
|
|
3220
3251
|
dark: "0 0 1px rgba(0, 0, 0, 0.6), 0 12px 32px rgba(0, 0, 0, 0.55)"
|
|
3221
3252
|
}
|
|
3222
3253
|
};
|
|
3254
|
+
function hslHex(h, s, l) {
|
|
3255
|
+
const c = (1 - Math.abs(2 * l - 1)) * s;
|
|
3256
|
+
const x = c * (1 - Math.abs(h / 60 % 2 - 1));
|
|
3257
|
+
const m = l - c / 2;
|
|
3258
|
+
let r = 0, g = 0, b = 0;
|
|
3259
|
+
if (h < 60) {
|
|
3260
|
+
r = c;
|
|
3261
|
+
g = x;
|
|
3262
|
+
} else if (h < 120) {
|
|
3263
|
+
r = x;
|
|
3264
|
+
g = c;
|
|
3265
|
+
} else if (h < 180) {
|
|
3266
|
+
g = c;
|
|
3267
|
+
b = x;
|
|
3268
|
+
} else if (h < 240) {
|
|
3269
|
+
g = x;
|
|
3270
|
+
b = c;
|
|
3271
|
+
} else if (h < 300) {
|
|
3272
|
+
r = x;
|
|
3273
|
+
b = c;
|
|
3274
|
+
} else {
|
|
3275
|
+
r = c;
|
|
3276
|
+
b = x;
|
|
3277
|
+
}
|
|
3278
|
+
const hex = (v) => Math.round((v + m) * 255).toString(16).padStart(2, "0");
|
|
3279
|
+
return `#${hex(r)}${hex(g)}${hex(b)}`;
|
|
3280
|
+
}
|
|
3281
|
+
function textInkPalette(style) {
|
|
3282
|
+
if (style === "champagne") {
|
|
3283
|
+
return {
|
|
3284
|
+
light: { primary: "#2A241A", secondary: "#5C5240", tertiary: "#7A6F5A", caption: "#8F8572", dimmed: "#C8BFAB", bluish: "#A97A2A", primaryDimmed: "#4A3A1E" },
|
|
3285
|
+
dark: { primary: "#F2F0EA", secondary: "#CBC4B8", tertiary: "#98917F", caption: "#7A7468", dimmed: "#5A564C", bluish: "#E8CEA0", primaryDimmed: "#EADFC6" }
|
|
3286
|
+
};
|
|
3287
|
+
}
|
|
3288
|
+
const h = style === "mint" ? 166 : style === "rose" ? 352 : 0;
|
|
3289
|
+
const s = style === "mint" ? 0.18 : style === "rose" ? 0.15 : 0;
|
|
3290
|
+
return {
|
|
3291
|
+
light: {
|
|
3292
|
+
primary: hslHex(h, s, 0.13),
|
|
3293
|
+
secondary: hslHex(h, s, 0.32),
|
|
3294
|
+
tertiary: hslHex(h, s, 0.46),
|
|
3295
|
+
caption: hslHex(h, s, 0.53),
|
|
3296
|
+
dimmed: hslHex(h, s, 0.75),
|
|
3297
|
+
bluish: hslHex(h, Math.min(1, s + 0.12), 0.34),
|
|
3298
|
+
primaryDimmed: hslHex(h, s, 0.22)
|
|
3299
|
+
},
|
|
3300
|
+
dark: {
|
|
3301
|
+
primary: hslHex(h, s, 0.95),
|
|
3302
|
+
secondary: hslHex(h, s, 0.73),
|
|
3303
|
+
tertiary: hslHex(h, s, 0.6),
|
|
3304
|
+
caption: hslHex(h, s, 0.48),
|
|
3305
|
+
dimmed: hslHex(h, s, 0.36),
|
|
3306
|
+
bluish: hslHex(h, Math.min(1, s + 0.12), 0.8),
|
|
3307
|
+
primaryDimmed: hslHex(h, s, 0.88)
|
|
3308
|
+
}
|
|
3309
|
+
};
|
|
3310
|
+
}
|
|
3223
3311
|
var COMPAT_SURFACE_OVERRIDES = {
|
|
3224
3312
|
"--dsw-alias-bg-layer-1": { light: "rgba(255, 255, 255, 0.55)", dark: "color-mix(in srgb, rgb(17 26 39) calc(55% * var(--dsh-aqua-frost, 1)), transparent)" },
|
|
3225
3313
|
"--dsw-alias-bg-layer-2": { light: "rgba(236, 242, 250, 0.5)", dark: "color-mix(in srgb, rgb(22 33 48) calc(55% * var(--dsh-aqua-frost, 1)), transparent)" },
|
|
@@ -3260,6 +3348,7 @@ function writeEnabled(value) {
|
|
|
3260
3348
|
}
|
|
3261
3349
|
var SETTINGS_DEFAULTS = {
|
|
3262
3350
|
mode: "mica",
|
|
3351
|
+
textStyle: "champagne",
|
|
3263
3352
|
blur: 22,
|
|
3264
3353
|
frost: 50,
|
|
3265
3354
|
bgBrightness: 50,
|
|
@@ -3302,6 +3391,7 @@ var NUMERIC_KEYS = {
|
|
|
3302
3391
|
videoBrightness: "dsh.ui-mineradio.videoBrightness"
|
|
3303
3392
|
};
|
|
3304
3393
|
var MODE_KEY = "dsh.ui-mineradio.mode";
|
|
3394
|
+
var TEXT_STYLE_KEY = "dsh.ui-mineradio.textStyle";
|
|
3305
3395
|
var BACKGROUND_KEY = "dsh.ui-mineradio.background";
|
|
3306
3396
|
var WALLPAPER_KEY = "dsh.ui-mineradio.wallpaper";
|
|
3307
3397
|
var AUTO_TINT_KEY = "dsh.ui-mineradio.autoTint";
|
|
@@ -3358,6 +3448,20 @@ function writeMode(value) {
|
|
|
3358
3448
|
} catch {
|
|
3359
3449
|
}
|
|
3360
3450
|
}
|
|
3451
|
+
function readTextStyle() {
|
|
3452
|
+
try {
|
|
3453
|
+
const stored = localStorage.getItem(TEXT_STYLE_KEY);
|
|
3454
|
+
return stored === "neutral" || stored === "mint" || stored === "rose" ? stored : "champagne";
|
|
3455
|
+
} catch {
|
|
3456
|
+
return "champagne";
|
|
3457
|
+
}
|
|
3458
|
+
}
|
|
3459
|
+
function writeTextStyle(value) {
|
|
3460
|
+
try {
|
|
3461
|
+
localStorage.setItem(TEXT_STYLE_KEY, value);
|
|
3462
|
+
} catch {
|
|
3463
|
+
}
|
|
3464
|
+
}
|
|
3361
3465
|
function readWallpaper() {
|
|
3362
3466
|
try {
|
|
3363
3467
|
return localStorage.getItem(WALLPAPER_KEY) ?? "";
|
|
@@ -3526,7 +3630,7 @@ var MineradioLayer = class {
|
|
|
3526
3630
|
this.sync();
|
|
3527
3631
|
}
|
|
3528
3632
|
const key = event.key;
|
|
3529
|
-
if (key !== null && (key in NUMERIC_KEYS || key === BACKGROUND_KEY || key === WALLPAPER_KEY || key === AUTO_TINT_KEY || key === WALLPAPER_MASK_KEY || key === MODE_KEY || key === WHALE_KEY || key === CRITTERS_KEY || key === MESH_KEY || key === SPOTLIGHT_KEY || key === PRESS_KEY || key === AUDIO_REACT_KEY)) {
|
|
3633
|
+
if (key !== null && (key in NUMERIC_KEYS || key === BACKGROUND_KEY || key === WALLPAPER_KEY || key === AUTO_TINT_KEY || key === WALLPAPER_MASK_KEY || key === MODE_KEY || key === TEXT_STYLE_KEY || key === WHALE_KEY || key === CRITTERS_KEY || key === MESH_KEY || key === SPOTLIGHT_KEY || key === PRESS_KEY || key === AUDIO_REACT_KEY)) {
|
|
3530
3634
|
this.reloadSettings();
|
|
3531
3635
|
if (this.enabled) {
|
|
3532
3636
|
this.applySettings();
|
|
@@ -3595,6 +3699,7 @@ var MineradioLayer = class {
|
|
|
3595
3699
|
}
|
|
3596
3700
|
this.settings = {
|
|
3597
3701
|
mode: readMode(),
|
|
3702
|
+
textStyle: readTextStyle(),
|
|
3598
3703
|
blur: readSetting("blur"),
|
|
3599
3704
|
frost: readSetting("frost"),
|
|
3600
3705
|
fluidHue: readSetting("fluidHue"),
|
|
@@ -3638,6 +3743,13 @@ var MineradioLayer = class {
|
|
|
3638
3743
|
this.applyTokens();
|
|
3639
3744
|
}
|
|
3640
3745
|
}
|
|
3746
|
+
/** Set the global text-ink preset ('champagne' | 'neutral' | 'mint' | 'rose'). */
|
|
3747
|
+
setTextStyle(value) {
|
|
3748
|
+
if (value === this.settings.textStyle) return;
|
|
3749
|
+
this.settings.textStyle = value;
|
|
3750
|
+
writeTextStyle(value);
|
|
3751
|
+
if (this.enabled) this.applyTokens();
|
|
3752
|
+
}
|
|
3641
3753
|
/** Set the glass blur radius (px). */
|
|
3642
3754
|
setBlur(value) {
|
|
3643
3755
|
const next = clampSetting("blur", value);
|
|
@@ -4032,11 +4144,26 @@ var MineradioLayer = class {
|
|
|
4032
4144
|
/** Apply the mode's token layer (floating palette, or translucent compat). */
|
|
4033
4145
|
applyTokens() {
|
|
4034
4146
|
this.tokenDisposer?.();
|
|
4147
|
+
const base = this.settings.mode === "compat" ? COMPAT_TOKEN_OVERRIDES : MINERADIO_TOKEN_OVERRIDES;
|
|
4035
4148
|
this.tokenDisposer = this.ctx.theme.overrideTokens(
|
|
4036
4149
|
OVERRIDE_SOURCE,
|
|
4037
|
-
this.
|
|
4150
|
+
{ ...base, ...this.inkOverrides() }
|
|
4038
4151
|
);
|
|
4039
4152
|
}
|
|
4153
|
+
/** The text-ink override for the current preset: redefines the warm ink
|
|
4154
|
+
* tokens only; every other token falls through to the base layer. */
|
|
4155
|
+
inkOverrides() {
|
|
4156
|
+
const p = textInkPalette(this.settings.textStyle);
|
|
4157
|
+
return {
|
|
4158
|
+
"--dsw-alias-label-primary": { light: p.light.primary, dark: p.dark.primary },
|
|
4159
|
+
"--dsw-alias-label-secondary": { light: p.light.secondary, dark: p.dark.secondary },
|
|
4160
|
+
"--dsw-alias-label-tertiary": { light: p.light.tertiary, dark: p.dark.tertiary },
|
|
4161
|
+
"--dsw-alias-label-caption": { light: p.light.caption, dark: p.dark.caption },
|
|
4162
|
+
"--dsw-alias-label-dimmed": { light: p.light.dimmed, dark: p.dark.dimmed },
|
|
4163
|
+
"--dsw-alias-label-primary-bluish": { light: p.light.bluish, dark: p.dark.bluish },
|
|
4164
|
+
"--dsw-alias-label-primary-dimmed": { light: p.light.primaryDimmed, dark: p.dark.primaryDimmed }
|
|
4165
|
+
};
|
|
4166
|
+
}
|
|
4040
4167
|
mount() {
|
|
4041
4168
|
document.documentElement.setAttribute(MINERADIO_ATTRIBUTE, "");
|
|
4042
4169
|
ensureAmbientScene();
|
|
@@ -4255,6 +4382,7 @@ function apply(ctx) {
|
|
|
4255
4382
|
return {
|
|
4256
4383
|
enabled: layer.getEnabled(),
|
|
4257
4384
|
mode: s.mode,
|
|
4385
|
+
textStyle: s.textStyle,
|
|
4258
4386
|
blur: s.blur,
|
|
4259
4387
|
frost: s.frost,
|
|
4260
4388
|
fluidHue: s.fluidHue,
|
|
@@ -4309,6 +4437,10 @@ function apply(ctx) {
|
|
|
4309
4437
|
layer.setMode(mode);
|
|
4310
4438
|
sync();
|
|
4311
4439
|
},
|
|
4440
|
+
setTextStyle: (textStyle) => {
|
|
4441
|
+
layer.setTextStyle(textStyle);
|
|
4442
|
+
sync();
|
|
4443
|
+
},
|
|
4312
4444
|
setBlur: (blur) => {
|
|
4313
4445
|
layer.setBlur(blur);
|
|
4314
4446
|
sync();
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-theme-mineradio",
|
|
3
3
|
"description": "Mineradio: a cinematic private-visual-radio glass theme for the Web surface — champagne glow, fluid or wallpaper backdrop, unified corners, and motion",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.2.0",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|