@conciso/design-system-mcp 0.0.0-bootstrap.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +59 -0
- package/bin/cds-mcp.mjs +9 -0
- package/package.json +48 -0
- package/snapshot/manifests/components.json +617 -0
- package/snapshot/manifests/docs.json +293 -0
- package/snapshot/services/addon-docs/mdx/beispielseiten-/303/274bersicht--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/grundlagen-barrierefreiheit--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/grundlagen-design-tokens--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/grundlagen-einrichtung--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/grundlagen-elevation--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/grundlagen-icons--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/grundlagen-responsive--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/grundlagen-spacing-grid--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-buchungsformular--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-buttons--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-call-to-action--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-cards-teaser--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-chips-badges-pills--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-code-block--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-dropdowns--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-feedback--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-footer--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-hero--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-inputs-forms--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-navigation--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-sektion--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-slider-carousel--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-tabelle--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-theme-umschalter--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-zitate-testimonials--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/marke-bildsprache--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/marke-brand-areas--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/marke-logo--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/marke-markenrad--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/referenzen-quellen--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/seitenmuster-angebots-detailseite--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/seitenmuster-beitrags/303/274bersicht--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/seitenmuster-seminar-/302/267-training--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/seitenmuster-veranstaltung--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/seitenmuster-veranstaltungs/303/274bersicht--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/seitenmuster-wissensbeitrag--/303/274bersicht.json +18 -0
- package/snapshot/services/core/docgen/grundlagen-farben.json +3 -0
- package/snapshot/services/core/docgen/grundlagen-typografie.json +3 -0
- package/snapshot/services/core/docgen/komponenten-buttons-button.json +183 -0
- package/snapshot/services/core/docgen/komponenten-call-to-action-cta-band.json +131 -0
- package/snapshot/services/core/docgen/komponenten-call-to-action-downloadcta.json +182 -0
- package/snapshot/services/core/docgen/komponenten-cards-teaser-card.json +146 -0
- package/snapshot/services/core/docgen/komponenten-cards-teaser-feature-liste.json +128 -0
- package/snapshot/services/core/docgen/komponenten-cards-teaser-featured-karte.json +158 -0
- package/snapshot/services/core/docgen/komponenten-cards-teaser-icon-karte.json +111 -0
- package/snapshot/services/core/docgen/komponenten-cards-teaser-klickbare-karte.json +161 -0
- package/snapshot/services/core/docgen/komponenten-cards-teaser-statcard.json +115 -0
- package/snapshot/services/core/docgen/komponenten-cards-teaser-statstrip.json +58 -0
- package/snapshot/services/core/docgen/komponenten-cards-teaser-tier-trenner.json +56 -0
- package/snapshot/services/core/docgen/komponenten-chips-badges-pills-bereichs-badge.json +63 -0
- package/snapshot/services/core/docgen/komponenten-chips-badges-pills-chip.json +95 -0
- package/snapshot/services/core/docgen/komponenten-chips-badges-pills-pill.json +78 -0
- package/snapshot/services/core/docgen/komponenten-chips-badges-pills-status-badge.json +63 -0
- package/snapshot/services/core/docgen/komponenten-code-block-code-block.json +91 -0
- package/snapshot/services/core/docgen/komponenten-dropdowns-combobox.json +224 -0
- package/snapshot/services/core/docgen/komponenten-dropdowns-custom-select.json +173 -0
- package/snapshot/services/core/docgen/komponenten-feedback-snackbar.json +97 -0
- package/snapshot/services/core/docgen/komponenten-footer-komplett.json +21 -0
- package/snapshot/services/core/docgen/komponenten-footer-oberer-teil.json +39 -0
- package/snapshot/services/core/docgen/komponenten-footer-unterer-teil.json +105 -0
- package/snapshot/services/core/docgen/komponenten-hero-hero-bild.json +162 -0
- package/snapshot/services/core/docgen/komponenten-hero-st/303/266rer.json +41 -0
- package/snapshot/services/core/docgen/komponenten-inputs-forms-auswahlfeld.json +192 -0
- package/snapshot/services/core/docgen/komponenten-inputs-forms-checkbox.json +182 -0
- package/snapshot/services/core/docgen/komponenten-inputs-forms-radio.json +181 -0
- package/snapshot/services/core/docgen/komponenten-inputs-forms-skala.json +179 -0
- package/snapshot/services/core/docgen/komponenten-inputs-forms-slider.json +259 -0
- package/snapshot/services/core/docgen/komponenten-inputs-forms-textbereich.json +190 -0
- package/snapshot/services/core/docgen/komponenten-inputs-forms-textfeld.json +207 -0
- package/snapshot/services/core/docgen/komponenten-navigation-topnav.json +186 -0
- package/snapshot/services/core/docgen/komponenten-sektion-sektion.json +113 -0
- package/snapshot/services/core/docgen/komponenten-slider-carousel-carousel.json +92 -0
- package/snapshot/services/core/docgen/komponenten-slider-carousel-logocarousel.json +92 -0
- package/snapshot/services/core/docgen/komponenten-tabelle-tabelle.json +74 -0
- package/snapshot/services/core/docgen/komponenten-tabelle-vergleichstabelle.json +142 -0
- package/snapshot/services/core/docgen/komponenten-theme-umschalter-cycle-button.json +41 -0
- package/snapshot/services/core/docgen/komponenten-theme-umschalter-dropdown.json +41 -0
- package/snapshot/services/core/docgen/komponenten-theme-umschalter-segment.json +41 -0
- package/snapshot/services/core/docgen/komponenten-zitate-testimonials-blockquote.json +96 -0
- package/snapshot/services/core/docgen/komponenten-zitate-testimonials-teamvoice.json +130 -0
- package/snapshot/services/core/docgen/komponenten-zitate-testimonials-testimonial.json +96 -0
- package/snapshot/services/core/docgen/marke-brand-areas-areatabs.json +75 -0
- package/snapshot/services/core/docgen/marke-logo-logo.json +71 -0
- package/snapshot/services/core/docgen/seitenmuster-seminar-/302/267-training-fakten-liste.json +79 -0
- package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-article-header.json +196 -0
- package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-author-card.json +91 -0
- package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-avatar.json +100 -0
- package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-callout.json +64 -0
- package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-faq.json +41 -0
- package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-figure.json +73 -0
- package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-inhaltsverzeichnis.json +75 -0
- package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-pull-quote.json +63 -0
- package/snapshot/services/core/story-docs/grundlagen-farben.json +19 -0
- package/snapshot/services/core/story-docs/grundlagen-typografie.json +25 -0
- package/snapshot/services/core/story-docs/komponenten-buttons-button.json +48 -0
- package/snapshot/services/core/story-docs/komponenten-call-to-action-cta-band.json +27 -0
- package/snapshot/services/core/story-docs/komponenten-call-to-action-downloadcta.json +17 -0
- package/snapshot/services/core/story-docs/komponenten-cards-teaser-card.json +37 -0
- package/snapshot/services/core/story-docs/komponenten-cards-teaser-feature-liste.json +37 -0
- package/snapshot/services/core/story-docs/komponenten-cards-teaser-featured-karte.json +36 -0
- package/snapshot/services/core/story-docs/komponenten-cards-teaser-icon-karte.json +41 -0
- package/snapshot/services/core/story-docs/komponenten-cards-teaser-klickbare-karte.json +26 -0
- package/snapshot/services/core/story-docs/komponenten-cards-teaser-statcard.json +21 -0
- package/snapshot/services/core/story-docs/komponenten-cards-teaser-statstrip.json +21 -0
- package/snapshot/services/core/story-docs/komponenten-cards-teaser-tier-trenner.json +22 -0
- package/snapshot/services/core/story-docs/komponenten-chips-badges-pills-bereichs-badge.json +21 -0
- package/snapshot/services/core/story-docs/komponenten-chips-badges-pills-chip.json +27 -0
- package/snapshot/services/core/story-docs/komponenten-chips-badges-pills-pill.json +21 -0
- package/snapshot/services/core/story-docs/komponenten-chips-badges-pills-status-badge.json +21 -0
- package/snapshot/services/core/story-docs/komponenten-code-block-code-block.json +26 -0
- package/snapshot/services/core/story-docs/komponenten-dropdowns-combobox.json +37 -0
- package/snapshot/services/core/story-docs/komponenten-dropdowns-custom-select.json +37 -0
- package/snapshot/services/core/story-docs/komponenten-feedback-snackbar.json +27 -0
- package/snapshot/services/core/story-docs/komponenten-footer-komplett.json +22 -0
- package/snapshot/services/core/story-docs/komponenten-footer-oberer-teil.json +21 -0
- package/snapshot/services/core/story-docs/komponenten-footer-unterer-teil.json +32 -0
- package/snapshot/services/core/story-docs/komponenten-hero-hero-bild.json +37 -0
- package/snapshot/services/core/story-docs/komponenten-hero-st/303/266rer.json +26 -0
- package/snapshot/services/core/story-docs/komponenten-inputs-forms-auswahlfeld.json +32 -0
- package/snapshot/services/core/story-docs/komponenten-inputs-forms-checkbox.json +32 -0
- package/snapshot/services/core/story-docs/komponenten-inputs-forms-radio.json +32 -0
- package/snapshot/services/core/story-docs/komponenten-inputs-forms-skala.json +42 -0
- package/snapshot/services/core/story-docs/komponenten-inputs-forms-slider.json +37 -0
- package/snapshot/services/core/story-docs/komponenten-inputs-forms-textbereich.json +27 -0
- package/snapshot/services/core/story-docs/komponenten-inputs-forms-textfeld.json +32 -0
- package/snapshot/services/core/story-docs/komponenten-navigation-topnav.json +26 -0
- package/snapshot/services/core/story-docs/komponenten-sektion-sektion.json +41 -0
- package/snapshot/services/core/story-docs/komponenten-slider-carousel-carousel.json +31 -0
- package/snapshot/services/core/story-docs/komponenten-slider-carousel-logocarousel.json +27 -0
- package/snapshot/services/core/story-docs/komponenten-tabelle-tabelle.json +36 -0
- package/snapshot/services/core/story-docs/komponenten-tabelle-vergleichstabelle.json +32 -0
- package/snapshot/services/core/story-docs/komponenten-theme-umschalter-cycle-button.json +31 -0
- package/snapshot/services/core/story-docs/komponenten-theme-umschalter-dropdown.json +26 -0
- package/snapshot/services/core/story-docs/komponenten-theme-umschalter-segment.json +26 -0
- package/snapshot/services/core/story-docs/komponenten-zitate-testimonials-blockquote.json +21 -0
- package/snapshot/services/core/story-docs/komponenten-zitate-testimonials-teamvoice.json +21 -0
- package/snapshot/services/core/story-docs/komponenten-zitate-testimonials-testimonial.json +21 -0
- package/snapshot/services/core/story-docs/marke-brand-areas-areatabs.json +26 -0
- package/snapshot/services/core/story-docs/marke-logo-logo.json +23 -0
- package/snapshot/services/core/story-docs/seitenmuster-seminar-/302/267-training-fakten-liste.json +21 -0
- package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-article-header.json +37 -0
- package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-author-card.json +31 -0
- package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-avatar.json +32 -0
- package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-callout.json +26 -0
- package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-faq.json +27 -0
- package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-figure.json +22 -0
- package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-inhaltsverzeichnis.json +27 -0
- package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-pull-quote.json +21 -0
- package/src/instructions.mjs +38 -0
- package/src/server.mjs +111 -0
- package/src/version-check.mjs +80 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"components": {
|
|
3
|
+
"seitenmuster-wissensbeitrag--übersicht": {
|
|
4
|
+
"id": "seitenmuster-wissensbeitrag--übersicht",
|
|
5
|
+
"name": "seitenmuster-wissensbeitrag--übersicht",
|
|
6
|
+
"docs": {
|
|
7
|
+
"seitenmuster-wissensbeitrag--übersicht": {
|
|
8
|
+
"id": "seitenmuster-wissensbeitrag--übersicht",
|
|
9
|
+
"name": "Übersicht",
|
|
10
|
+
"path": "./src/docs/seitenmuster/wissensbeitrag.mdx",
|
|
11
|
+
"title": "Seitenmuster/Wissensbeitrag",
|
|
12
|
+
"content": "import { Meta } from '@storybook/addon-docs/blocks';\n\n<Meta title=\"Seitenmuster/Wissensbeitrag\" name=\"Übersicht\" tags={['angular']} />\n\n# Wissensbeitrag\n\nPage-Pattern für redaktionelle Beiträge: zentrierter Header (Breadcrumb, Pill, Titel, Lead,\nMeta), 720-px-Spalte für den Lauftext, bereichssensitive Callouts und eine Author-Card am\nEnde. Quelle: `docs/index.html#sec-article`.\n\n## Aufbau\n\nEmpfohlene Sektions-Reihenfolge, dem Lesefluss „Lesen → Vertrauen → Vertiefen → Handeln →\nErkunden“ folgend:\n\n| # | Sektion | Bausteine | Funktion |\n|---|---|---|---|\n| 1 | Topnav | `Komponenten/Navigation/Topnav`, `aria-current=\"page\"` auf „Wissen“ | Globale Navigation, kennzeichnet den Wissens-Bereich |\n| 2 | Article Header | `.article-header` · `Komponenten/Chips, Badges & Pills/Pill` · `.article-meta` | Einordnung, Versprechen und Autor:in |\n| 3 | Hero-Bild | `Komponenten/Hero`, ohne Caption | Visuelles Versprechen ohne Marketing-Overlay |\n| 4 | Article Body | `.article-body` mit Inhaltsverzeichnis, Pull-Quote, `Komponenten/Zitate & Testimonials/Blockquote`, `Komponenten/Tabelle`, `Komponenten/Code-Block/Code-Block`, Callout, Figure | Lauftext mit eingebetteten Spezial-Bausteinen |\n| 5 | Download-CTA | `Komponenten/Call to Action/DownloadCta` in Bereichsfarbe | Topische Verlängerung des Beitrags als PDF oder Asset |\n| 6 | Author-Card | `.author-card` | Glaubwürdigkeit, Übergang zu nächsten Schritten |\n| 7 | Kontaktformular | `Komponenten/Inputs & Forms/Textfeld` (und verwandte Felder) im `.ds-card` mit `Komponenten/Buttons/Button` | High-Intent-Aktion am Punkt höchsten Interesses |\n| 8 | Weiterlesen | `.ep-cards` mit `.ep-card-link` pro Bereich | Sanfte Exit-Rampe in andere Beiträge |\n| 9 | Footer | `Komponenten/Footer` | Globale Navigation und Rechtliches |\n\nDie Sequenz Download-CTA, Author, Formular, Weiterlesen hat sich bewährt: Der Download\nbleibt nah am Inhalt (höchste topische Relevanz), das Formular sitzt am Punkt höchsten\nInteresses, Weiterlesen fängt alle ab, die noch nicht buchen wollen. Weiterlesen nicht vor\ndas Formular setzen, die Karten sind eine Exit-Rampe und führen vom Conversion-Punkt weg.\n\n## Article Header\n\nWrapper `.article-header` bündelt Breadcrumb, optionale Pill, H1, Lead und Meta-Strip auf\neiner zentrierten Achse (max. 880 px), typischerweise direkt unter dem Topnav und über dem\nHero-Bild. Der Meta-Strip trennt Autor-Block und Datum über einen 1-px-Trenner\n(`.article-meta-sep`), die Author-Text-Spalte bleibt linksbündig (`.article-meta-text`),\ndamit Name und Rolle nicht zwischen Avatar und Trenner zerrissen wirken. Das Datum steht als\n`<time datetime=\"JJJJ-MM-TT\">`, maschinenlesbar für Suchmaschinen und Assistenztechnologie.\n\n**Editorial gegen Marketing:** Der Article-Header ist bewusst zentriert\n(`text-align:center`, `max-width:880px`). Marketing-Sektionen wie „Was wir tun“ verwenden\n`.ep-section-*` und sind linksbündig. Editorial-Inhalte sind zum Lesen gedacht, der\nzentrierte Header bildet einen ruhigen Fokuspunkt vor dem 720-px-Lesefluss.\nMarketing-Sektionen sollen scan-tauglich wirken, dafür ist linksbündig die natürliche Wahl.\n\n```html\n<header class=\"article-header\">\n <nav class=\"article-breadcrumb\" aria-label=\"Breadcrumb\">\n <a href=\"/wissen\">Wissen</a>\n <span class=\"article-breadcrumb-sep\" aria-hidden=\"true\">/</span>\n <a href=\"/ki\">Angewandte KI</a>\n </nav>\n <span class=\"pill\" data-area=\"ki\" aria-label=\"Lesezeit 8 Minuten\">8 min Lesezeit</span>\n <h1 class=\"article-title\">Warum 60 % der KI-Piloten nie in Produktion gehen</h1>\n <p class=\"article-lead\">Demos überzeugen, Use-Cases scheitern.</p>\n <div class=\"article-meta\">\n <div class=\"article-meta-author\">\n <div class=\"article-avatar\" data-area=\"ki\" aria-hidden=\"true\">LB</div>\n <div class=\"article-meta-text\">\n <p class=\"article-meta-name\">Lukas Brandt</p>\n <p class=\"article-meta-role\">Senior AI Engineer · Conciso</p>\n </div>\n </div>\n <span class=\"article-meta-sep\" aria-hidden=\"true\"></span>\n <time class=\"article-meta-date\" datetime=\"2026-05-13\">13. Mai 2026</time>\n </div>\n</header>\n```\n\n## Pill · Lesezeit\n\nIm Wissensbeitrag trägt die Pill (siehe `Komponenten/Chips, Badges & Pills/Pill`)\nausschließlich die Lesezeit. Die Bereichszuordnung übernimmt der Breadcrumb, der\nBereichsname zusätzlich in der Pill wäre Doppelung. Auf Übersichtsseiten trägt die Pill\ndagegen nur den Bereich, Lesezeit und Datum stehen darunter in einer eigenen Meta-Zeile\n(siehe `Seitenmuster/Beitragsübersicht`).\n\n| Constraint | Regel |\n|---|---|\n| Inhalt | Nur Lesezeit (z. B. „8 min Lesezeit“), kein Bereichsname, kein Format, kein Beitragstyp |\n| Bereich | Über `data-area`, nur die drei Disziplinen ki, es, wo. Corporate ist keine Wissens-Kategorie |\n| aria-label | `aria-label=\"Lesezeit X Minuten\"`, schreibt „min“ aus und liefert den Wert eindeutig |\n\n## Inhaltsverzeichnis\n\nAufklappbares Inhaltsverzeichnis für längere Beiträge, sitzt als erstes Element im\n`.article-body`, vor dem Lead-Absatz. Default zugeklappt, damit der Lesefluss ungestört\nbleibt. Implementiert mit nativem `<details>`/`<summary>`, dadurch ohne JavaScript per\nTastatur bedienbar (Enter/Space) und vom Screenreader als Disclosure angesagt. Die\nAnker-Links zeigen auf die `id` der jeweiligen H2 im Body (Konvention `wb-{slug}-{thema}`).\n\n| Faustregel | Empfehlung |\n|---|---|\n| Lesezeit unter 6 min | Kein TOC, Lesefluss schlägt Scanability |\n| Lesezeit 6 bis 10 min | TOC optional, default zugeklappt, Nutzer entscheidet |\n| Lesezeit über 10 min oder Tutorial | TOC empfohlen, gegebenenfalls später als Sticky-Sidebar |\n\n**Designentscheidung, minimaler Stil statt Container:** Das TOC trägt bewusst keine\nContainer-Box (kein Hintergrund, keine Border, kein Radius), nur dünne Trennlinien oben und\nunten. Eine Container-Box mit `n-50`-Hintergrund würde das TOC visuell auf die Stufe eines\nIn-Article-Callouts heben, also wie ein Inhaltselement wirken. Das TOC ist aber ein\nWerkzeug, kein Inhalt, der Beitrag spielt den Star.\n\nDer native Disclosure-Marker wird über `::-webkit-details-marker` und `list-style:none`\nausgeblendet, ein eigener Caret-SVG übernimmt die Funktion (dekorativ, `aria-hidden`).\n\n## Article Body\n\n`.article-body` setzt die Lese-Typografie (`--ty-body-md`, 16 px, `line-height:1.7`) und\ndie Abstände der Block-Kinder (`<p>`, `<h2>`, `<ul>`, `<ol>`), sodass diese ohne\nInline-Styles auskommen. Eingebettete Komponenten (`.bq`, `.tbl`, `.cb-wrap`,\n`.article-callout`) bringen ihre eigenen Abstände mit und überschreiben die Body-Defaults\nnicht.\n\n## In-Article Figure\n\nKlassen-Paar `.article-figure` (Wrapper als `<figure>`) und `.article-figcaption` (als\n`<figcaption>`), ein semantisch standardkonformes figure/figcaption-Pattern. Das Bild\nrendert mit `aspect-ratio:16/9` und `object-fit:cover`, verhindert Layout-Shift beim Laden.\nDie Caption sitzt zentriert darunter in Body-sm mit `text-wrap:balance`.\n\n**Barrierefreiheit, alt gegen figcaption:** Beide Texte tun unterschiedliche Jobs und sollten\nnicht denselben Inhalt tragen, sonst lesen Screenreader doppelt vor.\n\n| Attribut | Rolle |\n|---|---|\n| `alt` | Faktische Bildbeschreibung („was zu sehen ist“), für Screenreader gedacht, visuell unsichtbar |\n| `figcaption` | Redaktionelle Einordnung („was das Bild im Beitrag tut“), sichtbar, wird nach dem Alt-Text vorgelesen |\n\nKontrast: Die Caption nutzt `var(--tx-secondary)` (rund 5,8:1 auf Surface, AA-konform).\n`var(--tx-muted)` ist für inhaltlich essentielle Texte zu hell (rund 2,1:1), nur für\nHilfsangaben geeignet.\n\n```html\n<figure class=\"article-figure\">\n <img src=\"bild.jpg\" alt=\"Faktische Bildbeschreibung, was zu sehen ist\" loading=\"lazy\">\n <figcaption class=\"article-figcaption\">Redaktionelle Einordnung, was das Bild zum Beitrag beiträgt.</figcaption>\n</figure>\n```\n\n**Dos**\n- Alt-Text rein faktisch halten, keine Interpretation, keine Pointe.\n- Caption als redaktionellen Mehrwert nutzen, Brücke zwischen Bild und Beitragsthema.\n- `loading=\"lazy\"` für Bilder im Beitragskörper, sie sind below the fold.\n\n**Don'ts**\n- Alt-Text und Caption inhaltlich identisch, Screenreader liest doppelt.\n- `alt=\"\"` bei inhaltlichen Beitragsbildern, nur für rein dekorative Bilder zulässig.\n- Caption in `var(--tx-muted)`, fällt unter WCAG AA, nicht für inhaltliche Texte geeignet.\n\n## In-Article Callout\n\nAside-Block für Praxis-Beispiele, Hinweise oder „In der Realität“-Einschübe im Lauftext.\nHellster Bereichston (50) als Hintergrund, 4-px-linke Border in 500er-Stärke (analog zum\nBlockquote), Eyebrow mit 0,08em Letter-Spacing, 700er-Ton bei co, es, wo, 800er-Ton bei ki\n(KI-700 erreicht 4,4:1 und unterschreitet AA auf Weiß).\n\nAbgrenzung zum Blockquote: Der Callout ist redaktionelle Anmerkung im eigenen Stil, der\nBlockquote ist ein wörtliches Zitat einer benannten Person.\n\n```html\n<aside class=\"article-callout\" data-area=\"ki\">\n <p class=\"article-callout-eyebrow\">In der Praxis</p>\n <p>Bei einem mittelständischen Versicherer haben wir vor dem Pilot-Start sechs Wochen lang nur Daten und Prozesse aufgeräumt.</p>\n</aside>\n```\n\n## Pull-Quote gegen Blockquote\n\nZwei Patterns, gleiche typografische Familie, unterschiedlicher Zweck. Die Wahl folgt der\nFrage, wessen Stimme zitiert wird.\n\n**Pull-Quote (`.article-pullquote`):** typografische Hervorhebung eines Satzes aus dem\neigenen Lauftext, ohne Attribution, der Autor zitiert sich nicht selbst, sondern setzt einen\nSchlüsselsatz visuell ab. 4-px-Linksakzent in `{area}-500` (gleicher Akzent wie der\nBlockquote), Serif kursiv, kein Hintergrund, kein Icon, bewusst offen statt umrahmt.\n\n**Blockquote (`.bq`, siehe `Komponenten/Zitate & Testimonials/Blockquote`):** wörtliches\nZitat einer dritten Person, Kund:in, Forschungsstimme, Branchen-Statement, mit Attribution\n(Name plus Rolle), bereichsgetönte Akzent-Box mit Quote-Icon.\n\n```html\n<blockquote class=\"article-pullquote\" data-area=\"ki\">\n „KI scheitert selten an der Technologie. Sie scheitert an der Prozesslandschaft, in die sie hineingeworfen wird.“\n</blockquote>\n```\n\nFaustregel: Stammt der Satz aus dem eigenen Lauftext und soll nur visuell hervorgehoben\nwerden, gilt die Pull-Quote ohne Attribution. Zitiert der Beitrag eine externe Person\n(Kunde, Studie, Branchen-Statement), gilt der Blockquote mit Name und Rolle. Ein Self-Quote\nim eigenen Beitrag wirkt sonst absurd, der Autor zitiert die Person, die den Beitrag\nschreibt.\n\n## Author Card\n\nBio-Strip am Ende des Beitrags: Avatar (`.article-avatar.article-avatar-lg`) als\nInitialen-Kreis oder mit Foto, daneben der Bio-Text. `data-area` auf `.author-card` färbt\nnur den Avatar, Text-Tokens bleiben neutral, damit der Strip auf jedem Hintergrund\n(typischerweise `var(--n-50)`) lesbar bleibt.\n\n**Avatar-Bild-Konvention:** Als `<img>`-Quelle nur Portraits der Person verwenden, niemals\nBeitrags-Hero-Bilder, Whiteboard-Fotos oder generische Content-Imagery. Ohne verfügbares\nPortrait bleiben die Initialen stehen, der Bereichston liefert dann die visuelle Identität\nsauberer als ein themenfremdes Bild.\n\nSitzt zwischen Article-Body und der nächsten Sektion, mit derselben `max-width` von 720 px\nwie der Article-Body, damit Avatar und Bio auf der gleichen Achse sitzen.\n\n**Barrierefreiheit:** Der Eyebrow („Über den Autor“ / „Über die Autorin“) ist als `<h3>`\nausgezeichnet (eine Ebene unter den H2 des Article-Body), damit die Author-Sektion in der\nHeading-Übersicht von Screenreadern erscheint und per Tastatur direkt anspringbar ist.\n\n```html\n<div class=\"author-card\" data-area=\"ki\">\n <div class=\"article-avatar article-avatar-lg\" data-area=\"ki\" aria-hidden=\"true\">LB</div>\n <div>\n <h3 class=\"author-card-eyebrow\">Über den Autor</h3>\n <p class=\"author-card-name\">Lukas Brandt</p>\n <p class=\"author-card-role\">Senior AI Engineer · bei Conciso seit 2019</p>\n <p class=\"author-card-bio\">Begleitet KI-Projekte von der Strategie bis in die Produktion.</p>\n </div>\n</div>\n```\n\n## Team-Tile-Grid, rotierender Ausschnitt\n\nAuf der Landing „Wer wir sind“ kommt das Avatar-Pattern reduziert als 4-Kachel-Grid zum\nEinsatz: Foto-Avatar (`.article-avatar.article-avatar-xl`, 160 px) zentriert über Name und\nRolle, keine Bio. Conciso hat rund 70 Mitarbeitende, das Landing-Grid zeigt einen\nrotierenden Ausschnitt, kein vollständiges Roster (das vollständige Roster steht auf der\nÜber-uns-Seite, siehe Team-Roster unten).\n\n**Warum 4 statt 6:** Bei 6 Kacheln in einer Reihe wird jede sehr schmal, Rollen-Labels\nwrappen auf 2 Zeilen und das Foto wirkt klein. 4 Kacheln geben jeder Person 25 statt 16\nProzent der Breite, Rollen bleiben einzeilig, das 160-px-Foto füllt die Kachel präsenter\naus.\n\n**JS-Rotation:** Pro Seitenaufruf werden 4 Mitarbeitende zufällig aus einem Pool von rund 13\nPersonen ausgewählt (Fisher-Yates-Shuffle in `js/main.js`, `data-team-tiles` als Container,\n`data-team-tile` als Slot). Die initial im HTML hinterlegten Werte dienen als JS-off-Fallback,\ndie Seite ist auch ohne JavaScript inhaltlich vollständig. Der Pool spiegelt das\nBereichs-Verhältnis grob wider (4 ki, 4 es, 3 wo, 2 co), damit die zufällige Auswahl nicht\neinseitig wird.\n\n| Aspekt | Regel |\n|---|---|\n| Slot-Anzahl | 4 Tiles in `.layout-grid` mit `.col-3` (Desktop 4 in einer Reihe, Tablet 2×2, Mobile 1×4) |\n| Avatar | `.article-avatar.article-avatar-xl` (160 px) mit Foto-`<img>` als Kind, `object-position` pro Person |\n| Pool-Größe | Rund 12 bis 15 Personen, zu klein wirkt repetitiv, zu groß verwässert das Bereichs-Verhältnis |\n| JS-off | Die initiale HTML-Belegung bleibt sichtbar, Seite ist ohne JavaScript vollständig |\n| A11y | Avatar bleibt `aria-hidden=\"true\"`, Name und Rolle sind echte `<p>`-Elemente |\n\n## Team-Roster, vollständige Aufstellung nach Bereichen\n\nAuf der Über-uns-Seite steht statt des rotierenden Ausschnitts das vollständige Team,\ngegliedert nach organisatorischen Gruppen (Geschäftsführung & Partner, People und Topic\nLeads, Marketing & Vertrieb, HR & Recruiting). Jede Gruppe trägt eine `<h3>`-Überschrift mit\nunterer Haarlinie, darunter ein `.layout-grid` aus `.col-3`-Tiles im selben Aufbau wie das\nLanding-Grid.\n\n**Keine JS-Rotation:** Das Roster nutzt bewusst nicht `data-team-tiles`/`data-team-tile`. Es\nzeigt die Mannschaft vollständig und in fester Reihenfolge, nicht zufällig gemischt, alle\nTiles stehen statisch im HTML.\n\nFotos sind quadratisch, mindestens 320×320 px (besser 400 bis 480 px für HiDPI), Kopf\nzentriert, da der Kreis die Ecken beschneidet. Fehlt ein Portrait, bleibt der\nInitialen-Kreis als vollwertiger Platzhalter stehen, gemischte Belegung innerhalb einer\nGruppe ist erlaubt.\n\n**Reihenfolge der Gruppen:** von der Leitung (Geschäftsführung & Partner) über die\nfachlichen Köpfe (People und Topic Leads) zu Kontakt- und Support-Funktionen (Vertrieb, dann\nHR). HR steht bewusst zuletzt, direkt vor der Karriere-Sektion, als inhaltliche Brücke.\n\n## Mehrere Autor:innen\n\nBetrifft zwei Stellen: den Meta-Strip im Header (kompakt, Avatar-Stack) und die Author-Card\nam Artikelende (volle Bios, untereinander gestapelt). Die Avatare im Header tragen einen\nweißen Halo-Border, damit die Überlappung als Gruppe lesbar ist.\n\n**Sortierung:** Lead-Autor:in zuerst, danach Co-Autor:innen in Reihenfolge des Beitrags. Die\nReihenfolge gilt konsequent für Avatar-Stack, Namenszeile im Header und Author-Cards am\nEnde. Beim „+N“-Indikator sind die ersten zwei oder drei sichtbaren Personen die\nLead-Persons, nie zufällig ausgewählt.\n\n**Eyebrow-Konvention:** Bei einer Person trägt die Author-Card ihren eigenen Eyebrow (Über\nden Autor / Über die Autorin). Bei mehreren Personen ersetzt eine gemeinsame\nGruppen-Überschrift (`.author-card-group-eyebrow`, „Über die Autor:innen“) über dem Stack\ndie individuellen Eyebrows. So entsteht in der Screenreader-Heading-Übersicht nur ein\nEintrag statt mehrerer identischer.\n\n**Namens-Konvention:** Bei zwei Autor:innen mit „&“ verbinden. Bei drei mit „, “ plus „&“\nvor dem letzten Namen. Ab vier Personen die ersten zwei oder drei nennen, dann „& N\nweitere“ und einen `.article-avatar-more`-Kreis mit der Restzahl ergänzen. Die Rolle wird\nbei gleichem Org-Bezug zu einer Sammelbezeichnung („Conciso-Team“), sonst mit „·“ getrennt.\n\n```html\n<div class=\"article-avatar-stack\" aria-hidden=\"true\">\n <div class=\"article-avatar\" data-area=\"es\">PM</div>\n <div class=\"article-avatar\" data-area=\"es\">AR</div>\n <div class=\"article-avatar\" data-area=\"es\">DH</div>\n <div class=\"article-avatar-more\">+2</div>\n</div>\n```\n\n**Barrierefreiheit:** Der Avatar-Stack ist dekorativ (`aria-hidden=\"true\"`), die Namen\nstehen vollständig im Text. Der `.article-avatar-more`-Kreis trägt keine Textinformation,\ndie Restzahl steht zusätzlich im Meta-Namen-Text („… & 3 weitere“).\n\n**Ab vier Bios:** Die vertikale Stapelung wird lang. Optionen: Bios kürzer halten, den\nLead-Autor hervorgehoben oben und die übrigen zweispaltig darunter\n(`.author-card-group.is-grid`, dokumentiert unter `Seitenmuster/Seminar · Training`,\nAbschnitt Trainer:innen, weil sie dort und nicht in Wissensbeiträgen vorkommt), oder die\nAuthor-Cards in einer eigenen Team-Sektion bündeln und im Strip nur die Lead-Persons zeigen.\n\n## FAQ-Akkordeon\n\nAufklappbare Frage-Antwort-Liste über natives `<details>`/`<summary>` (standardmäßig zu),\ndieselbe Disclosure-Mechanik wie das Inhaltsverzeichnis. Die Komponente existiert als Story\n`Seitenmuster/Wissensbeitrag/FAQ`, dort dokumentiert, hier nur referenziert und nicht\nnachgebaut. Liest sich am besten im editorialen Zwei-Spalten-Layout: Überschrift im\n`.layout-grid` links (`.col-4`), das FAQ rechts (`.col-8`).\n\n## Story-Zeitstrahl\n\nEditorialer vertikaler Zeitstrahl für Unternehmens-Historie oder mehrstufige Stories\n(erprobt auf Unternehmen · Überblick, „Conciso Story“). Aufbau: `<ul>` mit einer `<li>` je\nStation als zweispaltiges Grid (168px minmax(0,1fr)). Die linke Spalte ist die Schiene\n(`border-right` in `--co-100`) mit Jahr (`--ty-display-sm`, `.t-co`), Kurzlabel und dem\nMarker `.ep-tl-icon`, der auf der Linie sitzt, rechts Titel und Text.\n\n| Baustein | Rolle |\n|---|---|\n| `<ul>` / `<li>` | Stationen-Liste, je Station ein 2-Spalten-Grid (Schiene plus Inhalt) |\n| Schiene | Linke Spalte mit `border-right:2px solid var(--co-100)`, `text-align:right` |\n| `.ep-tl-icon` | 38-px-Marker (Kreis `--co-50`, Icon `--co-800`), sitzt auf der Schiene |\n| Jahr und Label | Jahr `.t-co` / `--ty-display-sm`, Label darunter `--ty-label-xs` uppercase, `tx-muted` |\n| Inhalt | Titel als `<h3>` (`--ty-title-sm`), Text `--ty-body-md` |\n\n**Barrierefreiheit und Dark-Mode:** Echte Liste, Marker-Icon dekorativ (`aria-hidden=\"true\"`\nplus `focusable=\"false\"`), die Jahreszahl trägt die Information als Text. Im Dark wird der\nMarker-Glyph auf `--co-100` gehoben (sonst dunkel auf dunkel), das `.t-co`-Jahr flippt auf\n`co-200`. Standard-Bereichsfarbe ist co, der `.ep-tl-icon`-Marker ist aktuell co-fix, nicht\n`data-area`-parametrisiert.\n\n## Verwendung\n\nDer Wissensbeitrag ist als Komposition gedacht: Die `.article-*`- und `.author-card`-Klassen\nliefern den redaktionellen Rahmen, die Inhalte werden mit bestehenden Komponenten gefüllt\n(siehe Aufbau oben für die vollständige Sektions-Reihenfolge und Begründung der Sequenz).\n",
|
|
13
|
+
"summary": "# Wissensbeitrag Page-Pattern für redaktionelle Beiträge: zentrierter Header (Breadcrumb, ..."
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
{
|
|
2
|
+
"components": {
|
|
3
|
+
"komponenten-buttons-button": {
|
|
4
|
+
"id": "komponenten-buttons-button",
|
|
5
|
+
"name": "ButtonComponent",
|
|
6
|
+
"path": "./src/lib/button/button.stories.ts",
|
|
7
|
+
"description": "Button — dünner Angular-Wrapper um die bestehende `.btn`-CSS-Familie.\n\nErfindet KEINE Styles: setzt ausschließlich die im Design System vorhandenen\nKlassen (.btn, .btn-filled/.btn-tonal/.btn-elevated/.btn-outlined/.btn-text,\n.btn-sm/.btn-lg, .btn-co/.btn-ki/.btn-es/.btn-wo, .btn-full, .btn-on-band)\nzusammen. Siehe css/components.css → „Buttons“. Der Klick wird als `clicked`\nausgegeben (für Nutzung außerhalb reiner Formular-Submits).",
|
|
8
|
+
"jsDocTags": {},
|
|
9
|
+
"argTypes": {
|
|
10
|
+
"area": {
|
|
11
|
+
"name": "area",
|
|
12
|
+
"description": "Markenbereich → .btn-co / .btn-ki / .btn-es / .btn-wo",
|
|
13
|
+
"type": {
|
|
14
|
+
"name": "enum",
|
|
15
|
+
"value": [
|
|
16
|
+
"co",
|
|
17
|
+
"ki",
|
|
18
|
+
"es",
|
|
19
|
+
"wo"
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
"table": {
|
|
23
|
+
"category": "inputs",
|
|
24
|
+
"type": {
|
|
25
|
+
"summary": "CdsArea"
|
|
26
|
+
},
|
|
27
|
+
"defaultValue": {
|
|
28
|
+
"summary": "co"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"disabled": {
|
|
33
|
+
"name": "disabled",
|
|
34
|
+
"type": {
|
|
35
|
+
"name": "boolean"
|
|
36
|
+
},
|
|
37
|
+
"table": {
|
|
38
|
+
"category": "inputs",
|
|
39
|
+
"type": {
|
|
40
|
+
"summary": "boolean"
|
|
41
|
+
},
|
|
42
|
+
"defaultValue": {
|
|
43
|
+
"summary": false
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"full": {
|
|
48
|
+
"name": "full",
|
|
49
|
+
"description": "Volle Breite → .btn-full (Host wird block, damit 100% greifen).",
|
|
50
|
+
"type": {
|
|
51
|
+
"name": "boolean"
|
|
52
|
+
},
|
|
53
|
+
"table": {
|
|
54
|
+
"category": "inputs",
|
|
55
|
+
"type": {
|
|
56
|
+
"summary": "boolean"
|
|
57
|
+
},
|
|
58
|
+
"defaultValue": {
|
|
59
|
+
"summary": false
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
"label": {
|
|
64
|
+
"name": "label",
|
|
65
|
+
"description": "Sichtbarer Text des Buttons.",
|
|
66
|
+
"type": {
|
|
67
|
+
"name": "string"
|
|
68
|
+
},
|
|
69
|
+
"table": {
|
|
70
|
+
"category": "inputs",
|
|
71
|
+
"type": {
|
|
72
|
+
"summary": "string"
|
|
73
|
+
},
|
|
74
|
+
"defaultValue": {
|
|
75
|
+
"summary": "Button"
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
"size": {
|
|
80
|
+
"name": "size",
|
|
81
|
+
"description": "Größe → .btn-sm / (md = Default) / .btn-lg",
|
|
82
|
+
"type": {
|
|
83
|
+
"name": "enum",
|
|
84
|
+
"value": [
|
|
85
|
+
"sm",
|
|
86
|
+
"md",
|
|
87
|
+
"lg"
|
|
88
|
+
]
|
|
89
|
+
},
|
|
90
|
+
"table": {
|
|
91
|
+
"category": "inputs",
|
|
92
|
+
"type": {
|
|
93
|
+
"summary": "CdsButtonSize"
|
|
94
|
+
},
|
|
95
|
+
"defaultValue": {
|
|
96
|
+
"summary": "md"
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
"type": {
|
|
101
|
+
"name": "type",
|
|
102
|
+
"type": {
|
|
103
|
+
"name": "enum",
|
|
104
|
+
"value": [
|
|
105
|
+
"button",
|
|
106
|
+
"submit",
|
|
107
|
+
"reset"
|
|
108
|
+
]
|
|
109
|
+
},
|
|
110
|
+
"table": {
|
|
111
|
+
"category": "inputs",
|
|
112
|
+
"type": {
|
|
113
|
+
"summary": "\"button\" | \"submit\" | \"reset\""
|
|
114
|
+
},
|
|
115
|
+
"defaultValue": {
|
|
116
|
+
"summary": "button"
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
"variant": {
|
|
121
|
+
"name": "variant",
|
|
122
|
+
"description": "Visuelle Variante → .btn-filled / .btn-tonal / .btn-elevated / .btn-outlined /\n .btn-text; `filled-on-band` → .btn-filled + .btn-on-band (invertiert).",
|
|
123
|
+
"type": {
|
|
124
|
+
"name": "enum",
|
|
125
|
+
"value": [
|
|
126
|
+
"filled",
|
|
127
|
+
"tonal",
|
|
128
|
+
"elevated",
|
|
129
|
+
"outlined",
|
|
130
|
+
"text",
|
|
131
|
+
"filled-on-band"
|
|
132
|
+
]
|
|
133
|
+
},
|
|
134
|
+
"table": {
|
|
135
|
+
"category": "inputs",
|
|
136
|
+
"type": {
|
|
137
|
+
"summary": "CdsButtonVariant"
|
|
138
|
+
},
|
|
139
|
+
"defaultValue": {
|
|
140
|
+
"summary": "filled"
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
"clicked": {
|
|
145
|
+
"name": "clicked",
|
|
146
|
+
"description": "Klick auf den Button (feuert nicht, wenn `disabled`).",
|
|
147
|
+
"type": {
|
|
148
|
+
"name": "other",
|
|
149
|
+
"value": "void"
|
|
150
|
+
},
|
|
151
|
+
"action": "clicked",
|
|
152
|
+
"table": {
|
|
153
|
+
"category": "outputs",
|
|
154
|
+
"type": {
|
|
155
|
+
"summary": "MouseEvent"
|
|
156
|
+
},
|
|
157
|
+
"defaultValue": {}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
},
|
|
161
|
+
"apiDescription": "## Inputs\n\n```\nexport type ButtonComponentInputs = {\n /**\n * Markenbereich → .btn-co / .btn-ki / .btn-es / .btn-wo\n *\n * @default co\n */\n area?: CdsArea;\n /** @default false */\n disabled?: boolean;\n /**\n * Volle Breite → .btn-full (Host wird block, damit 100% greifen).\n *\n * @default false\n */\n full?: boolean;\n /**\n * Sichtbarer Text des Buttons.\n *\n * @default Button\n */\n label?: string;\n /**\n * Größe → .btn-sm / (md = Default) / .btn-lg\n *\n * @default md\n */\n size?: CdsButtonSize;\n /** @default button */\n type?: \"button\" | \"submit\" | \"reset\";\n /**\n * Visuelle Variante → .btn-filled / .btn-tonal / .btn-elevated / .btn-outlined /\n * .btn-text; `filled-on-band` → .btn-filled + .btn-on-band (invertiert).\n *\n * @default filled\n */\n variant?: CdsButtonVariant;\n}\n```\n\n## Outputs\n\n```\nexport type ButtonComponentOutputs = {\n /** Klick auf den Button (feuert nicht, wenn `disabled`). */\n clicked: MouseEvent;\n}\n```",
|
|
162
|
+
"renderer": "angular",
|
|
163
|
+
"angularComponentMeta": {
|
|
164
|
+
"name": "ButtonComponent",
|
|
165
|
+
"selector": "cds-button",
|
|
166
|
+
"standalone": true,
|
|
167
|
+
"inputs": [
|
|
168
|
+
"area",
|
|
169
|
+
"disabled",
|
|
170
|
+
"full",
|
|
171
|
+
"label",
|
|
172
|
+
"size",
|
|
173
|
+
"type",
|
|
174
|
+
"variant"
|
|
175
|
+
],
|
|
176
|
+
"outputs": [
|
|
177
|
+
"clicked"
|
|
178
|
+
],
|
|
179
|
+
"enums": []
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
{
|
|
2
|
+
"components": {
|
|
3
|
+
"komponenten-call-to-action-cta-band": {
|
|
4
|
+
"id": "komponenten-call-to-action-cta-band",
|
|
5
|
+
"name": "CtaBandComponent",
|
|
6
|
+
"path": "./src/lib/cta-band/cta-band.stories.ts",
|
|
7
|
+
"description": "CtaBand (`[cdsCtaBand]`) — Wrapper um `.ep-cta-band` aus css/components.css\n(css/components.css:1456, Kopf-Duo `.ep-cta-h2`/`.ep-cta-sub` ebenda): das\nbereichsgefärbte Page-End-CTA-Band, das laut Doku-Site (`docs/index.html:6237`,\nAnker `gt-cta-band`) am Ende jeder Customer-Page direkt vor dem Footer steht — die\n„letzte Einladung“, wenn die Nutzerin die Seite durchgelesen hat. Ausgezählt: 22\nVorkommen auf den Beispielseiten, ausnahmslos als `<div class=\"ep-cta-band\"\nstyle=\"background:…\">` mit genau einer Aktion.\n\n**Entscheidung 1 — Attributselektor, kein eigenes Element (ADR-0008, derselbe\n„Fläche am Host“-Fall wie `cds-section`).** `css/components.css` trägt für\n`.ep-cta-band` KEIN `[data-area]` (per Grep geprüft, keine einzige Regel dieser\nForm existiert). Die Bandfläche kommt in allen 22 Vorkommen als Inline-Style\nDIREKT am `.ep-cta-band`-Element (`style=\"background:var(--co-700);color:#fff\"`,\ndocs/index.html:6304 u. a.), dem Bereich der Page folgend, nie aus einem\n`data-area`-Attribut. Ein Element-Selektor würde exakt den in ADR-0008 „Fall 2“\ngemessenen Fehler wiederholen: der `<cds-cta-band>`-Host ist ein unbekanntes\nCustom Element (`display:inline`), sein einziges Kind würde als Block\nherausgebrochen, ein am Host gesetzter Inline-`background` hätte keine eigene Box\nzum Malen. Die Komponente hängt sich deshalb als Attribut an ein vom Konsumenten\ngeschriebenes `<div>` (`<div cdsCtaBand style=\"background:…\">`) — das Element, das\nden Style trägt, und `.ep-cta-band` sind derselbe Knoten. Nur `<div>`, kein\n`<section>`-Zwilling wie bei `cds-section`: alle 22 Vorkommen benutzen\nausnahmslos ein `<div>`, keines variiert das Tag.\n\n**Entscheidung 2 — `area` färbt nur die Aktion, nicht das Band.** Aus demselben\nGrund wie bei `cds-section` (siehe dessen Klassendoku, Entscheidung 2) bleibt die\nBandfläche Sache des Konsumenten: welche Bereichsfarbe ein Band trägt, ist eine\nEntscheidung der Seite (Bereichszugehörigkeit der Customer-Page), keine\nBauteil-Eigenschaft — und das CSS bietet an dieser Klasse ohnehin keinen\n`[data-area]`-Haken an (siehe Entscheidung 1). `area` steuert deshalb\nausschließlich die Button-Farbklasse (`.btn-{area}`), nicht die Füllung des Bands.\n\n**Entscheidung 3 — `.btn-on-band` + `.btn-filled` direkt komponiert, nicht über\n`cds-button` projiziert.** `cds-button` KENNT den Modifier\n(`variant=\"filled-on-band\"`, geprüft über `npx storybook tools docs show --id\nkomponenten-buttons-button` — die Story „Auf Bereichs-Band“ existiert dort\nbereits). Trotzdem baut diese Komponente die `.btn`-Klassen direkt zusammen\n(Präzedenzfall `download-cta.component.ts`), aus einem härteren Grund als dort:\n`cds-button` rendert IMMER ein `<button>` — sein Input-Vertrag\n(`ButtonComponentInputs`) kennt kein `href` — und kann die vom Ticket geforderte\nVerzweigung „`primaryHref` gesetzt → `<a>`“ strukturell gar nicht erfüllen. Ein\nprojiziertes `<cds-button>` brächte hier also kein Custom-Element-Layoutproblem\n(kein Kindselektor an `.ep-cta-band` hängt von der DOM-Tiefe ab), sondern schlicht\ndie falsche Fähigkeit.\n\n**Entscheidung 4 — bewusst nur EINE Aktion, kein `secondaryLabel`.** Eine frühere\nFassung bot `secondaryLabel`/`secondaryHref` an, ungeprüft gegen das Mockup. Beide\nBelege dagegen: erstens zeigt KEINES der 22 `.ep-cta-band`-Vorkommen in\n`docs/index.html` eine zweite Aktion — der Zwei-Aktionen-Fall hat keine Vorlage.\nZweitens (der schwerere Grund) lässt sich eine zweite, optisch zurückhaltendere\nAktion mit den vorhandenen Klassen gar nicht bauen: `.btn-{area}.btn-on-band{color:\n…}` (css/components.css:47–51) überschreibt die Textfarbe JEDER Variante auf den\nBereichston — genau den Ton, den die Doku durchgängig als Bandhintergrund nennt.\nNur `.btn-filled` tauscht zusätzlich die Füllung gegen Weiß; `.btn-outlined`,\n`.btn-tonal` und `.btn-text` blieben transparent und zeigten Text in derselben\nFarbe wie das Band darunter — unsichtbar. Eine zweite Aktion hätte deshalb\nzwangsläufig dieselbe Optik wie die erste getragen, keine Hierarchie, nur zwei\ngleich gewichtete Buttons. Das ist eine CSS-Lücke (kein kontrastsicherer\nsekundärer On-Band-Stil), festgehalten in\n`.scratch/angular-seitenbausteine/issues/16-css-luecke-zweite-aktion-auf-band.md`\n— gemeldet, nicht in diesem Wrapper improvisiert. Solange sie besteht, trägt\n`cds-cta-band` nur eine Aktion; ein Konsument mit echtem Bedarf für eine zweite\nschreibt sie außerhalb der Komponente ins Band hinein (`<ng-content>` gibt es\nhier bewusst nicht, um genau das nicht als unterstützten Pfad zu suggerieren).\nOhne zweite Aktion braucht es auch keinen eigenen Container: die einzelne Aktion\nzentriert sich über das ererbte `.ep-cta-band{text-align:center}` von selbst,\ngenau wie in allen 22 Mockup-Vorkommen — ein zusätzliches Flex-Layout im Wrapper\nhätte eine Darstellung erfunden, die die CSS-Schicht so nicht kennt (ADR-0001;\ndie einzige existierende Deklaration dieser Form ist `.ep-hero-ctas`,\ncss/components.css:1222, eine andere Klasse für einen anderen Bauteiltyp).\n\n**Kein `aria-label` auf der Aktion.** Anders als bei `cds-feature`\n(`ctaAriaLabel`, 11 von 12 Vorkommen mit `aria-label`) zeigt keines der 22\nBand-Vorkommen einen `aria-label` auf seiner Aktion — ausgezählt, nicht\ngeschätzt. Die sichtbaren Texte sind durchgängig konkrete Verben mit Ziel\n(„Termin buchen“, „Gespräch anfragen“, „Offene Stellen ansehen“ …) und stehen je\nSeite nur einmal; anders als bei einer Karten-Liste braucht es hier keine\nDisambiguierung. Kein entsprechender Input.",
|
|
8
|
+
"jsDocTags": {},
|
|
9
|
+
"argTypes": {
|
|
10
|
+
"area": {
|
|
11
|
+
"name": "area",
|
|
12
|
+
"description": "Markenbereich → `.btn-{area}` auf der Aktion (nicht die Bandfläche, siehe Klassendoku).",
|
|
13
|
+
"type": {
|
|
14
|
+
"name": "enum",
|
|
15
|
+
"value": [
|
|
16
|
+
"co",
|
|
17
|
+
"ki",
|
|
18
|
+
"es",
|
|
19
|
+
"wo"
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
"table": {
|
|
23
|
+
"category": "inputs",
|
|
24
|
+
"type": {
|
|
25
|
+
"summary": "CdsArea"
|
|
26
|
+
},
|
|
27
|
+
"defaultValue": {
|
|
28
|
+
"summary": "co"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"heading": {
|
|
33
|
+
"name": "heading",
|
|
34
|
+
"description": "Headline (`.ep-cta-h2`) — das konkrete Angebot, keine Marketing-Floskel.",
|
|
35
|
+
"type": {
|
|
36
|
+
"name": "string",
|
|
37
|
+
"required": true
|
|
38
|
+
},
|
|
39
|
+
"table": {
|
|
40
|
+
"category": "inputs",
|
|
41
|
+
"type": {
|
|
42
|
+
"summary": "string"
|
|
43
|
+
},
|
|
44
|
+
"defaultValue": {}
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"primaryHref": {
|
|
48
|
+
"name": "primaryHref",
|
|
49
|
+
"description": "Ziel der Aktion; gesetzt → `<a href>`, leer → `<button>` mit `primaryClick`.",
|
|
50
|
+
"type": {
|
|
51
|
+
"name": "string"
|
|
52
|
+
},
|
|
53
|
+
"table": {
|
|
54
|
+
"category": "inputs",
|
|
55
|
+
"type": {
|
|
56
|
+
"summary": "string"
|
|
57
|
+
},
|
|
58
|
+
"defaultValue": {
|
|
59
|
+
"summary": ""
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
"primaryLabel": {
|
|
64
|
+
"name": "primaryLabel",
|
|
65
|
+
"description": "Beschriftung der (einzigen) Aktion.",
|
|
66
|
+
"type": {
|
|
67
|
+
"name": "string",
|
|
68
|
+
"required": true
|
|
69
|
+
},
|
|
70
|
+
"table": {
|
|
71
|
+
"category": "inputs",
|
|
72
|
+
"type": {
|
|
73
|
+
"summary": "string"
|
|
74
|
+
},
|
|
75
|
+
"defaultValue": {}
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
"sub": {
|
|
79
|
+
"name": "sub",
|
|
80
|
+
"description": "Unterzeile (`.ep-cta-sub`, leer = keine Unterzeile).",
|
|
81
|
+
"type": {
|
|
82
|
+
"name": "string"
|
|
83
|
+
},
|
|
84
|
+
"table": {
|
|
85
|
+
"category": "inputs",
|
|
86
|
+
"type": {
|
|
87
|
+
"summary": "string"
|
|
88
|
+
},
|
|
89
|
+
"defaultValue": {
|
|
90
|
+
"summary": ""
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
"primaryClick": {
|
|
95
|
+
"name": "primaryClick",
|
|
96
|
+
"description": "Klick auf die Aktion (feuert nur, wenn `primaryHref` leer ist).",
|
|
97
|
+
"type": {
|
|
98
|
+
"name": "other",
|
|
99
|
+
"value": "void"
|
|
100
|
+
},
|
|
101
|
+
"action": "primaryClick",
|
|
102
|
+
"table": {
|
|
103
|
+
"category": "outputs",
|
|
104
|
+
"type": {
|
|
105
|
+
"summary": "MouseEvent"
|
|
106
|
+
},
|
|
107
|
+
"defaultValue": {}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
"apiDescription": "## Inputs\n\n```\nexport type CtaBandComponentInputs = {\n /**\n * Markenbereich → `.btn-{area}` auf der Aktion (nicht die Bandfläche, siehe Klassendoku).\n *\n * @default co\n */\n area?: CdsArea;\n /** Headline (`.ep-cta-h2`) — das konkrete Angebot, keine Marketing-Floskel. */\n heading: string;\n /**\n * Ziel der Aktion; gesetzt → `<a href>`, leer → `<button>` mit `primaryClick`.\n *\n * @default ''\n */\n primaryHref?: string;\n /** Beschriftung der (einzigen) Aktion. */\n primaryLabel: string;\n /**\n * Unterzeile (`.ep-cta-sub`, leer = keine Unterzeile).\n *\n * @default ''\n */\n sub?: string;\n}\n```\n\n## Outputs\n\n```\nexport type CtaBandComponentOutputs = {\n /** Klick auf die Aktion (feuert nur, wenn `primaryHref` leer ist). */\n primaryClick: MouseEvent;\n}\n```",
|
|
112
|
+
"renderer": "angular",
|
|
113
|
+
"angularComponentMeta": {
|
|
114
|
+
"name": "CtaBandComponent",
|
|
115
|
+
"selector": "div[cdsCtaBand]",
|
|
116
|
+
"standalone": true,
|
|
117
|
+
"inputs": [
|
|
118
|
+
"area",
|
|
119
|
+
"heading",
|
|
120
|
+
"primaryHref",
|
|
121
|
+
"primaryLabel",
|
|
122
|
+
"sub"
|
|
123
|
+
],
|
|
124
|
+
"outputs": [
|
|
125
|
+
"primaryClick"
|
|
126
|
+
],
|
|
127
|
+
"enums": []
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
{
|
|
2
|
+
"components": {
|
|
3
|
+
"komponenten-call-to-action-downloadcta": {
|
|
4
|
+
"id": "komponenten-call-to-action-downloadcta",
|
|
5
|
+
"name": "DownloadCtaComponent",
|
|
6
|
+
"path": "./src/lib/download-cta/download-cta.stories.ts",
|
|
7
|
+
"description": "DownloadCta — Wrapper um `.cta-dl` aus css/components.css → „Download CTA“.\n\nAufmerksamkeitsstarker Download-Block mit bereichsgefärbtem Top-Akzent + Icon\n(data-area), Eyebrow/Titel/Beschreibung/Meta und zwei Aktionen (primär/sekundär,\nüber die bestehenden `.btn`-Klassen). Konsumiert nur vorhandene Styles.",
|
|
8
|
+
"jsDocTags": {},
|
|
9
|
+
"argTypes": {
|
|
10
|
+
"area": {
|
|
11
|
+
"name": "area",
|
|
12
|
+
"description": "Markenbereich → data-area (Top-Akzent, Icon-Tönung, Button-Farbe).",
|
|
13
|
+
"type": {
|
|
14
|
+
"name": "enum",
|
|
15
|
+
"value": [
|
|
16
|
+
"co",
|
|
17
|
+
"ki",
|
|
18
|
+
"es",
|
|
19
|
+
"wo"
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
"table": {
|
|
23
|
+
"category": "inputs",
|
|
24
|
+
"type": {
|
|
25
|
+
"summary": "CdsArea"
|
|
26
|
+
},
|
|
27
|
+
"defaultValue": {
|
|
28
|
+
"summary": "co"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"desc": {
|
|
33
|
+
"name": "desc",
|
|
34
|
+
"description": "Beschreibungstext unterhalb des Titels (leer = keine Beschreibung).",
|
|
35
|
+
"type": {
|
|
36
|
+
"name": "string"
|
|
37
|
+
},
|
|
38
|
+
"table": {
|
|
39
|
+
"category": "inputs",
|
|
40
|
+
"type": {
|
|
41
|
+
"summary": "string"
|
|
42
|
+
},
|
|
43
|
+
"defaultValue": {
|
|
44
|
+
"summary": ""
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"eyebrow": {
|
|
49
|
+
"name": "eyebrow",
|
|
50
|
+
"description": "Kicker-Text oberhalb des Titels (leer = keine Eyebrow-Zeile).",
|
|
51
|
+
"type": {
|
|
52
|
+
"name": "string"
|
|
53
|
+
},
|
|
54
|
+
"table": {
|
|
55
|
+
"category": "inputs",
|
|
56
|
+
"type": {
|
|
57
|
+
"summary": "string"
|
|
58
|
+
},
|
|
59
|
+
"defaultValue": {
|
|
60
|
+
"summary": ""
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
"meta": {
|
|
65
|
+
"name": "meta",
|
|
66
|
+
"description": "Zusatzinfo unterhalb der Beschreibung, z. B. Dateiformat/-größe (leer = keine Meta-Zeile).",
|
|
67
|
+
"type": {
|
|
68
|
+
"name": "string"
|
|
69
|
+
},
|
|
70
|
+
"table": {
|
|
71
|
+
"category": "inputs",
|
|
72
|
+
"type": {
|
|
73
|
+
"summary": "string"
|
|
74
|
+
},
|
|
75
|
+
"defaultValue": {
|
|
76
|
+
"summary": ""
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
"primaryLabel": {
|
|
81
|
+
"name": "primaryLabel",
|
|
82
|
+
"description": "Beschriftung der primären Aktion.",
|
|
83
|
+
"type": {
|
|
84
|
+
"name": "string",
|
|
85
|
+
"required": true
|
|
86
|
+
},
|
|
87
|
+
"table": {
|
|
88
|
+
"category": "inputs",
|
|
89
|
+
"type": {
|
|
90
|
+
"summary": "string"
|
|
91
|
+
},
|
|
92
|
+
"defaultValue": {}
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
"secondaryLabel": {
|
|
96
|
+
"name": "secondaryLabel",
|
|
97
|
+
"description": "Beschriftung der sekundären Aktion (leer = ausgeblendet).",
|
|
98
|
+
"type": {
|
|
99
|
+
"name": "string"
|
|
100
|
+
},
|
|
101
|
+
"table": {
|
|
102
|
+
"category": "inputs",
|
|
103
|
+
"type": {
|
|
104
|
+
"summary": "string"
|
|
105
|
+
},
|
|
106
|
+
"defaultValue": {
|
|
107
|
+
"summary": ""
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
"title": {
|
|
112
|
+
"name": "title",
|
|
113
|
+
"description": "Titel des Download-Angebots.",
|
|
114
|
+
"type": {
|
|
115
|
+
"name": "string",
|
|
116
|
+
"required": true
|
|
117
|
+
},
|
|
118
|
+
"table": {
|
|
119
|
+
"category": "inputs",
|
|
120
|
+
"type": {
|
|
121
|
+
"summary": "string"
|
|
122
|
+
},
|
|
123
|
+
"defaultValue": {}
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
"primaryClick": {
|
|
127
|
+
"name": "primaryClick",
|
|
128
|
+
"description": "Klick auf die primäre Aktion (Haupt-CTA).",
|
|
129
|
+
"type": {
|
|
130
|
+
"name": "other",
|
|
131
|
+
"value": "void"
|
|
132
|
+
},
|
|
133
|
+
"action": "primaryClick",
|
|
134
|
+
"table": {
|
|
135
|
+
"category": "outputs",
|
|
136
|
+
"type": {
|
|
137
|
+
"summary": "MouseEvent"
|
|
138
|
+
},
|
|
139
|
+
"defaultValue": {}
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
"secondaryClick": {
|
|
143
|
+
"name": "secondaryClick",
|
|
144
|
+
"description": "Klick auf die sekundäre Aktion (nur wenn `secondaryLabel` gesetzt ist).",
|
|
145
|
+
"type": {
|
|
146
|
+
"name": "other",
|
|
147
|
+
"value": "void"
|
|
148
|
+
},
|
|
149
|
+
"action": "secondaryClick",
|
|
150
|
+
"table": {
|
|
151
|
+
"category": "outputs",
|
|
152
|
+
"type": {
|
|
153
|
+
"summary": "MouseEvent"
|
|
154
|
+
},
|
|
155
|
+
"defaultValue": {}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
"apiDescription": "## Inputs\n\n```\nexport type DownloadCtaComponentInputs = {\n /**\n * Markenbereich → data-area (Top-Akzent, Icon-Tönung, Button-Farbe).\n *\n * @default co\n */\n area?: CdsArea;\n /**\n * Beschreibungstext unterhalb des Titels (leer = keine Beschreibung).\n *\n * @default ''\n */\n desc?: string;\n /**\n * Kicker-Text oberhalb des Titels (leer = keine Eyebrow-Zeile).\n *\n * @default ''\n */\n eyebrow?: string;\n /**\n * Zusatzinfo unterhalb der Beschreibung, z. B. Dateiformat/-größe (leer = keine Meta-Zeile).\n *\n * @default ''\n */\n meta?: string;\n /** Beschriftung der primären Aktion. */\n primaryLabel: string;\n /**\n * Beschriftung der sekundären Aktion (leer = ausgeblendet).\n *\n * @default ''\n */\n secondaryLabel?: string;\n /** Titel des Download-Angebots. */\n title: string;\n}\n```\n\n## Outputs\n\n```\nexport type DownloadCtaComponentOutputs = {\n /** Klick auf die primäre Aktion (Haupt-CTA). */\n primaryClick: MouseEvent;\n /** Klick auf die sekundäre Aktion (nur wenn `secondaryLabel` gesetzt ist). */\n secondaryClick: MouseEvent;\n}\n```",
|
|
160
|
+
"renderer": "angular",
|
|
161
|
+
"angularComponentMeta": {
|
|
162
|
+
"name": "DownloadCtaComponent",
|
|
163
|
+
"selector": "cds-download-cta",
|
|
164
|
+
"standalone": true,
|
|
165
|
+
"inputs": [
|
|
166
|
+
"area",
|
|
167
|
+
"desc",
|
|
168
|
+
"eyebrow",
|
|
169
|
+
"meta",
|
|
170
|
+
"primaryLabel",
|
|
171
|
+
"secondaryLabel",
|
|
172
|
+
"title"
|
|
173
|
+
],
|
|
174
|
+
"outputs": [
|
|
175
|
+
"primaryClick",
|
|
176
|
+
"secondaryClick"
|
|
177
|
+
],
|
|
178
|
+
"enums": []
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|