@chengzhao-dev/dsh-quarto-book 0.4.3 → 0.6.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.
Files changed (86) hide show
  1. package/README.en.md +3 -3
  2. package/README.md +3 -3
  3. package/lib/tools/render-check.js +5 -2
  4. package/package.json +5 -2
  5. package/skills/designing-theme/SKILL.md +3 -2
  6. package/skills/designing-theme/assets/theme/css/base.css +216 -55
  7. package/skills/designing-theme/assets/theme/css/callouts.css +32 -23
  8. package/skills/designing-theme/assets/theme/css/code.css +84 -2
  9. package/skills/designing-theme/assets/theme/css/content.css +152 -36
  10. package/skills/designing-theme/assets/theme/css/landing.css +175 -54
  11. package/skills/designing-theme/assets/theme/css/nav.css +462 -35
  12. package/skills/designing-theme/assets/theme/css/sidebar.css +76 -31
  13. package/skills/designing-theme/assets/theme/css/tokens.css +34 -16
  14. package/skills/designing-theme/assets/theme/includes/fonts.html +1 -1
  15. package/skills/designing-theme/assets/theme/includes/footer.html +16 -7
  16. package/skills/designing-theme/assets/theme/includes/palette.html +420 -0
  17. package/skills/designing-theme/assets/theme/palettes/flexoki/brand-mark.svg +3 -0
  18. package/skills/designing-theme/assets/theme/palettes/flexoki/favicon-dark.svg +5 -0
  19. package/skills/designing-theme/assets/theme/palettes/flexoki/favicon-light.svg +5 -0
  20. package/skills/designing-theme/assets/theme/palettes/flexoki/highlight-dark.theme +214 -0
  21. package/skills/designing-theme/assets/theme/palettes/flexoki/highlight-light.theme +214 -0
  22. package/skills/designing-theme/assets/theme/palettes/flexoki/meta.md +53 -0
  23. package/skills/designing-theme/assets/theme/palettes/flexoki/theme-dark.scss +43 -0
  24. package/skills/designing-theme/assets/theme/palettes/flexoki/theme-light.scss +40 -0
  25. package/skills/designing-theme/assets/theme/palettes/flexoki/tokens.css +156 -0
  26. package/skills/designing-theme/assets/theme/palettes/hill-light/brand-mark.svg +3 -0
  27. package/skills/designing-theme/assets/theme/palettes/hill-light/favicon-dark.svg +5 -0
  28. package/skills/designing-theme/assets/theme/palettes/hill-light/favicon-light.svg +5 -0
  29. package/skills/designing-theme/assets/theme/palettes/hill-light/meta.md +78 -0
  30. package/skills/designing-theme/assets/theme/palettes/hill-light/syntax.css +150 -0
  31. package/skills/designing-theme/assets/theme/palettes/hill-light/tokens.css +322 -0
  32. package/skills/designing-theme/assets/theme/palettes/solarized/brand-mark.svg +3 -0
  33. package/skills/designing-theme/assets/theme/palettes/solarized/favicon-dark.svg +5 -0
  34. package/skills/designing-theme/assets/theme/palettes/solarized/favicon-light.svg +5 -0
  35. package/skills/designing-theme/assets/theme/palettes/solarized/highlight-dark.theme +214 -0
  36. package/skills/designing-theme/assets/theme/palettes/solarized/highlight-light.theme +214 -0
  37. package/skills/designing-theme/assets/theme/palettes/solarized/meta.md +66 -0
  38. package/skills/designing-theme/assets/theme/palettes/solarized/syntax.css +67 -0
  39. package/skills/designing-theme/assets/theme/palettes/solarized/theme-dark.scss +43 -0
  40. package/skills/designing-theme/assets/theme/palettes/solarized/theme-light.scss +41 -0
  41. package/skills/designing-theme/assets/theme/palettes/solarized/tokens.css +154 -0
  42. package/skills/designing-theme/knowledge/reading-surface.md +27 -15
  43. package/skills/designing-theme/references/theme-spine.md +2 -2
  44. package/skills/designing-theme/references/theme-system.md +82 -36
  45. package/skills/designing-theme/scripts/checking-layout.py +306 -48
  46. package/skills/designing-theme/scripts/measuring-pages.mjs +40 -3
  47. package/skills/writing-quarto/examples/01-language-scope.md +3 -3
  48. package/skills/writing-quarto/examples/02-structure-shape.md +5 -5
  49. package/skills/writing-quarto/examples/03-block-after.md +2 -2
  50. package/skills/writing-quarto/examples/03-excerpt-lead.md +6 -6
  51. package/skills/writing-quarto/examples/03-layout-list.md +15 -15
  52. package/skills/writing-quarto/examples/03-qmd-elements.md +4 -4
  53. package/skills/writing-quarto/examples/04-paragraph-cases.md +5 -5
  54. package/skills/writing-quarto/examples/04-paragraph-opening.md +3 -3
  55. package/skills/writing-quarto/examples/05-sentence-brevity.md +5 -5
  56. package/skills/writing-quarto/examples/05-sentence-frame.md +6 -6
  57. package/skills/writing-quarto/examples/05-sentence-reference.md +5 -5
  58. package/skills/writing-quarto/examples/06-wording-cases.md +8 -8
  59. package/skills/writing-quarto/examples/08-appendix.md +4 -4
  60. package/skills/writing-quarto/quarto/basics.md +24 -2
  61. package/skills/writing-quarto/quarto/comments.md +43 -0
  62. package/skills/writing-quarto/quarto/coords.md +4 -4
  63. package/skills/writing-quarto/quarto/encoding.md +35 -0
  64. package/skills/writing-quarto/quarto/mermaid.md +1 -1
  65. package/skills/writing-quarto/quarto/prose.md +86 -0
  66. package/skills/writing-quarto/quarto/render.md +17 -16
  67. package/skills/writing-quarto/quarto/terminal.md +3 -3
  68. package/skills/writing-quarto/scripts/checking-dom.py +20 -8
  69. package/skills/writing-quarto/scripts/verifying-content.py +12 -3
  70. package/skills/writing-quarto/steps/01-task.md +6 -6
  71. package/skills/writing-quarto/steps/02-structure.md +19 -19
  72. package/skills/writing-quarto/steps/03-blocks.md +40 -40
  73. package/skills/writing-quarto/steps/04-paragraphs.md +55 -55
  74. package/skills/writing-quarto/steps/05-sentences.md +42 -43
  75. package/skills/writing-quarto/steps/06-wording.md +9 -11
  76. package/skills/writing-quarto/steps/07-layout.md +21 -17
  77. package/skills/writing-quarto/steps/08-reread.md +9 -13
  78. package/templates/quarto-book-project/SKILL.md +1 -1
  79. package/skills/designing-theme/assets/theme/assets/brand-mark.svg +0 -4
  80. package/skills/designing-theme/assets/theme/assets/favicon.svg +0 -9
  81. package/skills/designing-theme/assets/theme/palettes/github/highlight-dark.theme +0 -213
  82. package/skills/designing-theme/assets/theme/palettes/github/highlight-light.theme +0 -213
  83. package/skills/designing-theme/assets/theme/palettes/github/meta.md +0 -38
  84. package/skills/designing-theme/assets/theme/palettes/github/theme-dark.scss +0 -35
  85. package/skills/designing-theme/assets/theme/palettes/github/theme-light.scss +0 -34
  86. package/skills/designing-theme/assets/theme/palettes/github/tokens.css +0 -160
