@fest-lib/veela 0.1.20 → 1.0.1

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 (141) hide show
  1. package/dist/veela.js +4 -33
  2. package/package.json +9 -2
  3. package/src/scss/_layers.scss +5 -34
  4. package/src/scss/basic/{misc/_core-layout.scss → _core-layout.scss} +1 -1
  5. package/src/scss/basic/_layers.scss +1 -0
  6. package/src/scss/basic/{misc/_layout.scss → _layout.scss} +15 -15
  7. package/src/scss/basic/{misc/_normalize.scss → _normalize.scss} +5 -103
  8. package/src/scss/basic/{misc/_states.scss → _states.scss} +2 -2
  9. package/src/scss/{core/misc → basic}/_utilities.scss +4 -4
  10. package/src/scss/basic/design/_keyframes.scss +1 -1
  11. package/src/scss/basic/design/_shapes.scss +1 -1
  12. package/src/scss/basic/index.scss +14 -16
  13. package/src/scss/chrome.scss +2 -0
  14. package/src/scss/core/_color-mod.scss +24 -0
  15. package/src/scss/core/{misc/_color-properties.scss → _color-properties.scss} +1 -1
  16. package/src/scss/core/{misc/_tokens.scss → _tokens.scss} +10 -93
  17. package/src/scss/core/index.scss +13 -1
  18. package/src/scss/index.scss +7 -2
  19. package/src/scss/index.ts +1 -1
  20. package/src/scss/{core/interact → interact}/_viewport.scss +1 -1
  21. package/src/scss/interact/index.scss +18 -0
  22. package/src/scss/theme/_effects.scss +60 -0
  23. package/src/scss/theme/index.scss +8 -0
  24. package/src/scss/{advanced/index.ts → theme/loader.ts} +3 -4
  25. package/src/scss/ui/_bar.scss +268 -0
  26. package/src/scss/ui/_buttons.scss +215 -0
  27. package/src/scss/ui/_chrome-mixins.scss +104 -0
  28. package/src/scss/ui/_color.scss +3 -0
  29. package/src/scss/ui/_colorize.scss +5 -0
  30. package/src/scss/{advanced/layout → ui}/_content.scss +0 -1
  31. package/src/scss/ui/_core-layout.scss +4 -0
  32. package/src/scss/ui/_essentials-options.scss +2 -0
  33. package/src/scss/ui/_essentials.scss +707 -0
  34. package/src/scss/ui/_explorer-content.scss +417 -0
  35. package/src/scss/ui/_explorer.scss +274 -0
  36. package/src/scss/ui/_forms-bare-host-elements.scss +25 -0
  37. package/src/scss/ui/_forms-options.scss +2 -0
  38. package/src/scss/ui/_forms.scss +279 -0
  39. package/src/scss/ui/_forms_misc.scss +201 -0
  40. package/src/scss/ui/_gridbox.scss +298 -0
  41. package/src/scss/ui/_home-host.scss +192 -0
  42. package/src/scss/ui/_index.scss +23 -0
  43. package/src/scss/ui/_launcher-typography.scss +31 -0
  44. package/src/scss/ui/_layers.scss +48 -0
  45. package/src/scss/ui/_layout.scss +3 -0
  46. package/src/scss/ui/_markdown.scss +1634 -0
  47. package/src/scss/ui/_modal.scss +309 -0
  48. package/src/scss/ui/_motion.scss +3 -0
  49. package/src/scss/ui/_native-host-button-chrome.scss +31 -0
  50. package/src/scss/ui/_normalize.scss +5 -0
  51. package/src/scss/ui/_orientation-functions.scss +273 -0
  52. package/src/scss/ui/_orientbox.scss +97 -0
  53. package/src/scss/ui/_scrollbar.scss +257 -0
  54. package/src/scss/ui/_shared-overlays.scss +16 -0
  55. package/src/scss/ui/_shared.scss +4 -0
  56. package/src/scss/ui/_sidebar.scss +478 -0
  57. package/src/scss/ui/_speed-dial.scss +47 -0
  58. package/src/scss/ui/_states.scss +4 -0
  59. package/src/scss/ui/_tables.scss +28 -0
  60. package/src/scss/ui/_tabs.scss +405 -0
  61. package/src/scss/ui/_taskbar.scss +215 -0
  62. package/src/scss/ui/_toolbars.scss +167 -0
  63. package/src/scss/ui/_typography.scss +11 -0
  64. package/src/scss/ui/_utils.scss +8 -0
  65. package/src/scss/ui/_viewport.scss +470 -0
  66. package/src/scss/ui/_window-frame.scss +658 -0
  67. package/src/scss/ui/components/app-menu.scss +817 -0
  68. package/src/scss/ui/components/appearance-desktop.scss +14 -0
  69. package/src/scss/ui/components/appearance-mobile.scss +14 -0
  70. package/src/scss/ui/components/calendar/flyout.scss +194 -0
  71. package/src/scss/ui/components/calendar/index.scss +627 -0
  72. package/src/scss/ui/components/explorer-settings.scss +232 -0
  73. package/src/scss/ui/components/file-manager-content.scss +2 -0
  74. package/src/scss/ui/components/file-manager.scss +2 -0
  75. package/src/scss/ui/components/launcher-icon-mask.scss +34 -0
  76. package/src/scss/ui/components/navbar.scss +133 -0
  77. package/src/scss/ui/components/quick-settings.scss +321 -0
  78. package/src/scss/ui/components/scrollframe.scss +58 -0
  79. package/src/scss/ui/components/slider.scss +188 -0
  80. package/src/scss/ui/components/speed-dial.scss +2288 -0
  81. package/src/scss/ui/components/statusbar.scss +255 -0
  82. package/src/scss/ui/components/task.scss +118 -0
  83. package/src/scss/ui/components/taskbar.scss +514 -0
  84. package/src/scss/ui/components/text.scss +241 -0
  85. package/src/scss/ui/components/window.scss +601 -0
  86. package/src/scss/ui/home-host-apply.scss +10 -0
  87. package/src/scss/ui/index.scss +7 -0
  88. package/src/scss/ui/native-controls.scss +17 -0
  89. package/src/scss/advanced/_index.scss +0 -0
  90. package/src/scss/advanced/animation/_motion.scss +0 -323
  91. package/src/scss/advanced/color/_color.scss +0 -328
  92. package/src/scss/advanced/color/_colorize.scss +0 -325
  93. package/src/scss/advanced/design/_design-tokens.scss +0 -118
  94. package/src/scss/advanced/design/_effects.scss +0 -275
  95. package/src/scss/advanced/design/_shadow.scss +0 -359
  96. package/src/scss/advanced/design/_surfaces.scss +0 -76
  97. package/src/scss/advanced/effects/_animations.scss +0 -124
  98. package/src/scss/advanced/effects/_shadows.scss +0 -50
  99. package/src/scss/advanced/font/_typography.scss +0 -601
  100. package/src/scss/advanced/index.scss +0 -11
  101. package/src/scss/advanced/layout/_index.scss +0 -5
  102. package/src/scss/advanced/layout/_normalize.scss +0 -543
  103. package/src/scss/advanced/layout/_shared-overlays.scss +0 -162
  104. package/src/scss/advanced/md3/_md3.scss +0 -506
  105. package/src/scss/advanced/md3/_utils.scss +0 -114
  106. package/src/scss/advanced/misc/_config.scss +0 -119
  107. package/src/scss/advanced/misc/_initials.scss +0 -298
  108. package/src/scss/advanced/misc/_mixins.scss +0 -179
  109. package/src/scss/advanced/misc/_rendering.scss +0 -82
  110. package/src/scss/advanced/misc/_tokens.scss +0 -74
  111. package/src/scss/advanced/theme/_shared.scss +0 -232
  112. package/src/scss/advanced/theme/_states.scss +0 -332
  113. package/src/scss/advanced/theme/_variants.scss +0 -354
  114. package/src/scss/advanced/tokens/_material-color.scss +0 -120
  115. package/src/scss/advanced/tokens/_variables.scss +0 -171
  116. package/src/scss/basic/misc/_index.scss +0 -18
  117. package/src/scss/basic/misc/_mixins.scss +0 -179
  118. package/src/scss/basic/misc/_queries.scss +0 -34
  119. package/src/scss/basic/misc/_tokens.scss +0 -78
  120. package/src/scss/basic/misc/_veela.scss +0 -12
  121. package/src/scss/core/misc/_index.scss +0 -6
  122. /package/src/scss/basic/{misc/_motion.scss → _motion.scss} +0 -0
  123. /package/src/scss/{advanced/misc → basic}/_queries.scss +0 -0
  124. /package/src/scss/basic/{misc/_shared.scss → _shared.scss} +0 -0
  125. /package/src/scss/core/{misc/_config.scss → _config.scss} +0 -0
  126. /package/src/scss/core/{misc/_functions.scss → _functions.scss} +0 -0
  127. /package/src/scss/core/{misc/_icons.scss → _icons.scss} +0 -0
  128. /package/src/scss/core/{misc/_layout.scss → _layout.scss} +0 -0
  129. /package/src/scss/core/{misc/_mixins.scss → _mixins.scss} +0 -0
  130. /package/src/scss/core/{misc/_properties.scss → _properties.scss} +0 -0
  131. /package/src/scss/core/{misc/_utils.scss → _utils.scss} +0 -0
  132. /package/src/scss/{core/interact → interact}/_draggable.scss +0 -0
  133. /package/src/scss/{core/interact → interact}/_position.scss +0 -0
  134. /package/src/scss/{core/interact → interact}/_ps-anchor.scss +0 -0
  135. /package/src/scss/{core/interact → interact}/_ps-centered.scss +0 -0
  136. /package/src/scss/{core/interact → interact}/_ps-cursor.scss +0 -0
  137. /package/src/scss/{core/interact → interact}/_ps-draggable.scss +0 -0
  138. /package/src/scss/{core/interact → interact}/_ps-mechanic.scss +0 -0
  139. /package/src/scss/{core/interact → interact}/_ps-properties.scss +0 -0
  140. /package/src/scss/{core/interact → interact}/_ps-resizable.scss +0 -0
  141. /package/src/scss/{core/interact → interact}/_resizable.scss +0 -0
