{
 "$schema": "../../schema.json",
 "schema": "fundus/1",
 "id": "mobile-bottom-navigation",
 "name": "Mobile Bottom-Navigation und Bottom-Sheet-Menü",
 "name_en": "Mobile bottom navigation / expanding bottom nav",
 "kurz": "Die Leiste in der Daumenzone wächst selbst zum Sheet, per Wisch am Griff geht sie wieder zu.",
 "kategorie": "Navigation",
 "kategorie_slug": "navigation",
 "kategorie_nr": 3,
 "bau_chat": "C3",
 "prioritaet": "B",
 "trendstatus": "aufsteigend",
 "belegstatus": "teilbelegt",
 "website_belege": 1,
 "stimmung": [
  "präzise",
  "verspielt"
 ],
 "stimmung_roh": [
  "app-artig",
  "freundlich",
  "funktional"
 ],
 "technik": [
  "css",
  "gsap",
  "flip",
  "popover",
  "pointer-events"
 ],
 "technik_gruppen": [
  "css",
  "js",
  "gsap"
 ],
 "leistungskosten": "niedrig",
 "steckbrief": {
  "beschreibung": "Auf dem Telefon sitzt die Navigation unten in der Daumenzone. Entweder als schwebende Pille mit drei bis fünf Zielen oder als Leiste mit Marke und „Menü“-Knopf. Ein Tipp auf „Menü“ lässt genau diese Leiste nach oben zum Sheet wachsen. Die Fläche bleibt dieselbe, die Ecken bleiben rund, die Links stehen groß und linksbündig darin. Am Griff lässt sich das Sheet nach unten wegwischen. Beim Scrollen nach unten kann die Leiste schrumpfen.",
  "warum_es_wirkt": "Die Ziele liegen dort, wo der Daumen auf großen Telefonen ohnehin ist. Das Muster kennt jeder aus Apps. Weil die Leiste selbst zum Sheet wird, bleibt klar, woher das Menü kommt (Objektkonstanz).",
  "wann_einsetzen": "Bei überwiegend mobilen Besuchern und wenigen Zielen: Shops, Gastronomie, Events, Portfolios von Fotografen oder Studios.",
  "wann_nicht": "Wenn die Leiste wichtige Inhalte, Cookie-Banner oder Chat-Widgets unten verdeckt. Auf dem Desktop gehört die Navigation nach oben. Den Daumen-Knopf nie als Nach-oben-Knopf und nie zusätzlich zur vollen Leiste.",
  "varianten": [
   "Leiste wächst zum Sheet (Expanding Bottom Navigation, Osmo-Ressource)",
   "Schwebende Pille mit Icons und Labels, „Mehr“ öffnet ein Sheet",
   "Sheet mit Drill-down für Unterebenen",
   "Mobiles Mega-Menü als Sheet",
   "Daumen-Knopf (FAB) öffnet ein Aktionsmenü mit Termin, Anrufen, WhatsApp und Anfahrt (Prinzip M3 Expressive FAB menu)",
   "Kontaktleiste für lokale Betriebe: Anrufen mit sichtbarer Nummer, WhatsApp oder Termin, Anfrage; weicht Consent-Banner, Tastatur und Footer"
  ],
  "umsetzung": "Leiste mit position: fixed; bottom: calc(12px + env(safe-area-inset-bottom)) und viewport-fit=cover im Viewport-Meta. Das Sheet liegt in Zielgröße bereit, clip-path zeigt im Ruhezustand nur die Leiste: inset(calc(100% - 56px) 14px 0 14px round 28px) → inset(0 round 28px). Alternativ GSAP Flip. Wischen mit Pointer Events (pointerdown/move/up) und setPointerCapture, Schwelle 80 px oder 0,5 px/ms; touch-action: none nur auf dem Griff. Beim Loslassen Inline-Transition und -Transform im selben Schritt entfernen, dann läuft der Übergang vom aktuellen Wischweg aus. Hintergrund sperren (overflow: hidden am Root, inert auf dem Inhalt), im Sheet overscroll-behavior: contain. Höhen in svh/dvh, weil die iOS-Adressleiste die Viewporthöhe ändert.",
  "mobil": "Ist die Mobile-Lösung. Auf dem Desktop als obere Navigation ausgeben, etwa als Pill-Navigation oder in den Ecken.",
  "reduzierte_bewegung": "Kein Morph: Die Leiste bleibt stehen, das Sheet blendet in 150 ms an seiner Zielposition ein. Keine Staffelung der Links.",
  "barrierefreiheit": "Wischen ist nur eine Zusatzgeste, ein sichtbarer Schließen-Knopf ist Pflicht. Der Knopf trägt aria-expanded und aria-controls. Im offenen Sheet bleibt der Fokus gefangen, Esc schließt und gibt den Fokus an den Knopf zurück. Der Seiteninhalt ist solange inert. Links stehen in einem <nav> mit aria-label, Trefferflächen mindestens 44 bis 48 px. Daumen-Knopf: Menü-Semantik (aria-haspopup=\"menu\", role=\"menu\"/\"menuitem\"), Pfeiltasten, Esc gibt den Fokus zurück. Kontaktleiste: <nav aria-label=\"Kontakt\">, Ziele mindestens 44 px, scroll-padding-bottom in Leistenhöhe, damit der Tastaturfokus nie unter der Leiste liegt (WCAG 2.4.11); ausgeblendet ist die Leiste inert."
 },
 "messwerte": {
  "easing": "cubic-bezier(0.32, 0.72, 0, 1) (iOS-Sheet-ähnlich)",
  "dauer_ms": "Öffnen 400–500; Schließen 300",
  "stagger_ms": "Links 30–40",
  "distanz": "Swipe-Schwelle ca. 80 px",
  "sonstiges": "Trefferflächen min. 44–48 px",
  "herkunft": "typisch",
  "quelle": ""
 },
 "kurve": {
  "bezier": [
   0.32,
   0.72,
   0.0,
   1.0
  ],
  "css": "cubic-bezier(0.32, 0.72, 0, 1)",
  "name": "eigene Kurve",
  "dauer_ms": 450
 },
 "gesehen_bei": [
  {
   "seite": "Osmo: Expanding Bottom Navigation",
   "url": "https://www.osmo.supply/resource/expanding-bottom-navigation",
   "auszeichnung": "Osmo-Ressource",
   "beobachtung": "Nur Titel gesehen (Seite gesperrt).",
   "art": "demo"
  },
  {
   "seite": "UXPin: Mobile Navigation Design – 8 Types (2026)",
   "url": "https://www.uxpin.com/studio/blog/mobile-navigation-examples/",
   "auszeichnung": "",
   "beobachtung": "Bottom-Navigation als zentrales Mobile-Muster 2026 (Artikel nur als Suchergebnis gesehen).",
   "art": "artikel"
  },
  {
   "seite": "Mat Voyce",
   "url": "https://matvoyce.tv/",
   "auszeichnung": "",
   "beobachtung": "Live geprüft (89b27e24534d8957.css): .styles_toggle_menu:not(.styles_isFooter){position:fixed;right:var(--gap-x);top:calc(100dvh - 3.6rem)} – Menü-Button sitzt unten rechts in der Daumenzone.",
   "art": "website"
  }
 ],
 "tutorials": [
  {
   "titel": "UX Planet: Bottom tab bar navigation design best practices",
   "url": "https://uxplanet.org/bottom-tab-bar-navigation-design-best-practices-48d46a3b0c36"
  }
 ],
 "kombinierbar_mit": [
  "schwebende-pill-navigation",
  "kompakte-expandierende-navigation",
  "gestapelte-drawer-navigation"
 ],
 "urls": {
  "detail": "https://cecodesign.de/lab/fundus/navigation/mobile-bottom-navigation/",
  "meta": "https://cecodesign.de/lab/fundus/navigation/mobile-bottom-navigation/meta.json",
  "demo": "https://cecodesign.de/lab/fundus/navigation/mobile-bottom-navigation/demo"
 },
 "herkunft": {
  "quelldateien": [
   "navigation.json",
   "patch-belege-3.json"
  ],
  "pruefnotizen": [
   "patch-belege-3.json: Einfacher Beleg (Menü-Button unten), keine Tab-Bar; Awwwards-Inspirationen entfernt."
  ]
 },
 "bau": {
  "status": "fertig",
  "kurz": "Die Leiste in der Daumenzone wächst selbst zum Sheet, per Wisch am Griff geht sie wieder zu.",
  "demo": true,
  "abhaengigkeiten": [],
  "werte": {
   "easing": "cubic-bezier(0.32, 0.72, 0, 1)",
   "dauer_ms": {
    "oeffnen": 450,
    "schliessen": 300,
    "ebene_wechsel": 450,
    "tab_indikator": 400,
    "ui": 150
   },
   "stagger_ms": 35,
   "link_verzoegerung_ms": 90,
   "distanz": "Links steigen 12 px auf (opacity 0 → 1)",
   "leiste": "Höhe 56 px, Radius 28 px, unten calc(12px + env(safe-area-inset-bottom)); Sheet links/rechts 10 px, Leiste weitere 14 px eingerückt",
   "morph": "clip-path: inset(calc(100% - 56px) 14px 0 14px round 28px) → inset(0 0 0 0 round 28px); Sheet-Höhe min(420px, 100% - 96px)",
   "schrumpfen": "ab 40 px Scroll nach unten: Leiste 48 px, Einzug 44 px, Radius 24 px; beim Hochscrollen (> 4 px) wieder groß",
   "wischen": "nur am Griff (40 px hoch, Touch 44 px, touch-action: none); schließt ab 80 px Weg oder 0,5 px/ms; nach oben gedämpft (Faktor 0,2)",
   "tab_pille": "Pille 64 px hoch (5 px Innenabstand), Ziele 74 × 56 px, geschrumpft 58 × 44 px ohne Label; Sheet fährt per translateY(calc(100% + 40px)) → 0 herein",
   "drill_down": "Unterebene translateX(100%) → 0, Hauptebene → -28 % und opacity 0, 450 ms",
   "schleier": "rgba(20, 20, 20, .34), Fade 450/300 ms; beim Wischen proportional ausgeblendet (dy / 320 px)",
   "trefferflaeche": "min. 44 px (Knopf 108 × 44 px), Links 60 px hoch",
   "bildwechsel": "Crossfade 600 ms cubic-bezier(0.455, 0.03, 0.515, 0.955), alle 4000 ms",
   "reduziert": "Fade 150 ms linear an Zielposition, Leiste bleibt stehen"
  },
  "ausloeser": "klick",
  "touch": "Tippen auf „Menü“ öffnet, Ziehen am Griff nach unten schließt (Pointer Events, Schwelle 80 px oder 0,5 px/ms). Bei 390 px Breite ist die Leiste wirklich position: fixed mit Safe-Area-Abstand, der Body-Scroll ist bei offenem Sheet gesperrt (overflow: hidden per :has). Griffzone 44 px, keine Hover-Effekte. Kontaktleiste: fest unten mit env(safe-area-inset-bottom), drei Ziele 52 px hoch; offene Tastatur erkennt visualViewport (Höhe schrumpft um mehr als 150 px) oder Fokus in einem Feld bei grobem Zeiger, dann geht die Leiste weg.",
  "reduziert": "Kein Morph, kein Hereinfahren, keine Staffelung, kein automatischer Bildwechsel. Die Leiste bleibt an ihrem Platz, Fläche und Links des Sheets blenden in 150 ms an der Zielposition ein. Wischen funktioniert weiter, das Sheet folgt dem Finger und blendet dann aus. Kontaktleiste: kein Hereinfahren, Ein- und Ausblenden 150 ms über Deckkraft; die gezeichnete Tastatur blendet ebenso.",
  "korrekturen": {
   "beschreibung": "Auf dem Telefon sitzt die Navigation unten in der Daumenzone. Entweder als schwebende Pille mit drei bis fünf Zielen oder als Leiste mit Marke und „Menü“-Knopf. Ein Tipp auf „Menü“ lässt genau diese Leiste nach oben zum Sheet wachsen. Die Fläche bleibt dieselbe, die Ecken bleiben rund, die Links stehen groß und linksbündig darin. Am Griff lässt sich das Sheet nach unten wegwischen. Beim Scrollen nach unten kann die Leiste schrumpfen.",
   "warum_es_wirkt": "Die Ziele liegen dort, wo der Daumen auf großen Telefonen ohnehin ist. Das Muster kennt jeder aus Apps. Weil die Leiste selbst zum Sheet wird, bleibt klar, woher das Menü kommt (Objektkonstanz).",
   "wann_einsetzen": "Bei überwiegend mobilen Besuchern und wenigen Zielen: Shops, Gastronomie, Events, Portfolios von Fotografen oder Studios.",
   "wann_nicht": "Wenn die Leiste wichtige Inhalte, Cookie-Banner oder Chat-Widgets unten verdeckt. Auf dem Desktop gehört die Navigation nach oben. Den Daumen-Knopf nie als Nach-oben-Knopf und nie zusätzlich zur vollen Leiste.",
   "varianten": [
    "Leiste wächst zum Sheet (Expanding Bottom Navigation, Osmo-Ressource)",
    "Schwebende Pille mit Icons und Labels, „Mehr“ öffnet ein Sheet",
    "Sheet mit Drill-down für Unterebenen",
    "Mobiles Mega-Menü als Sheet",
    "Daumen-Knopf (FAB) öffnet ein Aktionsmenü mit Termin, Anrufen, WhatsApp und Anfahrt (Prinzip M3 Expressive FAB menu)",
    "Kontaktleiste für lokale Betriebe: Anrufen mit sichtbarer Nummer, WhatsApp oder Termin, Anfrage; weicht Consent-Banner, Tastatur und Footer"
   ],
   "umsetzung": "Leiste mit position: fixed; bottom: calc(12px + env(safe-area-inset-bottom)) und viewport-fit=cover im Viewport-Meta. Das Sheet liegt in Zielgröße bereit, clip-path zeigt im Ruhezustand nur die Leiste: inset(calc(100% - 56px) 14px 0 14px round 28px) → inset(0 round 28px). Alternativ GSAP Flip. Wischen mit Pointer Events (pointerdown/move/up) und setPointerCapture, Schwelle 80 px oder 0,5 px/ms; touch-action: none nur auf dem Griff. Beim Loslassen Inline-Transition und -Transform im selben Schritt entfernen, dann läuft der Übergang vom aktuellen Wischweg aus. Hintergrund sperren (overflow: hidden am Root, inert auf dem Inhalt), im Sheet overscroll-behavior: contain. Höhen in svh/dvh, weil die iOS-Adressleiste die Viewporthöhe ändert.",
   "mobil": "Ist die Mobile-Lösung. Auf dem Desktop als obere Navigation ausgeben, etwa als Pill-Navigation oder in den Ecken.",
   "reduzierte_bewegung": "Kein Morph: Die Leiste bleibt stehen, das Sheet blendet in 150 ms an seiner Zielposition ein. Keine Staffelung der Links.",
   "barrierefreiheit": "Wischen ist nur eine Zusatzgeste, ein sichtbarer Schließen-Knopf ist Pflicht. Der Knopf trägt aria-expanded und aria-controls. Im offenen Sheet bleibt der Fokus gefangen, Esc schließt und gibt den Fokus an den Knopf zurück. Der Seiteninhalt ist solange inert. Links stehen in einem <nav> mit aria-label, Trefferflächen mindestens 44 bis 48 px. Daumen-Knopf: Menü-Semantik (aria-haspopup=\"menu\", role=\"menu\"/\"menuitem\"), Pfeiltasten, Esc gibt den Fokus zurück. Kontaktleiste: <nav aria-label=\"Kontakt\">, Ziele mindestens 44 px, scroll-padding-bottom in Leistenhöhe, damit der Tastaturfokus nie unter der Leiste liegt (WCAG 2.4.11); ausgeblendet ist die Leiste inert."
  },
  "geprueft": "02.11.2026",
  "notiz": "Welt: Rezept fotograf-film-bild-zuerst mit der erfundenen Fotografin Theres Ammann aus Konstanz (Instrument Serif nur für Name und Serientitel, Instrument Sans, Fragment Mono für Zähler und Bildunterschrift, neutrales Hellgrau #f4f4f2, Bildwechsel nur als Crossfade). Alle Bilder sind eigene SVG-Seestücke vom Bodensee (Nebel am Seerhein, Föhn, Fährhafen, Eiswinter, Sturmwarnung, Filmstill Untersee). Auf dem Desktop steht die Mobilseite in einer Telefon-Attrappe (375 × 780, auf die Fensterhöhe skaliert), bei 390 px Breite ist sie die echte Seite mit fixer Leiste. Umschalter: Leiste wächst (clip-path-Morph, Leiste schrumpft beim Scrollen), Tab-Pille (Icons und Labels, gleitender Indikator, „Mehr“ öffnet klassisches Sheet), Drill-down (Serien als zweite Ebene). Die Werte stehen rechts. Die Vorführung tippt mit einem gezeichneten Finger, wählt Ziele, wischt das Sheet zu, scrollt und wechselt jede Runde die Variante. Ohne Bibliothek. AD-Review 01.11.2026: Note 4. Werte-Liste am Telefon ausgeblendet, damit die Seite direkt unter dem Umschalter beginnt. Zugang 02.11.2026: --leise #8a8a8a → #6e6e6e (4,6:1), --hell-leise .5 → .56; geschlossenes Sheet: Inhalt (.innen) visibility hidden nach dem Schließen und Ebenen inert (Fokus springt nicht ins verdeckte Menü); Bildfolge ist ein fokussierbarer Knopf (role=button, Enter/Leertaste nächstes Bild, Bildtext als Beschreibung); Kontrastmodus-Rahmen für Knöpfe. Korrektur 02.11.2026: Varianten nach Regel 13 (?v=basis|fab); Leiste, Tab-Pille und Drill-down stehen in der Grundvariante unter „Form“. fab: erfundener Salon Mira in Bad Kissingen (Rezept friseur-salon-handschrift) mit Preisliste; Knopf „Termin“ öffnet Menü mit Anfahrt, WhatsApp, Anrufen, Termin online buchen; beim Runterscrollen wird der Knopf rund. Varianten 02.11.2026: neue Variante kontakt (?v=kontakt) für die Rezepte handwerk, kfz, pflege, friseur, praxis: erfundener Elektromeister Kaltenecker in Freising (Special Gothic, Atkinson Hyperlegible Next, Zement #efedea, Signal #f2b705 nur für Anfrage, Bewegung token-tech-praezise). Dunkle Leiste unten: Anrufen mit sichtbarer Nummer (tel:), WhatsApp (optional, ersetzbar durch Termin), Anfrage (springt weich zum Formular, Fokus auf die Überschrift, nicht ins Feld). Die Leiste kommt erst nach der Wahl im Consent-Banner, geht weg, sobald der Footer sie erreichen würde, und bei offener Tastatur (in der Attrappe gezeichnet). scroll-padding-bottom plus Rückfall per focusin. Ausgeblendet inert, Zustand im Pult. tel: und WhatsApp zeigen in der Demo nur eine Meldung. Vorführung: Consent wählen, Leiste fährt ein, Anrufen, Anfrage, Feld antippen (Tastatur, Leiste weg), Footer (Leiste weg).",
  "varianten": [
   {
    "id": "basis",
    "name": "Menü-Leiste wird Sheet (Fotografin)",
    "knopf": "Menü-Leiste",
    "wann": "Portfolio-, Hotel- und Gastro-Seiten mit 4 bis 7 Bereichen: Leiste in der Daumenzone wird zum Sheet; Unterumschalter Leiste, Tab-Pille, Drill-down.",
    "werte": {
     "welt": "Theres Ammann, Fotografin in Konstanz",
     "easing": "cubic-bezier(0.32, 0.72, 0, 1)",
     "dauer_ms": {
      "oeffnen": 450,
      "schliessen": 300
     },
     "leiste": "56 px, Radius 28 px"
    }
   },
   {
    "id": "fab",
    "name": "Daumen-Knopf mit Aktionsmenü (Salon)",
    "knopf": "Daumen-Knopf",
    "wann": "Wenn mobil nur die Wege zum Kontakt zählen (Termin, Anrufen, WhatsApp, Anfahrt) und eine volle Leiste zu viel ist: Friseur, Praxis, Handwerk, Fahrschule. Prinzip M3 Expressive „FAB menu“. Nie als Nach-oben-Knopf.",
    "werte": {
     "rezept": "friseur-salon-handschrift",
     "knopf": "button 136 × 56 px, Radius 18 px, #9b1d2e, Text #fff 16 px (8:1), rechts 16 px, unten calc(18px + env(safe-area-inset-bottom)); ab 40 px Scroll nach unten 56 × 56 px rund ohne Text (gleiche Logik wie die Leiste)",
     "menue": "ul role=\"menu\" über dem Knopf, rechtsbündig, unten 86 px; 4 Einträge a role=\"menuitem\" 52 px hoch, Radius 26 px, Abstand 8 px; wichtigster Eintrag „Termin online buchen“ ganz unten in Lackrot",
     "oeffnen": "450 ms cubic-bezier(0.32, 0.72, 0, 1); Einträge opacity 0 → 1, translateY 12 px → 0, scale .92 → 1, Stagger 35 ms von unten; Knopf wird Kreis, Kalender dreht zu × (rotate 90°)",
     "schliessen": "300 ms, danach visibility hidden und inert",
     "schleier": "rgba(30, 20, 18, .38), Tippen schließt",
     "semantik": "aria-haspopup=\"menu\", aria-expanded, aria-controls; Enter, Leertaste und Pfeil runter öffnen und fokussieren den ersten Eintrag, Pfeil hoch den letzten; im Menü Pfeile mit Umlauf, Pos1/Ende, Erstbuchstabe; Esc schließt und gibt den Fokus an den Knopf; Tab schließt; Einträge tabindex −1",
     "name": "aria-label „Termin und Kontakt“ (enthält das sichtbare „Termin“)",
     "reduziert": "kein Versatz, keine Staffel, Einblenden 150 ms",
     "farben": "#f4e9e4 Puder, #1e1412 Espresso, #9b1d2e Lackrot nur für Termin, #6e5a55 Meta (5,4:1)",
     "schrift": "Kalnia 500 wdth 112 (h1 44 px/.95), Familjen Grotesk 16 px Text und Knöpfe"
    }
   },
   {
    "id": "kontakt",
    "name": "Kontaktleiste (Elektrobetrieb)",
    "knopf": "Kontaktleiste",
    "wann": "Lokale Betriebe, deren mobile Seite vor allem zum Anruf oder zur Anfrage führen soll: Handwerk, Kfz-Werkstatt, Pflegedienst, Friseur, Praxis. Statt Menü-Leiste oder Daumen-Knopf; das Menü bleibt oben.",
    "werte": {
     "rezept": "handwerk-werkstatt-klartext (auch kfz-werkstatt-autohaus, pflege-dienst-naehe, friseur-salon-handschrift, praxis-gesundheit-ruhig)",
     "leiste": "nav fest unten, Höhe 68 px + env(safe-area-inset-bottom) (Attrappe 22 px), Hintergrund #1a1a1a, Raster 1,45fr / 0,7fr (min. 64 px) / 1fr, Abstand 8 px, Innenabstand 8 px 10 px",
     "ziele": "min. 52 px hoch, Radius 6 px; Anrufen mit Nummer 13 px Tabellenziffern; Anfrage #f2b705 mit Text #1a1a1a (9,6:1)",
     "einblenden": "translateY(calc(100% + 2px)) → 0 in 240 ms cubic-bezier(0, 0, 0.38, 0.9)",
     "ausblenden": "150 ms cubic-bezier(0.2, 0, 1, 0.9), danach visibility hidden und inert",
     "scroll_padding": "bottom 68 px + Safe Area + 16 px; offene Tastatur (Attrappe) 288 px; Rückfall: focusin schiebt Elemente über die Leiste",
     "aus_wenn": "Consent-Banner offen; Footer-Oberkante über der Leistenoberkante; Tastatur offen (innerHeight − visualViewport.height > 150 px oder Feld fokussiert bei pointer: coarse)",
     "anfrage": "scrollTo smooth (reduziert: sofort) zur Überschrift, 16 px Luft, Fokus auf h2 tabindex −1",
     "consent": "zwei gleichrangige Knöpfe 48 px, „Cookie-Einstellungen“ im Footer öffnet wieder",
     "schrift": "Special Gothic 700 wdth 75 % (Marke, Labels), h1 38 px; Atkinson Hyperlegible Next 17 px/1.55"
    }
   }
  ]
 }
}