@@ -3,9 +3,14 @@
3
3
  /* ---------- 顶部 navbar(品牌栏 + 次级导航) ---------- */
4
4
  /* Quarto 书籍启用 navbar 后,#quarto-header 内含两层:
5
5
  nav.navbar(品牌 + 搜索 + 主题切换)与 nav.quarto-secondary-nav(侧栏开关 + 面包屑)。
6
- 两层共用底色,仅在最底部画一条分隔线,整体视为一个 header。 */
6
+ 两层共用底色,整体视为一个 header:只在 #quarto-header 的底边画唯一一条通栏发丝线,
7
+ 让它横贯左栏、正文、右目录三栏;品牌行与面包屑行之间不加线。 */
7
8
  #quarto-header {
8
9
  background-color: var(--navbar-bg);
10
+ /* 全站唯一的通栏分隔线:三栏共用同一条,栏与栏之间不再用竖线切开。
11
+ 画在 header 上而不是次级导航上,侧栏列上方才不会断线,
12
+ 也不会和窄屏侧栏自带的底边叠成两条。 */
13
+ border-bottom: 1px solid var(--card-border);
9
14
  padding-left: env(safe-area-inset-left);
10
15
  padding-right: env(safe-area-inset-right);
11
16
  /* 注入 Bootstrap 变量,使 navbar 内组件在明暗两态都改用我们的 token
@@ -36,6 +41,7 @@ nav.navbar.navbar-expand-lg {
36
41
  flex: 1 1 auto;
37
42
  }
38
43
  #quarto-search {
44
+ position: relative;
39
45
  order: 2;
40
46
  margin-left: 0;
41
47
  flex: 0 1 auto;
@@ -44,13 +50,226 @@ nav.navbar.navbar-expand-lg {
44
50
  order: 3;
45
51
  margin-left: 0 !important;
46
52
  flex: 0 0 auto;
53
+ display: flex;
54
+ align-items: center;
55
+ gap: 0.35rem;
56
+ }
57
+ /* 控件顺序:分段控件在明暗圆钮左侧(阅读顺序:先选色板、再切明暗)。
58
+ Quarto 默认把明暗钮排在分段控件前,这里只挪明暗钮,源码链接图标仍在前。 */
59
+ .quarto-navbar-tools.tools-end .quarto-color-scheme-toggle {
60
+ order: 1;
61
+ }
62
+ /* ---------- 色板切换:下拉菜单 ----------
63
+ Flexoki / Solarized / Hill Light 三选一。早先是一枚三段胶囊,Hill Light 出现后
64
+ 又要并排一段四时辰,顶栏右端被挤到近 190px,窄屏只能把名字全裁掉。改成
65
+ 「当前色板 + 菜单」:闭合态一个色点加名字,展开后三套一次看全、选中项带勾。
66
+ 色点是三套色板各自的强调色,必须写死——菜单要同时显示三套,而激活态令牌互斥。 */
67
+ .palette-picker {
68
+ display: inline-flex;
69
+ align-items: center;
70
+ margin: 0 0.25rem;
71
+ }
72
+ .palette-menu {
73
+ position: relative;
74
+ }
75
+ .palette-trigger {
76
+ display: inline-flex;
77
+ align-items: center;
78
+ gap: 0.4rem;
79
+ height: 2rem;
80
+ padding: 0 0.45rem 0 0.55rem;
81
+ background-color: var(--navbar-input-bg);
82
+ color: var(--navbar-muted);
83
+ border: 1px solid var(--navbar-border);
84
+ border-radius: 999px;
85
+ font-family: var(--ui-font);
86
+ font-size: 0.75rem;
87
+ line-height: 1;
88
+ white-space: nowrap;
89
+ cursor: pointer;
90
+ transition: color 0.12s ease;
91
+ }
92
+ .palette-trigger:hover,
93
+ .palette-trigger[aria-expanded="true"] {
94
+ color: var(--navbar-fg);
95
+ }
96
+ .palette-trigger:focus-visible {
97
+ /* 用强调色而不是 --link-color:Flexoki 的链接是墨色下划线文本,2px 墨环压在胶囊上
98
+ 像误触的浏览器默认框;强调色与同排控件、选中态同一套语言。 */
99
+ outline: 2px solid var(--action-color);
100
+ outline-offset: 2px;
101
+ }
102
+ .palette-swatch {
103
+ flex: none;
104
+ width: 0.55rem;
105
+ height: 0.55rem;
106
+ border-radius: 50%;
107
+ background-color: var(--swatch, var(--navbar-muted));
108
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.14);
109
+ }
110
+ .palette-caret {
111
+ flex: none;
112
+ width: 10px;
113
+ height: 10px;
114
+ opacity: 0.65;
115
+ transition: transform 0.15s ease;
116
+ }
117
+ .palette-trigger[aria-expanded="true"] .palette-caret {
118
+ transform: rotate(180deg);
119
+ }
120
+ .palette-menu-list {
121
+ position: absolute;
122
+ top: calc(100% + 0.45rem);
123
+ right: 0;
124
+ z-index: 1060;
125
+ display: flex;
126
+ flex-direction: column;
127
+ gap: 0.1rem;
128
+ min-width: 10.5rem;
129
+ padding: 0.3rem;
130
+ background-color: var(--surface-raised);
131
+ border: 1px solid var(--card-border);
132
+ border-radius: 0.5rem;
133
+ box-shadow: 0 10px 26px rgba(0, 0, 0, 0.14);
134
+ }
135
+ .palette-menu-list[hidden] {
136
+ display: none;
137
+ }
138
+ .palette-menu-item {
139
+ display: flex;
140
+ align-items: center;
141
+ gap: 0.5rem;
142
+ width: 100%;
143
+ padding: 0.45rem 0.5rem;
144
+ border: 0;
145
+ border-radius: 0.35rem;
146
+ background-color: transparent;
147
+ color: var(--body-color);
148
+ font-family: var(--ui-font);
149
+ font-size: 0.8125rem;
150
+ line-height: 1;
151
+ text-align: left;
152
+ cursor: pointer;
153
+ }
154
+ .palette-menu-item.is-active,
155
+ .palette-menu-item:hover {
156
+ background-color: var(--navbar-hover-bg);
157
+ }
158
+ .palette-check {
159
+ flex: none;
160
+ width: 12px;
161
+ height: 12px;
162
+ margin-left: auto;
163
+ color: var(--action-color);
164
+ opacity: 0;
165
+ }
166
+ .palette-menu-item[aria-selected="true"] .palette-check {
167
+ opacity: 1;
168
+ }
169
+ .palette-trigger[data-key="flexoki"],
170
+ .palette-menu-item[data-key="flexoki"] {
171
+ --swatch: #24837b;
172
+ }
173
+ .palette-trigger[data-key="solarized"],
174
+ .palette-menu-item[data-key="solarized"] {
175
+ --swatch: #268bd2;
176
+ }
177
+ .palette-trigger[data-key="hill-light"],
178
+ .palette-menu-item[data-key="hill-light"] {
179
+ --swatch: #2d6a66;
180
+ }
181
+ /* ---------- 时辰切换(Hill Light):与色板同一胶囊,只在 Hill Light 下出现 ----------
182
+ Hill Light 的明暗由时辰决定(夜月是唯一暗色时辰),所以这种色板下让 Quarto 的
183
+ 明暗圆钮让位,避免两套开关同时出现、互相看不出谁生效。 */
184
+ .palette-picker[hidden] {
185
+ display: none;
186
+ }
187
+ .mode-picker .palette-segment {
188
+ display: inline-flex;
189
+ align-items: stretch;
190
+ height: 2rem;
191
+ padding: 2px;
192
+ gap: 2px;
193
+ background-color: var(--navbar-input-bg);
194
+ border: 1px solid var(--navbar-border);
195
+ border-radius: 999px;
196
+ }
197
+ .mode-picker .palette-segment-option {
198
+ display: inline-flex;
199
+ align-items: center;
200
+ justify-content: center;
201
+ gap: 0.3rem;
202
+ min-width: 0;
203
+ padding: 0 0.5rem;
204
+ border: 0;
205
+ border-radius: 999px;
206
+ background-color: transparent;
207
+ color: var(--navbar-muted);
208
+ font-family: var(--ui-font);
209
+ font-size: 0.75rem;
210
+ line-height: 1;
211
+ white-space: nowrap;
212
+ cursor: pointer;
213
+ transition: color 0.12s ease, background-color 0.12s ease;
214
+ }
215
+ .mode-picker .palette-segment-option svg {
216
+ flex: none;
217
+ width: 12px;
218
+ height: 12px;
219
+ }
220
+ .mode-picker .palette-segment-option:hover {
221
+ color: var(--navbar-fg);
222
+ }
223
+ .mode-picker .palette-segment-option[aria-checked="true"] {
224
+ background-color: var(--navbar-hover-bg);
225
+ color: var(--navbar-fg);
226
+ }
227
+ .mode-picker .palette-segment-option:focus-visible {
228
+ outline: 2px solid var(--action-color);
229
+ outline-offset: 2px;
230
+ }
231
+ html[data-palette="hill-light"] #quarto-header .quarto-navbar-tools .quarto-color-scheme-toggle {
232
+ display: none;
233
+ }
234
+ /* 窄屏先收控件本身:色板只留色点与箭头、四时只留图标,选中态仍是填色胶囊。 */
235
+ @media (max-width: 575.98px) {
236
+ .palette-picker {
237
+ margin: 0 0.05rem;
238
+ }
239
+ .palette-trigger {
240
+ padding: 0 0.4rem;
241
+ }
242
+ .palette-trigger-label {
243
+ display: none;
244
+ }
245
+ .mode-picker .palette-segment-option {
246
+ /* 图标态是触摸目标:低于 24×24 就不合 WCAG 2.5.8 */
247
+ min-width: 1.5rem;
248
+ min-height: 1.75rem;
249
+ padding: 0 0.35rem;
250
+ }
251
+ .palette-menu-item {
252
+ /* 手机上菜单项就是触摸目标,抬到 36px 一行 */
253
+ min-height: 2.25rem;
254
+ padding: 0.55rem 0.5rem;
255
+ }
256
+ .mode-picker .palette-mode-label {
257
+ display: none;
258
+ }
259
+ }
260
+ /* 420 以下标题已隐藏,再收掉仓库源图标:手机上没有「看源文件」的使用场景,
261
+ 腾出的宽度留给色板与四时,让搜索留在同一行而不是掉到第二行。 */
262
+ @media (max-width: 419.98px) {
263
+ .quarto-navbar-tools.tools-end > .quarto-navigation-tool {
264
+ display: none;
265
+ }
47
266
  }