@@ -0,0 +1,1634 @@
1
+ /* stylelint-disable scss/at-else-empty-line-before */
2
+ /* stylelint-disable at-rule-empty-line-before */
3
+
4
+ /*
5
+ * markdown-viewer.scss — optimized/refactored
6
+ *
7
+ * Стратегия:
8
+ * - shared Veela layer registry; no local prelude
9
+ * - light-dark() + color-scheme: inherit — вместо двух @media prefers-color-scheme
10
+ * - @each по SCSS-map для heading-размеров (одно место правды)
11
+ * - %img-align placeholder — устраняет 7-кратный повтор [align] / [width] / [height]
12
+ * - @mixin img-base / code-reset / print-reset — DRY для print/screen
13
+ * - container queries вместо @media width там, где поддерживается
14
+ * - logical properties везде (inline-size, block-size, inset-*)
15
+ * - color-mix(in oklab, …) для полупрозрачных границ
16
+ * - print: grayscale через filter: grayscale(1) только на img/svg
17
+ * - !important только там, где реально нужно бороться с внешним JS-стилем
18
+ */
19
+
20
+ @use "sass:map";
21
+ @use "sass:list";
22
+ @use "../layers";
23
+ @use "../core/config" as config;
24
+ @use "../core/tokens" as tokens;
25
+ @use "../core/mixins" as mixins;
26
+
27
+ /* ─── Animations ──────────────────────────────────────────────────────────── */
28
+
29
+ @keyframes spin {
30
+ to {
31
+ transform: rotate(360deg);
32
+ }
33
+ }
34
+
35
+ @keyframes fade-in {
36
+ from {
37
+ opacity: 0;
38
+ translate: 0 10px;
39
+ }
40
+
41
+ to {
42
+ opacity: 1;
43
+ }
44
+ }
45
+
46
+ /* ─── Page ────────────────────────────────────────────────────────────────── */
47
+
48
+ @page {
49
+ size: a4;
50
+ margin: #{config.md-config("page", "margin")};
51
+
52
+ @bottom-center {
53
+ content: counter(page);
54
+ font-family: var(--print-font-family-sans);
55
+ font-size: 10pt;
56
+ }
57
+
58
+ @top-right {
59
+ content: "UC";
60
+ font-family: var(--print-font-family-sans);
61
+ font-size: 10pt;
62
+ }
63
+ }
64
+
65
+ @page :first {
66
+ margin-block: 2cm 2.5cm;
67
+ margin-inline: 2cm;
68
+ }
69
+
70
+ @page :left {
71
+ margin-inline: 2cm;
72
+ }
73
+
74
+ @page :right {
75
+ margin-inline: 2cm;
76
+ }
77
+
78
+ /* Named pages */
79
+ @page narrow {
80
+ size: a5 portrait;
81
+ margin: 1.5cm;
82
+ }
83
+
84
+ @page wide {
85
+ size: a4 landscape;
86
+ margin: 2cm;
87
+ }
88
+
89
+ @page letter {
90
+ size: letter;
91
+ margin: 2.5cm 2cm;
92
+ }
93
+
94
+ @page legal {
95
+ size: legal;
96
+ margin: 2.5cm 2cm;
97
+ }
98
+
99
+ @page professional {
100
+ size: a4;
101
+ margin: 2.5cm 2cm;
102
+ marks: crop cross;
103
+ bleed: .25cm;
104
+ }
105
+
106
+ @page booklet {
107
+ size: a5;
108
+ margin: 1.5cm;
109
+ }
110
+
111
+ @page draft {
112
+ size: a4;
113
+ margin: 2cm 1.5cm;
114
+ }
115
+
116
+ /* ─── Local helpers (file-scope) ──────────────────────────────────────────── */
117
+
118
+ /* Heading sizes: одна точка правды */
119
+ $_h-sizes: (
120
+ h1: (screen: 2em, print: 2em),
121
+ h2: (screen: 1.5em, print: 1.5em),
122
+ h3: (screen: 1.25em, print: 1.25em),
123
+ h4: (screen: 1em, print: 1em),
124
+ h5: (screen: .875em, print: .875em),
125
+ h6: (screen: .85em, print: .85em),
126
+ );
127
+
128
+ /* Placeholder: img [align] / [width] / [height] */
129
+ %img-align {
130
+ &[align="right"] {
131
+ margin-inline-start: auto;
132
+ padding-inline-start: 20px;
133
+ }
134
+
135
+ &[align="left"] {
136
+ margin-inline-end: auto;
137
+ padding-inline-end: 20px;
138
+ }
139
+
140
+ &[align="center"] {
141
+ margin-inline: auto;
142
+ }
143
+
144
+ &[width] {
145
+ inline-size: attr(width px, auto);
146
+ }
147
+
148
+ &[height] {
149
+ block-size: attr(height px, auto);
150
+ }
151
+ }
152
+
153
+ /* Mixin: базовые img-свойства */
154
+ @mixin img-base($margin: var(--space-lg) 0, $radius: var(--radius-md)) {
155
+ max-inline-size: stretch;
156
+ inline-size: fit-content;
157
+ block-size: auto;
158
+ object-fit: contain;
159
+ object-position: center;
160
+ margin: $margin;
161
+ border-radius: $radius;
162
+
163
+ @extend %img-align;
164
+ }
165
+
166
+ /* Mixin: сброс code внутри pre */
167
+ @mixin code-in-pre {
168
+ padding: 0;
169
+ margin: 0;
170
+ background: transparent;
171
+ border: 0;
172
+ border-radius: 0;
173
+ font-size: inherit;
174
+ color: inherit;
175
+ white-space: pre;
176
+ word-wrap: normal;
177
+ block-size: max-content !important;
178
+ max-block-size: none !important;
179
+ inline-size: stretch;
180
+ max-inline-size: stretch;
181
+ min-inline-size: fit-content;
182
+ overflow: hidden !important;
183
+ overflow-inline: hidden !important;
184
+ overflow-block: hidden !important;
185
+ content-visibility: visible !important;
186
+ contain: none !important;
187
+ position: relative !important;
188
+ }
189
+
190
+ /* Mixin: md-vars (CSS custom properties для цветовой схемы) */
191
+ @mixin md-vars($mode: auto) {
192
+ @if $mode == auto {
193
+ --md-fg-default: #{config.md-light-dark("text")};
194
+ --md-fg-muted: #{config.md-light-dark("text-muted")};
195
+ --md-fg-accent: #{config.md-light-dark("accent")};
196
+ --md-bg-default: #{config.md-light-dark("bg")};
197
+ --md-bg-subtle: #{config.md-light-dark("bg-subtle")};
198
+ --md-bg-code: #{config.md-light-dark("code-bg")};
199
+ --md-border-default: #{config.md-light-dark("border")};
200
+ --md-border-subtle: #{config.md-light-dark("border-subtle")};
201
+ }
202
+
203
+ @else {
204
+ --md-fg-default: #{config.md-color("text", $mode)};
205
+ --md-fg-muted: #{config.md-color("text-muted", $mode)};
206
+ --md-fg-accent: #{config.md-color("accent", $mode)};
207
+ --md-bg-default: #{config.md-color("bg", $mode)};
208
+ --md-bg-subtle: #{config.md-color("bg-subtle", $mode)};
209
+ --md-bg-code: #{config.md-color("code-bg", $mode)};
210
+ --md-border-default: #{config.md-color("border", $mode)};
211
+ --md-border-subtle: #{config.md-color("border-subtle", $mode)};
212
+ }
213
+
214
+ --md-font-body: #{config.md-config("font", "body")};
215
+ --md-font-mono: #{config.md-config("font", "mono")};
216
+ --md-radius: #{config.md-config("shape", "border-radius")};
217
+ }
218
+
219
+ /* ═══════════════════════════════════════════════════════════════════════════
220
+ LAYER: tokens
221
+ ═══════════════════════════════════════════════════════════════════════════ */
222
+
223
+ @layer tokens {
224
+
225
+ :root,
226
+ :host,
227
+ :scope {
228
+ --print-font-family: var(--font-family-serif,
229
+ "Times New Roman", "Liberation Serif", "Noto Serif", serif);
230
+ --print-font-family-sans: var(--font-family-sans,
231
+ "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif);
232
+ --print-font-mono: var(--font-family-mono,
233
+ "Monaco", "Menlo", "Ubuntu Mono", "Liberation Mono", monospace);
234
+
235
+ --print-text-color: light-dark(#1a1a1a, #f3f4f6);
236
+ --print-bg: light-dark(#fff, #111827);
237
+ --print-border-color: light-dark(#d1d5db, #374151);
238
+ --print-link-color: light-dark(#2563eb, #60a5fa);
239
+ }
240
+ }
241
+
242
+ /* ═══════════════════════════════════════════════════════════════════════════
243
+ LAYER: markdown (screen + shared)
244
+ ═══════════════════════════════════════════════════════════════════════════ */
245
+
246
+ @layer components {
247
+
248
+ /* Токены корневого элемента */
249
+ @include tokens.markdown-root-props();
250
+
251
+ @media print {
252
+ /* ── html / body ── */
253
+ :where(html, body):has(:where(#{tokens.$selectors}):not([hidden])) {
254
+ box-sizing: border-box;
255
+ margin: 0;
256
+ padding: 0;
257
+ inline-size: 100%;
258
+ block-size: max-content;
259
+ min-block-size: max(100%, 100cqb);
260
+ max-block-size: none;
261
+ overflow: auto;
262
+ background-color: transparent;
263
+ color-scheme: inherit;
264
+ display: block;
265
+ container-type: inline-size;
266
+ touch-action: manipulation;
267
+ user-select: text;
268
+
269
+ *,
270
+ *::before,
271
+ *::after {
272
+ box-sizing: border-box;
273
+ }
274
+ }
275
+ }
276
+
277
+ /* ── Корневой markdown-контейнер ── */
278
+ :where(#{tokens.$selectors}):not(.katex, .footnote-ref, .footnote-backref) {
279
+ @include md-vars(auto);
280
+ @include mixins.md-surface-root(start);
281
+ @include mixins.md-scrollbars();
282
+
283
+ color-scheme: inherit;
284
+ font-family: var(--md-font-body, var(--print-font-family));
285
+ font-size: #{config.md-config("font", "size-base")};
286
+ line-height: #{config.md-config("layout", "line-height")};
287
+ font-weight: 400;
288
+ color: var(--md-fg-default);
289
+
290
+ display: flex;
291
+ flex: 1;
292
+ flex-direction: column;
293
+ block-size: stretch;
294
+ overflow: auto;
295
+ padding: var(--space-2xl) var(--space-xl);
296
+ background: var(--color-surface);
297
+ box-shadow: none;
298
+ transition: box-shadow var(--motion-normal);
299
+ overflow-wrap: break-word;
300
+ word-wrap: break-word;
301
+ text-rendering: optimizeLegibility;
302
+ -webkit-font-smoothing: antialiased;
303
+ -moz-osx-font-smoothing: grayscale;
304
+ text-align: start;
305
+ contain: inline-size layout paint style;
306
+ container-type: inline-size;
307
+ isolation: isolate;
308
+ box-shadow: none !important;
309
+
310
+ &, & * {
311
+ user-select: auto;
312
+ -webkit-user-drag: none;
313
+ -webkit-touch-callout: default;
314
+ -webkit-tap-highlight-color: transparent;
315
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
316
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
317
+ }
318
+
319
+ &:hover {
320
+ box-shadow: var(--elev-2);
321
+ }
322
+
323
+ &:focus-within {
324
+ outline: none;
325
+ box-shadow: var(--focus-ring, var(--elev-2));
326
+ }
327
+
328
+ @container (max-inline-size: 768px) {
329
+ border-radius: var(--radius-lg);
330
+ box-shadow: none;
331
+ padding: var(--space-xl) var(--space-lg);
332
+ }
333
+
334
+ /* ── Headings ── */
335
+ h1,
336
+ h2,
337
+ h3,
338
+ h4,
339
+ h5,
340
+ h6 {
341
+ margin-block: 1.5em .5em;
342
+ font-weight: 600;
343
+ line-height: 1.25;
344
+ color: var(--md-fg-default);
345
+ letter-spacing: -.015em;
346
+
347
+ &:first-child {
348
+ margin-block-start: 0;
349
+ }
350
+
351
+ tt,
352
+ code {
353
+ font-size: inherit;
354
+ font-family: var(--md-font-mono);
355
+ }
356
+ }
357
+
358
+ /* Генерируем font-size для каждого уровня из одной map */
359
+ @each $tag, $sizes in $_h-sizes {
360
+ #{$tag} {
361
+ font-size: map.get($sizes, screen);
362
+ }
363
+ }
364
+
365
+ h1,
366
+ h2 {
367
+ padding-block-end: .3em;
368
+ border-block-end: 1px solid var(--md-border-subtle);
369
+ }
370
+
371
+ h6 {
372
+ color: var(--md-fg-muted);
373
+ }
374
+
375
+ /* ── Paragraph ── */
376
+ p {
377
+ margin-block: 0 1rem;
378
+
379
+ &:last-child {
380
+ margin-block-end: 0;
381
+ }
382
+ }
383
+
384
+ /* ── Links ── */
385
+ a {
386
+ color: var(--md-fg-accent);
387
+ text-decoration: underline;
388
+ text-decoration-thickness: 1px;
389
+ text-underline-offset: 2px;
390
+ background-color: transparent;
391
+ transition: color var(--motion-fast), text-decoration-thickness var(--motion-fast);
392
+
393
+ &:hover {
394
+ text-decoration-thickness: 2px;
395
+ }
396
+
397
+ &:not([href]) {
398
+ color: inherit;
399
+ text-decoration: none;
400
+ }
401
+
402
+ &:focus-visible {
403
+ outline: none;
404
+ border-radius: var(--radius-sm);
405
+ box-shadow: var(--focus-ring);
406
+ }
407
+ }
408
+
409
+ /* ── Lists ── */
410
+ ul,
411
+ ol {
412
+ margin-block: 0 1rem;
413
+ padding-inline-start: 2em;
414
+
415
+ ol,
416
+ ul {
417
+ margin-block: 0;
418
+ }
419
+
420
+ @container (max-inline-size: 480px) {
421
+ padding-inline-start: var(--space-xl);
422
+ }
423
+ }
424
+
425
+ li {
426
+ word-break: normal;
427
+ overflow-wrap: break-word;
428
+ margin-block-end: .25em;
429
+
430
+ &:last-child {
431
+ margin-block-end: 0;
432
+ }
433
+
434
+ & + li {
435
+ margin-block-start: .25em;
436
+ }
437
+
438
+ & > p {
439
+ margin-block-start: 1rem;
440
+ }
441
+ }
442
+
443
+ ul {
444
+ list-style-type: disc;
445
+
446
+ ul {
447
+ list-style-type: circle;
448
+
449
+ ul {
450
+ list-style-type: square;
451
+ }
452
+ }
453
+ }
454
+
455
+ ol {
456
+ list-style-type: decimal;
457
+
458
+ &[type="a"] {
459
+ list-style-type: lower-alpha;
460
+ }
461
+
462
+ &[type="A"] {
463
+ list-style-type: upper-alpha;
464
+ }
465
+
466
+ &[type="i"] {
467
+ list-style-type: lower-roman;
468
+ }
469
+
470
+ &[type="I"] {
471
+ list-style-type: upper-roman;
472
+ }
473
+ }
474
+
475
+ /* ── Blockquote ── */
476
+ blockquote {
477
+ margin: 0 0 1rem;
478
+ padding: 0 1em;
479
+ color: var(--md-fg-muted);
480
+ border-inline-start: .25em solid var(--md-border-default);
481
+ font-style: italic;
482
+
483
+ & > :first-child {
484
+ margin-block-start: 0;
485
+ }
486
+
487
+ & > :last-child {
488
+ margin-block-end: 0;
489
+ }
490
+ }
491
+
492
+ /* ── Code & Pre ── */
493
+ code,
494
+ kbd,
495
+ pre,
496
+ samp,
497
+ tt {
498
+ font-family: var(--md-font-mono);
499
+ font-size: 1em;
500
+ }
501
+
502
+ code:not(pre code),
503
+ tt:not(pre tt),
504
+ samp:not(pre samp) {
505
+ padding: .2em .4em;
506
+ font-size: 85%;
507
+ background-color: var(--md-bg-code);
508
+ border-radius: 6px;
509
+ }
510
+
511
+ pre {
512
+ flex-grow: 1 !important;
513
+ flex-shrink: 0 !important;
514
+ flex-basis: max-content !important;
515
+ margin-block: 0 1rem;
516
+ padding: 1rem;
517
+ font-size: 85%;
518
+ line-height: 1.45;
519
+ background-color: var(--md-bg-code);
520
+ border-radius: 6px;
521
+ inline-size: stretch;
522
+ max-inline-size: stretch;
523
+ block-size: max-content !important;
524
+ max-block-size: none !important;
525
+ min-block-size: max(100%, 100cqb) !important;
526
+ min-inline-size: fit-content;
527
+ overflow: hidden !important;
528
+ overflow-inline: hidden !important;
529
+ overflow-block: hidden !important;
530
+ content-visibility: visible !important;
531
+ position: relative !important;
532
+
533
+ code,
534
+ tt {
535
+ @include code-in-pre;
536
+ }
537
+ }
538
+
539
+ /* ── Table ── */
540
+ table {
541
+ display: table;
542
+ inline-size: fit-content;
543
+ max-inline-size: stretch;
544
+ margin-block-end: 1rem;
545
+ border-spacing: 0;
546
+ border-collapse: collapse;
547
+ overflow: auto;
548
+ contain: inline-size layout paint style;
549
+ container-type: inline-size;
550
+ block-size: max-content;
551
+
552
+ tbody,
553
+ thead {
554
+ inline-size: fit-content;
555
+ max-inline-size: stretch;
556
+ block-size: max-content;
557
+ }
558
+
559
+ th,
560
+ td {
561
+ padding: 6px 13px;
562
+ border: 1px solid var(--md-border-default);
563
+ text-align: start;
564
+ vertical-align: top;
565
+ overflow-wrap: break-word;
566
+ overflow: hidden;
567
+ inline-size: fit-content;
568
+ max-inline-size: stretch;
569
+ block-size: max-content;
570
+ }
571
+
572
+ th {
573
+ font-weight: 600;
574
+ background-color: var(--md-bg-subtle);
575
+ block-size: max-content;
576
+ }
577
+
578
+ tr {
579
+ background-color: var(--md-bg-default);
580
+ border-block-start: 1px solid var(--md-border-subtle);
581
+ block-size: max-content;
582
+ &:nth-child(2n) {
583
+ background-color: var(--md-bg-subtle);
584
+ }
585
+ }
586
+
587
+ img {
588
+ @include img-base(0, 0);
589
+
590
+ background-color: transparent;
591
+ }
592
+ }
593
+
594
+ /* ── HR ── */
595
+ hr {
596
+ box-sizing: content-box;
597
+ overflow: hidden;
598
+ margin-block: 24px;
599
+ block-size: .25em;
600
+ padding: 0;
601
+ border: 0;
602
+ background-color: var(--md-border-default);
603
+
604
+ &::before {
605
+ display: table;
606
+ content: "";
607
+ }
608
+
609
+ &::after {
610
+ display: table;
611
+ clear: both;
612
+ content: "";
613
+ }
614
+ }
615
+
616
+ /* ── Images ── */
617
+ img {
618
+ @include img-base();
619
+
620
+ box-sizing: content-box;
621
+ background-color: transparent;
622
+ border-style: none;
623
+ }
624
+
625
+ /* ── KBD ── */
626
+ kbd {
627
+ display: inline-block;
628
+ padding: 3px 5px;
629
+ font-size: 11px;
630
+ line-height: 10px;
631
+ color: var(--md-fg-default);
632
+ vertical-align: middle;
633
+ background-color: var(--md-bg-subtle);
634
+ border: 1px solid var(--md-border-default);
635
+ border-radius: 6px;
636
+ box-shadow: inset 0 -1px 0 var(--md-border-default);
637
+ }
638
+
639
+ /* ── DL ── */
640
+ dl {
641
+ padding: 0;
642
+ margin-block: var(--space-lg) 0;
643
+
644
+ dt {
645
+ padding: 0;
646
+ margin-block-start: 1rem;
647
+ font-size: 1em;
648
+ font-style: italic;
649
+ font-weight: 600;
650
+ color: var(--md-fg-default);
651
+ }
652
+
653
+ dd {
654
+ padding: 0 1rem;
655
+ margin-block-end: 1rem;
656
+ margin-inline-start: 0;
657
+ color: var(--color-on-surface-variant, var(--md-fg-muted));
658
+ }
659
+ }
660
+
661
+ /* ── Details / Summary ── */
662
+ details {
663
+ display: block;
664
+
665
+ summary {
666
+ display: list-item;
667
+ cursor: pointer;
668
+
669
+ h1,
670
+ h2,
671
+ h3,
672
+ h4,
673
+ h5,
674
+ h6 {
675
+ display: inline-block;
676
+ vertical-align: middle;
677
+ margin: 0;
678
+ padding-block-end: 0;
679
+ border-block-end: 0;
680
+ }
681
+ }
682
+ }
683
+
684
+ /* ── Math ── */
685
+ math {
686
+ math-style: compact;
687
+ math-shift: compact;
688
+ math-depth: auto-add;
689
+ inline-size: fit-content;
690
+ max-inline-size: stretch;
691
+ }
692
+
693
+ /* ── Span / SVG ── */
694
+ span {
695
+ inline-size: fit-content;
696
+ max-inline-size: stretch;
697
+ }
698
+
699
+ svg {
700
+ inline-size: fit-content !important;
701
+ max-inline-size: stretch !important;
702
+ contain: strict;
703
+ }
704
+
705
+ /* ── Checkbox ── */
706
+ input[type="checkbox"] {
707
+ margin-inline-end: var(--space-sm);
708
+ accent-color: var(--color-primary, var(--md-fg-accent));
709
+ }
710
+
711
+ /* ── Task list ── */
712
+ .task-list-item {
713
+ list-style-type: none;
714
+
715
+ input[type="checkbox"] {
716
+ margin: 0 .2em .25em -1.6em;
717
+ vertical-align: middle;
718
+ }
719
+ }
720
+
721
+ /* ── Footnotes ── */
722
+ .footnotes {
723
+ margin-block-start: 2rem;
724
+ font-size: .75em;
725
+ color: var(--md-fg-muted);
726
+ border-block-start: 1px solid var(--md-border-default);
727
+
728
+ ol {
729
+ padding-inline-start: 1.5em;
730
+ }
731
+
732
+ li {
733
+ position: relative;
734
+
735
+ &:target {
736
+ color: var(--md-fg-default);
737
+ }
738
+
739
+ &:target::before {
740
+ content: "";
741
+ pointer-events: none;
742
+ position: absolute;
743
+ inset: -8px -8px -8px -24px;
744
+ border: 2px solid var(--md-fg-accent);
745
+ border-radius: 6px;
746
+ }
747
+ }
748
+ }
749
+
750
+ .footnote-ref a {
751
+ color: var(--md-fg-accent);
752
+ font-size: .8em;
753
+ vertical-align: super;
754
+ }
755
+
756
+ /* ── Markdown Alerts ── */
757
+ .markdown-alert {
758
+ margin-block-end: 1rem;
759
+ padding: .5rem 1rem;
760
+ border-inline-start: .25em solid var(--md-border-default);
761
+
762
+ &.markdown-alert-note { border-color: var(--md-fg-accent); }
763
+ &.markdown-alert-important { border-color: #8250df; }
764
+ &.markdown-alert-warning { border-color: #bf8700; }
765
+ &.markdown-alert-tip { border-color: #1a7f37; }
766
+ &.markdown-alert-caution { border-color: #d1242f; }
767
+
768
+ &.markdown-alert-title,
769
+ .markdown-alert-title{
770
+ display: flex;
771
+ align-items: center;
772
+ margin-block-end: .5rem;
773
+ font-weight: 600;
774
+ line-height: 1;
775
+
776
+ .octicon {
777
+ margin-inline-end: .5rem;
778
+ }
779
+ }
780
+ }
781
+
782
+ /* ── Octicon / g-emoji ── */
783
+ .octicon {
784
+ display: inline-block;
785
+ fill: currentColor;
786
+ vertical-align: text-bottom;
787
+ }
788
+
789
+ g-emoji {
790
+ display: inline-block;
791
+ min-inline-size: 1ch;
792
+ font-family: "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", sans-serif;
793
+ font-size: 1em;
794
+ font-style: normal;
795
+ font-weight: 400;
796
+ line-height: 1;
797
+ vertical-align: -.075em;
798
+
799
+ img {
800
+ inline-size: 1em;
801
+ block-size: 1em;
802
+ object-fit: contain;
803
+ }
804
+ }
805
+
806
+ /* ── Anchor links ── */
807
+ .anchor {
808
+ float: inline-start;
809
+ padding-inline-end: 4px;
810
+ margin-inline-start: -20px;
811
+ line-height: 1;
812
+
813
+ &:focus {
814
+ outline: none;
815
+ }
816
+ }
817
+
818
+ .octicon-link {
819
+ visibility: hidden;
820
+ color: var(--md-fg-muted);
821
+ opacity: .5;
822
+
823
+ &:hover {
824
+ opacity: 1;
825
+ }
826
+ }
827
+
828
+ :is(h1, h2, h3, h4, h5, h6):hover .anchor .octicon-link {
829
+ visibility: visible;
830
+ }
831
+
832
+ /* ── Prettylights (light) ── */
833
+ .pl-c { color: #6e7781; }
834
+ .pl-c1 { color: #0550ae; }
835
+ .pl-k { color: #cf222e; }
836
+ .pl-s { color: #0a3069; }
837
+ .pl-v { color: #953800; }
838
+ .pl-en { color: #8250df; }
839
+
840
+ /* ── KaTeX ── */
841
+ .katex {
842
+ color: var(--md-fg-default);
843
+ font-size: 1.1em;
844
+ text-align: start;
845
+ }
846
+
847
+ /* ── Viewer UI ── */
848
+ .viewer-header {
849
+ display: none;
850
+ }
851
+
852
+ /* скрыт по умолчанию, показывается только на screen */
853
+ }
854
+
855
+ /* ── Viewer components (вне markdown-selector) ── */
856
+ .markdown-viewer-content {
857
+ animation: fade-in .3s ease-out;
858
+ min-block-size: 100%;
859
+ }
860
+
861
+ .markdown-viewer-raw {
862
+ margin: 0;
863
+ padding: var(--space-xl);
864
+ overflow: auto;
865
+ background: var(--color-surface);
866
+ color: var(--color-on-surface);
867
+ font-family: var(--print-font-mono);
868
+ font-size: var(--text-sm, .875rem);
869
+ line-height: 1.5;
870
+ white-space: pre;
871
+ tab-size: 2;
872
+ }
873
+
874
+ .viewer-header {
875
+ display: flex;
876
+ align-items: center;
877
+ justify-content: space-between;
878
+ flex-shrink: 0;
879
+ gap: var(--space-lg);
880
+ padding: var(--space-lg) var(--space-xl);
881
+ background: var(--color-surface-container-high);
882
+
883
+ @container (max-inline-size: 768px) {
884
+ gap: var(--space-md);
885
+ padding: var(--space-md) var(--space-lg);
886
+ }
887
+
888
+ @container (max-inline-size: 480px) {
889
+ flex-direction: column;
890
+ align-items: stretch;
891
+ gap: var(--space-sm);
892
+ }
893
+
894
+ h3 {
895
+ margin: 0;
896
+ font-size: var(--text-xl, 1.25rem);
897
+ font-weight: 600;
898
+ line-height: 1.25;
899
+ letter-spacing: -.025em;
900
+ }
901
+
902
+ .viewer-actions {
903
+ display: flex;
904
+ align-items: center;
905
+ gap: var(--space-sm);
906
+ flex-wrap: wrap;
907
+
908
+ @container (max-inline-size: 360px) {
909
+ overflow-inline: auto;
910
+ overflow-block: hidden;
911
+ padding-block-end: var(--space-xs);
912
+ scrollbar-width: none;
913
+
914
+ &::-webkit-scrollbar {
915
+ display: none;
916
+ }
917
+ }
918
+ }
919
+ }
920
+
921
+ .viewer-btn {
922
+ position: relative;
923
+ display: inline-flex;
924
+ align-items: center;
925
+ gap: var(--space-xs);
926
+ min-block-size: 44px;
927
+ padding: 0px;
928
+ border: none;
929
+ border-radius: var(--radius-lg);
930
+ background: var(--color-surface-container);
931
+ color: var(--color-on-surface);
932
+ font-size: var(--text-sm, .875rem);
933
+ font-weight: 500;
934
+ white-space: nowrap;
935
+ cursor: pointer;
936
+ transition: background var(--motion-fast), box-shadow var(--motion-fast), translate var(--motion-fast);
937
+
938
+ &:hover {
939
+ background: var(--color-surface-container-highest);
940
+ translate: 0 -1px;
941
+ box-shadow: var(--elev-1);
942
+ }
943
+
944
+ &:active {
945
+ translate: 0;
946
+ box-shadow: none;
947
+ }
948
+
949
+ &:focus-visible {
950
+ outline: none;
951
+ box-shadow: var(--focus-ring);
952
+ }
953
+
954
+ &.btn-icon {
955
+ padding: var(--space-sm);
956
+
957
+ ui-icon {
958
+ flex-shrink: 0;
959
+ transition: color var(--motion-fast);
960
+ }
961
+
962
+ &:hover ui-icon {
963
+ color: var(--color-primary);
964
+ }
965
+
966
+ @container (max-inline-size: 640px) {
967
+ padding: var(--space-xs);
968
+
969
+ .btn-text {
970
+ display: none;
971
+ }
972
+ }
973
+ }
974
+
975
+ &.loading {
976
+ opacity: .7;
977
+ pointer-events: none;
978
+
979
+ &::after {
980
+ content: "";
981
+ inline-size: 16px;
982
+ block-size: 16px;
983
+ margin-inline-start: var(--space-xs);
984
+ border: 2px solid transparent;
985
+ border-block-start-color: currentColor;
986
+ border-radius: 50%;
987
+ animation: spin 1s linear infinite;
988
+ }
989
+ }
990
+ }
991
+
992
+ /* Prettylights dark */
993
+ @media (prefers-color-scheme: dark) {
994
+ :where(#{tokens.$selectors}):not(.katex, .footnote-ref, .footnote-backref) {
995
+ .pl-c { color: #8b949e; }
996
+ .pl-c1 { color: #79c0ff; }
997
+ .pl-k { color: #ff7b72; }
998
+ .pl-s { color: #a5d6ff; }
999
+ .pl-v { color: #ffa657; }
1000
+ .pl-en { color: #d2a8ff; }
1001
+ }
1002
+ }
1003
+
1004
+ /* ── content-visibility для скрытых/dragging ── */
1005
+ [data-hidden] :where(#{tokens.$selectors}),
1006
+ [data-dragging] :where(#{tokens.$selectors}) {
1007
+ color-scheme: inherit;
1008
+ content-visibility: auto !important;
1009
+ }
1010
+
1011
+ [data-dragging] :where(#{tokens.$selectors}) :where(*) {
1012
+ content-visibility: auto !important;
1013
+ }
1014
+
1015
+ /* ── Наследование children ── */
1016
+ @include mixins.md-children-inherit(":where(#{tokens.$selectors}):not(.katex, .footnote-ref, .footnote-backref) *");
1017
+
1018
+ /* ── Screen: viewer-header показываем ── */
1019
+ @media screen {
1020
+ :where(#{tokens.$selectors}):not(.katex, .footnote-ref, .footnote-backref) {
1021
+ .viewer-header {
1022
+ display: flex;
1023
+ }
1024
+ }
1025
+ }
1026
+ }
1027
+
1028
+ /* ═══════════════════════════════════════════════════════════════════════════
1029
+ LAYER: overrides (screen-specific code colors + KaTeX)
1030
+ ═══════════════════════════════════════════════════════════════════════════ */
1031
+
1032
+ @layer overrides {
1033
+
1034
+ /* KaTeX — вне media, всегда */
1035
+ :is(.katex, .katex:not(:has(math)) *, .katex :not(math) *:not(math)) {
1036
+ font-variant: normal;
1037
+ font-variant-caps: normal;
1038
+ font-variant-ligatures: normal;
1039
+ text-transform: none;
1040
+ font-family: "Noto Sans Math", "Cambria Math", "STIX Two Math", "Latin Modern Math",
1041
+ var(--print-font-family), serif;
1042
+ }
1043
+
1044
+ .katex math {
1045
+ font-variant: normal;
1046
+ font-variant-caps: normal;
1047
+ font-variant-ligatures: normal;
1048
+ text-transform: none;
1049
+ math-style: compact;
1050
+ math-shift: compact;
1051
+ math-depth: auto-add;
1052
+ }
1053
+
1054
+ .footnote-ref,
1055
+ .footnote-backref {
1056
+ font-variant-emoji: text;
1057
+ font-variant-numeric: tabular-nums;
1058
+ font-variant-ligatures: common-ligatures;
1059
+ font-variant-caps: normal;
1060
+ inline-size: fit-content;
1061
+ max-inline-size: stretch;
1062
+ text-align: start;
1063
+
1064
+ * {
1065
+ inline-size: fit-content;
1066
+ max-inline-size: stretch;
1067
+ text-align: start;
1068
+ }
1069
+ }
1070
+
1071
+ @media screen {
1072
+ :where(#{tokens.$selectors}):not(.katex, .footnote-ref, .footnote-backref) {
1073
+ --md-code-inline-bg: color-mix(in oklab, var(--md-bg-code) 88%, var(--md-bg-default));
1074
+ --md-code-inline-fg: var(--md-fg-default);
1075
+ --md-code-block-bg: var(--md-bg-code);
1076
+ --md-code-block-fg: var(--md-fg-default);
1077
+ --md-code-block-border: color-mix(in oklab, var(--md-border-default) 60%, transparent);
1078
+
1079
+ text-rendering: auto;
1080
+ -webkit-font-smoothing: auto;
1081
+ -moz-osx-font-smoothing: auto;
1082
+ color-scheme: inherit !important;
1083
+
1084
+ &, & * {
1085
+ user-select: auto;
1086
+ -webkit-user-drag: none;
1087
+ -webkit-touch-callout: default;
1088
+ -webkit-tap-highlight-color: transparent;
1089
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
1090
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
1091
+ }
1092
+
1093
+ p,
1094
+ li,
1095
+ blockquote,
1096
+ td,
1097
+ th {
1098
+ text-align: start;
1099
+ hyphens: manual;
1100
+ }
1101
+
1102
+ code:not(pre code),
1103
+ tt:not(pre tt),
1104
+ samp:not(pre samp) {
1105
+ background: var(--md-code-inline-bg);
1106
+ color: var(--md-code-inline-fg);
1107
+ border: 0;
1108
+ box-shadow: none;
1109
+ }
1110
+
1111
+ pre {
1112
+ background: var(--md-code-block-bg);
1113
+ color: var(--md-code-block-fg);
1114
+ border: 1px solid var(--md-code-block-border);
1115
+ box-shadow: none;
1116
+
1117
+ code,
1118
+ tt,
1119
+ samp {
1120
+ background: transparent;
1121
+ border: 0;
1122
+ box-shadow: none;
1123
+ color: inherit;
1124
+ }
1125
+ }
1126
+ }
1127
+ }
1128
+ }
1129
+
1130
+ /* ═══════════════════════════════════════════════════════════════════════════
1131
+ LAYER: print
1132
+ ═══════════════════════════════════════════════════════════════════════════ */
1133
+
1134
+ @layer print {
1135
+ @media print {
1136
+ /* html / body reset */
1137
+ :where(:root, html, body) {
1138
+ color-scheme: light;
1139
+ container-type: normal;
1140
+ contain: none;
1141
+ background-color: #fff !important;
1142
+ font-family: var(--print-font-family);
1143
+ font-variant-emoji: text;
1144
+ font-size: 12pt;
1145
+ line-height: 1.4;
1146
+ color: #111;
1147
+ margin: 0;
1148
+ padding: 0;
1149
+ border: none;
1150
+ box-shadow: none;
1151
+ -webkit-print-color-adjust: economy;
1152
+ print-color-adjust: economy;
1153
+ scrollbar-width: none;
1154
+ overflow: visible !important;
1155
+ }
1156
+
1157
+ body {
1158
+ block-size: max-content !important;
1159
+ max-block-size: none !important;
1160
+ min-block-size: max(100%, 100cqb) !important;
1161
+ inline-size: 100% !important;
1162
+ max-inline-size: 100% !important;
1163
+ zoom: 1 !important;
1164
+ scale: 1 !important;
1165
+ transform: none !important;
1166
+ text-align: start;
1167
+ }
1168
+
1169
+ /* KaTeX в print */
1170
+ :is(.katex, .katex:not(:has(math)) *, .katex :not(math) *:not(math)) {
1171
+ font-family: "Noto Sans Math", "Cambria Math", "STIX Two Math", "Latin Modern Math",
1172
+ var(--print-font-family), serif;
1173
+ font-variant: normal;
1174
+ font-variant-caps: normal;
1175
+ font-variant-ligatures: normal;
1176
+ text-transform: none;
1177
+ }
1178
+
1179
+ /* ── Markdown root в print ── */
1180
+ :where(#{tokens.$selectors}):not(.katex, .footnote-ref, .footnote-backref) {
1181
+ @include md-vars(light);
1182
+
1183
+ color-scheme: light;
1184
+ color: #111;
1185
+ background: #fff;
1186
+ font-family: var(--print-font-family);
1187
+ font-variant-emoji: text;
1188
+ display: block !important;
1189
+ flex: none !important;
1190
+ block-size: max-content !important;
1191
+ min-block-size: max(100%, 100cqb) !important;
1192
+ max-block-size: none !important;
1193
+ inline-size: 100%;
1194
+ max-inline-size: 100%;
1195
+ contain: none;
1196
+ container-type: normal;
1197
+ overflow: visible !important;
1198
+ scrollbar-width: none;
1199
+ margin: 0;
1200
+ padding: 0;
1201
+ border: none;
1202
+ box-shadow: none;
1203
+ -webkit-font-smoothing: antialiased;
1204
+ -moz-osx-font-smoothing: grayscale;
1205
+
1206
+ /* Сброс фонов/теней для всех дочерних */
1207
+ * {
1208
+ background-color: transparent;
1209
+ box-shadow: none;
1210
+ text-shadow: none;
1211
+ font-variant-emoji: text;
1212
+ max-inline-size: 100%;
1213
+ box-sizing: border-box;
1214
+ }
1215
+
1216
+ /* Скрываем UI */
1217
+ .viewer-header,
1218
+ .viewer-btn,
1219
+ .btn {
1220
+ display: none !important;
1221
+ }
1222
+
1223
+ /* ── Headings ── */
1224
+ h1,
1225
+ h2,
1226
+ h3,
1227
+ h4,
1228
+ h5,
1229
+ h6 {
1230
+ color: #111;
1231
+ font-weight: 700;
1232
+ line-height: 1.25;
1233
+ orphans: 2;
1234
+ widows: 2;
1235
+ -webkit-font-smoothing: antialiased;
1236
+ -moz-osx-font-smoothing: grayscale;
1237
+
1238
+ &:first-child {
1239
+ margin-block-start: 0;
1240
+ }
1241
+ }
1242
+
1243
+ /* Размеры heading в print — те же em, база 12pt */
1244
+ @each $tag, $sizes in $_h-sizes {
1245
+ #{$tag} {
1246
+ font-size: map.get($sizes, print);
1247
+ }
1248
+ }
1249
+
1250
+ h1,
1251
+ h2 {
1252
+ padding-block-end: .3em;
1253
+ border-block-end: 1px solid #ccc;
1254
+ }
1255
+
1256
+ h6 {
1257
+ color: #555;
1258
+ }
1259
+
1260
+ /* ── Paragraph / inline ── */
1261
+ p,
1262
+ li {
1263
+ color: #111;
1264
+ orphans: 3;
1265
+ widows: 3;
1266
+ text-align: justify;
1267
+ hyphens: auto;
1268
+ -webkit-font-smoothing: antialiased;
1269
+ -moz-osx-font-smoothing: grayscale;
1270
+ }
1271
+
1272
+ strong,
1273
+ b {
1274
+ font-weight: 700 !important;
1275
+ color: #111 !important;
1276
+ filter: none;
1277
+ }
1278
+
1279
+ em,
1280
+ i {
1281
+ font-style: italic !important;
1282
+ color: #111 !important;
1283
+ filter: none;
1284
+ }
1285
+
1286
+ a {
1287
+ color: #333 !important;
1288
+ text-decoration: underline !important;
1289
+ word-break: break-word;
1290
+ overflow-wrap: break-word;
1291
+ -webkit-font-smoothing: antialiased;
1292
+ -moz-osx-font-smoothing: grayscale;
1293
+
1294
+ &[href]::after {
1295
+ content: none !important;
1296
+ }
1297
+
1298
+ /* не печатаем URL */
1299
+ }
1300
+
1301
+ /* ── Code / Pre ── */
1302
+ code,
1303
+ pre,
1304
+ pre code,
1305
+ tt,
1306
+ samp {
1307
+ font-family: var(--print-font-mono);
1308
+ background: #f5f5f5;
1309
+ color: #111;
1310
+ filter: grayscale(1);
1311
+ -webkit-font-smoothing: antialiased;
1312
+ -moz-osx-font-smoothing: grayscale;
1313
+ }
1314
+
1315
+ code:not(pre code) {
1316
+ padding: .125em .25em;
1317
+ border-radius: .25em;
1318
+ border: 1px solid #ddd;
1319
+ word-break: break-word;
1320
+ overflow-wrap: break-word;
1321
+ hyphens: none;
1322
+ inline-size: stretch;
1323
+ max-inline-size: stretch;
1324
+ block-size: max-content !important;
1325
+ max-block-size: none !important;
1326
+ min-inline-size: fit-content;
1327
+ overflow: hidden !important;
1328
+ overflow-inline: hidden !important;
1329
+ overflow-block: hidden !important;
1330
+ content-visibility: visible !important;
1331
+ contain: none !important;
1332
+ position: relative !important;
1333
+ }
1334
+
1335
+ pre {
1336
+ flex-grow: 1 !important;
1337
+ flex-shrink: 0 !important;
1338
+ flex-basis: max-content !important;
1339
+ padding: 1rem;
1340
+ border: 1px solid #ccc;
1341
+ border-radius: .5rem;
1342
+ white-space: pre-wrap;
1343
+ word-wrap: break-word;
1344
+ orphans: 1;
1345
+ widows: 1;
1346
+ margin-block: 1.2em;
1347
+ inline-size: stretch;
1348
+ max-inline-size: stretch;
1349
+ block-size: max-content !important;
1350
+ max-block-size: none !important;
1351
+ min-inline-size: fit-content;
1352
+ overflow: hidden !important;
1353
+ overflow-inline: hidden !important;
1354
+ overflow-block: hidden !important;
1355
+ content-visibility: visible !important;
1356
+ position: relative !important;
1357
+
1358
+ code {
1359
+ @include code-in-pre;
1360
+
1361
+ background: transparent;
1362
+ border: 0;
1363
+ }
1364
+ }
1365
+
1366
+ /* ── Blockquote ── */
1367
+ blockquote {
1368
+ background: #fafafa;
1369
+ border-inline-start: 4px solid #999;
1370
+ color: #333;
1371
+ padding: .8em 1.2em;
1372
+ margin-block: 1.2em;
1373
+ font-style: italic;
1374
+ orphans: 2;
1375
+ widows: 2;
1376
+ filter: grayscale(1);
1377
+ -webkit-font-smoothing: antialiased;
1378
+ -moz-osx-font-smoothing: grayscale;
1379
+ }
1380
+
1381
+ /* ── Table ── */
1382
+ table {
1383
+ display: table;
1384
+ inline-size: 100% !important;
1385
+ max-inline-size: 100%;
1386
+ border-collapse: collapse;
1387
+ border: 1px solid #999;
1388
+ table-layout: fixed;
1389
+ word-wrap: break-word;
1390
+ overflow-wrap: break-word;
1391
+ margin-block: 1.2em;
1392
+ orphans: 1;
1393
+ widows: 1;
1394
+ filter: grayscale(1);
1395
+ }
1396
+
1397
+ th,
1398
+ td {
1399
+ border: 1px solid #999;
1400
+ padding: .5em .75em;
1401
+ text-align: start;
1402
+ vertical-align: top;
1403
+ color: #111;
1404
+ overflow-wrap: break-word;
1405
+ overflow: hidden;
1406
+ inline-size: fit-content;
1407
+ max-inline-size: stretch;
1408
+ block-size: max-content;
1409
+ }
1410
+
1411
+ th {
1412
+ background: #e5e5e5;
1413
+ font-weight: 600;
1414
+ color: #333;
1415
+ }
1416
+
1417
+ /* ── HR ── */
1418
+ hr {
1419
+ border: none;
1420
+ border-block-start: 1px solid #ccc;
1421
+ margin-block: 2em;
1422
+ block-size: 0;
1423
+ filter: grayscale(1);
1424
+ }
1425
+
1426
+ /* ── Images ── */
1427
+ img {
1428
+ @include img-base(1em auto, 0);
1429
+ display: block;
1430
+ filter: grayscale(1);
1431
+ image-rendering: pixelated;
1432
+ }
1433
+
1434
+ /* ── SVG ── */
1435
+ svg {
1436
+ filter: grayscale(1);
1437
+
1438
+ * {
1439
+ fill: currentColor !important;
1440
+ stroke: currentColor !important;
1441
+ }
1442
+ }
1443
+
1444
+ /* ── Lists ── */
1445
+ ul,
1446
+ ol {
1447
+ padding-inline-start: 1.5rem;
1448
+ list-style-position: outside;
1449
+ orphans: 2;
1450
+ widows: 2;
1451
+ margin-block-end: 1em;
1452
+ }
1453
+
1454
+ li::marker {
1455
+ color: #666 !important;
1456
+ }
1457
+
1458
+ /* ── Misc ── */
1459
+ input,
1460
+ textarea,
1461
+ select {
1462
+ border: 1px solid #999 !important;
1463
+ background: #fff !important;
1464
+ color: #111 !important;
1465
+ filter: grayscale(1);
1466
+ }
1467
+
1468
+ .highlight,
1469
+ .mark {
1470
+ background: #e6e6e6 !important;
1471
+ filter: grayscale(1);
1472
+ }
1473
+
1474
+ .footnote,
1475
+ .reference {
1476
+ border-block-start: 1px solid #ccc !important;
1477
+ background: transparent !important;
1478
+ }
1479
+
1480
+ .katex {
1481
+ color: #111 !important;
1482
+ filter: grayscale(1);
1483
+ }
1484
+
1485
+ pre[class*="language-"] {
1486
+ background: #f8f8f8 !important;
1487
+ filter: grayscale(1);
1488
+
1489
+ * {
1490
+ filter: grayscale(1);
1491
+ }
1492
+ }
1493
+
1494
+ /* ── Named pages ── */
1495
+ .print-narrow {
1496
+ page: narrow;
1497
+ }
1498
+
1499
+ .print-wide {
1500
+ page: wide;
1501
+ }
1502
+
1503
+ .print-letter {
1504
+ page: letter;
1505
+ }
1506
+
1507
+ .print-legal {
1508
+ page: legal;
1509
+ }
1510
+
1511
+ .print-professional {
1512
+ page: professional;
1513
+ }
1514
+
1515
+ .print-booklet {
1516
+ page: booklet;
1517
+ }
1518
+
1519
+ .print-draft {
1520
+ page: draft;
1521
+ }
1522
+
1523
+ /* ── First/last child margins ── */
1524
+ & > *:first-child {
1525
+ margin-block-start: 0;
1526
+ }
1527
+
1528
+ & > *:last-child {
1529
+ margin-block-end: 0;
1530
+ }
1531
+ }
1532
+
1533
+ /* print-view / print-content */
1534
+ .print-view {
1535
+ inline-size: 100%;
1536
+ block-size: 100cqb;
1537
+ margin: 0;
1538
+ padding: 0;
1539
+ overflow-inline: hidden;
1540
+ }
1541
+
1542
+ .print-content {
1543
+ inline-size: 100%;
1544
+ box-sizing: border-box;
1545
+ padding: 2rem;
1546
+ margin: 0;
1547
+ font-size: 14pt;
1548
+ line-height: 1.6;
1549
+ text-align: justify;
1550
+ hyphens: auto;
1551
+ word-wrap: break-word;
1552
+ overflow-wrap: break-word;
1553
+ }
1554
+ }
1555
+ }
1556
+
1557
+ /* ═══════════════════════════════════════════════════════════════════════════
1558
+ LAYER: print-breaks
1559
+ ═══════════════════════════════════════════════════════════════════════════ */
1560
+
1561
+ @layer print {
1562
+ @media print {
1563
+ /* Базовые правила для всех блочных элементов */
1564
+ :where(h1, h2, h3, h4, h5, h6, p, pre, table, img, blockquote, hr) {
1565
+ break-before: auto;
1566
+ break-after: auto;
1567
+ break-inside: avoid;
1568
+ }
1569
+
1570
+ /* Строки и ячейки — не разрывать */
1571
+ li,
1572
+ tr {
1573
+ break-inside: avoid;
1574
+ }
1575
+
1576
+ /* Заголовки не отрываются от следующего контента */
1577
+ :where(h1, h2, h3, h4, h5, h6) {
1578
+ &:has(+ :where(p, ul, ol, li, table, blockquote, pre, code)) {
1579
+ break-after: avoid;
1580
+ }
1581
+ }
1582
+
1583
+ /* Параграфы/списки держатся вместе */
1584
+ :where(p, :is(h1, h2, h3, h4, h5, h6)):has(+ :where(ul, ol)) {
1585
+ break-after: avoid !important;
1586
+ }
1587
+
1588
+ :where(p, :is(h1, h2, h3, h4, h5, h6)) + :where(ul, ol) {
1589
+ break-before: avoid !important;
1590
+ }
1591
+
1592
+ :where(h1, h2, h3, h4, h5, h6):has(+ :where(table, pre, code, blockquote)) {
1593
+ break-after: avoid !important;
1594
+ }
1595
+
1596
+ :where(h1, h2, h3, h4, h5, h6) + :where(table, pre, code, blockquote) {
1597
+ break-before: avoid !important;
1598
+ }
1599
+
1600
+ /* HR перед заголовком → разрыв страницы */
1601
+ hr:has(+ :where(h1, h2, h3, h4, h5, h6, p, pre, table, img, blockquote)) {
1602
+ break-after: page !important;
1603
+ }
1604
+
1605
+ /* Первый h1 не разрывается перед собой */
1606
+ h1:first-of-type {
1607
+ break-before: avoid;
1608
+ }
1609
+
1610
+ /* Утилиты ручного разрыва */
1611
+ :where(.pb, .np, .pagebreak, .newpage, .page-break, .new-page) {
1612
+ background-color: transparent;
1613
+
1614
+ @include mixins.md-break(auto, auto, page);
1615
+ }
1616
+
1617
+ .print-chapter {
1618
+ break-before: page;
1619
+ }
1620
+
1621
+ .print-section {
1622
+ break-before: avoid;
1623
+ }
1624
+
1625
+ /* Первый/последний дочерний */
1626
+ :where(:heading, p, ol, ul) > :first-child {
1627
+ margin-block-start: 0;
1628
+ }
1629
+
1630
+ :where(:heading, p, ol, ul) > :last-child {
1631
+ margin-block-end: 0;
1632
+ }
1633
+ }
1634
+ }