@erclx/canon 5.51.0 → 5.53.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 (142) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +1 -4
  3. package/claude/.claude-plugin/plugin.json +1 -1
  4. package/claude/skills/canon-cli/SKILL.md +0 -3
  5. package/claude/skills/context-fold/REQUIREMENT.md +0 -1
  6. package/claude/skills/design-taste/references/kinds.md +0 -1
  7. package/claude/skills/draw-figure/REQUIREMENT.md +2 -3
  8. package/claude/skills/draw-figure/SKILL.md +4 -5
  9. package/claude/skills/draw-figure/references/figures.md +0 -1
  10. package/claude/skills/draw-figure/references/hand-drawn.md +1 -1
  11. package/claude/skills/git-pr/references/pr.md +1 -1
  12. package/claude/skills/pick-by-eye/REQUIREMENT.md +0 -1
  13. package/claude/skills/pick-by-eye/SKILL.md +1 -1
  14. package/claude/skills/review-address/SKILL.md +1 -1
  15. package/claude/skills/review-address/references/post-review-findings.md +1 -1
  16. package/claude/skills/review-pr/references/post.md +2 -2
  17. package/claude/skills/target-check/SKILL.md +2 -0
  18. package/claude/skills/target-setup/SKILL.md +1 -1
  19. package/claude/skills/target-update/REQUIREMENT.md +33 -0
  20. package/claude/skills/target-update/SKILL.md +136 -0
  21. package/claude/skills/teach-craft/REQUIREMENT.md +30 -0
  22. package/claude/skills/teach-craft/SKILL.md +39 -0
  23. package/claude/skills/teach-craft/references/lesson-craft.md +52 -0
  24. package/claude/skills/{teach-workspace → teach-craft}/references/pedagogy.md +12 -4
  25. package/docs/agents/audits.md +0 -1
  26. package/docs/agents/migrate.md +2 -1
  27. package/docs/target/migrations.md +12 -1
  28. package/docs/target/projects.md +1 -1
  29. package/docs/target/sync.md +1 -1
  30. package/docs/workflow/parallel-features.md +1 -1
  31. package/docs/workflow/skill-map-on-request.md +10 -22
  32. package/docs/workflow/skill-map.md +13 -14
  33. package/package.json +1 -4
  34. package/scripts/core/regen-web-previews.ts +2 -67
  35. package/src/audits/catalog.ts +0 -1
  36. package/src/browser/engine.ts +3 -6
  37. package/src/capture/render.ts +1 -1
  38. package/src/claude/cases/authoring.ts +0 -12
  39. package/src/claude/cases/misc.ts +0 -17
  40. package/src/claude/cases/setup.ts +7 -0
  41. package/src/claude/cases/workflow.ts +2 -38
  42. package/src/claude/skills-audit.ts +0 -1
  43. package/src/cli/help.ts +0 -7
  44. package/src/cli.ts +0 -6
  45. package/src/commands/labels.ts +9 -7
  46. package/src/commands/records.ts +0 -1
  47. package/src/commands/serve.ts +2 -2
  48. package/src/design/components.ts +8 -1514
  49. package/src/design/css.ts +5 -6
  50. package/src/design/fonts.ts +3 -5
  51. package/src/driver/drive.ts +3 -4
  52. package/src/driver/steps.ts +2 -5
  53. package/src/inventory/walk.ts +1 -1
  54. package/src/markdown/scope.ts +4 -31
  55. package/src/migrate/status.ts +5 -1
  56. package/src/records/validate.ts +4 -176
  57. package/src/sandbox/equivalence.ts +0 -5
  58. package/tooling/claude/seeds/.claude/hooks/review-post-scan.sh +1 -1
  59. package/claude/skills/draft-and-pick/REQUIREMENT.md +0 -26
  60. package/claude/skills/draft-and-pick/SKILL.md +0 -11
  61. package/claude/skills/draft-doc/REQUIREMENT.md +0 -26
  62. package/claude/skills/draft-doc/SKILL.md +0 -11
  63. package/claude/skills/draft-figure/REQUIREMENT.md +0 -26
  64. package/claude/skills/draft-figure/SKILL.md +0 -11
  65. package/claude/skills/draft-identity/REQUIREMENT.md +0 -26
  66. package/claude/skills/draft-identity/SKILL.md +0 -11
  67. package/claude/skills/draft-ready/REQUIREMENT.md +0 -26
  68. package/claude/skills/draft-ready/SKILL.md +0 -11
  69. package/claude/skills/draft-screencast/REQUIREMENT.md +0 -26
  70. package/claude/skills/draft-screencast/SKILL.md +0 -11
  71. package/claude/skills/draft-slides/REQUIREMENT.md +0 -26
  72. package/claude/skills/draft-slides/SKILL.md +0 -11
  73. package/claude/skills/make-deck/REQUIREMENT.md +0 -36
  74. package/claude/skills/make-deck/SKILL.md +0 -80
  75. package/claude/skills/make-deck/references/deck.md +0 -183
  76. package/claude/skills/read-frames/REQUIREMENT.md +0 -30
  77. package/claude/skills/read-frames/SKILL.md +0 -55
  78. package/claude/skills/record-screencast/REQUIREMENT.md +0 -35
  79. package/claude/skills/record-screencast/SKILL.md +0 -99
  80. package/claude/skills/script-screencast/REQUIREMENT.md +0 -34
  81. package/claude/skills/script-screencast/SKILL.md +0 -70
  82. package/claude/skills/script-screencast/references/beats-template.md +0 -119
  83. package/claude/skills/teach-workspace/REQUIREMENT.md +0 -34
  84. package/claude/skills/teach-workspace/SKILL.md +0 -196
  85. package/claude/skills/teach-workspace/references/glossary.md +0 -90
  86. package/claude/skills/teach-workspace/references/lesson-build.md +0 -106
  87. package/claude/skills/teach-workspace/references/lesson-craft.md +0 -135
  88. package/claude/skills/teach-workspace/references/promotion-fold.md +0 -35
  89. package/claude/skills/teach-workspace/references/promotion.md +0 -116
  90. package/claude/skills/teach-workspace/references/revisit.md +0 -28
  91. package/claude/skills/teach-workspace/references/teach.md +0 -211
  92. package/claude/skills/video-craft/REQUIREMENT.md +0 -35
  93. package/claude/skills/video-craft/SKILL.md +0 -96
  94. package/claude/skills/video-craft/references/adopted.md +0 -110
  95. package/src/commands/demo.ts +0 -542
  96. package/src/commands/slides.ts +0 -184
  97. package/src/commands/teach.ts +0 -1401
  98. package/src/demo/beats.ts +0 -135
  99. package/src/demo/compile.ts +0 -350
  100. package/src/demo/container.ts +0 -219
  101. package/src/demo/cursors.ts +0 -55
  102. package/src/demo/drive.ts +0 -442
  103. package/src/demo/pointer.ts +0 -178
  104. package/src/demo/theme.ts +0 -112
  105. package/src/demo/timeline.ts +0 -64
  106. package/src/slides/convert/chart.ts +0 -165
  107. package/src/slides/convert/deck.ts +0 -244
  108. package/src/slides/convert/export.ts +0 -567
  109. package/src/slides/convert/master.ts +0 -198
  110. package/src/slides/convert/shapes.ts +0 -804
  111. package/src/slides/convert/svg.ts +0 -38
  112. package/src/slides/convert/walk.ts +0 -671
  113. package/src/slides/decks.ts +0 -110
  114. package/src/slides/open.ts +0 -18
  115. package/src/slides/package/fonts.ts +0 -301
  116. package/src/slides/package/motion.ts +0 -316
  117. package/src/slides/package/test-face.ts +0 -113
  118. package/src/teach/browser/compile.ts +0 -44
  119. package/src/teach/browser/dismiss.ts +0 -76
  120. package/src/teach/browser/focus-line.ts +0 -19
  121. package/src/teach/browser/glossary-filter.ts +0 -44
  122. package/src/teach/browser/head.ts +0 -30
  123. package/src/teach/browser/quiz.ts +0 -19
  124. package/src/teach/browser/reload.ts +0 -9
  125. package/src/teach/browser/sidebar.ts +0 -233
  126. package/src/teach/browser/theme.ts +0 -18
  127. package/src/teach/components/code.tsx +0 -24
  128. package/src/teach/components/heading.tsx +0 -11
  129. package/src/teach/components/list.tsx +0 -17
  130. package/src/teach/components/paragraph.tsx +0 -29
  131. package/src/teach/components/refs.tsx +0 -28
  132. package/src/teach/cross-references.ts +0 -78
  133. package/src/teach/fonts.ts +0 -16
  134. package/src/teach/highlight.ts +0 -71
  135. package/src/teach/html/jsx-dev-runtime.ts +0 -13
  136. package/src/teach/html/jsx-runtime.ts +0 -113
  137. package/src/teach/html/raw.ts +0 -28
  138. package/src/teach/lesson.ts +0 -178
  139. package/src/teach/nav.ts +0 -1337
  140. package/src/teach/render.ts +0 -240
  141. package/src/teach/workspace.ts +0 -1164
  142. package/src/teach/write-if-changed.ts +0 -17
