chore(docs): polish homepage with square brand mark and list layouts#460
Conversation
Introduce a square geometric mark (cyan apex, magenta and gold base nodes, gradient connectors, soft glow) shared by the header logo and the site favicon. The viewBox is sized so the outer nodes sit flush to the left and right edges. Wire the mark into the header title via a custom SiteTitle component and register the favicon in the site config.
Replace the boxy three-column feature grid with a single aligned vertical list (icon and title share one centered row, description sits below with even spacing, hover highlights without movement). Convert the "What Systematic Is Not" cards to a plain bulleted list to remove the redundant boxing and excess padding.
91ab749 to
6bf395b
Compare
fro-bot
left a comment
There was a problem hiding this comment.
Verdict: PASS
Clean, docs-only presentation change. The brand mark, favicon, and list-layout refactors are well-executed, and the semantic upgrade from <div> to <ul>/<li> in the "What Systematic Is Not" section is a real accessibility improvement. No plugin source, build config, or skill/agent loading paths are touched.
Note on the user-supplied review rubric (type safety, ESM conventions, plugin API, prompt-injection): N/A — no TypeScript plugin code, config/tool/system.transform hooks, or skill-loading logic is in this diff. It is entirely Astro/MDX docs presentation.
Blocking issues
None
Non-blocking concerns
- SVG duplication between
Logo.astroandfavicon.svg. The two files are byte-for-byte identical except for the gradient/filter IDs (sysmark-*vsfav-*). This is acceptable for static docs assets, but the mark now lives in three places (these two plusassets/banner.svg, per the inline comment). A future change to the brand mark will need to be applied in all of them. Consider noting this coupling, or sourcing the favicon from the same component, if the mark is expected to evolve. SiteTitle.astrodrops light/dark logo switching. The previous implementation renderedlogos.dark/logos.lightfromvirtual:starlight/user-imagesand honoredconfig.logo.replacesTitlefor image swapping. The new<Logo />is a single inline SVG with fixed colors. This is fine given nologois configured inastro.config.mjs(onlyfaviconwas added), andconfig.logo?.replacesTitleis still safely referenced for thesr-onlyclass. Just confirm there's no intent to support a configured Starlight logo later — if so, this hardcoding regresses that path.- Pre-existing
icon as anycast inFeatureCard.astro(originated in #457, untouched here). Not introduced by this PR, so out of scope, but flagging since the rubric calls outany. The StarlightIconnameprop is typed to a union; a cast to the icon-name type rather thananywould be cleaner if revisited. SiteTitle.astrohas no trailing newline (\ No newline at end of file). Minor; Biome/formatter config should normally catch this. Verify it does not trip content-integrity or lint in CI.
Missing tests
None expected. This is a visual/presentation change with no testable logic; the PR reports typecheck, lint, content-integrity, and docs build (111 pages) all clean, which is the appropriate verification for docs-only work.
Risk assessment: LOW
- Regression likelihood: Low. Changes are CSS, markup semantics, and a static brand mark. No runtime logic, data flow, or plugin behavior altered.
- Security exposure: None. No system-prompt injection, skill loading, or external input paths involved. Inline SVG uses static, hardcoded values.
- Blast radius: Confined to the docs site homepage and header. No impact on the published npm plugin, bundled skills/agents, or the OpenCode plugin API.
Run Summary
| Field | Value |
|---|---|
| Event | pull_request |
| Repository | marcusrbrown/systematic |
| Run ID | 26686001673 |
| Cache | hit |
| Session | ses_186c2befcffeRowykV2MnJIqgn |
Derive the icon name type from Starlight's Icon component via ComponentProps and drop the as-any cast at the call site. Removes the last any in the homepage components.
fro-bot
left a comment
There was a problem hiding this comment.
Verdict: PASS
Re-review after ccb9c1a (refactor(docs): type FeatureCard icon prop instead of any cast). The new commit directly resolves the one actionable item from my prior review: FeatureCard.astro now imports StarlightIcon from @astrojs/starlight/types, types the prop as icon?: StarlightIcon, and drops the <Icon name={icon as any} /> cast. The seven icon names used in index.mdx (open-book, document, setting, approve-check, rocket, random, puzzle) are standard Starlight built-ins within that union, so the change is type-correct. PR reports typecheck/lint/content-integrity/build all clean.
This remains a clean, docs-only presentation change (Astro/MDX). The user-supplied TypeScript-plugin rubric (type safety hooks, ESM conventions, config/tool/system.transform, prompt-injection, skill loading) is N/A — no plugin source, build config, or skill/agent loading paths are touched.
Blocking issues
None
Non-blocking concerns
- SVG duplication between
Logo.astro,favicon.svg, andassets/banner.svg. The mark is byte-for-byte identical across these (aside from gradient/filter IDs). Acceptable for static docs assets, but a future brand-mark change must be applied in all three. Carryover from prior review — not introduced byccb9c1a. SiteTitle.astrodrops light/dark logo switching.<Logo />is a single inline SVG with fixed colors, replacing thelogos.dark/logos.lightpath. Fine given no Starlightlogois configured (onlyfavicon), andconfig.logo?.replacesTitleis still safely referenced. Confirm there's no intent to support a configured logo later. Carryover from prior review.SiteTitle.astrohas no trailing newline. Minor; verify it doesn't trip lint/content-integrity in CI. Carryover from prior review.- The prior
icon as anyconcern is now resolved byccb9c1a.
Missing tests
None expected. Visual/presentation change with no testable logic; typecheck + lint + content-integrity + docs build are the appropriate verification and are reported clean.
Risk assessment: LOW
- Regression likelihood: Low. CSS, markup semantics, a static brand mark, and a prop-type tightening that narrows (not widens) the accepted type. The stricter
StarlightIcontype would surface any invalid icon name at typecheck time rather than runtime. - Security exposure: None. No system-prompt injection, skill loading, or external input paths. Inline SVG uses static hardcoded values.
- Blast radius: Confined to the docs site homepage and header. No impact on the published npm plugin, bundled skills/agents, or the OpenCode plugin API.
Run Summary
| Field | Value |
|---|---|
| Event | pull_request |
| Repository | marcusrbrown/systematic |
| Run ID | 26687533536 |
| Cache | hit |
| Session | ses_186c2befcffeRowykV2MnJIqgn |
Visual polish pass on the docs homepage and brand mark, building on the redesign in #457.
Changes
Brand mark (header logo + favicon)
SiteTitlecomponent.Homepage section layouts
Screenshots
Home page — header logo + feature list:

"What Systematic Is Not" bulleted list:

Verification