slidev-theme-practicum 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +72 -10
- package/components/Slide.vue +81 -26
- package/components/Slot.vue +33 -48
- package/components/Text.vue +68 -2
- package/components/Timeline.vue +2 -23
- package/composables/deck-slot-markup.cjs +249 -0
- package/composables/decor-catalog.mjs +169 -47
- package/composables/layout-authoring.ts +6 -2
- package/composables/layout-markdown.mjs +33 -0
- package/composables/layout-recipes.ts +51 -5
- package/composables/layout-shorthands.ts +251 -81
- package/composables/markdown-to-vnodes.cjs +1 -0
- package/composables/markdown-to-vnodes.mjs +237 -0
- package/composables/slot-placement.ts +1 -1
- package/composables/slot-spacing.ts +66 -0
- package/composables/text-fit-runtime.ts +458 -76
- package/composables/text-fit-scope.ts +13 -0
- package/composables/text-slot-markdown.mjs +193 -0
- package/composables/text-typography.mjs +2 -0
- package/composables/theme-assets.mjs +60 -0
- package/composables/timeline-grid.ts +27 -0
- package/composables/typescript-require.cjs +29 -0
- package/composables/validate-deck-layouts.cjs +277 -0
- package/decor-library.md +2 -0
- package/example.md +132 -10
- package/package.json +25 -11
- package/public/photos/photo-1.webp +0 -0
- package/public/photos/photo-10.webp +0 -0
- package/public/photos/photo-11.webp +0 -0
- package/public/photos/photo-12.webp +0 -0
- package/public/photos/photo-13.webp +0 -0
- package/public/photos/photo-14.webp +0 -0
- package/public/photos/photo-15.webp +0 -0
- package/public/photos/photo-16.webp +0 -0
- package/public/photos/photo-17.webp +0 -0
- package/public/photos/photo-18.webp +0 -0
- package/public/photos/photo-19.webp +0 -0
- package/public/photos/photo-2.webp +0 -0
- package/public/photos/photo-20.webp +0 -0
- package/public/photos/photo-21.webp +0 -0
- package/public/photos/photo-22.webp +0 -0
- package/public/photos/photo-23.webp +0 -0
- package/public/photos/photo-24.webp +0 -0
- package/public/photos/photo-25.webp +0 -0
- package/public/photos/photo-26.webp +0 -0
- package/public/photos/photo-27.webp +0 -0
- package/public/photos/photo-28.webp +0 -0
- package/public/photos/photo-29.webp +0 -0
- package/public/photos/photo-3.webp +0 -0
- package/public/photos/photo-30.webp +0 -0
- package/public/photos/photo-4.webp +0 -0
- package/public/photos/photo-5.webp +0 -0
- package/public/photos/photo-6.webp +0 -0
- package/public/photos/photo-7.webp +0 -0
- package/public/photos/photo-8.webp +0 -0
- package/public/photos/photo-9.webp +0 -0
- package/scripts/browser-smoke-runtime.mjs +428 -0
- package/scripts/browser-smoke.mjs +424 -0
- package/scripts/build-artifact-assets.mjs +55 -0
- package/scripts/check-build-artifact.mjs +243 -0
- package/scripts/check-package.mjs +132 -0
- package/scripts/check-test-architecture.mjs +176 -0
- package/scripts/npm-spawn.mjs +31 -0
- package/scripts/test-architecture-policy.mjs +245 -0
- package/scripts/theme-asset-inventory.mjs +83 -0
- package/scripts/validate-deck.cjs +18 -0
- package/setup/decor-save-middleware.ts +244 -0
- package/setup/vite-plugins.ts +14 -84
- package/skills/slidev-practicum/SKILL.md +25 -0
- package/skills/slidev-practicum/agents/openai.yaml +4 -0
- package/styles/index.css +10 -1
- package/composables/layout-registry.ts +0 -47
- package/env.d.ts +0 -6
- package/public/photos/photo-1.png +0 -0
- package/public/photos/photo-10.png +0 -0
- package/public/photos/photo-2.png +0 -0
- package/public/photos/photo-3.png +0 -0
- package/public/photos/photo-4.png +0 -0
- package/public/photos/photo-5.png +0 -0
- package/public/photos/photo-6.png +0 -0
- package/public/photos/photo-7.png +0 -0
- package/public/photos/photo-8.png +0 -0
- package/public/photos/photo-9.png +0 -0
- package/slidev-theme-practicum.png +0 -0
- package/slidev-theme-practicum.svg +0 -102
package/example.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
theme: ./
|
|
3
3
|
title: Яндекс Практикум — справочная галерея
|
|
4
|
+
routerMode: hash
|
|
5
|
+
preload: false
|
|
4
6
|
layout: cover
|
|
5
7
|
variant: grid
|
|
6
8
|
mode: dark
|
|
@@ -237,6 +239,7 @@ decor:
|
|
|
237
239
|
---
|
|
238
240
|
layout: explainer
|
|
239
241
|
variant: title-supports
|
|
242
|
+
preload: false
|
|
240
243
|
---
|
|
241
244
|
|
|
242
245
|
# Сначала задача, потом макет
|
|
@@ -260,6 +263,12 @@ layout: explainer
|
|
|
260
263
|
variant: title-supports
|
|
261
264
|
---
|
|
262
265
|
|
|
266
|
+
<!--
|
|
267
|
+
Контракт explainer:title-supports:
|
|
268
|
+
- 1× заголовок `# …`
|
|
269
|
+
- 3+ пункта `-` верхнего уровня (поддержки справа)
|
|
270
|
+
-->
|
|
271
|
+
|
|
263
272
|
# Заголовок и три коротких аргумента
|
|
264
273
|
|
|
265
274
|
- Самая рабочая лошадка: одна мысль слева и три аргумента справа.
|
|
@@ -271,6 +280,13 @@ layout: explainer
|
|
|
271
280
|
variant: title-supports-bottom-muted
|
|
272
281
|
---
|
|
273
282
|
|
|
283
|
+
<!--
|
|
284
|
+
Контракт explainer:title-supports-bottom-muted:
|
|
285
|
+
- 1× заголовок `# …`
|
|
286
|
+
- ровно 2 пункта `-` верхнего уровня (нижний 50/50)
|
|
287
|
+
- без абзацев и без 3+ пунктов
|
|
288
|
+
-->
|
|
289
|
+
|
|
274
290
|
# Заголовок и две приглушённые опоры
|
|
275
291
|
|
|
276
292
|
- Контекст или ограничение: «учитывайте, что» или «работает, если».
|
|
@@ -281,9 +297,18 @@ layout: explainer
|
|
|
281
297
|
variant: title-supports-bottom-plain
|
|
282
298
|
---
|
|
283
299
|
|
|
300
|
+
<!--
|
|
301
|
+
Контракт explainer:title-supports-bottom-plain:
|
|
302
|
+
- 1× заголовок `# …`
|
|
303
|
+
- ровно 2 пункта `-` верхнего уровня (без приглушения нижних опор)
|
|
304
|
+
-->
|
|
305
|
+
|
|
284
306
|
# Когда нужны два самостоятельных абзаца
|
|
285
307
|
|
|
286
308
|
- Этот вариант снимает приглушение с нижних опор. Каждый абзац читается как самостоятельный текст: его не воспринимают как «второстепенный к заголовку», а ставят рядом по весу.
|
|
309
|
+
- авава
|
|
310
|
+
- ава
|
|
311
|
+
авава
|
|
287
312
|
- Берите слайд, когда тезис распадается на два независимых направления: например, «что включить» и «чего избегать», «теория» и «практика», «причина» и «следствие». Третий блок не нужен — два аргумента уже задают сильную смысловую пару.
|
|
288
313
|
|
|
289
314
|
---
|
|
@@ -303,8 +328,15 @@ variant: title-body
|
|
|
303
328
|
layout: message
|
|
304
329
|
variant: centered
|
|
305
330
|
mode: light
|
|
331
|
+
preload: false
|
|
306
332
|
---
|
|
307
333
|
|
|
334
|
+
<!--
|
|
335
|
+
Контракт message:centered:
|
|
336
|
+
- только 1× заголовок `# …`
|
|
337
|
+
- без абзацев, списков и blockquote в теле слайда
|
|
338
|
+
-->
|
|
339
|
+
|
|
308
340
|
# Поставьте паузу: оставьте на слайде один тезис
|
|
309
341
|
|
|
310
342
|
---
|
|
@@ -314,9 +346,9 @@ mode: light
|
|
|
314
346
|
person:
|
|
315
347
|
name: Константин Константинопольский
|
|
316
348
|
title: наставник
|
|
317
|
-
avatar: /photos/photo-
|
|
318
|
-
avatar-position: '
|
|
319
|
-
avatar-zoom: 1.
|
|
349
|
+
avatar: /theme/photos/photo-30.webp
|
|
350
|
+
avatar-position: '62% 42%'
|
|
351
|
+
avatar-zoom: 1.18
|
|
320
352
|
---
|
|
321
353
|
|
|
322
354
|
> Цитата работает, когда внешний голос усиливает тезис.
|
|
@@ -377,6 +409,7 @@ layout: collection
|
|
|
377
409
|
variant: points
|
|
378
410
|
arrangement: trio
|
|
379
411
|
tone: green
|
|
412
|
+
preload: false
|
|
380
413
|
decor:
|
|
381
414
|
meaning: rules
|
|
382
415
|
tone: green
|
|
@@ -446,7 +479,7 @@ decor:
|
|
|
446
479
|
id: decor-rules-wide-01
|
|
447
480
|
opacity: 0.85
|
|
448
481
|
media:
|
|
449
|
-
src: /photos/photo-5.
|
|
482
|
+
src: /theme/photos/photo-5.webp
|
|
450
483
|
fit: cover
|
|
451
484
|
position: '48% 44%'
|
|
452
485
|
zoom: 1.08
|
|
@@ -465,7 +498,7 @@ layout: collection
|
|
|
465
498
|
variant: metrics
|
|
466
499
|
arrangement: featured-copy
|
|
467
500
|
media:
|
|
468
|
-
src: /photos/photo-5.
|
|
501
|
+
src: /theme/photos/photo-5.webp
|
|
469
502
|
fit: cover
|
|
470
503
|
position: '48% 44%'
|
|
471
504
|
zoom: 1.08
|
|
@@ -484,11 +517,11 @@ layout: collection
|
|
|
484
517
|
variant: metrics
|
|
485
518
|
arrangement: featured-copy-split-media
|
|
486
519
|
media:
|
|
487
|
-
- src: /photos/photo-5.
|
|
520
|
+
- src: /theme/photos/photo-5.webp
|
|
488
521
|
fit: cover
|
|
489
522
|
position: '48% 44%'
|
|
490
523
|
zoom: 1.08
|
|
491
|
-
- src: /photos/photo-6.
|
|
524
|
+
- src: /theme/photos/photo-6.webp
|
|
492
525
|
fit: cover
|
|
493
526
|
position: '50% 40%'
|
|
494
527
|
zoom: 1.04
|
|
@@ -507,6 +540,14 @@ variant: facts-stacked
|
|
|
507
540
|
mode: dark
|
|
508
541
|
---
|
|
509
542
|
|
|
543
|
+
<!--
|
|
544
|
+
Контракт collection:facts-stacked:
|
|
545
|
+
- 1× заголовок `# …`
|
|
546
|
+
- опционально 1 абзац между заголовком и списком
|
|
547
|
+
- ровно 3 факта: у каждого `- значение` и вложенный ` - подпись`
|
|
548
|
+
- не используйте `- роль: текст` в одной строке
|
|
549
|
+
-->
|
|
550
|
+
|
|
510
551
|
# Три факта как вертикальная опора
|
|
511
552
|
|
|
512
553
|
Когда нужно отступить от равных карточек, этот архетип собирает заголовок и три факта без ручных координат.
|
|
@@ -518,6 +559,28 @@ mode: dark
|
|
|
518
559
|
- иногда
|
|
519
560
|
- факты могут быть короткими словами
|
|
520
561
|
|
|
562
|
+
---
|
|
563
|
+
layout: collection
|
|
564
|
+
variant: facts-duo
|
|
565
|
+
mode: light
|
|
566
|
+
tone: blue
|
|
567
|
+
---
|
|
568
|
+
|
|
569
|
+
<!--
|
|
570
|
+
Контракт collection:facts-duo:
|
|
571
|
+
- 1× заголовок `# …`, опционально абзац до списка
|
|
572
|
+
- ровно 2 факта с вложенной подписью (` - …`)
|
|
573
|
+
-->
|
|
574
|
+
|
|
575
|
+
# Два факта как развилка выбора
|
|
576
|
+
|
|
577
|
+
Берите этот вариант, когда нужно поставить рядом два равных результата без ручной сетки.
|
|
578
|
+
|
|
579
|
+
- быстрее
|
|
580
|
+
- сокращает ожидание обратной связи
|
|
581
|
+
- надёжнее
|
|
582
|
+
- оставляет проверяемый след решения
|
|
583
|
+
|
|
521
584
|
---
|
|
522
585
|
layout: collection
|
|
523
586
|
variant: facts-trio
|
|
@@ -525,6 +588,12 @@ mode: light
|
|
|
525
588
|
tone: blue
|
|
526
589
|
---
|
|
527
590
|
|
|
591
|
+
<!--
|
|
592
|
+
Контракт collection:facts-trio:
|
|
593
|
+
- 1× заголовок `# …`, опционально абзац до списка
|
|
594
|
+
- ровно 3 факта с вложенной подписью
|
|
595
|
+
-->
|
|
596
|
+
|
|
528
597
|
# Заголовок поддержанный тремя одноранговыми фактами
|
|
529
598
|
|
|
530
599
|
Берите этот вариант, когда тезис подкрепляется тремя сопоставимыми числами и важна равная значимость
|
|
@@ -536,6 +605,32 @@ tone: blue
|
|
|
536
605
|
- иногда
|
|
537
606
|
- факты могут быть короткими словами
|
|
538
607
|
|
|
608
|
+
---
|
|
609
|
+
layout: collection
|
|
610
|
+
variant: facts-quartet
|
|
611
|
+
mode: light
|
|
612
|
+
tone: blue
|
|
613
|
+
---
|
|
614
|
+
|
|
615
|
+
<!--
|
|
616
|
+
Контракт collection:facts-quartet:
|
|
617
|
+
- 1× заголовок `# …`, опционально абзац до списка
|
|
618
|
+
- ровно 4 факта с вложенной подписью
|
|
619
|
+
-->
|
|
620
|
+
|
|
621
|
+
# Четыре факта в одной нижней полосе
|
|
622
|
+
|
|
623
|
+
Берите этот вариант, когда тезис держится на четырёх коротких, сопоставимых опорах.
|
|
624
|
+
|
|
625
|
+
- X
|
|
626
|
+
- повторяемая операция
|
|
627
|
+
- Y
|
|
628
|
+
- проверяемый артефакт
|
|
629
|
+
- Z
|
|
630
|
+
- критерий качества
|
|
631
|
+
- W
|
|
632
|
+
- условие остановки
|
|
633
|
+
|
|
539
634
|
---
|
|
540
635
|
layout: collection
|
|
541
636
|
variant: facts-featured
|
|
@@ -570,12 +665,13 @@ mode: light
|
|
|
570
665
|
layout: none
|
|
571
666
|
mode: light
|
|
572
667
|
header: default
|
|
668
|
+
preload: false
|
|
573
669
|
---
|
|
574
670
|
|
|
575
671
|
<Slot area="2 / 1 / 6 / -1" gap="2">
|
|
576
672
|
<Text size="6">Акцентный цвет — пять настроений</Text>
|
|
577
673
|
<Text size="3" muted>
|
|
578
|
-
Цвета фона и акцента работают
|
|
674
|
+
Цвета фона и акцента работают **независимо**: можно держать графитовый фон с синими акцентами или красить весь слайд в выбранный цвет.
|
|
579
675
|
</Text>
|
|
580
676
|
</Slot>
|
|
581
677
|
|
|
@@ -767,7 +863,7 @@ header: default
|
|
|
767
863
|
</Slot>
|
|
768
864
|
|
|
769
865
|
<Slot area="7 / 7 / -1 / 10" surface="light">
|
|
770
|
-
<Image src="/photos/photo-5.
|
|
866
|
+
<Image src="/theme/photos/photo-5.webp" fit="cover" position="52% 40%" zoom="1.08" />
|
|
771
867
|
</Slot>
|
|
772
868
|
|
|
773
869
|
<Slot area="7 / 10 / -1 / -1" surface="color" tone="blue" margin="3" gap="2">
|
|
@@ -781,6 +877,32 @@ variant: closing
|
|
|
781
877
|
mode: dark
|
|
782
878
|
tone: blue
|
|
783
879
|
logo: full
|
|
880
|
+
preload: false
|
|
784
881
|
---
|
|
785
882
|
|
|
786
|
-
|
|
883
|
+
<!--
|
|
884
|
+
Контракт message:closing:
|
|
885
|
+
- обязательно 1× заголовок `# …`
|
|
886
|
+
- можно добавить не более 1× абзаца под заголовком
|
|
887
|
+
-->
|
|
888
|
+
|
|
889
|
+
# Делайте меньше, но точнее…
|
|
890
|
+
|
|
891
|
+
---
|
|
892
|
+
layout: message
|
|
893
|
+
variant: closing
|
|
894
|
+
mode: dark
|
|
895
|
+
tone: blue
|
|
896
|
+
logo: full
|
|
897
|
+
preload: false
|
|
898
|
+
---
|
|
899
|
+
|
|
900
|
+
<!--
|
|
901
|
+
Контракт message:closing:
|
|
902
|
+
- обязательно 1× заголовок `# …`
|
|
903
|
+
- можно добавить не более 1× абзаца под заголовком
|
|
904
|
+
-->
|
|
905
|
+
|
|
906
|
+
# Делайте меньше, но точнее…
|
|
907
|
+
|
|
908
|
+
Оставьте только то, что ведёт к следующему действию
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "slidev-theme-practicum",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Strict Slidev presentation theme with a 12x12 grid, editorial layouts, and low-level slot composition API",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"slidev-theme",
|
|
@@ -18,23 +18,24 @@
|
|
|
18
18
|
"files": [
|
|
19
19
|
"components",
|
|
20
20
|
"composables",
|
|
21
|
+
"scripts",
|
|
21
22
|
"layouts",
|
|
22
23
|
"public",
|
|
23
24
|
"setup",
|
|
24
25
|
"styles",
|
|
25
26
|
"types",
|
|
26
|
-
"
|
|
27
|
-
"
|
|
27
|
+
"skills",
|
|
28
|
+
"LICENSE",
|
|
29
|
+
"README.md",
|
|
28
30
|
"example.md",
|
|
29
|
-
"
|
|
30
|
-
"slidev-theme-practicum.svg"
|
|
31
|
+
"decor-library.md"
|
|
31
32
|
],
|
|
32
33
|
"slidev": {
|
|
33
34
|
"colorSchema": "light",
|
|
34
35
|
"defaults": {
|
|
35
36
|
"aspectRatio": "16/9",
|
|
36
37
|
"canvasWidth": 1920,
|
|
37
|
-
"favicon": "/favicon.svg",
|
|
38
|
+
"favicon": "/theme/favicon.svg",
|
|
38
39
|
"fonts": {
|
|
39
40
|
"provider": "none",
|
|
40
41
|
"sans": "YS Text, Inter",
|
|
@@ -47,8 +48,12 @@
|
|
|
47
48
|
}
|
|
48
49
|
},
|
|
49
50
|
"engines": {
|
|
51
|
+
"node": "^20.19.0 || >=22.12.0",
|
|
50
52
|
"slidev": ">=0.50.0"
|
|
51
53
|
},
|
|
54
|
+
"bin": {
|
|
55
|
+
"slidev-practicum-validate": "scripts/validate-deck.cjs"
|
|
56
|
+
},
|
|
52
57
|
"scripts": {
|
|
53
58
|
"dev": "slidev example.md",
|
|
54
59
|
"dev:decor": "slidev decor-library.md",
|
|
@@ -58,26 +63,35 @@
|
|
|
58
63
|
"screenshot": "slidev export example.md --format png",
|
|
59
64
|
"lint": "eslint .",
|
|
60
65
|
"lint:fix": "eslint . --fix",
|
|
61
|
-
"
|
|
66
|
+
"validate-deck": "node scripts/validate-deck.cjs",
|
|
67
|
+
"test": "npm run lint && npm run typecheck && npm run test:unit && npm run test:architecture && npm run test:build && npm run test:build-artifact && npm run test:browser && npm run test:package",
|
|
62
68
|
"typecheck": "vue-tsc --noEmit",
|
|
69
|
+
"test:architecture": "node scripts/check-test-architecture.mjs",
|
|
63
70
|
"test:unit": "node --test tests/*.test.cjs",
|
|
64
|
-
"test:
|
|
71
|
+
"test:validate-deck": "node scripts/validate-deck.cjs example.md",
|
|
72
|
+
"test:build": "slidev build example.md",
|
|
73
|
+
"test:build-artifact": "node scripts/check-build-artifact.mjs",
|
|
74
|
+
"test:browser": "node scripts/browser-smoke.mjs",
|
|
75
|
+
"test:package": "node scripts/check-package.mjs"
|
|
65
76
|
},
|
|
66
77
|
"author": "",
|
|
67
78
|
"type": "commonjs",
|
|
68
79
|
"dependencies": {
|
|
69
|
-
"@slidev/
|
|
80
|
+
"@slidev/parser": "^52.14.2",
|
|
81
|
+
"@slidev/types": "^52.14.2",
|
|
82
|
+
"markdown-it": "^14.1.0",
|
|
83
|
+
"typescript": "^6.0.3",
|
|
84
|
+
"vue": "^3.5.13"
|
|
70
85
|
},
|
|
71
86
|
"devDependencies": {
|
|
72
87
|
"@eslint/js": "^10.0.1",
|
|
73
88
|
"@slidev/cli": "^52.14.2",
|
|
74
|
-
"@slidev/parser": "^52.14.2",
|
|
75
89
|
"@stylistic/eslint-plugin": "^5.10.0",
|
|
76
90
|
"eslint": "^10.2.0",
|
|
77
91
|
"eslint-plugin-vue": "^10.8.0",
|
|
78
92
|
"globals": "^17.5.0",
|
|
79
93
|
"playwright-chromium": "^1.59.1",
|
|
80
|
-
"
|
|
94
|
+
"postcss": "^8.5.9",
|
|
81
95
|
"typescript-eslint": "^8.58.2",
|
|
82
96
|
"vue-tsc": "^3.2.7"
|
|
83
97
|
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|