Skip to content

Conversation

@ahmedmawiri
Copy link
Contributor

@ahmedmawiri ahmedmawiri commented Nov 16, 2025

Summary by CodeRabbit

  • New Features

    • Centralized design system and theme tokens (colors, typography, spacing, components).
    • New interactive hero code demo and two new illustrative hero components with animations.
  • Refactor

    • Removed multiple landing pages, blog and changelog entries, promotional video, signup/login/pricing UIs; header/nav simplified and auth links now point externally; footer newsletter removed and attribution added.
    • Homepage updated with animations, feature card staggering, and CTA/link changes.
  • Chores

    • Added Inter font to site head and updated global CSS/theme.

@ahmedmawiri ahmedmawiri requested a review from marcrupt November 16, 2025 17:15
@vercel
Copy link

vercel bot commented Nov 16, 2025

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

Project Deployment Preview Comments Updated (UTC)
sendook Ready Ready Preview Comment Nov 17, 2025 6:05pm
sendook-app Ready Ready Preview Comment Nov 17, 2025 6:05pm

@coderabbitai
Copy link

coderabbitai bot commented Nov 16, 2025

Caution

Review failed

The pull request is closed.

Walkthrough

Adds a centralized design token file and font links, replaces global CSS with token-driven styles and animations, extends UI overrides, introduces new hero/demo and illustrations, removes many landing pages/components and newsletter/auth flows, and updates header/footer links and README/docs. No API or exported function signature changes.

Changes

