Skip to content

feat: CalmKernel website redesign — Dark Amber theme (Stitch AI)#5

Merged
ahm3t0t merged 6 commits intomainfrom
feat/stitch-redesign
Apr 4, 2026
Merged

feat: CalmKernel website redesign — Dark Amber theme (Stitch AI)#5
ahm3t0t merged 6 commits intomainfrom
feat/stitch-redesign

Conversation

@ahm3t0t
Copy link
Copy Markdown
Contributor

@ahm3t0t ahm3t0t commented Apr 4, 2026

Summary

Complete website redesign generated via Google Stitch MCP and refined for production.

Before → After

  • Old: Aiero IT Services template (Bootstrap, turquoise/red)
  • New: Custom dark amber theme (Tailwind CSS v4, glassmorphism, modern agency aesthetic)

What Changed

Design

  • Dark theme with amber/orange (#f59e0b) accent colors
  • Sora headlines + Inter body (self-hosted WOFF2, KVKK/GDPR compliant)
  • Glassmorphism product cards with hover effects
  • Terminal mockup for BigFive Updater section
  • Gradient CTA section
  • Mobile-responsive with hamburger menu

Technical

  • Tailwind CSS v4 with purged build (32KB vs ~300KB CDN)
  • Font Awesome icons (replaced Google Material Symbols)
  • Zero external font dependencies (no Google Fonts CDN)
  • Proper anchor navigation (#products, #open-source, #about)
  • Skip-to-content link for accessibility

Pages

  • index.html — TR landing page (new design)
  • en/index.html — EN landing page (new design)
  • index-old-aiero.html — Old design preserved as backup
  • stitch-reference.html — Original Stitch output for reference
  • src/input.css — Tailwind source CSS

Sections

  1. Hero — "Building the Future of Data Infrastructure"
  2. Products — DataWash, DataWatch, DataSuite
  3. Open Source — BigFive Updater with terminal mockup
  4. About — Turkish Engineering, Security First, Open Source DNA, AI-Powered
  5. CTA — meet@calmkernel.tr + social links
  6. Footer — Privacy, Tools, GitHub, LinkedIn

Stitch MCP Project

  • Project ID: 9648627339346328816
  • Design System: CalmKernel Dark Amber (Sora + Inter, Vibrant, #FF6B2C)
  • 7 screens generated (desktop + variants)

Rollback

Old design preserved as index-old-aiero.html. To rollback:

mv index.html index-stitch.html && mv index-old-aiero.html index.html
```"
<!-- devin-review-badge-begin -->

---

<a href="https://app.devin.ai/review/calmkerneltr/calmkerneltr.github.io/pull/5" target="_blank">
  <picture>
    <source media="(prefers-color-scheme: dark)" srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
    <img src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1" alt="Open with Devin">
  </picture>
</a>
<!-- devin-review-badge-end -->

ahm3t0t and others added 3 commits April 4, 2026 19:18
- New landing page design generated via Google Stitch MCP
- Tailwind CSS v4 with purged build (32KB vs 300KB CDN)
- Self-hosted Inter + Sora fonts (KVKK/GDPR compliant)
- Font Awesome icons (no Google Material Symbols dependency)
- Sections: Hero, Products, Open Source, About, CTA, Footer
- Mobile-responsive with hamburger menu
- Real links: GitHub, LinkedIn, email, privacy policy
- Stitch original HTML preserved as reference

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Old Aiero theme preserved as index-old-aiero.html
- index.html now serves the new dark amber design
- Tailwind CSS rebuilt for renamed file

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- en/index.html mirrors TR design with English content
- Language switcher: TR ↔ EN in nav
- Same dark amber theme, same sections
- CSS rebuilt for both pages

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 4, 2026

Warning

Rate limit exceeded

@ahm3t0t has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 9 minutes and 30 seconds before requesting another review.

Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 9 minutes and 30 seconds.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 7df8229b-0b01-4cfa-99e4-3beb9ef89a11

📥 Commits

Reviewing files that changed from the base of the PR and between c3f52f0 and 0371867.

📒 Files selected for processing (3)
  • assets/css/main.css
  • en/index.html
  • index.html
📝 Walkthrough

Walkthrough

The changes represent a comprehensive migration from Bootstrap to Tailwind CSS v4.2.2 framework, including new Tailwind stylesheet assets, restructured landing pages with simplified layouts, and updated color schemes. Multiple marketing and reference pages were added alongside the new styling infrastructure.

Changes

Cohort / File(s) Summary
Tailwind CSS Framework Setup
assets/css/main.css, src/input.css
New Tailwind CSS v4.2.2 stylesheet with precompiled utilities, theme tokens (fonts: Inter/Sora, colors: brand/charcoal), custom utility classes (glass-card, text-gradient), responsive breakpoints, and @font-face declarations for self-hosted fonts.
Landing Page Restructures
index.html, en/index.html
Major restructuring from Bootstrap to Tailwind-based layouts. Replaced legacy multi-section marketing structures (preloader, modal overlays, swiper sliders, FAQ/blog sections) with simplified fixed navigation, hero sections, product/ecosystem cards, open-source highlights, and minimal footers. Updated SEO metadata, removed legacy script bundles, and added inline mobile menu toggle logic.
Marketing & Reference Pages
stitch-reference.html, index-old-aiero.html
New static HTML pages: stitch-reference.html is a Tailwind-based dark-themed marketing layout with navigation, hero, product ecosystem, feature grids, and CTA sections; index-old-aiero.html is an archival Turkish landing page preserving legacy Bootstrap-based structure with swiper carousels, FAQ accordion, and multi-section content.
Cookie Consent Styling
assets/css/cookie-consent.css
Color palette update: replaced teal accent colors with amber/orange across banner border, link text, button backgrounds, and hover states.
Git Configuration
.gitignore
Added .gitmem/ directory to ignore list under Environment section.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 From Bootstrap chains to Tailwind's flight,
Our humble pages now shimmer bright,
With amber accents and Sora's grace,
A sleeker, simpler design takes place,
CalmKernel's heart beats fresh and true! 🌟

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: a complete website redesign transitioning from the old Aiero template to a new dark amber theme using Tailwind CSS, generated via Stitch AI.
Description check ✅ Passed The description is comprehensive and directly related to the changeset, explaining the design system overhaul, technical stack changes, new pages, and accessibility improvements introduced by the redesign.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/stitch-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.

Comment thread index.html
Comment on lines +58 to +60
<body class="bg-zinc-950 text-zinc-300 font-body antialiased">

<a href="#main-content" class="skip-link" style="position:absolute;left:-9999px;top:auto;width:1px;height:1px;overflow:hidden;z-index:9999;padding:8px;background:#f59e0b;color:#000;text-decoration:none;font-weight:bold;">İçeriğe atla</a>
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[Severity 7] Missing cookie consent / KVKK banner

The previous design included assets/css/cookie-consent.css and an active cookie consent mechanism. The new design removes it entirely — no cookie banner is present on the page.

The "Security First" section on this very page states "Fully KVKK and GDPR compliant," but if the site uses any cookies (analytics, session tracking, etc.), the absence of a consent UI is a KVKK/GDPR compliance risk.

Before merging, please confirm:

  1. Does the site set any cookies at all (including via server-side or third-party scripts)?
  2. If yes, the cookie consent mechanism must be reinstated.
  3. If no cookies are used, it would be good to document this explicitly (e.g., in the privacy policy) so this isn't flagged in future audits.

The old cookie consent CSS/JS was deliberately built in PR #2 — intentionally removing it here without a replacement or explicit decision to drop cookies should be called out.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 9824dad5d6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread assets/css/main.css Outdated
@@ -0,0 +1,2 @@
/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-500:oklch(63.7% .237 25.331);--color-orange-600:oklch(64.6% .222 41.116);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-900:oklch(41.4% .112 45.904);--color-green-500:oklch(72.3% .219 149.579);--color-blue-400:oklch(70.7% .165 254.624);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-zinc-950:oklch(14.1% .005 285.823);--color-white:#fff;--spacing:.25rem;--container-2xl:42rem;--container-4xl:56rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--text-7xl:4.5rem;--text-7xl--line-height:1;--font-weight-light:300;--font-weight-medium:500;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--tracking-tighter:-.05em;--tracking-tight:-.025em;--tracking-widest:.1em;--leading-tight:1.25;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--radius-4xl:2rem;--blur-md:12px;--blur-3xl:64px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--font-headline:"Sora", sans-serif;--font-body:"Inter", sans-serif}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.-inset-4{inset:calc(var(--spacing) * -4)}.inset-0{inset:calc(var(--spacing) * 0)}.-start{inset-inline-start:calc(var(--spacing) * -1)}.start{inset-inline-start:var(--spacing)}.-end{inset-inline-end:calc(var(--spacing) * -1)}.end{inset-inline-end:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.z-10{z-index:10}.z-50{z-index:50}.col-auto{grid-column:auto}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.m-0{margin:calc(var(--spacing) * 0)}.mx-8{margin-inline:calc(var(--spacing) * 8)}.mx-auto{margin-inline:auto}.mb-0{margin-bottom:calc(var(--spacing) * 0)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-12{margin-bottom:calc(var(--spacing) * 12)}.mb-16{margin-bottom:calc(var(--spacing) * 16)}.mb-20{margin-bottom:calc(var(--spacing) * 20)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-1{height:calc(var(--spacing) * 1)}.h-3{height:calc(var(--spacing) * 3)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-20{height:calc(var(--spacing) * 20)}.h-full{height:100%}.h-px{height:1px}.w-3{width:calc(var(--spacing) * 3)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-\[65\%\]{width:65%}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-7xl{max-width:var(--container-7xl)}.shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.border-collapse{border-collapse:collapse}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.resize{resize:both}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-16{gap:calc(var(--spacing) * 16)}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.-space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * -2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * -2) * calc(1 - var(--tw-space-x-reverse)))}.self-center{align-self:center}.overflow-hidden{overflow:hidden}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-amber-500{border-color:var(--color-amber-500)}.border-zinc-700{border-color:var(--color-zinc-700)}.border-zinc-800{border-color:var(--color-zinc-800)}.border-zinc-800\/50{border-color:#27272a80}@supports (color:color-mix(in lab, red, red)){.border-zinc-800\/50{border-color:color-mix(in oklab, var(--color-zinc-800) 50%, transparent)}}.border-zinc-900{border-color:var(--color-zinc-900)}.border-zinc-950{border-color:var(--color-zinc-950)}.border-t-amber-500\/20{border-top-color:#f99c0033}@supports (color:color-mix(in lab, red, red)){.border-t-amber-500\/20{border-top-color:color-mix(in oklab, var(--color-amber-500) 20%, transparent)}}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/10{background-color:color-mix(in oklab, var(--color-amber-500) 10%, transparent)}}.bg-amber-500\/50{background-color:#f99c0080}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/50{background-color:color-mix(in oklab, var(--color-amber-500) 50%, transparent)}}.bg-green-500\/50{background-color:#00c75880}@supports (color:color-mix(in lab, red, red)){.bg-green-500\/50{background-color:color-mix(in oklab, var(--color-green-500) 50%, transparent)}}.bg-red-500\/50{background-color:#fb2c3680}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/50{background-color:color-mix(in oklab, var(--color-red-500) 50%, transparent)}}.bg-zinc-800{background-color:var(--color-zinc-800)}.bg-zinc-900{background-color:var(--color-zinc-900)}.bg-zinc-900\/30{background-color:#18181b4d}@supports (color:color-mix(in lab, red, red)){.bg-zinc-900\/30{background-color:color-mix(in oklab, var(--color-zinc-900) 30%, transparent)}}.bg-zinc-950{background-color:var(--color-zinc-950)}.bg-zinc-950\/20{background-color:#09090b33}@supports (color:color-mix(in lab, red, red)){.bg-zinc-950\/20{background-color:color-mix(in oklab, var(--color-zinc-950) 20%, transparent)}}.bg-zinc-950\/80{background-color:#09090bcc}@supports (color:color-mix(in lab, red, red)){.bg-zinc-950\/80{background-color:color-mix(in oklab, var(--color-zinc-950) 80%, transparent)}}.bg-zinc-950\/95{background-color:#09090bf2}@supports (color:color-mix(in lab, red, red)){.bg-zinc-950\/95{background-color:color-mix(in oklab, var(--color-zinc-950) 95%, transparent)}}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-\[radial-gradient\(circle_at_50\%_50\%\,rgba\(245\,158\,11\,0\.08\)\,transparent_50\%\)\]{background-image:radial-gradient(circle,#f59e0b14,#0000 50%)}.bg-\[url\(\'https\:\/\/www\.transparenttextures\.com\/patterns\/carbon-fibre\.png\'\)\]{background-image:url(https://www.transparenttextures.com/patterns/carbon-fibre.png)}.from-amber-500{--tw-gradient-from:var(--color-amber-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-amber-600{--tw-gradient-to:var(--color-amber-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-orange-600{--tw-gradient-to:var(--color-orange-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.p-12{padding:calc(var(--spacing) * 12)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-24{padding-block:calc(var(--spacing) * 24)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-32{padding-top:calc(var(--spacing) * 32)}.pb-1{padding-bottom:calc(var(--spacing) * 1)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pb-20{padding-bottom:calc(var(--spacing) * 20)}.text-center{text-align:center}.font-body{font-family:var(--font-body)}.font-headline{font-family:var(--font-headline)}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-tighter{--tw-tracking:var(--tracking-tighter);letter-spacing:var(--tracking-tighter)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-amber-400{color:var(--color-amber-400)}.text-amber-500{color:var(--color-amber-500)}.text-blue-400{color:var(--color-blue-400)}.text-green-500{color:var(--color-green-500)}.text-white{color:var(--color-white)}.text-zinc-300{color:var(--color-zinc-300)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-600{color:var(--color-zinc-600)}.text-zinc-700{color:var(--color-zinc-700)}.text-zinc-950{color:var(--color-zinc-950)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.decoration-zinc-950\/30{text-decoration-color:#09090b4d}@supports (color:color-mix(in lab, red, red)){.decoration-zinc-950\/30{-webkit-text-decoration-color:color-mix(in oklab, var(--color-zinc-950) 30%, transparent);-webkit-text-decoration-color:color-mix(in oklab, var(--color-zinc-950) 30%, transparent);text-decoration-color:color-mix(in oklab, var(--color-zinc-950) 30%, transparent)}}.underline-offset-8{text-underline-offset:8px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-10{opacity:.1}.opacity-80{opacity:.8}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-amber-500\/20{--tw-shadow-color:#f99c0033}@supports (color:color-mix(in lab, red, red)){.shadow-amber-500\/20{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-amber-500) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-amber-900\/10{--tw-shadow-color:#7b33061a}@supports (color:color-mix(in lab, red, red)){.shadow-amber-900\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-amber-900) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.blur-3xl{--tw-blur:blur(var(--blur-3xl));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.backface-hidden{backface-visibility:hidden}@media (hover:hover){.group-hover\:scale-110:is(:where(.group):hover *){--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:border-amber-500\/50:hover{border-color:#f99c0080}@supports (color:color-mix(in lab, red, red)){.hover\:border-amber-500\/50:hover{border-color:color-mix(in oklab, var(--color-amber-500) 50%, transparent)}}.hover\:bg-amber-600:hover{background-color:var(--color-amber-600)}.hover\:bg-white:hover{background-color:var(--color-white)}.hover\:bg-zinc-900:hover{background-color:var(--color-zinc-900)}.hover\:bg-zinc-900\/50:hover{background-color:#18181b80}@supports (color:color-mix(in lab, red, red)){.hover\:bg-zinc-900\/50:hover{background-color:color-mix(in oklab, var(--color-zinc-900) 50%, transparent)}}.hover\:text-amber-400:hover{color:var(--color-amber-400)}.hover\:text-amber-600:hover{color:var(--color-amber-600)}.hover\:text-white:hover{color:var(--color-white)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.hover\:shadow-amber-500\/20:hover{--tw-shadow-color:#f99c0033}@supports (color:color-mix(in lab, red, red)){.hover\:shadow-amber-500\/20:hover{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-amber-500) 20%, transparent) var(--tw-shadow-alpha), transparent)}}}.active\:scale-95:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}@media (min-width:40rem){.sm\:inline{display:inline}.sm\:w-auto{width:auto}.sm\:flex-row{flex-direction:row}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.sm\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.sm\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}}@media (min-width:48rem){.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:inline{display:inline}.md\:w-auto{width:auto}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-start{align-items:flex-start}.md\:gap-8{gap:calc(var(--spacing) * 8)}.md\:p-24{padding:calc(var(--spacing) * 24)}.md\:px-8{padding-inline:calc(var(--spacing) * 8)}.md\:pt-48{padding-top:calc(var(--spacing) * 48)}.md\:pb-32{padding-bottom:calc(var(--spacing) * 32)}.md\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.md\:text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.md\:text-7xl{font-size:var(--text-7xl);line-height:var(--tw-leading,var(--text-7xl--line-height))}.md\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}@media (min-width:64rem){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}}@font-face{font-family:Inter;font-style:normal;font-weight:300;font-display:swap;src:url(../assets/fonts/Inter-Light.woff2)format("woff2")}@font-face{font-family:Inter;font-style:normal;font-weight:400;font-display:swap;src:url(../assets/fonts/Inter-Regular.woff2)format("woff2")}@font-face{font-family:Inter;font-style:normal;font-weight:500;font-display:swap;src:url(../assets/fonts/Inter-Medium.woff2)format("woff2")}@font-face{font-family:Inter;font-style:normal;font-weight:600;font-display:swap;src:url(../assets/fonts/Inter-SemiBold.woff2)format("woff2")}@font-face{font-family:Inter;font-style:normal;font-weight:700;font-display:swap;src:url(../assets/fonts/Inter-Bold.woff2)format("woff2")}@font-face{font-family:Sora;font-style:normal;font-weight:100 800;font-display:swap;src:url(../assets/fonts/sora-latin.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Sora;font-style:normal;font-weight:100 800;font-display:swap;src:url(../assets/fonts/sora-latin-ext.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}.glass-card{-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);background:#18181b99;border:1px solid #ffffff0d}.text-gradient{-webkit-text-fill-color:transparent;background:linear-gradient(to bottom right,#fff,#a1a1aa);-webkit-background-clip:text}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1} No newline at end of file
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Correct @font-face paths in generated CSS

The new @font-face rules point to src:url(../assets/fonts/...), but this stylesheet is served as /assets/css/main.css, so those relative URLs resolve to /assets/assets/fonts/... and return 404. That means Inter/Sora never load on the redesigned pages and browsers fall back to default fonts. Use paths resolved from /assets/css/ (for example ../fonts/... or absolute /assets/fonts/...).

Useful? React with 👍 / 👎.

Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request overhauls the project's landing pages for both English and Turkish locales, transitioning to a modern, streamlined design powered by Tailwind CSS. The content is updated to reflect a new focus on enterprise data infrastructure platforms, including DataWash, DataWatch, and DataSuite. Key feedback focuses on correcting font paths in the source CSS to prevent loading issues, completing the localization of the Turkish page, and enhancing the mobile navigation menu with better accessibility attributes and UX refinements. It is also recommended to use root-relative paths for static assets to ensure reliability across different directory levels.

Comment thread src/input.css Outdated
font-style: normal;
font-weight: 300;
font-display: swap;
src: url("../assets/fonts/Inter-Light.woff2") format("woff2");
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

high

The font paths in the source CSS seem to be causing incorrect relative paths in the built assets/css/main.css. In the generated file, the path is ../assets/fonts/, which resolves to assets/assets/fonts/ if the CSS is in assets/css/. This will prevent fonts from loading. Please adjust the paths to be relative to the output directory.

  src: url("../fonts/Inter-Light.woff2") format("woff2");

Comment thread index.html
Comment on lines +98 to +101
<h1 class="text-4xl sm:text-5xl md:text-7xl font-extrabold font-headline text-white mb-6 leading-tight tracking-tight">
Building the Future of<br/>
<span class="text-amber-500">Data Infrastructure</span>
</h1>
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

high

The Turkish landing page (index.html) contains a significant amount of untranslated English content in the Hero, Products, and About sections. To maintain a professional localized experience, all user-facing text should be translated into Turkish.

Suggested change
<h1 class="text-4xl sm:text-5xl md:text-7xl font-extrabold font-headline text-white mb-6 leading-tight tracking-tight">
Building the Future of<br/>
<span class="text-amber-500">Data Infrastructure</span>
</h1>
<h1 class="text-4xl sm:text-5xl md:text-7xl font-extrabold font-headline text-white mb-6 leading-tight tracking-tight">
Veri Altyapısının<br/>
<span class="text-amber-500">Geleceğini İnşa Ediyoruz</span>
</h1>

Comment thread en/index.html Outdated
Comment on lines +331 to +333
document.getElementById('mobileMenuBtn').addEventListener('click', function() {
document.getElementById('mobileMenu').classList.toggle('hidden');
});
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

The mobile menu toggle script is missing accessibility attributes and UX refinements. Specifically, it should toggle aria-expanded on the button and aria-hidden on the menu. Additionally, the menu should automatically close when an anchor link is clicked to improve the user experience on mobile.

    const menuBtn = document.getElementById('mobileMenuBtn');
    const menu = document.getElementById('mobileMenu');
    menuBtn.addEventListener('click', () => {
      const isHidden = menu.classList.toggle('hidden');
      menuBtn.setAttribute('aria-expanded', !isHidden);
      menu.setAttribute('aria-hidden', isHidden);
    });
    menu.querySelectorAll('a').forEach(link => {
      link.addEventListener('click', () => {
        menu.classList.add('hidden');
        menuBtn.setAttribute('aria-expanded', 'false');
        menu.setAttribute('aria-hidden', 'true');
      });
    });

Comment thread index.html Outdated
Comment on lines +52 to +55
<link rel="stylesheet" href="assets/css/main.css"/>

<!-- Font Awesome (async) -->
<link rel="stylesheet" href="assets/css/font-awesome.min.css" media="print" onload="this.media='all'"/>
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

For consistency and robustness across different environments (especially when pages are in subdirectories like /en/), it is recommended to use root-relative paths (starting with /) for all static assets.

Suggested change
<link rel="stylesheet" href="assets/css/main.css"/>
<!-- Font Awesome (async) -->
<link rel="stylesheet" href="assets/css/font-awesome.min.css" media="print" onload="this.media='all'"/>
<link rel="stylesheet" href="/assets/css/main.css"/>
<!-- Font Awesome (async) -->
<link rel="stylesheet" href="/assets/css/font-awesome.min.css" media="print" onload="this.media='all'"/>

Comment thread index.html Outdated
Comment on lines +78 to +84
<button id="mobileMenuBtn" class="md:hidden text-white text-xl" aria-label="Menüyü aç">
<i class="fa fa-bars"></i>
</button>
</div>
</div>
<!-- End Preloader -->

<button id="themeBtn"><i class="far fa-moon"></i></button>
<div class="video-modal">
<div class="video-modal-content">
<span class="close-btn">&times;</span>
<iframe allow="autoplay; encrypted-media" allowfullscreen></iframe>
</div>
<!-- Mobile menu -->
<div id="mobileMenu" class="hidden md:hidden bg-zinc-950/95 backdrop-blur-md border-t border-zinc-800 px-6 pb-6">
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

The mobile menu button and container are missing critical accessibility attributes. Adding aria-expanded, aria-controls, and aria-hidden ensures that screen readers can correctly interpret the state of the navigation menu.

Suggested change
<button id="mobileMenuBtn" class="md:hidden text-white text-xl" aria-label="Menüyü aç">
<i class="fa fa-bars"></i>
</button>
</div>
</div>
<!-- End Preloader -->
<button id="themeBtn"><i class="far fa-moon"></i></button>
<div class="video-modal">
<div class="video-modal-content">
<span class="close-btn">&times;</span>
<iframe allow="autoplay; encrypted-media" allowfullscreen></iframe>
</div>
<!-- Mobile menu -->
<div id="mobileMenu" class="hidden md:hidden bg-zinc-950/95 backdrop-blur-md border-t border-zinc-800 px-6 pb-6">
<button id="mobileMenuBtn" class="md:hidden text-white text-xl" aria-label="Menüyü aç" aria-expanded="false" aria-controls="mobileMenu">
<i class="fa fa-bars"></i>
</button>
</div>
</div>
<!-- Mobile menu -->
<div id="mobileMenu" class="hidden md:hidden bg-zinc-950/95 backdrop-blur-md border-t border-zinc-800 px-6 pb-6" aria-hidden="true">

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: 5

🧹 Nitpick comments (2)
index-new.html (1)

6-57: Avoid publishing a second copy of the landing page.

This is another full root-level landing page with production metadata and the same canonical target as /. If it is only a staging artifact, keeping it in the web root invites accidental indexing and content drift alongside index.html.

Move it out of the published artifact, or add a noindex guard if you need to keep it in the repository.

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

In `@index-new.html` around lines 6 - 57, This file is a duplicate production
landing page (index-new.html) that risks accidental indexing; either remove it
from the published web root or add a noindex guard. To fix: if this is a staging
artifact, move or exclude index-new.html from the deployed assets (remove from
build/publish list); otherwise add a robots noindex meta tag (<meta
name="robots" content="noindex">) near the existing meta tags and change the
canonical/link alternates to point to a non-production preview URL or remove
them so it cannot claim the same canonical as index.html; locate the edits
around the title/og/canonical blocks and the JSON-LD block in index-new.html.
index-old-aiero.html (1)

9-73: Archive pages should not stay indexable in the public root.

As a rollback copy this is useful, but keeping it as a standalone root HTML page leaves the old site publicly reachable with live metadata and assets. That creates a stale entry point even after the redesign ships.

Move it outside the published artifact, or add a noindex guard if it must stay in the repository.

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

In `@index-old-aiero.html` around lines 9 - 73, The archive HTML
(index-old-aiero.html) is currently indexable via its <head> metadata and public
assets; either remove/move this rollback file out of the published artifact or
add a noindex guard in the <head> to prevent indexing (e.g., insert a <meta
name="robots" content="noindex"> and/or X-Robots-Tag on responses), and ensure
any canonical/og/twitter tags are removed or updated so search engines and
social previews won't treat this page as live.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@en/index.html`:
- Line 60: The skip link is permanently moved off-screen (left:-9999px) so it
remains invisible when focused; update the styling for the element with class
"skip-link" (the <a> anchor) to keep it visually hidden by default but bring it
into view when focused—add a :focus (and :active) CSS rule that resets
left/top/width/height or uses transform/clip to position it on-screen (e.g.,
left/top to a visible offset, restore width/height/overflow) so keyboard users
can see and use the link when tabbing.

In `@index.html`:
- Around line 6-7: Page at lang="tr" still contains English strings; update the
Turkish variant by translating the <title> element, the <meta
name="description"> content, navigation labels, hero headline/body, and primary
CTA text into Turkish so the root (/) is a proper TR mirror of the /en/ page;
look for the HTML elements <title>, <meta name="description">, nav links
(navigation labels), the hero section (headline/paragraph), and the main CTA
button text and replace their English copy with the correct Turkish equivalents
used elsewhere in the project.
- Line 60: The skip link anchor (<a href="#main-content" class="skip-link">) is
visually hidden via an inline style left:-9999px even on focus; add CSS to make
.skip-link visible when focused (e.g., override the off-screen positioning on
:focus or :focus-visible to bring it into view, restore width/height/left/top
and any padding/background so keyboard users can see and use it) and remove or
adjust the inline positioning so the :focus rule takes effect.

In `@src/input.css`:
- Around line 17-18: The font `@font-face` src URLs are written relative to the
source file and produce paths like /assets/assets/fonts/... in the emitted
assets/css/main.css; update each src: url("...") entry (e.g., the lines
referencing Inter-Light.woff2, Inter-Regular.woff2, Inter-Medium.woff2,
Inter-SemiBold.woff2, Inter-Bold.woff2, Inter-ExtraBold.woff2) so they point
from the built CSS location to the fonts directory (use ../fonts/Inter-*.woff2
or an absolute /assets/fonts/Inter-*.woff2) so the compiled assets/css/main.css
resolves to /assets/fonts/... instead of /assets/assets/fonts/....

In `@stitch-reference.html`:
- Around line 7-10: stitch-reference.html currently pulls Tailwind via the CDN
and includes Google Fonts/Material Symbols (with Material Symbols linked twice),
which reintroduces third-party requests; either remove it from publishing by
adding stitch-reference.html to .gitignore (or your deploy exclude list) OR
update the file to use the same local assets as index.html/en/index.html:
replace the CDN <script> and external <link> tags with the local
assets/css/main.css and the Font Awesome/local icon approach, and remove the
duplicate Material Symbols <link> entry so only the local asset references
remain.

---

Nitpick comments:
In `@index-new.html`:
- Around line 6-57: This file is a duplicate production landing page
(index-new.html) that risks accidental indexing; either remove it from the
published web root or add a noindex guard. To fix: if this is a staging
artifact, move or exclude index-new.html from the deployed assets (remove from
build/publish list); otherwise add a robots noindex meta tag (<meta
name="robots" content="noindex">) near the existing meta tags and change the
canonical/link alternates to point to a non-production preview URL or remove
them so it cannot claim the same canonical as index.html; locate the edits
around the title/og/canonical blocks and the JSON-LD block in index-new.html.

In `@index-old-aiero.html`:
- Around line 9-73: The archive HTML (index-old-aiero.html) is currently
indexable via its <head> metadata and public assets; either remove/move this
rollback file out of the published artifact or add a noindex guard in the <head>
to prevent indexing (e.g., insert a <meta name="robots" content="noindex">
and/or X-Robots-Tag on responses), and ensure any canonical/og/twitter tags are
removed or updated so search engines and social previews won't treat this page
as live.
🪄 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: 8095ef5c-4ba1-482a-acd6-233bf3641c04

📥 Commits

Reviewing files that changed from the base of the PR and between e67d6d7 and 9824dad.

⛔ Files ignored due to path filters (5)
  • assets/fonts/Inter-Bold.woff2 is excluded by !**/*.woff2
  • assets/fonts/Inter-Light.woff2 is excluded by !**/*.woff2
  • assets/fonts/Inter-Medium.woff2 is excluded by !**/*.woff2
  • assets/fonts/Inter-Regular.woff2 is excluded by !**/*.woff2
  • assets/fonts/Inter-SemiBold.woff2 is excluded by !**/*.woff2
📒 Files selected for processing (8)
  • .gitignore
  • assets/css/main.css
  • en/index.html
  • index-new.html
  • index-old-aiero.html
  • index.html
  • src/input.css
  • stitch-reference.html
📜 Review details
🧰 Additional context used
🪛 Stylelint (17.6.0)
assets/css/main.css

[error] 2-2: Unexpected duplicate "-webkit-text-decoration" (declaration-block-no-duplicate-properties)

(declaration-block-no-duplicate-properties)


[error] 2-2: Unexpected duplicate "-webkit-text-decoration" (declaration-block-no-duplicate-properties)

(declaration-block-no-duplicate-properties)


[error] 2-2: Unexpected duplicate "-webkit-text-decoration-color" (declaration-block-no-duplicate-properties)

(declaration-block-no-duplicate-properties)


[error] 2-2: Expected "button" to be "auto" (declaration-property-value-keyword-no-deprecated)

(declaration-property-value-keyword-no-deprecated)


[error] 2-2: Expected "button" to be "auto" (declaration-property-value-keyword-no-deprecated)

(declaration-property-value-keyword-no-deprecated)


[error] 2-2: Expected quotes around "url" function argument (function-url-quotes)

(function-url-quotes)


[error] 2-2: Expected quotes around "url" function argument (function-url-quotes)

(function-url-quotes)


[error] 2-2: Expected quotes around "url" function argument (function-url-quotes)

(function-url-quotes)


[error] 2-2: Expected quotes around "url" function argument (function-url-quotes)

(function-url-quotes)


[error] 2-2: Expected quotes around "url" function argument (function-url-quotes)

(function-url-quotes)


[error] 2-2: Expected quotes around "url" function argument (function-url-quotes)

(function-url-quotes)


[error] 2-2: Expected quotes around "url" function argument (function-url-quotes)

(function-url-quotes)


[error] 2-2: Expected quotes around "url" function argument (function-url-quotes)

(function-url-quotes)


[error] 2-2: Expected "SFMono-Regular" to be "sfmono-regular" (value-keyword-case)

(value-keyword-case)


[error] 2-2: Expected "Menlo" to be "menlo" (value-keyword-case)

(value-keyword-case)


[error] 2-2: Expected "Monaco" to be "monaco" (value-keyword-case)

(value-keyword-case)


[error] 2-2: Expected "Consolas" to be "consolas" (value-keyword-case)

(value-keyword-case)


[error] 2-2: Expected "currentColor" to be "currentcolor" (value-keyword-case)

(value-keyword-case)

src/input.css

[error] 13-13: Unexpected quotes around "Inter" (font-family-name-quotes)

(font-family-name-quotes)


[error] 20-20: Unexpected quotes around "Inter" (font-family-name-quotes)

(font-family-name-quotes)


[error] 27-27: Unexpected quotes around "Inter" (font-family-name-quotes)

(font-family-name-quotes)


[error] 34-34: Unexpected quotes around "Inter" (font-family-name-quotes)

(font-family-name-quotes)


[error] 41-41: Unexpected quotes around "Inter" (font-family-name-quotes)

(font-family-name-quotes)


[error] 50-50: Unexpected quotes around "Sora" (font-family-name-quotes)

(font-family-name-quotes)


[error] 60-60: Unexpected quotes around "Sora" (font-family-name-quotes)

(font-family-name-quotes)


[error] 3-3: Unexpected unknown at-rule "@theme" (scss/at-rule-no-unknown)

(scss/at-rule-no-unknown)

🔇 Additional comments (1)
.gitignore (1)

23-24: Looks good — .gitmem/ is appropriately ignored.

This aligns with the existing ignore policy and keeps local environment/memory artifacts out of version control.

Comment thread en/index.html
</div>
<body class="bg-zinc-950 text-zinc-300 font-body antialiased">

<a href="#main-content" class="skip-link" style="position:absolute;left:-9999px;top:auto;width:1px;height:1px;overflow:hidden;z-index:9999;padding:8px;background:#f59e0b;color:#000;text-decoration:none;font-weight:bold;">Skip to content</a>
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 | 🟠 Major

Make the skip link visible on focus.

The link stays at left:-9999px even when focused, so keyboard users can tab to it but cannot actually see or use the shortcut.

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

In `@en/index.html` at line 60, The skip link is permanently moved off-screen
(left:-9999px) so it remains invisible when focused; update the styling for the
element with class "skip-link" (the <a> anchor) to keep it visually hidden by
default but bring it into view when focused—add a :focus (and :active) CSS rule
that resets left/top/width/height or uses transform/clip to position it
on-screen (e.g., left/top to a visible offset, restore width/height/overflow) so
keyboard users can see and use the link when tabbing.

Comment thread index.html
Comment thread index.html
</div>
<body class="bg-zinc-950 text-zinc-300 font-body antialiased">

<a href="#main-content" class="skip-link" style="position:absolute;left:-9999px;top:auto;width:1px;height:1px;overflow:hidden;z-index:9999;padding:8px;background:#f59e0b;color:#000;text-decoration:none;font-weight:bold;">İçeriğe atla</a>
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 | 🟠 Major

Make the skip link visible on focus.

The link stays at left:-9999px even when focused, so keyboard users can tab to it but cannot actually see or use the shortcut.

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

In `@index.html` at line 60, The skip link anchor (<a href="#main-content"
class="skip-link">) is visually hidden via an inline style left:-9999px even on
focus; add CSS to make .skip-link visible when focused (e.g., override the
off-screen positioning on :focus or :focus-visible to bring it into view,
restore width/height/left/top and any padding/background so keyboard users can
see and use it) and remove or adjust the inline positioning so the :focus rule
takes effect.

Comment thread src/input.css Outdated
Comment thread stitch-reference.html
Comment on lines +7 to +10
<script src="https://cdn.tailwindcss.com?plugins=forms,container-queries"></script>
<link href="https://fonts.googleapis.com/css2?family=Sora:wght@400;600;700;800&amp;family=Inter:wght@300;400;500;600&amp;display=swap" rel="stylesheet"/>
<link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&amp;display=swap" rel="stylesheet"/>
<link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&amp;display=swap" rel="stylesheet"/>
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 | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

# Find the stitch-reference.html file
fd "stitch-reference.html" --type f

Repository: CalmKernelTR/calmkerneltr.github.io

Length of output: 100


🏁 Script executed:

# Check for build/deployment configuration files
fd -e "package.json" -e "build.js" -e "vite.config" -e "webpack.config" -e "next.config" -e ".gitignore" -e "Makefile" --type f | head -20

Repository: CalmKernelTR/calmkerneltr.github.io

Length of output: 61


🏁 Script executed:

# Look for index.html files
fd "index.html" --type f

Repository: CalmKernelTR/calmkerneltr.github.io

Length of output: 103


🏁 Script executed:

# Check stitch-reference.html line count and read lines 1-20
wc -l stitch-reference.html && head -20 stitch-reference.html

Repository: CalmKernelTR/calmkerneltr.github.io

Length of output: 1088


🏁 Script executed:

# Check index.html line count and read first 30 lines
wc -l index.html && head -30 index.html

Repository: CalmKernelTR/calmkerneltr.github.io

Length of output: 1768


🏁 Script executed:

# Check for deployment/build config
find . -name ".gitignore" -o -name "package.json" -o -name ".github" -type d | head -5

Repository: CalmKernelTR/calmkerneltr.github.io

Length of output: 101


🏁 Script executed:

# Read index.html to see CSS/font handling (around line 30-60)
sed -n '30,70p' index.html

Repository: CalmKernelTR/calmkerneltr.github.io

Length of output: 2146


🏁 Script executed:

# Read en/index.html first 30 lines to see its approach
head -30 en/index.html

Repository: CalmKernelTR/calmkerneltr.github.io

Length of output: 1761


🏁 Script executed:

# Check .gitignore for excluded files
cat .gitignore

Repository: CalmKernelTR/calmkerneltr.github.io

Length of output: 258


🏁 Script executed:

# Check GitHub workflows for build/deploy config
find .github -type f -name "*.yml" -o -name "*.yaml" | xargs cat 2>/dev/null

Repository: CalmKernelTR/calmkerneltr.github.io

Length of output: 1765


🏁 Script executed:

# Check if there are any other HTML files and their purpose
find . -name "*.html" -type f | sort

Repository: CalmKernelTR/calmkerneltr.github.io

Length of output: 429


🏁 Script executed:

# Look for any README or documentation about stitch-reference.html
find . -name "README*" -o -name "*.md" | xargs grep -l "stitch-reference" 2>/dev/null

Repository: CalmKernelTR/calmkerneltr.github.io

Length of output: 63


🏁 Script executed:

# Check git history to understand purpose of stitch-reference.html
git log --oneline -5 -- stitch-reference.html 2>/dev/null || echo "No git history available"

Repository: CalmKernelTR/calmkerneltr.github.io

Length of output: 131


🏁 Script executed:

# Check if there's a build script or deploy config in package.json
cat package.json 2>/dev/null || echo "No package.json found"

Repository: CalmKernelTR/calmkerneltr.github.io

Length of output: 100


🏁 Script executed:

# Look for any documentation or comments in stitch-reference.html about its purpose
head -50 stitch-reference.html | tail -30

Repository: CalmKernelTR/calmkerneltr.github.io

Length of output: 893


🏁 Script executed:

# Check if there are any static site generator configs (Jekyll, Hugo, etc.)
find . -maxdepth 2 -name "_config.yml" -o -name "config.toml" -o -name "hugo.toml" 2>/dev/null

Repository: CalmKernelTR/calmkerneltr.github.io

Length of output: 61


🏁 Script executed:

# Check assets/css directory to understand the built CSS approach
ls -la assets/css/ 2>/dev/null

Repository: CalmKernelTR/calmkerneltr.github.io

Length of output: 726


Exclude stitch-reference.html from the published site or align it with local CSS/fonts.

This file loads Tailwind from CDN plus Google Fonts and Material Symbols, and includes the Material Symbols stylesheet twice. Since it's tracked in git and not explicitly excluded from deployment, it will be served by GitHub Pages, which reintroduces the third-party requests and privacy concerns the rest of the PR eliminates. Either add it to .gitignore or update it to use the local assets/css/main.css and Font Awesome approach already in place for index.html and en/index.html.

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

In `@stitch-reference.html` around lines 7 - 10, stitch-reference.html currently
pulls Tailwind via the CDN and includes Google Fonts/Material Symbols (with
Material Symbols linked twice), which reintroduces third-party requests; either
remove it from publishing by adding stitch-reference.html to .gitignore (or your
deploy exclude list) OR update the file to use the same local assets as
index.html/en/index.html: replace the CDN <script> and external <link> tags with
the local assets/css/main.css and the Font Awesome/local icon approach, and
remove the duplicate Material Symbols <link> entry so only the local asset
references remain.

ahm3t0t and others added 2 commits April 4, 2026 19:35
P1 fixes:
- Fix font paths in src/input.css (../assets/fonts → ../fonts)
- Translate all English content to Turkish in index.html
- Add cookie consent banner (KVKK) with amber theme colors

P2 fixes:
- Add aria-expanded, aria-controls, aria-hidden to mobile menu
- Auto-close mobile menu on link click
- Use root-relative paths for assets (/assets/...)

Resolves feedback from: Blocks, Codex, Gemini Code Assist

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Stats row had 7 children in grid-cols-4 causing layout break.
Removed 3 hidden divider elements, replaced with CSS divide-x.
Applied to both TR and EN pages.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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: 1

♻️ Duplicate comments (1)
index.html (1)

16-16: ⚠️ Potential issue | 🟡 Minor

OG and Twitter titles are also English.

For consistent Turkish SEO/social sharing, these should match the translated title.

🌐 Suggested diff
-  <meta property="og:title" content="CalmKernel — Building the Future of Data Infrastructure"/>
+  <meta property="og:title" content="CalmKernel — Veri Altyapısının Geleceğini İnşa Ediyoruz"/>

Also apply to line 24:

-  <meta name="twitter:title" content="CalmKernel — Building the Future of Data Infrastructure"/>
+  <meta name="twitter:title" content="CalmKernel — Veri Altyapısının Geleceğini İnşa Ediyoruz"/>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@index.html` at line 16, The Open Graph and Twitter title meta tags are still
English; update the content of the meta property="og:title" and the
corresponding meta name="twitter:title" tags to use the translated Turkish title
(the same text used for the page title translation) so social previews and SEO
reflect the Turkish title consistently.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@index.html`:
- Line 6: The page <title> is still in English while the document uses
lang="tr"; update the <title> element content from "CalmKernel — Building the
Future of Data Infrastructure" to the Turkish equivalent (for example
"CalmKernel — Veri Altyapısının Geleceğini İnşa Ediyoruz") so it matches the
Turkish hero text and improves localization/SEO.

---

Duplicate comments:
In `@index.html`:
- Line 16: The Open Graph and Twitter title meta tags are still English; update
the content of the meta property="og:title" and the corresponding meta
name="twitter:title" tags to use the translated Turkish title (the same text
used for the page title translation) so social previews and SEO reflect the
Turkish title consistently.
🪄 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: 2b072ea5-d9e9-4716-a347-0e02302be90b

📥 Commits

Reviewing files that changed from the base of the PR and between 9824dad and c3f52f0.

📒 Files selected for processing (5)
  • assets/css/cookie-consent.css
  • assets/css/main.css
  • en/index.html
  • index.html
  • src/input.css
✅ Files skipped from review due to trivial changes (1)
  • assets/css/cookie-consent.css
📜 Review details
🧰 Additional context used
🪛 Stylelint (17.6.0)
assets/css/main.css

[error] 2-2: Unexpected duplicate "-webkit-text-decoration" (declaration-block-no-duplicate-properties)

(declaration-block-no-duplicate-properties)


[error] 2-2: Unexpected duplicate "-webkit-text-decoration" (declaration-block-no-duplicate-properties)

(declaration-block-no-duplicate-properties)


[error] 2-2: Unexpected duplicate "-webkit-text-decoration-color" (declaration-block-no-duplicate-properties)

(declaration-block-no-duplicate-properties)


[error] 2-2: Expected "button" to be "auto" (declaration-property-value-keyword-no-deprecated)

(declaration-property-value-keyword-no-deprecated)


[error] 2-2: Expected "button" to be "auto" (declaration-property-value-keyword-no-deprecated)

(declaration-property-value-keyword-no-deprecated)


[error] 2-2: Expected quotes around "url" function argument (function-url-quotes)

(function-url-quotes)


[error] 2-2: Expected quotes around "url" function argument (function-url-quotes)

(function-url-quotes)


[error] 2-2: Expected quotes around "url" function argument (function-url-quotes)

(function-url-quotes)


[error] 2-2: Expected quotes around "url" function argument (function-url-quotes)

(function-url-quotes)


[error] 2-2: Expected quotes around "url" function argument (function-url-quotes)

(function-url-quotes)


[error] 2-2: Expected quotes around "url" function argument (function-url-quotes)

(function-url-quotes)


[error] 2-2: Expected quotes around "url" function argument (function-url-quotes)

(function-url-quotes)


[error] 2-2: Expected quotes around "url" function argument (function-url-quotes)

(function-url-quotes)


[error] 2-2: Expected "SFMono-Regular" to be "sfmono-regular" (value-keyword-case)

(value-keyword-case)


[error] 2-2: Expected "Menlo" to be "menlo" (value-keyword-case)

(value-keyword-case)


[error] 2-2: Expected "Monaco" to be "monaco" (value-keyword-case)

(value-keyword-case)


[error] 2-2: Expected "Consolas" to be "consolas" (value-keyword-case)

(value-keyword-case)


[error] 2-2: Expected "currentColor" to be "currentcolor" (value-keyword-case)

(value-keyword-case)

src/input.css

[error] 13-13: Unexpected quotes around "Inter" (font-family-name-quotes)

(font-family-name-quotes)


[error] 20-20: Unexpected quotes around "Inter" (font-family-name-quotes)

(font-family-name-quotes)


[error] 27-27: Unexpected quotes around "Inter" (font-family-name-quotes)

(font-family-name-quotes)


[error] 34-34: Unexpected quotes around "Inter" (font-family-name-quotes)

(font-family-name-quotes)


[error] 41-41: Unexpected quotes around "Inter" (font-family-name-quotes)

(font-family-name-quotes)


[error] 50-50: Unexpected quotes around "Sora" (font-family-name-quotes)

(font-family-name-quotes)


[error] 60-60: Unexpected quotes around "Sora" (font-family-name-quotes)

(font-family-name-quotes)


[error] 3-3: Unexpected unknown at-rule "@theme" (scss/at-rule-no-unknown)

(scss/at-rule-no-unknown)

🔇 Additional comments (9)
en/index.html (3)

60-60: Skip link remains invisible on focus — accessibility issue persists.

The skip link has left:-9999px in inline styles with no :focus override, so keyboard users cannot see it when tabbed to.

♿ Proposed fix: Add focus-visible styles

Add a <style> block in <head> or to your CSS file:

.skip-link:focus,
.skip-link:focus-visible {
  left: 0 !important;
  top: 0 !important;
  width: auto !important;
  height: auto !important;
  overflow: visible !important;
}

Or replace the inline style with a class that handles both hidden and focused states.


77-88: Mobile menu ARIA implementation looks correct.

The button correctly uses aria-expanded, aria-controls, and the menu uses aria-hidden. The script properly syncs these attributes on toggle and when links are clicked.


330-332: Cookie consent integration is properly included.

The KVKK cookie consent CSS and JS are correctly loaded, addressing the compliance requirement.

index.html (3)

60-60: Skip link remains invisible on focus — same issue as en/index.html.

The inline left:-9999px style has no focus override. Apply the same fix suggested for the English page.


335-337: Cookie consent is now properly integrated.

The KVKK cookie consent CSS and JS are correctly loaded, resolving the compliance concern from the previous review.


67-111: Turkish body content translation looks complete.

Navigation labels, hero headline, CTA buttons, and descriptive text are properly translated to Turkish.

src/input.css (2)

12-46: Font paths are now correct — LGTM.

The paths have been fixed from the previous ../assets/fonts/... to ../fonts/..., which correctly resolves from the compiled assets/css/main.css location to assets/fonts/.


3-9: Tailwind v4 theme configuration looks good.

The @theme directive is valid Tailwind CSS v4 syntax. The static analysis warning (scss/at-rule-no-unknown) is a false positive since the linter is applying SCSS rules to a Tailwind file.

assets/css/main.css (1)

1-2: Auto-generated Tailwind output — no action required.

This is compiled/minified output from Tailwind CSS v4.2.2. The static analysis warnings (duplicate properties, URL quotes, keyword casing) are artifacts of the minifier and standard CSS resets for cross-browser compatibility. These are not actionable.

Comment thread index.html
</noscript>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>CalmKernel — Building the Future of Data Infrastructure</title>
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

Page title still in English on Turkish variant.

The <title> remains "CalmKernel — Building the Future of Data Infrastructure" despite lang="tr". For proper localization and SEO, consider translating to match the Turkish hero text (e.g., "CalmKernel — Veri Altyapısının Geleceğini İnşa Ediyoruz").

🌐 Suggested diff
-  <title>CalmKernel — Building the Future of Data Infrastructure</title>
+  <title>CalmKernel — Veri Altyapısının Geleceğini İnşa Ediyoruz</title>
📝 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
<title>CalmKernel — Building the Future of Data Infrastructure</title>
<title>CalmKernel — Veri Altyapısının Geleceğini İnşa Ediyoruz</title>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@index.html` at line 6, The page <title> is still in English while the
document uses lang="tr"; update the <title> element content from "CalmKernel —
Building the Future of Data Infrastructure" to the Turkish equivalent (for
example "CalmKernel — Veri Altyapısının Geleceğini İnşa Ediyoruz") so it matches
the Turkish hero text and improves localization/SEO.

Comment thread stitch-reference.html
<!-- CONTACT/CTA SECTION -->
<section class="py-24 px-8">
<div class="max-w-7xl mx-auto bg-gradient-to-br from-amber-500 to-orange-600 rounded-3xl p-12 md:p-24 text-center relative overflow-hidden shadow-2xl shadow-amber-500/20">
<div class="absolute inset-0 opacity-10 bg-[url('https://www.transparenttextures.com/patterns/carbon-fibre.png')]"></div>
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[Severity 7] External image URL compiles into production main.css

This Tailwind arbitrary class causes https://www.transparenttextures.com/patterns/carbon-fibre.png to be compiled into the shared assets/css/main.css (confirmed via build output). Even though this class is only in the reference file and not rendered on production pages, Tailwind v4 scans all HTML files during the build, so the utility gets emitted.

Impact:

  • Every page that loads main.css sends a browser request to transparenttextures.com (if the class is matched in the browser's rendering path — at minimum the CSS rule is present in the stylesheet).
  • This contradicts the PR's claim of "Zero external dependencies" and may conflict with the site's KVKK/GDPR stance (third-party domain = potential IP logging).

Fix options:

  1. Remove this class from stitch-reference.html and replace with a local CSS custom class or inline style.
  2. Exclude stitch-reference.html from the Tailwind content scan (add a /* tailwind-ignore */ comment or configure the scanner to skip it).
  3. Move stitch-reference.html out of the repo root (e.g. to a _drafts/ or gitignored directory) so it isn't deployed or scanned.

Comment thread stitch-reference.html
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Severity 8 — KVKK/GDPR violation: stitch-reference.html is publicly served with Google Fonts CDN calls and no noindex guard

This file is committed to the web root and is publicly accessible. It contains:

  • <script src="https://cdn.tailwindcss.com?plugins=forms,container-queries"> — makes an external request leaking visitor IPs
  • Two <link href="https://fonts.googleapis.com/..."> calls loading Sora/Inter
  • A <link href="https://fonts.googleapis.com/..."> for Material Symbols

The PR's core justification is removing all Google Fonts CDN dependencies for KVKK/GDPR compliance ("Zero external font dependencies"). Having this file served publicly from the root directly contradicts that goal — any visitor who lands on this URL triggers external requests to Google's servers.

Additionally, the file carries live <title> and Open Graph metadata pointing to the production site, and there is no <meta name="robots" content="noindex"> to prevent crawler indexing.

Recommended fix: Either add <meta name="robots" content="noindex, nofollow"> to the <head> and strip or comment out the Google CDN <link>/<script> tags, or move the file out of the published web root (e.g., rename to _stitch-reference.html or add it to a non-served docs directory).

Comment thread assets/css/main.css
Comment on lines +1 to +2
/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-divide-x-reverse:0}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-500:oklch(63.7% .237 25.331);--color-orange-600:oklch(64.6% .222 41.116);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-900:oklch(41.4% .112 45.904);--color-green-500:oklch(72.3% .219 149.579);--color-blue-400:oklch(70.7% .165 254.624);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-zinc-950:oklch(14.1% .005 285.823);--color-white:#fff;--spacing:.25rem;--container-2xl:42rem;--container-4xl:56rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--text-7xl:4.5rem;--text-7xl--line-height:1;--font-weight-light:300;--font-weight-medium:500;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--tracking-tighter:-.05em;--tracking-tight:-.025em;--tracking-widest:.1em;--leading-tight:1.25;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--radius-4xl:2rem;--blur-md:12px;--blur-3xl:64px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--font-headline:"Sora", sans-serif;--font-body:"Inter", sans-serif}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.-inset-4{inset:calc(var(--spacing) * -4)}.inset-0{inset:calc(var(--spacing) * 0)}.-start{inset-inline-start:calc(var(--spacing) * -1)}.start{inset-inline-start:var(--spacing)}.-end{inset-inline-end:calc(var(--spacing) * -1)}.end{inset-inline-end:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.z-10{z-index:10}.z-50{z-index:50}.col-auto{grid-column:auto}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.m-0{margin:calc(var(--spacing) * 0)}.mx-8{margin-inline:calc(var(--spacing) * 8)}.mx-auto{margin-inline:auto}.mb-0{margin-bottom:calc(var(--spacing) * 0)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-12{margin-bottom:calc(var(--spacing) * 12)}.mb-16{margin-bottom:calc(var(--spacing) * 16)}.mb-20{margin-bottom:calc(var(--spacing) * 20)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-1{height:calc(var(--spacing) * 1)}.h-3{height:calc(var(--spacing) * 3)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-20{height:calc(var(--spacing) * 20)}.h-full{height:100%}.h-px{height:1px}.w-3{width:calc(var(--spacing) * 3)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-\[65\%\]{width:65%}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-7xl{max-width:var(--container-7xl)}.shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.border-collapse{border-collapse:collapse}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.resize{resize:both}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-16{gap:calc(var(--spacing) * 16)}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.-space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * -2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * -2) * calc(1 - var(--tw-space-x-reverse)))}.self-center{align-self:center}.overflow-hidden{overflow:hidden}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-amber-500{border-color:var(--color-amber-500)}.border-zinc-700{border-color:var(--color-zinc-700)}.border-zinc-800{border-color:var(--color-zinc-800)}.border-zinc-800\/50{border-color:#27272a80}@supports (color:color-mix(in lab, red, red)){.border-zinc-800\/50{border-color:color-mix(in oklab, var(--color-zinc-800) 50%, transparent)}}.border-zinc-900{border-color:var(--color-zinc-900)}.border-zinc-950{border-color:var(--color-zinc-950)}.border-t-amber-500\/20{border-top-color:#f99c0033}@supports (color:color-mix(in lab, red, red)){.border-t-amber-500\/20{border-top-color:color-mix(in oklab, var(--color-amber-500) 20%, transparent)}}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/10{background-color:color-mix(in oklab, var(--color-amber-500) 10%, transparent)}}.bg-amber-500\/50{background-color:#f99c0080}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/50{background-color:color-mix(in oklab, var(--color-amber-500) 50%, transparent)}}.bg-green-500\/50{background-color:#00c75880}@supports (color:color-mix(in lab, red, red)){.bg-green-500\/50{background-color:color-mix(in oklab, var(--color-green-500) 50%, transparent)}}.bg-red-500\/50{background-color:#fb2c3680}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/50{background-color:color-mix(in oklab, var(--color-red-500) 50%, transparent)}}.bg-zinc-800{background-color:var(--color-zinc-800)}.bg-zinc-900{background-color:var(--color-zinc-900)}.bg-zinc-900\/30{background-color:#18181b4d}@supports (color:color-mix(in lab, red, red)){.bg-zinc-900\/30{background-color:color-mix(in oklab, var(--color-zinc-900) 30%, transparent)}}.bg-zinc-950{background-color:var(--color-zinc-950)}.bg-zinc-950\/20{background-color:#09090b33}@supports (color:color-mix(in lab, red, red)){.bg-zinc-950\/20{background-color:color-mix(in oklab, var(--color-zinc-950) 20%, transparent)}}.bg-zinc-950\/80{background-color:#09090bcc}@supports (color:color-mix(in lab, red, red)){.bg-zinc-950\/80{background-color:color-mix(in oklab, var(--color-zinc-950) 80%, transparent)}}.bg-zinc-950\/95{background-color:#09090bf2}@supports (color:color-mix(in lab, red, red)){.bg-zinc-950\/95{background-color:color-mix(in oklab, var(--color-zinc-950) 95%, transparent)}}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-\[radial-gradient\(circle_at_50\%_50\%\,rgba\(245\,158\,11\,0\.08\)\,transparent_50\%\)\]{background-image:radial-gradient(circle,#f59e0b14,#0000 50%)}.bg-\[url\(\'https\:\/\/www\.transparenttextures\.com\/patterns\/carbon-fibre\.png\'\)\]{background-image:url(https://www.transparenttextures.com/patterns/carbon-fibre.png)}.from-amber-500{--tw-gradient-from:var(--color-amber-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-amber-600{--tw-gradient-to:var(--color-amber-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-orange-600{--tw-gradient-to:var(--color-orange-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.p-12{padding:calc(var(--spacing) * 12)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-24{padding-block:calc(var(--spacing) * 24)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-32{padding-top:calc(var(--spacing) * 32)}.pb-1{padding-bottom:calc(var(--spacing) * 1)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pb-20{padding-bottom:calc(var(--spacing) * 20)}.text-center{text-align:center}.font-body{font-family:var(--font-body)}.font-headline{font-family:var(--font-headline)}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-tighter{--tw-tracking:var(--tracking-tighter);letter-spacing:var(--tracking-tighter)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-amber-400{color:var(--color-amber-400)}.text-amber-500{color:var(--color-amber-500)}.text-blue-400{color:var(--color-blue-400)}.text-green-500{color:var(--color-green-500)}.text-white{color:var(--color-white)}.text-zinc-300{color:var(--color-zinc-300)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-600{color:var(--color-zinc-600)}.text-zinc-700{color:var(--color-zinc-700)}.text-zinc-950{color:var(--color-zinc-950)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.decoration-zinc-950\/30{text-decoration-color:#09090b4d}@supports (color:color-mix(in lab, red, red)){.decoration-zinc-950\/30{-webkit-text-decoration-color:color-mix(in oklab, var(--color-zinc-950) 30%, transparent);-webkit-text-decoration-color:color-mix(in oklab, var(--color-zinc-950) 30%, transparent);text-decoration-color:color-mix(in oklab, var(--color-zinc-950) 30%, transparent)}}.underline-offset-8{text-underline-offset:8px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-10{opacity:.1}.opacity-80{opacity:.8}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-amber-500\/20{--tw-shadow-color:#f99c0033}@supports (color:color-mix(in lab, red, red)){.shadow-amber-500\/20{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-amber-500) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-amber-900\/10{--tw-shadow-color:#7b33061a}@supports (color:color-mix(in lab, red, red)){.shadow-amber-900\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-amber-900) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.blur-3xl{--tw-blur:blur(var(--blur-3xl));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.backface-hidden{backface-visibility:hidden}@media (hover:hover){.group-hover\:scale-110:is(:where(.group):hover *){--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:border-amber-500\/50:hover{border-color:#f99c0080}@supports (color:color-mix(in lab, red, red)){.hover\:border-amber-500\/50:hover{border-color:color-mix(in oklab, var(--color-amber-500) 50%, transparent)}}.hover\:bg-amber-600:hover{background-color:var(--color-amber-600)}.hover\:bg-white:hover{background-color:var(--color-white)}.hover\:bg-zinc-900:hover{background-color:var(--color-zinc-900)}.hover\:bg-zinc-900\/50:hover{background-color:#18181b80}@supports (color:color-mix(in lab, red, red)){.hover\:bg-zinc-900\/50:hover{background-color:color-mix(in oklab, var(--color-zinc-900) 50%, transparent)}}.hover\:text-amber-400:hover{color:var(--color-amber-400)}.hover\:text-amber-600:hover{color:var(--color-amber-600)}.hover\:text-white:hover{color:var(--color-white)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.hover\:shadow-amber-500\/20:hover{--tw-shadow-color:#f99c0033}@supports (color:color-mix(in lab, red, red)){.hover\:shadow-amber-500\/20:hover{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-amber-500) 20%, transparent) var(--tw-shadow-alpha), transparent)}}}.active\:scale-95:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}@media (min-width:40rem){.sm\:inline{display:inline}.sm\:w-auto{width:auto}.sm\:flex-row{flex-direction:row}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.sm\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.sm\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}}@media (min-width:48rem){.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:inline{display:inline}.md\:w-auto{width:auto}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-start{align-items:flex-start}.md\:gap-8{gap:calc(var(--spacing) * 8)}:where(.md\:divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.md\:divide-zinc-800>:not(:last-child)){border-color:var(--color-zinc-800)}.md\:p-24{padding:calc(var(--spacing) * 24)}.md\:px-8{padding-inline:calc(var(--spacing) * 8)}.md\:pt-48{padding-top:calc(var(--spacing) * 48)}.md\:pb-32{padding-bottom:calc(var(--spacing) * 32)}.md\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.md\:text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.md\:text-7xl{font-size:var(--text-7xl);line-height:var(--tw-leading,var(--text-7xl--line-height))}.md\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}@media (min-width:64rem){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}}@font-face{font-family:Inter;font-style:normal;font-weight:300;font-display:swap;src:url(../fonts/Inter-Light.woff2)format("woff2")}@font-face{font-family:Inter;font-style:normal;font-weight:400;font-display:swap;src:url(../fonts/Inter-Regular.woff2)format("woff2")}@font-face{font-family:Inter;font-style:normal;font-weight:500;font-display:swap;src:url(../fonts/Inter-Medium.woff2)format("woff2")}@font-face{font-family:Inter;font-style:normal;font-weight:600;font-display:swap;src:url(../fonts/Inter-SemiBold.woff2)format("woff2")}@font-face{font-family:Inter;font-style:normal;font-weight:700;font-display:swap;src:url(../fonts/Inter-Bold.woff2)format("woff2")}@font-face{font-family:Sora;font-style:normal;font-weight:100 800;font-display:swap;src:url(../fonts/sora-latin.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Sora;font-style:normal;font-weight:100 800;font-display:swap;src:url(../fonts/sora-latin-ext.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}.glass-card{-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);background:#18181b99;border:1px solid #ffffff0d}.text-gradient{-webkit-text-fill-color:transparent;background:linear-gradient(to bottom right,#fff,#a1a1aa);-webkit-background-clip:text}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0} No newline at end of file
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Severity 7 — External transparenttextures.com URL compiled into production CSS

The compiled main.css contains this utility class (generated because Tailwind scanned stitch-reference.html):

.bg-\[url\(\'https\:\/\/www\.transparenttextures\.com\/patterns\/carbon-fibre\.png\'\)\]{
  background-image: url(https://www.transparenttextures.com/patterns/carbon-fibre.png)
}

This class is not used in index.html or en/index.html, so the URL is not fetched at runtime currently. However:

  1. Dead weight — increases CSS bundle size with a utility that serves no active page
  2. Future risk — if the class is ever applied, it would make an external network request to a third-party domain, breaking the "zero external dependencies" contract and raising KVKK concerns
  3. Root cause — Tailwind's content scanning is picking up stitch-reference.html, which uses bg-[url('https://www.transparenttextures.com/...')]

Recommended fix: Exclude stitch-reference.html from Tailwind's content scanning in your build config (e.g., via a tailwind.config.js content exclude pattern, or by moving the file outside the scan path), then rebuild main.css.

# Conflicts:
#	assets/css/cookie-consent.css
#	en/index.html
@ahm3t0t ahm3t0t merged commit 4514fab into main Apr 4, 2026
0 of 4 checks passed
Comment thread index.html
Comment on lines +49 to +56
<link rel="icon" type="image/svg+xml" href="/assets/images/calmkernel-icon.svg"/>

<!-- Built CSS (Tailwind purged) -->
<link rel="stylesheet" href="/assets/css/main.css"/>

<!-- Font Awesome (async) -->
<link rel="stylesheet" href="/assets/css/font-awesome.min.css" media="print" onload="this.media='all'"/>
<noscript><link rel="stylesheet" href="/assets/css/font-awesome.min.css"/></noscript>
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Severity 8 — Missing assets will cause silent UI breakage

Three assets referenced here do not exist in the repository:

  1. /assets/js/cookie-consent.js (line 334) — the JS file is absent (assets/js/ directory does not exist). The KVKK cookie consent banner CSS is loaded but the banner logic never runs.
  2. /assets/images/calmkernel-icon.svg (line 49) — favicon returns 404.
  3. /assets/css/font-awesome.min.css (lines 55–56) — if this file is not present (it is not in the PR diff), all <i class="fas fa-..."> and <i class="fab fa-..."> icons render as invisible/broken text, collapsing the entire icon-heavy UI silently.

Please confirm these files exist on the deployment target (i.e., were committed separately), or add them to this PR. A missing Font Awesome CSS means every icon on the page — broom, chart-line, layer-group, shield-alt, globe-europe, etc. — will be invisible.

Comment thread index.html
Comment on lines +340 to +344
var menu = document.getElementById('mobileMenu');
btn.addEventListener('click', function() {
var open = menu.classList.toggle('hidden');
btn.setAttribute('aria-expanded', !open);
menu.setAttribute('aria-hidden', open);
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Severity 7 — aria-expanded state is inverted

var open = menu.classList.toggle('hidden');
btn.setAttribute('aria-expanded', !open);

classList.toggle('hidden') returns true when the class was added (menu is now hidden/closed) and false when it was removed (menu is now visible/open). Therefore !open evaluates to true when the menu is hidden — the opposite of what screen readers expect.

The correct logic is:

var isNowHidden = menu.classList.toggle('hidden');
btn.setAttribute('aria-expanded', String(!isNowHidden));
menu.setAttribute('aria-hidden', String(isNowHidden));

The same bug exists in en/index.html at the equivalent script block.

Comment thread assets/css/main.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.

Severity 8 — Sora font files are missing from the repository

main.css references two Sora font files:

  • url(../fonts/sora-latin.woff2)
  • url(../fonts/sora-latin-ext.woff2)

However, assets/fonts/ only contains Inter variants (Inter-Bold.woff2, Inter-Light.woff2, Inter-Medium.woff2, Inter-Regular.woff2, Inter-SemiBold.woff2). The Sora files are not present in this PR's diff and do not exist in the repository.

font-headline (used on h1, h2, section titles, and the logo) will silently fall back to sans-serif. The headline font is a core part of the new visual identity — this needs to be committed alongside the CSS.

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 3 new potential issues.

View 7 additional findings in Devin Review.

Open in Devin Review

Comment thread index.html
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.

🔴 Missing cookie-consent.js breaks KVKK cookie consent functionality

Both index.html:334 and en/index.html:329 include <script src="/assets/js/cookie-consent.js" defer></script>, but the assets/js/ directory does not exist in the repository. The PR adds assets/css/cookie-consent.css (the styling) but omits the corresponding JavaScript file. The cookie consent banner (required for KVKK compliance, as noted in the HTML comment <!-- Cookie Consent (KVKK) -->) will render as styled HTML but have no functional behavior — users cannot accept cookies, and the banner cannot be dismissed.

(Refers to line 689)

Prompt for agents
Both index.html (line 689) and en/index.html (line 329) reference /assets/js/cookie-consent.js but this file does not exist. The assets/js/ directory is entirely missing from the repository. The cookie-consent.css was added to assets/css/ but the JS counterpart was not. A cookie-consent.js file needs to be created in assets/js/ that handles: (1) checking if the user has already consented (e.g. via a cookie or localStorage), (2) showing/hiding the #cookieConsent banner, (3) handling the #ccAccept button click to record consent and hide the banner. The CSS already defines #cookieConsent, .cc-hidden, .cc-inner, and #ccAccept selectors.
Open in Devin Review

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

Comment thread index.html
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.

🔴 Missing font-awesome.min.css causes all icons to not render

Both index.html:410 and en/index.html:55 reference /assets/css/font-awesome.min.css (loaded async with media="print" onload="this.media='all'"), but this file does not exist in assets/css/ (which only contains main.css and cookie-consent.css). The site uses Font Awesome icons throughout — navigation hamburger (fa fa-bars), GitHub icons (fab fa-github), product section icons (fas fa-broom, fas fa-chart-line, fas fa-layer-group), about section icons (fas fa-globe-europe, fas fa-shield-alt, fas fa-code-branch, fas fa-robot), and social links (fab fa-linkedin-in). None of these icons will render, leaving blank spaces throughout the UI.

(Refers to lines 410-411)

Prompt for agents
Both index.html (lines 410-411) and en/index.html (lines 55-56) reference /assets/css/font-awesome.min.css but this file does not exist in the repository. The assets/css/ directory only contains main.css and cookie-consent.css. Font Awesome CSS (and its associated webfont files) need to be added to the assets directory. You can either: (1) download Font Awesome (free version) and place font-awesome.min.css in assets/css/ along with the webfonts directory, or (2) use a CDN link instead of a local file. The site uses both 'fas' (solid), 'fab' (brands), 'fa' (v4 compat), and 'far' (regular) icon prefixes, so Font Awesome 5+ Free is needed. Self-hosting is preferred given the project's GDPR/KVKK compliance goals.
Open in Devin Review

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

Comment thread src/input.css
Comment on lines +49 to +57
@font-face {
font-family: "Sora";
font-style: normal;
font-weight: 100 800;
font-display: swap;
src: url("../fonts/sora-latin.woff2") format("woff2");
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122,
U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
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.

🔴 Missing Sora font files cause headline font to not render

The compiled assets/css/main.css includes @font-face declarations referencing ../fonts/sora-latin.woff2 and ../fonts/sora-latin-ext.woff2, but neither file exists in assets/fonts/. The PR adds all five Inter font .woff2 files but omits the Sora files. Since font-headline is defined as "Sora", sans-serif (src/input.css:4) and used extensively in both index.html and en/index.html for headings (font-headline class), all headline text will fall back to generic sans-serif instead of the intended Sora typeface.

Prompt for agents
The src/input.css file (lines 49-68) defines two @font-face blocks for the Sora font family referencing ../fonts/sora-latin.woff2 and ../fonts/sora-latin-ext.woff2. These declarations are compiled into assets/css/main.css. However, the assets/fonts/ directory only contains Inter font files (Inter-Light.woff2, Inter-Regular.woff2, Inter-Medium.woff2, Inter-SemiBold.woff2, Inter-Bold.woff2). The two Sora .woff2 files need to be added to assets/fonts/ alongside the Inter files. These can be obtained from Google Fonts or a similar source and self-hosted for GDPR/KVKK compliance as intended by the project.
Open in Devin Review

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

ahm3t0t added a commit that referenced this pull request Apr 4, 2026
#1  [CRITICAL] Replace broken Next.js 404.html with static dark amber page
#2  [HIGH] Fix OG image path (/assets/images/og-preview.png → /og-image.png)
#3  [MEDIUM] Remove logos/ directory (~6.4MB unreferenced PNGs)
#4  [MEDIUM] Remove orphan fontello.woff/woff2
#5  [LOW] Fix 'Turkce' → 'Türkçe' typo in en/index.html
#6  [MEDIUM] .gitmem/ already untracked (verified)
#7  [HIGH] Create privacy-policy.html (TR) + en/privacy-policy.html (EN)
#8  [HIGH] Restore LICENSE (proprietary)
#9  [HIGH] Fix CI workflow — update Lighthouse URLs to existing pages
#10 [MEDIUM] Create README.md with current stack info
#11 [MEDIUM] Restore SECURITY.md
#12 [MEDIUM] Update .REPOMAP.md to reflect Tailwind/dark amber design
#13 [MEDIUM] Add .gitattributes (EOL normalization, binary markers)

Additional: Tailwind CSS rebuilt for all pages, pinned CI dependencies

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
ahm3t0t added a commit that referenced this pull request Apr 4, 2026
From prior PRs (open findings):
- Skip link visible on focus (sr-only + focus:not-sr-only) — CodeRabbit
- aria-expanded state corrected (isHidden logic) — Blocks
- localStorage try-catch wrapper — Gemini

From PR #8 reviews:
- Blog nav links → # (page doesn't exist yet) — CodeRabbit/Blocks/Devin
- Tools footer → /#products anchor — Devin
- 404.html skip link added — Gemini
- fa → fas class (FA6) — Gemini
- var → const/let (ES6) — Gemini
- .gitattributes *.yaml added — CodeRabbit
- CI Lighthouse EN privacy page added — CodeRabbit

All pages: index, en/index, privacy-policy, en/privacy-policy, 404

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
ahm3t0t added a commit that referenced this pull request Apr 4, 2026
* fix: RockSolid audit — all 13 findings resolved

#1  [CRITICAL] Replace broken Next.js 404.html with static dark amber page
#2  [HIGH] Fix OG image path (/assets/images/og-preview.png → /og-image.png)
#3  [MEDIUM] Remove logos/ directory (~6.4MB unreferenced PNGs)
#4  [MEDIUM] Remove orphan fontello.woff/woff2
#5  [LOW] Fix 'Turkce' → 'Türkçe' typo in en/index.html
#6  [MEDIUM] .gitmem/ already untracked (verified)
#7  [HIGH] Create privacy-policy.html (TR) + en/privacy-policy.html (EN)
#8  [HIGH] Restore LICENSE (proprietary)
#9  [HIGH] Fix CI workflow — update Lighthouse URLs to existing pages
#10 [MEDIUM] Create README.md with current stack info
#11 [MEDIUM] Restore SECURITY.md
#12 [MEDIUM] Update .REPOMAP.md to reflect Tailwind/dark amber design
#13 [MEDIUM] Add .gitattributes (EOL normalization, binary markers)

Additional: Tailwind CSS rebuilt for all pages, pinned CI dependencies

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: address all bot review feedback from PR #5-8

From prior PRs (open findings):
- Skip link visible on focus (sr-only + focus:not-sr-only) — CodeRabbit
- aria-expanded state corrected (isHidden logic) — Blocks
- localStorage try-catch wrapper — Gemini

From PR #8 reviews:
- Blog nav links → # (page doesn't exist yet) — CodeRabbit/Blocks/Devin
- Tools footer → /#products anchor — Devin
- 404.html skip link added — Gemini
- fa → fas class (FA6) — Gemini
- var → const/let (ES6) — Gemini
- .gitattributes *.yaml added — CodeRabbit
- CI Lighthouse EN privacy page added — CodeRabbit

All pages: index, en/index, privacy-policy, en/privacy-policy, 404

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
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