@@ -1,198 +0,0 @@
1
- import type PptxGenJS from 'pptxgenjs'
2
- import {
3
- BAND_SLOTS,
4
- type Band,
5
- type BandSlot,
6
- type DeckConfig,
7
- } from '@/slides/convert/deck'
8
- import { fontFace } from '@/slides/convert/shapes'
9
-
10
- /**
11
- * The deck's master, built from the project's own tokens as the page computed
12
- * them rather than from the toolkit's design module. A slide that hides or
13
- * overrides a band takes a master without that band, so editing the footer
14
- * once in PowerPoint reaches every slide still on the master's own.
15
- */
16
-
17
- export interface DeckTheme {
18
- readonly background: string
19
- readonly ink: string
20
- readonly muted: string
21
- readonly accent: string
22
- readonly face: string
23
- }
24
-
25
- /** What the first slide computed, read in the page by `readTheme`. */
26
- export interface ThemeReading {
27
- /** Each role's `--color-*` value as hex, absent where none is declared. */
28
- readonly tokens: {
29
- readonly background?: string
30
- readonly text?: string
31
- readonly muted?: string
32
- readonly accent?: string
33
- }
34
- readonly body: { readonly background: string; readonly color: string }
35
- readonly fontFamily: string
36
- /** Every declared `--color-*` property in sheet order, for chart series. */
37
- readonly roles: readonly { readonly name: string; readonly hex: string }[]
38
- }
39
-
40
- export interface MasterBands {
41
- readonly header: boolean
42
- readonly footer: boolean
43
- }
44
-
45
- /** Intrinsic pixel size, which sets the mark's aspect inside its box. */
46
- export interface MarkSize {
47
- readonly width: number
48
- readonly height: number
49
- }
50
-
51
- const SLIDE_W = 13.333
52
- const MARGIN = 0.5
53
- const BAND_H = 0.4
54
- const HEADER_Y = 0.2
55
- const FOOTER_Y = 7.5 - 0.2 - BAND_H
56
- const SLOT_W = (SLIDE_W - 2 * MARGIN) / 3
57
- const NUMBER_W = 1
58
- const MARK_BOX = { w: 1.2, h: BAND_H }
59
- const BAND_PT = 10
60
-
61
- /**
62
- * A missing role falls back to what the slide's body computed, never to the
63
- * toolkit's palette, which would put Canon's colors on another project's deck.
64
- */
65
- export function deckTheme(reading: ThemeReading): {
66
- readonly theme: DeckTheme
67
- readonly notices: readonly string[]
68
- } {
69
- const { tokens, body } = reading
70
- const missing = (
71
- [
72
- ['background', tokens.background],
73
- ['text', tokens.text],
74
- ['muted', tokens.muted],
75
- ['accent', tokens.accent],
76
- ] as const
77
- )
78
- .filter(([, value]) => value === undefined)
79
- .map(([role]) => `--color-${role}`)
80
- return {
81
- theme: {
82
- background: tokens.background ?? body.background,
83
- ink: tokens.text ?? body.color,
84
- muted: tokens.muted ?? body.color,
85
- accent: tokens.accent ?? body.color,
86
- face: fontFace(reading.fontFamily),
87
- },
88
- notices:
89
- missing.length === 0
90
- ? []
91
- : [
92
- `no ${missing.join(' or ')} token, so the deck master takes the slide body ${missing.length === 1 ? 'color for it' : 'color for them'}`,
93
- ],
94
- }
95
- }
96
-
97
- export function masterName(bands: MasterBands): string {
98
- const parts = [bands.header && 'header', bands.footer && 'footer'].filter(
99
- Boolean,
100
- )
101
- return parts.length === 0 ? 'canon-bare' : `canon-${parts.join('-')}`
102
- }
103
-
104
- const SLOT_ALIGN: Record<BandSlot, PptxGenJS.HAlign> = {
105
- left: 'left',
106
- center: 'center',
107
- right: 'right',
108
- }
109
-
110
- /**
111
- * One text object per filled slot. The master draws these for a band it
112
- * carries, and a slide overriding a band draws its own through the same call.
113
- */
114
- export function bandTexts(
115
- band: Omit<Band, 'show'>,
116
- kind: 'header' | 'footer',
117
- theme: DeckTheme,
118
- options: { readonly hasMark?: boolean } = {},
119
- ): { readonly text: string; readonly options: PptxGenJS.TextPropsOptions }[] {
120
- return BAND_SLOTS.flatMap((slot, index) => {
121
- const text = band[slot]
122
- if (!text) return []
123
- const isMarkSlot = kind === 'header' && slot === 'right' && options.hasMark
124
- return [
125
- {
126
- text,
127
- options: {
128
- x: MARGIN + index * SLOT_W,
129
- y: kind === 'header' ? HEADER_Y : FOOTER_Y,
130
- w: SLOT_W - (isMarkSlot ? MARK_BOX.w + 0.1 : 0),
131
- h: BAND_H,
132
- margin: 0,
133
- align: SLOT_ALIGN[slot],
134
- valign: 'middle',
135
- fontFace: theme.face,
136
- fontSize: BAND_PT,
137
- color: kind === 'header' ? theme.ink : theme.muted,
138
- },
139
- },
140
- ]
141
- })
142
- }
143
-
144
- /** The right of the footer, which `deck.json` keeps free while numbers show. */
145
- export function slideNumberProps(theme: DeckTheme): PptxGenJS.SlideNumberProps {
146
- return {
147
- x: SLIDE_W - MARGIN - NUMBER_W,
148
- y: FOOTER_Y,
149
- w: NUMBER_W,
150
- h: BAND_H,
151
- margin: 0,
152
- align: 'right',
153
- valign: 'middle',
154
- fontFace: theme.face,
155
- fontSize: BAND_PT,
156
- color: theme.accent,
157
- }
158
- }
159
-
160
- // An SVG mark keeps the broken PNG fallback pptxgenjs writes, because the
161
- // screenshot patch in export.ts reaches slides and never layouts, so the mark
162
- // is a raster file.
163
- function markImage(path: string, size: MarkSize): PptxGenJS.ImageProps {
164
- const scale = Math.min(MARK_BOX.w / size.width, MARK_BOX.h / size.height)
165
- const w = Math.round(size.width * scale * 1000) / 1000
166
- const h = Math.round(size.height * scale * 1000) / 1000
167
- return { path, x: SLIDE_W - MARGIN - w, y: HEADER_Y, w, h }
168
- }
169
-
170
- export function buildMaster(
171
- deck: DeckConfig,
172
- theme: DeckTheme,
173
- bands: MasterBands,
174
- markSize: MarkSize = { width: 1, height: 1 },
175
- ): PptxGenJS.SlideMasterProps {
176
- const hasHeader = bands.header && deck.header.show
177
- const hasFooter = bands.footer && deck.footer.show
178
- const hasMark = deck.mark !== undefined
179
- const objects: NonNullable<PptxGenJS.SlideMasterProps['objects']> = [
180
- ...(deck.mark ? [{ image: markImage(deck.mark, markSize) }] : []),
181
- ...(hasHeader
182
- ? bandTexts(deck.header, 'header', theme, { hasMark }).map((text) => ({
183
- text,
184
- }))
185
- : []),
186
- ...(hasFooter
187
- ? bandTexts(deck.footer, 'footer', theme).map((text) => ({ text }))
188
- : []),
189
- ]
190
- return {
191
- title: masterName(bands),
192
- background: { color: theme.background },
193
- objects,
194
- ...(hasFooter && deck.slideNumbers
195
- ? { slideNumber: slideNumberProps(theme) }
196
- : {}),
197
- }
198
- }