@se-studio/skills 1.0.6 → 1.0.11

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.
@@ -0,0 +1,278 @@
1
+ ---
2
+ name: site-workflows-new-project
3
+ description: Bootstrap a new SE Studio customer project from the SE Studio template. Runs full project cleanup (black/white colors, system font, minimal registrations), then sets up CLAUDE.md, AGENTS.md, README files, STYLING.md, ANIMATION.md, and updates project identity (site title, description, .cursorrules). Use this immediately after cloning the template for a new client.
4
+ license: MIT
5
+ metadata:
6
+ author: se-studio
7
+ version: "1.0.0"
8
+ ---
9
+
10
+ # SE New Project Bootstrap
11
+
12
+ Use this skill immediately after cloning the SE Studio customer project template for a new client.
13
+
14
+ **Prerequisites:**
15
+ - The project has been cloned/copied from the SE Studio customer project template
16
+ - `.env.local` is configured with the new Contentful space credentials (`CONTENTFUL_SPACE_ID`, `CONTENTFUL_ACCESS_TOKEN`, `CONTENTFUL_MANAGEMENT_TOKEN`, `CONTENTFUL_PREVIEW_ACCESS_TOKEN`)
17
+ - `pnpm install` has been run
18
+ - A `scripts/master-schema.json` file exists (exported from the source Contentful space, or the new empty space)
19
+ - You know: **customer/project name**, **site title**, **site description**
20
+
21
+ ---
22
+
23
+ ## Step 1 — Gather project identity
24
+
25
+ Before making any changes, confirm the following with the user if not already provided:
26
+
27
+ 1. **Customer/project name** — used in README, CLAUDE.md header, and Navigation stub (e.g. "Acme Corp")
28
+ 2. **Site title** — used in `src/lib/constants.ts` and `<title>` tag (e.g. "Acme Corp — Engineering")
29
+ 3. **Site description** — used in meta description (1–2 sentences describing the site)
30
+ 4. **Domain** (optional) — used in sitemap and OG URLs if known
31
+
32
+ ---
33
+
34
+ ## Step 2 — Run the full cleanup
35
+
36
+ Execute every step in the `site-workflows-project-cleanup` skill. This strips the template down to:
37
+ - Black/white color system
38
+ - System font
39
+ - Generic Component, Generic Collection, Related Articles Collection only
40
+ - Minimal Navigation and Footer stubs
41
+ - Cleaned Contentful schema imported to the new space
42
+
43
+ After cleanup, `pnpm validate` must pass before continuing.
44
+
45
+ ---
46
+
47
+ ## Step 3 — Update project identity in `src/lib/constants.ts`
48
+
49
+ Read `src/lib/constants.ts` and update:
50
+ - `siteTitle` → the confirmed site title
51
+ - `siteDescription` → the confirmed site description
52
+ - Any domain or URL constants → the confirmed domain (or leave as placeholder if unknown)
53
+
54
+ ---
55
+
56
+ ## Step 4 — Update the Navigation and Footer stubs
57
+
58
+ In `src/project/components/Navigation/index.tsx`, replace `"Site Name"` with the customer/project name.
59
+
60
+ In `src/project/components/Footer/index.tsx`, replace `"Site Name"` with the customer/project name.
61
+
62
+ ---
63
+
64
+ ## Step 5 — Create `CLAUDE.md`
65
+
66
+ Write `CLAUDE.md` at the project root:
67
+
68
+ ```markdown
69
+ @.cursorrules
70
+
71
+ @AGENTS.md
72
+ ```
73
+
74
+ ---
75
+
76
+ ## Step 6 — Create `AGENTS.md`
77
+
78
+ Write `AGENTS.md` at the project root. Fill in the user's email address (from memory if known, otherwise ask) and today's date:
79
+
80
+ ```markdown
81
+ # Next.js: ALWAYS read docs before coding
82
+
83
+ Before any Next.js work, find and read the relevant doc in `node_modules/next/dist/docs/`. Your training data is outdated — the docs are the source of truth.
84
+
85
+ # userEmail
86
+ The user's email address is [USER_EMAIL].
87
+
88
+ # currentDate
89
+ Today's date is [CURRENT_DATE].
90
+ ```
91
+
92
+ ---
93
+
94
+ ## Step 7 — Update `.cursorrules`
95
+
96
+ Read `.cursorrules` and update the **Project Overview** section at the top:
97
+ - Replace the previous project name with the new customer/project name
98
+ - Update the "Key technologies" list if anything changed
99
+ - Remove any project-specific notes about the previous customer
100
+
101
+ Do not change the Code Style, Component Architecture, or other generic sections — those apply to all SE Studio projects.
102
+
103
+ ---
104
+
105
+ ## Step 8 — Create `src/project/components/README.md`
106
+
107
+ Write the standard component development guide. This file should explain the four-layer architecture pattern used in this project. Reference the `se-marketing-sites-create-component` skill, which contains a comprehensive template.
108
+
109
+ Key sections to include:
110
+ - Architecture overview (four-layer pattern)
111
+ - FIELD_KEYS / USED_FIELDS pattern
112
+ - `getSizingInformation(index)` usage
113
+ - `getPreviewFieldProps` usage
114
+ - Client component isolation pattern
115
+ - Checklist for new components
116
+
117
+ ---
118
+
119
+ ## Step 9 — Create `src/project/collections/README.md`
120
+
121
+ Write the standard collection development guide. Reference the `se-marketing-sites-create-collection` skill.
122
+
123
+ Key sections to include:
124
+ - Five-layer architecture (Card, Core, Wrapper, Renderer, Registration)
125
+ - Dual FIELD_KEYS pattern (collection-level + card-level)
126
+ - `getSizingInformation(1)` for card titles (ChildElement)
127
+ - Parent-child ID tracking for preview helpers
128
+ - Client component isolation (carousels, filters)
129
+ - Checklist for new collections
130
+
131
+ ---
132
+
133
+ ## Step 10 — Create `src/project/STYLING.md`
134
+
135
+ Create a styling reference document for this project. Template:
136
+
137
+ ```markdown
138
+ # Styling System — [Project Name]
139
+
140
+ This project uses Tailwind CSS v4 with configuration driven by `tailwind.config.json`.
141
+
142
+ ## Colors
143
+
144
+ Two named colors:
145
+
146
+ | Name | Hex | Tailwind class |
147
+ |-------|---------|-----------------|
148
+ | Light | #FFFFFF | `bg-light` / `text-light` |
149
+ | Dark | #000000 | `bg-dark` / `text-dark` |
150
+
151
+ Use `lookupColourClassNames()` from `@/generated/colors` when applying background + text color pairs.
152
+
153
+ ## Typography
154
+
155
+ Typography utility classes are generated from `tailwind.config.json`. Common classes:
156
+
157
+ | Class | Usage |
158
+ |----------|----------------------------|
159
+ | `h1` | Hero headings (uppercase) |
160
+ | `h2` | Section headings |
161
+ | `h3` | Sub-headings |
162
+ | `h4` | Small headings |
163
+ | `p1` | Large body text |
164
+ | `p2` | Default body text |
165
+ | `p3` | Small/caption text |
166
+ | `nav` | Navigation links |
167
+
168
+ Use `getSizingInformation(index)` from `@/lib/SizingInformation` for dynamic semantic headings.
169
+
170
+ ## Grid System
171
+
172
+ | Breakpoint | Min-width | Columns |
173
+ |-----------|-----------|---------|
174
+ | mobile | 0 | 6 |
175
+ | tablet | 768px | 8 |
176
+ | laptop | 1024px | 12 |
177
+ | desktop | 1440px | 12 |
178
+
179
+ Gap: 16px at all breakpoints. Margin: 16px at all breakpoints.
180
+
181
+ Use `content-cols-grid` for standard content layout.
182
+
183
+ ## Section Spacing
184
+
185
+ Standard vertical padding: `py-16 laptop:py-24`
186
+
187
+ ## RTF Classes
188
+
189
+ | Class | Usage |
190
+ |----------------|-----------------------------------|
191
+ | `.rtf-standard`| General rich text content |
192
+ | `.rtf-article` | Article/blog body text |
193
+ | `.rtf-legal` | Terms, conditions, legal text |
194
+ ```
195
+
196
+ ---
197
+
198
+ ## Step 11 — Create `src/project/ANIMATION.md`
199
+
200
+ Create a minimal animation guide. Template:
201
+
202
+ ```markdown
203
+ # Animation System — [Project Name]
204
+
205
+ Animations use a two-part trigger pattern:
206
+
207
+ 1. Add `animate-when-seen` to pause the animation until the element is visible
208
+ 2. Add the animation class (e.g. `animate-text-in`)
209
+
210
+ `Section` sets `data-seen` on the element when it enters the viewport.
211
+
212
+ ## Adding a New Animation
213
+
214
+ 1. Define `@keyframes` in `src/app/globals.css`
215
+ 2. Register a `--animate-*` CSS variable in the `@theme` block
216
+ 3. Create a `@utility animate-your-name` block that applies the animation
217
+ 4. Apply `animate-when-seen animate-your-name` to the element
218
+
219
+ ## Current Animations
220
+
221
+ None — this is a bare-bones project. Add animations as the design is built out.
222
+ ```
223
+
224
+ ---
225
+
226
+ ## Step 12 — Verify the Contentful schema import
227
+
228
+ Confirm the cleaned schema was successfully imported to the new space:
229
+
230
+ 1. Open the Contentful web app for the new space
231
+ 2. Navigate to Content model → Component → `componentType` field
232
+ 3. Verify the allowed values are: `Generic` only
233
+ 4. Navigate to Content model → Collection → `collectionType` field
234
+ 5. Verify the allowed values are: `Generic`, `Related articles`
235
+
236
+ If the import did not run during cleanup (Step 2), run it now:
237
+ ```bash
238
+ node scripts/clean-schema.js
239
+ contentful space import \
240
+ --space-id $(grep CONTENTFUL_SPACE_ID .env.local | cut -d= -f2) \
241
+ --environment-id master \
242
+ --content-file scripts/clean-schema.json
243
+ ```
244
+
245
+ ---
246
+
247
+ ## Step 13 — Final validation
248
+
249
+ ```bash
250
+ pnpm validate
251
+ ```
252
+
253
+ All TypeScript errors must be resolved. Then start the dev server to confirm the site runs:
254
+
255
+ ```bash
256
+ pnpm dev
257
+ ```
258
+
259
+ Check:
260
+ - `/` — home page loads (may show "not found" if no CMS content, that's fine)
261
+ - `/cms/showcase` — shows only Generic Component, Generic Collection, Related Articles
262
+ - `/cms/guidelines.md` — component guidelines render
263
+
264
+ ---
265
+
266
+ ## What to do next
267
+
268
+ After bootstrap, the project is ready for:
269
+ 1. **CMS content setup** — use `contentful-cms-core` skill to create initial pages and navigation
270
+ 2. **Design system** — update `tailwind.config.json` with brand colors and typography when the design is ready
271
+ 3. **Components** — use `se-marketing-sites-create-component` and `se-marketing-sites-create-collection` skills to build project-specific components
272
+ 4. **Navigation/Footer** — replace the stubs with real components once the design is known
273
+
274
+ Commit the bootstrapped state before starting component work:
275
+ ```bash
276
+ git add -A
277
+ git commit -m "Bootstrap new project from SE Studio template"
278
+ ```
@@ -0,0 +1,362 @@
1
+ ---
2
+ name: site-workflows-project-cleanup
3
+ description: Strip an existing SE Studio Next.js/Contentful project to a bare-bones baseline — black/white color system, system font, only Generic Component, Generic Collection, and Related Articles Collection registered, with minimal navigation and footer stubs. Run this when you need to clean a customer project down to a reusable template.
4
+ license: MIT
5
+ metadata:
6
+ author: se-studio
7
+ version: "1.0.0"
8
+ ---
9
+
10
+ # SE Project Cleanup
11
+
12
+ Strips an existing SE Studio project to a bare-bones baseline. After this skill runs you will have:
13
+ - **Colors**: White (`Light`) and Black (`Dark`) only
14
+ - **Font**: system-ui (no custom or Google fonts)
15
+ - **Components**: Generic Component only
16
+ - **Collections**: Generic Collection + Related Articles Collection
17
+ - **Nav/Footer**: Minimal HTML stubs
18
+ - **Contentful schema**: `componentType` and `collectionType` enums trimmed to match
19
+
20
+ Run `pnpm validate` at the end to confirm a clean TypeScript build.
21
+
22
+ ---
23
+
24
+ ## Step 1 — Update `tailwind.config.json`
25
+
26
+ Replace `colorOptions` with black and white only, update font family, and remove OpenType feature settings:
27
+
28
+ ```json
29
+ {
30
+ "colorOptions": {
31
+ "Light": "#FFFFFF",
32
+ "Dark": "#000000"
33
+ },
34
+ "colorFile": "./colors.ts",
35
+ "foregroundColors": ["Dark", "Light"],
36
+ "colorOpposites": {
37
+ "Light": "Dark",
38
+ "Dark": "Light"
39
+ },
40
+ "sizes": { /* keep existing sizes unchanged */ },
41
+ "fontTable": {
42
+ "font": "system-ui",
43
+ "weight": 400,
44
+ "lineHeight": 1.2,
45
+ "styles": { /* see below */ }
46
+ }
47
+ }
48
+ ```
49
+
50
+ In `fontTable.styles`:
51
+ - Remove the top-level `"additional"` block (which has `font-feature-settings`)
52
+ - For every style that has an `"additional"` block containing `font-feature-settings`, remove that `additional` block entirely
53
+ - Keep any `"additional"` blocks that contain only `text-transform` (those are still valid with system fonts)
54
+ - Keep all size values, weight overrides, lineHeight, and letterSpacing values unchanged
55
+
56
+ After this change the font table will reference `system-ui` but retain all the responsive size scales.
57
+
58
+ ---
59
+
60
+ ## Step 2 — Update `src/project/font.ts`
61
+
62
+ Delete the entire file. It exports `noiVariableFlex` (local font) and `ibmPlexMono` (Google font) — both unused after cleanup.
63
+
64
+ ---
65
+
66
+ ## Step 3 — Update `src/app/layout.tsx`
67
+
68
+ 1. Remove the import line: `import { ibmPlexMono, noiVariableFlex } from '@/project/font';`
69
+ 2. In the `html` element's `className`, remove `noiVariableFlex.variable` and `ibmPlexMono.variable`
70
+
71
+ The html element should look like:
72
+ ```tsx
73
+ <html
74
+ lang="en"
75
+ suppressHydrationWarning
76
+ className={cn(
77
+ 'antialiased',
78
+ process.env.DEBUG_TAILWIND === 'true' && 'debug-screens',
79
+ process.env.SHOW_SECTION_OUTLINE === 'true' && 'show-section-outline',
80
+ )}
81
+ >
82
+ ```
83
+
84
+ ---
85
+
86
+ ## Step 4 — Update `src/app/globals.css`
87
+
88
+ ### In the `@theme` block, make these changes:
89
+
90
+ **Replace** the `--font-sans` and `--font-serif` lines with:
91
+ ```css
92
+ --font-sans: system-ui, ui-sans-serif, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
93
+ --font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;
94
+ ```
95
+
96
+ **Remove** all `--animate-*` custom properties:
97
+ ```
98
+ --animate-cardRotate
99
+ --animate-linkRotate
100
+ --animate-ticker
101
+ --animate-fadeInGrow
102
+ --animate-shapeShiftClip
103
+ --animate-shapeShiftSpin
104
+ --animate-clipReveal
105
+ --animate-filmGrainShift
106
+ ```
107
+
108
+ ### Remove these `@utility` blocks entirely:
109
+ - `animate-ticker`
110
+ - `animate-fade-in-grow`
111
+ - `animate-shape-shift`
112
+ - `animate-card-rotate`
113
+ - `animate-clip-reveal`
114
+ - `film-grain`
115
+ - `image-item-h` (ArticleBrowser-specific)
116
+ - `visual-cols` (VisualsCollection-specific)
117
+ - `visual-width` (VisualsCollection-specific)
118
+
119
+ ### Remove all `@keyframes` blocks:
120
+ - `cardRotate`
121
+ - `linkRotate`
122
+ - `ticker`
123
+ - `growFade`
124
+ - `shapeShiftClip`
125
+ - `shapeShiftSpin`
126
+ - `clipReveal`
127
+ - `filmGrainShift`
128
+
129
+ ### Remove the view transition media query block:
130
+ ```css
131
+ @media (prefers-reduced-motion: no-preference) {
132
+ ::view-transition-group(*) { ... }
133
+ ::view-transition-old(root) { ... }
134
+ ::view-transition-new(root) { ... }
135
+ }
136
+ ```
137
+
138
+ ### In the RTF classes, replace `bg-yellow/20` with `bg-dark/10`:
139
+ Three occurrences — in `.rtf-standard > blockquote`, `.rtf-article > blockquote`, and `.rtf-legal > blockquote`.
140
+
141
+ ### Remove the dead-code block at the bottom:
142
+ ```css
143
+ .dark-component .standard-rtf { ... }
144
+ .light-component .standard-rtf { ... }
145
+ ```
146
+
147
+ ### Remove the Orejime scroll-lock workaround if not using Orejime consent:
148
+ The block starting with `.orejimeHtml-WithModalOpen.orejimeHtml-WithModalOpen body { ... }` — remove if the project does not use the Orejime consent banner.
149
+
150
+ ---
151
+
152
+ ## Step 5 — Update `src/lib/registrations.ts`
153
+
154
+ Keep only these three registrations:
155
+
156
+ ```typescript
157
+ import { GenericComponentRegistration } from '@/project/components/TemplateComponent';
158
+ import { GenericCollectionRegistration } from '@/project/collections/TemplateCollection';
159
+ import { RelatedArticlesCollectionRegistration } from '@/project/collections/RelatedArticlesCollection';
160
+
161
+ export const componentRegistrationsList = [
162
+ GenericComponentRegistration,
163
+ ] as const;
164
+
165
+ export const collectionRegistrationsList = [
166
+ GenericCollectionRegistration,
167
+ RelatedArticlesCollectionRegistration,
168
+ ] as const;
169
+
170
+ export const externalComponentRegistrationsList = [] as const;
171
+ ```
172
+
173
+ Remove all other imports and registrations.
174
+
175
+ ---
176
+
177
+ ## Step 6 — Delete component files
178
+
179
+ Delete these files from `src/project/components/`:
180
+ - `ArticleDescription.tsx`
181
+ - `ArticleHero.tsx`
182
+ - `ArticleRichText.tsx`
183
+ - `Quote.tsx`
184
+ - `SimpleParagraph.tsx`
185
+ - `TwoColumnRichText.tsx`
186
+ - `ViewTransitionTrackedLink.tsx`
187
+
188
+ Also delete these files from `src/project/components/Navigation/`:
189
+ - `NavMenu.tsx`
190
+ - `MobileNav.tsx`
191
+ - `ContactNavItem.tsx`
192
+
193
+ Keep: `TemplateComponent.tsx`, `Navigation/index.tsx` (will be replaced in Step 8), `Navigation/types.ts`, `Footer/index.tsx` (will be replaced in Step 9), `Footer/types.ts`
194
+
195
+ ---
196
+
197
+ ## Step 7 — Delete collection files
198
+
199
+ Delete these from `src/project/collections/`:
200
+ - `ArticleBrowser/` (entire directory)
201
+ - `ProcessListCollection.tsx`
202
+ - `SeparatedVisualsCollection.tsx`
203
+ - `TeamGridCollection.tsx`
204
+ - `TextAndCarouselCollection.tsx`
205
+ - `TextAndCarouselCarousel.tsx`
206
+ - `VisualsCollection.tsx`
207
+
208
+ Keep: `TemplateCollection.tsx`, `LinkCard.tsx` (used internally by TemplateCollection), `RelatedArticlesCollection.tsx`
209
+
210
+ ---
211
+
212
+ ## Step 8 — Delete external component files
213
+
214
+ Delete all files in `src/project/externalComponents/` (IFrame and Pardot integrations).
215
+
216
+ ---
217
+
218
+ ## Step 9 — Replace Navigation with minimal stub
219
+
220
+ Replace `src/project/components/Navigation/index.tsx` with:
221
+
222
+ ```tsx
223
+ 'use client';
224
+ import type { INavigation } from '@se-studio/core-data-types';
225
+ import type { NavigationProps } from './types';
226
+
227
+ export const Navigation: React.FC<NavigationProps> = ({ navigation: _navigation }) => {
228
+ return (
229
+ <header className="fixed top-0 left-0 right-0 z-50 h-[var(--nav-height)] bg-light border-b border-dark/10 flex items-center px-4">
230
+ <nav>
231
+ <span className="p2 font-semibold">Site Name</span>
232
+ </nav>
233
+ </header>
234
+ );
235
+ };
236
+
237
+ export default Navigation;
238
+ ```
239
+
240
+ ---
241
+
242
+ ## Step 10 — Replace Footer with minimal stub
243
+
244
+ Replace `src/project/components/Footer/index.tsx` with:
245
+
246
+ ```tsx
247
+ 'use client';
248
+ import type { FooterProps } from './types';
249
+
250
+ export const Footer: React.FC<FooterProps> = ({ navigation: _navigation }) => {
251
+ return (
252
+ <footer className="bg-dark text-light py-8 px-4 text-center">
253
+ <p className="p3">&copy; {new Date().getFullYear()} Site Name</p>
254
+ </footer>
255
+ );
256
+ };
257
+
258
+ export default Footer;
259
+ ```
260
+
261
+ Delete `src/project/components/Footer/MobileFooter.tsx` if it exists.
262
+
263
+ ---
264
+
265
+ ## Step 11 — Clean up Contentful schema
266
+
267
+ Create `scripts/clean-schema.js` (or update it if it already exists):
268
+
269
+ ```js
270
+ #!/usr/bin/env node
271
+ 'use strict';
272
+ const fs = require('node:fs');
273
+
274
+ const inputPath = 'scripts/master-schema.json';
275
+ const outputPath = 'scripts/clean-schema.json';
276
+
277
+ if (!fs.existsSync(inputPath)) {
278
+ console.error(`Input file not found: ${inputPath}`);
279
+ console.error('Export the schema first: contentful space export --skip-content --content-file scripts/master-schema.json');
280
+ process.exit(1);
281
+ }
282
+
283
+ const schema = JSON.parse(fs.readFileSync(inputPath, 'utf8'));
284
+
285
+ // Trim componentType to bare-bones set
286
+ const component = schema.contentTypes.find(ct => ct.sys.id === 'component');
287
+ if (component) {
288
+ const field = component.fields.find(f => f.id === 'componentType');
289
+ if (field) {
290
+ field.validations = field.validations.map(v => v.in ? { in: ['Generic'] } : v);
291
+ }
292
+ }
293
+
294
+ // Trim collectionType to bare-bones set
295
+ const collection = schema.contentTypes.find(ct => ct.sys.id === 'collection');
296
+ if (collection) {
297
+ const field = collection.fields.find(f => f.id === 'collectionType');
298
+ if (field) {
299
+ field.validations = field.validations.map(v =>
300
+ v.in ? { in: ['Generic', 'Related articles'] } : v
301
+ );
302
+ }
303
+ }
304
+
305
+ // Clear externalComponentType (no external components in bare-bones setup)
306
+ const ext = schema.contentTypes.find(ct => ct.sys.id === 'externalComponent');
307
+ if (ext) {
308
+ const field = ext.fields.find(f => f.id === 'externalComponentType');
309
+ if (field) {
310
+ field.validations = field.validations.map(v => v.in ? { in: [] } : v);
311
+ }
312
+ }
313
+
314
+ fs.writeFileSync(outputPath, JSON.stringify(schema, null, 2));
315
+ console.log(`Clean schema written to ${outputPath}`);
316
+ console.log('Component types kept:', ['Generic']);
317
+ console.log('Collection types kept:', ['Generic', 'Related articles']);
318
+ ```
319
+
320
+ Run it:
321
+ ```bash
322
+ node scripts/clean-schema.js
323
+ ```
324
+
325
+ Then import to the target Contentful space (use the space ID from `.env.local`):
326
+ ```bash
327
+ contentful space import \
328
+ --space-id <TARGET_SPACE_ID> \
329
+ --environment-id master \
330
+ --content-file scripts/clean-schema.json
331
+ ```
332
+
333
+ > If cleaning an **existing** space (not a new one), use the Contentful Management API or UI to update the `componentType` and `collectionType` field validations directly, rather than importing. Importing to an existing space with live content can cause conflicts.
334
+
335
+ ---
336
+
337
+ ## Step 12 — Regenerate and validate
338
+
339
+ ```bash
340
+ pnpm codegen
341
+ ```
342
+
343
+ This regenerates `src/generated/colors.ts` (now only `Light` and `Dark`) and `src/generated/setailwind.css` (system font, updated color variables).
344
+
345
+ ```bash
346
+ pnpm validate
347
+ ```
348
+
349
+ Fix any TypeScript errors that surface from the removed imports. Common issues:
350
+ - References to deleted components in other files (check `src/lib/` for any direct imports)
351
+ - `viewTransitions.ts` may import from `ViewTransitionTrackedLink` — remove those imports
352
+ - Any analytics wrappers that reference removed component names
353
+
354
+ ---
355
+
356
+ ## What is deliberately left untouched
357
+
358
+ - `src/app/(cms-routes)/` — all routing is left as-is; the CMS routes work with whatever is registered
359
+ - `src/lib/constants.ts` — site title/description stays as-is for cleanup; update manually for new projects
360
+ - `src/project/STYLING.md` and `src/project/ANIMATION.md` — left for human review; update to reflect the new bare-bones system
361
+ - `src/project/font.ts` — deleted (step 2 above)
362
+ - `scripts/master-schema.json` — never modified, always kept as the original export