Navigation
Generated from DESIGN_SYSTEM.md
Rules
- Phone top band is a route decision.
<main>pads for the fixed phone nav with the one value--shell-mobile-top; a route whose first section is a hero opts intomobile-top-bleedon that section so its own surface fills the band (www/about). Dashboards keep the band. Never pad or pull with a literal4.5remin a view.
Sidebar / Drawer:
- Item spacing:
6ptin iOS (VStack(spacing: 6)) andspace-y-1.5(6px) in Web to provide professional breathing room and modern, clean density. - Item vertical padding:
10ptfor comfortable tap-targets (minimum48pt+row height / touch target). - Item font size: 14β14.5pt/px, semibold when active.
- Active state background:
brand-container(pastel blue). - Active state text:
brand-on-container(brand blue / blue-400 dark). - Icon Container Tiles: Raw icons must be enclosed inside a
28x28rounded-rectangle (cornerRadius: 8) tile for structural visual balance. - Inactive:
6% opacity fill(0.06) +18% opacity stroke outline(0.18) (samethemeColor). Icon uses.symbolRenderingMode(.hierarchical)for natural depth shading. - Active: solid
themeColorfill, no stroke, white icon. - Footer language selector: collapsed label shows the full native name (
English/νκ΅μ΄/ζ₯ζ¬θͺ). Country selector shows the full local name (λνλ―Όκ΅/United States/ζ₯ζ¬). Never show raw ISO codes as the label. - Footer Selectors (Language & Country): Clean and compact. Replace default select boxes with compact menus. To save space, collapsed labels must NOT show emoji flags. Instead, they must use generic system icons (
globefor language,mappin.and.ellipsefor country) with font size reduced to9.5ptand container height set to26ptwith8ptcorner radius. - Never use solid fill (
brandPrimary.opacity(0.12)) for active nav β always usebrand-container. - Header alignment: center-vertical β never baseline (baseline misaligns icon with logo).
- Footer layout: vertical stack β never horizontal capsule cramming auth + theme + settings.
Bottom Tab Bar (mobile):
- Max 5 items
- Active tab:
brand-primaryicon + label,brand-containerbackground pill (iOS) - Inactive tab:
text-secondary/textSecondarycolor - Label always visible β no icon-only tabs (Jakob's Law)
Parent-page back navigation:
- THE standard "go up one level" affordance (detail β catalog, child β parent) is a liquid-glass pill: chevron-left + destination label,
h-11(44pt floor),rounded-fullβ the same floating-chrome family as the mobile top nav's circular buttons and center pill, so back-navigation reads identically across mobile chrome and in-page placements. - Web:
<PageBackLink href label />from@yroun/ui(utilityback-navinglobal.css). iOS:AppNavCircleButtonchevron already conforms. - Label is the DESTINATION's name, brand-cased ("Yroun Series", a series title) β never "Back"/"λ€λ‘".
Page Depth & Up-Navigation β structural rule:
The series-detail page shipped with no path back to the series catalog because only the look was canonical β presence was left to chance.
- Every screen declares its parent. The parent is the screen's logical container in the information architecture (usually the URL's container segment: episode β series detail β series catalog β hub home) β never browser history (
router.back()is not a parent; it goes wherever the user came from, including another site). - Every screen below a domain root renders its parent affordance (
<PageBackLink>web /AppNavCircleButtonchevron iOS) at the top of the content column. Domain roots (bottom-tab/sidebar destinations) are exempt β their "up" is the tab bar itself. - Documented exemptions only: full-screen immersive surfaces (games, reader mode) may replace the pill with a contextual exit, and modal sheets use their close affordance β each exemption named in the surface's code comment.