@waterwx/dsh-novel-forge 1.1.2 → 1.1.4

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.
@@ -63,8 +63,11 @@ body[data-ds-dark-theme] .entry {
63
63
  inset: 0;
64
64
  overflow: auto;
65
65
  color-scheme: light;
66
- font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'SF Pro SC', 'PingFang SC', 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif;
67
- /* iOS light palette (system colors, frosted translucency) */
66
+ /* 统一 iOS 字体栈:SF Pro + 苹方/冬青黑体中文回退,Windows 回落微软雅黑 */
67
+ font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'SF Pro Text', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif;
68
+ --nf-font: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'SF Pro Text', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif;
69
+ --nf-font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
70
+ /* iOS light palette (Liquid-Glass green, frosted translucency) */
68
71
  --nf-bg: rgba(242, 242, 247, 0.86);
69
72
  --nf-bg-raise: rgba(255, 255, 255, 0.72);
70
73
  --nf-bg-inset: rgba(118, 118, 128, 0.12);
@@ -74,17 +77,28 @@ body[data-ds-dark-theme] .entry {
74
77
  --nf-text-2: #3c3c43;
75
78
  --nf-text-2-alpha: rgba(60, 60, 67, 0.68);
76
79
  --nf-text-3: #8e8e93;
77
- --nf-accent: #007aff;
78
- --nf-accent-hover: #0071e3;
79
- --nf-accent-soft: rgba(0, 122, 255, 0.12);
80
+ --nf-accent: #00b85c;
81
+ --nf-accent-hover: #00a04e;
82
+ --nf-accent-soft: rgba(0, 184, 92, 0.12);
80
83
  --nf-accent-fg: #ffffff;
81
84
  --nf-hover: rgba(0, 0, 0, 0.05);
82
85
  --nf-success: #34c759;
83
86
  --nf-error: #ff3b30;
84
87
  --nf-warn: #ff9500;
85
- --nf-info: #5856d6;
88
+ --nf-info: #00b85c;
86
89
  --nf-shadow: 0 1px 3px rgba(0, 0, 0, 0.06), 0 12px 32px rgba(0, 0, 0, 0.08);
87
90
  --nf-shadow-lg: 0 4px 12px rgba(0, 0, 0, 0.07), 0 20px 48px rgba(0, 0, 0, 0.12);
91
+ --nf-card-shadow: 0 2px 6px rgba(0, 0, 0, 0.06), 0 14px 38px rgba(0, 0, 0, 0.14);
92
+ --nf-card-shadow-hover: 0 4px 10px rgba(0, 0, 0, 0.08), 0 22px 52px rgba(0, 0, 0, 0.20);
93
+ /* Liquid Glass: vertical glass face + soft top-left core + sheen border */
94
+ --nf-glass-face: linear-gradient(180deg, #f6f7f9 0%, #f0f2f5 26%, #e9ebef 52%, #e0e3e8 78%, #d6d9df 100%);
95
+ --nf-glass-core: radial-gradient(30% 24% at 36% 28%, rgba(255, 255, 255, 0.5) 0%, rgba(255, 255, 255, 0.22) 45%, rgba(255, 255, 255, 0) 78%);
96
+ --nf-glass-sheen: rgba(255, 255, 255, 0.55);
97
+ --nf-glass-border: rgba(255, 255, 255, 0.65);
98
+ --nf-glass-inset: rgba(255, 255, 255, 0.55);
99
+ --nf-glass-orb-a: rgba(0, 184, 92, 0.14);
100
+ --nf-glass-orb-b: rgba(120, 160, 255, 0.10);
101
+ --nf-glass-noise: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='180' height='180' filter='url(%23n)'/%3E%3C/svg%3E");
88
102
  background: var(--nf-bg);
89
103
  /* Frosted glass: blur whatever is behind the panel (the chat dialog),
90
104
  * so translucency shows a soft blur instead of readable content. */
@@ -95,8 +109,8 @@ body[data-ds-dark-theme] .entry {
95
109
 
96
110
  body[data-ds-dark-theme] .view {
97
111
  color-scheme: dark;
98
- /* iOS dark palette */
99
- --nf-bg: rgba(0, 0, 0, 0.72);
112
+ /* iOS dark palette — near-black canvas with green Liquid-Glass accents */
113
+ --nf-bg: rgba(10, 11, 13, 0.86);
100
114
  --nf-bg-raise: rgba(28, 28, 30, 0.78);
101
115
  --nf-bg-inset: rgba(118, 118, 128, 0.18);
102
116
  --nf-border: rgba(255, 255, 255, 0.12);
@@ -105,23 +119,195 @@ body[data-ds-dark-theme] .view {
105
119
  --nf-text-2: #d1d1d6;
106
120
  --nf-text-2-alpha: rgba(209, 209, 214, 0.72);
107
121
  --nf-text-3: #8e8e93;
108
- --nf-accent: #0a84ff;
109
- --nf-accent-hover: #3a9bff;
110
- --nf-accent-soft: rgba(10, 132, 255, 0.2);
111
- --nf-accent-fg: #ffffff;
122
+ --nf-accent: #35d07a;
123
+ --nf-accent-hover: #5ce695;
124
+ --nf-accent-soft: rgba(53, 208, 122, 0.2);
125
+ --nf-accent-fg: #062b18;
112
126
  --nf-hover: rgba(255, 255, 255, 0.09);
113
127
  --nf-success: #30d158;
114
128
  --nf-error: #ff453a;
115
129
  --nf-warn: #ff9f0a;
116
- --nf-info: #bf5af2;
130
+ --nf-info: #35d07a;
117
131
  --nf-shadow: 0 1px 2px rgba(0, 0, 0, 0.35), 0 10px 30px rgba(0, 0, 0, 0.4);
118
132
  --nf-shadow-lg: 0 4px 12px rgba(0, 0, 0, 0.4), 0 20px 48px rgba(0, 0, 0, 0.55);
133
+ --nf-card-shadow: 0 2px 6px rgba(0, 0, 0, 0.35), 0 14px 38px rgba(0, 0, 0, 0.45);
134
+ --nf-card-shadow-hover: 0 4px 10px rgba(0, 0, 0, 0.4), 0 22px 52px rgba(0, 0, 0, 0.55);
135
+ /* Liquid Glass (dark): translucent charcoal glass face + soft bright core */
136
+ --nf-glass-face: linear-gradient(180deg, rgba(112, 116, 122, 0.42) 0%, rgba(96, 100, 106, 0.42) 26%, rgba(82, 85, 90, 0.42) 52%, rgba(68, 71, 76, 0.42) 78%, rgba(56, 58, 63, 0.42) 100%);
137
+ --nf-glass-core: radial-gradient(30% 24% at 36% 28%, rgba(255, 255, 255, 0.26) 0%, rgba(255, 255, 255, 0.10) 45%, rgba(255, 255, 255, 0) 78%);
138
+ --nf-glass-sheen: rgba(255, 255, 255, 0.26);
139
+ --nf-glass-border: rgba(255, 255, 255, 0.14);
140
+ --nf-glass-inset: rgba(255, 255, 255, 0.07);
141
+ --nf-glass-orb-a: rgba(0, 202, 82, 0.20);
142
+ --nf-glass-orb-b: rgba(190, 200, 215, 0.07);
143
+ --nf-glass-noise: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='180' height='180' filter='url(%23n)'/%3E%3C/svg%3E");
119
144
  }
120
145
 
121
146
  html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) .view {
122
147
  display: block;
123
148
  }
124
149
 
150
+ /* ------------------------------------------------------------ themes
151
+ * 'liquid' (default): iOS Liquid Glass, green accent — set on .view above.
152
+ * 'classic': original frosted iOS look, blue accent — overrides below.
153
+ */
154
+ .panel[data-nf-theme='classic'] {
155
+ --nf-accent: #007aff;
156
+ --nf-accent-hover: #0071e3;
157
+ --nf-accent-soft: rgba(0, 122, 255, 0.12);
158
+ --nf-accent-fg: #ffffff;
159
+ --nf-info: #5856d6;
160
+ --nf-glass-face: var(--nf-bg-raise);
161
+ --nf-glass-core: transparent;
162
+ --nf-glass-sheen: rgba(255, 255, 255, 0);
163
+ --nf-glass-border: var(--nf-border);
164
+ --nf-glass-inset: var(--nf-bg-inset);
165
+ --nf-glass-orb-a: transparent;
166
+ --nf-glass-orb-b: transparent;
167
+ --nf-glass-noise: none;
168
+ }
169
+
170
+ body[data-ds-dark-theme] .panel[data-nf-theme='classic'] {
171
+ --nf-accent: #0a84ff;
172
+ --nf-accent-hover: #3a9bff;
173
+ --nf-accent-soft: rgba(10, 132, 255, 0.2);
174
+ --nf-accent-fg: #ffffff;
175
+ --nf-info: #bf5af2;
176
+ --nf-glass-face: var(--nf-bg-raise);
177
+ --nf-glass-core: transparent;
178
+ --nf-glass-sheen: rgba(255, 255, 255, 0);
179
+ --nf-glass-border: var(--nf-border);
180
+ --nf-glass-inset: var(--nf-bg-inset);
181
+ --nf-glass-orb-a: transparent;
182
+ --nf-glass-orb-b: transparent;
183
+ --nf-glass-noise: none;
184
+ }
185
+
186
+ /* ------------------------------------------------------------
187
+ * 'neumorph': Neumorphism (dual-shadow soft UI).
188
+ * Light variant in light mode; a dark dual-shadow variant in dark
189
+ * mode so switching always has a visible effect.
190
+ * ------------------------------------------------------------ */
191
+ body:not([data-ds-dark-theme]) .panel[data-nf-theme='neumorph'] {
192
+ --nf-bg: #e4e9f2;
193
+ --nf-bg-raise: #e4e9f2;
194
+ --nf-bg-inset: #d9dfe8;
195
+ --nf-border: rgba(140, 155, 175, 0.35);
196
+ --nf-border-strong: rgba(120, 135, 158, 0.5);
197
+ --nf-text: #3a4250;
198
+ --nf-text-2: #5b6472;
199
+ --nf-text-2-alpha: rgba(70, 80, 96, 0.7);
200
+ --nf-text-3: #8b94a3;
201
+ --nf-hover: rgba(90, 105, 125, 0.08);
202
+ --nf-shadow: 4px 4px 10px rgba(163, 177, 198, 0.55), -4px -4px 10px rgba(255, 255, 255, 0.85);
203
+ --nf-shadow-lg: 6px 6px 14px rgba(163, 177, 198, 0.6), -6px -6px 14px rgba(255, 255, 255, 0.9);
204
+ --nf-card-shadow: 9px 9px 18px rgba(163, 177, 198, 0.55), -9px -9px 18px rgba(255, 255, 255, 0.85);
205
+ --nf-card-shadow-hover: 12px 12px 24px rgba(163, 177, 198, 0.65), -12px -12px 24px rgba(255, 255, 255, 0.95);
206
+ --nf-glass-face: #e4e9f2;
207
+ --nf-glass-core: transparent;
208
+ --nf-glass-sheen: rgba(255, 255, 255, 0);
209
+ --nf-glass-border: rgba(163, 177, 198, 0.4);
210
+ --nf-glass-inset: #d9dfe8;
211
+ --nf-glass-orb-a: transparent;
212
+ --nf-glass-orb-b: transparent;
213
+ --nf-glass-noise: none;
214
+ }
215
+
216
+ body[data-ds-dark-theme] .panel[data-nf-theme='neumorph'] {
217
+ --nf-bg: #2b2f36;
218
+ --nf-bg-raise: #2b2f36;
219
+ --nf-bg-inset: #25292f;
220
+ --nf-border: rgba(10, 12, 16, 0.5);
221
+ --nf-border-strong: rgba(8, 10, 14, 0.6);
222
+ --nf-text: #d6dae1;
223
+ --nf-text-2: #a8aeb8;
224
+ --nf-text-2-alpha: rgba(168, 174, 184, 0.7);
225
+ --nf-text-3: #757c88;
226
+ --nf-hover: rgba(255, 255, 255, 0.05);
227
+ --nf-shadow: 4px 4px 10px rgba(0, 0, 0, 0.5), -4px -4px 10px rgba(96, 104, 118, 0.24);
228
+ --nf-shadow-lg: 6px 6px 14px rgba(0, 0, 0, 0.55), -6px -6px 14px rgba(96, 104, 118, 0.26);
229
+ --nf-card-shadow: 9px 9px 18px rgba(0, 0, 0, 0.5), -9px -9px 18px rgba(96, 104, 118, 0.24);
230
+ --nf-card-shadow-hover: 12px 12px 24px rgba(0, 0, 0, 0.6), -12px -12px 24px rgba(96, 104, 118, 0.28);
231
+ --nf-glass-face: #2b2f36;
232
+ --nf-glass-core: transparent;
233
+ --nf-glass-sheen: rgba(255, 255, 255, 0);
234
+ --nf-glass-border: rgba(12, 14, 18, 0.45);
235
+ --nf-glass-inset: #25292f;
236
+ --nf-glass-orb-a: transparent;
237
+ --nf-glass-orb-b: transparent;
238
+ --nf-glass-noise: none;
239
+ }
240
+
241
+ /* Neumorphic inset inputs (sunken). */
242
+ body:not([data-ds-dark-theme]) .panel[data-nf-theme='neumorph'] .input,
243
+ body:not([data-ds-dark-theme]) .panel[data-nf-theme='neumorph'] .textarea {
244
+ background: var(--nf-bg-inset);
245
+ border-color: transparent;
246
+ box-shadow: inset 3px 3px 7px rgba(163, 177, 198, 0.55), inset -3px -3px 7px rgba(255, 255, 255, 0.9);
247
+ }
248
+
249
+ body:not([data-ds-dark-theme]) .panel[data-nf-theme='neumorph'] .input:focus,
250
+ body:not([data-ds-dark-theme]) .panel[data-nf-theme='neumorph'] .textarea:focus {
251
+ border-color: var(--nf-accent);
252
+ box-shadow: inset 2px 2px 6px rgba(163, 177, 198, 0.5), inset -2px -2px 6px rgba(255, 255, 255, 0.85), 0 0 0 3px var(--nf-accent-soft);
253
+ }
254
+
255
+ body[data-ds-dark-theme] .panel[data-nf-theme='neumorph'] .input,
256
+ body[data-ds-dark-theme] .panel[data-nf-theme='neumorph'] .textarea {
257
+ background: var(--nf-bg-inset);
258
+ border-color: transparent;
259
+ box-shadow: inset 3px 3px 7px rgba(0, 0, 0, 0.55), inset -3px -3px 7px rgba(96, 104, 118, 0.24);
260
+ }
261
+
262
+ body[data-ds-dark-theme] .panel[data-nf-theme='neumorph'] .input:focus,
263
+ body[data-ds-dark-theme] .panel[data-nf-theme='neumorph'] .textarea:focus {
264
+ border-color: var(--nf-accent);
265
+ box-shadow: inset 2px 2px 6px rgba(0, 0, 0, 0.5), inset -2px -2px 6px rgba(96, 104, 118, 0.22), 0 0 0 3px var(--nf-accent-soft);
266
+ }
267
+
268
+ /* Neumorphic raised buttons. */
269
+ body:not([data-ds-dark-theme]) .panel[data-nf-theme='neumorph'] .button {
270
+ border-color: transparent;
271
+ background: var(--nf-bg-raise);
272
+ box-shadow: 5px 5px 10px rgba(163, 177, 198, 0.55), -5px -5px 10px rgba(255, 255, 255, 0.9);
273
+ }
274
+
275
+ body:not([data-ds-dark-theme]) .panel[data-nf-theme='neumorph'] .button:hover:not([disabled]) {
276
+ background: var(--nf-bg-raise);
277
+ border-color: transparent;
278
+ box-shadow: 7px 7px 14px rgba(163, 177, 198, 0.6), -7px -7px 14px rgba(255, 255, 255, 0.95);
279
+ }
280
+
281
+ body:not([data-ds-dark-theme]) .panel[data-nf-theme='neumorph'] .button:active:not([disabled]) {
282
+ box-shadow: inset 3px 3px 7px rgba(163, 177, 198, 0.55), inset -3px -3px 7px rgba(255, 255, 255, 0.9);
283
+ }
284
+
285
+ body:not([data-ds-dark-theme]) .panel[data-nf-theme='neumorph'] .buttonPrimary {
286
+ background: linear-gradient(180deg, #00c563, #00a952);
287
+ box-shadow: 5px 5px 10px rgba(163, 177, 198, 0.6), -5px -5px 10px rgba(255, 255, 255, 0.85);
288
+ }
289
+
290
+ body[data-ds-dark-theme] .panel[data-nf-theme='neumorph'] .button {
291
+ border-color: transparent;
292
+ background: var(--nf-bg-raise);
293
+ box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.5), -5px -5px 10px rgba(96, 104, 118, 0.24);
294
+ }
295
+
296
+ body[data-ds-dark-theme] .panel[data-nf-theme='neumorph'] .button:hover:not([disabled]) {
297
+ background: var(--nf-bg-raise);
298
+ border-color: transparent;
299
+ box-shadow: 7px 7px 14px rgba(0, 0, 0, 0.55), -7px -7px 14px rgba(96, 104, 118, 0.26);
300
+ }
301
+
302
+ body[data-ds-dark-theme] .panel[data-nf-theme='neumorph'] .button:active:not([disabled]) {
303
+ box-shadow: inset 3px 3px 7px rgba(0, 0, 0, 0.55), inset -3px -3px 7px rgba(96, 104, 118, 0.24);
304
+ }
305
+
306
+ body[data-ds-dark-theme] .panel[data-nf-theme='neumorph'] .buttonPrimary {
307
+ background: linear-gradient(180deg, #3ddc86, #27b96a);
308
+ box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.5), -5px -5px 10px rgba(96, 104, 118, 0.24);
309
+ }
310
+
125
311
  /* ------------------------------------------------------------ panel shell */
126
312
 
127
313
  .panel {
@@ -132,20 +318,37 @@ html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-
132
318
  font-size: 14px;
133
319
  line-height: 1.6;
134
320
  position: relative;
321
+ overflow: hidden;
322
+ }
323
+
324
+ /* Liquid-Glass backdrop: colored orbs + vignette behind the frosted cards. */
325
+ .panel::before {
326
+ content: '';
327
+ position: absolute;
328
+ inset: 0;
329
+ z-index: 0;
330
+ pointer-events: none;
331
+ background:
332
+ radial-gradient(46% 36% at 18% 12%, var(--nf-glass-orb-a), transparent 70%),
333
+ radial-gradient(52% 42% at 88% 22%, var(--nf-glass-orb-b), transparent 72%),
334
+ radial-gradient(120% 95% at 50% 42%, transparent 55%, rgba(2, 2, 3, 0.10) 100%);
135
335
  }
136
336
 
137
337
  .panelHeader {
138
338
  display: flex;
139
339
  align-items: center;
140
340
  justify-content: space-between;
141
- padding: 12px 18px;
142
- border-bottom: 1px solid var(--nf-border);
341
+ margin: 10px 12px 0;
342
+ padding: 10px 16px;
343
+ border: 1px solid var(--nf-glass-border);
344
+ border-radius: 18px;
143
345
  flex-shrink: 0;
144
- background: var(--nf-bg-raise);
145
- -webkit-backdrop-filter: blur(24px) saturate(180%);
146
- backdrop-filter: blur(24px) saturate(180%);
346
+ background: var(--nf-glass-face);
347
+ box-shadow: var(--nf-shadow), inset 0 1px 0 var(--nf-glass-sheen);
348
+ -webkit-backdrop-filter: blur(28px) saturate(175%);
349
+ backdrop-filter: blur(28px) saturate(175%);
147
350
  position: sticky;
148
- top: 0;
351
+ top: 10px;
149
352
  z-index: 5;
150
353
  }
151
354
 
@@ -238,6 +441,8 @@ html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-
238
441
  display: flex;
239
442
  flex-direction: column;
240
443
  gap: 14px;
444
+ position: relative;
445
+ z-index: 1;
241
446
  }
242
447
 
243
448
  /* ------------------------------------------- body: left nav + content */
@@ -246,19 +451,25 @@ html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-
246
451
  flex: 1;
247
452
  min-height: 0;
248
453
  display: flex;
454
+ position: relative;
455
+ z-index: 1;
249
456
  }
250
457
 
251
458
  .panelNav {
252
459
  flex: none;
460
+ align-self: flex-start;
253
461
  width: 142px;
254
462
  display: flex;
255
463
  flex-direction: column;
256
- gap: 2px;
464
+ gap: 4px;
465
+ margin: 10px 0 10px 12px;
257
466
  padding: 10px 8px;
258
- border-right: 1px solid var(--nf-border);
259
- background: var(--nf-bg-raise);
260
- -webkit-backdrop-filter: blur(24px) saturate(180%);
261
- backdrop-filter: blur(24px) saturate(180%);
467
+ border: 1px solid var(--nf-glass-border);
468
+ border-radius: 16px;
469
+ background: var(--nf-glass-face);
470
+ box-shadow: var(--nf-shadow), inset 0 1px 0 var(--nf-glass-sheen);
471
+ -webkit-backdrop-filter: blur(28px) saturate(175%);
472
+ backdrop-filter: blur(28px) saturate(175%);
262
473
  overflow-y: auto;
263
474
  transition: width 0.18s ease;
264
475
  }
@@ -271,7 +482,7 @@ html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-
271
482
  .navGroup {
272
483
  display: flex;
273
484
  flex-direction: column;
274
- gap: 2px;
485
+ gap: 4px;
275
486
  }
276
487
 
277
488
  .navGroupLabel {
@@ -280,7 +491,7 @@ html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-
280
491
  letter-spacing: 0.6px;
281
492
  text-transform: uppercase;
282
493
  color: var(--nf-text-3);
283
- padding: 6px 10px 2px;
494
+ padding: 8px 10px 3px;
284
495
  user-select: none;
285
496
  }
286
497
 
@@ -293,6 +504,7 @@ html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-
293
504
  .navSpacer {
294
505
  flex: 1;
295
506
  min-height: 8px;
507
+ /* 导航卡片不再拉满全高(align-self: flex-start),此占位仅保留最小间距 */
296
508
  }
297
509
 
298
510
  /* 导航底部:关于(版本 + GitHub + 更新) */
@@ -456,7 +668,19 @@ html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-
456
668
  text-overflow: ellipsis;
457
669
  }
458
670
 
459
- /* 顶栏进度摘要 */
671
+ /* 顶栏副标题行:书名 + 进度摘要(iOS 大标题下方副标题) */
672
+ .panelSubtitle {
673
+ display: flex;
674
+ align-items: center;
675
+ gap: 8px;
676
+ font-size: 12px;
677
+ color: var(--nf-text-2);
678
+ padding: 0 4px 2px;
679
+ min-width: 0;
680
+ flex-wrap: wrap;
681
+ white-space: nowrap;
682
+ }
683
+
460
684
  .headerProgress {
461
685
  font-size: 12px;
462
686
  font-weight: 400;
@@ -464,7 +688,7 @@ html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-
464
688
  display: inline-flex;
465
689
  align-items: center;
466
690
  gap: 6px;
467
- margin-left: 4px;
691
+ margin-left: 0;
468
692
  white-space: nowrap;
469
693
  }
470
694
 
@@ -484,17 +708,60 @@ html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-
484
708
  /* ------------------------------------------------------------ cards */
485
709
 
486
710
  .card {
487
- border: 1px solid var(--nf-border);
488
- border-radius: 20px;
711
+ position: relative;
712
+ border: 1px solid var(--nf-glass-border);
713
+ border-radius: 22px;
489
714
  padding: 16px 18px;
490
715
  display: flex;
491
716
  flex-direction: column;
492
717
  gap: 10px;
493
- background: var(--nf-bg-raise);
494
- box-shadow: var(--nf-shadow);
495
- -webkit-backdrop-filter: blur(24px) saturate(180%);
496
- backdrop-filter: blur(24px) saturate(180%);
497
- transition: border-color 0.2s ease, box-shadow 0.2s ease;
718
+ background: var(--nf-glass-face);
719
+ box-shadow:
720
+ var(--nf-card-shadow),
721
+ inset 0 1.5px 0 var(--nf-glass-sheen),
722
+ inset 0 -1px 0 rgba(255, 255, 255, 0.25);
723
+ -webkit-backdrop-filter: blur(30px) saturate(180%);
724
+ backdrop-filter: blur(30px) saturate(180%);
725
+ transition: transform 0.22s ease, box-shadow 0.22s ease;
726
+ }
727
+
728
+ /* Liquid-Glass surface: bright core highlight + hairline sheen. */
729
+ .card::before {
730
+ content: '';
731
+ position: absolute;
732
+ inset: 0;
733
+ border-radius: inherit;
734
+ pointer-events: none;
735
+ background:
736
+ var(--nf-glass-core),
737
+ linear-gradient(90deg, transparent, var(--nf-glass-sheen), transparent) no-repeat 10% 0 / 80% 1px,
738
+ linear-gradient(156deg, rgba(255, 255, 255, 0.26) 0%, rgba(255, 255, 255, 0) 55%);
739
+ z-index: 0;
740
+ }
741
+
742
+ /* Subtle grain, barely visible. */
743
+ .card::after {
744
+ content: '';
745
+ position: absolute;
746
+ inset: 0;
747
+ border-radius: inherit;
748
+ pointer-events: none;
749
+ background: var(--nf-glass-noise);
750
+ opacity: 0.06;
751
+ z-index: 0;
752
+ }
753
+
754
+ .card:hover {
755
+ transform: translateY(-3px);
756
+ box-shadow:
757
+ var(--nf-card-shadow-hover),
758
+ inset 0 1.5px 0 var(--nf-glass-sheen),
759
+ inset 0 -1px 0 rgba(255, 255, 255, 0.25);
760
+ }
761
+
762
+ .card > * {
763
+ position: relative;
764
+ z-index: 1;
498
765
  }
499
766
 
500
767
  .cardTitle {
@@ -540,7 +807,7 @@ html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-
540
807
  border-color: transparent;
541
808
  background: linear-gradient(180deg, color-mix(in srgb, var(--nf-accent) 88%, #ffffff), var(--nf-accent));
542
809
  color: var(--nf-accent-fg);
543
- box-shadow: 0 2px 8px color-mix(in srgb, var(--nf-accent) 35%, transparent);
810
+ box-shadow: 0 2px 10px color-mix(in srgb, var(--nf-accent) 45%, transparent), 0 0 0 0.5px color-mix(in srgb, var(--nf-accent) 30%, transparent);
544
811
  }
545
812
 
546
813
  .buttonPrimary:hover:not([disabled]) {
@@ -973,7 +1240,7 @@ html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-
973
1240
  white-space: pre-wrap;
974
1241
  word-break: break-all;
975
1242
  color: var(--nf-text-2);
976
- font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1243
+ font-family: var(--nf-font-mono);
977
1244
  background: var(--nf-bg-inset);
978
1245
  line-height: 1.8;
979
1246
  }
@@ -1070,7 +1337,8 @@ html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-
1070
1337
  }
1071
1338
 
1072
1339
  .diffList {
1073
- max-height: 70vh;
1340
+ flex: 1;
1341
+ min-height: 0;
1074
1342
  overflow-y: auto;
1075
1343
  border: 1px solid var(--nf-border);
1076
1344
  border-radius: 8px;
@@ -1193,11 +1461,29 @@ html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-
1193
1461
  color: var(--nf-success);
1194
1462
  }
1195
1463
 
1196
- /* Revision workspace: left original editor + right instruction/preview, 1:1. */
1464
+ /* Chapter editor page: full-bleed, flex-fills the content pane (no card box). */
1465
+ .wsPage {
1466
+ display: flex;
1467
+ flex-direction: column;
1468
+ flex: 1;
1469
+ min-height: 0;
1470
+ gap: 10px;
1471
+ }
1472
+
1473
+ .wsPageHeader {
1474
+ display: flex;
1475
+ align-items: center;
1476
+ gap: 8px;
1477
+ flex: none;
1478
+ flex-wrap: wrap;
1479
+ }
1480
+
1197
1481
  .wsColumns {
1198
1482
  display: grid;
1199
1483
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
1200
1484
  gap: 14px;
1485
+ flex: 1;
1486
+ min-height: 0;
1201
1487
  }
1202
1488
 
1203
1489
  .wsColumn {
@@ -1205,13 +1491,14 @@ html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-
1205
1491
  flex-direction: column;
1206
1492
  gap: 8px;
1207
1493
  min-width: 0;
1494
+ min-height: 0;
1208
1495
  }
1209
1496
 
1210
1497
  .wsEditor {
1211
1498
  flex: 1;
1212
- min-height: 50vh;
1499
+ min-height: 0;
1213
1500
  resize: vertical;
1214
- font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1501
+ font-family: var(--nf-font);
1215
1502
  font-size: 13px;
1216
1503
  line-height: 1.75;
1217
1504
  white-space: pre-wrap;
@@ -1245,7 +1532,8 @@ html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-
1245
1532
 
1246
1533
  .wsPreviewText {
1247
1534
  margin: 0;
1248
- max-height: 55vh;
1535
+ flex: 1;
1536
+ min-height: 0;
1249
1537
  overflow: auto;
1250
1538
  font-size: 13px;
1251
1539
  line-height: 1.7;
@@ -1261,13 +1549,14 @@ html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-
1261
1549
  }
1262
1550
 
1263
1551
  .assetStat {
1264
- border: 1px solid var(--nf-border);
1265
- border-radius: 10px;
1552
+ border: 1px solid var(--nf-glass-border);
1553
+ border-radius: 14px;
1266
1554
  padding: 10px 12px;
1267
1555
  display: flex;
1268
1556
  flex-direction: column;
1269
1557
  gap: 4px;
1270
- background: var(--nf-bg-inset);
1558
+ background: var(--nf-glass-inset);
1559
+ box-shadow: inset 0 1px 0 var(--nf-glass-sheen);
1271
1560
  }
1272
1561
 
1273
1562
  .assetStatLabel {
@@ -1295,16 +1584,60 @@ html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-
1295
1584
  /* ------------------------------------------------ dashboard (workflow tab) */
1296
1585
 
1297
1586
  .dashHero {
1298
- border: 1px solid var(--nf-border);
1299
- border-radius: 16px;
1587
+ position: relative;
1588
+ border: 1px solid var(--nf-glass-border);
1589
+ border-radius: 22px;
1300
1590
  padding: 18px 20px;
1301
- background:
1302
- radial-gradient(1200px 400px at 110% -60%, color-mix(in srgb, var(--nf-accent) 16%, transparent), transparent 60%),
1303
- linear-gradient(135deg, var(--nf-bg-raise), color-mix(in srgb, var(--nf-accent) 5%, var(--nf-bg-raise)));
1304
- box-shadow: var(--nf-shadow);
1591
+ background: var(--nf-glass-face);
1592
+ box-shadow:
1593
+ var(--nf-card-shadow),
1594
+ inset 0 1.5px 0 var(--nf-glass-sheen),
1595
+ inset 0 -1px 0 rgba(255, 255, 255, 0.25);
1596
+ -webkit-backdrop-filter: blur(30px) saturate(180%);
1597
+ backdrop-filter: blur(30px) saturate(180%);
1305
1598
  display: flex;
1306
1599
  flex-direction: column;
1307
1600
  gap: 14px;
1601
+ transition: transform 0.22s ease, box-shadow 0.22s ease;
1602
+ }
1603
+
1604
+ /* Same Liquid-Glass surface as .card: bright core + hairline + green tint. */
1605
+ .dashHero::before {
1606
+ content: '';
1607
+ position: absolute;
1608
+ inset: 0;
1609
+ border-radius: inherit;
1610
+ pointer-events: none;
1611
+ background:
1612
+ radial-gradient(46% 40% at 92% -10%, color-mix(in srgb, var(--nf-accent) 13%, transparent), transparent 62%),
1613
+ var(--nf-glass-core),
1614
+ linear-gradient(90deg, transparent, var(--nf-glass-sheen), transparent) no-repeat 10% 0 / 80% 1px,
1615
+ linear-gradient(156deg, rgba(255, 255, 255, 0.26) 0%, rgba(255, 255, 255, 0) 55%);
1616
+ z-index: 0;
1617
+ }
1618
+
1619
+ .dashHero::after {
1620
+ content: '';
1621
+ position: absolute;
1622
+ inset: 0;
1623
+ border-radius: inherit;
1624
+ pointer-events: none;
1625
+ background: var(--nf-glass-noise);
1626
+ opacity: 0.06;
1627
+ z-index: 0;
1628
+ }
1629
+
1630
+ .dashHero:hover {
1631
+ transform: translateY(-3px);
1632
+ box-shadow:
1633
+ var(--nf-card-shadow-hover),
1634
+ inset 0 1.5px 0 var(--nf-glass-sheen),
1635
+ inset 0 -1px 0 rgba(255, 255, 255, 0.25);
1636
+ }
1637
+
1638
+ .dashHero > * {
1639
+ position: relative;
1640
+ z-index: 1;
1308
1641
  }
1309
1642
 
1310
1643
  .dashHeroEyebrow {
@@ -1338,9 +1671,10 @@ html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-
1338
1671
  display: flex;
1339
1672
  align-items: center;
1340
1673
  gap: 12px;
1341
- border: 1px solid var(--nf-border);
1342
- border-radius: 12px;
1343
- background: color-mix(in srgb, var(--nf-bg-base) 65%, transparent);
1674
+ border: 1px solid var(--nf-glass-border);
1675
+ border-radius: 14px;
1676
+ background: var(--nf-glass-inset);
1677
+ box-shadow: inset 0 1px 0 var(--nf-glass-sheen);
1344
1678
  padding: 10px 14px;
1345
1679
  }
1346
1680
 
@@ -1978,11 +2312,18 @@ html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-
1978
2312
  display: flex;
1979
2313
  align-items: center;
1980
2314
  gap: 10px;
1981
- padding: 8px 18px;
1982
- border-bottom: 1px solid var(--nf-border);
1983
- background: var(--nf-bg-raise);
2315
+ margin: 10px 12px 0;
2316
+ padding: 8px 14px;
2317
+ border: 1px solid var(--nf-glass-border);
2318
+ border-radius: 16px;
2319
+ background: var(--nf-glass-face);
2320
+ box-shadow: var(--nf-shadow), inset 0 1px 0 var(--nf-glass-sheen);
2321
+ -webkit-backdrop-filter: blur(26px) saturate(175%);
2322
+ backdrop-filter: blur(26px) saturate(175%);
1984
2323
  flex-shrink: 0;
1985
2324
  flex-wrap: wrap;
2325
+ position: relative;
2326
+ z-index: 1;
1986
2327
  }
1987
2328
 
1988
2329
  .bookshelfLabel {