Cohort / File(s) Summary
Design tokens (new)
landing/design.json
New JSON design token file defining layout, colors, typography, component tokens, spacing, and illustration styles.
Global CSS / Theme
landing/app/assets/css/main.css
Replaces previous theme with token-driven CSS: sets Inter font, new color ramps and illustration colors, spacing/radii/shadows, typography scales, utilities, animations (fadeInUp, fadeInScale), section/card animations, and base background.
App config overrides
landing/app/app.config.ts
Adds UI overrides under ui: button (rounded: full, padding: px-6 py-3), card (rounded: xl, shadow: md, body padding: p-8), container (constrain: xl).
Nuxt head links
landing/nuxt.config.ts
Adds Google Fonts preconnects and an Inter stylesheet entry to app.head.link.
Homepage & hero
landing/app/pages/index.vue, landing/app/components/HeroCodeDemo.vue, landing/app/components/CoreFeaturesIllustration.vue, landing/app/components/SpeedIllustration.vue, landing/content/0.index.yml
Replaces PromotionalVideo with HeroCodeDemo; adds animate-section / animate-card and staggered delays; swaps illustrations to CoreFeaturesIllustration / SpeedIllustration; removes testimonials; updates CTA links/icons and hero text.
Removed landing pages & components
landing/app/pages/blog.vue, landing/app/pages/blog/[slug].vue, landing/app/pages/blog/index.vue, landing/app/pages/changelog/index.vue, landing/app/pages/login.vue, landing/app/pages/pricing.vue, landing/app/pages/signup.vue, landing/app/components/PromotionalVideo.vue
Deleted multiple Vue SFCs and a component—removes their data fetching, SEO/meta setup, templates, and related UI composition.
Removed content files
landing/content/2.pricing.yml, landing/content/3.blog.yml, landing/content/3.blog/*, landing/content/4.changelog.yml, landing/content/4.changelog/*
Removes pricing, blog, and changelog YAML/Markdown content and many individual posts/changelog entries.
Header & Footer
landing/app/components/AppHeader.vue, landing/app/components/AppFooter.vue
Header: removes Pricing/Blog/Changelog nav items, removes color-mode toggle, and changes auth links to external URLs (open in new tab). Footer: removes newsletter subscription logic, simplifies layout, updates GitHub link to https://github.com/getrupt/sendook.
Local app change
app/app/pages/login.vue
Replaced internal signup NuxtLink with external URL (https://app.sendook.com/signup).
Docs & README
landing/content/1.docs/1.getting-started/2.installation.md, README.md
Text updates: Sign Up URL change (conflict markers present), API/SDK examples and links, and assorted README wording/formatting edits.

Sequence Diagram(s)

sequenceDiagram
  participant Design as design.json
  participant CSS as main.css
  participant Nuxt as nuxt.config.ts
  participant AppCfg as app.config.ts
  participant Index as index.vue
  participant Hero as HeroCodeDemo.vue
  participant Browser as Browser

  Note over Design,CSS: design tokens supply colors, spacing, typography
  Design->>CSS: tokens imported / referenced
  Nuxt->>Browser: inject font preconnect & Inter stylesheet
  AppCfg->>CSS: component overrides applied (button/card/container)
  CSS->>Index: utilities, animations, and tokens available
  Index->>Hero: render HeroCodeDemo in hero slot
  Hero->>Browser: display tabbed code demo + copy action
  Index->>Browser: render sections/cards with new illustrations and staggered animations
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

  • Pay special attention to landing/app/assets/css/main.css for token-to-variable consistency, dark-mode handling, animation performance, and selector specificity.
  • Verify there are no unresolved imports or route references after deleting pages/components (AppHeader, AppFooter, router/navigation).
  • Confirm landing/app/app.config.ts overrides align with utility classes used in templates and with design.json token names.
  • Check landing/content/1.docs/1.getting-started/2.installation.md for unresolved merge conflict markers.

Possibly related PRs

  • Improve landing page #14 — Overlaps theme, UI overrides, and many landing files; likely directly related to these design and component changes.
  • Landing page #4 — Touches landing app config and theme; related to UI token/override edits.
  • Updated install docs #13 — Alters the same installation doc URLs; likely related to the docs change.

Suggested reviewers

  • marcrupt

Poem

🐇 I hopped through tokens with a careful paw,

Swapped fonts and colors, tightened every law.
Cleared old pages, gave the hero a show,
Rounded the buttons, made the cards all glow.
A rabbit cheers — designs now ready to grow 🥕✨

Pre-merge checks and finishing touches

❌ Failed checks (1 inconclusive)
Check name Status Explanation Resolution
Title check ❓ Inconclusive The title 'Improve landing page' is vague and generic, using non-descriptive language that doesn't convey the specific changes made in this comprehensive redesign. Use a more specific title that captures the main changes, such as 'Redesign landing page with design system tokens and updated hero component' or 'Implement design system and modernize landing page UI.'
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a4ea3dd and 57119f6.

📒 Files selected for processing (28)
  • README.md (6 hunks)
  • app/app/pages/login.vue (1 hunks)
  • landing/app/assets/css/main.css (1 hunks)
  • landing/app/components/AppHeader.vue (2 hunks)
  • landing/app/components/CoreFeaturesIllustration.vue (1 hunks)
  • landing/app/components/HeroCodeDemo.vue (1 hunks)
  • landing/app/components/SpeedIllustration.vue (1 hunks)
  • landing/content/0.index.yml (2 hunks)
  • landing/content/1.docs/1.getting-started/2.installation.md (1 hunks)
  • landing/content/2.pricing.yml (0 hunks)
  • landing/content/3.blog.yml (0 hunks)
  • landing/content/3.blog/1.asian-cuisine.md (0 hunks)
  • landing/content/3.blog/2.pyrenees.md (0 hunks)
  • landing/content/3.blog/3.james-webb.md (0 hunks)
  • landing/content/3.blog/4.meditation.md (0 hunks)
  • landing/content/3.blog/5.animals.md (0 hunks)
  • landing/content/3.blog/6.cryptocurrencies.md (0 hunks)
  • landing/content/4.changelog.yml (0 hunks)
  • landing/content/4.changelog/1.launch.md (0 hunks)
  • landing/content/4.changelog/10.fun.md (0 hunks)
  • landing/content/4.changelog/2.teams.md (0 hunks)
  • landing/content/4.changelog/3.dark-mode.md (0 hunks)
  • landing/content/4.changelog/4.integrations.md (0 hunks)
  • landing/content/4.changelog/5.mobile.md (0 hunks)
  • landing/content/4.changelog/6.performance.md (0 hunks)
  • landing/content/4.changelog/7.analytics.md (0 hunks)
  • landing/content/4.changelog/8.api.md (0 hunks)
  • landing/content/4.changelog/9.security.md (0 hunks)

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

Copy link

@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: 1

🧹 Nitpick comments (2)
landing/design.json (1)

1-117: Consider automating design token consumption to prevent drift.

The design.json file provides excellent centralized design tokens, but currently values are manually copied into CSS and configuration files. This creates maintenance overhead and risk of inconsistencies.

Consider either:

  1. Using a design token build tool (e.g., Style Dictionary, Theo) to generate CSS variables and config from this JSON
  2. Importing and consuming this JSON programmatically in your build process
  3. If this is intentionally just documentation, consider renaming to something like design-system-reference.json to make the purpose clearer
landing/app/assets/css/main.css (1)

155-159: Consider separating body and paragraph styles.

The selector p, body applies identical typography rules to both the <body> container and <p> elements. Typically, these would be styled separately—body for base font settings and p for paragraph-specific styles.

If this is intentional, it's fine, but consider whether body needs separate treatment for base font size that other elements can inherit.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 723e0b7 and 6842e2a.

📒 Files selected for processing (11)
  • landing/app/app.config.ts (1 hunks)
  • landing/app/assets/css/main.css (1 hunks)
  • landing/app/pages/blog.vue (0 hunks)
  • landing/app/pages/blog/[slug].vue (0 hunks)
  • landing/app/pages/blog/index.vue (0 hunks)
  • landing/app/pages/changelog/index.vue (0 hunks)
  • landing/app/pages/login.vue (0 hunks)
  • landing/app/pages/pricing.vue (0 hunks)
  • landing/app/pages/signup.vue (0 hunks)
  • landing/design.json (1 hunks)
  • landing/nuxt.config.ts (1 hunks)
💤 Files with no reviewable changes (7)
  • landing/app/pages/blog.vue
  • landing/app/pages/blog/[slug].vue
  • landing/app/pages/login.vue
  • landing/app/pages/changelog/index.vue
  • landing/app/pages/blog/index.vue
  • landing/app/pages/signup.vue
  • landing/app/pages/pricing.vue
🔇 Additional comments (4)
landing/app/app.config.ts (1)

6-23: Well-structured UI configuration!

The component overrides are cleanly mapped from design.json tokens to Tailwind utilities. The inline comments make the token relationships clear and maintainable.

landing/app/assets/css/main.css (3)

7-119: Comprehensive design token implementation.

The CSS custom properties are well-organized and provide a solid foundation for the design system. The color scales and typography tokens are consistently structured.


162-192: Clean component and utility styling.

The button hover effects, section constraints, and utility classes are well-implemented and properly reference the design tokens defined above.


127-132: This review comment is based on a misunderstanding of how @nuxt/ui works.

@nuxt/ui exposes semantic neutral tokens as CSS variables named --ui-color-neutral-50 … --ui-color-neutral-950 as part of its standard theme system. These variables do not need to be defined in the local @theme block—they are provided by the library itself. The code correctly references these variables through var() in the .dark mode override, which is the intended usage pattern. The configuration in app.config.ts (which maps neutral: 'gray') properly integrates with @nuxt/ui's theming system, so these variables are reliably available and will not cause issues.

Likely an incorrect or invalid review comment.

Comment on lines +18 to 23
link: [
// Inter font from design.json typography
{ rel: 'preconnect', href: 'https://fonts.googleapis.com' },
{ rel: 'preconnect', href: 'https://fonts.gstatic.com', crossorigin: '' },
{ rel: 'stylesheet', href: 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap' }
]
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Set crossorigin to 'anonymous' for fonts.gstatic.com preconnect.

Line 21 should use crossorigin: 'anonymous' instead of an empty string for proper CORS handling when loading font resources from Google Fonts.

Apply this diff:

       link: [
         // Inter font from design.json typography
         { rel: 'preconnect', href: 'https://fonts.googleapis.com' },
-        { rel: 'preconnect', href: 'https://fonts.gstatic.com', crossorigin: '' },
+        { rel: 'preconnect', href: 'https://fonts.gstatic.com', crossorigin: 'anonymous' },
         { rel: 'stylesheet', href: 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap' }
       ]
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
link: [
// Inter font from design.json typography
{ rel: 'preconnect', href: 'https://fonts.googleapis.com' },
{ rel: 'preconnect', href: 'https://fonts.gstatic.com', crossorigin: '' },
{ rel: 'stylesheet', href: 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap' }
]
link: [
// Inter font from design.json typography
{ rel: 'preconnect', href: 'https://fonts.googleapis.com' },
{ rel: 'preconnect', href: 'https://fonts.gstatic.com', crossorigin: 'anonymous' },
{ rel: 'stylesheet', href: 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap' }
]
🤖 Prompt for AI Agents
In landing/nuxt.config.ts around lines 18 to 23, the preconnect link for
fonts.gstatic.com currently sets crossorigin to an empty string; update it to
crossorigin: 'anonymous' so the preflight/CORS for Google Fonts is handled
correctly. Modify the link entry to set the crossorigin attribute to the string
'anonymous' (not empty) to ensure proper cross-origin requests for font loading.

Copy link

@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: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 6842e2a and fa58934.

📒 Files selected for processing (2)
  • landing/app/components/PromotionalVideo.vue (0 hunks)
  • landing/app/pages/index.vue (1 hunks)
💤 Files with no reviewable changes (1)
  • landing/app/components/PromotionalVideo.vue

Copy link

@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: 1

🧹 Nitpick comments (2)
landing/app/components/HeroCodeDemo.vue (2)

41-67: Consider clarifying code language in the "send" example.

The bash code block includes TypeScript-style await client.messages.send() starting at line 48, which may confuse users about the actual language being demonstrated. Consider either:

  • Separating bash and TypeScript examples into distinct tabs
  • Using consistent bash/shell syntax throughout
  • Changing the language identifier to reflect the mixed content
-    code: `\`\`\`bash
+    code: `\`\`\`typescript
 # Send from any email client
 To: support-abc123@yourdomain.sendook.app
 Subject: New support request

133-141: Add error handling for clipboard API.

The clipboard write operation on line 139 lacks error handling. If the clipboard API is unavailable or permission is denied, the operation will fail silently.

         <div class="absolute top-4 right-4 z-10">
           <UButton
             icon="i-lucide-copy"
             size="xs"
             color="neutral"
             variant="subtle"
-            @click="() => navigator.clipboard.writeText(currentExample.rawCode)"
+            @click="async () => {
+              try {
+                await navigator.clipboard.writeText(currentExample.rawCode)
+              } catch (err) {
+                console.error('Failed to copy code:', err)
+              }
+            }"
           />
         </div>
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between fa58934 and edf5752.

📒 Files selected for processing (6)
  • landing/app/assets/css/main.css (1 hunks)
  • landing/app/components/AppFooter.vue (2 hunks)
  • landing/app/components/AppHeader.vue (0 hunks)
  • landing/app/components/HeroCodeDemo.vue (1 hunks)
  • landing/app/pages/index.vue (3 hunks)
  • landing/content/0.index.yml (1 hunks)
💤 Files with no reviewable changes (1)
  • landing/app/components/AppHeader.vue
🔇 Additional comments (10)
landing/content/0.index.yml (1)

84-91: LGTM! CTA links updated appropriately.

The changes redirect users to documentation and GitHub instead of a signup flow, which aligns with a developer-focused landing page strategy. The addition of target: _blank for the external GitHub link follows best practices.

landing/app/components/AppFooter.vue (2)

2-20: LGTM! Footer simplification improves clarity.

The removal of newsletter subscription logic and the addition of a clean attribution link creates a more focused footer. The external link includes proper rel="noopener noreferrer" attributes for security.


33-33: GitHub URL correctly updated to match organization.

The repository link now points to the correct organization URL (getrupt/sendook), consistent with the PR's source repository.

landing/app/components/HeroCodeDemo.vue (2)

106-165: LGTM! Well-structured component template.

The template provides a clean three-tab interface with responsive design considerations (mobile/desktop label handling) and proper use of Vue directives. The MDC integration for code rendering is appropriate.


167-201: Component styles are acceptable for framework overrides.

The extensive use of !important in the code block styling (lines 169-191) is likely necessary to override default UI framework styles. While generally discouraged, this is a common pattern when customizing third-party component libraries.

landing/app/assets/css/main.css (3)

122-159: LGTM! Typography system is well-implemented.

The typography rules properly utilize the design tokens with appropriate font sizes, weights, line heights, and letter spacing for each heading level. Dark mode overrides are cleanly separated.


162-192: Component styles provide good UX polish.

The button and card hover effects (transform and shadow) add nice visual feedback. The section container with 1440px max-width is a standard responsive pattern. Utility classes properly reference the design tokens.


195-243: LGTM! Animation implementation is performant and polished.

The entrance animations use transform and opacity properties, which are GPU-accelerated and performant. The staggered delays create a nice sequential reveal effect, and the cubic-bezier easing provides smooth motion. Well done!

landing/app/pages/index.vue (2)

51-51: HeroCodeDemo component usage is correct.

The previous review concern about this component not existing has been resolved—HeroCodeDemo.vue is included in this PR. The component requires no props, so the usage is correct as-is.


62-80: LGTM! Animation classes correctly integrated.

The animate-section and animate-card classes align with the animation definitions in main.css. The dynamic animation delay calculation (index * 100ms) provides the same staggered entrance effect defined in the CSS, while allowing it to work with any number of items.

Comment on lines 7 to 119
/* Font Family - Inter as primary from design.json */
--font-sans: 'Inter', 'SF Pro Display', 'Helvetica Neue', sans-serif;

