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.
Files changed (86) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +72 -10
  3. package/components/Slide.vue +81 -26
  4. package/components/Slot.vue +33 -48
  5. package/components/Text.vue +68 -2
  6. package/components/Timeline.vue +2 -23
  7. package/composables/deck-slot-markup.cjs +249 -0
  8. package/composables/decor-catalog.mjs +169 -47
  9. package/composables/layout-authoring.ts +6 -2
  10. package/composables/layout-markdown.mjs +33 -0
  11. package/composables/layout-recipes.ts +51 -5
  12. package/composables/layout-shorthands.ts +251 -81
  13. package/composables/markdown-to-vnodes.cjs +1 -0
  14. package/composables/markdown-to-vnodes.mjs +237 -0
  15. package/composables/slot-placement.ts +1 -1
  16. package/composables/slot-spacing.ts +66 -0
  17. package/composables/text-fit-runtime.ts +458 -76
  18. package/composables/text-fit-scope.ts +13 -0
  19. package/composables/text-slot-markdown.mjs +193 -0
  20. package/composables/text-typography.mjs +2 -0
  21. package/composables/theme-assets.mjs +60 -0
  22. package/composables/timeline-grid.ts +27 -0
  23. package/composables/typescript-require.cjs +29 -0
  24. package/composables/validate-deck-layouts.cjs +277 -0
  25. package/decor-library.md +2 -0
  26. package/example.md +132 -10
  27. package/package.json +25 -11
  28. package/public/photos/photo-1.webp +0 -0
  29. package/public/photos/photo-10.webp +0 -0
  30. package/public/photos/photo-11.webp +0 -0
  31. package/public/photos/photo-12.webp +0 -0
  32. package/public/photos/photo-13.webp +0 -0
  33. package/public/photos/photo-14.webp +0 -0
  34. package/public/photos/photo-15.webp +0 -0
  35. package/public/photos/photo-16.webp +0 -0
  36. package/public/photos/photo-17.webp +0 -0
  37. package/public/photos/photo-18.webp +0 -0
  38. package/public/photos/photo-19.webp +0 -0
  39. package/public/photos/photo-2.webp +0 -0
  40. package/public/photos/photo-20.webp +0 -0
  41. package/public/photos/photo-21.webp +0 -0
  42. package/public/photos/photo-22.webp +0 -0
  43. package/public/photos/photo-23.webp +0 -0
  44. package/public/photos/photo-24.webp +0 -0
  45. package/public/photos/photo-25.webp +0 -0
  46. package/public/photos/photo-26.webp +0 -0
  47. package/public/photos/photo-27.webp +0 -0
  48. package/public/photos/photo-28.webp +0 -0
  49. package/public/photos/photo-29.webp +0 -0
  50. package/public/photos/photo-3.webp +0 -0
  51. package/public/photos/photo-30.webp +0 -0
  52. package/public/photos/photo-4.webp +0 -0
  53. package/public/photos/photo-5.webp +0 -0
  54. package/public/photos/photo-6.webp +0 -0
  55. package/public/photos/photo-7.webp +0 -0
  56. package/public/photos/photo-8.webp +0 -0
  57. package/public/photos/photo-9.webp +0 -0
  58. package/scripts/browser-smoke-runtime.mjs +428 -0
  59. package/scripts/browser-smoke.mjs +424 -0
  60. package/scripts/build-artifact-assets.mjs +55 -0
  61. package/scripts/check-build-artifact.mjs +243 -0
  62. package/scripts/check-package.mjs +132 -0
  63. package/scripts/check-test-architecture.mjs +176 -0
  64. package/scripts/npm-spawn.mjs +31 -0
  65. package/scripts/test-architecture-policy.mjs +245 -0
  66. package/scripts/theme-asset-inventory.mjs +83 -0
  67. package/scripts/validate-deck.cjs +18 -0
  68. package/setup/decor-save-middleware.ts +244 -0
  69. package/setup/vite-plugins.ts +14 -84
  70. package/skills/slidev-practicum/SKILL.md +25 -0
  71. package/skills/slidev-practicum/agents/openai.yaml +4 -0
  72. package/styles/index.css +10 -1
  73. package/composables/layout-registry.ts +0 -47
  74. package/env.d.ts +0 -6
  75. package/public/photos/photo-1.png +0 -0
  76. package/public/photos/photo-10.png +0 -0
  77. package/public/photos/photo-2.png +0 -0
  78. package/public/photos/photo-3.png +0 -0
  79. package/public/photos/photo-4.png +0 -0
  80. package/public/photos/photo-5.png +0 -0
  81. package/public/photos/photo-6.png +0 -0
  82. package/public/photos/photo-7.png +0 -0
  83. package/public/photos/photo-8.png +0 -0
  84. package/public/photos/photo-9.png +0 -0
  85. package/slidev-theme-practicum.png +0 -0
  86. 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-3.png
318
- avatar-position: '50% 38%'
319
- avatar-zoom: 1.04
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.png
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.png
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.png
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.png
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.png" fit="cover" position="52% 40%" zoom="1.08" />
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.0",
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
- "decor-library.md",
27
- "env.d.ts",
27
+ "skills",
28
+ "LICENSE",
29
+ "README.md",
28
30
  "example.md",
29
- "slidev-theme-practicum.png",
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
- "test": "npm run typecheck && npm run test:unit && npm run test:build",
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:build": "slidev build example.md"
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/types": "^52.14.2"
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
- "typescript": "^6.0.3",
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