You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
PageLayout (patterns) — the standard full-height page shell: a navbar slot,
a flex-1<main> offset (pt-28) to clear the fixed navbar, and a footer slot.
Navbar/footer are passed as slots so the shell stays decoupled from their props; hideFooter, transparentBg and mainClassName cover the common variations.
Extracted from Yunxin's hand-rolled shell (used by 8+ marketing pages).
Original OKLCH palette system — 24 palettes. The design-token scheme layer is
now generated from an in-house OKLCH model (scripts/gen-tokens.mjs) with
perceptually-even ramps; added teal, lime, amber, plum and fuchsia (19 →
24). The brand/accent/neutral roles can target any of them at runtime.
Theme-effect utilities (in the stylesheet, token-driven so they restyle with
the active brand/accent): .bg-brand-gradient, .text-brand-gradient, .glow-brand, .glow-accent, .bg-brand-sheen.
Fixed
iOS Safari no longer zooms the page when focusing a field. Mobile Safari
auto-zooms when a focused input/textarea/select has font-size < 16px (our fields
use text-sm = 14px). Added a touch-only (hover:none + pointer:coarse) rule
flooring form fields at 16px; desktop keeps the 14px look. Verified in WebKit and
Chromium under iPhone emulation.
Escape closes the LanguageSwitcher / ThemeToggle dropdowns (cross-browser).
They previously only closed on outside-click. Added Escape-to-close with focus
return to the trigger — via a document-level listener, because WebKit/Safari
on macOS doesn't focus a <button> on click, so a container onKeyDown would
never receive the key (caught by testing in the WebKit engine). CustomSelect
now focuses its trigger on mouse-open for the same reason, so its keyboard nav
works in Safari too.
Combobox is keyboard-navigable. Added ArrowUp/Down/Home/End/Enter listbox
navigation, role="listbox"/role="option"/aria-selected, and aria-activedescendant — previously mouse-only.
Accessible names + ARIA on the dropdowns.aria-label on the ModelSelect / CustomSelect / Combobox / SearchInput search fields (placeholder alone isn't
a label); aria-expanded/aria-haspopup on the ThemeToggle trigger; the Navbar
mobile-menu scrim is aria-hidden.
Navbar respects the iPhone safe area. The fixed top bar uses max(1.5rem, env(safe-area-inset-top)) so it clears the notch / Dynamic Island in
standalone Safari (no change on desktop, where the inset is 0).
Horizontal scroll bars no longer scroll vertically on touch.overflow-x-auto
with the default overflow-y: visible makes a browser compute overflow-y to auto too, so the ModelSelect provider-filter row (and the NavTabs / Tabs
bars) could be dragged up/down a few px on a phone. Added explicit overflow-y-hidden overscroll-x-contain to those single-row scrollers.
Unbreakable text no longer widens its row/card. Added truncate to the LinkRow title, SessionItem detail, ModelCard developer label and the Navbar app name (with min-w-0 on the logo link), so long ids / device strings
/ brand names ellipsize instead of pushing the layout past the viewport.
Hand-rolled dropdown panels stay inside the viewport.ModelSelect, CustomSelect, Combobox, LanguageSwitcher and ThemeToggle positioned
their floating panel with a plain absolute and no collision handling, so on
narrow / mobile screens the panel (notably ModelSelect's fixed w-96) spilled
off the right edge and could run past the bottom. New useAnchoredPosition hook
measures each panel against the viewport and applies a horizontal marginLeft
nudge (margin, so it never fights framer-motion / animate-in transforms) plus a maxHeight cap paired with an internal flex-1 min-h-0 scroll region. The Radix
panels (Select, DropdownMenu, Popover) already flip/shift via Popper and are
unchanged.
Changed
All dropdown / select panels share the LanguageSwitcher look. Unified every
floating menu panel onto one chrome — rounded-2xl border border-border bg-background/60 backdrop-blur-2xl shadow-lg shadow-black/5 — across Select, CustomSelect, Combobox, DropdownMenu, Popover, ModelSelect and the Navbar mobile menu (they previously diverged: square rounded-xl, opaque bg-(--bg-elevated) / bg-popover, weaker/absent blur, shadow-md/shadow-2xl).
The selectable rows in Select/CustomSelect/Combobox now use the shared .dropdown-item class — the same left accent bar on hover/selection as the
language picker, replacing per-component check-mark / tinted-background styles. .dropdown-item was extended to also drive Radix rows (keyboard data-highlighted, selected data-state=checked), so hand-rolled and Radix
dropdowns render identically.
Palette values are now original. The scheme primitives are regenerated from
the OKLCH model rather than the previously vendored ramps, so semantic-token
consumers may see subtle color shifts. The generator and all values are first-party.