{
 "$schema": "../../schema.json",
 "schema": "fundus/1",
 "id": "mega-menue-morphing-viewport",
 "name": "Mega-Menü mit morphendem gemeinsamem Viewport",
 "name_en": "Morphing mega menu (shared dropdown viewport, Stripe-style)",
 "kurz": "Vier Menüs teilen sich eine Box: Sie morpht in 250 ms auf Breite und Höhe des neuen Inhalts, der Inhalt gleitet in Bewegungsrichtung.",
 "kategorie": "Navigation",
 "kategorie_slug": "navigation",
 "kategorie_nr": 3,
 "bau_chat": "C3",
 "prioritaet": "A",
 "trendstatus": "etabliert",
 "belegstatus": "belegt",
 "website_belege": 2,
 "stimmung": [
  "ruhig",
  "präzise"
 ],
 "stimmung_roh": [
  "technisch",
  "präzise",
  "ruhig",
  "seriös"
 ],
 "technik": [
  "css",
  "vanilla-js",
  "radix",
  "popover",
  "anchor-positioning"
 ],
 "technik_gruppen": [
  "css",
  "js",
  "andere"
 ],
 "leistungskosten": "niedrig",
 "steckbrief": {
  "beschreibung": "Mehrere Hauptpunkte wie Produkt oder Ressourcen teilen sich einen einzigen Dropdown-Container, den Viewport. Beim Hover öffnet er nach kurzer Verzögerung. Wechselt man zum Nachbarn, schließt er nicht, sondern ändert Breite, Höhe und Lage fließend auf die Maße des neuen Inhalts. Der alte Inhalt gleitet in Bewegungsrichtung hinaus, der neue kommt von der Gegenseite und blendet ein. Ein kleiner Pfeil kann auf den aktiven Trigger zeigen. Die Inhalte sind typografisch ruhig: Gruppen mit kleinen Überschriften, Icons, Kurzbeschreibungen und oft ein Teaser mit Bild.",
  "warum_es_wirkt": "Der Viewport wirkt wie ein Objekt, das mitdenkt. Es gibt kein Flackern zwischen den Menüs. Das richtungsbewusste Gleiten zeigt die räumliche Ordnung der Menüpunkte.",
  "wann_einsetzen": "Produkt- und SaaS-Seiten, Agenturen mit mehreren Leistungsbereichen, Shops mit Kategorien. Lohnt sich ab etwa drei Triggern mit je fünf oder mehr Einträgen.",
  "wann_nicht": "Bei wenigen, flachen Links und bei Portfolios. Bei einer reinen Touch-Zielgruppe ohne Desktop-Anteil.",
  "varianten": [
   "Stripe-Stil: Die Box folgt dem Trigger und morpht, die Inhalte gleiten richtungsabhängig",
   "Radix- bzw. Vercel-Stil: Der Viewport bleibt stehen, die Größe kommt über CSS-Variablen, die Richtung über data-motion (from-start, from-end, to-start, to-end), ein Pfeil wandert",
   "Vollbreites Mega-Menü mit Kategorienspalte links, die den Inhaltsbereich steuert (Meter)",
   "Produktkarten mit Mini-UI-Vorschau (SurferSEO)",
   "Directional Hover (Osmo Mega Navigation)",
   "Mobil: Drill-down-Panels statt Viewport"
  ],
  "umsetzung": "Alle Inhalte vorrendern und absolut im Viewport stapeln (width: max-content). Den aktiven Inhalt messen (offsetWidth, offsetHeight) und als CSS-Variablen --w, --h und --x auf den Viewport schreiben. width, height und translate transitionieren, overflow: hidden schneidet den Inhalt während des Morphens zu. Beim ersten Öffnen die Transition kurz abschalten, damit die Box nicht aus der alten Größe wächst.\n\nRichtung aus dem Index-Vergleich von alt und neu bestimmen und als data-motion setzen. Keyframes von-start, von-ende, zu-start und zu-ende mit translateX und opacity. Vor dem Setzen das Attribut entfernen und einmal Layout lesen, sonst startet die Animation bei schnellem Hin und Her nicht neu.\n\nHover-Intent: Öffnen nach 200 ms. Solange die Box offen ist oder bis 300 ms nach dem Schließen wechseln die Trigger ohne Verzögerung (Radix skipDelayDuration). Beim Verlassen eine kurze Gnadenfrist lassen, damit der Weg vom Trigger in die Box und diagonales Ziehen nicht schließen.\n\nInaktive Panels mit inert versehen. Pfeiltasten in onKeyDown behandeln, onKeyPress feuert dafür nicht. backdrop-filter auf der Box wirkt nicht, wenn ein Elternelement für das Öffnen opacity oder transform animiert; dann den Hintergrund fast deckend wählen oder den Blur auf ein Geschwisterelement legen.",
  "mobil": "Der Viewport entfällt. Ein Menü-Knopf öffnet ein Vollbild-Blatt mit Drill-down-Panels oder einem Akkordeon. Die Trigger sind Buttons, Antippen öffnet die Unterebene.",
  "reduzierte_bewegung": "Kein Gleiten, nur Überblenden in 100 bis 150 ms. Größe und Lage wechseln sofort.",
  "barrierefreiheit": "Trigger als <button aria-expanded> mit aria-controls, Links als echte <a>. Pfeiltasten wechseln zwischen den Triggern, Home und End springen an die Enden, ArrowDown führt in den Inhalt, Escape schließt und setzt den Fokus zurück auf den Trigger. Öffnen auch per Enter und Klick, nicht nur per Hover."
 },
 "messwerte": {
  "easing": "ease bzw. cubic-bezier(.2,.8,.2,1) für Größe; ease-out für Inhalte",
  "dauer_ms": "Viewport-Größe 250–300; Inhalts-Slide 300 (duration-300 im Builder.io-Nachbau)",
  "stagger_ms": "",
  "distanz": "Inhalt translate-x-24 (96 px) im Builder.io-Nachbau; Radix-Beispiel ca. 200 px",
  "sonstiges": "Radix: delayDuration 200 ms, skipDelayDuration 300 ms (beobachtet). Größen-Dauer typisch.",
  "herkunft": "beobachtet",
  "quelle": "https://www.builder.io/blog/stripe-menus ; https://radix-ui.com/primitives/docs/components/navigation-menu"
 },
 "kurve": {
  "bezier": [
   0.25,
   0.1,
   0.25,
   1
  ],
  "css": "cubic-bezier(0.25, 0.1, 0.25, 1)",
  "name": "ease",
  "dauer_ms": 250
 },
 "gesehen_bei": [
  {
   "seite": "Vercel",
   "url": "https://www.vercel.com",
   "auszeichnung": "",
   "beobachtung": "Products-Mega-Menü mit vier Gruppen (Agent Stack, Core Platform, Tools, Resources), dazu Ask-AI-Control und Theme-Auswahl im Footer.",
   "art": "website",
   "browser_gemessen": true
  },
  {
   "seite": "Linear",
   "url": "https://www.linear.app",
   "auszeichnung": "",
   "beobachtung": "Zwei Dropdown-Trigger (Product, Resources) plus flache Links; Skip-Link vorhanden.",
   "art": "website"
  },
  {
   "seite": "Stripe-Navigation nachgebaut (CodyHouse, 2016)",
   "url": "https://codyhouse.co/gem/stripe-navigation",
   "auszeichnung": "",
   "beobachtung": "Klassische Referenz für die morphende Dropdown-Box.",
   "art": "artikel"
  },
  {
   "seite": "Navbar Gallery: Best Mega Menu Designs",
   "url": "https://www.navbar.gallery/blog/best-mega-menu-navigation-designs",
   "auszeichnung": "",
   "beobachtung": "Vercel, Lattice, Meter, SurferSEO, Outerbase, Doss als aktuelle Beispiele mit Teasern, Icons, Kategorienspalte.",
   "art": "artikel"
  },
  {
   "seite": "Awwwards Inspiration: Mega menu (mehrere Einträge, z. B. Seatrees full-bleed)",
   "url": "https://www.awwwards.com/inspiration/full-bleed-mega-menu-seatrees",
   "auszeichnung": "Awwwards Inspiration (Element-Sammlung)",
   "beobachtung": "Nur Titel gesehen: vollbreites Mega-Menü.",
   "art": "website-ungeprueft"
  }
 ],
 "tutorials": [
  {
   "titel": "Builder.io: Stripe-Menüs in React nachbauen",
   "url": "https://www.builder.io/blog/stripe-menus"
  },
  {
   "titel": "Radix Primitives: Navigation Menu",
   "url": "https://radix-ui.com/primitives/docs/components/navigation-menu"
  },
  {
   "titel": "CodyHouse: Stripe Navigation",
   "url": "https://codyhouse.co/gem/stripe-navigation"
  },
  {
   "titel": "Osmo: Mega Navigation (Directional Hover)",
   "url": "https://www.osmo.supply/resource/mega-navigation-directional-hover"
  }
 ],
 "kombinierbar_mit": [
  "gleitender-indikator",
  "native-popover-dropdowns",
  "sticky-shrink-header",
  "command-palette-und-ki-suche"
 ],
 "urls": {
  "detail": "https://cecodesign.de/lab/fundus/navigation/mega-menue-morphing-viewport/",
  "meta": "https://cecodesign.de/lab/fundus/navigation/mega-menue-morphing-viewport/meta.json",
  "demo": "https://cecodesign.de/lab/fundus/navigation/mega-menue-morphing-viewport/demo"
 },
 "herkunft": {
  "quelldateien": [
   "navigation.json"
  ]
 },
 "bau": {
  "status": "fertig",
  "kurz": "Vier Menüs teilen sich eine Box: Sie morpht in 250 ms auf Breite und Höhe des neuen Inhalts, der Inhalt gleitet in Bewegungsrichtung.",
  "demo": true,
  "abhaengigkeiten": [],
  "werte": {
   "stripe_groesse": "width, height und translate (x) 250 ms cubic-bezier(0.2, 0.8, 0.2, 1)",
   "stripe_inhalt": "300 ms ease-out (cubic-bezier(0, 0, 0.58, 1)), Versatz 96 px, opacity 0 ↔ 1",
   "stripe_lage": "Box mittig unter dem Trigger, an den Kopfrändern begrenzt",
   "radix_groesse": "width und height 300 ms ease (cubic-bezier(0.25, 0.1, 0.25, 1)), Box bleibt an der linken Kante des ersten Triggers",
   "radix_inhalt": "250 ms ease, Versatz 200 px, opacity 0 ↔ 1",
   "pfeil": "16 × 8 px Dreieck (clip-path), wandert mit Dauer und Kurve der Größe zur Trigger-Mitte",
   "richtung": "Index neu > alt: alter Inhalt zu-start (nach links hinaus), neuer von-ende (von rechts); sonst gespiegelt",
   "oeffnen": "opacity 0 → 1 und rotateX(-12deg) scale(0.96) → none, 200 ms ease, perspective 1400px, transform-origin an der Trigger-Mitte",
   "schliessen": "dieselben Werte rückwärts, 150 ms ease",
   "erstes_oeffnen": "Größe und Lage springen (Transition aus), kein Gleiten des Inhalts",
   "hover_intent_oeffnen_ms": 200,
   "skip_delay_ms": 300,
   "gnadenfrist_schliessen_ms": 150,
   "gnadenfrist_hinweis": "Öffnen 200 ms und Skip 300 ms wie bei Radix beobachtet; Gnadenfrist 150 ms eigener Wert",
   "box": "Radius 6px, Hintergrund rgba(255, 255, 255, .985), Schatten 0 0 0 1px rgba(30,30,80,.09), 0 2px 4px rgba(30,30,80,.04), 0 30px 60px -22px rgba(30,30,80,.32); Abstand zum Kopf 10px",
   "panelmasse_desktop": "Rechtsgebiete 848 × 376, Köpfe 474 × 478, Kanzlei 356 × 272, Insights 428 × 383 (px, gemessen per offsetWidth/offsetHeight bei 1440 px)",
   "vergleich_ohne_morph": "jede Box öffnet einzeln neu (200 ms), Größe und Lage springen",
   "mobil_drilldown": "unter 860 px Vollbild-Blatt; Ebene 2 translateX 100% → 0, Ebene 1 → -30% und ausgeblendet, 300 ms ease-out; Blatt opacity 200 ms ease",
   "reduziert": "Inhalt nur Überblenden 120 ms linear, Größe, Lage und Pfeil springen, Box ohne Skalierung (opacity 120 ms)",
   "farben": "Grund #f9f8f8, Fläche #efebeb, Linie #d2cdc7, Box #ffffff, Marke #1e1e50 (Nachtblau), Text #212529, Meta #73645a, Akzent #00bee6 nur für aktive Trigger-Linie, Badge und Statuspunkt",
   "trigger_aktiv": "2 px Akzentlinie unter dem offenen Trigger, scaleX 0 → 1, 150 ms ease",
   "schriften": "Newsreader (variabel, opsz) für Marke, Überschriften und Menütitel; Schibsted Grotesk 400/500 für Navigation, Texte und Labels; Geist Mono nur in der Demo-Leiste",
   "vorfuehrung_runde_ms": 15450
  },
  "ausloeser": "hover",
  "touch": "Unter 860 px entfällt der Viewport: Der Menü-Knopf öffnet ein Vollbild-Blatt mit Drill-down. Antippen einer Kategorie schiebt deren Ebene von rechts herein, Zurück schiebt sie wieder hinaus. Die Inhalte sind dieselben wie am Desktop, einspaltig. Auf breiten Touch-Geräten öffnet Antippen eines Triggers die Box, der Wechsel morpht wie mit der Maus.",
  "reduziert": "Kein Gleiten, kein Morphen: Größe, Lage und Pfeil springen, der Inhalt blendet in 120 ms über, die Box öffnet ohne Skalierung. Im Drill-down werden die Ebenen nur überblendet. Die Werte-Leiste zeigt den reduzierten Modus an.",
  "korrekturen": {
   "beschreibung": "Mehrere Hauptpunkte wie Produkt oder Ressourcen teilen sich einen einzigen Dropdown-Container, den Viewport. Beim Hover öffnet er nach kurzer Verzögerung. Wechselt man zum Nachbarn, schließt er nicht, sondern ändert Breite, Höhe und Lage fließend auf die Maße des neuen Inhalts. Der alte Inhalt gleitet in Bewegungsrichtung hinaus, der neue kommt von der Gegenseite und blendet ein. Ein kleiner Pfeil kann auf den aktiven Trigger zeigen. Die Inhalte sind typografisch ruhig: Gruppen mit kleinen Überschriften, Icons, Kurzbeschreibungen und oft ein Teaser mit Bild.",
   "warum_es_wirkt": "Der Viewport wirkt wie ein Objekt, das mitdenkt. Es gibt kein Flackern zwischen den Menüs. Das richtungsbewusste Gleiten zeigt die räumliche Ordnung der Menüpunkte.",
   "wann_einsetzen": "Produkt- und SaaS-Seiten, Agenturen mit mehreren Leistungsbereichen, Shops mit Kategorien. Lohnt sich ab etwa drei Triggern mit je fünf oder mehr Einträgen.",
   "wann_nicht": "Bei wenigen, flachen Links und bei Portfolios. Bei einer reinen Touch-Zielgruppe ohne Desktop-Anteil.",
   "varianten": [
    "Stripe-Stil: Die Box folgt dem Trigger und morpht, die Inhalte gleiten richtungsabhängig",
    "Radix- bzw. Vercel-Stil: Der Viewport bleibt stehen, die Größe kommt über CSS-Variablen, die Richtung über data-motion (from-start, from-end, to-start, to-end), ein Pfeil wandert",
    "Vollbreites Mega-Menü mit Kategorienspalte links, die den Inhaltsbereich steuert (Meter)",
    "Produktkarten mit Mini-UI-Vorschau (SurferSEO)",
    "Directional Hover (Osmo Mega Navigation)",
    "Mobil: Drill-down-Panels statt Viewport"
   ],
   "umsetzung": "Alle Inhalte vorrendern und absolut im Viewport stapeln (width: max-content). Den aktiven Inhalt messen (offsetWidth, offsetHeight) und als CSS-Variablen --w, --h und --x auf den Viewport schreiben. width, height und translate transitionieren, overflow: hidden schneidet den Inhalt während des Morphens zu. Beim ersten Öffnen die Transition kurz abschalten, damit die Box nicht aus der alten Größe wächst.\n\nRichtung aus dem Index-Vergleich von alt und neu bestimmen und als data-motion setzen. Keyframes von-start, von-ende, zu-start und zu-ende mit translateX und opacity. Vor dem Setzen das Attribut entfernen und einmal Layout lesen, sonst startet die Animation bei schnellem Hin und Her nicht neu.\n\nHover-Intent: Öffnen nach 200 ms. Solange die Box offen ist oder bis 300 ms nach dem Schließen wechseln die Trigger ohne Verzögerung (Radix skipDelayDuration). Beim Verlassen eine kurze Gnadenfrist lassen, damit der Weg vom Trigger in die Box und diagonales Ziehen nicht schließen.\n\nInaktive Panels mit inert versehen. Pfeiltasten in onKeyDown behandeln, onKeyPress feuert dafür nicht. backdrop-filter auf der Box wirkt nicht, wenn ein Elternelement für das Öffnen opacity oder transform animiert; dann den Hintergrund fast deckend wählen oder den Blur auf ein Geschwisterelement legen.",
   "mobil": "Der Viewport entfällt. Ein Menü-Knopf öffnet ein Vollbild-Blatt mit Drill-down-Panels oder einem Akkordeon. Die Trigger sind Buttons, Antippen öffnet die Unterebene.",
   "reduzierte_bewegung": "Kein Gleiten, nur Überblenden in 100 bis 150 ms. Größe und Lage wechseln sofort.",
   "barrierefreiheit": "Trigger als <button aria-expanded> mit aria-controls, Links als echte <a>. Pfeiltasten wechseln zwischen den Triggern, Home und End springen an die Enden, ArrowDown führt in den Inhalt, Escape schließt und setzt den Fokus zurück auf den Trigger. Öffnen auch per Enter und Klick, nicht nur per Hover."
  },
  "geprueft": "01.11.2026",
  "notiz": "Welt: Kopf der erfundenen Wirtschaftskanzlei „Brandt Okafor Rechtsanwälte, Frankfurt“, gestaltet nach dem Rezept kanzlei-beratung-souveraen (Newsreader + Schibsted Grotesk, Nachtblau auf warmen Grautönen, Cyan nur als Aktiv-Akzent, keine Fotos). Vier Mega-Menüs sehr unterschiedlicher Größe: Rechtsgebiete (zwei Gruppen mit Linien-Icons und Studien-Teaser als SVG-Tafel), Köpfe (Monogramm-Tafeln mit Nadelstreifen, Funktion, Fachgebiet, Sprachen), Kanzlei (schmale Liste), Insights (Rubrik und Datum in Tabellenziffern). Darunter Hero mit Serif-Positionierung und drei Meldungen (Mandat, Insight, Veranstaltung). Umschalter Stripe, Radix und Ohne Morph; die Werte-Leiste zeigt die aktiven Werte und die gemessene Boxgröße. Hover-Intent wie Radix, volle Tastatursteuerung. Unter 860 px Drill-down im Vollbild-Blatt aus denselben Inhalten. Vorführung: Zeiger fährt die Trigger hin und zurück ab und taucht einmal in die Box ein; am Telefon tippt er sich durch den Drill-down. Bewegungswerte unverändert gegenüber der Fassung vom 31.10.2026. Zugang 02.11.2026: --meta #8e7c6d → #73645a (≥ 4,8:1 auch auf #efebeb); Mandantenportal erst ab 1320 px (lief 1240–1300 px 15 px in den Rand); Kopf-CTA und Wortmarke dürfen bei Platzmangel zweizeilig werden (Textabstände 1.4.12 ohne Querscrollen, beseitigt auch das Querscrollen knapp über 860 px); Kontrastmodus-Rahmen für Knöpfe."
 }
}
