From c2fb976936d06f3feaeaef030cbbd5ef8bf95459 Mon Sep 17 00:00:00 2001 From: carlosabadia Date: Thu, 15 Oct 2026 11:19:57 +0200 Subject: [PATCH 1/3] Align XY docs with the Reflex marketing design --- docs/app/AGENTS.md | 5 + docs/app/README.md | 25 +- docs/app/assets/docs-header-theme.css | 202 ++++++++++++++ docs/app/assets/docs-overlays-theme.css | 340 ++++++++++++++++++++++++ docs/app/assets/docs-theme.css | 301 +++++++++++++++++++++ docs/app/assets/header/opal.avif | Bin 0 -> 2085 bytes docs/app/reflex.lock/bun.lock | 124 +++++---- docs/app/reflex.lock/package.json | 20 +- docs/app/rxconfig.py | 2 + docs/app/tests/test_docs_site.py | 2 +- docs/app/uv.lock | 87 +++--- docs/app/xy_docs/api_reference.py | 4 +- docs/app/xy_docs/breadcrumb.py | 2 +- docs/app/xy_docs/examples.py | 44 +-- docs/app/xy_docs/footer.py | 2 +- docs/app/xy_docs/markdown.py | 2 +- docs/app/xy_docs/navbar.py | 38 ++- docs/app/xy_docs/xy_docs.py | 35 ++- spec/process/production-readiness.md | 31 ++- 19 files changed, 1092 insertions(+), 174 deletions(-) create mode 100644 docs/app/assets/docs-header-theme.css create mode 100644 docs/app/assets/docs-overlays-theme.css create mode 100644 docs/app/assets/docs-theme.css create mode 100644 docs/app/assets/header/opal.avif diff --git a/docs/app/AGENTS.md b/docs/app/AGENTS.md index 27035c079..628eb2b12 100644 --- a/docs/app/AGENTS.md +++ b/docs/app/AGENTS.md @@ -124,6 +124,11 @@ repository root. build output and must not be committed. - Prefer a little consumer-side duplication when a shared API would otherwise become complex or couple unrelated sites. +- Keep the docs-only marketing brand layer in `assets/docs-theme.css`, + `assets/docs-header-theme.css`, and `assets/docs-overlays-theme.css`, following + Reflex PR #7549. These opt into the shared `docs-*` hooks without copying the + shared base theme or component implementations. Preserve live chart styles, + reduced-motion handling, and both color modes when updating this layer. ## Verification diff --git a/docs/app/README.md b/docs/app/README.md index 3bb0a10fe..4a9f34190 100644 --- a/docs/app/README.md +++ b/docs/app/README.md @@ -74,10 +74,22 @@ the sitemap, Markdown aliases, and internal documentation links. ## Working on the shared Reflex theme -The theme, button and search assets, navbar frame, announcement, sidebar shell, -and footer primitives come directly from `reflex-site-shared`. Do not copy them -into XY. XY owns its wordmark, navigation destinations, page actions, and footer -links. +The base theme, button and search assets, navbar frame, announcement, sidebar +shell, and footer primitives come directly from `reflex-site-shared`. Do not +copy those implementations into XY. XY owns its wordmark, navigation +destinations, page actions, footer links, and docs-specific brand layer. + +The three `assets/docs-*-theme.css` / `assets/docs-theme.css` stylesheets adapt +the docs-only styling from [Reflex PR #7549](https://github.com/reflex-dev/reflex/pull/7549): +Inter body text, Geist headings, warm neutral light/dark palettes, compact +controls, and the opal header artwork. They are loaded after the shared base +theme. The header styles reuse the shared announcement markup and dismissal +state; the artwork URL includes the `/docs/xy` mount prefix. Fonts are +bundled from the pinned Fontsource frontend packages, without a font CDN. +Editorial styles use shared `docs-*` hooks and the hooks added by +`xy_docs_layout`; keep them scoped so live chart examples retain their own +typography and data colors. The shared Markdown layout still owns navigation +destinations, while XY adds a two-column Back/Next treatment. To preview unpublished edits from a Reflex checkout, first install the locked XY docs environment, then install just the shared package editably (run from @@ -94,5 +106,6 @@ avoids generating upstream stubs just to preview the site. Use `--no-sync` for subsequent commands, and restart after shared Python or theme asset changes. `uv sync --frozen --group dev` restores the published Git dependency. The local editable installation is intentionally not a machine-specific lockfile change. -The neutral recolor requires the updated shared package; refresh the Git lock -once those upstream changes are published before deploying this styling. +The committed Git lock includes the shared docs styling hooks and named mobile +drawer from the merged design PR. Refresh all Reflex monorepo packages together +when updating that revision, then run the production checks above. diff --git a/docs/app/assets/docs-header-theme.css b/docs/app/assets/docs-header-theme.css new file mode 100644 index 000000000..00c43f3d4 --- /dev/null +++ b/docs/app/assets/docs-header-theme.css @@ -0,0 +1,202 @@ +/* XY docs header brand layer, adapted from reflex-dev/reflex#7549. */ +/* Docs keep a 64px fixed header and a 40px announcement contribution. + The banner artwork and glass treatment match the marketing site. */ +.docs-nav-frame { + left: 0; + --docs-control-shadow: 0 0 0 .5px rgb(0 0 0 / 12.5%), 0 1px 1px rgb(0 0 0 / 4%), 0 2px 4px rgb(0 0 0 / 4%); +} +.docs-nav-frame > .docs-navbar-header { + height: 64px; + padding-inline: 32px; + background: var(--background); + border-bottom: 1px solid var(--border-subtle); + border-radius: 0; + box-shadow: none; + transition: border-radius 200ms ease, background-color 200ms ease; +} +.docs-nav-frame:has([data-announcement]) > .docs-navbar-header { + margin-top: -24px; + border-radius: 24px 24px 0 0; +} +.docs-nav-frame > .docs-navbar-header > .docs-navbar-inner { + max-width: 1536px; +} +.docs-navbar-brand { gap: 12px; } +.docs-navbar-mobile-panel { + padding: 12px 24px 20px; + border-bottom: 1px solid var(--border); + border-radius: 0 0 24px 24px; + box-shadow: 0 12px 24px -16px rgb(0 0 0 / 20%); +} +.docs-navbar-mobile-link { padding-inline: 8px; } +.docs-navbar-mobile-link svg { color: var(--muted-foreground); } + +/* The in-page mobile drawer shares the desktop sidebar's typography. */ +.docs-sidebar-drawer { font-family: var(--font-sans); color: var(--foreground); } +.docs-sidebar-drawer p, +.docs-sidebar-drawer h3, +.docs-sidebar-drawer summary { font-weight: 400; } +.docs-sidebar-drawer h2 { + font-family: var(--font-sans); + font-size: 12px; + font-weight: 500; + letter-spacing: .025em; + text-transform: none; +} +.docs-sidebar-drawer .docs-sidebar-drawer-title { + font-size: 14px; + font-weight: 400; + line-height: 24px; + letter-spacing: 0; +} +.docs-sidebar-drawer #sidebar-container { min-height: 0; } +.docs-sidebar-drawer #sidebar-container > div { padding-left: 16px; padding-right: 20px; } +.docs-sidebar-drawer a:where(:not([aria-current='page'], [aria-current='true'])) p { + color: var(--muted-foreground); +} +.docs-sidebar-drawer a:hover p { color: var(--foreground); } +.docs-sidebar-drawer a[aria-current='page'] p { font-weight: 500; } +.docs-sidebar-drawer a:focus-visible, +.docs-sidebar-drawer summary:focus-visible { + outline: 2px solid var(--ring); + outline-offset: 3px; +} +@layer utilities { + html .docs-sidebar-drawer { + top: var(--docs-header-height) !important; + height: calc(100dvh - var(--docs-header-height)) !important; + } +} + +.docs-nav-frame [data-announcement] { + position: relative; + isolation: isolate; + height: 64px; + padding-bottom: 24px; + width: 100%; + overflow: hidden; + background: #e8e7f1; + color: #000; + border: 0; + font-family: Inter, Arial, sans-serif; +} +/* Shared banner content, links, and state stay in reflex-site-shared. */ +.docs-nav-frame [data-announcement]::before { + content: ''; + position: absolute; + z-index: -2; + inset: -48px -12%; + pointer-events: none; + background: url('/docs/xy/header/opal.avif') center 38% / cover no-repeat; + filter: blur(6px); + animation: docs-announcement-glass-drift 26s ease-in-out infinite alternate; +} +.docs-nav-frame [data-announcement]::after { + content: ''; + position: absolute; + inset: 0; + z-index: -1; + pointer-events: none; + background: radial-gradient(ellipse 34% 90% at 50% 36%, rgb(255 255 255 / 30%), transparent), + linear-gradient(180deg, rgb(255 255 255 / 28%), transparent 45%); + box-shadow: inset 0 1px 0 rgb(255 255 255 / 75%); +} +.docs-nav-frame [data-announcement] > a { + display: block; + height: 100%; + width: 100%; + color: #000; + background: transparent; +} +.docs-nav-frame [data-announcement] > a > span:first-child { + display: flex; + height: 100%; + width: 100%; + margin-inline: auto; + padding-inline: 48px; + align-items: center; + justify-content: center; + gap: 10px; +} +.docs-nav-frame [data-announcement] > a > span:first-child > span:first-child { + display: inline-flex; + flex-shrink: 0; + align-items: center; + height: 20px; + padding-inline: 8px; + border-radius: 999px; + background: #000; + color: #fff; + font: 400 12px/18px Inter, Arial, sans-serif; +} +.docs-nav-frame [data-announcement] > a > span:first-child > span:nth-child(2) { + color: #000; + font: 400 14px/20px Inter, Arial, sans-serif; + white-space: nowrap; +} +.docs-nav-frame [data-announcement] > a > span:first-child > span:nth-child(3) { + display: inline-flex; + align-items: center; + gap: 6px; + flex-shrink: 0; + padding: 5px 12px; + border-radius: 999px; + background: #fff; + color: #000; + font: 400 13px/20px Inter, Arial, sans-serif; + box-shadow: var(--docs-control-shadow); + white-space: nowrap; +} +.docs-nav-frame [data-announcement] > button { + position: absolute; + top: 20px; + right: 16px; + display: inline-flex; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + border: 0; + border-radius: 999px; + background: transparent; + color: #000; + cursor: pointer; +} +.docs-nav-frame [data-announcement] > button:hover { background: rgb(255 255 255 / 35%); } +.docs-nav-frame [data-announcement] > a:focus-visible, +.docs-nav-frame [data-announcement] > button:focus-visible { outline: 2px solid #000; } +.docs-nav-frame [data-announcement] > a:focus-visible { outline-offset: -4px; } +.docs-nav-frame [data-announcement] > button:focus-visible { outline-offset: 2px; } +@keyframes docs-announcement-glass-drift { + from { transform: translate3d(-5%, 0, 0) scale(1.04); } + to { transform: translate3d(5%, 0, 0) scale(1); } +} +@media (max-width: 1279px) { + .docs-nav-frame:has(.docs-navbar-menu[open]) > .docs-navbar-header { + border-radius: 0; + } +} +@media (max-width: 640px) { + .docs-nav-frame [data-announcement] > a > span:first-child > span:nth-child(3) { display: none; } +} +@media (max-width: 639px) { + .docs-nav-frame > .docs-navbar-header { padding-inline: 16px; } + .docs-navbar-inner { gap: 16px; } + .docs-navbar-brand { gap: 10px; } + .docs-navbar-mobile-panel { padding-inline: 16px; } + .docs-nav-frame [data-announcement] > a > span:first-child { padding-inline: 40px; gap: 8px; } + .docs-nav-frame [data-announcement] > button { right: 8px; } +} +@media (max-width: 379px) { + .docs-nav-frame [data-announcement] > a > span:first-child > span:nth-child(2) { font-size: 13px; } +} +@media (prefers-reduced-motion: reduce) { + .docs-nav-frame [data-announcement]::before { animation: none; } + .docs-nav-frame > .docs-navbar-header, + .docs-navbar-mobile-link { transition: none; } +} + +.docs-nav-frame [data-announcement] > a > span:first-child > span:first-child { border: 0; text-transform: none; letter-spacing: normal; } +.docs-nav-frame [data-announcement] .announcement-shimmer { animation: none; background: none; -webkit-text-fill-color: currentColor; } +.docs-nav-frame [data-announcement] .announcement-shimmer::after { content: none; } +.docs-nav-frame [data-announcement] > a:hover { background: transparent; } diff --git a/docs/app/assets/docs-overlays-theme.css b/docs/app/assets/docs-overlays-theme.css new file mode 100644 index 000000000..5f26f272d --- /dev/null +++ b/docs/app/assets/docs-overlays-theme.css @@ -0,0 +1,340 @@ +/* Docs brand layer adapted from reflex-dev/reflex#7549 (749463293bc6). + Shared base styles remain owned by reflex-site-shared. */ +/* Documentation chrome only. Live component examples keep their own styles. */ + +/* Search ships its own inline stylesheet, so these selectors deliberately + include the overlay/root to take precedence in both color modes. */ +html .ReflexSearch-root .ReflexSearch-button { + background: var(--background); + border-color: var(--border); + box-shadow: none; + font-family: var(--font-sans); + font-weight: 400; +} + +html .ReflexSearch-root .ReflexSearch-button:hover { + background: var(--muted); + border-color: var(--border-strong); +} + +html .ReflexSearch-root .ReflexSearch-shortcut { + background: var(--muted); + border-color: var(--border-subtle); + color: var(--muted-foreground); + font-weight: 400; +} + +html .ReflexSearch-overlay { + background: rgb(21 20 19 / 36%); + backdrop-filter: blur(6px); +} + +html .ReflexSearch-overlay .ReflexSearch-dialog { + background: var(--background); + border-color: var(--border); + border-radius: 24px; + box-shadow: 0 20px 64px rgb(0 0 0 / 14%); + font-family: var(--font-sans); +} + +html .ReflexSearch-overlay .ReflexSearch-inputRow { + height: 64px; + min-height: 64px; + padding-inline: 24px; +} + +html .ReflexSearch-overlay .ReflexSearch-dialog[data-results-visible="true"] .ReflexSearch-inputRow { + border-bottom-color: var(--border-subtle); +} + +html .ReflexSearch-overlay .ReflexSearch-input, +html .ReflexSearch-overlay .ReflexSearch-input::placeholder, +html .ReflexSearch-overlay .ReflexSearch-escape, +html .ReflexSearch-overlay .ReflexSearch-hit, +html .ReflexSearch-overlay .ReflexSearch-footer { + font-weight: 400; +} + +html .ReflexSearch-overlay .ReflexSearch-escape { + background: var(--muted); + border-color: var(--border); + border-radius: 6px; + color: var(--muted-foreground); +} + +html .ReflexSearch-overlay .ReflexSearch-escape:hover { + background: var(--accent-hover); + color: var(--foreground); +} + +html .ReflexSearch-overlay .ReflexSearch-hit { + background: transparent; + border-color: transparent; +} + +html .ReflexSearch-overlay .ReflexSearch-hit[data-selected="true"], +html .ReflexSearch-overlay .ReflexSearch-hit:hover { + background: var(--muted); + border-color: var(--border); +} + +html .ReflexSearch-overlay .ReflexSearch-hit:active { + background: var(--accent-hover); +} + +html .ReflexSearch-overlay .ReflexSearch-hitTitleRow strong { + font-weight: 500; +} + +html .ReflexSearch-overlay .ReflexSearch-hitDescription, +html .ReflexSearch-overlay .ReflexSearch-hitBreadcrumbs, +html .ReflexSearch-overlay .ReflexSearch-emptyState { + color: var(--muted-foreground); +} + +html .ReflexSearch-overlay .ReflexSearch-emptyState strong { + font-family: var(--font-heading); + font-size: 24px; + font-weight: 300; + line-height: 1.25; + letter-spacing: -0.025em; +} + +html .ReflexSearch-overlay .ReflexSearch-emptyIcon { + box-shadow: none; +} + +html .ReflexSearch-overlay .ReflexSearch-footer { + background: var(--subtle); + border-top-color: var(--border-subtle); + color: var(--muted-foreground); + padding-inline: 24px; +} + +html .ReflexSearch-overlay .ReflexSearch-footer a { + color: var(--muted-foreground); +} + +html .ReflexSearch-overlay .ReflexSearch-footer a:hover { + color: var(--foreground); +} + +html .ReflexSearch-overlay :is(.ReflexSearch-escape, .ReflexSearch-hit, .ReflexSearch-footer a):focus-visible { + outline: 2px solid var(--ring); + outline-offset: 2px; +} + +/* Split page actions remain a single compact control. */ +.docs-page-actions > button, +.docs-page-actions > [data-slot="popover-trigger"] { + min-height: 36px; + background: var(--background); + border-color: var(--border); + box-shadow: none; + font-family: var(--font-sans); + font-weight: 400; +} + +.docs-page-actions > button:first-child { + border-radius: 999px 0 0 999px; + padding-left: 14px; +} + +.docs-page-actions > [data-slot="popover-trigger"] { + border-radius: 0 999px 999px 0; + padding-right: 12px; +} + +.docs-page-actions > button:hover { + background: var(--muted); +} + +.docs-page-actions > button:focus-visible { + position: relative; + z-index: 1; + outline: 2px solid var(--ring); + outline-offset: 2px; +} + +.docs-page-actions-menu { + background: var(--card); + border-color: var(--border); + border-radius: 20px; + padding: 8px; + box-shadow: 0 8px 32px rgb(0 0 0 / 8%); + font-family: var(--font-sans); +} + +.docs-page-actions-menu > div > :is(a, button) { + border-radius: 12px; + padding: 12px; +} + +.docs-page-actions-menu .font-medium { + font-weight: 400; +} + +/* Both feedback entry points render this same content inside a portal. */ +[data-slot="popover-popup"]:has(> .docs-feedback-content) { + width: 336px; + max-width: calc(100vw - 32px); + padding: 0; + background: var(--card); + border: 1px solid var(--border); + border-radius: 20px; + color: var(--foreground); + box-shadow: 0 8px 32px rgb(0 0 0 / 8%); + font-family: var(--font-sans); +} + +.docs-feedback-content { + padding: 20px; +} + +.docs-feedback-content div:has(> input[data-slot="input"]), +.docs-feedback-content textarea { + background: var(--background); + border-color: var(--border); + border-radius: 12px; + color: var(--foreground); + box-shadow: none; + font-family: var(--font-sans); + font-size: 14px; + font-weight: 400; +} + +.docs-feedback-content textarea { + min-height: 128px; + padding: 12px; + line-height: 1.5; +} + +.docs-feedback-content div:has(> input[data-slot="input"]) { + min-height: 40px; +} + +.docs-feedback-content input { + background: transparent; + color: var(--foreground); + font-family: var(--font-sans); + font-size: 14px; + font-weight: 400; +} + +.docs-feedback-content :is(input, textarea)::placeholder { + color: var(--muted-foreground); +} + +.docs-feedback-content button { + font-family: var(--font-sans); + font-weight: 400; + box-shadow: none; +} + +.docs-feedback-content button[type="submit"] { + min-height: 40px; + background: var(--primary); + color: var(--primary-foreground); + border-color: transparent; +} + +.docs-feedback-content button[type="submit"]:enabled:hover { + background: var(--primary-hover); +} + +.docs-feedback-content :is(textarea, button):focus-visible, +.docs-feedback-content div:has(> input[data-slot="input"]:focus-visible) { + outline: 2px solid var(--ring); + outline-offset: 2px; +} + +.docs-feedback-content textarea:is([data-invalid], [aria-invalid="true"], :user-invalid), +.docs-feedback-content div:has(> input:is([data-invalid], [aria-invalid="true"], :user-invalid)) { + border-color: var(--destructive-10); +} + +.docs-feedback-content :is(input, textarea):disabled { + color: var(--muted-foreground); + cursor: not-allowed; +} + +.docs-hint { + background: var(--foreground); + border: 1px solid var(--foreground); + border-radius: 8px; + color: var(--background); + box-shadow: none; + padding: 6px 10px; + font-family: var(--font-sans); + font-size: 12px; + font-weight: 400; + line-height: 1.5; +} + +/* Footers use body typography, including utility text inherited from the + older monospace shell. Keep service-status colors and theme states intact. */ +.docs-page-footer, +.docs-page-footer .font-small, +.marketing-footer { + font-family: var(--font-sans); + font-weight: 400; +} + +.docs-page-footer .font-small { + font-size: 12px; + line-height: 20px; + letter-spacing: normal; +} + +.docs-page-footer button { + font-family: var(--font-sans); + font-weight: 400; + box-shadow: none; +} + +.docs-page-footer :is(a, button):focus-visible { + outline: 2px solid var(--ring); + outline-offset: 4px; +} + +.marketing-footer h2 { + font-family: var(--font-sans); + font-weight: 400; + letter-spacing: normal; +} + +.marketing-footer input[type="email"] { + font-family: var(--font-sans); + font-weight: 400; +} + +@media (max-width: 40rem) { + html .ReflexSearch-overlay .ReflexSearch-dialog { + border-radius: 20px; + } + + html .ReflexSearch-overlay .ReflexSearch-inputRow, + html .ReflexSearch-overlay .ReflexSearch-footer { + padding-inline: 16px; + } + + html .ReflexSearch-overlay .ReflexSearch-escape { + border-radius: 10px; + } + + .docs-feedback-content { + padding: 16px; + } +} + +@media (prefers-reduced-motion: reduce) { + .docs-page-actions > button, + .docs-page-actions-menu, + .docs-page-actions-menu > div > :is(a, button), + [data-slot="popover-popup"]:has(> .docs-feedback-content), + .docs-feedback-content :is(input, textarea, button), + .docs-hint { + transition: none; + animation: none; + } +} diff --git a/docs/app/assets/docs-theme.css b/docs/app/assets/docs-theme.css new file mode 100644 index 000000000..cf0d823cf --- /dev/null +++ b/docs/app/assets/docs-theme.css @@ -0,0 +1,301 @@ +/* Docs brand layer adapted from reflex-dev/reflex#7549 (749463293bc6). + Shared base styles remain owned by reflex-site-shared. */ +/* Docs-only brand layer. Shared package consumers retain their own theme. + Editorial selectors deliberately exclude live component examples. */ +/* Match marketing with variable WOFF2 subsets bundled from Fontsource. */ +@font-face { + font-family: 'Geist'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(@fontsource-variable/geist/files/geist-latin-ext-wght-normal.woff2) format('woff2-variations'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, 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; +} + +@font-face { + font-family: 'Geist'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(@fontsource-variable/geist/files/geist-latin-wght-normal.woff2) format('woff2-variations'); + 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; +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(@fontsource-variable/inter/files/inter-latin-ext-wght-normal.woff2) format('woff2-variations'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, 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; +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(@fontsource-variable/inter/files/inter-latin-wght-normal.woff2) format('woff2-variations'); + 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; +} + +:root { + --font-instrument-sans: Inter, Arial, sans-serif; + --font-sans: Inter, Arial, sans-serif; + --font-heading: Geist, Inter, Arial, sans-serif; + --font-weight-book: 400; + --font-weight-normal: 400; + --radius-card: 20px; + --radius-panel: 24px; +} + +:root, .light, .light-theme { + --background: #fdfcfc; + --foreground: #000; + --card: #fff; + --card-foreground: #000; + --primary: #000; + --primary-foreground: #fff; + --primary-hover: #2b2b2b; + --muted: #f5f3f1; + --muted-foreground: #69645e; + --subtle: #f9f8f7; + --subtle-foreground: #777169; + --accent: #f5f3f1; + --accent-hover: #ebe8e4; + --inset: #ebe8e4; + --border: #e5e2de; + --border-subtle: #efeeec; + --border-strong: #cbc5bf; + --ring: #5c52b4; +} + +.dark, .dark-theme { + --background: #151413; + --foreground: #f5f3f1; + --card: #1d1c1a; + --card-foreground: #f5f3f1; + --primary: #f5f3f1; + --primary-foreground: #151413; + --primary-hover: #ded9d2; + --muted: #22211f; + --muted-foreground: #b7b1a9; + --subtle: #1b1a18; + --subtle-foreground: #a39d95; + --accent: #292724; + --accent-hover: #35322e; + --inset: #35322e; + --border: #393631; + --border-subtle: #2c2a27; + --border-strong: #5c5750; + --ring: #afa5f4; +} + +.font-heading { font-family: var(--font-heading); } + +/* Article shell: quieter navigation, a comfortable line length, useful TOC. */ +.docs-reading-layout { max-width: 1536px; } +.docs-reading-layout .docs-sidebar { width: 272px; } +.docs-sidebar::before { background: var(--background); } +.docs-sidebar #sidebar-container > div { padding-left: 16px; padding-right: 20px; } +.docs-sidebar p, +.docs-sidebar h3, +.docs-sidebar summary { font-weight: 400; } +.docs-sidebar h2 { + font-family: var(--font-sans); + font-size: 12px; + font-weight: 500; + letter-spacing: .025em; + text-transform: none; +} +.docs-sidebar a:where(:not([aria-current='page'], [aria-current='true'])) p { + color: var(--muted-foreground); +} +.docs-sidebar a:hover p { color: var(--foreground); } +.docs-sidebar a[aria-current='page'] p { font-weight: 500; } +.docs-sidebar a:focus-visible, +.docs-sidebar summary:focus-visible { + outline: 2px solid var(--ring); + outline-offset: 3px; +} +.docs-reading-column { max-width: 896px; padding-inline: 48px; } +.docs-reading-column .docs-prose { + font-size: 15px; + font-weight: 400; + line-height: 1.85; + letter-spacing: -.006em; +} +.docs-reading-column .docs-heading { + min-width: 0; + overflow-wrap: anywhere; + font-family: var(--font-heading); + font-weight: 400; + letter-spacing: -.035em; + line-height: 1.18; +} +.docs-reading-column h1.docs-heading { + font-size: clamp(34px, 3vw, 44px); + font-weight: 300; + margin-top: 8px; + margin-bottom: 12px; +} +.docs-reading-column h2.docs-heading { font-size: 30px; margin-top: 48px; } +.docs-reading-column h3.docs-heading { font-size: 23px; margin-top: 32px; } +.docs-reading-column h4.docs-heading { font-size: 17px; font-weight: 500; } +.docs-article .code-block { + border-color: var(--border); +} +.docs-reading-column .docs-page-navigation { + justify-content: space-between; + gap: 16px; + margin-top: 32px; + margin-bottom: 24px; +} +.docs-page-navigation > a { + min-width: 0; + gap: 2px; + padding: 10px 16px; + border: 1px solid var(--border); + border-radius: 12px; + background: var(--background); + transition: background-color 160ms ease, border-color 160ms ease; +} +.docs-page-navigation > a > span:first-child { + gap: 6px; + font-size: 12px; + font-weight: 400; + line-height: 16px; +} +.docs-page-navigation > a > span:first-child svg { width: 14px; height: 14px; } +.docs-page-navigation > a > span:last-child { + font-size: 14px; + font-weight: 400; + line-height: 20px; + overflow-wrap: anywhere; +} +.docs-page-navigation > a:hover { + background: var(--muted); + border-color: var(--border-strong); +} +.docs-reading-layout .docs-toc { width: 220px; padding-right: 24px; } +.docs-toc p, .docs-toc a { font-size: 12px; font-weight: 400; line-height: 1.65; } +.docs-toc p { font-weight: 500; } +.docs-toc #toc-navigation { gap: 4px; } + +.docs-landing footer > div { max-width: 1176px; padding-inline: 32px; } +.docs-landing footer { border-top: 1px solid var(--border-subtle); } + +@media (min-width: 1280px) { + .docs-reading-layout .docs-toc { display: block; } +} +@media (max-width: 1279px) { + .docs-reading-column { padding-inline: 32px; } +} +@media (max-width: 1023px) { + .docs-reading-column { max-width: 800px; padding-inline: 24px; } + .docs-reading-column .docs-breadcrumb { margin-bottom: 28px; } +} +@media (max-width: 639px) { + .docs-reading-column { padding-inline: 20px; } + .docs-reading-column .docs-prose { font-size: 15px; } + .docs-reading-column h2.docs-heading { font-size: 26px; } + .docs-page-navigation > a { + min-width: 0; padding: 10px 12px; } + .docs-reading-column .docs-page-navigation { gap: 8px; } + .docs-landing footer > div { padding-inline: 16px; } +} +@media (prefers-reduced-motion: reduce) { + .docs-page-navigation > a { + min-width: 0; transition: none; } +} + +/* Documentation surfaces only: never select controls inside live examples. */ +.docs-demo-header { align-items: center; gap: 12px; margin-bottom: 12px; } +.docs-demo-header > a { margin: 0; font-family: var(--font-sans); font-weight: 400; font-size: 13px; } +.docs-article .doc-demo-tab-card { + border-radius: var(--radius-card); + border-color: var(--border); + background: var(--muted); +} +.docs-article .docs-demo-preview { border-radius: var(--radius-card); } +.docs-article :is(.docs-demo-preview, .docs-api-preview) { + align-items: safe center; +} +.docs-article .docs-callout { border-radius: 16px; } +.docs-article .docs-callout > div { font-weight: 400; } +.docs-markdown-table { border-radius: 16px; overflow-x: auto; } +.docs-markdown-table table { background: var(--background); border: 0; } +.docs-markdown-table thead { background: var(--muted); } +.docs-markdown-table :is(th, td) { font-size: 13px; line-height: 1.7; padding: 12px 16px; } +.docs-markdown-table th { font-weight: 500; color: var(--foreground); } +.docs-markdown-table td { font-weight: 400; } +.docs-markdown-table tbody tr:last-child { border-bottom: 0; } +.docs-article .code-style { border-color: var(--border); } + +/* Existing tab and code utilities use !important; keep overrides in their layer. */ +@layer utilities { + .docs-article .doc-demo-tab-list { + width: fit-content; + flex-shrink: 0; + margin: 0; + gap: 2px !important; + padding: 3px !important; + border: 1px solid var(--border) !important; + border-radius: 999px; + background: var(--muted) !important; + box-shadow: none !important; + } + .docs-article .doc-demo-tab::before, + .docs-article .doc-demo-tab::after { + display: none !important; + } + html .docs-article .doc-demo-tab { + border: 0 !important; + border-radius: 999px !important; + margin: 0; + padding: 7px 12px !important; + min-height: 32px; + font-family: var(--font-sans); + font-size: 13px !important; + font-weight: 400 !important; + background: transparent !important; + color: var(--muted-foreground) !important; + } + html .docs-article .doc-demo-tab[data-state='active'] { + background: var(--card) !important; + color: var(--foreground) !important; + box-shadow: 0 1px 3px rgb(0 0 0 / .06) !important; + } + html .docs-article .doc-demo-tab:hover { color: var(--foreground) !important; } + html .docs-article .doc-demo-tab:focus-visible { + outline: 2px solid var(--ring); + outline-offset: 2px; + } + .docs-article .code-block:not(.doc-demo-tab-card .code-block) { border-radius: 16px !important; } + .docs-article .code-block button { + font-family: var(--font-sans) !important; + font-weight: 400 !important; + border-radius: 999px !important; + background: var(--muted) !important; + } + .docs-article .code-block button:focus-visible { + outline: 2px solid var(--ring) !important; + outline-offset: 2px; + } + @media (hover: none) { + .docs-article .code-block button { opacity: 1 !important; pointer-events: auto; } + .docs-article .code-block:has(button) { padding-top: 48px !important; } + } + @media (prefers-reduced-motion: reduce) { + .docs-article .doc-demo-tab, .docs-article .code-block button { transition: none !important; } + } +} + +.docs-breadcrumb :is(a, span) { font-weight: 400; } +.docs-article .docs-table { box-shadow: none; border-radius: 16px; } + +.docs-markdown-table { box-shadow: none; } +.docs-markdown-table :is(th, td) { box-shadow: none; border-bottom: 1px solid var(--border-subtle); } +.docs-markdown-table th { background: var(--muted); } +.docs-markdown-table tbody tr { background: var(--background); } +.docs-markdown-table tbody tr:last-child td { border-bottom: 0; } diff --git a/docs/app/assets/header/opal.avif b/docs/app/assets/header/opal.avif new file mode 100644 index 0000000000000000000000000000000000000000..1dc0988c83e41cddaaf23198df5a2c409556b2ab GIT binary patch literal 2085 zcmXv|2{_by7yjF(F${_bg%KfqvNe-1GnhNvp(IPT?2}=Ju?@n_OqT2-Tb9DuuRWn8 zMV9D`vSl(9;x?A=4w3yE-RGX)^E>Z*-t#`^8~_01@WJ6^Hwpm{aN-C_1iU7R;D)zA zYoa+4i{usTcGTkp%-fR~_zwjDGQlJGU;Zx&kqN=1Uj-K@%MghE9!Hf40B~{MQ3kj~ z0pQpP4p$}+{C+L{)sf;9Uff4!j>nC1LDSfu=>Kb%4}ly==IA&A*~6cMVuT>F*O8H9 zMg8*u5i%i+aHQ~n!C(#ux=}QZsd5|!0HPlL#6Uj}Vi;#K6aYnYBnbkU00=)qUTJ-ESY()>MH3R~${l!21B<@qSm%M0sgN^tKI?sVzp`lO z_w!z*eh&Pj8Et>yd5T}?RQ?$)vWn^ox~v8Mu0Kq#epHuB=QB&KE_h6o+?75hq5RGL zb(0C}t2^#0h}rCEzcM`Vbn=GsM!TRdenLn?+aOH4T3+J^0~6XLE{r;K#ot=rU6))k z&GWfMVXAgw?Jq6+%Sd9B%WWtfVKZ}Qrg}Jxk67q+s+*iuT36M>+qW6r|9;Gd@D`@6W4RN|ZfDOBG zIy~hs7ay!mbnL}Y)r2<&HSICrQv$A1|0y^t-TNr!<%&$Q2~-%d3NIOl1!9FA-*t=! zlv!Wax~!-mbo1k;*d#EN)O0_z)-u6+OVCg0vC#BnUP$ECHpVAcbNi4db>&a?QaZxU z!9t-gCRT)^1pAgyn;Au_WzKpNQ`8sHC#g~8q`&il2O2zvd}FoTXPjakzBo>hKf4~N z#x^z>P||&f^R3lcLuU98Q2V5qtV1i?53~A${nsBoAA`J zdYqXG2~>(`<*gZS(#+=he9ACkm2p$oO*q7YcBMbtD__R_tw~d9d&NZ3b2}vNZc*O| zZFVoTcbFnT+Bw@&_E`zB+IRo!-tL6CX0Gd_z2@M-QSL%QR4}gU2ac0Pqj}D!G>pABVqwt@wo%$TwWck8h zf%Li3-F&c^ft147{H_XXwIJj#_y@I=X?^)!FveQ#{BIBsIpduQ!N}s8hvHWwn>x98 zo?c(pgDi26f;JZNclVliK?Bf{iKm5_#z3G+zP!K^7kOfple2Bu_%~% z;rp0j#v@IL9@Nfper?Avl{WHrid|?{e$6HE)TdFfEqySpg4rRVcCK`@?}{cI5()~+ z85x=|TaUvtJGSkll^wH$_@fOMpk(_J)`3f+i3~eKxmCfN=2|Q}*IDgwue8H$QY!t*tY-#_ixbOUAr0J5@gfV2BesRG%F2sl%$%E0oJC{LN(==P1%) zwfP&Z^G=tyUDuhqub6g4H1ydg=cnk$k@%t6vF`?;gI>%I7bi~uM$*52p&qt6o%~#6C4bm9( zEUmb+`|8G+Ytg*-d6%PR>7GNDquni)3JA+nP4LP^w*LE{VBP|{bdQjECTSfeU0>)Z zzYx8UADvds&O+;44j!5C$+7zm-x;A6Jr4nf z{qeYpL&knGRJc9@KXzUAnPH%{O3jvSf23bnE6sovxL3G z4}@n7Eb85a-B`G@(^GB8q9>s8Owv4hx}~a-8i8tQ_sadDP*^Cjf(T^8vdVfc;-@pR zy)@vSHuT&EEBA_7ixky@uaBN=o8lhBS`)W`ZD@K*(x(GHi7XA+nUmRqS}Hj#jEhHA%jC5D2`lx$p0zK(l*LQ5flt1Va(>ogQqUtL~!8AnMrvL4-$l|%_ zm_B&Y2)3ao&E|qrvM+?a7VI!u>!c+N#W8x!eG3sgzmtqjuC$JNQWN@Zd%*g~K#R}U zqL>kH56u!^y7T;i2QBk=wB#UXyLF?EVMLSG1oq&msIqxX=F)}qsEY5`d7yWI%+0Rn z-@lB@$WI95#m1F}hLOZ=$cZ z#r=x7ki?}L8iBvm1>@+R1H$R8E$<+GHo!p{R;r9T>C&GbC0ngk8t?B^3KS*ZU!`iD wq1$5HnUk4Vc4`)bScuFsE-la=16.0.0" } }, "sha512-9tAsd92yMVVGP+E+d8cM+wc0VnXuYZHNbWQi7TOe8k2neawmhiaFmVFbzyruejhOMa197/LbgvSED32ayUo3ZA=="], @@ -141,7 +147,7 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "@oxc-project/types": ["@oxc-project/types@0.144.0", "", {}, "sha512-nuhZIOLuI6TFQ32I/WnUx+SCPY7SdSKwgnFHydAuoS1+Z4BRcaP+RRJmGzl9lw+0OFF7UmaESf7KQRXaNLHypg=="], + "@oxc-project/types": ["@oxc-project/types@0.154.0", "", {}, "sha512-KYOUGQFlLWR+s4QMV2Q9ko38TZm7EdO87Qm7rvZLqk/webse/cDjtyxKhg/47l0byCbs/k46LT8qc4PKjAikzA=="], "@radix-ui/colors": ["@radix-ui/colors@3.0.0", "", {}, "sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg=="], @@ -277,49 +283,51 @@ "@remix-run/route-pattern": ["@remix-run/route-pattern@0.22.1", "", {}, "sha512-czdGJWh09Lapvcqt7Vb09KlrU2PhRJ8xQaI+AItTuD9aDJ5MAgxnS38lnys6Ll+6RJEqPiaUqTwIQhVLwFvv+w=="], - "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.2.4", "", { "os": "android", "cpu": "arm64" }, "sha512-jHC2cnyKz5xU2fhECtFl8OZ83cYNt13GZQD+0uMJ/X3o+ijmd56okHhTUwxVSHPx1IRVIJEZ1/1pPzeLCU6XKA=="], + "@rolldown/binding-android-arm-eabi": ["@rolldown/binding-android-arm-eabi@1.2.14", "", { "os": "android", "cpu": "arm" }, "sha512-aWR+XKH9+rW7m5fWq/5360J3mHycrx/o6xZM2DQFdJnTMdyP7/WzxPjhtLbVWdKo2y612/4U1bWqb3HQhiF7vg=="], + + "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.2.14", "", { "os": "android", "cpu": "arm64" }, "sha512-QiVxHofl6A8lQU7WAtOUY4QMVZXohxwz7WJJoeh8NBEUyKfIkMRKhYyq8az/1RypNiIXzNTtiS6KwHz0erxYRQ=="], - "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Dc5mPD8F5F/FS8i01syd7FTF6yB2fVthH/TRkjwJkzUK6EpoxHtqvZQP5Zwq80/5z19TWYHIg1KOHboCgVx/aQ=="], + "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.2.14", "", { "os": "darwin", "cpu": "arm64" }, "sha512-lTQOzHuBIooh3jIr5XINQkjPGEuGy+Dsy0meXDr6Sjty0b99kYgGh4uBC/8mJX1T0kC8d6S0aPP1Y+bHkh6aBw=="], - "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-fpDm4oBo6SqLvWUYCmFhdde3U9KH2fRNNMeAnAPAIwxRL345xutL0EtEUcuoxsoazdJGv/MuDBQHlCDrtbvqOg=="], + "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.2.14", "", { "os": "darwin", "cpu": "x64" }, "sha512-hyMKEGatjmBYCs/Q4sbIcL/GqpFEqsX3wc+HYVQ/85A4rxc1o7rPm4DUI4GV4k/h0ITddwFSGpqQunI14GXjTA=="], - "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.2.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-rSJoreDE/HoIzoaib6MTp5jQtCTdMHKIvItAKT/ImS6Y6Ww76oUaeMyp4Vc/fAgd/ehji068IxetHXAnqUwN9A=="], + "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.2.14", "", { "os": "freebsd", "cpu": "x64" }, "sha512-u371GbXoVXrEgP20PwzoGNOdAOqAMhzo19JzzY+V4YmmnC+DTOoqdbMu+O+54emM59Mik/UdrtWgcuEDKWRPKA=="], - "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-/jm8OGHgn7oGaJu3i/qZI9spUGcJ+y/lk43ttQ/iO1tOd9NissG6o97bighBCiL+BKRngmcDuR6ikfwYdJmVuQ=="], + "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.2.14", "", { "os": "linux", "cpu": "arm" }, "sha512-BqwKsdZQf6EqVWr8fv2MrDYzAvOZ7+NYFSJESRGs87fkseEhs0TU9TXgRJTkZoRRkxTizyEg1LKUXfU3/78uqg=="], - "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-tIP06BeD9EqvECBrPZ+sqdPlYrT+aYaAiu1wYziVx5elRK/ftm33JxVDy2bXGbr6J0CrtirCkR87/X5a2euEng=="], + "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.2.14", "", { "os": "linux", "cpu": "arm64" }, "sha512-SD9kY8M009x/7s57Z1dgUVlP5+uYBgKQK0Tkr1WIWngrtUJmRCW1RJFMY7QDla2khXhmg2i5Io7MUjcmZNZ/KQ=="], - "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-Ql1Q0EQqVThvn9VAVlwNzsUvbSFtCMGjLpRRi4pk5i7NZZ4n5ISiLMjHYtus4VQ2PvkSw24zyaCVsiS+sXPj1w=="], + "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.2.14", "", { "os": "linux", "cpu": "arm64" }, "sha512-BJ2CL19M6uuWesMgnqJzgxoI+N+eV7b0A9O9vLV42y+gitC41fNa8KElau1tHVzuLWX5GzEuxMPhAO0tQXQMkg=="], - "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.2.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-GjbjXD4XXfN19D0LZNbmiCBUoDiRACsYHr0yaIbbn8aFsXjHZifcYqu/W5Er5X2X990WjHXFrxarn5chzItorQ=="], + "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.2.14", "", { "os": "linux", "cpu": "ppc64" }, "sha512-4+Kl8daPV8NDHaD7mfCcc1pRM+Qg7ab8DyMm5FG5WoZgv4h2i3KFN1CybYBNbQqmuYm7ftJLvmMI1eHYJ22S/Q=="], - "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-p5WR0NOwaRmJ/B1b6IjEFLLivwEsf3PrdBIhRbhTCQisbo2SvHHpG4ELB/+FgQNnB88LTOF86upmJmbvZdQ2lw=="], + "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.2.14", "", { "os": "linux", "cpu": "s390x" }, "sha512-V/h8ePq1fKDrmtFMz6xcCN3DKvuvMRrwwD1q0PkBeeo4DpK64biaKvqWGVxqCeYKqeRk7gE7/iKPxLCn08O97A=="], - "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-4/GyVjmhR+Tc6HLJvwc1sOhPqAZtySiSMesOZyX6JQ5XBxoTDEMKQzvo07NIK6nTon/SivlZqvhzvuVBNQhObQ=="], + "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.2.14", "", { "os": "linux", "cpu": "x64" }, "sha512-WxalXzgrLVpKC93xfpaJ3gCXUWzeCr+FRCbDVD2mUAy4L6Vo3lNVz0epUEUpxPWJkLNYUwM4OSIikv36OJ9mLg=="], - "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-l9eeLsCNvPpmSXUej0etw/J1eqV0Jj1D5G/xG6YTijmE6dkv6E2QezgWbTfQk63v952DPqrjOCoiqxq7Bw0YUQ=="], + "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.2.14", "", { "os": "linux", "cpu": "x64" }, "sha512-3G3tnAmTpdk9jO3GQtyHXqeFD2SlecfTws/Y3M2mmj9nMBwwuLT4kur8sZKeu7ENUHSpVO3cIsm5A52LEWWwlg=="], - "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.2.4", "", { "os": "none", "cpu": "arm64" }, "sha512-e0F355MSTMm3+UOqtV3L24gFUp2N5m1f8L/7d56deik6va+AXdrt9F8LbzGpeWGWRbZEDq4m8NVnJDeBtf9DZg=="], + "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.2.14", "", { "os": "none", "cpu": "arm64" }, "sha512-qyr5XiNGxm2ytx17vvtcJ9nXn6v1gENETi503bJx3OGwZ1tSonj7BosxbMa/xeAfSl5iS9X6KjEWYXLu6v1L7Q=="], - "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.2.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-AWLi0uBRYh6QlE7OKhiz+phZC0qwtij2QZmhmOdsLdFn64m7oMpooE9ICE3lhm9xMb4SpDo2WbHcxX1iFLFtqw=="], + "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.2.14", "", { "os": "win32", "cpu": "arm64" }, "sha512-oA4o5o0S2yB199YyYXDzKUv1Z56Rc+mgOjwm7Z/vJ9Z8igiDPYvoOuDyo6g7AK/ZaF09nPhDKVnGBcYHO11GXA=="], - "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.2.4", "", { "os": "win32", "cpu": "x64" }, "sha512-UwSDJOg3dqCAejWdxclJjCsh3Qq4vLYMDxmyHqo1btz3stK2VqgwNd3mm5tuIwzSlGIQ/1H9Hr+Zn09mrezNqQ=="], + "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.2.14", "", { "os": "win32", "cpu": "x64" }, "sha512-9mE94bf2GZUaR/fUSXCMpBoWkctu421Mi0ORpm4zqfbkjKep7RxzPFa5etcGs5h+2KApoWBOA/hAJa/7saGgEQ=="], "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="], - "@shikijs/core": ["@shikijs/core@4.4.3", "", { "dependencies": { "@shikijs/primitive": "4.4.3", "@shikijs/types": "4.4.3", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5", "hast-util-to-html": "^9.0.5" } }, "sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg=="], + "@shikijs/core": ["@shikijs/core@4.5.0", "", { "dependencies": { "@shikijs/primitive": "4.5.0", "@shikijs/types": "4.5.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5", "hast-util-to-html": "^9.0.5" } }, "sha512-6CIgwq+bt2JZ3OSjb/nBkkwEf/CfpHcbam+Mg5Pllco7HAGRQ2/EFhZrrJtbyNTgKwknfVS+llsXGygiDGwJWw=="], - "@shikijs/engine-javascript": ["@shikijs/engine-javascript@4.4.3", "", { "dependencies": { "@shikijs/types": "4.4.3", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.6" } }, "sha512-FbOjFJp9VLdo1Wevs10BBtVxiTWwNLqZh5Gkhjgda/ioL15YOgeSl9n+6XMa3qRlPQzfhFNe641SrynFHYG0nQ=="], + "@shikijs/engine-javascript": ["@shikijs/engine-javascript@4.5.0", "", { "dependencies": { "@shikijs/types": "4.5.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.6" } }, "sha512-Ed6UdEj84LyYkwnxM5CvSMWAD+id9ExTYri0/+x41U9zrgNifPSS9lZm0JqBP0VfYI8yr8tY5nbNq9+p9R0kFA=="], - "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@4.4.3", "", { "dependencies": { "@shikijs/types": "4.4.3", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-EcOQkxdxGQrc1Row/cC2c96/v1dbZqGnEVu1qTuT/MJmp6+cXCvQussowVmCv5Tqr3KuY3c7IbM6HTW3LJ1k9w=="], + "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@4.5.0", "", { "dependencies": { "@shikijs/types": "4.5.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-dKVmbJecVdB9recl8a/CU4jdpNXyjJQrIcesIkpS70s5HS02ohpnCSpMUbotPnEUzbAcLQ+S4hwZYbkBBiTcJw=="], - "@shikijs/langs": ["@shikijs/langs@4.4.3", "", { "dependencies": { "@shikijs/types": "4.4.3" } }, "sha512-ePic0yfAJGOF83D5wBHK/00EjK65oahBYxFk5epgq33WRv7X9UuxLEV8PtR0szC0z8dl7INIpIodB99JRFlR+A=="], + "@shikijs/langs": ["@shikijs/langs@4.5.0", "", { "dependencies": { "@shikijs/types": "4.5.0" } }, "sha512-wwBTqwduXSz0X4v9Qa2EWeFaYJEw1clCncWjoRNQRbVDu3SPRTRWucnouYapKj3b8Q+sk/41Vbc4B5c8nuYzLA=="], - "@shikijs/primitive": ["@shikijs/primitive@4.4.3", "", { "dependencies": { "@shikijs/types": "4.4.3", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5" } }, "sha512-m0wBeLDQDeIxRdUmrCPdQqfuUamDwRL5isCfYbguKD6NiaKpVbsv+3J81DyIKgNW5h4WAIIr8T4EkgQrBBxvaQ=="], + "@shikijs/primitive": ["@shikijs/primitive@4.5.0", "", { "dependencies": { "@shikijs/types": "4.5.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5" } }, "sha512-UM7ShlA8oz0OWxLLO8BmO9Ip6fVqdkt8yF0EH7nOCqHfrx1eEAzF0ZUVK7L+I8NEgeu1PEWSRlxaiPPeCb4iDg=="], - "@shikijs/themes": ["@shikijs/themes@4.4.3", "", { "dependencies": { "@shikijs/types": "4.4.3" } }, "sha512-w8UHjeUnIR965KMWJHUPXOc2mNJUnK3vpVLYLvw5IYU2mnTTJ89E24OrJDBNiJDQ0qzb0tc4l7mrIXx5cFeIyw=="], + "@shikijs/themes": ["@shikijs/themes@4.5.0", "", { "dependencies": { "@shikijs/types": "4.5.0" } }, "sha512-zGb87H3UBbpuI4yoh5UguB1XbU+2BDU3kflM7UfZ+Cy2hWo9lBtqjSVK20gmLY6ukYl040hAypGXMgud9vul8Q=="], - "@shikijs/types": ["@shikijs/types@4.4.3", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5" } }, "sha512-UEJxmRR++MAGR6hugn0vgVS2W/6lWAts84FFSrnlH9sP0LNol7E5+NQ792pH8liWUhyMyjhTgSUH3k7iD7tc5g=="], + "@shikijs/types": ["@shikijs/types@4.5.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5" } }, "sha512-drtPrtD8N0DENyD2cyt6Ajy+IWsiCLgMxODwLTpvH1UsN6a9jf90tNTPjqwHvA+0Lzu9e0txk8DjfqH1p9UJRw=="], "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], @@ -367,7 +375,7 @@ "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="], - "autoprefixer": ["autoprefixer@10.5.4", "", { "dependencies": { "browserslist": "^4.28.6", "caniuse-lite": "^1.0.30001806", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA=="], + "autoprefixer": ["autoprefixer@10.6.1", "", { "dependencies": { "browserslist": "^4.28.9", "caniuse-lite": "^1.0.30001810", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-cL1Qz6ADZhcEbny/8HPfe99J6HhNoYtpX2LFLIbhgGE7Q1hlQVkYFdetDN7Id3KiQxhDrHwzlHr/YQCnZ8+xSA=="], "babel-dead-code-elimination": ["babel-dead-code-elimination@1.0.12", "", { "dependencies": { "@babel/core": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" } }, "sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig=="], @@ -375,15 +383,15 @@ "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.10.43", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-AjYpR78kDWAY3Efj+cDTFH9t9SCoL7OoTp1BOb0mQV7S+6CiLwnWM3FyxhJtdPufDFKzmCSFoUncKjWgJEZTCQ=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.11.28", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-br0LOmjJqr6Rt4AEkadbcNf67Zpo7EPwKsWbjnRrJIa1QYFHQBqM4C7F2WTbV8ahTEcg1Eo+Y0aWjjORInYFyA=="], "brace-expansion": ["brace-expansion@5.0.9", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg=="], - "browserslist": ["browserslist@4.28.6", "", { "dependencies": { "baseline-browser-mapping": "^2.10.42", "caniuse-lite": "^1.0.30001803", "electron-to-chromium": "^1.5.389", "node-releases": "^2.0.51", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw=="], + "browserslist": ["browserslist@4.29.3", "", { "dependencies": { "baseline-browser-mapping": "^2.11.26", "caniuse-lite": "^1.0.30001813", "electron-to-chromium": "^1.5.439", "node-releases": "^2.0.57", "update-browserslist-db": "^1.3.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-1R4kiYKXGViqEN0CnoDrXc1StD9niAwu+j2dukWzrD4bJgsD4lDmEp0CRbc6E/vYJIfTHwPmwyaKtVSudICdPA=="], "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001806", "", {}, "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw=="], + "caniuse-lite": ["caniuse-lite@1.0.30001816", "", {}, "sha512-+8Yx7BXCoqk6IF8yTicjfUR6D/ldJzdlsodlEOiOSPmhK844WIgk67/zIQaGAOxNkZyyvBlrRFnLvqKIoqbAFw=="], "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], @@ -425,7 +433,7 @@ "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], - "electron-to-chromium": ["electron-to-chromium@1.5.392", "", {}, "sha512-1yQq3VQCZRwsnYc67Oc+1fge6Lwtn0hzi6zmEVkB61Zx21kTbwJAW4dFLadl5Rc1tKhG/kSpYXnfiAhu0f0a1g=="], + "electron-to-chromium": ["electron-to-chromium@1.5.456", "", {}, "sha512-8hboqI6xesozteFb8aa7OGknvxUtTeRJLz0FoePysUEh/oWbddykIGdgpEJRbPRg/nIMfBf2DFos+H2MtvJl2A=="], "engine.io-client": ["engine.io-client@6.6.6", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.4.1", "engine.io-parser": "~5.2.1", "ws": "~8.21.0", "xmlhttprequest-ssl": "~2.1.1" } }, "sha512-iY6QdftLQ9pyiPoX082bpf/u1UewnOaJrtJIF9T0++QB34lZrj0uP+Q/bj8AlUsAxqhnkTV2BS8SBZSxOmoV5Q=="], @@ -551,7 +559,7 @@ "nanoid": ["nanoid@3.3.19", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug=="], - "node-releases": ["node-releases@2.0.51", "", {}, "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ=="], + "node-releases": ["node-releases@2.0.59", "", {}, "sha512-5qr2okC4ItAI0hG5SaV0HoYMpnM/Y6+Oqr7AmPYy/2uEoGvS+GbSKLeRxSS1uAdu59yz0ouzcuXievSgg///WA=="], "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], @@ -573,7 +581,7 @@ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "picomatch": ["picomatch@4.0.5", "", {}, "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A=="], + "picomatch": ["picomatch@4.0.7", "", {}, "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA=="], "pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="], @@ -591,9 +599,9 @@ "radix-ui": ["radix-ui@1.6.2", "", { "dependencies": { "@radix-ui/primitive": "1.1.5", "@radix-ui/react-accessible-icon": "1.1.11", "@radix-ui/react-accordion": "1.2.16", "@radix-ui/react-alert-dialog": "1.1.19", "@radix-ui/react-arrow": "1.1.11", "@radix-ui/react-aspect-ratio": "1.1.11", "@radix-ui/react-avatar": "1.2.2", "@radix-ui/react-checkbox": "1.3.7", "@radix-ui/react-collapsible": "1.1.16", "@radix-ui/react-collection": "1.1.12", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.2.0", "@radix-ui/react-context-menu": "2.3.3", "@radix-ui/react-dialog": "1.1.19", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.15", "@radix-ui/react-dropdown-menu": "2.1.20", "@radix-ui/react-focus-guards": "1.1.4", "@radix-ui/react-focus-scope": "1.1.12", "@radix-ui/react-form": "0.1.12", "@radix-ui/react-hover-card": "1.1.19", "@radix-ui/react-label": "2.1.11", "@radix-ui/react-menu": "2.1.20", "@radix-ui/react-menubar": "1.1.20", "@radix-ui/react-navigation-menu": "1.2.18", "@radix-ui/react-one-time-password-field": "0.1.12", "@radix-ui/react-password-toggle-field": "0.1.7", "@radix-ui/react-popover": "1.1.19", "@radix-ui/react-popper": "1.3.3", "@radix-ui/react-portal": "1.1.13", "@radix-ui/react-presence": "1.1.7", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-progress": "1.1.12", "@radix-ui/react-radio-group": "1.4.3", "@radix-ui/react-roving-focus": "1.1.15", "@radix-ui/react-scroll-area": "1.2.14", "@radix-ui/react-select": "2.3.3", "@radix-ui/react-separator": "1.1.11", "@radix-ui/react-slider": "1.4.3", "@radix-ui/react-slot": "1.3.0", "@radix-ui/react-switch": "1.3.3", "@radix-ui/react-tabs": "1.1.17", "@radix-ui/react-toast": "1.2.19", "@radix-ui/react-toggle": "1.1.14", "@radix-ui/react-toggle-group": "1.1.15", "@radix-ui/react-toolbar": "1.1.15", "@radix-ui/react-tooltip": "1.2.12", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-use-effect-event": "0.0.3", "@radix-ui/react-use-escape-keydown": "1.1.3", "@radix-ui/react-use-is-hydrated": "0.1.1", "@radix-ui/react-use-layout-effect": "1.1.2", "@radix-ui/react-use-size": "1.1.2", "@radix-ui/react-visually-hidden": "1.2.7" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-OwYUjzMwiInCUxgAWpPsavXC3Kh4iyi/49uU1/qZTG3RQDlvegyk1GOMiGvSkjua1RDb3JD3fo3eroL9FV4GQw=="], - "react": ["react@19.2.8", "", {}, "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw=="], + "react": ["react@19.3.0", "", {}, "sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog=="], - "react-dom": ["react-dom@19.2.8", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.8" } }, "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ=="], + "react-dom": ["react-dom@19.3.0", "", { "dependencies": { "scheduler": "^0.28.0" }, "peerDependencies": { "react": "^19.3.0" } }, "sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q=="], "react-fast-compare": ["react-fast-compare@3.2.2", "", {}, "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ=="], @@ -623,21 +631,21 @@ "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="], - "reselect": ["reselect@5.2.0", "", {}, "sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw=="], + "reselect": ["reselect@5.3.0", "", {}, "sha512-XGoLeRAVzUTcJ1qkxPQhDJyIZ5d6zzZD9nT7AEZOaaU9UbWclhycElmhO+VD5bFeLuzhPBaOV2oXC8uG35ZSpg=="], "resolve": ["resolve@1.22.12", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA=="], "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - "rolldown": ["rolldown@1.2.4", "", { "dependencies": { "@oxc-project/types": "=0.144.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.2.4", "@rolldown/binding-darwin-arm64": "1.2.4", "@rolldown/binding-darwin-x64": "1.2.4", "@rolldown/binding-freebsd-x64": "1.2.4", "@rolldown/binding-linux-arm-gnueabihf": "1.2.4", "@rolldown/binding-linux-arm64-gnu": "1.2.4", "@rolldown/binding-linux-arm64-musl": "1.2.4", "@rolldown/binding-linux-ppc64-gnu": "1.2.4", "@rolldown/binding-linux-s390x-gnu": "1.2.4", "@rolldown/binding-linux-x64-gnu": "1.2.4", "@rolldown/binding-linux-x64-musl": "1.2.4", "@rolldown/binding-openharmony-arm64": "1.2.4", "@rolldown/binding-win32-arm64-msvc": "1.2.4", "@rolldown/binding-win32-x64-msvc": "1.2.4" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-rSr7irW0K7QRWzjdJXqZowkcRdDtjRduh43rBltnVKd0VFq839l1lJoDvGJb6gl7+4rTTCrPWu+YfujUL8Ug7w=="], + "rolldown": ["rolldown@1.2.14", "", { "dependencies": { "@oxc-project/types": "=0.154.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm-eabi": "1.2.14", "@rolldown/binding-android-arm64": "1.2.14", "@rolldown/binding-darwin-arm64": "1.2.14", "@rolldown/binding-darwin-x64": "1.2.14", "@rolldown/binding-freebsd-x64": "1.2.14", "@rolldown/binding-linux-arm-gnueabihf": "1.2.14", "@rolldown/binding-linux-arm64-gnu": "1.2.14", "@rolldown/binding-linux-arm64-musl": "1.2.14", "@rolldown/binding-linux-ppc64-gnu": "1.2.14", "@rolldown/binding-linux-s390x-gnu": "1.2.14", "@rolldown/binding-linux-x64-gnu": "1.2.14", "@rolldown/binding-linux-x64-musl": "1.2.14", "@rolldown/binding-openharmony-arm64": "1.2.14", "@rolldown/binding-win32-arm64-msvc": "1.2.14", "@rolldown/binding-win32-x64-msvc": "1.2.14" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-eTBTTqMR6uHKLgcUqpJP8ntzDI6V4LYA8negAMBEI7gkgVvOdrx6VsvS2Ym+83KhOPdLCHWJu0w7UQFJZhHKNw=="], - "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "scheduler": ["scheduler@0.28.0", "", {}, "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw=="], "semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], - "shiki": ["shiki@4.4.3", "", { "dependencies": { "@shikijs/core": "4.4.3", "@shikijs/engine-javascript": "4.4.3", "@shikijs/engine-oniguruma": "4.4.3", "@shikijs/langs": "4.4.3", "@shikijs/themes": "4.4.3", "@shikijs/types": "4.4.3", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5" } }, "sha512-Mb/GvXPHBAXdgGIcnfU5L3ldpn1XcxrGkPHwqgRx17/I2XRfqlFKk2vGkHWINn1kdXvzJZeuO3is6I9KLPFm0g=="], + "shiki": ["shiki@4.5.0", "", { "dependencies": { "@shikijs/core": "4.5.0", "@shikijs/engine-javascript": "4.5.0", "@shikijs/engine-oniguruma": "4.5.0", "@shikijs/langs": "4.5.0", "@shikijs/themes": "4.5.0", "@shikijs/types": "4.5.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5" } }, "sha512-OcRW72ngQvc+MSVWBRIovC/BTW589iUE/Vxav7VeM4RcY9MUjqB+IR6ILG1k9nuW6LiG/nct9uma4/MBtnZbmQ=="], - "socket.io-client": ["socket.io-client@4.8.3", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.4.1", "engine.io-client": "~6.6.1", "socket.io-parser": "~4.2.4" } }, "sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g=="], + "socket.io-client": ["socket.io-client@4.8.4", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.4.1", "engine.io-client": "~6.6.1", "socket.io-parser": "~4.2.4" } }, "sha512-7wjKAvVXYOJsbmUgkWbnhPD4bFpkqrUR0++XOjpGFmqDqsqV1CI93VTraeExLxpjxEqrWgFoSRZu1ihjLWfkAA=="], "socket.io-parser": ["socket.io-parser@4.2.7", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.4.1" } }, "sha512-IH/iSeO9T6gz1KkFleGDWkG9N3dl4jXVYUtMhIqH10Md0ttMer8nUNWiP1DKuNrybD2xBrixLJdCC9J6ECoYkg=="], @@ -683,13 +691,13 @@ "universal-cookie": ["universal-cookie@8.1.2", "", { "dependencies": { "cookie": "^1.1.1" } }, "sha512-kcKzTGNsxVytujrYOvQbvh//QyFrA53HrzCGyzh6i9ujCww5gfPrLK0tG+jJD40SIIldiEjBNPPSR8fBMS21GA=="], - "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], + "update-browserslist-db": ["update-browserslist-db@1.3.4", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-t8wonIOdQyOjtPd2VktlBu6QjTVTks6v8bSi7kd0r2Vll8TK1JYDZtRRdbmCHOAMphkZgrzK+L+vXK4pyZ8t4A=="], "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], - "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="], + "use-sync-external-store": ["use-sync-external-store@1.7.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A=="], "valibot": ["valibot@1.4.2", "", { "peerDependencies": { "typescript": ">=5" }, "optionalPeers": ["typescript"] }, "sha512-gjdCvJ6d3RyHAneqxMYMW9QMCwYMb3jpOO0IyHZV1bnRHFBHrX3VkIILt5XYR0WhwHiH7Mty8ovuPZ/O3gamrg=="], @@ -699,7 +707,7 @@ "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], - "vite": ["vite@8.2.2", "", { "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.5", "postcss": "^8.5.26", "rolldown": "~1.2.4", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.4.0 || ^0.5.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q=="], + "vite": ["vite@8.3.2", "", { "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.7", "postcss": "^8.5.28", "rolldown": "~1.2.11", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.7.1", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-SQr1x6W5vVSbROg7vsyXIaxK9b0G7zsT68acdWWRmnBUsgDieLCRG+Rep9WdZgcposvv/GSnr4GUUBqB3vXq6w=="], "ws": ["ws@8.21.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw=="], @@ -717,6 +725,8 @@ "@babel/generator/jsesc": ["jsesc@3.0.2", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g=="], + "@babel/helper-compilation-targets/browserslist": ["browserslist@4.28.6", "", { "dependencies": { "baseline-browser-mapping": "^2.10.42", "caniuse-lite": "^1.0.30001803", "electron-to-chromium": "^1.5.389", "node-releases": "^2.0.51", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw=="], + "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "@radix-ui/react-alert-dialog/@radix-ui/primitive": ["@radix-ui/primitive@1.1.5", "", {}, "sha512-d86WIWFYNtGA0H/d8exstrTRTp7eWJYlYJbtNofxr/3ljupZYn6EFDG/Qgu/0Kc8v7yMUxySagqJsL1+PdYjWg=="], @@ -1181,8 +1191,20 @@ "radix-ui/@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA=="], + "tinyglobby/picomatch": ["picomatch@4.0.5", "", {}, "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A=="], + "vaul/@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.19", "", { "dependencies": { "@radix-ui/primitive": "1.1.5", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.2.0", "@radix-ui/react-dismissable-layer": "1.1.15", "@radix-ui/react-focus-guards": "1.1.4", "@radix-ui/react-focus-scope": "1.1.12", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-portal": "1.1.13", "@radix-ui/react-presence": "1.1.7", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-slot": "1.3.0", "@radix-ui/react-use-controllable-state": "1.2.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-+HhbN2+YtkRgVirjZ2afMeutQRuGOrdkWR5+EFC58SJojGmtyNQwYzgi6tHBpOxvFHefMtPeHdgtjz0BOGxFQg=="], + "@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.10.43", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-AjYpR78kDWAY3Efj+cDTFH9t9SCoL7OoTp1BOb0mQV7S+6CiLwnWM3FyxhJtdPufDFKzmCSFoUncKjWgJEZTCQ=="], + + "@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001806", "", {}, "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw=="], + + "@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.392", "", {}, "sha512-1yQq3VQCZRwsnYc67Oc+1fge6Lwtn0hzi6zmEVkB61Zx21kTbwJAW4dFLadl5Rc1tKhG/kSpYXnfiAhu0f0a1g=="], + + "@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.51", "", {}, "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ=="], + + "@babel/helper-compilation-targets/browserslist/update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], + "@radix-ui/react-alert-dialog/@radix-ui/react-dialog/@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.5", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-effect-event": "0.0.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-b0XaRlzn2QKuo10XyNgi2DAJDf5XC9d1nD3FJcuvCjbR7+4Ad28zmZsLsqx+hvDEzMnRuZaZxZm9gYObV6RmRA=="], "@radix-ui/react-alert-dialog/@radix-ui/react-dialog/@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.4", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-cot/aB/mOm0IYVYTTmQcEEK1M48lZWi8FlYe5nDPQQ8NYZUlXEFgncJ9p2Kzer3RKSrY7cTTpEMLZKNo9QoP5Q=="], diff --git a/docs/app/reflex.lock/package.json b/docs/app/reflex.lock/package.json index 6e90e4ae1..dd9d7c5a3 100644 --- a/docs/app/reflex.lock/package.json +++ b/docs/app/reflex.lock/package.json @@ -6,10 +6,12 @@ "export": "react-router build" }, "dependencies": { - "@base-ui/react": "1.8.0", + "@base-ui/react": "1.9.0", + "@fontsource-variable/geist": "5.3.0", "@fontsource-variable/instrument-sans": "5.2.8", + "@fontsource-variable/inter": "5.3.0", "@fontsource-variable/jetbrains-mono": "5.2.8", - "@hugeicons/core-free-icons": "4.3.0", + "@hugeicons/core-free-icons": "4.3.5", "@hugeicons/react": "1.1.10", "@radix-ui/react-accordion": "1.2.20", "@radix-ui/react-dialog": "1.1.23", @@ -23,12 +25,12 @@ "isbot": "5.2.2", "lucide-react": "1.26.0", "mergician": "v2.0.2", - "react": "19.2.8", - "react-dom": "19.2.8", + "react": "19.3.0", + "react-dom": "19.3.0", "react-helmet": "6.1.0", "react-router": "8.4.0", - "shiki": "4.4.3", - "socket.io-client": "4.8.3", + "shiki": "4.5.0", + "socket.io-client": "4.8.4", "sonner": "2.0.8", "tailwind-merge": "3.6.0", "tailwindcss-animated": "2.0.0", @@ -41,11 +43,11 @@ "@react-router/dev": "8.4.0", "@react-router/fs-routes": "8.4.0", "@tailwindcss/postcss": "4.3.0", - "autoprefixer": "10.5.4", - "postcss": "8.5.26", + "autoprefixer": "10.6.1", + "postcss": "8.5.29", "postcss-import": "17.0.0", "tailwindcss": "4.3.0", - "vite": "8.2.2" + "vite": "8.3.2" }, "overrides": { "cookie": "1.1.1", diff --git a/docs/app/rxconfig.py b/docs/app/rxconfig.py index 4beff33dd..f5b3ea91d 100644 --- a/docs/app/rxconfig.py +++ b/docs/app/rxconfig.py @@ -17,6 +17,8 @@ "es-toolkit@1.46.1", "@fontsource-variable/instrument-sans@5.2.8", "@fontsource-variable/jetbrains-mono@5.2.8", + "@fontsource-variable/inter@5.3.0", + "@fontsource-variable/geist@5.3.0", ], telemetry_enabled=False, show_built_with_reflex=False, diff --git a/docs/app/tests/test_docs_site.py b/docs/app/tests/test_docs_site.py index 16ce9773c..bf0dd95d9 100644 --- a/docs/app/tests/test_docs_site.py +++ b/docs/app/tests/test_docs_site.py @@ -1051,7 +1051,7 @@ def one_chart_preview(): ) assert rendered.count("xy-example-tab-list relative") == 1 assert rendered.count("xy-example-tab cursor-pointer") == 2 - assert rendered.count("relative w-full overflow-hidden rounded-xl") == 1 + assert rendered.count("doc-demo-tab-card relative w-full overflow-hidden") == 1 assert "flex w-full flex-col gap-2 overflow-hidden px-2 pb-2 pt-4" in rendered assert "w-full p-2 [&>div]:!m-0" in rendered assert "min-h-[430px] w-full p-2" not in rendered diff --git a/docs/app/uv.lock b/docs/app/uv.lock index 6b29d0932..38926b471 100644 --- a/docs/app/uv.lock +++ b/docs/app/uv.lock @@ -1102,8 +1102,8 @@ wheels = [ [[package]] name = "reflex" -version = "0.9.10.post130.dev0+fde64364" -source = { git = "https://github.com/reflex-dev/reflex?rev=main#fde6436448ef7b9df9adbee2a50b65b1b8f452eb" } +version = "0.10.1.dev45+7ccaa4e2" +source = { git = "https://github.com/reflex-dev/reflex?rev=main#7ccaa4e213fa1f67374002cb28709272866c3d53" } dependencies = [ { name = "click" }, { name = "granian", extra = ["reload"] }, @@ -1135,8 +1135,8 @@ dependencies = [ [[package]] name = "reflex-base" -version = "0.9.10.post130.dev0+fde64364" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-base&rev=main#fde6436448ef7b9df9adbee2a50b65b1b8f452eb" } +version = "0.10.1.dev52+7ccaa4e2" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-base&rev=main#7ccaa4e213fa1f67374002cb28709272866c3d53" } dependencies = [ { name = "packaging" }, { name = "platformdirs" }, @@ -1144,10 +1144,20 @@ dependencies = [ { name = "typing-extensions" }, ] +[[package]] +name = "reflex-build-sdk" +version = "0.1.1.dev52+7ccaa4e2" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-build-sdk&rev=main#7ccaa4e213fa1f67374002cb28709272866c3d53" } + +[package.optional-dependencies] +httpx = [ + { name = "httpx" }, +] + [[package]] name = "reflex-components-code" -version = "0.9.4.post143.dev0+fde64364" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-code&rev=main#fde6436448ef7b9df9adbee2a50b65b1b8f452eb" } +version = "0.10.1.dev47+7ccaa4e2" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-code&rev=main#7ccaa4e213fa1f67374002cb28709272866c3d53" } dependencies = [ { name = "reflex-base" }, { name = "reflex-components-core" }, @@ -1157,8 +1167,8 @@ dependencies = [ [[package]] name = "reflex-components-core" -version = "0.9.9.post142.dev0+fde64364" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-core&rev=main#fde6436448ef7b9df9adbee2a50b65b1b8f452eb" } +version = "0.10.1.dev49+7ccaa4e2" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-core&rev=main#7ccaa4e213fa1f67374002cb28709272866c3d53" } dependencies = [ { name = "python-multipart" }, { name = "reflex-base" }, @@ -1170,8 +1180,8 @@ dependencies = [ [[package]] name = "reflex-components-dataeditor" -version = "0.9.2.post143.dev0+fde64364" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-dataeditor&rev=main#fde6436448ef7b9df9adbee2a50b65b1b8f452eb" } +version = "0.10.1.dev48+7ccaa4e2" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-dataeditor&rev=main#7ccaa4e213fa1f67374002cb28709272866c3d53" } dependencies = [ { name = "reflex-base" }, { name = "reflex-components-core" }, @@ -1179,32 +1189,32 @@ dependencies = [ [[package]] name = "reflex-components-gridjs" -version = "0.9.1.post518.dev0+fde64364" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-gridjs&rev=main#fde6436448ef7b9df9adbee2a50b65b1b8f452eb" } +version = "0.10.1.dev51+7ccaa4e2" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-gridjs&rev=main#7ccaa4e213fa1f67374002cb28709272866c3d53" } dependencies = [ { name = "reflex-base" }, ] [[package]] name = "reflex-components-internal" -version = "0.0.30.post92.dev0+fde64364" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-internal&rev=main#fde6436448ef7b9df9adbee2a50b65b1b8f452eb" } +version = "0.0.33.dev88+7ccaa4e2" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-internal&rev=main#7ccaa4e213fa1f67374002cb28709272866c3d53" } dependencies = [ { name = "reflex" }, ] [[package]] name = "reflex-components-lucide" -version = "1.0.4.post143.dev0+fde64364" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-lucide&rev=main#fde6436448ef7b9df9adbee2a50b65b1b8f452eb" } +version = "1.1.1.dev51+7ccaa4e2" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-lucide&rev=main#7ccaa4e213fa1f67374002cb28709272866c3d53" } dependencies = [ { name = "reflex-base" }, ] [[package]] name = "reflex-components-markdown" -version = "0.9.3.post386.dev0+fde64364" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-markdown&rev=main#fde6436448ef7b9df9adbee2a50b65b1b8f452eb" } +version = "0.10.1.dev46+7ccaa4e2" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-markdown&rev=main#7ccaa4e213fa1f67374002cb28709272866c3d53" } dependencies = [ { name = "reflex-base" }, { name = "reflex-components-code" }, @@ -1214,16 +1224,16 @@ dependencies = [ [[package]] name = "reflex-components-moment" -version = "0.9.3.post234.dev0+fde64364" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-moment&rev=main#fde6436448ef7b9df9adbee2a50b65b1b8f452eb" } +version = "0.10.1.dev51+7ccaa4e2" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-moment&rev=main#7ccaa4e213fa1f67374002cb28709272866c3d53" } dependencies = [ { name = "reflex-base" }, ] [[package]] name = "reflex-components-plotly" -version = "0.9.5.post143.dev0+fde64364" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-plotly&rev=main#fde6436448ef7b9df9adbee2a50b65b1b8f452eb" } +version = "0.10.1.dev48+7ccaa4e2" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-plotly&rev=main#7ccaa4e213fa1f67374002cb28709272866c3d53" } dependencies = [ { name = "reflex-base" }, { name = "reflex-components-core" }, @@ -1231,8 +1241,8 @@ dependencies = [ [[package]] name = "reflex-components-radix" -version = "0.9.8.post143.dev0+fde64364" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-radix&rev=main#fde6436448ef7b9df9adbee2a50b65b1b8f452eb" } +version = "0.10.1.dev48+7ccaa4e2" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-radix&rev=main#7ccaa4e213fa1f67374002cb28709272866c3d53" } dependencies = [ { name = "reflex-base" }, { name = "reflex-components-core" }, @@ -1241,8 +1251,8 @@ dependencies = [ [[package]] name = "reflex-components-react-player" -version = "0.9.2.post143.dev0+fde64364" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-react-player&rev=main#fde6436448ef7b9df9adbee2a50b65b1b8f452eb" } +version = "0.10.1.dev48+7ccaa4e2" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-react-player&rev=main#7ccaa4e213fa1f67374002cb28709272866c3d53" } dependencies = [ { name = "reflex-base" }, { name = "reflex-components-core" }, @@ -1250,8 +1260,8 @@ dependencies = [ [[package]] name = "reflex-components-recharts" -version = "0.9.2.post234.dev0+fde64364" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-recharts&rev=main#fde6436448ef7b9df9adbee2a50b65b1b8f452eb" } +version = "0.10.1.dev48+7ccaa4e2" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-recharts&rev=main#7ccaa4e213fa1f67374002cb28709272866c3d53" } dependencies = [ { name = "reflex-base" }, { name = "reflex-components-core" }, @@ -1259,8 +1269,8 @@ dependencies = [ [[package]] name = "reflex-components-sonner" -version = "0.9.2.post143.dev0+fde64364" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-sonner&rev=main#fde6436448ef7b9df9adbee2a50b65b1b8f452eb" } +version = "0.10.1.dev50+7ccaa4e2" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-sonner&rev=main#7ccaa4e213fa1f67374002cb28709272866c3d53" } dependencies = [ { name = "reflex-base" }, { name = "reflex-components-lucide" }, @@ -1268,8 +1278,8 @@ dependencies = [ [[package]] name = "reflex-docgen" -version = "0.9.5.post143.dev0+fde64364" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-docgen&rev=main#fde6436448ef7b9df9adbee2a50b65b1b8f452eb" } +version = "0.10.1.dev44+7ccaa4e2" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-docgen&rev=main#7ccaa4e213fa1f67374002cb28709272866c3d53" } dependencies = [ { name = "griffelib" }, { name = "mistletoe" }, @@ -1280,25 +1290,26 @@ dependencies = [ [[package]] name = "reflex-hosting-cli" -version = "0.1.71.post144.dev0+fde64364" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-hosting-cli&rev=main#fde6436448ef7b9df9adbee2a50b65b1b8f452eb" } +version = "0.2.1.dev51+7ccaa4e2" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-hosting-cli&rev=main#7ccaa4e213fa1f67374002cb28709272866c3d53" } dependencies = [ { name = "click" }, { name = "httpx" }, { name = "packaging" }, { name = "platformdirs" }, + { name = "reflex-build-sdk", extra = ["httpx"] }, { name = "rich" }, ] [[package]] name = "reflex-integrations-docs" -version = "0.0.0.post3524.dev0+fde64364" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Fintegrations-docs&rev=main#fde6436448ef7b9df9adbee2a50b65b1b8f452eb" } +version = "0.0.1.dev3732+7ccaa4e2" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Fintegrations-docs&rev=main#7ccaa4e213fa1f67374002cb28709272866c3d53" } [[package]] name = "reflex-site-shared" -version = "0.0.45.post92.dev0+fde64364" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-site-shared&rev=main#fde6436448ef7b9df9adbee2a50b65b1b8f452eb" } +version = "0.0.49.dev107+7ccaa4e2" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-site-shared&rev=main#7ccaa4e213fa1f67374002cb28709272866c3d53" } dependencies = [ { name = "email-validator" }, { name = "httpx" }, diff --git a/docs/app/xy_docs/api_reference.py b/docs/app/xy_docs/api_reference.py index 8e052e000..92d3dd085 100644 --- a/docs/app/xy_docs/api_reference.py +++ b/docs/app/xy_docs/api_reference.py @@ -461,12 +461,12 @@ def _component_api_reference(reference: ComponentApiReference) -> rx.Component: reference.display_name, as_="h3", id=_heading_id(reference.display_name), - class_name="font-large text-foreground mt-8 mb-2", + class_name="docs-heading font-large text-foreground mt-8 mb-2", ), ( rx.text( reference.summary, - class_name="font-[475] text-muted-foreground mb-4 leading-7", + class_name="docs-prose font-normal text-muted-foreground mb-4 leading-7", ) if reference.summary else rx.fragment() diff --git a/docs/app/xy_docs/breadcrumb.py b/docs/app/xy_docs/breadcrumb.py index ba3526c7b..a1eac4400 100644 --- a/docs/app/xy_docs/breadcrumb.py +++ b/docs/app/xy_docs/breadcrumb.py @@ -142,7 +142,7 @@ def xy_docs_breadcrumb(page: DocsPage, sidebar: rx.Component) -> rx.Component: ), class_name="flex flex-row items-center gap-2 p-[0.563rem] lg:p-0", ), - class_name="relative z-10 mb-10 flex w-full flex-row items-center justify-between gap-4 border-b border-border-subtle max-lg:py-2 lg:gap-0 lg:border-none lg:p-0", + class_name="docs-breadcrumb relative z-10 mb-10 flex w-full flex-row items-center justify-between gap-4 border-b border-border-subtle max-lg:py-2 lg:gap-0 lg:border-none lg:p-0", ) diff --git a/docs/app/xy_docs/examples.py b/docs/app/xy_docs/examples.py index b333b68e2..bdc3cc4c5 100644 --- a/docs/app/xy_docs/examples.py +++ b/docs/app/xy_docs/examples.py @@ -16,51 +16,29 @@ } """ -# The tabs form one connected strip on the card's top-right edge. Triggers touch -# (`-gap-0`, `-ml-px` collapses the shared vertical borders into one line) and -# only the strip's outer corners round — the middle trigger stays square. The -# list overlaps the card border by 1px (`-mb-px`) so the active trigger, wearing -# white, covers the seam and opens into the surface below while inactive -# triggers keep their bottom border. Card and triggers share `border-border-subtle`. -_EXAMPLE_TAB_LIST_CLASS = ( - "xy-example-tab-list relative z-10 -mb-px ml-auto flex items-end justify-end " - "!gap-0 !border-b-0 !bg-transparent !p-0 !shadow-none " - "before:!hidden after:!hidden" -) +# Keep XY hooks for preview validation and use the shared docs pill treatment. +_EXAMPLE_TAB_LIST_CLASS = "xy-example-tab-list relative doc-demo-tab-list ml-auto flex items-center" def _example_demo_header(*triggers: rx.Component) -> rx.Component: - """Place the Build action and folder-style tab controls in one header.""" + """Place the Build action and compact pill tabs above the preview card.""" return rx.el.div( _reflex_build_action(), rx.tabs.list(*triggers, class_name=_EXAMPLE_TAB_LIST_CLASS), class_name=( - "flex w-full flex-wrap items-end justify-between gap-x-2 gap-y-1 sm:flex-nowrap" + "docs-demo-header flex w-full flex-wrap items-center justify-between gap-3 sm:flex-nowrap" ), ) _EXAMPLE_TAB_CLASS = ( - "xy-example-tab cursor-pointer appearance-none !rounded-none " - "first:!rounded-tl-[0.625rem] last:!rounded-tr-[0.625rem] " - "!border !border-border-subtle -ml-px first:!ml-0 " - "!bg-[#f5f5f5] !px-3.5 !py-2 !text-[0.8125rem] !font-medium !leading-5 " - "!text-[#525252] !shadow-none transition-[color,background-color] " - "duration-[120ms] before:!hidden after:!hidden " - "dark:!bg-[#171717] dark:!text-[#a3a3a3] " - "data-[state=active]:!z-10 data-[state=active]:!bg-white " - "data-[state=active]:!border-b-transparent data-[state=active]:!text-[#171717] " - "dark:data-[state=active]:!bg-black " - "dark:data-[state=active]:!text-[#fafafa] " - "[&_.rt-BaseTabListTriggerInner]:!bg-transparent" + "xy-example-tab cursor-pointer doc-demo-tab inline-flex items-center " + "rounded-full px-3 py-2 text-sm font-normal text-muted-foreground " + "motion-reduce:transition-none [&_.rt-BaseTabListTriggerInner]:!bg-transparent" ) -# The shared surface behind every panel, so Preview/Code/Data all sit on the -# same background. Rounded on the top-left and both bottom corners; the top-right -# stays square so the connected tab strip meets it flush. _EXAMPLE_CARD_CLASS = ( - "relative w-full overflow-hidden rounded-xl rounded-tr-none border " - "border-border-subtle bg-white dark:bg-black" + "doc-demo-tab-card relative w-full overflow-hidden rounded-[20px] border border-border bg-card" ) _EXAMPLE_LEGENDS = { @@ -181,7 +159,7 @@ def _chart_legend(component_id: str | None) -> rx.Component: def _example_tab_trigger(value: str, icon: str, label: str) -> rx.Component: - """One folder-style trigger in the demo card's top-right tab strip.""" + """Render one pill tab in the demo header.""" return rx.tabs.trigger( rx.el.span( rx.icon(icon, size=15, aria_hidden="true"), @@ -213,7 +191,7 @@ def _example_code_panel(source: str, value: str) -> rx.Component: "[&_div]:!bg-transparent [&_pre]:!bg-transparent " "[&_.code-block]:!bg-transparent [&_.code-block]:!rounded-none " "[&_.code-block]:!border-0 [&_.code-block]:!shadow-none " - "[&_summary]:!from-white dark:[&_summary]:!from-black" + "[&_summary]:!from-card" ), ), value=value, @@ -228,7 +206,7 @@ def chart_example_demo( component_id: str | None = None, data: str | None = None, ) -> rx.Component: - """Render a chart demo whose Preview/Code/Data tabs attach to the card. + """Render a chart demo with compact Preview/Code/Data pill tabs. When ``data`` is supplied (the hardcoded arrays split out of the fence, see ``markdown._split_demo_data``) a third "Data" tab appears so the Code tab can diff --git a/docs/app/xy_docs/footer.py b/docs/app/xy_docs/footer.py index f38451fe2..21044cd9d 100644 --- a/docs/app/xy_docs/footer.py +++ b/docs/app/xy_docs/footer.py @@ -114,7 +114,7 @@ def xy_docs_footer(page: DocsPage) -> rx.Component: controls = rx.box( rx.box(dark_mode_toggle(), class_name="[&>div]:!ml-0"), _footer_link("View XY on GitHub ↗", REPOSITORY_URL), - class_name="flex w-full flex-row items-end justify-between gap-6", + class_name="flex w-full flex-row flex-wrap items-end justify-between gap-6", ) channel_label = "main-branch preview" if DOCS_CHANNEL == "preview" else "stable docs" copyright_status = rx.el.div( diff --git a/docs/app/xy_docs/markdown.py b/docs/app/xy_docs/markdown.py index ad76fb5c3..7de366f31 100644 --- a/docs/app/xy_docs/markdown.py +++ b/docs/app/xy_docs/markdown.py @@ -141,7 +141,7 @@ def _heading_link(text: str, level: int) -> rx.Component: text, id=slug, as_=tag, - class_name=f"{class_name} " + scroll_margin + f" mt-{margin_top}", + class_name=f"docs-heading {class_name} " + scroll_margin + f" mt-{margin_top}", ), rx.icon( tag="link", diff --git a/docs/app/xy_docs/navbar.py b/docs/app/xy_docs/navbar.py index 4e142f3b1..4e1ba9759 100644 --- a/docs/app/xy_docs/navbar.py +++ b/docs/app/xy_docs/navbar.py @@ -85,11 +85,16 @@ def _menu_item(label: str, href: str) -> rx.Component: label, href=href.removeprefix("/docs/xy") or "/", aria_current=rx.cond(active, "page", None), - class_name=( - "inline-flex h-9 items-center justify-center whitespace-nowrap px-4 " - "text-sm font-medium leading-none text-foreground no-underline " - "transition-colors hover:text-muted-foreground focus-visible:outline-2 " - "focus-visible:outline-offset-2 focus-visible:outline-ring" + class_name=ui.cn( + "docs-navbar-link inline-flex h-9 items-center justify-center whitespace-nowrap rounded-full px-3 " + "text-sm font-normal leading-none no-underline transition-colors duration-150 " + "motion-reduce:transition-none focus-visible:outline-2 " + "focus-visible:outline-offset-2 focus-visible:outline-ring", + rx.cond( + active, + "bg-accent text-foreground", + "text-muted-foreground hover:bg-muted hover:text-foreground", + ), ), ), class_name="flex h-full items-center justify-center", @@ -108,12 +113,13 @@ def _github_button() -> rx.Component: size="sm", variant="primary", native_button=False, - class_name="whitespace-nowrap", + class_name="rounded-full whitespace-nowrap px-4 text-sm font-normal", ), href=XY_REPOSITORY_URL, target="_blank", rel="noopener noreferrer", aria_label=label, + class_name="rounded-full focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring", ) @@ -139,16 +145,16 @@ def _mobile_navigation() -> rx.Component: on_click=rx.call_script( "document.querySelector('header details[open]')?.removeAttribute('open')" ), - class_name="flex w-full items-center justify-between gap-3 border-b border-border px-4 py-4 text-base font-medium text-foreground transition-colors hover:bg-accent focus-visible:outline-2 focus-visible:outline-ring", + class_name="docs-navbar-mobile-link flex w-full items-center justify-between gap-3 border-b border-border px-4 py-4 text-base font-normal text-foreground transition-colors motion-reduce:transition-none hover:bg-accent focus-visible:outline-2 focus-visible:outline-ring", ) for label, href in _XY_NAV_LINKS ], rx.el.div(_github_button(), class_name="mt-4"), aria_label="XY documentation navigation", role="navigation", - class_name="fixed inset-x-0 top-[var(--docs-header-height)] max-h-[calc(100dvh-var(--docs-header-height))] overflow-y-auto border-b border-border-subtle bg-background px-6 py-4 shadow-small", + class_name="docs-navbar-mobile-panel fixed inset-x-0 top-[var(--docs-header-height)] max-h-[calc(100dvh-var(--docs-header-height))] overflow-y-auto border-b border-border-subtle bg-background px-6 py-4 shadow-small", ), - class_name="group/xy-menu", + class_name="docs-navbar-menu group/xy-menu", ) @@ -161,7 +167,7 @@ def _navigation_menu() -> rx.Component: return ui.navigation_menu.root( ui.navigation_menu.list( *(_menu_item(label, href) for label, href in _XY_NAV_LINKS), - class_name="m-0 hidden xl:flex h-full list-none flex-row items-center gap-2", + class_name="m-0 hidden xl:flex h-full list-none flex-row items-center gap-1", custom_attrs={"role": "menubar"}, ), ui.navigation_menu.list( @@ -182,11 +188,11 @@ def _navigation_menu() -> rx.Component: class_name="flex xl:hidden", custom_attrs={"role": "menuitem"}, ), - class_name="m-0 flex h-full list-none flex-row items-center gap-2 lg:gap-4", + class_name="m-0 flex h-full shrink-0 list-none flex-row items-center gap-2 lg:gap-3", custom_attrs={"role": "menubar"}, ), unstyled=True, - class_name="relative mx-auto flex h-full w-full flex-row items-center justify-end xl:justify-between gap-6", + class_name="relative mx-auto flex h-full min-w-0 w-full flex-row items-center justify-end xl:justify-between gap-4 font-sans", ) @@ -197,14 +203,18 @@ def xy_docs_navbar() -> rx.Component: Returns: Official documentation navbar with an active XY section. """ - return docs_navbar_frame( + frame = docs_navbar_frame( rx.el.elements.a( xy_docs_logo(), href="/docs/", - class_name="mr-10 flex shrink-0 items-center gap-2.5 no-underline", + class_name="docs-navbar-brand mr-6 flex shrink-0 items-center gap-3 rounded-sm no-underline focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-ring", ), _navigation_menu(), ) + header = frame.children[1] + header.class_name = "docs-navbar-header " + header.class_name + header.children[0].class_name = "docs-navbar-inner " + header.children[0].class_name + return frame __all__ = [ diff --git a/docs/app/xy_docs/xy_docs.py b/docs/app/xy_docs/xy_docs.py index 0ab88ba15..d30b9dc35 100644 --- a/docs/app/xy_docs/xy_docs.py +++ b/docs/app/xy_docs/xy_docs.py @@ -47,6 +47,7 @@ def _llms_txt_directive() -> rx.Component: app = rx.App( style={**styles.BASE_STYLE, **_CHART_STYLE}, + stylesheets=["/docs-theme.css", "/docs-header-theme.css", "/docs-overlays-theme.css"], app_wraps={}, theme=rx.theme( has_background=True, @@ -57,7 +58,8 @@ def _llms_txt_directive() -> rx.Component: *get_pixel_website_trackers(), rx.el.style(CODE_COPY_STYLE), rx.el.meta(name="application-name", content="XY"), - rx.el.meta(name="theme-color", content="#181818"), + rx.el.meta(name="theme-color", content="#fdfcfc", media="(prefers-color-scheme: light)"), + rx.el.meta(name="theme-color", content="#151413", media="(prefers-color-scheme: dark)"), ], ) @@ -89,14 +91,33 @@ def _without_faq_in_toc(page): def xy_docs_layout(page, content, navigation) -> rx.Component: """Render the shared docs layout with Reflex's TOC scroll highlighter.""" + layout = docs_layout( + page_with_api_reference_toc(_without_faq_in_toc(page)), + content, + navigation, + config=_LAYOUT_CONFIG, + ) + # The shared Markdown layout owns structure and routing; these consumer + # hooks opt it into the same docs-only brand layer as Reflex PR #7549. + main = layout.children[1] + main.class_name = "docs-reading-layout " + main.class_name + column = main.children[1] + column.class_name = "docs-reading-column " + column.class_name + article = column.children[1] + article.class_name = "docs-article " + article.class_name + pager = column.children[2] + pager.class_name = "docs-page-navigation grid grid-cols-2 gap-4" + # Keep Next in the second column even on the first page. Empty fragments + # and the shared flex spacer are unnecessary in a two-column grid. + pager.children = [ + child for child in (pager.children[0], pager.children[-1]) if child.tag != "Fragment" + ] + for link in pager.children: + if "text-right" in str(link.class_name): + link.class_name = link.class_name + " col-start-2" return rx.box( _llms_txt_directive(), - docs_layout( - page_with_api_reference_toc(_without_faq_in_toc(page)), - content, - navigation, - config=_LAYOUT_CONFIG, - ), + layout, display="contents", on_mount=[ rx.call_script(right_sidebar_item_highlight()), diff --git a/spec/process/production-readiness.md b/spec/process/production-readiness.md index 8bb6a812c..8e8f188f7 100644 --- a/spec/process/production-readiness.md +++ b/spec/process/production-readiness.md @@ -63,22 +63,33 @@ leaf links and the mobile sidebar drawer remain available. The mobile drawer trigger is a named native button with visible keyboard focus. Footer navigation uses level-two section headings. Installation examples use subsections so code blocks cannot become invalid direct children of a list. -The docs recolor consumes the reusable `reflex-site-shared` theme and components -directly. XY keeps only its branding, navigation, and project-specific footer -content; it must not vendor shared CSS, search/buttons, or the navbar frame and -announcement. Unpublished shared changes are previewed with the editable-package +The docs consume the reusable `reflex-site-shared` base theme and components +directly. XY owns its branding, navigation, project-specific footer content, +and the docs-only brand layer adapted from +[Reflex PR #7549](https://github.com/reflex-dev/reflex/pull/7549). It must not +vendor shared base CSS, search/buttons, or the navbar frame and announcement. +The local layer uses Inter body text, Geist headings, warm neutral light/dark +tokens, pill navigation and demo tabs, compact two-column Back/Next links, and +the opal banner artwork. Fonts ship through pinned Fontsource packages; the +artwork URL preserves the `/docs/xy` mount prefix. Banner content, dismissal state, +and header-height tracking remain shared. Editorial selectors target `docs-*` +hooks, avoiding live chart typography and data-series colors. Mobile navigation, +the named closeable docs drawer, clipboard feedback, keyboard focus, and +reduced-motion behavior remain required validation surfaces. +Unpublished shared changes are previewed with the editable-package workflow in `docs/app/README.md`, followed by production compilation and the docs -validators below. The Git lock remains portable; deployment of the neutral -semantic styling requires updating that lock after the shared changes land. +validators below. The portable Git lock includes the merged design's shared +styling hooks and mobile drawer changes; update all Reflex monorepo packages +together and validate the production app when refreshing it. The desktop XY docs navigation switches to a docs-specific disclosure below 1280px, preserving Overview and Reflex Integration destinations. Desktop links -expose the selected section through `aria-current="page"` without an active underline. +expose the selected section through `aria-current="page"` and a neutral pill. Internal navbar destinations use client-side routing so page changes preserve announcement dismissal without a full document reload. Code blocks share Reflex docs' light/dark syntax themes and neutral surface tokens while retaining -XY's accessible clipboard feedback. XY footer links and headings use the shared -book-weight typography, actions use small shadows, and custom sidebar links use -weight 475. Gallery previews, playground controls, API references, Markdown, +XY's accessible clipboard feedback. XY footer links and headings use body +typography and compact controls; sidebar links use normal weight, with medium +weight for the active page. Gallery previews, playground controls, API references, Markdown, and demo UI text and borders use semantic theme tokens in both color modes. Chart canvases retain explicit white/black backgrounds to match their rendered plots; data-series colors remain chart-specific. From 8df769b7c2a4e06d1d475a4b01f20ae5dcddc382 Mon Sep 17 00:00:00 2001 From: carlosabadia Date: Thu, 15 Oct 2026 11:28:48 +0200 Subject: [PATCH 2/3] Cover docs layout navigation boundaries --- docs/app/tests/test_docs_layout.py | 74 ++++++++++++++++++++++++++++ spec/process/production-readiness.md | 4 ++ 2 files changed, 78 insertions(+) create mode 100644 docs/app/tests/test_docs_layout.py diff --git a/docs/app/tests/test_docs_layout.py b/docs/app/tests/test_docs_layout.py new file mode 100644 index 000000000..49dc5e1a1 --- /dev/null +++ b/docs/app/tests/test_docs_layout.py @@ -0,0 +1,74 @@ +"""Integration contracts for XY's wrapper around the shared docs layout.""" + +from collections.abc import Iterator +from pathlib import Path + +import pytest +import reflex as rx +from reflex_site_shared.docs import DocsPage, NavigationItem +from xy_docs.xy_docs import xy_docs_layout + + +def _walk(component: rx.Component) -> Iterator[rx.Component]: + """Find semantic elements without depending on the shared child order.""" + yield component + for child in component.children: + yield from _walk(child) + + +@pytest.mark.parametrize( + ("route", "expected_links"), + ( + ("/", (("Next", "/overview/installation/"),)), + ( + "/overview/installation/", + (("Back", "/"), ("Next", "/overview/first-chart/")), + ), + ("/overview/first-chart/", (("Back", "/overview/installation/"),)), + ), + ids=("first-page", "middle-page", "last-page"), +) +def test_shared_layout_preserves_article_and_adjacent_pages( + tmp_path: Path, + route: str, + expected_links: tuple[tuple[str, str], ...], +) -> None: + """Keep content styled and adjacent links correct at both navigation edges.""" + navigation = ( + NavigationItem(title="Overview", route="/"), + NavigationItem(title="Installation", route="/overview/installation/"), + NavigationItem(title="First chart", route="/overview/first-chart/"), + ) + page = DocsPage( + source_path=tmp_path / "index.md", + relative_path=Path("index.md"), + route=route, + title="Layout contract", + description=None, + metadata={}, + content="# Layout contract", + ) + content = rx.el.p("Article content must survive the layout wrapper.") + nodes = tuple(_walk(xy_docs_layout(page, content, navigation))) + + articles = [node for node in nodes if node.tag == "article"] + assert len(articles) == 1 + assert "docs-article" in str(articles[0].class_name).strip('"').split() + assert content in articles[0].children + + pagers = [ + node + for node in nodes + if node.tag == "nav" + and str(node.custom_attrs.get("aria-label")).strip('"') == "Previous and next pages" + ] + assert len(pagers) == 1 + pager = pagers[0] + assert {"grid", "grid-cols-2"} <= set(str(pager.class_name).strip('"').split()) + # An exact child count also rejects leftover spacers or missing-link fragments. + assert len(pager.children) == len(expected_links) + for link, (label, destination) in zip(pager.children, expected_links, strict=True): + assert link.tag == "Link" + assert str(link.to).strip('"') == destination + assert label in str(link.children[0]) + assert ("col-start-2" in str(link.class_name)) == (label == "Next") diff --git a/spec/process/production-readiness.md b/spec/process/production-readiness.md index 8e8f188f7..85522e2a1 100644 --- a/spec/process/production-readiness.md +++ b/spec/process/production-readiness.md @@ -81,6 +81,10 @@ workflow in `docs/app/README.md`, followed by production compilation and the doc validators below. The portable Git lock includes the merged design's shared styling hooks and mobile drawer changes; update all Reflex monorepo packages together and validate the production app when refreshing it. +`docs/app/tests/test_docs_layout.py` exercises the real shared layout for first, +middle, and last pages, verifying the article styling hook, preserved content, +adjacent link destinations, removal of empty placeholders, and Next's placement +in the second grid column. These contracts must pass after shared-package updates. The desktop XY docs navigation switches to a docs-specific disclosure below 1280px, preserving Overview and Reflex Integration destinations. Desktop links expose the selected section through `aria-current="page"` and a neutral pill. From 94995bf196b085654b5edd12f8f0b261a607342b Mon Sep 17 00:00:00 2001 From: carlosabadia Date: Thu, 15 Oct 2026 11:35:30 +0200 Subject: [PATCH 3/3] Fix docs disclosure fade and refresh PostCSS resolution --- docs/app/assets/docs-header-theme.css | 1 + docs/app/assets/docs-overlays-theme.css | 1 + docs/app/assets/docs-theme.css | 4 +++- docs/app/reflex.lock/bun.lock | 7 ++++--- docs/app/reflex.lock/package.json | 5 ++--- docs/app/xy_docs/examples.py | 2 +- spec/process/production-readiness.md | 3 +++ 7 files changed, 15 insertions(+), 8 deletions(-) diff --git a/docs/app/assets/docs-header-theme.css b/docs/app/assets/docs-header-theme.css index 00c43f3d4..46fb6da5b 100644 --- a/docs/app/assets/docs-header-theme.css +++ b/docs/app/assets/docs-header-theme.css @@ -149,6 +149,7 @@ } .docs-nav-frame [data-announcement] > button { position: absolute; + /* The shared button's -translate-y-1/2 centers its 28px box at y=20. */ top: 20px; right: 16px; display: inline-flex; diff --git a/docs/app/assets/docs-overlays-theme.css b/docs/app/assets/docs-overlays-theme.css index 5f26f272d..d7dd47dce 100644 --- a/docs/app/assets/docs-overlays-theme.css +++ b/docs/app/assets/docs-overlays-theme.css @@ -250,6 +250,7 @@ html .ReflexSearch-overlay :is(.ReflexSearch-escape, .ReflexSearch-hit, .ReflexS .docs-feedback-content textarea:is([data-invalid], [aria-invalid="true"], :user-invalid), .docs-feedback-content div:has(> input:is([data-invalid], [aria-invalid="true"], :user-invalid)) { + /* SharedSiteStylesPlugin supplies this semantic alias of the Radix red scale. */ border-color: var(--destructive-10); } diff --git a/docs/app/assets/docs-theme.css b/docs/app/assets/docs-theme.css index cf0d823cf..609b4c382 100644 --- a/docs/app/assets/docs-theme.css +++ b/docs/app/assets/docs-theme.css @@ -2,7 +2,9 @@ Shared base styles remain owned by reflex-site-shared. */ /* Docs-only brand layer. Shared package consumers retain their own theme. Editorial selectors deliberately exclude live component examples. */ -/* Match marketing with variable WOFF2 subsets bundled from Fontsource. */ +/* Match marketing with variable WOFF2 subsets bundled from Fontsource. + Reflex imports this file through Vite, which emits these package URLs as + hashed WOFF2 assets under the configured frontend mount. */ @font-face { font-family: 'Geist'; font-style: normal; diff --git a/docs/app/reflex.lock/bun.lock b/docs/app/reflex.lock/bun.lock index fece7fa99..0149966a4 100644 --- a/docs/app/reflex.lock/bun.lock +++ b/docs/app/reflex.lock/bun.lock @@ -52,7 +52,6 @@ }, "overrides": { "cookie": "1.1.1", - "postcss": "8.5.26", }, "packages": { "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], @@ -587,7 +586,7 @@ "pkg-types": ["pkg-types@2.3.1", "", { "dependencies": { "confbox": "^0.2.4", "exsolve": "^1.0.8", "pathe": "^2.0.3" } }, "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg=="], - "postcss": ["postcss@8.5.26", "", { "dependencies": { "nanoid": "^3.3.17", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ=="], + "postcss": ["postcss@8.5.29", "", { "dependencies": { "nanoid": "^3.3.19", "picocolors": "^1.1.1", "source-map-js": "^1.2.2" } }, "sha512-49cGhUbXj8Qenv0iTMxA1cFBzxXoctpC9Ujd77t1WcbJIr6nF/eI7g/8MgxrYldFRuAXvja7xQRwavoW7kgrxQ=="], "postcss-import": ["postcss-import@17.0.0", "", { "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "peerDependencies": { "postcss": "^8.0.0" } }, "sha512-qzVMJhcq39KweT7Fp0HcjE5YxL5yI854Q3CtufxDuZKO9HLQUp2rptB9+U0MIj3pT1ZEVXoqnpeC1mSkfYuz4Q=="], @@ -653,7 +652,7 @@ "source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], - "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + "source-map-js": ["source-map-js@1.2.2", "", {}, "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw=="], "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], @@ -1135,6 +1134,8 @@ "@tailwindcss/node/lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="], + "@tailwindcss/node/source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA=="], "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA=="], diff --git a/docs/app/reflex.lock/package.json b/docs/app/reflex.lock/package.json index dd9d7c5a3..6e8627bc0 100644 --- a/docs/app/reflex.lock/package.json +++ b/docs/app/reflex.lock/package.json @@ -50,7 +50,6 @@ "vite": "8.3.2" }, "overrides": { - "cookie": "1.1.1", - "postcss": "8.5.26" + "cookie": "1.1.1" } -} \ No newline at end of file +} diff --git a/docs/app/xy_docs/examples.py b/docs/app/xy_docs/examples.py index bdc3cc4c5..bbbf1de3d 100644 --- a/docs/app/xy_docs/examples.py +++ b/docs/app/xy_docs/examples.py @@ -191,7 +191,7 @@ def _example_code_panel(source: str, value: str) -> rx.Component: "[&_div]:!bg-transparent [&_pre]:!bg-transparent " "[&_.code-block]:!bg-transparent [&_.code-block]:!rounded-none " "[&_.code-block]:!border-0 [&_.code-block]:!shadow-none " - "[&_summary]:!from-card" + "[&_summary]:!from-muted" ), ), value=value, diff --git a/spec/process/production-readiness.md b/spec/process/production-readiness.md index 85522e2a1..a83ae4069 100644 --- a/spec/process/production-readiness.md +++ b/spec/process/production-readiness.md @@ -85,6 +85,9 @@ together and validate the production app when refreshing it. middle, and last pages, verifying the article styling hook, preserved content, adjacent link destinations, removal of empty placeholders, and Next's placement in the second grid column. These contracts must pass after shared-package updates. +Long demo code disclosures fade to the same muted surface as their containing +card in both color modes. The frontend lock must resolve the declared PostCSS +version without an older override shadowing the framework's build dependency. The desktop XY docs navigation switches to a docs-specific disclosure below 1280px, preserving Overview and Reflex Integration destinations. Desktop links expose the selected section through `aria-current="page"` and a neutral pill.