/* Primary - Green (accent.green from design.json) */
--color-primary-50: #e6f9f3;
--color-primary-100: #ccf3e7;
--color-primary-200: #99e7cf;
--color-primary-300: #66dbb7;
--color-primary-400: #33cf9f;
--color-primary-500: #00A36C;
--color-primary-600: #008256;
--color-primary-700: #006241;
--color-primary-800: #00412b;
--color-primary-900: #002116;
--color-primary-950: #00100b;

/* Secondary - Text colors from design.json */
--color-secondary-50: #f7f7f7;
--color-secondary-100: #efefef;
--color-secondary-200: #dfdfdf;
--color-secondary-300: #cfcfcf;
--color-secondary-400: #9A9A9A;
--color-secondary-500: #4A4A4A;
--color-secondary-600: #3a3a3a;
--color-secondary-700: #2a2a2a;
--color-secondary-800: #1E1E1E;
--color-secondary-900: #141414;
--color-secondary-950: #0a0a0a;

/* Blue - Accent from design.json */
--color-blue-50: #e8f5fb;
--color-blue-100: #d1ebf7;
--color-blue-200: #a3d7ef;
--color-blue-300: #75c3e7;
--color-blue-400: #47afdf;
--color-blue-500: #5BA5D9;
--color-blue-600: #4984ad;
--color-blue-700: #376382;
--color-blue-800: #254257;
--color-blue-900: #12212b;
--color-blue-950: #091016;

