From 59122d53c12b3bc2d9fa1e00ff9e0d43162b60f5 Mon Sep 17 00:00:00 2001 From: Jakub Zych Date: Thu, 1 Oct 2026 14:33:50 +0200 Subject: [PATCH] docs(11.2): reshape into the Alpha 0.1 landing page and split the newsletter into 11.3 --- .planning/ROADMAP.md | 43 +++- .planning/STATE.md | 8 +- .../design/README.md | 182 ++++++++++++++ .../design/SummerCMS Landing.dc.html | 223 ++++++++++++++++++ .../design/assets/sun-crop.png | Bin 0 -> 50822 bytes .../.gitkeep | 1 + .planning/state.json | 4 +- 7 files changed, 446 insertions(+), 15 deletions(-) create mode 100644 .planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/design/README.md create mode 100644 .planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/design/SummerCMS Landing.dc.html create mode 100644 .planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/design/assets/sun-crop.png create mode 100644 .planning/phases/11.3-newsletter-plugin-and-signup-on-summercms-io/.gitkeep diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index b24cf44..63627a3 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -568,28 +568,50 @@ Plans: **Wave 7** *(gap closure, blocked on Wave 6 completion)* - [x] 11.1-07-PLAN.md — Checkers fail closed: AST fence discovery (nested and README src= refused, captions only on verified fences, Go-lexer aliases need src=), go test roots and go/build membership for src= targets, `go doc -c`, env/flag/go run/bin command forms; planted fixtures and unit tests for every hole -### Phase 11.2: Ready to share: summercms.io website and newsletter plugin (INSERTED) +### Phase 11.2: summercms.io Alpha 0.1 landing page on SummerCMS (INSERTED) -**Goal:** summercms.io is ready to share publicly. A fresh Nuxt 4 website in English and Polish runs on a SummerCMS binary. Visitors subscribe for updates through the initial Go version of the Golem15 Newsletter plugin, which confirms each email by double opt-in. The Phase 11.1 docs are served at `/docs` and linked from the site. +**Goal:** summercms.io replaces its "Under construction" page with the Alpha 0.1 landing page from the claude.ai/design handoff. The page is a Nuxt 4 static site, English only and i18n-ready, embedded in and served by a SummerCMS binary that also serves the Phase 11.1 docs at `/docs`. It deploys behind nginx with supervisor using documented steps. This is a quick phase of 2-3 plans; newsletter signup moved to Phase 11.3. **Requirements**: TBD **Depends on:** Phase 11.1 -**Repos:** four new repos under `git.golem15.com/golem15/`: (1) `sm-summercms-app`, the root app that builds the binary and wires the plugins; (2) `vue-summercms-app`, the Nuxt 4 site, held inside the root app; (3) `sm-summercms-plugin`, the site plugin that serves the embedded site at `/`, the docs at `/docs` and any site-specific data, the WinterCMS site-plugin pattern; (4) `sm-newsletter-plugin`, the reusable signup plugin. `summercms.go` changes only if the site needs a framework feature that is missing. +**Repos:** three new repos under `git.golem15.com/golem15/`: (1) `sm-summercms-app`, the root app that builds the binary and wires the plugins; (2) `vue-summercms-app`, the Nuxt 4 site, held inside the root app; (3) `sm-summercms-plugin`, the site plugin that serves the embedded site at `/`, the docs at `/docs` and any site-specific data, the WinterCMS site-plugin pattern. `summercms.go` changes only if the site needs a framework feature that is missing. **Naming convention:** the same as OctoberCMS (`oc-`) and WinterCMS (`wn-`), with the `sm-` prefix: root app `sm--app`, Vue frontend `vue--app`, plugin `sm--plugin`, theme `sm--theme`. The Go package inside a plugin keeps its plain name (`newsletter`). The meta root `summercms.io` and the framework `summercms.go` keep their names. `fonoteka.go` becomes `sm-fonoteka-app`. -**Port source:** Golem15.Newsletter, `github.com/golem15com/wn-newsletter-plugin`, checked out at `/media/nvme/dev/golem15/horoskopia.eu/plugins/golem15/newsletter`. The PHP plugin is work in progress. Its audience comes from registered users (it requires `Golem15.User`), and its only public routes are unsubscribe. It has no public subscriber model or signup widget, so this phase adds those in Go. The PHP original is not changed. +**Design source:** `.planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/design/` (handoff `README.md`, `SummerCMS Landing.dc.html`, `assets/sun-crop.png`). The design is high fidelity: colors, type, spacing and copy are final. The handoff supersedes 11.2-CONTEXT D-06 (English only for now), D-08, D-10 and D-11 (no signup, "Alpha 0.1 is out", Source links allowed). **Success Criteria** (what must be TRUE): - 1. The newsletter plugin repo exists and ships an initial stub: a public signup endpoint (validated, honeypot and rate-limited, with required consent), double opt-in confirmation mail with a tokenized confirm link, a welcome mail, unsubscribe, and subscriber add, edit and delete in the admin SPA. Composing and sending newsletters is out of scope. - 2. The website repo exists and ships a prerendered English and Polish summercms.io landing page with a signup widget. The widget calls the plugin's API on the same origin and covers the pending, confirmed and error states. - 3. The Phase 11.1 docs are served at `summercms.io/docs`, the landing page links to them, and every link resolves. - 4. The site deploys as one binary with the Nuxt build and the docs embedded, with documented build and run steps. + 1. `nuxt generate` in `vue-summercms-app` produces the landing page matching the handoff: sticky header with scroll-spy, hero, the Why, Features, From WinterCMS and Get started sections, a terminal card with a working Copy button, and a footer. It is responsive down to phone width, and the section links hide at 720px or less. + 2. One `sm-summercms-app` binary embeds the Nuxt output and the Phase 11.1 docs build. It serves `/` and `/docs` with indexable responses (no admin `noindex`/CSP) and with cache headers: immutable for hashed assets, no-cache for HTML. + 3. Every link on the page resolves, including the eight feature-tile `/docs/...` links and the WinterCMS concept-map link. They are verified against the built docs, not assumed. + 4. A scripted build (`nuxt generate`, then `summer docs:build`, then `go build`) and a `DEPLOY.md` in the root app cover building, uploading, a supervisor program config, and an nginx site config (TLS, proxy to the binary, gzip). Following it on a clean server brings the site up. + 5. The new Go code has unit tests, delivered in the phase's last plan. -**Context:** `.planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/11.2-CONTEXT.md` +**Context:** `.planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/11.2-CONTEXT.md` (D-01 to D-05, D-07, D-09 and D-12 still apply; see its supersession note) **Plans:** 0 plans Plans: - [ ] TBD (run /gsd-plan-phase 11.2 to break down) +### Phase 11.3: Newsletter plugin and signup on summercms.io (INSERTED) + +**Goal:** Visitors to summercms.io subscribe for updates through the initial Go version of the Golem15 Newsletter plugin, which confirms each email by double opt-in. The signup widget is added to the Phase 11.2 landing page, and the site gains Polish alongside English. +**Requirements**: TBD +**Depends on:** Phase 11.2 +**Repos:** `sm-newsletter-plugin` (new, under `git.golem15.com/golem15/`, Go package `newsletter`), plus changes to the Phase 11.2 repos (`vue-summercms-app` for the widget and Polish locale, `sm-summercms-app` to wire the plugin). `summercms.go` changes only if a framework feature is missing. +**Port source:** Golem15.Newsletter, `github.com/golem15com/wn-newsletter-plugin`, checked out at `/media/nvme/dev/golem15/horoskopia.eu/plugins/golem15/newsletter`. The PHP plugin is work in progress. Its audience comes from registered users (it requires `Golem15.User`), and its only public routes are unsubscribe. It has no public subscriber model or signup widget, so this phase adds those in Go. The PHP original is not changed. +**Success Criteria** (what must be TRUE): + + 1. The newsletter plugin repo exists and ships an initial stub: a public signup endpoint (validated, honeypot and rate-limited, with required consent), double opt-in confirmation mail with a tokenized confirm link, a welcome mail, unsubscribe, and subscriber add, edit and delete in the admin SPA. Composing and sending newsletters is out of scope. + 2. The landing page has a signup widget that calls the plugin's API on the same origin and covers the pending, confirmed and error states, with localized result pages. + 3. The site is prerendered in English and Polish, and the confirmation and welcome mails follow the subscriber's locale. + 4. The new code has unit tests, delivered in the phase's last plan. + +**Context:** decisions D-13 to D-22 in `.planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/11.2-CONTEXT.md` (carried over from the original 11.2 discussion). + +**Plans:** 0 plans + +Plans: +- [ ] TBD (run /gsd-plan-phase 11.3 to break down) + ### Phase 12: Płytarium API — Collections and Albums **Goal**: Collections and Albums endpoints are ported with byte-compatible request/response shapes, including active-context switching, editor invitations, ratings, reservations, cover handling and search. @@ -678,7 +700,8 @@ Phases execute in numeric order: 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → | 10. Admin Vue SPA | 5/5 | Complete | 2026-09-27 | | 11. Jobs, realtime and search infrastructure | 8/8 | In Progress| | | 11.1. SummerCMS documentation for humans and AI agents | 7/7 | In Progress| | -| 11.2. Ready to share: summercms.io website and newsletter plugin | 0/TBD | Not started | - | +| 11.2. summercms.io Alpha 0.1 landing page on SummerCMS | 0/TBD | Not started | - | +| 11.3. Newsletter plugin and signup on summercms.io | 0/TBD | Not started | - | | 12. Płytarium API — Collections and Albums | 0/TBD | Not started | - | | 13. Płytarium API — wishlist, notifications, CSV, credentials, public routes | 0/TBD | Not started | - | | 14. Domain jobs and external integrations | 0/TBD | Not started | - | diff --git a/.planning/STATE.md b/.planning/STATE.md index b1dbe81..50308e9 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -5,12 +5,12 @@ current_phase: "11.1" current_phase_name: SummerCMS documentation for humans and AI agents (INSERTED) status: verifying stopped_at: Completed 11.1-07-PLAN.md -last_updated: "2026-10-01T06:58:29.387Z" +last_updated: "2026-10-01T11:49:35.390Z" last_activity: 2026-10-01 last_activity_desc: Phase 11.1 execution started -state_head: ce5dcec7e4e0733b07676b36abb26188d7150501 +state_head: 79116a2e036d36614819ed60276886f62556235b progress: - total_phases: 19 + total_phases: 20 completed_phases: 9 total_plans: 93 completed_plans: 93 @@ -158,6 +158,8 @@ Progress: [██████░░░░] 60% - Phase 10.2 inserted after Phase 10: Nest framework packages under modules and write run docs (URGENT) - Phase 11.1 inserted after Phase 11: SummerCMS documentation for humans and AI agents, modelled on wintercms.com/docs; after core framework, before Płytarium API port - Phase 11.2 inserted after Phase 11.1: Ready to share: summercms.io website (sm-summercms-app + vue-summercms-app), sm-newsletter-plugin stub with double opt-in, 11.1 docs at /docs +- Phase 11.2 edited: edited fields: title, goal, repos, design source, success_criteria — reshaped into the Alpha 0.1 landing page (Nuxt 4 on SummerCMS, nginx + supervisor deploy); newsletter moved to 11.3 +- Phase 11.3 inserted after Phase 11.2: Newsletter plugin and signup on summercms.io (split out of the original 11.2) ### Decisions diff --git a/.planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/design/README.md b/.planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/design/README.md new file mode 100644 index 0000000..cb59df9 --- /dev/null +++ b/.planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/design/README.md @@ -0,0 +1,182 @@ +# Handoff: SummerCMS Alpha 0.1 Landing Page + +## Overview +A single-page marketing landing for **summercms.io**, launching with Alpha 0.1. It has a sticky header with section anchors and a link to `/docs`, a hero, four content sections (Why, Features, From WinterCMS, Get started) and a footer. It replaces the current "Under construction" page and keeps its navy, yellow and sun identity. + +## About the Design Files +`SummerCMS Landing.dc.html` is a **design reference built in HTML**. It shows the intended look and behavior and is not production code. Recreate it in the target site's stack. If the site has no stack yet, a static-site setup (Astro, Hugo, or a plain HTML/CSS page) is enough: the page is static apart from two small scripts (scroll-spy and copy-to-clipboard). The file loads a design-runtime script (`support.js`) for previewing; ignore it. + +## Fidelity +**High-fidelity.** Colors, type, spacing and copy are final. Match them exactly. + +## Global +- Page background `#233148`. Text `#e9edf3`. +- Fonts: **Roboto** (300/400/500/700) and **Roboto Mono** (400/500), from Google Fonts. +- `html { scroll-behavior: smooth; scroll-padding-top: 72px }` so anchor jumps clear the sticky header. +- Content container: `max-width: 1120px; margin: 0 auto; padding: 0 24px`. +- Section vertical padding: `96px` top and bottom. +- Default link color `#f5c55a`; hover `#fbe3a6`. Selection: background `#f5c55a`, text `#1d2940`. + +## Sections + +### 1. Header (sticky) +- `position: sticky; top: 0; z-index: 10`. Height 64px. Background `rgba(29,41,64,0.82)` with `backdrop-filter: blur(12px)`. Bottom border `1px solid rgba(255,255,255,0.07)`. +- Row is flex, `align-items: center`, `gap: 16px`. Logo, the "ALPHA 0.1" pill and the Docs button all have `flex-shrink: 0` and `white-space: nowrap`. +- **Logo** (links to `#top`): a 30px sun icon (masked to a circle, scaled 1.35) next to the wordmark "Summer" + "CMS". Roboto 700, 18px, letter-spacing -0.01em. "Summer" `#fff`, "CMS" `#fbd77e`. +- **Pill** "ALPHA 0.1": 11px/500, letter-spacing 0.12em, color `#f5c55a`, border `1px solid rgba(245,197,90,0.35)`, radius 999px, padding 3px 9px. +- **Section links**: Why `#why` · Features `#features` · From WinterCMS `#winter` · Get started `#start`. + - Right-aligned in a `flex: 1; min-width: 0; overflow-x: auto` wrapper; the inner row has `margin-left: auto`. + - Each link: 14px/500, padding 8px 12px, radius 999px, color `#c5ccd6`. + - Active link: color `#f5c55a`, background `rgba(245,197,90,0.1)`. + - **Hidden at viewport ≤ 720px.** Below that width the header shows only logo, pill and Docs. +- **Docs button** → `/docs`: label "Docs →". Background `#f5c55a`, text `#1d2940`, 14px/500, padding 9px 16px, radius 999px. Hover background `#fbd77e`. + +### 2. Hero (`#top`) +- Padding 120px 24px 128px. Centered column, `text-align: center`, `overflow: hidden`. +- **Rays** (behind everything, can be turned off): an absolutely positioned layer at `inset: -40% -20%`. + - `background: repeating-conic-gradient(from 0deg at 50% 50%, rgba(255,255,255,0.035) 0deg 7deg, transparent 7deg 15deg)` + - `mask: radial-gradient(circle, #000 10%, transparent 62%)` +- **Glow**: a 520px circle centered 210px from the top, `radial-gradient(circle, rgba(245,197,90,0.16), transparent 60%)`. +- **Sun badge**: 180px circle with border `1px solid rgba(255,255,255,0.12)` and background `#29344a`, containing the sun image. +- **H1** "Summer" + "CMS": `clamp(44px, 7vw, 76px)`, weight 700, line-height 1, letter-spacing -0.02em, margin-top 28px. + - "Summer" is `#fff`. + - "CMS" uses a gradient text fill: `linear-gradient(180deg, #fde9b4, #f5c55a)`. +- **Tagline** "A new dawn in content management": `clamp(18px, 2.2vw, 22px)`, weight 300, color `#c5ccd6`, margin-top 16px. +- **Description**: max-width 600px, 17px, line-height 1.6, color `#a3adbd`, margin-top 24px. Copy: "A content management framework for Go, inspired by WinterCMS. Plugins, the admin SPA and console commands compile into a single binary." +- **CTAs**: margin-top 40px, flex row, gap 12px, wraps on narrow screens. + - Primary "Read the docs" → `/docs`: background `#f5c55a`, text `#1d2940`, 15px/500, padding 14px 26px, pill shape. Hover background `#fbd77e`. + - Secondary "Alpha 0.1 is out" → `#start`: 8px `#f5c55a` dot before the label. Background `rgba(255,255,255,0.06)`, border `1px solid rgba(255,255,255,0.14)`, padding 13px 24px. Hover background `rgba(255,255,255,0.1)`. + +### Section heading pattern (used in every content section) +- Eyebrow: 12px/500, letter-spacing 0.16em, uppercase, `#f5c55a`. +- H2: `clamp(30px, 4vw, 42px)`, weight 700, line-height 1.15, letter-spacing -0.015em, `#fff`, margin-top 12px. + +### 3. Why (`#why`) +- Eyebrow "WHY SUMMER". H2 "What you tested is exactly what you deploy." (max-width 720px). +- Card grid: `repeat(auto-fit, minmax(260px, 1fr))`, gap 20px, margin-top 48px. +- Cards: background `#29344a`, border `1px solid rgba(255,255,255,0.08)`, radius 16px, padding 28px. + - Number: Roboto Mono 13px, `#f5c55a`. + - Title: 20px/500, `#fff`, margin 16px 0 8px. + - Body: 15px, line-height 1.6, `#a3adbd`. +- Card copy: + 1. **One binary**: "Plugins are Go packages compiled in at build time. Nothing is scanned, loaded or installed at runtime." + 2. **YAML-driven admin**: "Describe lists and forms in `fields.yaml` and `columns.yaml`. An embedded SPA renders them." The file names use inline code: Roboto Mono 13px, `#e9edf3`. + 3. **Headless by design**: "A JSON API declared route by route, plus realtime channels. Build the public site in whatever frontend you like." + +### 4. Features (`#features`) +- Full-bleed band: background `#1f2b42`, top and bottom borders `1px solid rgba(255,255,255,0.07)`. +- Eyebrow "WHAT'S IN THE BOX". H2 "The services a content app needs." +- Grid: `repeat(auto-fill, minmax(240px, 1fr))`. The 1px dividers come from `gap: 1px` over a `rgba(255,255,255,0.08)` grid background. Outer border is the same color, radius 16px, `overflow: hidden`. +- Each tile is a link: background `#1f2b42`, padding 24px, flex column, gap 6px. Hover background `#253350`. + - Title: 16px/500, `#e9edf3`. + - Body: 14px, line-height 1.5, `#a3adbd`. + +| Title | Body | Link | +|---|---|---| +| Admin SPA | Embedded in the binary, driven by each plugin's YAML. | /docs/backend/admin-spa | +| Models & migrations | GORM structs with fill, validation and pagination helpers. | /docs/database/models | +| Routing & auth | Route groups, named middleware, tokens and OAuth. | /docs/services/routing | +| Queued jobs | Dispatched inside the caller's transaction. | /docs/services/jobs | +| Realtime | Broadcast model changes to subscribed clients. | /docs/services/realtime | +| Search | Searchable models, synced after commit. | /docs/services/search | +| Mail & push | Plugin mail templates and push notifications. | /docs/services/mail | +| Console | Scaffolding, scheduler, workers and your own commands. | /docs/console/introduction | + +*Doc URLs were derived from the docs folder structure. Confirm them against the built docs site.* + +### 5. From WinterCMS (`#winter`) +- Two columns: `repeat(auto-fit, minmax(300px, 1fr))`, gap 48px, `align-items: start`. +- **Left column** + - Eyebrow "COMING FROM WINTERCMS". H2 "Same shape. Compiled and typed." + - Paragraph (16px, line-height 1.65, `#a3adbd`, margin-top 20px): "Plugins still register and boot, require each other, ship migrations and admin YAML. A plugin ports file by file." + - Link "See the full concept map →" (15px/500) → `/docs/setup/coming-from-wintercms`. +- **Right column: concept table** + - Container: background `#29344a`, border `rgba(255,255,255,0.08)`, radius 16px. + - Header row "WINTERCMS | SUMMERCMS": 12px/500, letter-spacing 0.12em, `#8a94a3`. + - Rows: grid `1fr 1.3fr`, padding 14px 20px, Roboto Mono 13px, divider `rgba(255,255,255,0.06)`. Left cell `#a3adbd`, right cell `#fbe3a6`. + - Row content: + +| WinterCMS | SummerCMS | +|---|---| +| Plugin.php | party.Plugin | +| version.yaml + updates/ | pact.HasMigrations | +| Eloquent models | GORM + lagoon | +| fields.yaml / columns.yaml | Same YAML, compiled at boot | +| routes.php | pact.HasRoutes | +| Event::listen / fire | festival.Bus | +| Artisan commands | bonfire.Command | + +### 6. Get started (`#start`) +- Full-bleed band: background `#1f2b42`, top border `rgba(255,255,255,0.07)`. +- Two columns, same grid as the WinterCMS section, `align-items: center`. +- **Left column** + - Eyebrow "GET STARTED". H2 "Build your first app." + - Requirement chips "Go 1.27" and "PostgreSQL 16": 13px, `#c5ccd6`, background `rgba(255,255,255,0.06)`, border `rgba(255,255,255,0.1)`, pill shape, padding 6px 12px. + - Note: "Alpha 0.1 is for early adopters. APIs may change before 1.0." + - Buttons: + - "Installation guide" (primary style) → `/docs/setup/installation`. + - "Source" (outline style) → `https://git.golem15.com/golem15/summercms`. +- **Right column: terminal card** + - Background `#18223a`, border `rgba(255,255,255,0.08)`, radius 16px. + - Title bar: label "terminal" (Roboto Mono 12px, `#8a94a3`) and a **Copy** button (12px/500, `#c5ccd6`, background `rgba(255,255,255,0.06)`, border `rgba(255,255,255,0.1)`, radius 6px, padding 5px 10px). + - Body: padding 22px 20px, Roboto Mono 14px, line-height 1.9. + - **Each line is its own block element.** Comments are `#8a94a3`. The `$ ` prompt is `#f5c55a`. A 16px gap separates the two groups. + ``` + # install the summer CLI + $ go install ./cmd/summer + + # build and run the example app + $ cd examples/hello + $ summer build + $ ./bin/hello greeter:hello + ``` + +### 7. Footer +- Top border `rgba(255,255,255,0.07)`. Padding 32px 24px. 13px, `#8a94a3`. +- Left: "© 2026 SummerCMS. Something bright is here." +- Right links (`#a3adbd`, hover `#f5c55a`, gap 20px): + - Docs → `/docs` + - Source → `https://git.golem15.com/golem15/summercms` + - Back to top ↑ → `#top` + +## Interactions & Behavior +- **Scroll-spy**: on window scroll, the active section is the last of `why`, `features`, `winter`, `start` whose top is less than 140px from the viewport top. That link gets the active style. Above the first section, no link is active. +- **Copy button**: writes the four commands (without `$` or comments) to the clipboard. The label changes to "Copied" for 1.5s, then reverts. +- **Responsive**: every grid uses auto-fit/auto-fill and collapses to one column on its own. Section links hide at ≤ 720px. Hero type scales with `clamp()`. +- **Transitions**: none are specified. Hover changes are instant; a 150ms ease on background and color is fine. + +## State +- `activeSection: string` +- `copied: boolean` +- `isWide: boolean` (matchMedia `min-width: 721px`) + +The prototype also has two config flags: `showRays` (default true) and `scrollSpy` (default true). + +## Design Tokens +| Token | Hex | Used for | +|---|---|---| +| navy-900 | `#18223a` | terminal background | +| navy-850 | `#1d2940` | header base, text on yellow | +| navy-800 | `#1f2b42` | alternate bands | +| navy-700 | `#233148` | page background | +| navy-650 | `#253350` | feature tile hover | +| navy-600 | `#29344a` | cards | +| yellow-500 | `#f5c55a` | accent | +| yellow-400 | `#fbd77e` | accent hover, "CMS" in logo | +| yellow-200 | `#fbe3a6` | link hover, code values | +| yellow-100 | `#fde9b4` | top of the "CMS" gradient | +| text | `#e9edf3` | body text | +| text-2 | `#c5ccd6` | tagline, nav links | +| text-3 | `#a3adbd` | body copy | +| text-4 | `#8a94a3` | captions, comments | + +- Borders: white at 6, 7, 8, 10, 12 and 14% alpha. +- Radius: 6px (small button), 16px (cards), 999px (pills). +- Spacing in use: 4, 6, 8, 12, 16, 20, 24, 28, 32, 40, 48, 96 and 120px. + +## Assets +- `assets/sun-crop.png` (180×180): **a placeholder cropped from a screenshot** of the current under-construction page. Replace it with the original sun artwork from the existing summercms.io site. A transparent PNG or SVG is best; the hero badge then provides the circle and border. + +## Files +- `SummerCMS Landing.dc.html`: the full design reference. +- `assets/sun-crop.png`: the placeholder sun icon. diff --git a/.planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/design/SummerCMS Landing.dc.html b/.planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/design/SummerCMS Landing.dc.html new file mode 100644 index 0000000..2c872cf --- /dev/null +++ b/.planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/design/SummerCMS Landing.dc.html @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + +
+ +
+ +
+ +
+ +
+
+
+
+ SummerCMS sun +
+

SummerCMS

+

A new dawn in content management

+

A content management framework for Go, inspired by WinterCMS. Plugins, the admin SPA and console commands compile into a single binary.

+ +
+ +
+
WHY SUMMER
+

What you tested is exactly what you deploy.

+
+
+
01
+

One binary

+

Plugins are Go packages compiled in at build time. Nothing is scanned, loaded or installed at runtime.

+
+
+
02
+

YAML-driven admin

+

Describe lists and forms in fields.yaml and columns.yaml. An embedded SPA renders them.

+
+
+
03
+

Headless by design

+

A JSON API declared route by route, plus realtime channels. Build the public site in whatever frontend you like.

+
+
+
+ +
+
+
WHAT'S IN THE BOX
+

The services a content app needs.

+ +
+
+ +
+
+
COMING FROM WINTERCMS
+

Same shape. Compiled and typed.

+

Plugins still register and boot, require each other, ship migrations and admin YAML. A plugin ports file by file.

+ See the full concept map → +
+
+
+ WINTERCMSSUMMERCMS +
+ +
+ {{ c.w }} + {{ c.s }} +
+
+
+
+ +
+
+
+
GET STARTED
+

Build your first app.

+
+ Go 1.27 + PostgreSQL 16 +
+

Alpha 0.1 is for early adopters. APIs may change before 1.0.

+ +
+
+
+ terminal + +
+
+ # install the summer CLI + $ go install ./cmd/summer + # build and run the example app + $ cd examples/hello + $ summer build + $ ./bin/hello greeter:hello +
+
+
+
+ + + +
+
+ + + diff --git a/.planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/design/assets/sun-crop.png b/.planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/design/assets/sun-crop.png new file mode 100644 index 0000000000000000000000000000000000000000..fb936f0c275b274bc105eb5deabf1106a9deca98 GIT binary patch literal 50822 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 z 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