48
267
  .navbar-brand,
49
268
  .navbar-title {
50
269
  color: var(--navbar-fg);
51
- font-family: var(--ui-font);
52
- /* 单字面字体 + font-synthesis: none 下 600 不会变粗,靠字号与图标区分 */
53
- font-weight: 400;
270
+ /* 与内容标题同一套黑体:顶栏书名是「站点标题」,不是正文,走 --heading-font */
271
+ font-family: var(--heading-font);
272
+ font-weight: 600;
54
273
  font-size: 1.125rem;
55
274
  letter-spacing: 0;
56
275
  }
@@ -59,25 +278,29 @@ nav.navbar.navbar-expand-lg {
59
278
  align-items: center;
60
279
  min-width: 0;
61
280
  min-height: 2rem;
281
+ /* 图标与标题之间留出一枚字距的呼吸,避免书标贴着“C” */
62
282
  gap: 0.5rem;
63
283
  }
64
- /* 品牌图标:顶部栏使用中性文档标记,favicon 保留 C++ 标记。
65
- 图形墨迹只占 SVG 画布的约 78%,因此尺寸取标题字号的 1.33 倍,让墨迹略高于汉字字面高度;
284
+ /* 品牌图标:顶部栏使用与 favicon 同一枚「打开的书」,纯黑剪影由 mask 取 --navbar-fg。
285
+ 图形墨迹占画布约四分之三,尺寸取标题字号的 1.11 倍,让墨迹略高于汉字字面高度;
66
286
  CJK 字形的墨迹中心比行框中心高约 0.17rem,用 margin-bottom 把图标抬到同一视觉基线,
67
287
  使图标底边与标题基线对齐,避免图标看上去比标题“坐得更低”。
68
- 用 mask 取 --navbar-fg 而不是直接引用 favicon:SVG 图片内部的 prefers-color-scheme
69
- 跟随运行环境,会在站点主题与系统偏好不一致时反转明暗,遮挡品牌形状。 */
288
+ 色板切换只换 mask 源,轮廓本身两套相同。 */
70
289
  .navbar-brand::before {
71
290
  content: "";
72
291
  display: inline-block;
73
- width: 1.5rem;
74
- height: 1.5rem;
292
+ width: 1.25rem;
293
+ height: 1.25rem;
75
294
  flex: 0 0 auto;
76
295
  margin-right: 0;
77
- margin-bottom: 0.375rem;
296
+ margin-bottom: 0.2rem;
78
297
  background-color: var(--navbar-fg);
79
- -webkit-mask: url("../assets/brand-mark.svg") center / contain no-repeat;
80
- mask: url("../assets/brand-mark.svg") center / contain no-repeat;
298
+ -webkit-mask: url("../palettes/flexoki/brand-mark.svg") center / contain no-repeat;
299
+ mask: url("../palettes/flexoki/brand-mark.svg") center / contain no-repeat;
300
+ }
301
+ html[data-palette="solarized"] .navbar-brand::before {
302
+ -webkit-mask: url("../palettes/solarized/brand-mark.svg") center / contain no-repeat;
303
+ mask: url("../palettes/solarized/brand-mark.svg") center / contain no-repeat;
81
304
  }