/* Yellow - Accent from design.json */
--color-yellow-50: #fffaeb;
--color-yellow-100: #fff5d6;
--color-yellow-200: #ffebad;
--color-yellow-300: #ffe085;
--color-yellow-400: #ffd65c;
--color-yellow-500: #FFCC33;
--color-yellow-600: #cca329;
--color-yellow-700: #997a1f;
--color-yellow-800: #665214;
--color-yellow-900: #33290a;
--color-yellow-950: #1a1405;

/* Orange - Accent from design.json */
--color-orange-50: #fef7eb;
--color-orange-100: #fdefd7;
--color-orange-200: #fbdfaf;
--color-orange-300: #f9cf87;
--color-orange-400: #f7bf5f;
--color-orange-500: #F6B23E;
--color-orange-600: #c58e32;
--color-orange-700: #946b25;
--color-orange-800: #624719;
--color-orange-900: #31240c;
--color-orange-950: #181206;

/* Gray - Neutral with design.json background */
--color-gray-50: #F7F8F6;
--color-gray-100: #f0f1ef;
--color-gray-200: #e1e3df;
--color-gray-300: #d2d5cf;
--color-gray-400: #9A9A9A;
--color-gray-500: #737373;
--color-gray-600: #525252;
--color-gray-700: #404040;
--color-gray-800: #262626;
--color-gray-900: #171717;
--color-gray-900: #1E1E1E;
--color-gray-950: #0a0a0a;

