-
Demo playground
-
Zero-config Extensive Editor: go from install to full rich text in under a minute.
-
-
-
-
-
-
-
-
-
{PRIMARY_PACKAGE_NAME} extensive preset
-
-
-
-
+
+
Live Playground
+
+ Build Faster With Production-Ready Presets
+
+
+ Compare editing experiences, fine-tune behavior, and ship the setup that matches your product.
+
+
);
diff --git a/apps/web/src/app/docs/[[...slug]]/page.tsx b/apps/web/src/app/docs/[[...slug]]/page.tsx
index 6c88224..a7f42fb 100644
--- a/apps/web/src/app/docs/[[...slug]]/page.tsx
+++ b/apps/web/src/app/docs/[[...slug]]/page.tsx
@@ -15,7 +15,7 @@ type NavGroupId = 'getting_started' | 'luthor_headless' | 'luthor' | 'other';
const NAV_GROUP_ORDER: { id: NavGroupId; label: string }[] = [
{ id: 'getting_started', label: 'Getting Started' },
- { id: 'luthor_headless', label: '@lyfie/headless' },
+ { id: 'luthor_headless', label: '@lyfie/luthor-headless' },
{ id: 'luthor', label: '@lyfie/luthor' },
{ id: 'other', label: 'Other' },
];
diff --git a/apps/web/src/app/globals.css b/apps/web/src/app/globals.css
index 5ed9793..a44a2cb 100644
--- a/apps/web/src/app/globals.css
+++ b/apps/web/src/app/globals.css
@@ -91,6 +91,7 @@ body {
radial-gradient(85% 70% at 50% 100%, var(--page-glow-3), transparent 58%),
var(--bg);
min-height: 100vh;
+ overflow-x: clip;
}
* {
@@ -201,6 +202,19 @@ a {
gap: 1.2rem;
}
+.nav-menu-toggle {
+ display: none;
+ align-items: center;
+ justify-content: center;
+ width: 2.1rem;
+ height: 2.1rem;
+ border-radius: 999px;
+ border: 1px solid var(--line);
+ background: color-mix(in srgb, var(--surface) 64%, var(--bg-elevated) 36%);
+ color: var(--text);
+ cursor: pointer;
+}
+
.nav-secondary-link {
display: inline-flex;
}
@@ -327,6 +341,8 @@ a {
.hero-uses-container{
display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
gap: var(--space-2);
margin: var(--space-3) 0 0;
}
@@ -435,7 +451,8 @@ a {
.btn:focus-visible,
.copy-btn:focus-visible,
-.theme-toggle:focus-visible {
+.theme-toggle:focus-visible,
+.nav-menu-toggle:focus-visible {
outline: 2px solid var(--ring);
outline-offset: 2px;
}
@@ -540,6 +557,7 @@ a {
border-radius: 8px;
padding: 0.3rem 0.55rem;
font-size: 0.82rem;
+ overflow-wrap: anywhere;
}
.copy-btn {
@@ -567,6 +585,410 @@ a {
font-size: 0.95rem;
}
+.demo-showcase-layout {
+ display: grid;
+ grid-template-columns: minmax(220px, 260px) 1fr;
+ gap: var(--space-3);
+ align-items: start;
+}
+
+.demo-showcase-main {
+ display: grid;
+ gap: 0.75rem;
+ border: 1px solid color-mix(in srgb, var(--line) 74%, var(--accent) 26%);
+ border-radius: 14px;
+ background: color-mix(in srgb, var(--bg-elevated) 90%, var(--surface) 10%);
+ box-shadow: var(--shadow-sm);
+ padding: 0.7rem;
+}
+
+.demo-preset-sidebar {
+ position: sticky;
+ top: calc(74px + var(--space-3));
+ max-height: calc(100vh - 74px - (var(--space-3) * 2));
+ height: fit-content;
+ overflow: auto;
+ border: 1px solid var(--line);
+ border-radius: var(--radius-sm);
+ background: color-mix(in srgb, var(--bg-elevated) 88%, var(--surface) 12%);
+ backdrop-filter: blur(8px);
+ box-shadow: var(--shadow-sm);
+ padding: var(--space-3);
+}
+
+.demo-preset-sidebar h2 {
+ margin: 0;
+ font-family: var(--font-display), var(--font-body), sans-serif;
+ font-size: 1.05rem;
+}
+
+.demo-preset-sidebar-copy {
+ margin: 0.4rem 0 0.9rem;
+ color: var(--muted);
+ font-size: 0.84rem;
+ line-height: 1.45;
+}
+
+.demo-preset-sidebar nav {
+ display: grid;
+ gap: 0.45rem;
+}
+
+.demo-preset-nav-item {
+ width: 100%;
+ border: 1px solid var(--line);
+ border-radius: 10px;
+ background: color-mix(in srgb, var(--bg-elevated) 90%, var(--surface) 10%);
+ color: var(--muted);
+ padding: 0.6rem 0.7rem;
+ text-align: left;
+ font: inherit;
+ font-weight: 650;
+ cursor: pointer;
+ transition: border-color 0.2s ease, color 0.2s ease, background-color 0.2s ease;
+}
+
+.demo-preset-nav-item:hover {
+ color: var(--text);
+ border-color: color-mix(in srgb, var(--accent) 44%, transparent);
+}
+
+.demo-preset-nav-item.is-active {
+ color: #fff;
+ border-color: color-mix(in srgb, var(--accent) 55%, transparent);
+ background: linear-gradient(130deg, var(--accent), #1387da);
+}
+
+.demo-showcase-frame {
+ min-height: clamp(360px, 50vh, 620px);
+ max-height: none;
+ height: auto;
+}
+
+.demo-showcase-editor-pane {
+ display: block;
+ overflow: visible;
+}
+
+.demo-preset-writeup {
+ margin: 0;
+ padding: 0.55rem 0.7rem 0.35rem;
+}
+
+.demo-preset-title-row {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 0.7rem;
+}
+
+.demo-preset-writeup h3 {
+ margin: 0;
+ font-size: 0.98rem;
+ letter-spacing: -0.01em;
+}
+
+.demo-preset-inline-code {
+ display: inline-flex;
+ align-items: center;
+ border-radius: 9px;
+ border: 1px solid color-mix(in srgb, var(--accent) 38%, transparent);
+ background: color-mix(in srgb, var(--surface) 66%, var(--bg-elevated) 34%);
+ color: var(--accent-strong);
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
+ font-size: 0.8rem;
+ font-weight: 700;
+ padding: 0.26rem 0.5rem;
+ white-space: nowrap;
+}
+
+.demo-preset-writeup p {
+ margin: 0.4rem 0 0;
+ color: var(--muted);
+ line-height: 1.48;
+ font-size: 0.88rem;
+}
+
+.demo-preset-writeup p strong {
+ color: var(--text);
+}
+
+.demo-preset-docs-link {
+ margin-top: 0.58rem;
+ display: inline-flex;
+ align-items: center;
+ border-radius: 999px;
+ border: 1px solid color-mix(in srgb, var(--accent) 38%, transparent);
+ background: color-mix(in srgb, var(--accent) 12%, transparent);
+ color: var(--accent-strong);
+ text-decoration: none;
+ font-weight: 700;
+ font-size: 0.82rem;
+ padding: 0.3rem 0.65rem;
+}
+
+.demo-preset-docs-link:hover {
+ border-color: color-mix(in srgb, var(--accent) 56%, transparent);
+ background: color-mix(in srgb, var(--accent) 20%, transparent);
+}
+
+.demo-showcase-editor-pane > * {
+ width: min(100%, 1080px);
+ min-height: clamp(320px, 42vh, 540px);
+}
+
+.demo-chat-shell {
+ width: min(100%, 880px);
+ margin: 0 auto;
+ display: grid;
+ gap: 0.55rem;
+}
+
+.demo-chat-history {
+ border: 1px solid var(--line);
+ border-radius: 12px;
+ background: linear-gradient(
+ 180deg,
+ color-mix(in srgb, var(--surface-soft) 82%, var(--bg-elevated) 18%),
+ color-mix(in srgb, var(--surface) 78%, var(--bg-elevated) 22%)
+ );
+ padding: 0.8rem;
+ min-height: 260px;
+ max-height: 420px;
+ overflow: auto;
+ display: flex;
+ flex-direction: column;
+ align-items: stretch;
+ align-content: flex-start;
+ gap: 0.55rem;
+}
+
+.demo-chat-bubble-row {
+ display: flex;
+ align-items: flex-start;
+}
+
+.demo-chat-bubble-row-assistant {
+ justify-content: flex-start;
+}
+
+.demo-chat-bubble-row-user {
+ justify-content: flex-end;
+}
+
+.demo-chat-bubble {
+ width: fit-content;
+ max-width: min(72ch, 84%);
+ border-radius: 16px;
+ padding: 0.52rem 0.72rem;
+ line-height: 1.45;
+ white-space: pre-wrap;
+ word-break: break-word;
+ font-size: 0.95rem;
+}
+
+.demo-chat-bubble-content > :first-child {
+ margin-top: 0;
+}
+
+.demo-chat-bubble-content > :last-child {
+ margin-bottom: 0;
+}
+
+.demo-chat-bubble-content p,
+.demo-chat-bubble-content ul,
+.demo-chat-bubble-content ol,
+.demo-chat-bubble-content pre {
+ margin: 0.14rem 0;
+}
+
+.demo-chat-bubble-content code {
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
+ font-size: 0.9em;
+ border-radius: 5px;
+ padding: 0.05rem 0.26rem;
+ background: color-mix(in srgb, var(--surface) 68%, #c2d7ea);
+}
+
+.demo-chat-bubble.is-user .demo-chat-bubble-content code {
+ background: color-mix(in srgb, #ffffff 28%, transparent);
+}
+
+.demo-chat-bubble.is-assistant {
+ background: color-mix(in srgb, var(--surface) 80%, var(--bg-elevated) 20%);
+ border: 1px solid color-mix(in srgb, var(--line) 82%, transparent);
+ color: var(--text);
+ transition: border-color 0.2s ease, background-color 0.2s ease;
+}
+
+.demo-chat-bubble.is-assistant:hover {
+ border-color: color-mix(in srgb, var(--accent) 38%, var(--line) 62%);
+ background: color-mix(in srgb, var(--surface) 72%, var(--bg-elevated) 28%);
+}
+
+.demo-chat-bubble.is-user {
+ background: linear-gradient(130deg, var(--accent), #1387da);
+ color: #fff;
+ border: 1px solid color-mix(in srgb, var(--accent) 70%, #fff 30%);
+ transition: filter 0.2s ease, transform 0.2s ease;
+}
+
+.demo-chat-bubble.is-user:hover {
+ filter: saturate(1.08) brightness(1.02);
+ transform: translateY(-1px);
+}
+
+.demo-chat-message {
+ display: grid;
+ gap: 0.3rem;
+ width: fit-content;
+ max-width: 100%;
+}
+
+.demo-chat-message-meta {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.35rem;
+ font-size: 0.74rem;
+ color: color-mix(in srgb, var(--muted) 90%, var(--text) 10%);
+}
+
+.demo-chat-bubble-row-user .demo-chat-message-meta {
+ justify-content: flex-end;
+}
+
+.demo-chat-meta-separator {
+ opacity: 0.65;
+ font-size: 0.72rem;
+}
+
+.demo-chat-bubble-typing {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.3rem;
+ min-width: 3rem;
+}
+
+.demo-chat-bubble-typing span {
+ width: 0.36rem;
+ height: 0.36rem;
+ border-radius: 50%;
+ background: color-mix(in srgb, var(--muted) 76%, var(--text) 24%);
+ animation: demo-chat-typing 1s infinite ease-in-out;
+}
+
+.demo-chat-bubble-typing span:nth-child(2) {
+ animation-delay: 0.14s;
+}
+
+.demo-chat-bubble-typing span:nth-child(3) {
+ animation-delay: 0.28s;
+}
+
+.demo-chat-composer .luthor-preset-chat-window {
+ width: 100%;
+ max-width: 100%;
+}
+
+.demo-chat-composer .luthor-chat-window-composer-row {
+ align-items: flex-end;
+ gap: 0.55rem;
+ width: 100%;
+}
+
+.demo-chat-composer .luthor-chat-window-composer-shell {
+ flex: 1;
+ width: auto;
+ min-width: 0;
+ max-width: none;
+}
+
+.demo-chat-composer .luthor-chat-window-action-send--right {
+ width: 46px;
+ height: 46px;
+ min-width: 46px;
+ min-height: 46px;
+ padding: 0;
+ border-radius: 50%;
+ border: 1px solid color-mix(in srgb, var(--accent) 45%, transparent);
+ background: linear-gradient(130deg, var(--accent), #1387da);
+ color: #fff;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ gap: 0;
+ box-shadow: 0 10px 24px color-mix(in srgb, var(--accent) 26%, transparent);
+ transition: transform 0.2s ease, filter 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;
+ flex-shrink: 0;
+}
+
+.demo-chat-composer .luthor-chat-window-action-send--right:hover {
+ transform: translateY(-1px);
+ filter: saturate(1.12);
+ border-color: color-mix(in srgb, var(--accent) 62%, #fff 38%);
+ box-shadow: 0 14px 30px color-mix(in srgb, var(--accent) 34%, transparent);
+}
+
+.demo-chat-send-label {
+ display: none;
+}
+
+[data-theme='dark'] .demo-chat-shell {
+ background: transparent;
+}
+
+[data-theme='dark'] .demo-chat-history {
+ border-color: color-mix(in srgb, var(--line) 85%, transparent);
+ background: linear-gradient(
+ 180deg,
+ color-mix(in srgb, var(--surface-soft) 78%, #101a2a 22%),
+ color-mix(in srgb, var(--surface) 80%, #0f1928 20%)
+ );
+}
+
+[data-theme='dark'] .demo-chat-bubble.is-assistant {
+ background: color-mix(in srgb, var(--surface) 82%, #17273c 18%);
+}
+
+[data-theme='dark'] .demo-chat-bubble.is-assistant:hover {
+ background: color-mix(in srgb, var(--surface) 74%, #1c3047 26%);
+}
+
+[data-theme='dark'] .demo-showcase-main {
+ border-color: color-mix(in srgb, var(--line) 62%, var(--accent) 38%);
+ background: color-mix(in srgb, var(--bg-elevated) 84%, #17273b 16%);
+}
+
+[data-theme='dark'] .demo-preset-inline-code {
+ border-color: color-mix(in srgb, var(--accent) 52%, transparent);
+ color: #d7ebff;
+}
+
+.demo-page-title {
+ margin: 0.5rem 0 0.35rem;
+ max-width: 19ch;
+ font-size: clamp(2rem, 4vw, 3.25rem);
+ letter-spacing: -0.045em;
+}
+
+.demo-page-copy {
+ margin: 0 auto 1.35rem;
+ max-width: 66ch;
+ font-size: 1.03rem;
+ color: color-mix(in srgb, var(--muted) 92%, var(--text) 8%);
+}
+
+.demo-hero {
+ display: grid;
+ justify-items: center;
+ gap: 0.1rem;
+}
+
+.demo-hero-eyebrow {
+ margin: 0;
+ justify-self: center;
+}
+
.section-title {
margin: 0 0 var(--space-2);
font-family: var(--font-display), var(--font-body), sans-serif;
@@ -885,6 +1307,9 @@ a {
}
.why-feature-media-shell {
+ display: flex;
+ justify-content: center;
+ align-items: center;
border: 1px solid var(--line);
border-radius: 14px;
background: linear-gradient(140deg, color-mix(in srgb, var(--surface) 84%, #fff), var(--bg-elevated));
@@ -892,9 +1317,12 @@ a {
}
.why-feature-media {
- width: 100%;
- height: clamp(180px, 38vw, 320px);
- object-fit: cover;
+ display: block;
+ width: auto;
+ max-width: 100%;
+ height: auto;
+ max-height: min(62vh, 520px);
+ object-fit: contain;
border-radius: 10px;
background: color-mix(in srgb, var(--surface) 82%, transparent);
}
@@ -1595,6 +2023,7 @@ a {
align-items: center;
justify-content: space-between;
gap: 0.75rem;
+ flex-wrap: wrap;
padding: 0.5rem 0.65rem;
border-bottom: 1px solid var(--line);
background: color-mix(in srgb, var(--surface) 82%, var(--bg-elevated));
@@ -1603,6 +2032,7 @@ a {
.doc-content .docs-code-tabs {
display: inline-flex;
align-items: center;
+ flex-wrap: wrap;
gap: 0.35rem;
}
@@ -1648,6 +2078,25 @@ a {
border-color: color-mix(in srgb, var(--accent) 45%, transparent);
}
+.doc-content img {
+ max-width: 100%;
+ height: auto;
+}
+
+.doc-content table {
+ width: 100%;
+ display: block;
+ overflow-x: auto;
+ border-collapse: collapse;
+}
+
+.doc-content th,
+.doc-content td {
+ border: 1px solid var(--line);
+ padding: 0.5rem 0.6rem;
+ text-align: left;
+}
+
.doc-content .docs-code-block pre {
margin: 0;
border: 0;
@@ -1831,7 +2280,88 @@ a {
}
}
+@keyframes demo-chat-typing {
+ 0%,
+ 80%,
+ 100% {
+ transform: translateY(0);
+ opacity: 0.5;
+ }
+ 40% {
+ transform: translateY(-3px);
+ opacity: 1;
+ }
+}
+
@media (max-width: 900px) {
+ .container {
+ width: min(1140px, 94vw);
+ }
+
+ .nav-shell {
+ height: auto;
+ min-height: 74px;
+ padding: 0.7rem 0;
+ flex-wrap: wrap;
+ position: relative;
+ }
+
+ .nav-menu-toggle {
+ display: inline-flex;
+ }
+
+ .site-nav {
+ width: 100%;
+ display: none;
+ grid-template-columns: 1fr;
+ gap: 0.45rem;
+ padding: 0.8rem;
+ margin: 0 0 0.35rem;
+ border: 1px solid var(--line);
+ border-radius: 14px;
+ background: color-mix(in srgb, var(--bg-elevated) 90%, var(--surface) 10%);
+ box-shadow: var(--shadow-sm);
+ }
+
+ .site-nav.is-open {
+ display: grid;
+ }
+
+ .site-nav a,
+ .theme-toggle {
+ width: 100%;
+ justify-content: flex-start;
+ padding: 0.58rem 0.66rem;
+ border-radius: 10px;
+ }
+
+ .site-nav a::after {
+ display: none;
+ }
+
+ .site-nav a.active,
+ .site-nav a[aria-current='page'] {
+ background: color-mix(in srgb, var(--accent) 18%, transparent);
+ }
+
+ .theme-toggle {
+ height: 2.1rem;
+ }
+
+ .demo-showcase-layout {
+ grid-template-columns: 1fr;
+ }
+
+ .demo-preset-sidebar {
+ position: static;
+ max-height: none;
+ top: auto;
+ }
+
+ .demo-preset-sidebar nav {
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
+ }
+
.docs-layout {
grid-template-columns: 1fr;
}
@@ -1840,6 +2370,16 @@ a {
max-height: none;
}
+ .docs-breadcrumbs {
+ overflow-x: auto;
+ padding-bottom: 0.3rem;
+ }
+
+ .docs-breadcrumbs ol {
+ width: max-content;
+ flex-wrap: nowrap;
+ }
+
.docs-pager {
grid-template-columns: 1fr;
}
@@ -1847,11 +2387,31 @@ a {
.docs-pager div:last-child {
text-align: left;
}
+
+ .demo-chat-history {
+ min-height: 220px;
+ max-height: 340px;
+ }
}
@media (max-width: 720px) {
- .nav-secondary-link {
- display: none !important;
+ .section {
+ padding: var(--space-6) 0;
+ }
+
+ .hero-stage {
+ min-height: auto;
+ align-items: flex-start;
+ }
+
+ .hero-copy {
+ font-size: 1rem;
+ line-height: 1.6;
+ }
+
+ .eyebrow-muted {
+ font-size: 0.75rem;
+ padding: 0.26rem 0.58rem;
}
.start-grid {
@@ -1876,7 +2436,6 @@ a {
}
.site-nav {
- gap: 0.8rem;
font-size: 0.9rem;
}
@@ -1899,9 +2458,117 @@ a {
flex-wrap: wrap;
}
+ .install-chip {
+ max-width: 100%;
+ white-space: normal;
+ line-height: 1.35;
+ }
+
.hero-title {
max-width: 16ch;
}
+
+ .demo-page-title {
+ max-width: 13ch;
+ font-size: clamp(1.75rem, 8.4vw, 2.45rem);
+ }
+
+ .demo-page-copy {
+ font-size: 0.93rem;
+ margin-bottom: 1rem;
+ }
+
+ .demo-showcase-editor-pane {
+ padding: 0;
+ }
+
+ .browser-frame,
+ .demo-showcase-frame {
+ max-height: none;
+ }
+
+ .demo-preset-writeup {
+ padding: 0.72rem 0.78rem 0.45rem;
+ }
+
+ .demo-preset-writeup p {
+ font-size: 0.86rem;
+ }
+
+ .demo-preset-title-row {
+ flex-wrap: wrap;
+ align-items: flex-start;
+ gap: 0.45rem;
+ }
+
+ .demo-preset-sidebar nav {
+ grid-template-columns: 1fr;
+ }
+
+ .demo-chat-history {
+ min-height: 190px;
+ max-height: 300px;
+ padding: 0.65rem;
+ }
+
+ .demo-chat-bubble {
+ max-width: 90%;
+ font-size: 0.9rem;
+ }
+
+ .demo-chat-message-meta {
+ font-size: 0.7rem;
+ }
+
+ .demo-chat-composer .luthor-chat-window-composer-row {
+ flex-wrap: wrap;
+ gap: 0.55rem;
+ }
+
+ .demo-chat-composer .luthor-chat-window-action-send--right {
+ width: 46px;
+ min-width: 46px;
+ min-height: 42px;
+ border-radius: 50%;
+ }
+
+ .why-feature-modal-backdrop {
+ padding: 0.8rem;
+ }
+
+ .why-feature-modal {
+ max-height: calc(100vh - 1.6rem);
+ padding: var(--space-3);
+ }
+
+ .link-row .btn {
+ width: 100%;
+ }
+
+ .docs-sidebar,
+ .docs-search {
+ padding: var(--space-3);
+ }
+
+ .docs-article {
+ padding: var(--space-3);
+ }
+
+ .doc-content pre {
+ font-size: 0.86rem;
+ }
+
+ .docs-pager a {
+ font-size: 0.92rem;
+ }
+
+ .footer-bottom {
+ align-items: flex-start;
+ }
+
+ .footer-bottom p {
+ width: 100%;
+ }
}
@media (max-width: 1020px) and (min-width: 721px) {
diff --git a/apps/web/src/components/layout/site-footer.tsx b/apps/web/src/components/layout/site-footer.tsx
index 69ee11a..e00d870 100644
--- a/apps/web/src/components/layout/site-footer.tsx
+++ b/apps/web/src/components/layout/site-footer.tsx
@@ -36,7 +36,7 @@ export function SiteFooter() {
-
@lyfie/headless
+
@lyfie/luthor-headless
diff --git a/apps/web/src/components/layout/site-header.tsx b/apps/web/src/components/layout/site-header.tsx
index 7bac12d..a04cc93 100644
--- a/apps/web/src/components/layout/site-header.tsx
+++ b/apps/web/src/components/layout/site-header.tsx
@@ -1,6 +1,6 @@
'use client';
-import { BookOpen, GithubLogo, House, MoonStars, PlayCircle, RocketLaunch, Sun } from '@phosphor-icons/react';
+import { BookOpen, GithubLogo, House, List, MoonStars, PlayCircle, Sun, X } from '@phosphor-icons/react';
import Image from 'next/image';
import Link from 'next/link';
import { usePathname, useRouter } from 'next/navigation';
@@ -24,6 +24,7 @@ export function SiteHeader() {
const [theme, setTheme] = useState
('light');
const [mounted, setMounted] = useState(false);
const [logoFailed, setLogoFailed] = useState(false);
+ const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
useEffect(() => {
const appliedTheme = document.documentElement.dataset.theme;
@@ -45,6 +46,10 @@ export function SiteHeader() {
router.prefetch('/demo/');
}, [router]);
+ useEffect(() => {
+ setMobileMenuOpen(false);
+ }, [pathname]);
+
function toggleTheme() {
const nextTheme: Theme = theme === 'dark' ? 'light' : 'dark';
setTheme(nextTheme);
@@ -56,6 +61,7 @@ export function SiteHeader() {
const isHomeActive = pathname === '/';
const isDocsActive = pathname.startsWith('/docs');
const isDemoActive = pathname.startsWith('/demo');
+ const closeMobileMenu = () => setMobileMenuOpen(false);
return (
@@ -76,16 +82,26 @@ export function SiteHeader() {
/>
)}
-