Skip to content

v0.2.15

Choose a tag to compare

@yuhuanowo yuhuanowo released this 06 Aug 09:49
· 190 commits to main since this release

Added

  • 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.
  • YUNUI_THEME_PRESETS — 12 curated multi-color themes. Named
    {brand, accent, neutral} combos (Aurora, Sunset, Forest, Ocean, Grape, Ember,
    Lagoon, Blossom, Royal, Citrus, Orchid, Mono), exported with
    YunUIThemePreset / YunUIThemePresetName. Apply with applyTheme(preset).
  • 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.