/* Illustration Colors from design.json */
--color-sky-blue: #C9E7F5;
--color-sand: #F2C986;
--color-forest: #4B8C5A;
--color-cliff: #D1692D;

/* Custom Design Tokens from design.json */
--spacing-xs: 8px;
--spacing-sm: 16px;
--spacing-md: 24px;
--spacing-lg: 40px;
--spacing-xl: 64px;
--spacing-xxl: 96px;

--border-radius-card: 16px;
--border-radius-button: 9999px;

--shadow-card: 0 4px 24px rgba(0, 0, 0, 0.05);

/* Typography from design.json */
--font-size-h1: 48px;
--font-size-h2: 32px;
--font-size-h3: 24px;
--font-size-body: 18px;
--font-size-caption: 14px;

--line-height-h1: 1.2;
--line-height-h2: 1.3;
--line-height-h3: 1.4;
--line-height-body: 1.6;
--line-height-caption: 1.5;
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

Verify design tokens match design.json source.

The CSS tokens reference design.json as their source throughout the comments. Please ensure the color ramps, spacing values, typography scales, and other tokens accurately reflect the values defined in landing/design.json.


🏁 Script executed:

#!/bin/bash
# Description: Verify design.json exists and compare key token values

echo "=== Checking if design.json exists ==="
fd -t f "design.json" landing/

