{
 "$schema": "../../schema.json",
 "schema": "fundus/1",
 "id": "firmendaten-strukturiert",
 "name": "Firmendaten aus einer Quelle",
 "name_en": "Single-source business data with LocalBusiness JSON-LD",
 "kurz": "Ein Datenblock firma.json erzeugt Kontaktblock und LocalBusiness-JSON-LD; ein Abgleich vergleicht sichtbaren Text und Markup und markiert jede Abweichung in allen drei Spalten.",
 "kategorie": "Zugang & Robustheit",
 "kategorie_slug": "zugang",
 "kategorie_nr": 17,
 "bau_chat": "E",
 "prioritaet": "E",
 "trendstatus": "aufsteigend",
 "belegstatus": "quellenbelegt",
 "website_belege": 0,
 "stimmung": [
  "ruhig",
  "präzise"
 ],
 "stimmung_roh": [
  "robust",
  "sachlich",
  "ruhig"
 ],
 "technik": [
  "json-ld",
  "schema-org",
  "vanilla-js",
  "css"
 ],
 "technik_gruppen": [
  "css",
  "js"
 ],
 "leistungskosten": "niedrig",
 "steckbrief": {
  "beschreibung": "Ein Datenblock im Projekt (zum Beispiel firma.json) ist die einzige Quelle für Name, Adresse, Telefon, Öffnungs- und Sonderzeiten, Leistungen mit ab-Preisen, Einzugsgebiet und Profil-Links. Daraus entstehen drei Ausgaben: der sichtbare Kontaktblock, die Sprechzeiten und das JSON-LD im Kopf der Seite (LocalBusiness-Untertyp wie Dentist, HairSalon oder AutoRepair, OpeningHoursSpecification samt Sonderzeiten, sameAs). Weil alle drei aus denselben Daten entstehen, laufen sie nicht auseinander. Ein Abgleich vergleicht sichtbaren Text und Markup und meldet Abweichungen.",
  "warum_es_wirkt": "Bei kleinen Firmen stehen Telefon und Zeiten oft an vier Stellen: Kopf, Fußzeile, Kontaktseite und ein SEO-Plugin. Nach der ersten Änderung stimmt eine davon nicht mehr. Google nennt für AI Overviews und AI Mode keine Zusatzanforderungen, empfiehlt aber strukturierte Daten, die zum sichtbaren Text passen, und ein aktuelles Unternehmensprofil. Genau das sichert eine einzige Quelle. Nebenbei sehen Menschen dieselben Zeiten wie Maschinen, auch an Feiertagen.",
  "wann_einsetzen": "Bei jeder Seite mit Ort und Kontakt: Praxis, Handwerk, Gastronomie, Hotel, Kanzlei, Fahrschule, Immobilien, Friseur, Fitness, Werkstatt, Verein, Kultur. Besonders wenn Sonderzeiten (Urlaub, Feiertage, Fortbildung) mehrmals im Jahr gepflegt werden oder mehrere Standorte dieselbe Vorlage nutzen.",
  "wann_nicht": "Nicht als Versprechen für Rankings oder KI-Antworten: Markup ist eine Empfehlung von Google, keine Garantie. Kein FAQPage-Markup mehr für Rich Results, Google zeigt sie seit 07.05.2026 nicht mehr. Keine Bewertungssterne über das eigene Unternehmen im Markup. Kein Markup für Inhalte, die auf der Seite nicht sichtbar sind. Eine llms.txt ersetzt den Datenblock nicht; sie ist optional und hat bei Google keine belegte Wirkung.",
  "varianten": [
   "Praxis: Dentist (oder ein anderer MedicalBusiness-Untertyp) mit Sprechzeiten, Urlaub und Notdienst-Hinweis",
   "Salon: HairSalon mit Leistungen und ab-Preisen",
   "Werkstatt: AutoRepair mit Einzugsgebiet und Hol- und Bringdienst",
   "Mehrere Standorte: ein Datensatz je Standort, je Standortseite ein LocalBusiness",
   "Kultur: Event-Markup für einzelne Termine zusätzlich zum Ort"
  ],
  "umsetzung": "Eine Datei firma.json im Projekt ist die einzige Quelle. Ein Build-Schritt oder Server-Include (Eleventy, Astro, PHP) rendert daraus den Kontaktblock (address, tel:-Link mit +49, mailto), die Zeiten als Tabelle, die Sonderzeiten als Hinweis und ein <script type=\"application/ld+json\"> im Kopf. Gleiche Zeiträume werden im Markup über eine dayOfWeek-Liste zusammengefasst. Sonderzeiten stehen als OpeningHoursSpecification mit validFrom und validThrough, ganztägig geschlossen mit opens und closes \"00:00\" (so beschreibt es Google). Vergangene Sonderzeiten fallen in Seite und Markup gleichzeitig heraus. Leistungen als hasOfferCatalog mit Offer, Service und PriceSpecification minPrice. Profile als sameAs. Ein Test im Build liest das JSON-LD und den sichtbaren Text (innerText) und bricht bei Abweichungen ab; die Demo zeigt diesen Abgleich live. Prüfen mit dem Rich-Results-Test und dem Schema Markup Validator. Die Demo rendert im Browser, damit sich Branche, Sonderzeit und Fehler umschalten lassen; im Kopf steht das erzeugte JSON-LD trotzdem schon fertig im HTML.",
  "mobil": "Kontaktblock zuerst, Anruf als großer tel:-Knopf, Zeiten als Tabelle in voller Breite. Das JSON-LD ist für Telefon und Desktop gleich.",
  "reduzierte_bewegung": "Kaum Bewegung: nur das kurze Aufleuchten geänderter Werte im Abgleich, das bei reduzierter Bewegung entfällt.",
  "barrierefreiheit": "1.3.1 Info und Beziehungen (A): Sprechzeiten als table mit th für Tage, Adresse in address, Telefon als echter tel:-Link. 3.2.4 Konsistente Identifikation (AA) und 3.2.6 Konsistente Hilfe (A): Kontaktwege stehen auf allen Seiten gleich, weil sie aus derselben Quelle kommen. 1.4.3 Kontrast (AA): Sonderzeiten-Hinweis nicht nur über Farbe, sondern mit Text und Datum. 2.4.6 Überschriften (AA): eigener Abschnitt „Sprechzeiten“ und „Sonderzeiten“. Zeiten in Textform („8 bis 12 Uhr“) oder mit time-Element, damit Screenreader sie verständlich vorlesen. Telefonnummer in Gruppen, damit sie einzeln vorgelesen wird."
 },
 "messwerte": {
  "easing": "cubic-bezier(0.2, 0, 0.38, 0.9)",
  "dauer_ms": "200",
  "stagger_ms": "",
  "distanz": "",
  "sonstiges": "Kurve und Dauer aus dem Rezept praxis-gesundheit-ruhig (token-tech-praezise); Markup-Regeln aus Google Search Central (local-business, Stand 08.09.2026)",
  "herkunft": "eigene Festlegung",
  "quelle": "Rezept praxis-gesundheit-ruhig (bewegung)"
 },
 "kurve": {
  "bezier": [
   0.2,
   0.0,
   0.38,
   0.9
  ],
  "css": "cubic-bezier(0.2, 0, 0.38, 0.9)",
  "name": "eigene Kurve",
  "dauer_ms": 200
 },
 "gesehen_bei": [
  {
   "seite": "Google Search Central: AI features and your website",
   "url": "https://developers.google.com/search/docs/appearance/ai-features",
   "auszeichnung": "",
   "beobachtung": "Am 02.11.2026 geprüft (Stand der Seite 10.12.2025): keine zusätzlichen Anforderungen für AI Overviews und AI Mode, kein besonderes schema.org-Markup, keine neuen maschinenlesbaren Dateien oder KI-Textdateien nötig. Als gute Praxis genannt: strukturierte Daten, die zum sichtbaren Text passen, und aktuelle Business-Profile-Daten.",
   "art": "artikel"
  },
  {
   "seite": "Google Search Central: Local business structured data",
   "url": "https://developers.google.com/search/docs/appearance/structured-data/local-business",
   "auszeichnung": "",
   "beobachtung": "Am 02.11.2026 geprüft (Stand 08.09.2026): Pflicht sind name und address; empfohlen u. a. geo, openingHoursSpecification, telephone, url, priceRange. Möglichst genauer Untertyp. Saisonale Schließung über validFrom und validThrough, ganztägig geschlossen mit opens und closes 00:00.",
   "art": "artikel"
  },
  {
   "seite": "Google Search Central: Latest documentation updates",
   "url": "https://developers.google.com/search/updates",
   "auszeichnung": "",
   "beobachtung": "Eintrag vom 08.05.2026: FAQ-Rich-Result wird ab 07.05.2026 nicht mehr angezeigt; Eintrag vom 15.06.2026: Dokumentation entfernt.",
   "art": "artikel"
  },
  {
   "seite": "schema.org: Dentist",
   "url": "https://schema.org/Dentist",
   "auszeichnung": "",
   "beobachtung": "Dentist erbt von LocalBusiness, MedicalBusiness und MedicalOrganization: openingHoursSpecification und specialOpeningHoursSpecification (Place), areaServed, hasOfferCatalog, knowsLanguage (Organization), isAcceptingNewPatients, medicalSpecialty (MedicalOrganization), sameAs (Thing).",
   "art": "artikel"
  }
 ],
 "tutorials": [
  {
   "titel": "Google Search Central: Local business structured data",
   "url": "https://developers.google.com/search/docs/appearance/structured-data/local-business"
  },
  {
   "titel": "Google Search Central: AI features and your website",
   "url": "https://developers.google.com/search/docs/appearance/ai-features"
  },
  {
   "titel": "schema.org: Dentist",
   "url": "https://schema.org/Dentist"
  }
 ],
 "kombinierbar_mit": [
  "oeffnungszeiten-status",
  "studio-visitenkarte-footer",
  "karte-zwei-klick",
  "standortfinder-liste",
  "leistungsseite-antwort-zuerst",
  "termin-buchung-zwei-klick",
  "mobile-bottom-navigation"
 ],
 "urls": {
  "detail": "https://cecodesign.de/lab/fundus/zugang/firmendaten-strukturiert/",
  "meta": "https://cecodesign.de/lab/fundus/zugang/firmendaten-strukturiert/meta.json",
  "demo": "https://cecodesign.de/lab/fundus/zugang/firmendaten-strukturiert/demo"
 },
 "herkunft": {
  "quelldateien": [
   "Lücken-Recherche 02.11.2026 (N3, K6)"
  ],
  "pruefnotizen": [
   "Google-Seiten am 02.11.2026 per WebFetch geprüft: ai-features (Stand 10.12.2025), local-business (Stand 08.09.2026), Dokumentations-Updates (FAQ-Rich-Result ab 07.05.2026 nicht mehr angezeigt).",
   "Google beschreibt Sonderzeiten über openingHoursSpecification mit validFrom/validThrough; schema.org kennt zusätzlich specialOpeningHoursSpecification. Die Demo folgt Google.",
   "llms.txt: Google nennt sie nicht beim Namen, sagt aber, dass keine neuen KI-Textdateien nötig sind. Deshalb nur „optional, ohne belegte Wirkung bei Google“.",
   "Ab-Preise für Leistungen (z. B. Zahnreinigung) und Pflichtangaben vom Kunden prüfen lassen; keine Rechtsberatung.",
   "Kein Produktionsbeleg einer Award-Seite; Belege sind Google-Dokumentation und schema.org."
  ]
 },
 "bau": {
  "status": "fertig",
  "kurz": "Ein Datenblock firma.json erzeugt Kontaktblock und LocalBusiness-JSON-LD; ein Abgleich vergleicht sichtbaren Text und Markup und markiert jede Abweichung in allen drei Spalten.",
  "demo": true,
  "abhaengigkeiten": [],
  "werte": {
   "easing": "cubic-bezier(0.2, 0, 0.38, 0.9) (token-tech-praezise, Rezept praxis-gesundheit-ruhig)",
   "dauer_ms": 200,
   "aufleuchten_ms": 1400,
   "datenblock": "typ, name, zusatz, url, telefon (+49 …), email, adresse {strasse, plz, ort, land}, geo [lat, lng] mit 5 Nachkommastellen, zeiten {Mo…So: [[von, bis], …]}, sonderzeiten [{von, bis, zeiten, anlass}], leistungen [{name, ab, hinweis}], gebiet [], sprachen [ISO-Codes], profile [{name, url}], hinweis; Zahnarzt zusätzlich neuePatienten",
   "jsonld": "@context https://schema.org, @type = typ (Dentist | HairSalon | AutoRepair), @id url#firma, name, url, telephone, email, address PostalAddress, geo GeoCoordinates, openingHoursSpecification (gleiche Zeiträume über dayOfWeek-Liste zusammengefasst), areaServed City[], knowsLanguage, hasOfferCatalog OfferCatalog → Offer → itemOffered Service + priceSpecification PriceSpecification {minPrice, priceCurrency EUR}, sameAs; isAcceptingNewPatients nur bei Dentist",
   "sonderzeiten": "OpeningHoursSpecification ohne dayOfWeek mit validFrom/validThrough (YYYY-MM-DD); geschlossen = opens und closes \"00:00\"; vergangene Sonderzeiten (bis < heute, Europe/Berlin) fallen in Seite und Markup gleichermaßen heraus",
   "abgleich": "liest das JSON-LD aus <script type=\"application/ld+json\" id=\"ld\"> und vergleicht mit innerText der Seite: Name, Telefon (nur Ziffern, 0 bzw. 49 vorn entfernt), E-Mail, Adresse, 7 Wochentage (Zeiträume per Regex), jede Sonderzeit nach Datum, Leistungen mit ab-Preis, Einzugsgebiet, Sprachen, Profil-Links gegen sameAs",
   "schliesstag_demo": "nächster passender Wochentag frühestens 10 Tage nach heute (Zahnarzt Fr, Friseur Di, Werkstatt Fr)",
   "fehler_simulation": "Telefon von Hand: letzte zwei Ziffern im HTML geändert; Markup veraltet: JSON-LD aus altem Stand ohne Sonderzeiten, an einem Tag schließt der letzte Zeitraum eine Stunde früher",
   "farben": "Grund #f5f7f7, Text #363b3b, leise #596666, Marke #005450, Akzent #ffc776 (Hervorhebung, Sonderzeiten-Kasten #fff6e4), Fehler #a3261c auf #fbe8e5, Code-Spalte #0f2826",
   "schriften": "Hedvig Letters Serif opsz 24 (Überschriften), Google Sans Flex (Text), Geist Mono 12 px / 1.62 (Code, Labels versal +0.14em)",
   "layout": "ab 900 px drei Spalten .92fr / 1.2fr / 1fr, Höhe max(500px, 100svh − 200px), jede Spalte scrollt; 680 bis 899 px Seite oben, Daten und Markup nebeneinander; darunter gestapelt, Code max-height 62svh"
  },
  "ausloeser": "klick",
  "touch": "Hover-Verknüpfung entfällt; Antippen einer Code-Zeile hebt das Feld in allen drei Spalten hervor und rollt dorthin. Abweichungen sind Knöpfe, die dasselbe tun.",
  "reduziert": "Kein Aufleuchten geänderter Werte, Spalten springen ohne weiches Rollen; Markierungen bleiben statisch.",
  "korrekturen": {
   "umsetzung": "Eine Datei firma.json im Projekt ist die einzige Quelle. Ein Build-Schritt oder Server-Include (Eleventy, Astro, PHP) rendert daraus den Kontaktblock (address, tel:-Link mit +49, mailto), die Zeiten als Tabelle, die Sonderzeiten als Hinweis und ein <script type=\"application/ld+json\"> im Kopf. Gleiche Zeiträume werden im Markup über eine dayOfWeek-Liste zusammengefasst. Sonderzeiten stehen als OpeningHoursSpecification mit validFrom und validThrough, ganztägig geschlossen mit opens und closes \"00:00\" (so beschreibt es Google). Vergangene Sonderzeiten fallen in Seite und Markup gleichzeitig heraus. Leistungen als hasOfferCatalog mit Offer, Service und PriceSpecification minPrice. Profile als sameAs. Ein Test im Build liest das JSON-LD und den sichtbaren Text (innerText) und bricht bei Abweichungen ab; die Demo zeigt diesen Abgleich live. Prüfen mit dem Rich-Results-Test und dem Schema Markup Validator. Die Demo rendert im Browser, damit sich Branche, Sonderzeit und Fehler umschalten lassen; im Kopf steht das erzeugte JSON-LD trotzdem schon fertig im HTML."
  },
  "geprueft": "02.11.2026",
  "notiz": "Welt: Rezept praxis-gesundheit-ruhig, erfundene Zahnpraxis Neckarbogen in Esslingen (dazu Salon Webergasse und Autowerkstatt Ferrante als Branchen-Varianten). Drei Spalten: firma.json, sichtbarer Kontaktblock im Browser-Rahmen, JSON-LD. Fahren über eine Zeile hebt das Feld überall hervor. Pult: Branche (?v=), Schließtag eintragen, Fehler einbauen; der Abgleich liest das echte JSON-LD aus dem Kopf und vergleicht es mit dem sichtbaren Text. Das JSON-LD aller sechs Zustände wurde mit Python json geparst und gegen eine Tabelle der schema.org-Typen und -Properties geprüft. Google-Aussagen am 02.11.2026 per WebFetch geprüft: developers.google.com (ai-features, local-business, search/updates); schema.org/Dentist. Profil-Links und Domains sind .example-Adressen und werden in der Demo abgefangen. AD-Review 02.11.2026: Note 4 → 4. Nachgebessert: Domains, E-Mails und Profil-Links auf .example umgestellt (keine echten Adressen oder Google-cid), Hinweis „Tippen Sie auf eine Zeile“ auf Touch, Schalter „keiner“ neutral statt rot. FAQ-Rich-Result-Aus (07.05.2026) bei developers.google.com/search/updates nachgelesen.",
  "varianten": [
   {
    "id": "zahnarzt",
    "name": "Zahnarztpraxis (Dentist)",
    "wann": "Praxis und Therapie: Sprechzeiten mit Mittagspause, Urlaub, Notdienst-Hinweis, neue Patienten.",
    "werte": {
     "typ": "Dentist",
     "zeiten": "Mo 8–12 und 14–18, Di/Do 8–12 und 14–19, Mi/Fr 8–13",
     "extra": "isAcceptingNewPatients true, knowsLanguage de/en/tr"
    }
   },
   {
    "id": "friseur",
    "name": "Friseursalon (HairSalon)",
    "wann": "Salon, Kosmetik, Nagelstudio: Leistungen mit ab-Preisen, Samstag geöffnet, Montag zu.",
    "werte": {
     "typ": "HairSalon",
     "zeiten": "Di/Mi/Fr 9–18:30, Do 9–20, Sa 8:30–14",
     "extra": "vier Leistungen mit minPrice 18 bis 68 EUR"
    }
   },
   {
    "id": "werkstatt",
    "name": "Kfz-Werkstatt (AutoRepair)",
    "wann": "Werkstatt, Handwerk mit Einzugsgebiet und Hol- und Bringdienst.",
    "werte": {
     "typ": "AutoRepair",
     "zeiten": "Mo–Do 7:30–17:30, Fr 7:30–15",
     "extra": "areaServed fünf Orte, Betriebsferien 24.12. bis 01.01."
    }
   }
  ]
 }
}
