@ash-qw/dsh-theme-prts 1.4.1 → 1.4.2

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.
@@ -11,18 +11,10 @@ const SETTINGS_FOCUSABLE = [
11
11
  '[tabindex]:not([tabindex="-1"])',
12
12
  ].join(',')
13
13
 
14
- const PRESET_OPTIONS = [
15
- ['standard-tactical', '标准战术', '完整底纹 / 标准玻璃 / 系统动效'],
16
- ['clear-glass', '清晰玻璃', '克制底纹 / 清晰玻璃 / 系统动效'],
17
- ['quiet-reading', '静谧阅读', '克制底纹 / 柔和玻璃 / 减少动效'],
18
- ]
19
-
20
14
  const COMMON_CONTROLS = [
21
15
  ['cursor', 'PRTS 光标', [['system', '关闭'], ['prts', '开启']]],
22
16
  ['railDefaultHidden', '默认隐藏导航栏', [['false', '关闭'], ['true', '开启']]],
23
- ['texture', '环境底纹', [['off', '关闭'], ['restrained', '克制'], ['full', '完整']]],
24
- ['glass', '玻璃材质', [['off', '关闭'], ['soft', '柔和'], ['standard', '标准'], ['clear', '清晰']]],
25
- ['motion', '动态效果', [['system', '跟随系统'], ['reduced', '减少']]],
17
+ ['motion', '动态效果', []],
26
18
  ['sessionFlow', '当前会话流线', [['false', '关闭'], ['true', '开启']]],
27
19
  ['sessionGlow', '流线光效', [['false', '关闭'], ['true', '开启']]],
28
20
  ['sessionFlowPalette', '流线色调', [['triad', '三色'], ['rhodes', '青蓝'], ['amber', '金黄'], ['alert', '赤红'], ['custom', '自定义']]],
@@ -45,10 +37,8 @@ function previewSetting(key, label, description) {
45
37
  }
46
38
 
47
39
  function settingButtons(key, label, options) {
48
- const note = key === 'glass'
49
- ? '<small data-prts-setting-note data-prts-transparency-status hidden>系统当前要求降低透明度</small>'
50
- : key === 'motion'
51
- ? '<small data-prts-setting-note data-prts-effective-motion hidden>系统当前要求减少动态</small>'
40
+ const note = key === 'motion'
41
+ ? '<small data-prts-setting-note>关闭后减少装饰动效,保留运行状态等必要反馈</small><small data-prts-setting-note data-prts-effective-motion hidden>系统当前要求减少动态</small>'
52
42
  : key === 'railDefaultHidden'
53
43
  ? '<small data-prts-setting-note>在任意窗口宽度下默认收起 P.R.T.S. 导航,可从左侧按钮临时展开</small>'
54
44
  : key === 'conversationStyle'
@@ -64,11 +54,11 @@ function settingButtons(key, label, options) {
64
54
  : key === 'sessionFlowPalette'
65
55
  ? '<small data-prts-setting-note>同时适配日间与夜间模式</small>'
66
56
  : ''
67
- if (['cursor', 'railDefaultHidden', 'sessionFlow', 'sessionGlow', 'bakerGroupAvatars', 'conversationEmblem', 'sessionPreview', 'previewOngoing', 'previewWarning', 'previewDone', 'previewDoubleClick', 'previewFollowOngoing', 'previewFollowWarning'].includes(key)) return `<div data-prts-setting-row="${key}">
57
+ if (['motion', 'cursor', 'railDefaultHidden', 'sessionFlow', 'sessionGlow', 'bakerGroupAvatars', 'conversationEmblem', 'sessionPreview', 'previewOngoing', 'previewWarning', 'previewDone', 'previewDoubleClick', 'previewFollowOngoing', 'previewFollowWarning'].includes(key)) return `<div data-prts-setting-row="${key}">
68
58
  <span><strong>${label}</strong>${note}</span>
69
59
  <button type="button" role="switch" aria-label="${label}" aria-checked="false" data-prts-setting-switch="${key}" ${key === 'cursor' ? 'data-prts-cursor-switch' : ''}><span aria-hidden="true"></span></button>
70
60
  </div>`
71
- const sample = value => key === 'texture' || key === 'glass' || key === 'sessionFlowPalette'
61
+ const sample = value => key === 'sessionFlowPalette'
72
62
  ? `<i data-prts-option-sample="${key}" data-prts-option-sample-value="${value}" aria-hidden="true"></i>`
73
63
  : ''
74
64
  return `<div data-prts-setting-row="${key}">
@@ -77,11 +67,6 @@ function settingButtons(key, label, options) {
77
67
  </div>`
78
68
  }
79
69
 
80
- function presetMarkup() {
81
- return PRESET_OPTIONS.map(([value, title, description]) => `<button type="button" data-prts-setting-key="preset" data-prts-setting-value="${value}" data-prts-preset-card>
82
- <strong>${title}</strong><span>${description}</span>
83
- </button>`).join('')
84
- }
85
70
 
86
71
  function particleMarkup() {
87
72
  return PARTICLE_OPTIONS.map(([value, label, count]) => `<button type="button" role="radio" data-prts-setting-key="particleDetail" data-prts-setting-value="${value}">
@@ -121,9 +106,8 @@ export function themeSettingsMarkup() {
121
106
  <dialog id="prts-theme-settings" data-prts-theme-settings aria-label="P.R.T.S. 主题设置" aria-hidden="true">
122
107
  <div data-prts-settings-frame>
123
108
  <header data-prts-theme-settings-header>
124
- <span><small>P.R.T.S. / 外观</small><strong>主题设置</strong></span>
109
+ <span><small>P.R.T.S. / 设置</small><strong>主题设置</strong></span>
125
110
  <div data-prts-settings-summary aria-live="polite">
126
- <span data-prts-settings-preset-status>标准战术</span>
127
111
  <span data-prts-persistence-status hidden></span>
128
112
  </div>
129
113
  <button type="button" data-prts-theme-settings-close aria-label="关闭主题设置">×</button>
@@ -132,10 +116,10 @@ export function themeSettingsMarkup() {
132
116
  <div data-prts-settings-body>
133
117
  <div data-prts-settings-sidebar>
134
118
  <nav data-prts-settings-nav role="tablist" aria-label="设置分区">
135
- <button type="button" data-prts-settings-jump="appearance" role="tab" id="prts-tab-appearance" aria-controls="prts-page-appearance" aria-selected="true" tabindex="0">外观</button>
119
+ <button type="button" data-prts-settings-jump="appearance" role="tab" id="prts-tab-appearance" aria-controls="prts-page-appearance" aria-selected="true" tabindex="0">会话外观</button>
136
120
  <button type="button" data-prts-settings-jump="interaction" role="tab" id="prts-tab-interaction" aria-controls="prts-page-interaction" aria-selected="false" tabindex="-1">交互</button>
137
121
  <button type="button" data-prts-settings-jump="flow" role="tab" id="prts-tab-flow" aria-controls="prts-page-flow" aria-selected="false" tabindex="-1">会话流线</button>
138
- <button type="button" data-prts-settings-jump="particles" role="tab" id="prts-tab-particles" aria-controls="prts-page-particles" aria-selected="false" tabindex="-1">粒子效果</button>
122
+ <button type="button" data-prts-settings-jump="particles" role="tab" id="prts-tab-particles" aria-controls="prts-page-particles" aria-selected="false" tabindex="-1">粒子徽记</button>
139
123
  <button type="button" data-prts-settings-jump="assistance" role="tab" id="prts-tab-assistance" aria-controls="prts-page-assistance" aria-selected="false" tabindex="-1">辅助功能</button>
140
124
  </nav>
141
125
  <footer data-prts-settings-actions aria-label="全局主题设置操作">
@@ -145,8 +129,8 @@ export function themeSettingsMarkup() {
145
129
  </div>
146
130
  <div data-prts-reset-zone>
147
131
 
148
- <button type="button" data-prts-reset-visual title="恢复全部外观设置" aria-label="恢复全部外观设置">恢复默认</button>
149
- <div data-prts-reset-confirm hidden role="group" aria-label="确认恢复全部外观设置">
132
+ <button type="button" data-prts-reset-visual title="恢复全部主题设置" aria-label="恢复全部主题设置">恢复默认</button>
133
+ <div data-prts-reset-confirm hidden role="group" aria-label="确认恢复全部主题设置">
150
134
  <span>重置全部分类的主题设置,保留主题开关、启动动画和徽记配置。</span>
151
135
  <button type="button" data-prts-reset-confirm-action>确认恢复</button>
152
136
  <button type="button" data-prts-reset-cancel>取消</button>
@@ -156,18 +140,6 @@ export function themeSettingsMarkup() {
156
140
  </div>
157
141
  <div data-prts-theme-settings-scroll>
158
142
  <section data-prts-settings-section="appearance" role="tabpanel" id="prts-page-appearance" aria-labelledby="prts-tab-appearance" tabindex="0">
159
- <header data-prts-section-heading><strong>外观</strong><small>预设、界面材质与会话样式</small></header>
160
- <section data-prts-settings-presets>
161
- <header><span><strong>视觉预设</strong></span></header>
162
- <div>${presetMarkup()}</div>
163
- </section>
164
-
165
- <section data-prts-settings-common>
166
- <header><span><strong>界面外观</strong></span></header>
167
- <div data-prts-settings-common-grid>
168
- ${COMMON_CONTROLS.filter(([key]) => ['texture', 'glass'].includes(key)).map(([key, label, options]) => settingButtons(key, label, options)).join('')}
169
- </div>
170
- </section>
171
143
  <section data-prts-conversation-settings>
172
144
  <header><strong>会话主题</strong><small>选择消息的呈现方式</small></header>
173
145
  <div data-prts-conversation-cards>
@@ -180,13 +152,11 @@ export function themeSettingsMarkup() {
180
152
  </section>
181
153
  </section>
182
154
  <section data-prts-settings-common data-prts-settings-section="interaction" role="tabpanel" id="prts-page-interaction" aria-labelledby="prts-tab-interaction" tabindex="0" hidden>
183
- <header data-prts-section-heading><strong>交互</strong><small>光标、导航栏与动态反馈</small></header>
184
155
  <div data-prts-settings-common-grid>
185
156
  ${COMMON_CONTROLS.filter(([key]) => ['cursor', 'railDefaultHidden', 'motion'].includes(key)).map(([key, label, options]) => settingButtons(key, label, options)).join('')}
186
157
  </div>
187
158
  </section>
188
159
  <section data-prts-settings-section="assistance" role="tabpanel" id="prts-page-assistance" aria-labelledby="prts-tab-assistance" tabindex="0" hidden>
189
- <header data-prts-section-heading><strong>辅助功能</strong><small>会话状态查看与快捷操作</small></header>
190
160
  <section data-prts-preview-settings>
191
161
  <div data-prts-preview-master>
192
162
  ${previewSetting('sessionPreview', '会话状态预览', '在工作区右侧查看会话进度,无需切换当前会话')}
@@ -214,7 +184,6 @@ export function themeSettingsMarkup() {
214
184
  </section>
215
185
  </section>
216
186
  <section data-prts-settings-common data-prts-settings-section="flow" role="tabpanel" id="prts-page-flow" aria-labelledby="prts-tab-flow" tabindex="0" hidden>
217
- <header data-prts-section-heading><strong>会话流线</strong><small>当前会话的流线与辉光</small></header>
218
187
  <div data-prts-settings-common-grid>
219
188
  ${COMMON_CONTROLS.filter(([key]) => ['sessionFlow', 'sessionGlow', 'sessionFlowPalette'].includes(key)).map(([key, label, options]) => settingButtons(key, label, options)).join('')}
220
189
  ${sessionFlowColorMarkup()}
@@ -227,11 +196,10 @@ export function themeSettingsMarkup() {
227
196
  </section>
228
197
 
229
198
  <section data-prts-settings-advanced data-prts-settings-section="particles" role="tabpanel" id="prts-page-particles" aria-labelledby="prts-tab-particles" tabindex="0" hidden>
230
- <header data-prts-section-heading><span><strong>粒子效果</strong><small>徽记精度与跟随移动速度</small></span><output data-prts-advanced-summary>标准 / 1×</output></header>
231
199
  <div data-prts-settings-advanced-content>
232
200
  ${customEmblemMarkup()}
233
201
  <section data-prts-particle-detail>
234
- <header><strong>粒子精度</strong><span>同时调整会话与新会话徽记</span></header>
202
+ <header><strong>粒子精度</strong><span>同时调整会话与新会话徽记</span><output data-prts-advanced-summary>标准</output></header>
235
203
  <div role="radiogroup" aria-label="粒子精度">${particleMarkup()}</div>
236
204
  <label data-prts-setting-row="particleTraversalSpeed" data-prts-setting-range-row data-prts-particle-traversal>
237
205
  <span><strong>跟随移动速度</strong><small>控制普通会话徽记移动及破碎重组的滚动距离</small></span>
@@ -519,6 +487,7 @@ export function createThemeSettingsOverlay({
519
487
  for (const toggle of panel.querySelectorAll('[data-prts-setting-switch]')) {
520
488
  const key = toggle.dataset.prtsSettingSwitch
521
489
  const enabled = key === 'cursor' ? currentPreferences.cursor === 'prts'
490
+ : key === 'motion' ? currentPreferences.motion !== 'reduced'
522
491
  : key === 'railDefaultHidden' ? currentPreferences[key] === true : currentPreferences[key] !== false
523
492
  toggle.setAttribute('aria-checked', String(enabled))
524
493
  toggle.classList.toggle('is-active', enabled)
@@ -536,6 +505,8 @@ export function createThemeSettingsOverlay({
536
505
  || (key === 'sessionFlowColors' && activeSessionFlowPalette() !== 'custom')
537
506
  }
538
507
  const particleDetail = resolveParticleDetail(currentPreferences)
508
+ const detailSummary = panel.querySelector('[data-prts-advanced-summary]')
509
+ if (detailSummary) detailSummary.textContent = PARTICLE_OPTIONS.find(([value]) => value === particleDetail)?.[1] ?? '标准'
539
510
  for (const button of panel.querySelectorAll('button[data-prts-setting-key]')) {
540
511
  const key = button.dataset.prtsSettingKey
541
512
  const actual = key === 'particleDetail'
@@ -550,10 +521,6 @@ export function createThemeSettingsOverlay({
550
521
  button.setAttribute('aria-pressed', String(selected))
551
522
  if (button.getAttribute('role') === 'radio') button.setAttribute('aria-checked', String(selected))
552
523
  }
553
- const presetLabels = { 'standard-tactical': '标准战术', 'clear-glass': '清晰玻璃', 'quiet-reading': '静谧阅读', custom: '自定义' }
554
- const preset = presetLabels[currentPreferences.preset] || '自定义'
555
- const presetStatus = panel.querySelector('[data-prts-settings-preset-status]')
556
- if (presetStatus) presetStatus.textContent = preset
557
524
  const motionStatus = panel.querySelector('[data-prts-effective-motion]')
558
525
  if (motionStatus) motionStatus.hidden = !(currentPreferences.motion === 'system' && motionMedia?.matches)
559
526
  const transparency = panel.querySelector('[data-prts-transparency-status]')
@@ -619,7 +586,7 @@ export function createThemeSettingsOverlay({
619
586
  if (target.hasAttribute('data-prts-setting-switch')) {
620
587
  const key = target.dataset.prtsSettingSwitch
621
588
  const enabled = target.getAttribute('aria-checked') === 'true'
622
- onPreferenceChange(key, key === 'cursor' ? (enabled ? 'system' : 'prts') : !enabled)
589
+ onPreferenceChange(key, key === 'cursor' ? (enabled ? 'system' : 'prts') : key === 'motion' ? (enabled ? 'reduced' : 'system') : !enabled)
623
590
  return
624
591
  }
625
592
  if (target.hasAttribute('data-prts-setting-key')) {
@@ -127,22 +127,11 @@ html[data-dsh-prts] [data-prts-session-summary-signal] {
127
127
  color: inherit;
128
128
  }
129
129
 
130
- html[data-dsh-prts] [data-prts-session-summary-signal="ongoing"]::before {
131
- content: "";
132
- position: absolute;
133
- top: 0;
134
- left: 0;
135
- width: 2px;
136
- height: 2px;
137
- background: currentColor;
138
- box-shadow:
139
- 3.5px 0 currentColor,
140
- 7px 0 currentColor,
141
- 7px 3.5px currentColor,
142
- 7px 7px currentColor,
143
- 3.5px 7px currentColor,
144
- 0 7px currentColor,
145
- 0 3.5px currentColor;
130
+ html[data-dsh-prts] [data-prts-session-summary-signal="ongoing"] {
131
+ width: 16px;
132
+ height: 16px;
133
+ flex-basis: 16px;
134
+ color: var(--dsw-static-deepseek-450, var(--prts-cyan));
146
135
  }
147
136
 
148
137
  html[data-dsh-prts] [data-prts-session-summary-signal="done"]::before {
@@ -191,6 +180,16 @@ html[data-dsh-prts] [data-prts-session-summary-popover] {
191
180
  pointer-events: none;
192
181
  }
193
182
 
183
+ html[data-dsh-prts] [data-prts-session-summary-popover][data-prts-summary-above] {
184
+ top: auto;
185
+ bottom: calc(100% + 6px);
186
+ }
187
+
188
+ html[data-dsh-prts] [data-prts-session-summary-popover][data-prts-summary-above]::before {
189
+ top: 100%;
190
+ bottom: auto;
191
+ }
192
+
194
193
  html[data-dsh-prts] [data-prts-session-summary-popover]::before {
195
194
  content: "";
196
195
  position: absolute;
@@ -201,7 +200,7 @@ html[data-dsh-prts] [data-prts-session-summary-popover]::before {
201
200
  height: 16px;
202
201
  }
203
202
 
204
- html[data-dsh-prts] [data-prts-session-summary-group]:is(:hover, :has(:focus-visible), [data-prts-preview-open]) [data-prts-session-summary-popover] {
203
+ html[data-dsh-prts] [data-prts-session-summary-group]:is(:hover, :has(:focus-visible), [data-prts-preview-open], [data-prts-summary-hover-open]) [data-prts-session-summary-popover] {
205
204
  opacity: 1;
206
205
  visibility: visible;
207
206
  transform: translate3d(0, 0, 0);
@@ -514,11 +513,11 @@ html[data-dsh-prts][data-prts-scheme="light"][data-prts-session-glow="on"] [data
514
513
  stroke-width: .52;
515
514
  }
516
515
 
517
- html[data-dsh-prts] [data-prts-session-row][aria-selected="true"] [data-prts-session-lifeline] {
516
+ html[data-dsh-prts] [data-prts-session-row]:is([data-prts-selection-target="true"], [aria-selected="true"]:not([data-prts-selection-target="false"])) [data-prts-session-lifeline] {
518
517
  opacity: .98;
519
518
  }
520
519
 
521
- html[data-dsh-prts] [data-prts-session-row][aria-selected="true"]:hover [data-prts-session-lifeline] {
520
+ html[data-dsh-prts] [data-prts-session-row]:is([data-prts-selection-target="true"], [aria-selected="true"]:not([data-prts-selection-target="false"])):hover [data-prts-session-lifeline] {
522
521
  opacity: 0;
523
522
  }
524
523
 
@@ -603,7 +602,7 @@ html[data-dsh-prts][data-prts-scheme="light"] [data-prts-session-row] {
603
602
  --prts-session-pickup-fill: #3f4d56;
604
603
  }
605
604
 
606
- html[data-dsh-prts] [data-prts-session-row][aria-selected="true"] {
605
+ html[data-dsh-prts] [data-prts-session-row]:is([data-prts-selection-target="true"], [aria-selected="true"]:not([data-prts-selection-target="false"])) {
607
606
  --prts-facility-texture-color: var(--prts-yellow);
608
607
  }
609
608
 
@@ -628,7 +627,7 @@ html[data-dsh-prts] [data-prts-workspace-row] > [data-prts-facility-spine] {
628
627
  --prts-facility-surface: var(--prts-cyan);
629
628
  }
630
629
 
631
- html[data-dsh-prts] [data-prts-session-row][aria-selected="true"] > [data-prts-facility-spine] {
630
+ html[data-dsh-prts] [data-prts-session-row]:is([data-prts-selection-target="true"], [aria-selected="true"]:not([data-prts-selection-target="false"])) > [data-prts-facility-spine] {
632
631
  --prts-facility-surface: var(--prts-yellow);
633
632
  }
634
633
 
@@ -642,6 +641,13 @@ html[data-dsh-prts] [data-prts-session-row]:is(:hover, :focus-within, [data-prts
642
641
  transform: scaleX(1) !important;
643
642
  }
644
643
 
644
+ /* Expansion is state feedback: do not trail the newly visible session rows.
645
+ Collapsed-row hover keeps the normal spring transition. */
646
+ html[data-dsh-prts] [data-prts-workspace-row][aria-expanded="true"] > [data-prts-facility-spine],
647
+ html[data-dsh-prts] [data-prts-workspace-row][aria-expanded="true"]::before {
648
+ transition: none;
649
+ }
650
+
645
651
  /* Switch each legacy fallback off only after its own valid vector path exists. */
646
652
  html[data-dsh-prts] [data-prts-workspace-row][data-prts-spine-vector]::before,
647
653
  html[data-dsh-prts] [data-prts-session-row][data-prts-spine-vector]::before {
@@ -780,3 +786,81 @@ html[data-dsh-prts] [data-prts-preview-marker] { display:none;flex:none;margin-l
780
786
  html[data-dsh-prts] [data-prts-preview-active] > [data-prts-preview-marker] { display:block; }
781
787
  html[data-dsh-prts] [data-prts-session-summary-item][data-prts-preview-active] { box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--prts-ink) 30%,transparent);border-top-color:transparent;border-radius:5px;background:color-mix(in srgb,currentColor 9%,transparent); }
782
788
  html[data-dsh-prts] [data-prts-preview-session-title] { overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-bottom:5px;color:var(--prts-muted);font:400 11px/1.5 var(--prts-body); }
789
+
790
+ html[data-dsh-prts] [data-prts-summary-reply][data-prts-preview-approval] > [data-prts-preview-body] { display:block;max-height:132px;overflow:auto;-webkit-line-clamp:unset;white-space:pre-wrap;overflow-wrap:anywhere; }
791
+ html[data-dsh-prts] [data-prts-approval-details] { margin-top:10px;color:var(--prts-muted);font-size:11px; }
792
+ html[data-dsh-prts] [data-prts-approval-details] pre { color:var(--prts-ink);white-space:pre-wrap;overflow-wrap:anywhere;user-select:text; }
793
+
794
+ html[data-dsh-prts] [data-prts-summary-instant] [data-prts-session-summary-popover] { transition:none; }
795
+
796
+ html[data-dsh-prts] [data-prts-summary-reply] { max-width:calc(100dvw - 16px);max-height:calc(100dvh - 16px);overflow:auto; }
797
+
798
+ html[data-dsh-prts] [data-prts-summary-reply][data-prts-preview-no-space] { visibility:hidden !important;pointer-events:none !important; }
799
+ html[data-dsh-prts] [data-prts-preview-space-notice] { margin-top:8px;padding:8px;border-top:1px solid var(--prts-line);color:var(--prts-muted);font:11px/1.6 var(--prts-body);white-space:normal;overflow-wrap:anywhere; }
800
+
801
+ html[data-dsh-prts] [data-prts-summary-space-notice] { display:none;font:11px/1.6 var(--prts-body);color:var(--prts-muted); }
802
+ html[data-dsh-prts] [data-prts-summary-no-space] > :not([data-prts-summary-space-notice]) { display:none; }
803
+ html[data-dsh-prts] [data-prts-summary-no-space] > [data-prts-summary-space-notice] { display:block; }
804
+ html[data-dsh-prts] [data-prts-summary-no-room] { visibility:hidden !important;pointer-events:none !important; }
805
+
806
+
807
+ /* A reply-space warning occupies the existing heading, never enlarges the menu. */
808
+ html[data-dsh-prts] [data-prts-session-summary-popover] > [data-prts-preview-space-notice] {
809
+ position: absolute;
810
+ top: 8px;
811
+ right: 8px;
812
+ left: 8px;
813
+ height: 28px;
814
+ margin: 0;
815
+ padding: 0 6px 6px;
816
+ border: 0;
817
+ display: flex;
818
+ align-items: center;
819
+ background: var(--prts-glass-dense, var(--prts-panel));
820
+ white-space: nowrap;
821
+ }
822
+ html[data-dsh-prts] [data-prts-session-summary-popover]:has(> [data-prts-preview-space-notice]) > [data-prts-session-summary-heading] {
823
+ visibility: hidden;
824
+ }
825
+
826
+ /* Keep different-sized state markers centered on the same axis. */
827
+ html[data-dsh-prts] [data-prts-session-row] [data-state]:is([data-state="ongoing"], [data-state="done"], [data-state="warning"], [data-state="error"]) {
828
+ flex-shrink: 0;
829
+ margin-left: 20px;
830
+ }
831
+
832
+ /* Running-room marker inside the host SVG; native children remain restorable. */
833
+ html[data-dsh-prts] [data-prts-session-row] svg[data-state="ongoing"]:has(> [data-prts-running-marker]) {
834
+ position: relative;
835
+ z-index: 1;
836
+ flex: 0 0 20px;
837
+ width: 20px;
838
+ height: 20px;
839
+ color: var(--prts-session-status-color, var(--dsw-static-deepseek-450, var(--prts-cyan)));
840
+ animation: none;
841
+ }
842
+ html[data-dsh-prts] svg[data-state="ongoing"]:has(> [data-prts-running-marker]) > :not([data-prts-running-marker]) { display: none; }
843
+ html[data-dsh-prts] [data-prts-running-marker] text {
844
+ fill: currentColor;
845
+ stroke: none;
846
+ text-anchor: middle;
847
+ font: 700 12px Arial, sans-serif;
848
+ }
849
+ html[data-dsh-prts] [data-prts-running-marker] circle {
850
+ fill: none;
851
+ stroke: currentColor;
852
+ stroke-width: 1.7;
853
+ stroke-linecap: round;
854
+ transform-origin: 12px 12px;
855
+ animation: prts-running-room-orbit 2.4s linear infinite;
856
+ }
857
+ @keyframes prts-running-room-orbit { to { transform: rotate(360deg); } }
858
+ /* Preserve this small status animation under reduced motion: it signals ongoing work. */
859
+
860
+
861
+ html[data-dsh-prts] [data-prts-summary-dismissed] [data-prts-session-summary-popover] {
862
+ opacity: 0 !important;
863
+ visibility: hidden !important;
864
+ pointer-events: none !important;
865
+ transition: none;
866
+ }
@@ -915,7 +915,7 @@ html[data-dsh-prts] [data-prts-session-row]:is(:hover, :focus-within, [data-prts
915
915
  transform: scaleX(1);
916
916
  }
917
917
 
918
- html[data-dsh-prts] [data-prts-session-row][aria-selected="true"]::before {
918
+ html[data-dsh-prts] [data-prts-session-row]:is([data-prts-selection-target="true"], [aria-selected="true"]:not([data-prts-selection-target="false"]))::before {
919
919
  background: var(--prts-yellow);
920
920
  }
921
921
 
@@ -943,8 +943,8 @@ html[data-dsh-prts] :is([data-prts-workspace-row], [data-prts-session-row]) [dat
943
943
  }
944
944
 
945
945
  html[data-dsh-prts] [data-prts-row-title],
946
- html[data-dsh-prts] [data-prts-session-row] > span:not([data-prts-facility-face]):not([data-prts-row-projection]):not([data-prts-session-actions]),
947
- html[data-dsh-prts] [data-prts-workspace-row] > span:not([data-prts-facility-face]):not([data-prts-row-projection]):not([data-prts-workspace-actions]) {
946
+ html[data-dsh-prts] [data-prts-session-row] > span:not([data-prts-facility-face]):not([data-prts-facility-spine]):not([data-prts-row-projection]):not([data-prts-session-actions]),
947
+ html[data-dsh-prts] [data-prts-workspace-row] > span:not([data-prts-facility-face]):not([data-prts-facility-spine]):not([data-prts-row-projection]):not([data-prts-workspace-actions]) {
948
948
  position: relative;
949
949
  z-index: 3;
950
950
  min-width: 0;
@@ -976,11 +976,11 @@ html[data-dsh-prts] [data-prts-session-row] [data-prts-row-title]::before {
976
976
  letter-spacing: .08em;
977
977
  }
978
978
 
979
- html[data-dsh-prts] [data-prts-session-row][aria-selected="true"] [data-prts-row-title] {
979
+ html[data-dsh-prts] [data-prts-session-row]:is([data-prts-selection-target="true"], [aria-selected="true"]:not([data-prts-selection-target="false"])) [data-prts-row-title] {
980
980
  font-weight: 700;
981
981
  }
982
982
 
983
- html[data-dsh-prts] [data-prts-session-row][aria-selected="true"] [data-prts-row-title]::before {
983
+ html[data-dsh-prts] [data-prts-session-row]:is([data-prts-selection-target="true"], [aria-selected="true"]:not([data-prts-selection-target="false"])) [data-prts-row-title]::before {
984
984
  color: var(--prts-yellow);
985
985
  }
986
986
 
@@ -154,7 +154,7 @@ html[data-dsh-prts] [data-prts-session-row]:hover [data-prts-session-time] {
154
154
  opacity: 0;
155
155
  }
156
156
 
157
- html[data-dsh-prts] [data-prts-session-row][aria-selected="true"] [data-prts-session-time] {
157
+ html[data-dsh-prts] [data-prts-session-row]:is([data-prts-selection-target="true"], [aria-selected="true"]:not([data-prts-selection-target="false"])) [data-prts-session-time] {
158
158
  opacity: 0;
159
159
  }
160
160
 
@@ -784,37 +784,12 @@ padding: 20px 24px 28px;
784
784
  background: var(--prts-canvas);
785
785
  }
786
786
  & [data-prts-settings-section] {
787
- margin: 0 0 28px;
788
- padding: 0 20px 8px;
789
- border: 1px solid var(--prts-line);
790
- border-radius: 6px;
791
- background: var(--prts-panel);
792
- scroll-margin-top: 16px;
793
- }
794
- & [data-prts-settings-section] > [data-prts-section-heading] {
795
- display: flex;
796
- align-items: center;
797
- justify-content: space-between;
798
- gap: 12px;
799
- min-height: 76px;
800
- margin: 0 -20px 8px;
801
- padding: 18px 20px;
787
+ margin: 0;
788
+ padding: 0;
802
789
  border: 0;
803
- border-bottom: 1px solid var(--prts-line);
804
- border-radius: 5px 5px 0 0;
805
- background: var(--prts-panel-raised);
806
- }
807
- & [data-prts-settings-section] > [data-prts-section-heading] > span {
808
- display: grid;
809
- gap: 5px;
810
- }
811
- & [data-prts-settings-section] > [data-prts-section-heading] strong {
812
- font: 650 18px/1.4 var(--prts-body);
813
- letter-spacing: 0;
814
- }
815
- & [data-prts-settings-section] > [data-prts-section-heading] small {
816
- color: var(--prts-muted);
817
- font: 400 12px/1.5 var(--prts-body);
790
+ border-radius: 0;
791
+ background: transparent;
792
+ scroll-margin-top: 16px;
818
793
  }
819
794
  & [data-prts-settings-section="appearance"] > section {
820
795
  margin-bottom: 8px;
@@ -833,8 +808,7 @@ box-shadow: inset 3px 0 var(--prts-yellow);
833
808
  }
834
809
  @media (max-width: 720px) {
835
810
  & [data-prts-theme-settings-scroll] { padding: 16px 12px 24px; }
836
- & [data-prts-settings-section] { padding-inline: 14px; margin-bottom: 24px; }
837
- & [data-prts-settings-section] > [data-prts-section-heading] { margin-inline: -14px; padding-inline: 14px; flex-wrap: wrap; gap: 4px 12px; }
811
+ & [data-prts-settings-section] { padding: 0; margin: 0; }
838
812
  & [data-prts-settings-jump][aria-selected="true"] { box-shadow: inset 0 -3px var(--prts-yellow); }
839
813
  }
840
814
  & [data-prts-custom-emblem] {