echo -e "\n=== Extracting sample token values from design.json if it exists ==="
if [ -f "landing/design.json" ]; then
  echo "Primary color (should match --color-primary-500: #00A36C):"
  jq -r '.colors.accent.green // "not found"' landing/design.json
  
  echo -e "\nSpacing values (should match --spacing-* tokens):"
  jq -r '.spacing // "not found"' landing/design.json
  
  echo -e "\nTypography font family (should match Inter):"
  jq -r '.typography.fontFamily // "not found"' landing/design.json
else
  echo "design.json not found in landing directory"
fi

Length of output: 447


🏁 Script executed:

#!/bin/bash
# Description: Comprehensive verification of all design tokens

echo "=== Verifying Border Radius Tokens ==="
echo "CSS has: --border-radius-card: 16px; --border-radius-button: 9999px;"
jq -r '.borderRadius // "not found"' landing/design.json

echo -e "\n=== Verifying Shadow Token ==="
echo "CSS has: --shadow-card: 0 4px 24px rgba(0, 0, 0, 0.05);"
jq -r '.shadow // "not found"' landing/design.json

echo -e "\n=== Verifying Typography Scales ==="
echo "Font sizes in CSS:"
echo "  h1: 48px, h2: 32px, h3: 24px, body: 18px, caption: 14px"
jq -r '.typography.fontSize // "not found"' landing/design.json

echo -e "\n=== Verifying Line Heights ==="
echo "Line heights in CSS:"
echo "  h1: 1.2, h2: 1.3, h3: 1.4, body: 1.6, caption: 1.5"
jq -r '.typography.lineHeight // "not found"' landing/design.json

echo -e "\n=== Verifying Secondary Color Ramp (sample) ==="
echo "CSS --color-secondary-500: #4A4A4A"
jq -r '.colors.secondary["500"] // "not found"' landing/design.json

echo -e "\n=== Verifying Blue Color Ramp (sample) ==="
echo "CSS --color-blue-500: #5BA5D9"
jq -r '.colors.blue["500"] // "not found"' landing/design.json

echo -e "\n=== Verifying Illustration Colors ==="
echo "CSS has: sky-blue: #C9E7F5, sand: #F2C986, forest: #4B8C5A, cliff: #D1692D"
jq -r '.colors.illustration // "not found"' landing/design.json

echo -e "\n=== Full colors structure for detailed comparison ==="
jq -r '.colors // "not found"' landing/design.json

Length of output: 1198


CSS token comments incorrectly claim design.json as source for most tokens—design.json only contains base accent colors and text colors, not the extensive color ramps, border-radius, shadow, or typography tokens.

Verification shows design.json contains only:

  • Base accent colors (green, yellow, orange, blue)
  • Text color variants (primary, secondary, muted)
  • Illustration colors

The CSS file defines comprehensive color ramps (50–950 variants), border-radius, shadow, and typography scales—none of which exist in design.json. Comments throughout lines 7-119 incorrectly attribute these to design.json. Either update design.json with the complete token definitions or correct the CSS comments to remove the from design.json attribution for unsourced tokens.

Copy link

@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: 2

♻️ Duplicate comments (1)
landing/app/pages/index.vue (1)

51-51: Verify HeroCodeDemo component is now present.

The past review flagged this component as missing. According to the AI summary, HeroCodeDemo.vue should have been introduced in this PR at landing/app/components/HeroCodeDemo.vue. Please confirm the component file exists and is properly implemented.

#!/bin/bash
# Verify HeroCodeDemo component exists and check its basic structure

echo "=== Checking if HeroCodeDemo component exists ==="
fd -t f "HeroCodeDemo.vue" landing/app/components/

echo -e "\n=== Verifying component has valid Vue template ==="
rg -n "template|script|defineComponent" landing/app/components/HeroCodeDemo.vue 2>/dev/null || echo "Component not found or empty"
🧹 Nitpick comments (1)
landing/app/pages/index.vue (1)