82
305
  .navbar-brand:hover {
83
306
  color: var(--navbar-fg);
@@ -100,8 +323,195 @@ nav.navbar.navbar-expand-lg {
100
323
  text-underline-offset: 0.25rem;
101
324
  text-decoration-thickness: 1px;
102
325
  }
103
- /* 搜索框(#quarto-search 渲染的 input,由 JS 运行时注入,可能挂载在深色 navbar 内)
104
- 故显式用主题 token 设背景/边框/文字,避免在 dark navbar 作用域下误用暗色 Bootstrap 变量 */
326
+ /* 搜索:Quarto 1.10 的 overlay 搜索由 Algolia 在运行时生成
327
+ #quarto-search > .aa-Autocomplete > button.aa-DetachedSearchButton,
328
+ 按钮内部已有一枚 svg.aa-SubmitIcon。不要再给 #quarto-search 画伪元素,
329
+ 否则同一位置会出现两个放大镜。这里只把内置按钮改成顶栏里的安静图标键。 */
330
+ #quarto-search .aa-Autocomplete {
331
+ display: inline-flex;
332
+ align-items: center;
333
+ }
334
+ #quarto-search .aa-DetachedSearchButton {
335
+ display: inline-flex;
336
+ align-items: center;
337
+ justify-content: center;
338
+ width: 2rem;
339
+ height: 2rem;
340
+ padding: 0;
341
+ border: 1px solid transparent;
342
+ border-radius: var(--radius-sm);
343
+ background: transparent;
344
+ color: var(--navbar-muted);
345
+ line-height: 1;
346
+ cursor: pointer;
347
+ transition: var(--transition);
348
+ }
349
+ #quarto-search .aa-DetachedSearchButton:hover {
350
+ background-color: var(--navbar-hover-bg);
351
+ color: var(--navbar-fg);
352
+ }
353
+ #quarto-search .aa-DetachedSearchButton:focus-visible {
354
+ outline: 2px solid var(--accent);
355
+ outline-offset: 2px;
356
+ }
357
+ #quarto-search .aa-DetachedSearchButtonIcon {
358
+ display: flex;
359
+ align-items: center;
360
+ justify-content: center;
361
+ margin: 0;
362
+ }
363
+ #quarto-search .aa-SubmitIcon {
364
+ width: 1.125rem;
365
+ height: 1.125rem;
366
+ }
367
+ /* Quarto 的 `.navbar #quarto-search.type-overlay .aa-Autocomplete svg.aa-SubmitIcon`
368
+ 带 3 个类名 + 2 个类型选择器,特异性高于上面的单类规则,会把图标钉回 26px
369
+ 并染成 darkly 的浅色。用同等特异性、后加载的规则覆盖成 18px 的顶栏静音色。 */
370
+ .navbar #quarto-search.type-overlay .aa-Autocomplete svg.aa-SubmitIcon {
371
+ width: 1.125rem !important;
372
+ height: 1.125rem !important;
373
+ color: var(--navbar-muted) !important;
374
+ fill: currentColor;
375
+ }
376
+ /* 搜索浮层:scrim + 纸面容器,输入与结果全部走令牌,暗色下不再是白底黑字 */
377
+ .aa-DetachedOverlay {
378
+ background: var(--overlay-scrim);
379
+ }
380
+ .aa-DetachedContainer {
381
+ background: var(--page-bg);
382
+ color: var(--body-color);
383
+ border: 1px solid var(--card-border);
384
+ border-radius: var(--radius-md);
385
+ box-shadow: none;
386
+ }
387
+ .aa-DetachedContainer--modal {
388
+ border: 1px solid var(--card-border);
389
+ border-radius: var(--radius-md);
390
+ max-width: 46rem;
391
+ }
392
+ /* 手机搜索条贴顶:Quarto 的桌面 top:100px 在窄屏会把搜索条压在正文中部;
393
+ 这里收掉左右圆角,做成一条通栏搜索栏。 */
394
+ @media (max-width: 575.98px) {
395
+ .aa-DetachedContainer--modal {
396
+ top: 0;
397
+ width: 100%;
398
+ max-width: 100%;
399
+ border-left: 0;
400
+ border-right: 0;
401
+ border-radius: 0;
402
+ }
403
+ }
404
+ /* Quarto 按 darkly 编译了浮层:容器 #222、表单 #222、输入 #2B2B2A。
405
+ 这里用 `.aa-DetachedContainer` 作用域把表单、面板、结果全部拉回纸面令牌。 */
406
+ .aa-DetachedContainer .aa-DetachedFormContainer {
407
+ background-color: var(--page-bg);
408
+ border-bottom: 1px solid var(--card-border);
409
+ }
410
+ .aa-DetachedContainer .aa-Form {
411
+ background: transparent;
412
+ border: 0;
413
+ }
414
+ .aa-DetachedContainer .aa-Input {
415
+ background: transparent;
416
+ color: var(--body-color);
417
+ font-family: var(--ui-font);
418
+ font-size: 1rem;
419
+ }
420
+ /* Quarto 的输入框规则是 4 个类名(.aa-DetachedFormContainer .aa-Form
421
+ .aa-InputWrapper .aa-Input),暗色版把文字钉成 #2B2B2A、背景钉成浅灰。
422
+ 用同等长度的选择器把输入框拉回纸面。 */
423
+ .aa-DetachedContainer .aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input {
424
+ background: transparent !important;
425
+ background-color: transparent !important;
426
+ color: var(--body-color) !important;
427
+ box-shadow: none;
428
+ border: 0;
429
+ }
430
+ .aa-DetachedContainer .aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::placeholder {
431
+ color: var(--text-secondary) !important;
432
+ opacity: 1;
433
+ }
434
+ /* 去掉浏览器默认的蓝色焦点环,改由表单底边变动作色表示焦点。 */
435
+ .aa-DetachedContainer .aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input:focus {
436
+ outline: none !important;
437
+ box-shadow: none !important;
438
+ }
439
+ .aa-DetachedContainer .aa-DetachedFormContainer {
440
+ transition: border-color var(--transition);
441
+ }
442
+ .aa-DetachedContainer .aa-DetachedFormContainer:focus-within {
443
+ border-bottom-color: var(--action-color);
444
+ }
445
+ .aa-DetachedContainer .aa-DetachedCancelButton {
446
+ flex: 0 0 auto;
447
+ padding: 0 0.25em;
448
+ margin-left: 0.4em;
449
+ white-space: nowrap;
450
+ font-size: 0.8125rem;
451
+ }
452
+ .aa-DetachedContainer .aa-SubmitButton,
453
+ .aa-DetachedContainer .aa-ClearButton,
454
+ .aa-DetachedContainer .aa-DetachedCancelButton {
455
+ color: var(--text-secondary);
456
+ font-family: var(--ui-font);
457
+ }
458
+ .aa-DetachedContainer .aa-SubmitButton:hover,
459
+ .aa-DetachedContainer .aa-ClearButton:hover,
460
+ .aa-DetachedContainer .aa-DetachedCancelButton:hover {
461
+ color: var(--body-color);
462
+ }
463
+ .aa-DetachedContainer .aa-Panel,
464
+ .aa-DetachedContainer .aa-PanelLayout,
465
+ .aa-DetachedContainer .aa-List {
466
+ background: var(--page-bg);
467
+ color: var(--body-color);
468
+ }
469
+ .aa-DetachedContainer .aa-Panel {
470
+ border: 0;
471
+ box-shadow: none;
472
+ }
473
+ .aa-DetachedContainer .aa-Item .search-result-doc {
474
+ border-top-color: var(--card-border);
475
+ }
476
+ .aa-DetachedContainer .aa-Item {
477
+ border-radius: 0;
478
+ }
479
+ .aa-DetachedContainer .aa-Item .search-item {
480
+ background-color: transparent;
481
+ border-color: var(--card-border);
482
+ color: var(--body-color);
483
+ }
484
+ .aa-DetachedContainer li.aa-Item[aria-selected="true"] .search-item,
485
+ .aa-DetachedContainer li.aa-Item[aria-selected="true"] .search-item .search-result-section,
486
+ .aa-DetachedContainer li.aa-Item[aria-selected="true"] .search-item .search-result-text,
487
+ .aa-DetachedContainer li.aa-Item[aria-selected="true"] .search-item .search-result-title-container,
488
+ .aa-DetachedContainer li.aa-Item[aria-selected="true"] .search-item .search-result-text-container {
489
+ background-color: var(--surface-raised);
490
+ color: var(--body-color);
491
+ }
492
+ .aa-DetachedContainer li.aa-Item[aria-selected="false"] .search-item,
493
+ .aa-DetachedContainer li.aa-Item[aria-selected="false"] .search-item .search-result-section,
494
+ .aa-DetachedContainer li.aa-Item[aria-selected="false"] .search-item .search-result-text,
495
+ .aa-DetachedContainer li.aa-Item[aria-selected="false"] .search-item .search-result-title-container,
496
+ .aa-DetachedContainer li.aa-Item[aria-selected="false"] .search-item .search-result-text-container {
497
+ background-color: transparent;
498
+ color: var(--body-color);
499
+ }
500
+ .aa-DetachedContainer .aa-Item .search-item mark.search-match {
501
+ background-color: var(--mark-bg);
502
+ color: inherit;
503
+ }
504
+ .aa-DetachedContainer .aa-SourceHeader .search-result-header {
505
+ background-color: var(--surface-raised);
506
+ color: var(--text-secondary);
507
+ }
508
+ .aa-DetachedContainer .aa-ItemContentTitle {
509
+ color: var(--body-color);
510
+ }
511
+ .aa-DetachedContainer .aa-ItemContentDescription {
512
+ color: var(--text-secondary);
513
+ }
514
+ /* 旧版搜索输入(非 overlay)若被启用,同样走令牌 */
105
515
  #quarto-search input,
