@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/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: "9022628fd39e8ee48aef3b311c12f8411b4cc99d62764e84aa65fb4a5a3631ab",
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.21",
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 50% reproduces the values this layer first shipped
290
- * with. The "Bubble opacity" slider therefore drives everything painted *behind
291
- * text* -- markdown blocks, tool output, the turn-process row -- and nothing else.
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, and it keeps a fixed density.
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, so the
523
- conversation header and the right sidebar reuse the left pane's measured
524
- rgb(242 245 250) at the same density instead of plain white. The density is
525
- fixed rather than tied to --dsh-skin-bubble-alpha: this is window chrome, and
526
- dragging the Bubble opacity slider should fade bubbles, not the frame.
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: rgba(242, 245, 250, 0.75);
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: rgba(16, 22, 42, 0.75);
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, 12px)) saturate(1.3);
605
- backdrop-filter: blur(var(--dsh-skin-bubble-blur, 12px)) saturate(1.3);
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) ------------------------ */