{
 "$schema": "../../schema.json",
 "schema": "fundus/1",
 "id": "stellenseite-mit-jobposting",
 "name": "Stellenseite mit Gehalt, Ablauf und JobPosting-Daten",
 "name_en": "Single job page with salary, hiring steps, short application and JobPosting structured data",
 "kurz": "Eine Stelle als eigene Seite: Gehaltsspanne auf dem Zettel, drei Blöcke mit Zahlen, Ablauf mit Fristen, Ansprechperson und daneben die Kurzbewerbung; JobPosting-Daten aus demselben Datensatz, beim Vergeben entfernt.",
 "kategorie": "Sektionen & Funktionen",
 "kategorie_slug": "sektionen",
 "kategorie_nr": 16,
 "bau_chat": "D",
 "prioritaet": "D",
 "trendstatus": "aufsteigend",
 "belegstatus": "belegt",
 "website_belege": 2,
 "stimmung": [
  "präzise",
  "warm"
 ],
 "stimmung_roh": [
  "ehrlich",
  "persönlich",
  "klar"
 ],
 "technik": [
  "css",
  "vanilla-js",
  "json-ld",
  "schema-org",
  "position-sticky",
  "clipboard-api",
  "intl"
 ],
 "technik_gruppen": [
  "css",
  "js"
 ],
 "leistungskosten": "niedrig",
 "steckbrief": {
  "beschreibung": "Eine einzelne Stelle als eigene Seite. Oben stehen Titel, Ort, Stunden, Gehaltsspanne und Start, darunter drei Blöcke mit konkreten Zahlen: Das machst du, das bringst du mit, das bekommst du. Es folgt der Ablauf der Bewerbung mit Fristen und die Ansprechperson mit Telefon und WhatsApp. Daneben steht die Kurzbewerbung für genau diese Stelle, auf dem Desktop mitlaufend. Die JobPosting-Daten für Google werden aus demselben Datensatz erzeugt wie der sichtbare Text. Ist die Stelle vergeben, verschwinden Formular und Daten, und es erscheinen ähnliche Stellen und ein Job-Alert.",
  "warum_es_wirkt": "Wer einen Job sucht, will in einer Minute wissen: Was tue ich, was verdiene ich, wann, wo und wer meldet sich. Eine Gehaltsspanne in Tabellenziffern und ein Ablauf mit echten Fristen beantworten das und wirken ehrlich. Die Kurzbewerbung daneben senkt die Hürde, weil niemand erst ein Anschreiben braucht. Saubere JobPosting-Daten bringen die Stelle in Google for Jobs, und weil sie zum sichtbaren Text passen, gibt es keine abgelaufenen oder falschen Einträge.",
  "wann_einsetzen": "Jede offene Stelle eines kleinen oder mittleren Betriebs: Handwerk mit Stundenlohn und Probetag, Pflege mit Tarif, Schichten und Touren, Ausbildung mit Vergütung je Ausbildungsjahr. Als Ziel jeder Zeile in der Stellenübersicht (stellen-karriere).",
  "wann_nicht": "Für die Übersicht mehrerer Stellen: JobPosting gehört laut Google nur auf die Seite einer einzelnen Stelle, die Übersicht ist stellen-karriere. Wenn es keine echte Stelle gibt (Initiativbewerbung, Talentpool): dann ohne JobPosting-Daten. Wenn Gehalt oder Ablauf nicht genannt werden dürfen oder nicht feststehen: erst klären, sonst verliert die Seite ihren Kern.",
  "varianten": [
   "Handwerk: Stundenlohn als Spanne, Einsatzorte und Baustellen, Führerschein, bezahlter Probetag",
   "Pflege: Tarif mit Entgeltgruppe statt freier Spanne, Vollzeit und Teilzeit mit zwei Gehaltsangaben, Schichten, Touren und Dienstwagen",
   "Ausbildung: Vergütung je Ausbildungsjahr, Ausbildungsstart, Berufsschule, Praktikum zum Reinschnuppern, Info für Eltern"
  ],
  "umsetzung": "Ein Datensatz je Stelle (Titel, Ort, Stunden, Gehalt mit Bezug, Start, Aufgaben, Anforderungen, Leistungen, Ablauf mit Fristen, Ansprechperson, datePosted, validThrough, Status). Daraus entstehen die sichtbare Seite und das JSON-LD JobPosting im <head>: description ist das HTML derselben Blöcke, baseSalary ein MonetaryAmount mit minValue, maxValue und unitText (HOUR oder MONTH), jobLocation ein Place mit PostalAddress und addressCountry DE, identifier die Stellennummer, directApply true, weil die Kurzbewerbung auf der Seite steht. Gehalt in Tabellenziffern mit Bezug und „brutto“; bei Tarif die Entgeltgruppe, bei Teilzeit eine zweite Zeile, bei Ausbildung je Jahr. Kurzbewerbung mit höchstens fünf Pflichtangaben, Lebenslauf freiwillig, keine Frage nach dem bisherigen Gehalt; Fehler erst nach der Interaktion, beim Absenden eine Fehlerliste mit Sprunglinks. Die Bestätigung nennt Name der Ansprechperson und das Datum, bis wann sie sich meldet. Auf dem Desktop läuft die Bewerbung mit position: sticky mit (höchstens so hoch wie der Bildschirm), auf dem Telefon steht sie unten und eine feste Leiste führt hin. Vergeben oder abgelaufen: JSON-LD entfernen (oder validThrough in der Vergangenheit, oder 404/410), Hinweis oben, ähnliche Stellen und Job-Alert mit Double-Opt-in statt Formular. „Stelle teilen“ kopiert den Link mit sichtbarer Rückmeldung. In der Demo sind Übersicht, ähnliche Stellen und WhatsApp simuliert. Texte AGG-neutral; Datenschutz nach Art. 13 DSGVO, Speicherdauer und die deutsche Umsetzung der Entgelttransparenzrichtlinie vom Kunden prüfen lassen.",
  "mobil": "Einspaltig: Kopf mit Gehalt, dann die drei Blöcke, Ablauf und Ansprechperson, die Kurzbewerbung am Ende. Eine feste Leiste unten führt mit „In 2 Minuten bewerben“ zum Formular und hat einen Anruf-Knopf. Alle Felder und Knöpfe mindestens 44 px hoch, Eingaben mit passenden autocomplete- und inputmode-Werten.",
  "reduzierte_bewegung": "Zettel und Haken stehen sofort, Füllung des Knopfs als kurzes Überblenden, Zustandswechsel ohne Übergang.",
  "barrierefreiheit": "Eckdaten als <dl>, Ablauf als <ol>. Formular mit sichtbaren Labels, Pflichtfelder als „Pflicht“ im Label und mit required, Fehlermeldungen per aria-describedby und aria-invalid, Fehlerliste beim Absenden mit Fokus und Links zu den Feldern (WCAG 3.3.1, 3.3.3). Erfahrungsauswahl als echte Radio-Gruppe in einem fieldset. Bestätigung und Kopier-Rückmeldung in einer Live-Region. Gehalt nicht nur als Zahl, sondern mit Bezug und „brutto“ ausgeschrieben. Kontrast mindestens 4,5:1; Klatschmohn als Fläche mit weißer Schrift."
 },
 "messwerte": {
  "easing": "cubic-bezier(0.16, 1, 0.3, 1) öffnen, cubic-bezier(0.7, 0, 0.84, 0) schließen; cubic-bezier(0.34, 1.56, 0.64, 1) nur für kleine ankommende Teile",
  "dauer_ms": "150 Druck, 280 öffnen (Fehlerliste, Bestätigung, Zustandswechsel), 190 schließen, 400 Haken nach dem Absenden, 500 Ankunft des Fakten-Zettels, 600 Füllung des Bewerben-Knopfs",
  "stagger_ms": "",
  "distanz": "Zettel kommt einmal 24 px von unten und dreht auf −0,6°; Haken scale 0.6 → 1; sonst kein Weg",
  "sonstiges": "Kurven und Dauern aus dem Rezept arbeitgeber-karriere (token-federnd-verspielt mit UI-Stil token-toggle-asymmetrisch). Füllung aus fuellung-vom-eintrittspunkt (basis).",
  "herkunft": "eigene Festlegung",
  "quelle": "Rezept arbeitgeber-karriere; https://developers.google.com/search/docs/data-types/job-posting"
 },
 "kurve": {
  "bezier": [
   0.16,
   1.0,
   0.3,
   1.0
  ],
  "css": "cubic-bezier(0.16, 1, 0.3, 1)",
  "name": "expo.out",
  "dauer_ms": 150
 },
 "gesehen_bei": [
  {
   "seite": "Google Search Central: Strukturierte Daten für Stellenangebote (JobPosting)",
   "url": "https://developers.google.com/search/docs/data-types/job-posting",
   "auszeichnung": "",
   "beobachtung": "Am 02.11.2026 gelesen: Pflichtfelder datePosted, description, hiringOrganization, jobLocation (mit addressCountry) und title; empfohlen baseSalary (MonetaryAmount, unitText HOUR, DAY, WEEK, MONTH oder YEAR), employmentType, validThrough, directApply und identifier. Markup nur auf der Seite einer einzelnen Stelle, alles im Markup muss auf der Seite sichtbar sein. Abgelaufene Stellen sind nicht erlaubt: validThrough in die Vergangenheit setzen, Seite mit 404 oder 410 beenden oder das Markup entfernen.",
   "art": "artikel"
  },
  {
   "seite": "MFM (Elektro-Handwerk, Bad Nenndorf): Stelle Elektroniker Energie- und Gebäudetechnik",
   "url": "https://karriere.mfm.energy/stelle/elektroniker-energie-gebaeudetechnik-bad-nenndorf/",
   "auszeichnung": "",
   "beobachtung": "Am 02.11.2026 gelesen: Einzelseite je Stelle mit Gehaltsspanne „19,50 bis 25,00 € pro Stunde brutto“, Probetag und Ansprechperson. Gegenbeispiel: Gehaltsvorstellung als Feld im Formular.",
   "art": "website"
  },
  {
   "seite": "Achberg (Ausbildung Mechatroniker)",
   "url": "https://www.achberg.com/karriere/ausbildung/ausbildung-zum-mechatroniker-m-w-d/",
   "auszeichnung": "",
   "beobachtung": "Am 02.11.2026 gelesen: Vergütung je Ausbildungsjahr, Benefits als Klartext, Rückruf-Formular und eine Azubi-Stimme. Gegenbeispiel laut Rezept: vier Vergütungsjahre bei dreieinhalb Jahren Dauer.",
   "art": "website"
  },
  {
   "seite": "Deutscher Bundestag, hib 587/2026: Umsetzung der Entgelttransparenzrichtlinie",
   "url": "https://www.bundestag.de/presse/hib/kurzmeldungen-1195086",
   "auszeichnung": "",
   "beobachtung": "Am 02.11.2026 gelesen: Antwort der Bundesregierung vom 16.07.2026 (Drucksache 21/7026). Ein Entwurf für eine „bürokratiearme Umsetzung“ wird vorbereitet, einzelne Fragen sind noch offen, ein Termin für das Gesetzgebungsverfahren fehlt.",
   "art": "artikel"
  }
 ],
 "tutorials": [
  {
   "titel": "Google: Strukturierte Daten für Stellenangebote",
   "url": "https://developers.google.com/search/docs/data-types/job-posting"
  }
 ],
 "kombinierbar_mit": [
  "stellen-karriere",
  "mehrschritt-anfrage",
  "formular-fehlerzusammenfassung",
  "validierung-nach-interaktion",
  "kopieren-feedback",
  "fuellung-vom-eintrittspunkt",
  "pfeil-icon-button",
  "prozess-timeline-wachsende-linie",
  "team-ueber-mich-layout",
  "footer-newsletter-mit-persoenlichkeit",
  "token-federnd-verspielt",
  "token-toggle-asymmetrisch"
 ],
 "urls": {
  "detail": "https://cecodesign.de/lab/fundus/sektionen/stellenseite-mit-jobposting/",
  "meta": "https://cecodesign.de/lab/fundus/sektionen/stellenseite-mit-jobposting/meta.json",
  "demo": "https://cecodesign.de/lab/fundus/sektionen/stellenseite-mit-jobposting/demo"
 },
 "herkunft": {
  "quelldateien": [
   "Rezept-Runde 02.11.2026"
  ],
  "pruefnotizen": [
   "Google-Regeln am 02.11.2026 an der Dokumentation geprüft: Pflichtfelder, baseSalary-Format, nur Einzelseiten, sichtbar und deckungsgleich, keine abgelaufenen Stellen.",
   "Entgelttransparenz: Art. 5 der Richtlinie (EU) 2023/970 verlangt Information über Einstiegsentgelt oder Spanne vor dem Vorstellungsgespräch und verbietet die Frage nach dem bisherigen Gehalt. Die Frist lief am 07.06.2026 ab; ein deutsches Gesetz ist am 02.11.2026 nicht in Kraft (hib 587/2026, Drucksache 21/7026). Die Seite nennt die Spanne trotzdem; vom Kunden prüfen lassen.",
   "AGG: Titel mit (m/w/d), keine Merkmale nach § 1 AGG in den Texten, Deutschkenntnisse nur so weit, wie die Aufgabe sie braucht. Datenschutzhinweis und Speicherdauer sind Platzhalter; Claude schreibt keine Rechtstexte.",
   "Werte, Haustarif, Personen und Betrieb der Demo sind erfunden. Fotos von Ansprechpersonen nur echt und mit Einwilligung; die Demo zeigt einen markierten Platzhalter."
  ]
 },
 "bau": {
  "status": "fertig",
  "kurz": "Eine Stelle als eigene Seite: Gehaltsspanne auf dem Zettel, drei Blöcke mit Zahlen, Ablauf mit Fristen, Ansprechperson und daneben die Kurzbewerbung; JobPosting-Daten aus demselben Datensatz, beim Vergeben entfernt.",
  "demo": true,
  "abhaengigkeiten": [],
  "werte": {
   "easing": "cubic-bezier(0.16, 1, 0.3, 1) öffnen, cubic-bezier(0.7, 0, 0.84, 0) schließen; cubic-bezier(0.34, 1.56, 0.64, 1) nur für Zettel, Haken und Druck",
   "dauer_ms": "150 Druck (scale 0.95) und Farbe, 280 Fehlerliste und Bestätigung öffnen, 190 schließen, 400 Haken (scale 0.6 → 1, Strich 400 ms ab 120 ms), 500 Zettel landet, 200 Deckkraft linear, 600 Füllung des Bewerben-Knopfs",
   "distanz": "Zettel translateY 24 px und rotate −3° → −0,6°, einmal beim Laden; Fehlerliste und Bestätigung 4 px; sonst kein Weg",
   "fuellung": "fuellung-vom-eintrittspunkt basis: Kopie des Labels auf Tinte #161616, clip-path circle(0 → fernste Ecke + 2 px at Eintrittspunkt), Rückzug zum Austrittspunkt, nur pointerType mouse; Fokus füllt von der Mitte; Touch nur Druck und Farbe #a92e22",
   "pfeil_link": "pfeil-icon-button linie: Unterstreichung 1 px, Abstand .35ex; Schaft opacity 0 → 1, Spitze translateX 3 px; ein 250 ms cubic-bezier(0.25, 1, 0.5, 1), aus 175 ms cubic-bezier(0.5, 0, 0.75, 0)",
   "typo": "h1 Funnel Display 700 clamp(2.25rem, 1.35rem + 2.7vw, 3.875rem)/.98, −0.03em; h2 Funnel Display 600 clamp(1.75rem, 1.3rem + 1.6vw, 2.5rem); Gehalt Funnel Display 650 clamp(1.875rem, 1.3rem + 1.8vw, 2.75rem) tabular-nums; Text Funnel Sans 1.125rem/1.6",
   "farben": "Kreide #f6f3ec, Tinte #161616, leise #5a5650, Zettel #efe6d2, Tannengrün #1d4a3a (Ablauf, Häkchen, Auswahl), Klatschmohn #c8382a nur für Bewerben (Druck #a92e22, Fehlertext #a92e22)",
   "layout": "Inhalt minmax(0, 1fr) und Bewerbung bis 400 px; Bewerbung sticky top 20 px mit max-height 100vh − 40 px (scrollt in sich, wenn höher); ≤ 860 px einspaltig, Bewerbung unten, feste Leiste „In 2 Minuten bewerben“ und Anruf",
   "formular": "4 Pflichtangaben (Pflege 5): Name, Telefon oder E-Mail, Abschluss bzw. Ausbildung bzw. Schulabschluss, (Umfang), frühester Start; Lebenslauf freiwillig; keine Gehaltsfrage; Fehler nach Verlassen des Felds bzw. nach dem ersten Absenden, dann live; Fehlerliste in Formular-Reihenfolge mit Sprunglinks",
   "jsonld": "JobPosting mit title, description (HTML der sichtbaren Blöcke), identifier, datePosted, validThrough, employmentType, hiringOrganization, jobLocation (PostalAddress, addressCountry DE), baseSalary (HOUR bzw. MONTH, minValue/maxValue), directApply true; bei „vergeben“ entfernt",
   "bestaetigung": "Antwortfrist in Werktagen ab dem Demo-Datum 02.11.2026: 3 Werktage → Donnerstag, 05.11.2026"
  },
  "ausloeser": "klick",
  "touch": "Keine Füllung bei Touch, nur Druck (scale 0.95) und dunkleres Mohnrot; Pfeil der Links steht dauerhaft. Einspaltig mit fester Leiste unten („In 2 Minuten bewerben“ springt zum Formular und setzt den Fokus ins erste Feld, daneben Anrufen). Felder 48 px, Auswahl 44 px, passende autocomplete-Werte.",
  "reduziert": "Zettel steht sofort, Haken ohne Federn und ohne Strich-Animation, Fehlerliste und Bestätigung ohne Übergang; die Füllung des Knopfs wird zu einem 150-ms-Überblenden.",
  "korrekturen": {
   "umsetzung": "Ein Datensatz je Stelle (Titel, Ort, Stunden, Gehalt mit Bezug, Start, Aufgaben, Anforderungen, Leistungen, Ablauf mit Fristen, Ansprechperson, datePosted, validThrough, Status). Daraus entstehen die sichtbare Seite und das JSON-LD JobPosting im <head>: description ist das HTML derselben Blöcke, baseSalary ein MonetaryAmount mit minValue, maxValue und unitText (HOUR oder MONTH), jobLocation ein Place mit PostalAddress und addressCountry DE, identifier die Stellennummer, directApply true, weil die Kurzbewerbung auf der Seite steht. Gehalt in Tabellenziffern mit Bezug und „brutto“; bei Tarif die Entgeltgruppe, bei Teilzeit eine zweite Zeile, bei Ausbildung je Jahr. Kurzbewerbung mit höchstens fünf Pflichtangaben, Lebenslauf freiwillig, keine Frage nach dem bisherigen Gehalt; Fehler erst nach der Interaktion, beim Absenden eine Fehlerliste mit Sprunglinks. Die Bestätigung nennt Name der Ansprechperson und das Datum, bis wann sie sich meldet. Auf dem Desktop läuft die Bewerbung mit position: sticky mit (höchstens so hoch wie der Bildschirm), auf dem Telefon steht sie unten und eine feste Leiste führt hin. Vergeben oder abgelaufen: JSON-LD entfernen (oder validThrough in der Vergangenheit, oder 404/410), Hinweis oben, ähnliche Stellen und Job-Alert mit Double-Opt-in statt Formular. „Stelle teilen“ kopiert den Link mit sichtbarer Rückmeldung. In der Demo sind Übersicht, ähnliche Stellen und WhatsApp simuliert. Texte AGG-neutral; Datenschutz nach Art. 13 DSGVO, Speicherdauer und die deutsche Umsetzung der Entgelttransparenzrichtlinie vom Kunden prüfen lassen."
  },
  "geprueft": "02.11.2026",
  "notiz": "Welt: Rezept arbeitgeber-karriere, erfundener Arbeitgeber Haus Brückenfeld Pflege und Wohnen in Bad Hersfeld (Haustechnik, ambulante Pflege, Ausbildung); Funnel Display und Funnel Sans (WOFF aus assets/fonts), Kreide, Tannengrün, Klatschmohn nur für Bewerben. Ansprechpersonen als markierte Foto-Platzhalter mit Initialen (keine KI-Bilder von Menschen). Zustände: offen, vergeben (JSON-LD entfernt, ähnliche Stellen, Job-Alert), Teilzeit und Vollzeit, Haustarif mit Entgeltgruppe, Vergütung je Ausbildungsjahr, Fehlerliste, Bewerbung abgeschickt. Das JSON-LD der Grundvariante steht statisch im Quelltext (Code-Ansicht) und wird je Variante aus demselben Datensatz neu erzeugt; unter „JobPosting-Daten dieser Seite“ sichtbar. Geprüft am 02.11.2026: developers.google.com (JobPosting), bundestag.de (hib 587/2026); Belege karriere.mfm.energy und achberg.com aus der Rezept-Runde. Zugang: regeln, breite320 und tastatur ohne Befund. AD-Review-Nachbesserung: Pult rechts und eingeklappt (verdeckte den Gehaltszettel), Telefonnummern mit 0 nach der Vorwahl (06621 050398-0, nicht vergebbar). Entgelttransparenz-Stand an hib 587/2026 nachgelesen. AD-Review 02.11.2026: Note 5",
  "varianten": [
   {
    "id": "handwerk",
    "name": "Handwerk mit Stundenlohn",
    "knopf": "Handwerk",
    "wann": "Handwerksbetrieb oder Haustechnik: Stundenlohn als Spanne, Einsatzorte und Baustelle, Führerschein, bezahlter Probetag, Rufbereitschaft mit Pauschale.",
    "werte": {
     "gehalt": "19,80 bis 24,50 € pro Stunde brutto; baseSalary unitText HOUR",
     "ablauf": "Kurzbewerbung, Anruf in 3 Werktagen, Kennenlernen 45 Minuten, Probetag bezahlt (8 Stunden), Zusage spätestens 1 Woche danach",
     "zettel": "landet mit cubic-bezier(0.34, 1.56, 0.64, 1), 500 ms"
    }
   },
   {
    "id": "pflege",
    "name": "Pflege mit Tarif, Vollzeit und Teilzeit",
    "knopf": "Pflege",
    "wann": "Pflegedienst oder Einrichtung: Tarif mit Entgeltgruppe statt freier Spanne, zwei Gehaltsangaben für Vollzeit und Teilzeit, Zuschläge, Dienste und Touren, Dienstwagen; Federn gedämpft.",
    "werte": {
     "gehalt": "Entgeltgruppe 7: 3.720 bis 4.310 € brutto im Monat (38,5 Std.), Teilzeit 80 %: 2.976 bis 3.448 €; baseSalary MONTH; employmentType FULL_TIME und PART_TIME",
     "formular": "5. Pflichtangabe Umfang (Vollzeit oder Teilzeit)",
     "zettel": "landet mit cubic-bezier(0.16, 1, 0.3, 1) ohne Überschwinger (Gesundheit); nur der Haken federt"
    }
   },
   {
    "id": "ausbildung",
    "name": "Ausbildung mit Vergütung je Jahr",
    "knopf": "Ausbildung",
    "wann": "Ausbildungsplatz: Vergütung je Ausbildungsjahr passend zur Dauer, Ausbildungsstart, Berufsschule, Praktikum zum Reinschnuppern als freiwillige Option, Info für Eltern bei der Ansprechperson.",
    "werte": {
     "gehalt": "1.415 / 1.477 / 1.578 € brutto im Monat im 1. bis 3. Jahr; baseSalary MONTH 1.415 bis 1.578",
     "formular": "Schulabschluss als Auswahl, Checkbox „zuerst ein Praktikum“ (freiwillig)",
     "ablauf": "Anruf in 3 Werktagen, Praktikum 1 bis 5 Tage, Kennenlernen auch mit Eltern, Vertrag spätestens 6 Wochen vor Start"
    }
   }
  ]
 }
}