106
516
  .quarto-navbar-search input {
107
517
  background-color: var(--navbar-input-bg);
@@ -109,37 +519,29 @@ nav.navbar.navbar-expand-lg {
109
519
  border-radius: var(--radius-sm);
110
520
  color: var(--navbar-fg);
111
521
  height: 1.875rem;
112
- width: 11rem;
113
- padding-left: 1.9rem;
522
+ padding: 0 0.6rem;
114
523
  font-size: 0.8125rem;
115
- transition: border-color var(--transition);
116
- /* data URI 无法读取 CSS 变量;图标颜色与 --navbar-muted 同步。 */
117
- background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="%23656D76" viewBox="0 0 16 16"><path d="M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z"/></svg>');
118
- background-repeat: no-repeat;
119
- background-position: 0.6rem center;
120
- background-size: 1.125rem 1.125rem;
121
- }
122
- body.quarto-dark #quarto-search input,
123
- body.quarto-dark .quarto-navbar-search input {
124
- background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="%23B1BAC4" viewBox="0 0 16 16"><path d="M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 1 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z"/></svg>');
125
524
  }
126
525
  #quarto-search input:focus,
127
526
  .quarto-navbar-search input:focus {
128
527
  border-color: var(--accent);
129
528
  box-shadow: none;
130
529
  }
131
- /* 占位符颜色:顶栏深色,占位符用 --navbar-muted */
132
530
  #quarto-search input::placeholder,
133
531
  .quarto-navbar-search input::placeholder {
134
532
  color: var(--navbar-muted);
135
533
  opacity: 1;
136
534
  }
137
- /* 搜索结果浮层跟随主题(navbar 固定 data-bs-theme=dark,浅色下需兜底) */
535
+ /* Quarto 会在 body 顶部插入一个空的结果容器;没有结果时不要它画出 1px 边框 */
138
536
  #quarto-search-results {
139
- background-color: var(--card-bg);
140
- border: 1px solid var(--card-border);
537
+ background-color: transparent;
538
+ border: 0;
141
539
  color: var(--body-color);
142
540
  }
