@linxin666/dsh-client-ui-skin-center 0.3.21 → 0.3.23
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/contracts/semantic-attrs-v1.md +6 -0
- package/lib/client.js +88 -4
- package/lib/client.js.map +1 -1
- package/lib/index.js +7 -4
- package/package.json +1 -1
- package/skins/blue-fantasy/patches.css +72 -21
package/lib/index.js
CHANGED
|
@@ -145,7 +145,8 @@ const SKIN_BACKGROUND_DEFAULTS = {
|
|
|
145
145
|
backgroundBlurEmpty: 0,
|
|
146
146
|
backgroundBlurContent: 0,
|
|
147
147
|
inputCardBlur: 10,
|
|
148
|
-
bubbleOpacity: 50
|
|
148
|
+
bubbleOpacity: 50,
|
|
149
|
+
bubbleBlur: 10
|
|
149
150
|
};
|
|
150
151
|
/** The fields normalize/sanitize know about; unknown keys are dropped. */
|
|
151
152
|
const SKIN_BACKGROUND_FIELDS = Object.keys(SKIN_BACKGROUND_DEFAULTS);
|
|
@@ -157,7 +158,8 @@ const RANGES = {
|
|
|
157
158
|
backgroundBlurEmpty: [0, 20],
|
|
158
159
|
backgroundBlurContent: [0, 20],
|
|
159
160
|
inputCardBlur: [0, 20],
|
|
160
|
-
bubbleOpacity: [0, 100]
|
|
161
|
+
bubbleOpacity: [0, 100],
|
|
162
|
+
bubbleBlur: [0, 20]
|
|
161
163
|
};
|
|
162
164
|
function isRecord$1(value) {
|
|
163
165
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -759,7 +761,7 @@ const REVIEWED_SKIN_HOOKS = {
|
|
|
759
761
|
},
|
|
760
762
|
"miku": {
|
|
761
763
|
entry: "hooks.mjs",
|
|
762
|
-
manifestSha256: "
|
|
764
|
+
manifestSha256: "a1c713e59ed31eaf43f136205e1326d35419d83d613107423099cef2c992c621",
|
|
763
765
|
hooksSha256: "1c4052d328ac6e1ede3115395e8823c4f6acecd3b4508b85615006a88f7cbdd1"
|
|
764
766
|
},
|
|
765
767
|
"minecraft": {
|
|
@@ -9384,7 +9386,8 @@ const SkinBackgroundConfigSchema = z.object({
|
|
|
9384
9386
|
backgroundBlurEmpty: z.number().min(0).max(20).step(1).default(SKIN_BACKGROUND_DEFAULTS.backgroundBlurEmpty),
|
|
9385
9387
|
backgroundBlurContent: z.number().min(0).max(20).step(1).default(SKIN_BACKGROUND_DEFAULTS.backgroundBlurContent),
|
|
9386
9388
|
inputCardBlur: z.number().min(0).max(20).step(1).default(SKIN_BACKGROUND_DEFAULTS.inputCardBlur),
|
|
9387
|
-
bubbleOpacity: z.number().min(0).max(100).step(5).default(SKIN_BACKGROUND_DEFAULTS.bubbleOpacity)
|
|
9389
|
+
bubbleOpacity: z.number().min(0).max(100).step(5).default(SKIN_BACKGROUND_DEFAULTS.bubbleOpacity),
|
|
9390
|
+
bubbleBlur: z.number().min(0).max(20).step(1).default(SKIN_BACKGROUND_DEFAULTS.bubbleBlur)
|
|
9388
9391
|
});
|
|
9389
9392
|
/**
|
|
9390
9393
|
* Settings namespace for the Wallpaper Engine bridge, owned by the skin
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@linxin666/dsh-client-ui-skin-center",
|
|
3
3
|
"description": "In-GUI skin center for the dsh web GUI — the single skin package: skins are pure asset directories (built-in plus $DSH_HOME/skins) loaded and rendered only by the skin center; live try-on and one-click apply switch atomically in the page (no reload, no cordis.patch.yml rewrite, no restart)",
|
|
4
|
-
"version": "0.3.
|
|
4
|
+
"version": "0.3.23",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
7
7
|
"exports": {
|
|
@@ -286,11 +286,15 @@ body[data-ds-dark-theme] [data-phase="active"] [class*="composerSeat"]:before {
|
|
|
286
286
|
* Both knobs come from the skin-center Background card and are read as optional
|
|
287
287
|
* variables with fallbacks: the blur is var(--dsh-skin-bubble-blur, 10px), and
|
|
288
288
|
* every text plate alpha rides var(--dsh-skin-bubble-alpha, .5). Each plate keeps
|
|
289
|
-
* its own ratio so the default
|
|
290
|
-
* with
|
|
291
|
-
*
|
|
289
|
+
* its own ratio so the default reproduces the values this layer first shipped
|
|
290
|
+
* with -- the user's own bubble runs at 120% on both knobs, which is what its
|
|
291
|
+
* hand-tuned 12px / 60% used to be. The "Bubble opacity" slider therefore drives
|
|
292
|
+
* everything painted *behind text* -- markdown blocks, tool output, the
|
|
293
|
+
* turn-process row -- and nothing else.
|
|
292
294
|
* The window chrome (header, right sidebar) is deliberately not on that slider:
|
|
293
|
-
* it is frame, not bubble
|
|
295
|
+
* it is frame, not bubble. It does follow the Wallpaper scrim like the left
|
|
296
|
+
* pane does -- the three columns share one token so they stay one surface at
|
|
297
|
+
* every scrim value (issue #1579).
|
|
294
298
|
*
|
|
295
299
|
* The light base is the left pane's measured rgb(242 245 250) (dark:
|
|
296
300
|
* rgb(16 22 42)) instead of pure white, so the plates sit in the same colour
|
|
@@ -429,20 +433,41 @@ body[data-ds-dark-theme] [class*="turnStatus"]:not([class*="turnStatusClock"])::
|
|
|
429
433
|
|
|
430
434
|
/* --- turn-tail controls: copy / feedback / regenerate --------------------- */
|
|
431
435
|
|
|
436
|
+
/* The plate is painted by a ::before layer rather than by the row itself.
|
|
437
|
+
|
|
438
|
+
The shell renders each icon's hover tooltip as a `position: fixed` span
|
|
439
|
+
inside this row (ui-primitives Tooltip deliberately drops the portal), and
|
|
440
|
+
`backdrop-filter` — like `filter` or `transform` — makes the element the
|
|
441
|
+
containing block for its fixed-position descendants. A plate on the row
|
|
442
|
+
therefore re-anchored every bubble to the row's own box and threw it
|
|
443
|
+
hundreds of pixels away, sometimes off the viewport entirely (issue #1571).
|
|
444
|
+
`inset: 0` reproduces exactly the padding box the background used to fill,
|
|
445
|
+
so the plate, the row geometry and the icon positions are unchanged. */
|
|
432
446
|
[data-turn-tail] [class*="actions"],
|
|
433
447
|
[data-chat-flow-kind="user"] [class*="actions"],
|
|
434
448
|
[data-chat-flow-kind="steering"] [class*="actions"] {
|
|
449
|
+
position: relative;
|
|
450
|
+
border-radius: 10px;
|
|
451
|
+
padding: 0 8px;
|
|
452
|
+
width: fit-content;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
[data-turn-tail] [class*="actions"]::before,
|
|
456
|
+
[data-chat-flow-kind="user"] [class*="actions"]::before,
|
|
457
|
+
[data-chat-flow-kind="steering"] [class*="actions"]::before {
|
|
458
|
+
content: "";
|
|
459
|
+
position: absolute;
|
|
460
|
+
inset: 0;
|
|
461
|
+
z-index: -1;
|
|
435
462
|
background: rgb(242 245 250 / calc(var(--dsh-skin-bubble-alpha, .5) * 1));
|
|
436
463
|
-webkit-backdrop-filter: blur(var(--dsh-skin-bubble-blur, 10px)) saturate(1.3);
|
|
437
464
|
backdrop-filter: blur(var(--dsh-skin-bubble-blur, 10px)) saturate(1.3);
|
|
438
465
|
border-radius: 10px;
|
|
439
|
-
padding: 0 8px;
|
|
440
|
-
width: fit-content;
|
|
441
466
|
}
|
|
442
467
|
|
|
443
|
-
body[data-ds-dark-theme] [data-turn-tail] [class*="actions"],
|
|
444
|
-
body[data-ds-dark-theme] [data-chat-flow-kind="user"] [class*="actions"],
|
|
445
|
-
body[data-ds-dark-theme] [data-chat-flow-kind="steering"] [class*="actions"] {
|
|
468
|
+
body[data-ds-dark-theme] [data-turn-tail] [class*="actions"]::before,
|
|
469
|
+
body[data-ds-dark-theme] [data-chat-flow-kind="user"] [class*="actions"]::before,
|
|
470
|
+
body[data-ds-dark-theme] [data-chat-flow-kind="steering"] [class*="actions"]::before {
|
|
446
471
|
background: rgb(16 22 42 / calc(var(--dsh-skin-bubble-alpha, .5) * .8));
|
|
447
472
|
}
|
|
448
473
|
|
|
@@ -519,11 +544,17 @@ body[data-ds-dark-theme] [data-slot="main.conversation"] [data-turn-process] {
|
|
|
519
544
|
|
|
520
545
|
/* --- chrome: the top bar and the right sidebar ---------------------------- */
|
|
521
546
|
|
|
522
|
-
/* The three columns only read as one surface if they share a base
|
|
523
|
-
conversation header and the right sidebar reuse the left
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
547
|
+
/* The three columns only read as one surface if they share a base AND a
|
|
548
|
+
density, so the conversation header and the right sidebar reuse the left
|
|
549
|
+
pane's own token (--dsw-specific-sidebar-fill) instead of a pinned fill. That
|
|
550
|
+
token already tracks the Wallpaper scrim, so all three columns now breathe
|
|
551
|
+
together at every scrim value (issue #1579): with a fixed 0.75 the columns
|
|
552
|
+
only matched at scrim 0.5, reading 0.25 too solid at scrim 0 and 0.25 too
|
|
553
|
+
faint at scrim 1.
|
|
554
|
+
|
|
555
|
+
What stays excluded is --dsh-skin-bubble-alpha: this is window chrome, and
|
|
556
|
+
dragging the Bubble opacity slider must fade bubbles, not the frame. The
|
|
557
|
+
sidebar-fill token is a scrim-only function, so that boundary is unchanged.
|
|
527
558
|
|
|
528
559
|
The right sidebar renders as [class*="rightbarCol"] > [data-slot="rightbar"]
|
|
529
560
|
> [data-slot="rightbar.session"] > [class*="panel"]. The two slot hosts are
|
|
@@ -533,10 +564,15 @@ body[data-ds-dark-theme] [data-slot="main.conversation"] [data-turn-process] {
|
|
|
533
564
|
The items inside the header (session name, mode picker, the tabs) stay
|
|
534
565
|
background-free on purpose: plates under those labels read as smudges and
|
|
535
566
|
fight the official underline indicator. */
|
|
567
|
+
/* The panel class is matched as a substring, and the shell's panel *body* is a
|
|
568
|
+
nested element whose class carries the same substring (`X_panelBody`). A
|
|
569
|
+
bare `[class*="panel"]` therefore plated the panel and its body, and two
|
|
570
|
+
0.75 fills stack to an effective 0.94 (issue #1573). Exclude the body; the
|
|
571
|
+
slot host above is display:contents, so the panel itself still matches. */
|
|
536
572
|
[data-slot="main.conversation"] header,
|
|
537
573
|
[data-slot="rightbar.session"] > *,
|
|
538
|
-
[class*="rightbarCol"] [class*="panel"] {
|
|
539
|
-
background:
|
|
574
|
+
[class*="rightbarCol"] [class*="panel"]:not([class*="panelBody"]) {
|
|
575
|
+
background: var(--dsw-specific-sidebar-fill);
|
|
540
576
|
}
|
|
541
577
|
|
|
542
578
|
[data-slot="main.conversation"] header {
|
|
@@ -545,8 +581,17 @@ body[data-ds-dark-theme] [data-slot="main.conversation"] [data-turn-process] {
|
|
|
545
581
|
|
|
546
582
|
body[data-ds-dark-theme] [data-slot="main.conversation"] header,
|
|
547
583
|
body[data-ds-dark-theme] [data-slot="rightbar.session"] > *,
|
|
548
|
-
body[data-ds-dark-theme] [class*="rightbarCol"] [class*="panel"] {
|
|
549
|
-
background:
|
|
584
|
+
body[data-ds-dark-theme] [class*="rightbarCol"] [class*="panel"]:not([class*="panelBody"]) {
|
|
585
|
+
background: var(--dsw-specific-sidebar-fill);
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
/* The right panel and the left pane are one frame, but the shell paints the
|
|
589
|
+
left spine with --dsw-alias-border-l3 and this panel's border-left with
|
|
590
|
+
--dsw-alias-border-l4, so the two vertical rules sat one rung apart
|
|
591
|
+
(issue #1573). Match the left spine here instead of remapping l4, which
|
|
592
|
+
every other l4 consumer shares. */
|
|
593
|
+
[class*="rightbarCol"] [class*="panel"]:not([class*="panelBody"]) {
|
|
594
|
+
border-left-color: var(--dsw-alias-border-l3);
|
|
550
595
|
}
|
|
551
596
|
|
|
552
597
|
body[data-ds-dark-theme] [data-slot="main.conversation"] header {
|
|
@@ -597,12 +642,18 @@ body[data-ds-dark-theme] [data-slot="conversation.session"] [class*="callRow"] [
|
|
|
597
642
|
|
|
598
643
|
/* Keep the accent fill the skin already assigns, add translucency to it and
|
|
599
644
|
frost what shows through. The compound selector matters: a bare
|
|
600
|
-
[class*="bubble"] would also catch unrelated bubbles elsewhere in the shell.
|
|
645
|
+
[class*="bubble"] would also catch unrelated bubbles elsewhere in the shell.
|
|
646
|
+
|
|
647
|
+
The user's own bubble has always been the frosted one of the two -- deeper
|
|
648
|
+
than the plates around it -- so it rides the same slider at 120%: the default
|
|
649
|
+
10px reproduces the 12px this rule carried before the variable existed, and
|
|
650
|
+
the knob scales it in step with everything else. The alpha above uses the
|
|
651
|
+
same ratio for the same reason. */
|
|
601
652
|
[data-slot="main.conversation"] [class*="userStack"] [class*="bubble"] {
|
|
602
653
|
/* 120% of the slider reproduces the 60% body this layer shipped with. */
|
|
603
654
|
background: color-mix(in srgb, var(--dsw-specific-bubble) calc(var(--dsh-skin-bubble-alpha, .5) * 120%), transparent);
|
|
604
|
-
-webkit-backdrop-filter: blur(var(--dsh-skin-bubble-blur,
|
|
605
|
-
backdrop-filter: blur(var(--dsh-skin-bubble-blur,
|
|
655
|
+
-webkit-backdrop-filter: blur(calc(var(--dsh-skin-bubble-blur, 10px) * 1.2)) saturate(1.3);
|
|
656
|
+
backdrop-filter: blur(calc(var(--dsh-skin-bubble-blur, 10px) * 1.2)) saturate(1.3);
|
|
606
657
|
}
|
|
607
658
|
|
|
608
659
|
/* --- deliverables row (this turn's produced files) ------------------------ */
|