17 KiB
phase, plan, subsystem, tags, requires, provides, affects, actuals, plan_head_before, plan_head_after, commits_repo, tech-stack, key-files, key-decisions, patterns-established, requirements-completed, coverage, duration, completed, status
| phase | plan | subsystem | tags | requires | provides | affects | actuals | plan_head_before | plan_head_after | commits_repo | tech-stack | key-files | key-decisions | patterns-established | requirements-completed | coverage | duration | completed | status | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 11.2-ready-to-share-summercms-io-website-and-newsletter-plugin | 01 | ui |
|
|
|
|
|
null | 17e9f923559f6c2a9f176bdb5ae3aa78af934d9f | /media/nvme/dev/golem15/summercms.io/summercms/sm-summercmsio-app/vue-summercmsio-app |
|
|
|
|
|
12min | 2026-10-01 | complete |
Phase 11.2 Plan 01: summercms.io Nuxt landing page Summary
Nuxt 4 static landing page in the new vue-summercmsio-app repo. It has self-hosted Roboto, a single en locale holding every string, static SEO and sitemap output, the original sun in every image, and a Get started terminal card driven by one terminal.json. It is verified by 29 node:test assertions over the utilities and the generated .output/public.
Performance
- Duration: 12 min
- Started: 2026-10-01T13:43:15Z
- Completed: 2026-10-01T13:55:16Z
- Tasks: 3 (tracer + auto + TDD)
- Files created: 35 tracked files in vue-summercmsio-app (no summercms.go code changes)
Accomplishments
- New repository
/media/nvme/dev/golem15/summercms.io/summercms/sm-summercmsio-app/vue-summercmsio-app(branchmaster, no remote). Packages are pinned exactly to the fonoteka versions,pnpm-lock.yamlis committed, andallowBuildsis limited to@parcel/watcher,esbuildandvue-demi. nuxt generateexits 0 and writes real prerendered HTML: the sticky header, the hero#top,#why,#features,#winter,#startand the footer, in that order./docsis ignored by the prerender crawler.@nuxt/fontsself-hosts 4 woff2 files under/_fonts/. The generated HTML and CSS name no Google font host.@nuxtjs/seowrites the canonical link, OG tags (absolutehttps://summercms.io/og-image.png), Twitter tags, schema.org@graph, a flatsitemap.xmland arobots.txtwith a Sitemap line.ogImageis disabled and a static PNG is shipped instead.scripts/derive-images.sh(ImageMagick only) derivessun-logo.webp(60px),sun-badge.webp(272px),favicon.ico(16/32/48),apple-touch-icon.png(180, on navy) andog-image.png(1200x630: sun, wordmark, tagline) from the committed originalassets-src/logo.png(746x744).sun-crop.pngis not shipped.app.config.tshaslanding.showRaysandlanding.scrollSpy. SettingshowRays: falsewas checked to remove the rays div from the output.- Scroll-spy uses a passive scroll listener, computes on mount and is cleaned up on unmount. The server render has no active link.
- Copy uses
copyPayload(six lines, no$or comments) with a textarea fallback, and showsCopiedfor 1500 ms.
Task Commits
All in vue-summercmsio-app:
- Task 1: Tracer: scaffold with header, hero, fonts and SEO:
c41cdac(feat) - Task 2: Why, Features, From WinterCMS and footer:
a29b2d2(feat) - Task 3 (TDD): terminal card, copy button and scroll-spy: RED
d2ffb9b(test), GREEN17e9f92(feat). No refactor was needed.
Plan metadata: committed in summercms.go (docs commit for this SUMMARY)
TDD Gate Compliance
- RED
d2ffb9b: tests plus interface-only stubs (correct exports and signatures, placeholder bodies), so the failures are assertion failures, not load crashes.node --test tests/terminal.test.ts tests/scrollSpy.test.tsgave exit 1 with 8 of 13 failing.gsd-tools check tdd-red-evidencereturnedRED_EVIDENCE_OKfor the targets "the last section above the threshold wins" (expectedwinter, got'') and "copyPayload skips a group without commands" (expectedone\ntwo\nthree, got''). - GREEN
17e9f92: 29 of 29 pass inpnpm test, and 13 of 13 in the two unit files.
Files Created/Modified
nuxt.config.ts: modules, fonts, i18n (prefix_except_default,prerenderMessages), site,ogImageoff, flat sitemap, link-checker exclusion,nitro.prerender.ignore: ['/docs'].app/components/*.vue:SiteHeader(sticky bar, scroll-spy, CSS-hidden links at 720px or less),HeroSection(rays behind the flag, glow, badge, gradient H1, CTAs),WhySection(<i18n-t>slots for the file names),FeaturesSection(eight extension-less docs tiles),WinterSection(concept table),StartSection(chips, note, buttons),TerminalCard,SiteFooter(with the Golem15 credit).app/assets/css/tokens.css,base.css: tokens, globals with a reduced-motion scroll override, and the shared heading, button and chip shapes.app/data/terminal.json,app/utils/terminal.ts,app/utils/scrollSpy.ts: the single command source and the pure helpers.i18n/locales/en.json:meta,header,hero,why,features,winter,start,terminal,footer.tests/output.test.ts,tests/terminal.test.ts,tests/scrollSpy.test.ts: node:test, with paths resolved fromimport.meta.url.
Decisions Made
See key-decisions in the frontmatter. In short: the full page title with a %s template, the unmasked sun scaled 1.12 in the header, the phone-width header fix, the clipboard fallback, and footer links that can wrap.
Deviations from Plan
Auto-fixed Issues
1. [Rule 1 - Bug] The header overflowed phone widths
- Found during: Task 3 (headless screenshot sanity check at 375px)
- Issue: With the handoff spacing (an empty
flex: 1links wrapper and three 16px gaps), logo + pill + Docs needed about 414px. At 375px the Docs button was clipped and the right padding was lost. The handoff markup has the same overflow. - Fix: At 720px and below,
.links-wrapis hidden and.docsgetsmargin-left: auto. At 420px and below,.barusesgap: 10px; padding: 0 16px. Above 720px nothing changes. - Files modified:
app/components/SiteHeader.vue - Verification: Headless screenshots at 360, 375, 720 and 721px. The header fits, links are hidden at 720 and visible at 721. 29 of 29 tests pass.
- Committed in:
17e9f92
2. [Rule 1 - Bug] Footer links could overflow a phone width
- Found during: Task 2
- Issue: The D-12 credit makes four footer links. The handoff's non-wrapping link row is close to the 327px content width at 375px.
- Fix:
flex-wrap: wrapon the footer link group. Nothing changes when they fit. - Files modified:
app/components/SiteFooter.vue - Committed in:
a29b2d2
3. [Process] Task 3 committed as RED + GREEN instead of one commit
- The plan asked for one
feat(site)commit holding the tests and the implementation. Following the TDD reference, the tests went in atest(site)RED commit (with interface-only stubs so RED fails on assertions) and the implementation in thefeat(site)commit with the planned message.pnpm testis red atd2ffb9bby design.
4. [Minor] Small structural choices inside the plan's latitude
- The en.json leaf-check helper lives inside
tests/output.test.ts, not in a separate helper file, sotests/*.test.tsmatches only test files. It takes anexceptlist forterminal.copied, which only appears after a click. - The
Docs →label is two keys (header.docs,header.docsArrow) so the arrow sits in its own span, as in the handoff. <html lang>renders asen-US(fromlanguage: 'en-US'). The test matches<html\s+lang="en.
Total deviations: 2 auto-fixed bugs (Rule 1), 1 process deviation (TDD commit split), and minor structural choices. Impact on plan: The responsive fixes keep D-23 fidelity above 720px and make SC1's "responsive down to phone width" true. There is no scope creep.
Issues Encountered
- A bash
pkill -fpattern matched its own shell and killed the screenshot command after the screenshots were written. Later runs stopped the server by PID instead. No effect on the repository.
User Setup Required
None. Creating the vue-summercmsio-app remote on git.golem15.com is a D-43 launch item listed for plan 11.2-02.
Next Phase Readiness
- Plan 11.2-02 can rsync
.output/public/(not thedistsymlink) into the plugin'spublic/site/and embed it withall:(the output has_nuxt/,_fonts/,_i18n/,_payload.jsonand__sitemap__/)._nuxt/builds/is not content-hashed. app/data/terminal.jsonis ready for the D-40 Go check and the HTML drift guard. Commands render contiguously after a<span class="prompt">$ </span>.- The page uses extension-less
/docs/...hrefs (D-47), so the plugin must 301 them to.html. - End-of-phase UAT: visual fidelity at 1280, 721, 720 and 375px, the sticky header, the live scroll-spy, and the Copy label and clipboard (coverage D8).
Self-Check: PASSED
- Files: all 35 tracked files are present in
vue-summercmsio-app(git ls-files), including everykey-files.createdentry. - Commits:
c41cdac,a29b2d2,d2ffb9band17e9f92are invue-summercmsio-appmaster. The commit count of 4 was measured withgit rev-list --count master. - Plan verification:
pnpm install --frozen-lockfile && pnpm generate && pnpm testgives 29 pass and 0 fail. The SITE working tree is clean. summercms.go shows only its pre-existingSTATE.md,state.jsonand zip changes. No co-author trailers.
Phase: 11.2-ready-to-share-summercms-io-website-and-newsletter-plugin Completed: 2026-10-01