81-82: Staggered animation implementation looks good.

The inline animation delay creates a nice staggered reveal effect. This approach is straightforward and works well.

If you prefer to avoid inline styles, you could use CSS custom properties:

-          :style="{ animationDelay: `${index * 100}ms` }"
+          :style="{ '--animation-delay': `${index * 100}ms` }"

Then in your CSS:

.animate-card {
  animation-delay: var(--animation-delay, 0ms);
}
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between edf5752 and a4ea3dd.

📒 Files selected for processing (1)
  • landing/app/pages/index.vue (2 hunks)
🔇 Additional comments (1)
landing/app/pages/index.vue (1)

62-62: CSS classes are properly defined.

The animate-section class is defined in landing/app/assets/css/main.css (line 217), along with the accompanying animate-card class (line 222) and its animation delay variants. Both classes referenced in the Vue component are correctly present in the expanded global styles.

Comment on lines +64 to +66
<CoreFeaturesIllustration v-if="section.title === 'Core Features'" />
<SpeedIllustration v-else-if="section.title === 'Built for Speed'" />
<ImagePlaceholder v-else />
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

String-based conditional rendering is fragile.

The conditional rendering relies on exact string matches of section.title, which couples component logic to user-facing content. If a content editor changes "Core Features" to "Key Features" in the YAML, the illustration will silently break and fall back to ImagePlaceholder.

Consider adding a dedicated identifier field (e.g., section.type or section.illustration) to the YAML schema instead of matching on display titles:

-      <CoreFeaturesIllustration v-if="section.title === 'Core Features'" />
-      <SpeedIllustration v-else-if="section.title === 'Built for Speed'" />
+      <CoreFeaturesIllustration v-if="section.illustration === 'core-features'" />
+      <SpeedIllustration v-else-if="section.illustration === 'speed'" />
       <ImagePlaceholder v-else />

Then update your YAML content to include:

sections:
  - title: "Core Features"
    illustration: "core-features"
    # ... other fields
🤖 Prompt for AI Agents
In landing/app/pages/index.vue around lines 64-66, the template currently uses
fragile string-based checks on section.title to choose illustrations; add and
use a dedicated field in the section data (e.g., section.illustration or
section.type) instead of matching display titles, update the YAML to include
that identifier for each section, and change the template conditionals to switch
on that new field (e.g., v-if="section.illustration === 'core-features'") so
presentation logic no longer depends on editable copy; ensure backward
compatibility by falling back to title-based checks only if the new field is
absent.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

Verify illustration components exist.

Please confirm that the newly referenced illustration components are present in the codebase:

  • CoreFeaturesIllustration.vue
  • SpeedIllustration.vue
  • ImagePlaceholder.vue

🏁 Script executed:

#!/bin/bash
# Verify all illustration components exist

echo "=== Checking for illustration components ==="
fd -t f "CoreFeaturesIllustration.vue|SpeedIllustration.vue|ImagePlaceholder.vue" landing/app/components/

echo -e "\n=== Listing all Vue components in landing/app/components/ ==="
fd -t f ".vue$" landing/app/components/ | head -20

Length of output: 602


Missing illustration components will cause runtime errors.

The code references CoreFeaturesIllustration and SpeedIllustration components that do not exist in landing/app/components/. Only ImagePlaceholder.vue exists. These missing components must be created or the conditional logic updated to handle all code paths with existing components.

Missing files:

  • landing/app/components/CoreFeaturesIllustration.vue
  • landing/app/components/SpeedIllustration.vue
🤖 Prompt for AI Agents
In landing/app/pages/index.vue lines 64-66, the template references
CoreFeaturesIllustration and SpeedIllustration which don't exist and will cause
runtime errors; either create
landing/app/components/CoreFeaturesIllustration.vue and
landing/app/components/SpeedIllustration.vue as simple SFCs (can delegate to the
existing ImagePlaceholder or include the intended SVG/markup) and export default
a component, or change the conditional to use only existing components (e.g.,
render ImagePlaceholder for those branches); also ensure the new components are
imported or registered where index.vue expects them so the template resolves
without errors.

@ahmedmawiri ahmedmawiri merged commit 397a1af into main Nov 17, 2025
2 of 3 checks passed
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.

3 participants