541
+ #quarto-search-results .aa-Panel {
542
+ background-color: var(--page-bg);
543
+ border: 1px solid var(--card-border);
544
+ }
143
545
  #quarto-search-results a {
144
546
  color: var(--text-link);
145
547
  }
@@ -177,7 +579,7 @@ body.quarto-dark .quarto-navbar-search input {
177
579
  display: none;
178
580
  }
179
581
  }
180
- /* 主题切换:可点区域 44px,图标仍是 18px */
582
+ /* 主题切换:可点区域 44px,图标仍是 16px */
181
583
  #quarto-header .quarto-color-scheme-toggle {
182
584
  color: var(--navbar-fg);
183
585
  border-radius: 50%;
@@ -192,12 +594,37 @@ body.quarto-dark .quarto-navbar-search input {
192
594
  color: var(--navbar-fg);
193
595
  background-color: var(--navbar-hover-bg);
194
596
  }
195
- /* 次级导航:gitcn 风半透明毛玻璃 + 底部 1px 发丝线(sticky 由 headroom 提供) */
597
+ /* 换了 Quarto 自带的图标:它塞的是一枚「开关」位图(bi-toggle-off/on 的
598
+ data-URI background-image),填充色写死在 SVG 里,和我们这套描边图标不是
599
+ 一味,紧挨着色板胶囊时两枚圆角疙瘩还容易看混。改画一枚对比圆盘:
600
+ ::before 只做遮罩,颜色吃 currentColor,明暗两种顶栏都自动适配;
601
+ 夜间(.alternate)旋转半圈,实心那半换边,点一下能看出翻面了。 */
602
+ #quarto-header .quarto-color-scheme-toggle .bi::before {
603
+ content: "";
604
+ width: 1rem;
605
+ height: 1rem;
606
+ background-image: none;
607
+ background-color: currentColor;
608
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='6.2' fill='none' stroke='%23000' stroke-width='1.2'/%3E%3Cpath d='M8 2.4a5.6 5.6 0 0 0 0 11.2z' fill='%23000'/%3E%3C/svg%3E") center / contain no-repeat;
609
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='6.2' fill='none' stroke='%23000' stroke-width='1.2'/%3E%3Cpath d='M8 2.4a5.6 5.6 0 0 0 0 11.2z' fill='%23000'/%3E%3C/svg%3E") center / contain no-repeat;
610
+ transition: transform 0.18s ease;
611
+ }
612
+ #quarto-header .quarto-color-scheme-toggle.alternate .bi::before {
613
+ transform: rotate(180deg);
614
+ }
615
+ @media (prefers-reduced-motion: reduce) {
616
+ #quarto-header .quarto-color-scheme-toggle .bi::before {
617
+ transition: none;
618
+ }
619
+ }
620
+ /* 次级导航:gitcn 风半透明毛玻璃(sticky 由 headroom 提供)。
621
+ 底边线不画在这里:它只跟着面包屑行走,会在侧栏列上方断开,
622
+ 并可能与窄屏侧栏的底边叠成两条;唯一那条线归 #quarto-header 所有。 */
196
623
  nav.quarto-secondary-nav {
197
624
  background-color: var(--navbar-secondary-bg);
198
625
  -webkit-backdrop-filter: blur(8px);
199
626
  backdrop-filter: blur(8px);
200
- border-bottom: 1px solid var(--card-border);
627
+ border-bottom: 0;
201
628
  min-height: 2.75rem;
202
629
  padding-top: 0;
203
630
  padding-bottom: 0;
@@ -219,7 +646,7 @@ nav.quarto-secondary-nav .quarto-btn-toggle {
219
646
  }
220
647
  /* 修「>」与前后文字不在一条水平线:条目做成 flex 行(清掉 Quarto 的 .33em padding);
221
648
  分隔符不用 ">" 字符——Segoe UI 的 ">" 在字框内光学偏高(盒居中≠光学居中,CJK 字形
222
- 偏满放大观感),改用 SVG chevron(mask + currentColor,docs/GitHub 同款)几何居中、
649
+ 偏满放大观感),改用 SVG chevron(mask + currentColor,与常见文档站一致)几何居中、
223
650
  与字体度量彻底解耦;箭头左右等距:左距 = 本元素 margin-left,右距 = li 的 flex gap;
224
651
  ol 自身 margin 清零,标题块 nav→标题的间距由 .quarto-title-breadcrumbs 统一控制 */
225
652
  .quarto-page-breadcrumbs .breadcrumb {