Skip to content

docs: redesign landing page with Obsidian-native aesthetic#1168

Merged
chhoumann merged 2 commits intomasterfrom
docs/landing-page-redesign
Apr 20, 2026
Merged

docs: redesign landing page with Obsidian-native aesthetic#1168
chhoumann merged 2 commits intomasterfrom
docs/landing-page-redesign

Conversation

@chhoumann
Copy link
Copy Markdown
Owner

@chhoumann chhoumann commented Apr 20, 2026

Summary

Refreshes the docs landing page using fundamental UI principles — hierarchy, repetition, contrast, whitespace. The old page was centered-everything, emoji-heavy, and visually flat. The new page is warm and typographic, sits comfortably next to obsidian.md, and uses one consistent card treatment throughout.

  • Emoji → SVG icons. Six Lucide-style inline icons for features, four for examples, numbered step badges (01 02 03) — no more ⚡📄🤖🧠📁🚀 or 1️⃣2️⃣3️⃣.
  • New accent color. Flat #3B82F6 blue → #7C6EF2 purple-blue, applied via --ifm-color-primary so links, the sidebar, and the navbar all pick it up consistently.
  • Typography. Inter variable font with OpenType features enabled (cv02, cv03, ss01). Clamp-scaled display type (~59px hero → 30–40px section → 17px feature). text-wrap: balance on headings, text-wrap: pretty on body.
  • Layout. Centered hero + left-aligned feature/example/section heads (matches the landing-page rule: never more centered heading groups than left-aligned). Consistent clamp(4rem, 8vw, 6rem) section rhythm.
  • Surfaces. Single card style: 14px radius, 1px hairline border at 8% opacity, no shadows. Reused across features and examples.
  • Hero keyboard chip. Subtle visual cue — ⌘ P → QuickAdd: Run Choice — showing what triggering the plugin looks like.
  • Copy rewrite. Specific over generic (e.g. "Hit one hotkey and drop content into any note" vs "Capture thoughts, ideas, and information instantly").
  • Dark mode. Deep warm slate canvas (#17181C) with raised card background, tuned token set.

Files

  • docs/src/css/custom.css — Inter font import, new primary palette, scoped landing tokens, minor sidebar/navbar polish
  • docs/src/pages/index.module.css — Full rewrite (hero, sections, feature grid, example cards, quick-start steps, buttons, kbd chip)
  • docs/src/pages/index.tsx — New structure with inline SVG icons, eyebrow kickers, numbered steps, rewritten copy; React 19 JSX namespace fix

Test plan

  • bun run typecheck passes
  • bun run build produces the site cleanly
  • Computed styles verified in light mode (cream #F7F5F0 canvas, white cards, purple CTA) and dark mode (#17181C canvas, raised cards)
  • Responsive grids verified: mobile 1-col, tablet 2-col features / 3-col steps, desktop 3-col features
  • prefers-reduced-motion removes transform transitions
  • Visually eyeball on localhost — reviewer please run cd docs && bun run start and click through on a real browser

Open in Devin Review

Summary by CodeRabbit

  • Style
    • Updated typography to Inter and JetBrains Mono, refreshed color palette with a purple-blue accent, adjusted code block radius, navbar and sidebar visuals, and hover/transition behavior.
  • New Features
    • Full landing redesign: new hero, feature cards, examples, and quick-start sections with responsive layouts and inline SVG icons.
  • Accessibility
    • Honors prefers-reduced-motion to disable nonessential animations.

Replaces the emoji-heavy, centered-everything landing page with a warm,
typographic design tuned for the Obsidian community:

- Inline SVG icons (Lucide-style) in place of emoji for features, examples,
  and step numbers
- Purple-blue accent (#7C6EF2) replacing flat primary blue across the docs
- Warm cream/slate canvas scoped to the landing page via the .landing class
- Left-aligned feature and example sections with eyebrow kickers; centered
  hero with ⌘P keyboard chip
- Single consistent card treatment (14px radius, 1px hairline, no shadows)
- Rewritten copy throughout — concrete over generic
- Responsive breakpoints at 640/768/1024; reduced-motion respected
- React 19 JSX namespace fix
@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 20, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
quickadd Ready Ready Preview Apr 20, 2026 8:47pm

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 20, 2026

📝 Walkthrough

Walkthrough

Landing was redesigned: global typography and color tokens updated, large legacy CSS removed, a new scoped CSS module added for landing components, and the React page refactored to use new section components and SVG icons.

Changes

Cohort / File(s) Summary
Global Styling & Typography
docs/src/css/custom.css
Removed many landing/homepage-specific rules; imported Inter; switched base and monospace font tokens to Inter/JetBrains Mono; replaced primary color palette with purple-blue accents; added QuickAdd (--qa-*) tokens; adjusted dark-mode tokens, pre border-radius, navbar border, and font-variation support block.
Landing Page Styles (scoped)
docs/src/pages/index.module.css
Replaced prior hero/button rules with a comprehensive scoped API: .landing, .container, .hero (with decorative radial layer), typography classes (.eyebrow, .heroTitle, .heroSubtitle), .heroChip, primary/secondary button variants, section scaffolding, responsive feature/example/quick-start grids, hover/transform interactions, and reduced-motion support.
Landing Page Logic & Markup
docs/src/pages/index.tsx
Removed clsx and global utility class usage; switched feature data to use inline SVG React elements and string descriptions; rewrote page into Hero, Features, Examples, QuickStart components using module-scoped classes and semantic elements (dl, article, ol); updated Layout metadata and exported Home type to React.JSX.Element.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Poem

🐰 I hopped through tokens, fonts, and hue,
Swapped emojis for icons, fresh and new,
A gradient hat, a chip so neat,
New sections danced on nimble feet,
Landing blooms — a rabbit's tiny cheer! 🥕✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 40.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main change: a comprehensive redesign of the landing page with a new Obsidian-aligned aesthetic, which aligns with the substantial changes across custom.css, index.module.css, and index.tsx.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs/landing-page-redesign

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@cloudflare-workers-and-pages
Copy link
Copy Markdown

cloudflare-workers-and-pages Bot commented Apr 20, 2026

Deploying quickadd with  Cloudflare Pages  Cloudflare Pages

Latest commit: 5811a6b
Status: ✅  Deploy successful!
Preview URL: https://a4058cbb.quickadd.pages.dev
Branch Preview URL: https://docs-landing-page-redesign.quickadd.pages.dev

View logs

devin-ai-integration[bot]

This comment was marked as resolved.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/src/css/custom.css`:
- Line 6: Stylelint is failing due to the raw `@import` line and unquoted
capitalized font family names; change the import to use consistent quoting
(e.g., use double quotes in the `@import` url(...) statement that currently reads
"@import url('https://rsms.me/inter/inter.css');") and update every font-family
declaration that uses capitalized names (look for "font-family" entries) to wrap
those family names in quotes (e.g., "Inter", "JetBrains Mono") or convert them
to lowercase/standard CSS-safe identifiers; after updating the `@import` and
quoting all capitalized font-family tokens, run Stylelint to confirm violations
are resolved.

In `@docs/src/pages/index.module.css`:
- Around line 6-10: The primary CTA uses insufficient-contrast colors (white on
--qa-accent) in the .landing area; update the theme tokens and button styles to
use AA-safe color tokens instead of raw `#fff`—add or use dedicated variables like
--qa-accent-foreground or --qa-accent-cta and apply those to the CTA button
rules (refer to the .landing class and the button rules around lines 136-160) so
the foreground/background pair meets WCAG AA contrast for normal text; ensure
dark-mode values for --qa-accent and its foreground are tested and adjusted
accordingly.
- Around line 401-406: The .steps class is applied to an <ol> and needs its
native numbering and default spacing removed; update the .steps rule to reset
the list markers and spacing by adding list-style: none and clearing the default
padding/margin (e.g., padding: 0; margin: 0;) so the browser’s numbers do not
appear alongside your custom 01/02/03 badges.

In `@docs/src/pages/index.tsx`:
- Around line 303-310: The repeated "Learn how →" links are indistinguishable to
screen-reader users; update the Link element inside the examples.map render so
each link has a unique accessible name—e.g., add an aria-label that includes the
example title produced by the map (aria-label={`Learn how ${e.title}`}) or use
aria-labelledby pointing to the h3 (give the h3 in the exampleTitle a stable id
derived from e.title and reference it). Locate the Link with className
"exampleLink" and the h3 with className "exampleTitle" in the mapping and add
the aria attribute accordingly to make each card's link distinguishable.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: cf41b6be-4682-40da-915d-9bea6f3c49fc

📥 Commits

Reviewing files that changed from the base of the PR and between 9dbbf3a and 729d510.

📒 Files selected for processing (3)
  • docs/src/css/custom.css
  • docs/src/pages/index.module.css
  • docs/src/pages/index.tsx

Comment thread docs/src/css/custom.css
*/

/* You can override the default Infima variables here. */
@import url('https://rsms.me/inter/inter.css');
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix the Stylelint violations before merge.

The new font import and unquoted capitalized font families trigger the reported Stylelint errors.

Proposed lint fix
-@import url('https://rsms.me/inter/inter.css');
+@import 'https://rsms.me/inter/inter.css';

   --ifm-font-family-base: 'InterVariable', 'Inter', system-ui, -apple-system,
-    'Segoe UI', Roboto, Ubuntu, Cantarell, 'Noto Sans', sans-serif,
+    'Segoe UI', 'Roboto', 'Ubuntu', 'Cantarell', 'Noto Sans', sans-serif,
     'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
   --ifm-heading-font-family: var(--ifm-font-family-base);
-  --ifm-font-family-monospace: 'JetBrains Mono', 'SF Mono', Monaco, Consolas,
+  --ifm-font-family-monospace: 'JetBrains Mono', 'SF Mono', 'Monaco', 'Consolas',
     'Liberation Mono', 'Courier New', monospace;
 }

 `@supports` (font-variation-settings: normal) {
   :root {
     --ifm-font-family-base: 'InterVariable', system-ui, -apple-system,
-      'Segoe UI', Roboto, sans-serif;
+      'Segoe UI', 'Roboto', sans-serif;
   }
 }

Also applies to: 32-43

🧰 Tools
🪛 Stylelint (17.7.0)

[error] 6-6: Expected "url('https://rsms.me/inter/inter.css')" to be "'https://rsms.me/inter/inter.css'" (import-notation)

(import-notation)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/src/css/custom.css` at line 6, Stylelint is failing due to the raw
`@import` line and unquoted capitalized font family names; change the import to
use consistent quoting (e.g., use double quotes in the `@import` url(...)
statement that currently reads "@import
url('https://rsms.me/inter/inter.css');") and update every font-family
declaration that uses capitalized names (look for "font-family" entries) to wrap
those family names in quotes (e.g., "Inter", "JetBrains Mono") or convert them
to lowercase/standard CSS-safe identifiers; after updating the `@import` and
quoting all capitalized font-family tokens, run Stylelint to confirm violations
are resolved.

Comment thread docs/src/pages/index.module.css
Comment on lines +401 to +406
.steps {
display: grid;
grid-template-columns: 1fr;
gap: 2rem;
margin-top: 0.5rem;
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Reset the ordered list’s native markers and padding.

steps is applied to an <ol>, so browser default numbering/padding can show alongside the custom 01/02/03 badges.

Proposed list reset
 .steps {
   display: grid;
   grid-template-columns: 1fr;
   gap: 2rem;
-  margin-top: 0.5rem;
+  margin: 0.5rem 0 0;
+  padding: 0;
+  list-style: none;
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/src/pages/index.module.css` around lines 401 - 406, The .steps class is
applied to an <ol> and needs its native numbering and default spacing removed;
update the .steps rule to reset the list markers and spacing by adding
list-style: none and clearing the default padding/margin (e.g., padding: 0;
margin: 0;) so the browser’s numbers do not appear alongside your custom
01/02/03 badges.

Comment thread docs/src/pages/index.tsx
- Reset <ol> padding and list-style on .steps so native list numbering
  and left padding don't offset the quick-start grid
- Introduce dedicated --qa-cta-bg/-fg tokens so primary button text
  clears AA (~5.68:1, was ~3.9:1 with white on #7c6ef2); darken light-mode
  text accent to #5a4aec to pass AA for eyebrow and example links
- Add aria-label to each "Learn how →" example link so assistive tech
  can distinguish otherwise-identical link text
@chhoumann
Copy link
Copy Markdown
Owner Author

Pushed 5811a6b addressing the review feedback.

Fixed

  • <ol> default padding/markers on .steps (Devin, CodeRabbit): Added padding: 0, margin: 0.5rem 0 0, and list-style: none. The three-step grid now aligns to its centered container instead of sitting ~40px to the right of it.
  • CTA contrast failing AA (CodeRabbit): Introduced dedicated --qa-cta-bg/--qa-cta-bg-hover/--qa-cta-fg tokens. White on #5a4aec is 5.68:1 (was 3.9:1 on #7c6ef2). Also darkened the light-mode text accent to #5a4aec so eyebrow kickers and example "Learn how →" links clear AA at 5.4:1 on the cream canvas. Dark mode keeps the lighter #a195f7 for text (~7:1 on the dark canvas) with the same #5a4aec button bg so white button text still passes.
  • Duplicate "Learn how →" link text (CodeRabbit): Each example link now has aria-label={\Learn how: ${e.title}`}`, giving assistive tech distinct destinations in their link list.

Not fixed

  • Stylelint violations (CodeRabbit): This repo doesn't use Stylelint — it uses Biome (see biome.json), which doesn't enforce import-notation or unquoted capitalized font families. The warnings come from CodeRabbit running Stylelint in its own reviewer environment, not a project lint rule. Happy to add the quoting anyway if preferred, but it's not a CI requirement here.

Verified in-browser: button bg is now rgb(90, 74, 236), .steps padding-inline-start is 0px, all four aria-labels present. Both light and dark modes checked.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

♻️ Duplicate comments (1)
docs/src/css/custom.css (1)

6-6: ⚠️ Potential issue | 🟡 Minor

Fix the remaining Stylelint violations.

Line 6 still violates import-notation, and Lines 38, 41, and 48 still violate value-keyword-case for unquoted capitalized font family names.

Proposed lint fix
-@import url('https://rsms.me/inter/inter.css');
+@import 'https://rsms.me/inter/inter.css';

   --ifm-font-family-base: 'InterVariable', 'Inter', system-ui, -apple-system,
-    'Segoe UI', Roboto, Ubuntu, Cantarell, 'Noto Sans', sans-serif,
+    'Segoe UI', 'Roboto', 'Ubuntu', 'Cantarell', 'Noto Sans', sans-serif,
     'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
   --ifm-heading-font-family: var(--ifm-font-family-base);
-  --ifm-font-family-monospace: 'JetBrains Mono', 'SF Mono', Monaco, Consolas,
+  --ifm-font-family-monospace: 'JetBrains Mono', 'SF Mono', 'Monaco', 'Consolas',
     'Liberation Mono', 'Courier New', monospace;
 }

 `@supports` (font-variation-settings: normal) {
   :root {
     --ifm-font-family-base: 'InterVariable', system-ui, -apple-system,
-      'Segoe UI', Roboto, sans-serif;
+      'Segoe UI', 'Roboto', sans-serif;
   }
 }

Please rerun the Stylelint check after applying the fix.

Also applies to: 37-48

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/src/css/custom.css` at line 6, Change the `@import` to string notation
(e.g., replace `@import` url('https://rsms.me/inter/inter.css'); with `@import`
"https://rsms.me/inter/inter.css";) to satisfy import-notation, and update any
font-family declarations that use unquoted capitalized family names (the
properties using font-family around lines 37–48) by quoting those names (e.g.,
"Inter", "Poppins" or other capitalized family identifiers) so they comply with
value-keyword-case; after making these edits, rerun Stylelint to verify no
violations remain.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In `@docs/src/css/custom.css`:
- Line 6: Change the `@import` to string notation (e.g., replace `@import`
url('https://rsms.me/inter/inter.css'); with `@import`
"https://rsms.me/inter/inter.css";) to satisfy import-notation, and update any
font-family declarations that use unquoted capitalized family names (the
properties using font-family around lines 37–48) by quoting those names (e.g.,
"Inter", "Poppins" or other capitalized family identifiers) so they comply with
value-keyword-case; after making these edits, rerun Stylelint to verify no
violations remain.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 901a941f-11de-4696-b6d9-b7b68c41edc1

📥 Commits

Reviewing files that changed from the base of the PR and between 729d510 and 5811a6b.

📒 Files selected for processing (3)
  • docs/src/css/custom.css
  • docs/src/pages/index.module.css
  • docs/src/pages/index.tsx
🚧 Files skipped from review as they are similar to previous changes (1)
  • docs/src/pages/index.tsx

@chhoumann chhoumann merged commit 2392a00 into master Apr 20, 2026
5 checks passed
@chhoumann chhoumann deleted the docs/landing-page-redesign branch April 20, 2026 20:51
Copy link
Copy Markdown
Contributor

@devin-ai-integration devin-ai-integration Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 new potential issue.

View 5 additional findings in Devin Review.

Open in Devin Review

Comment thread docs/src/pages/index.tsx
<dl className={styles.features}>
{features.map((f) => (
<div className={styles.feature} key={f.title}>
<span className={styles.featureIcon}>{f.icon}</span>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Invalid HTML: <span> inside <dl> > <div> violates the content model for definition lists

The Features component at docs/src/pages/index.tsx:274-282 wraps each feature in a <dl> > <div> structure, but places a <span className={styles.featureIcon}> as a child of the <div> alongside the <dt> and <dd>. Per the HTML spec, when <div> is a child of <dl>, its content model is restricted to one or more <dt> elements followed by one or more <dd> elements (plus script-supporting elements). The <span> is not permitted there. While browsers render this gracefully, it will fail HTML validation and can confuse assistive technologies that rely on the strict <dl> content model to convey term-description relationships.

Prompt for agents
The <span> wrapping the feature icon is an invalid child of <div> inside <dl>. To fix this, either: (1) move the icon inside the <dt> element so it becomes part of the term, e.g. <dt className={styles.featureTitle}><span className={styles.featureIcon}>{f.icon}</span>{f.title}</dt> (adjusting CSS as needed), or (2) change the <dl> to a plain <div> and use role='list' with ARIA attributes if semantic list behavior is desired, or (3) use the CSS `display` property to visually place the icon while keeping it in a valid HTML position. Option 1 is simplest — the icon is semantically part of the feature 'term', so nesting it in <dt> is correct.
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant