@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.
Files changed (157) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +59 -0
  3. package/bin/cds-mcp.mjs +9 -0
  4. package/package.json +48 -0
  5. package/snapshot/manifests/components.json +617 -0
  6. package/snapshot/manifests/docs.json +293 -0
  7. package/snapshot/services/addon-docs/mdx/beispielseiten-/303/274bersicht--/303/274bersicht.json +18 -0
  8. package/snapshot/services/addon-docs/mdx/grundlagen-barrierefreiheit--/303/274bersicht.json +18 -0
  9. package/snapshot/services/addon-docs/mdx/grundlagen-design-tokens--/303/274bersicht.json +18 -0
  10. package/snapshot/services/addon-docs/mdx/grundlagen-einrichtung--/303/274bersicht.json +18 -0
  11. package/snapshot/services/addon-docs/mdx/grundlagen-elevation--/303/274bersicht.json +18 -0
  12. package/snapshot/services/addon-docs/mdx/grundlagen-icons--/303/274bersicht.json +18 -0
  13. package/snapshot/services/addon-docs/mdx/grundlagen-responsive--/303/274bersicht.json +18 -0
  14. package/snapshot/services/addon-docs/mdx/grundlagen-spacing-grid--/303/274bersicht.json +18 -0
  15. package/snapshot/services/addon-docs/mdx/komponenten-buchungsformular--/303/274bersicht.json +18 -0
  16. package/snapshot/services/addon-docs/mdx/komponenten-buttons--verwendung.json +18 -0
  17. package/snapshot/services/addon-docs/mdx/komponenten-call-to-action--verwendung.json +18 -0
  18. package/snapshot/services/addon-docs/mdx/komponenten-cards-teaser--verwendung.json +18 -0
  19. package/snapshot/services/addon-docs/mdx/komponenten-chips-badges-pills--verwendung.json +18 -0
  20. package/snapshot/services/addon-docs/mdx/komponenten-code-block--verwendung.json +18 -0
  21. package/snapshot/services/addon-docs/mdx/komponenten-dropdowns--verwendung.json +18 -0
  22. package/snapshot/services/addon-docs/mdx/komponenten-feedback--verwendung.json +18 -0
  23. package/snapshot/services/addon-docs/mdx/komponenten-footer--verwendung.json +18 -0
  24. package/snapshot/services/addon-docs/mdx/komponenten-hero--/303/274bersicht.json +18 -0
  25. package/snapshot/services/addon-docs/mdx/komponenten-inputs-forms--verwendung.json +18 -0
  26. package/snapshot/services/addon-docs/mdx/komponenten-navigation--verwendung.json +18 -0
  27. package/snapshot/services/addon-docs/mdx/komponenten-sektion--/303/274bersicht.json +18 -0
  28. package/snapshot/services/addon-docs/mdx/komponenten-slider-carousel--verwendung.json +18 -0
  29. package/snapshot/services/addon-docs/mdx/komponenten-tabelle--/303/274bersicht.json +18 -0
  30. package/snapshot/services/addon-docs/mdx/komponenten-theme-umschalter--verwendung.json +18 -0
  31. package/snapshot/services/addon-docs/mdx/komponenten-zitate-testimonials--verwendung.json +18 -0
  32. package/snapshot/services/addon-docs/mdx/marke-bildsprache--/303/274bersicht.json +18 -0
  33. package/snapshot/services/addon-docs/mdx/marke-brand-areas--/303/274bersicht.json +18 -0
  34. package/snapshot/services/addon-docs/mdx/marke-logo--verwendung.json +18 -0
  35. package/snapshot/services/addon-docs/mdx/marke-markenrad--/303/274bersicht.json +18 -0
  36. package/snapshot/services/addon-docs/mdx/referenzen-quellen--/303/274bersicht.json +18 -0
  37. package/snapshot/services/addon-docs/mdx/seitenmuster-angebots-detailseite--/303/274bersicht.json +18 -0
  38. package/snapshot/services/addon-docs/mdx/seitenmuster-beitrags/303/274bersicht--/303/274bersicht.json +18 -0
  39. package/snapshot/services/addon-docs/mdx/seitenmuster-seminar-/302/267-training--/303/274bersicht.json +18 -0
  40. package/snapshot/services/addon-docs/mdx/seitenmuster-veranstaltung--/303/274bersicht.json +18 -0
  41. package/snapshot/services/addon-docs/mdx/seitenmuster-veranstaltungs/303/274bersicht--/303/274bersicht.json +18 -0
  42. package/snapshot/services/addon-docs/mdx/seitenmuster-wissensbeitrag--/303/274bersicht.json +18 -0
  43. package/snapshot/services/core/docgen/grundlagen-farben.json +3 -0
  44. package/snapshot/services/core/docgen/grundlagen-typografie.json +3 -0
  45. package/snapshot/services/core/docgen/komponenten-buttons-button.json +183 -0
  46. package/snapshot/services/core/docgen/komponenten-call-to-action-cta-band.json +131 -0
  47. package/snapshot/services/core/docgen/komponenten-call-to-action-downloadcta.json +182 -0
  48. package/snapshot/services/core/docgen/komponenten-cards-teaser-card.json +146 -0
  49. package/snapshot/services/core/docgen/komponenten-cards-teaser-feature-liste.json +128 -0
  50. package/snapshot/services/core/docgen/komponenten-cards-teaser-featured-karte.json +158 -0
  51. package/snapshot/services/core/docgen/komponenten-cards-teaser-icon-karte.json +111 -0
  52. package/snapshot/services/core/docgen/komponenten-cards-teaser-klickbare-karte.json +161 -0
  53. package/snapshot/services/core/docgen/komponenten-cards-teaser-statcard.json +115 -0
  54. package/snapshot/services/core/docgen/komponenten-cards-teaser-statstrip.json +58 -0
  55. package/snapshot/services/core/docgen/komponenten-cards-teaser-tier-trenner.json +56 -0
  56. package/snapshot/services/core/docgen/komponenten-chips-badges-pills-bereichs-badge.json +63 -0
  57. package/snapshot/services/core/docgen/komponenten-chips-badges-pills-chip.json +95 -0
  58. package/snapshot/services/core/docgen/komponenten-chips-badges-pills-pill.json +78 -0
  59. package/snapshot/services/core/docgen/komponenten-chips-badges-pills-status-badge.json +63 -0
  60. package/snapshot/services/core/docgen/komponenten-code-block-code-block.json +91 -0
  61. package/snapshot/services/core/docgen/komponenten-dropdowns-combobox.json +224 -0
  62. package/snapshot/services/core/docgen/komponenten-dropdowns-custom-select.json +173 -0
  63. package/snapshot/services/core/docgen/komponenten-feedback-snackbar.json +97 -0
  64. package/snapshot/services/core/docgen/komponenten-footer-komplett.json +21 -0
  65. package/snapshot/services/core/docgen/komponenten-footer-oberer-teil.json +39 -0
  66. package/snapshot/services/core/docgen/komponenten-footer-unterer-teil.json +105 -0
  67. package/snapshot/services/core/docgen/komponenten-hero-hero-bild.json +162 -0
  68. package/snapshot/services/core/docgen/komponenten-hero-st/303/266rer.json +41 -0
  69. package/snapshot/services/core/docgen/komponenten-inputs-forms-auswahlfeld.json +192 -0
  70. package/snapshot/services/core/docgen/komponenten-inputs-forms-checkbox.json +182 -0
  71. package/snapshot/services/core/docgen/komponenten-inputs-forms-radio.json +181 -0
  72. package/snapshot/services/core/docgen/komponenten-inputs-forms-skala.json +179 -0
  73. package/snapshot/services/core/docgen/komponenten-inputs-forms-slider.json +259 -0
  74. package/snapshot/services/core/docgen/komponenten-inputs-forms-textbereich.json +190 -0
  75. package/snapshot/services/core/docgen/komponenten-inputs-forms-textfeld.json +207 -0
  76. package/snapshot/services/core/docgen/komponenten-navigation-topnav.json +186 -0
  77. package/snapshot/services/core/docgen/komponenten-sektion-sektion.json +113 -0
  78. package/snapshot/services/core/docgen/komponenten-slider-carousel-carousel.json +92 -0
  79. package/snapshot/services/core/docgen/komponenten-slider-carousel-logocarousel.json +92 -0
  80. package/snapshot/services/core/docgen/komponenten-tabelle-tabelle.json +74 -0
  81. package/snapshot/services/core/docgen/komponenten-tabelle-vergleichstabelle.json +142 -0
  82. package/snapshot/services/core/docgen/komponenten-theme-umschalter-cycle-button.json +41 -0
  83. package/snapshot/services/core/docgen/komponenten-theme-umschalter-dropdown.json +41 -0
  84. package/snapshot/services/core/docgen/komponenten-theme-umschalter-segment.json +41 -0
  85. package/snapshot/services/core/docgen/komponenten-zitate-testimonials-blockquote.json +96 -0
  86. package/snapshot/services/core/docgen/komponenten-zitate-testimonials-teamvoice.json +130 -0
  87. package/snapshot/services/core/docgen/komponenten-zitate-testimonials-testimonial.json +96 -0
  88. package/snapshot/services/core/docgen/marke-brand-areas-areatabs.json +75 -0
  89. package/snapshot/services/core/docgen/marke-logo-logo.json +71 -0
  90. package/snapshot/services/core/docgen/seitenmuster-seminar-/302/267-training-fakten-liste.json +79 -0
  91. package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-article-header.json +196 -0
  92. package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-author-card.json +91 -0
  93. package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-avatar.json +100 -0
  94. package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-callout.json +64 -0
  95. package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-faq.json +41 -0
  96. package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-figure.json +73 -0
  97. package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-inhaltsverzeichnis.json +75 -0
  98. package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-pull-quote.json +63 -0
  99. package/snapshot/services/core/story-docs/grundlagen-farben.json +19 -0
  100. package/snapshot/services/core/story-docs/grundlagen-typografie.json +25 -0
  101. package/snapshot/services/core/story-docs/komponenten-buttons-button.json +48 -0
  102. package/snapshot/services/core/story-docs/komponenten-call-to-action-cta-band.json +27 -0
  103. package/snapshot/services/core/story-docs/komponenten-call-to-action-downloadcta.json +17 -0
  104. package/snapshot/services/core/story-docs/komponenten-cards-teaser-card.json +37 -0
  105. package/snapshot/services/core/story-docs/komponenten-cards-teaser-feature-liste.json +37 -0
  106. package/snapshot/services/core/story-docs/komponenten-cards-teaser-featured-karte.json +36 -0
  107. package/snapshot/services/core/story-docs/komponenten-cards-teaser-icon-karte.json +41 -0
  108. package/snapshot/services/core/story-docs/komponenten-cards-teaser-klickbare-karte.json +26 -0
  109. package/snapshot/services/core/story-docs/komponenten-cards-teaser-statcard.json +21 -0
  110. package/snapshot/services/core/story-docs/komponenten-cards-teaser-statstrip.json +21 -0
  111. package/snapshot/services/core/story-docs/komponenten-cards-teaser-tier-trenner.json +22 -0
  112. package/snapshot/services/core/story-docs/komponenten-chips-badges-pills-bereichs-badge.json +21 -0
  113. package/snapshot/services/core/story-docs/komponenten-chips-badges-pills-chip.json +27 -0
  114. package/snapshot/services/core/story-docs/komponenten-chips-badges-pills-pill.json +21 -0
  115. package/snapshot/services/core/story-docs/komponenten-chips-badges-pills-status-badge.json +21 -0
  116. package/snapshot/services/core/story-docs/komponenten-code-block-code-block.json +26 -0
  117. package/snapshot/services/core/story-docs/komponenten-dropdowns-combobox.json +37 -0
  118. package/snapshot/services/core/story-docs/komponenten-dropdowns-custom-select.json +37 -0
  119. package/snapshot/services/core/story-docs/komponenten-feedback-snackbar.json +27 -0
  120. package/snapshot/services/core/story-docs/komponenten-footer-komplett.json +22 -0
  121. package/snapshot/services/core/story-docs/komponenten-footer-oberer-teil.json +21 -0
  122. package/snapshot/services/core/story-docs/komponenten-footer-unterer-teil.json +32 -0
  123. package/snapshot/services/core/story-docs/komponenten-hero-hero-bild.json +37 -0
  124. package/snapshot/services/core/story-docs/komponenten-hero-st/303/266rer.json +26 -0
  125. package/snapshot/services/core/story-docs/komponenten-inputs-forms-auswahlfeld.json +32 -0
  126. package/snapshot/services/core/story-docs/komponenten-inputs-forms-checkbox.json +32 -0
  127. package/snapshot/services/core/story-docs/komponenten-inputs-forms-radio.json +32 -0
  128. package/snapshot/services/core/story-docs/komponenten-inputs-forms-skala.json +42 -0
  129. package/snapshot/services/core/story-docs/komponenten-inputs-forms-slider.json +37 -0
  130. package/snapshot/services/core/story-docs/komponenten-inputs-forms-textbereich.json +27 -0
  131. package/snapshot/services/core/story-docs/komponenten-inputs-forms-textfeld.json +32 -0
  132. package/snapshot/services/core/story-docs/komponenten-navigation-topnav.json +26 -0
  133. package/snapshot/services/core/story-docs/komponenten-sektion-sektion.json +41 -0
  134. package/snapshot/services/core/story-docs/komponenten-slider-carousel-carousel.json +31 -0
  135. package/snapshot/services/core/story-docs/komponenten-slider-carousel-logocarousel.json +27 -0
  136. package/snapshot/services/core/story-docs/komponenten-tabelle-tabelle.json +36 -0
  137. package/snapshot/services/core/story-docs/komponenten-tabelle-vergleichstabelle.json +32 -0
  138. package/snapshot/services/core/story-docs/komponenten-theme-umschalter-cycle-button.json +31 -0
  139. package/snapshot/services/core/story-docs/komponenten-theme-umschalter-dropdown.json +26 -0
  140. package/snapshot/services/core/story-docs/komponenten-theme-umschalter-segment.json +26 -0
  141. package/snapshot/services/core/story-docs/komponenten-zitate-testimonials-blockquote.json +21 -0
  142. package/snapshot/services/core/story-docs/komponenten-zitate-testimonials-teamvoice.json +21 -0
  143. package/snapshot/services/core/story-docs/komponenten-zitate-testimonials-testimonial.json +21 -0
  144. package/snapshot/services/core/story-docs/marke-brand-areas-areatabs.json +26 -0
  145. package/snapshot/services/core/story-docs/marke-logo-logo.json +23 -0
  146. package/snapshot/services/core/story-docs/seitenmuster-seminar-/302/267-training-fakten-liste.json +21 -0
  147. package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-article-header.json +37 -0
  148. package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-author-card.json +31 -0
  149. package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-avatar.json +32 -0
  150. package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-callout.json +26 -0
  151. package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-faq.json +27 -0
  152. package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-figure.json +22 -0
  153. package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-inhaltsverzeichnis.json +27 -0
  154. package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-pull-quote.json +21 -0
  155. package/src/instructions.mjs +38 -0
  156. package/src/server.mjs +111 -0
  157. package/src/version-check.mjs +80 -0
@@ -0,0 +1,39 @@
1
+ {
2
+ "components": {
3
+ "komponenten-footer-oberer-teil": {
4
+ "id": "komponenten-footer-oberer-teil",
5
+ "name": "FooterMainComponent",
6
+ "path": "./src/lib/footer/footer-main.stories.ts",
7
+ "description": "Footer — oberer Teil (`.footer-main`): helles Band als **generisches Spalten-Layout**.\nDer Inhalt wird als beliebige Spalten projiziert (jedes Top-Level-Kind = eine\nGrid-Spalte), statt fester Adresse/Nav/Newsletter-Struktur — so eignet es sich für\nWebsite- UND App-Footer ohne Marketing-Lock-in.\n\n```html\n<cds-footer-main>\n <div>…Spalte 1…</div>\n <div>…Spalte 2…</div>\n</cds-footer-main>\n```\n\nDie Host-Klasse `footer-main` trägt Hintergrund/Padding aus css/components.css;\n`:host{display:block}` macht das Band auch standalone zum Block. Spaltenanzahl/-breiten\nüber `columns` (grid-template-columns); ohne Angabe gilt das 3-Spalten-Default.",
8
+ "jsDocTags": {},
9
+ "argTypes": {
10
+ "columns": {
11
+ "name": "columns",
12
+ "description": "Optionale `grid-template-columns` (z. B. `'repeat(4, 1fr)'` oder `'2fr 1fr'`).\nOhne Angabe gilt das Default aus `.footer-grid` (1.2fr 1fr 1.3fr, 3 Spalten).",
13
+ "type": {
14
+ "name": "string"
15
+ },
16
+ "table": {
17
+ "category": "inputs",
18
+ "type": {
19
+ "summary": "string"
20
+ },
21
+ "defaultValue": {}
22
+ }
23
+ }
24
+ },
25
+ "apiDescription": "## Inputs\n\n```\nexport type FooterMainComponentInputs = {\n /**\n * Optionale `grid-template-columns` (z. B. `'repeat(4, 1fr)'` oder `'2fr 1fr'`).\n * Ohne Angabe gilt das Default aus `.footer-grid` (1.2fr 1fr 1.3fr, 3 Spalten).\n */\n columns?: string;\n}\n```",
26
+ "renderer": "angular",
27
+ "angularComponentMeta": {
28
+ "name": "FooterMainComponent",
29
+ "selector": "cds-footer-main",
30
+ "standalone": true,
31
+ "inputs": [
32
+ "columns"
33
+ ],
34
+ "outputs": [],
35
+ "enums": []
36
+ }
37
+ }
38
+ }
39
+ }
@@ -0,0 +1,105 @@
1
+ {
2
+ "components": {
3
+ "komponenten-footer-unterer-teil": {
4
+ "id": "komponenten-footer-unterer-teil",
5
+ "name": "FooterBottomComponent",
6
+ "path": "./src/lib/footer/footer-bottom.stories.ts",
7
+ "description": "Footer — unterer Teil (`.footer-btm`): dunkler Streifen mit Copyright, Rechts-Links\nund Social-Profilen. Die Host-Klasse `footer-btm` trägt Hintergrund/Flex-Layout aus\ncss/components.css. Social-Glyphen sind schlanke Inline-SVGs in Weiß; verifizierte\nBuilt-in-Icons (linkedin, youtube) via `platform`, beliebige weitere via `iconPath`.",
8
+ "jsDocTags": {},
9
+ "argTypes": {
10
+ "copyright": {
11
+ "name": "copyright",
12
+ "type": {
13
+ "name": "string"
14
+ },
15
+ "table": {
16
+ "category": "inputs",
17
+ "type": {
18
+ "summary": "string"
19
+ },
20
+ "defaultValue": {
21
+ "summary": "© 2026 Conciso GmbH · Dortmund"
22
+ }
23
+ }
24
+ },
25
+ "legalLinks": {
26
+ "name": "legalLinks",
27
+ "type": {
28
+ "name": "other",
29
+ "value": "empty-enum"
30
+ },
31
+ "table": {
32
+ "category": "inputs",
33
+ "type": {
34
+ "summary": "CdsFooterLink[]"
35
+ },
36
+ "defaultValue": {
37
+ "summary": "[\n { label: 'Datenschutz', href: '#' },\n { label: 'Impressum', href: '#' },\n ]"
38
+ }
39
+ }
40
+ },
41
+ "socialLinks": {
42
+ "name": "socialLinks",
43
+ "type": {
44
+ "name": "other",
45
+ "value": "empty-enum"
46
+ },
47
+ "table": {
48
+ "category": "inputs",
49
+ "type": {
50
+ "summary": "CdsSocialLink[]"
51
+ },
52
+ "defaultValue": {
53
+ "summary": "[\n { platform: 'linkedin', href: '#' },\n { platform: 'youtube', href: '#' },\n ]"
54
+ }
55
+ }
56
+ },
57
+ "support": {
58
+ "name": "support",
59
+ "description": "Optionaler Support-/Hilfe-Link neben den Rechts-Links.",
60
+ "type": {
61
+ "name": "other",
62
+ "value": "empty-enum"
63
+ },
64
+ "table": {
65
+ "category": "inputs",
66
+ "type": {
67
+ "summary": "CdsFooterLink"
68
+ },
69
+ "defaultValue": {}
70
+ }
71
+ },
72
+ "version": {
73
+ "name": "version",
74
+ "description": "Optionale Versionsangabe (z. B. „Version 1.4.2“), hinter dem Copyright.",
75
+ "type": {
76
+ "name": "string"
77
+ },
78
+ "table": {
79
+ "category": "inputs",
80
+ "type": {
81
+ "summary": "string"
82
+ },
83
+ "defaultValue": {}
84
+ }
85
+ }
86
+ },
87
+ "apiDescription": "## Inputs\n\n```\nexport type FooterBottomComponentInputs = {\n /** @default © 2026 Conciso GmbH · Dortmund */\n copyright?: string;\n /**\n * @default [\n * { label: 'Datenschutz', href: '#' },\n * { label: 'Impressum', href: '#' },\n * ]\n */\n legalLinks?: CdsFooterLink[];\n /**\n * @default [\n * { platform: 'linkedin', href: '#' },\n * { platform: 'youtube', href: '#' },\n * ]\n */\n socialLinks?: CdsSocialLink[];\n /** Optionaler Support-/Hilfe-Link neben den Rechts-Links. */\n support?: CdsFooterLink;\n /** Optionale Versionsangabe (z. B. „Version 1.4.2“), hinter dem Copyright. */\n version?: string;\n}\n```",
88
+ "renderer": "angular",
89
+ "angularComponentMeta": {
90
+ "name": "FooterBottomComponent",
91
+ "selector": "cds-footer-bottom",
92
+ "standalone": true,
93
+ "inputs": [
94
+ "copyright",
95
+ "legalLinks",
96
+ "socialLinks",
97
+ "support",
98
+ "version"
99
+ ],
100
+ "outputs": [],
101
+ "enums": []
102
+ }
103
+ }
104
+ }
105
+ }
@@ -0,0 +1,162 @@
1
+ {
2
+ "components": {
3
+ "komponenten-hero-hero-bild": {
4
+ "id": "komponenten-hero-hero-bild",
5
+ "name": "HeroImageComponent",
6
+ "path": "./src/lib/hero-image/hero-image.stories.ts",
7
+ "description": "HeroImage (cds-hero-image) — Wrapper um `.hero-image` aus css/components.css\n(css/components.css:851–878) mit optionaler Caption als Gradient-Overlay\n(`-caption`, `-caption-eyebrow`, `-caption-title`, `-caption-text`). Vollbreites,\nrandloses `<figure>` im 21:9-Format, der Standard-Hero auf allen Customer-Pages\n(17 Vorkommen in den Beispielseiten). Semantisch ein figure/figcaption-Pattern:\n`alt` trägt die faktische Bildbeschreibung, die Caption die redaktionelle\nEinordnung (Eyebrow, Titel, Text) — beide sollen sich nach `docs/index.html`\n(Abschnitt „In-Article Figure“, dasselbe Prinzip) nicht inhaltlich decken.\n\n**Entscheidung 1 — kein `<figcaption>` ohne Textinhalt.** Bleiben `eyebrow`,\n`heading` und `text` alle leer, entfällt das `<figcaption>`-Element vollständig\nstatt leer zu rendern (Variante „Hero ohne Caption“, siehe\n`storybook-angular/src/docs/seitenmuster/wissensbeitrag.mdx` Abschnitt „Aufbau“,\nZeile 3: Beitrags-Heros zeigen das visuelle Versprechen ohne Marketing-Overlay).\nEin leeres `<figcaption>` wäre totes Markup ohne Zugänglichkeitsnutzen.\n\n**Entscheidung 2 — `headingLevel` statt fest verdrahtetem `<h1>`.** Das Mockup\n(`docs/index.html:9412` u. a.) rendert `.hero-image-caption-title` durchgehend als\n`<h1>`, weil der Hero dort das erste Überschriften-Element der Seite ist. Sitzt\nder Hero dagegen unter einem eigenen `<h1>` — der Wissensbeitrag hat seinen\nTitel bereits im Article-Header (`.article-title`, ebenfalls `<h1>`) —, entstünde\nmit einem zweiten `<h1>` eine doppelte Top-Überschrift. `headingLevel` (Default\n`1`) macht die Ebene explizit, `.hero-image-caption-title` ist reine CSS-Klasse\nund trägt keine Heading-Semantik, das Styling bleibt in beiden Fällen identisch.\n\n**Entscheidung 3 — `objectPosition` als Style-Binding, die eine Ausnahme von\nSpec-Randbedingung 6.** Der Bildausschnitt ist eine Eigenschaft des konkreten\nBildes (Motiv, Kopfposition), nicht der Seite — anders als z. B. eine\nSektionsfläche, die vom Seitenkontext abhängt. `docs/index.html` setzt ihn\ndeshalb an jedem Hero individuell direkt am `<img>` (z. B. `object-position:center\n70%`, Zeile 2640). Ohne diesen Input wäre die Komponente für Porträt-lastige\nMotive unbrauchbar: `object-fit:cover` beschneidet das Bild sobald der\n`max-height`-Cap greift (siehe `.hero-image-media`), und ohne Steuerung landet\nder Ausschnitt zufällig in der Bildmitte. Als Style-Binding am `<img>`, nicht als\nKlasse — es gibt in der CSS-Schicht keine Modifier-Klassen dafür, nur den\nInline-Weg, den das Mockup selbst nutzt.\n\n**Entscheidung 4 — `tabindex`/`id` sind nicht Teil der Komponente.** Das Mockup\nsetzt beides am `<figure>` (`id=\"ep-landing-main\" tabindex=\"-1\"`, z. B. Zeile\n9406) als Sprungziel des Skip-Links. Das Sprungziel ist eine Entscheidung der\nSeite (welches Element „Hauptinhalt“ ist, hängt vom Seitenaufbau ab, nicht vom\nHero selbst), deshalb setzt der Konsument beides am `<cds-hero-image>`-Host.\nDamit dieses Sprungziel eine eigene Box hat, ist der Host per\n`:host{display:block}` selbst ein Block (Muster wie `cds-footer-main`): Als\nunbekanntes Element wäre er `display:inline` mit herausgebrochenem Block-Kind\nund hätte keine brauchbare Box für Fokus und Scroll-Position (ADR-0008, Fall 2).",
8
+ "jsDocTags": {},
9
+ "argTypes": {
10
+ "alt": {
11
+ "name": "alt",
12
+ "description": "Alternativtext — Pflicht, das Bild trägt Bedeutung (kein dekoratives Hero-Bild).",
13
+ "type": {
14
+ "name": "string",
15
+ "required": true
16
+ },
17
+ "table": {
18
+ "category": "inputs",
19
+ "type": {
20
+ "summary": "string"
21
+ },
22
+ "defaultValue": {}
23
+ }
24
+ },
25
+ "eager": {
26
+ "name": "eager",
27
+ "description": "`loading`-Strategie des Bildes: `true` (Standard) rendert `loading=\"eager\"`,\nweil der Hero auf Customer-Pages immer above the fold sitzt. `false` für einen\nzweiten, weiter unten liegenden Hero (z. B. innerhalb einer Bildstrecke).",
28
+ "type": {
29
+ "name": "boolean"
30
+ },
31
+ "table": {
32
+ "category": "inputs",
33
+ "type": {
34
+ "summary": "boolean"
35
+ },
36
+ "defaultValue": {
37
+ "summary": true
38
+ }
39
+ }
40
+ },
41
+ "eyebrow": {
42
+ "name": "eyebrow",
43
+ "description": "Eyebrow-Zeile über dem Titel (`.hero-image-caption-eyebrow`, leer = keine Zeile).",
44
+ "type": {
45
+ "name": "string"
46
+ },
47
+ "table": {
48
+ "category": "inputs",
49
+ "type": {
50
+ "summary": "string"
51
+ },
52
+ "defaultValue": {
53
+ "summary": ""
54
+ }
55
+ }
56
+ },
57
+ "heading": {
58
+ "name": "heading",
59
+ "description": "Titel der Caption (`.hero-image-caption-title`, leer = kein Titel).",
60
+ "type": {
61
+ "name": "string"
62
+ },
63
+ "table": {
64
+ "category": "inputs",
65
+ "type": {
66
+ "summary": "string"
67
+ },
68
+ "defaultValue": {
69
+ "summary": ""
70
+ }
71
+ }
72
+ },
73
+ "headingLevel": {
74
+ "name": "headingLevel",
75
+ "description": "Heading-Ebene des gerenderten Titels: `1`, wenn der Hero die erste Überschrift\nder Seite trägt (Standard auf Customer-Pages), `2`, wenn er unter einem\neigenen `<h1>` sitzt (Beitrags-Hero unter dem Article-Header, siehe\nEntscheidung 2 in der Klassendoku).",
76
+ "type": {
77
+ "name": "enum",
78
+ "value": [
79
+ 1,
80
+ 2
81
+ ]
82
+ },
83
+ "table": {
84
+ "category": "inputs",
85
+ "type": {
86
+ "summary": "1 | 2"
87
+ },
88
+ "defaultValue": {
89
+ "summary": 1
90
+ }
91
+ }
92
+ },
93
+ "objectPosition": {
94
+ "name": "objectPosition",
95
+ "description": "`object-position` direkt am `<img>` (z. B. `'center 70%'`), siehe Entscheidung 3\nin der Klassendoku. Leer = Browser-Default `center center`.",
96
+ "type": {
97
+ "name": "string"
98
+ },
99
+ "table": {
100
+ "category": "inputs",
101
+ "type": {
102
+ "summary": "string"
103
+ },
104
+ "defaultValue": {
105
+ "summary": ""
106
+ }
107
+ }
108
+ },
109
+ "src": {
110
+ "name": "src",
111
+ "description": "Bildquelle.",
112
+ "type": {
113
+ "name": "string",
114
+ "required": true
115
+ },
116
+ "table": {
117
+ "category": "inputs",
118
+ "type": {
119
+ "summary": "string"
120
+ },
121
+ "defaultValue": {}
122
+ }
123
+ },
124
+ "text": {
125
+ "name": "text",
126
+ "description": "Text unter dem Titel (`.hero-image-caption-text`, leer = kein Text).",
127
+ "type": {
128
+ "name": "string"
129
+ },
130
+ "table": {
131
+ "category": "inputs",
132
+ "type": {
133
+ "summary": "string"
134
+ },
135
+ "defaultValue": {
136
+ "summary": ""
137
+ }
138
+ }
139
+ }
140
+ },
141
+ "apiDescription": "## Inputs\n\n```\nexport type HeroImageComponentInputs = {\n /** Alternativtext — Pflicht, das Bild trägt Bedeutung (kein dekoratives Hero-Bild). */\n alt: string;\n /**\n * `loading`-Strategie des Bildes: `true` (Standard) rendert `loading=\"eager\"`,\n * weil der Hero auf Customer-Pages immer above the fold sitzt. `false` für einen\n * zweiten, weiter unten liegenden Hero (z. B. innerhalb einer Bildstrecke).\n *\n * @default true\n */\n eager?: boolean;\n /**\n * Eyebrow-Zeile über dem Titel (`.hero-image-caption-eyebrow`, leer = keine Zeile).\n *\n * @default ''\n */\n eyebrow?: string;\n /**\n * Titel der Caption (`.hero-image-caption-title`, leer = kein Titel).\n *\n * @default ''\n */\n heading?: string;\n /**\n * Heading-Ebene des gerenderten Titels: `1`, wenn der Hero die erste Überschrift\n * der Seite trägt (Standard auf Customer-Pages), `2`, wenn er unter einem\n * eigenen `<h1>` sitzt (Beitrags-Hero unter dem Article-Header, siehe\n * Entscheidung 2 in der Klassendoku).\n *\n * @default 1\n */\n headingLevel?: 1 | 2;\n /**\n * `object-position` direkt am `<img>` (z. B. `'center 70%'`), siehe Entscheidung 3\n * in der Klassendoku. Leer = Browser-Default `center center`.\n *\n * @default ''\n */\n objectPosition?: string;\n /** Bildquelle. */\n src: string;\n /**\n * Text unter dem Titel (`.hero-image-caption-text`, leer = kein Text).\n *\n * @default ''\n */\n text?: string;\n}\n```",
142
+ "renderer": "angular",
143
+ "angularComponentMeta": {
144
+ "name": "HeroImageComponent",
145
+ "selector": "cds-hero-image",
146
+ "standalone": true,
147
+ "inputs": [
148
+ "alt",
149
+ "eager",
150
+ "eyebrow",
151
+ "heading",
152
+ "headingLevel",
153
+ "objectPosition",
154
+ "src",
155
+ "text"
156
+ ],
157
+ "outputs": [],
158
+ "enums": []
159
+ }
160
+ }
161
+ }
162
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "components": {
3
+ "komponenten-hero-störer": {
4
+ "id": "komponenten-hero-störer",
5
+ "name": "StoererSetComponent",
6
+ "path": "./src/lib/stoerer/stoerer.stories.ts",
7
+ "description": "StoererSet (cds-stoerer-set) — Wrapper um `.stoerer-set` / `.stoerer-list` aus\ncss/components.css (css/components.css:926–974): das Set aus ein bis drei\n`<cds-stoerer>`-Kacheln, das auf der Startseite oben rechts über dem Hero-Bild\nliegt. Der Positionsrahmen `.stoerer-hero` (umschließt Hero-Bild UND Set,\n`container-type:inline-size` für die Container-Query-Schwelle) ist bewusst NICHT\nTeil dieser Komponente, sondern bleibt beim Konsumenten (siehe\n`.scratch/angular-seitenbausteine/issues/03-stoerer.md`): er umschließt Hero UND\nSet gemeinsam, das könnte diese Komponente als internes Detail nicht leisten, ohne\ndas Hero-Bild selbst zu kennen.\n\n**Entscheidung — `<li>` ohne strukturelles Wrapper-Element.** `.stoerer-list` ist\nein `<ul>`; nach HTML-AAM bekommt ein `<li>` die implizite Rolle `listitem` nur als\ndirektes Kind eines `<ul>`/`<ol>`/`<menu>` — Screenreader kündigen die Liste sonst\nnicht mit Anzahl an. Ein einfaches `<ng-content>` hätte `<cds-stoerer>` selbst\nzwischen `<ul>` und `<li>` geschoben (kein direktes Kind mehr), und ein\n`display:contents`-Wrapper verbietet sich als neues CSS (ADR-0001). Gelöst über\ndasselbe Muster, das `cds-area-tabs`/`cds-area-tab` bereits für „projizierte\nKind-Komponente, deren Markup an einer selbst bestimmten Stelle im eigenen Template\nlandet“ etabliert (`area-tabs/area-tabs.component.ts`): `cds-stoerer` rendert nicht\nin sich selbst, sondern in ein `<ng-template>` und liefert es als `TemplateRef`\n(`stoerer.component.ts`). Diese Komponente liest die projizierten `<cds-stoerer>`\nüber `contentChildren()` und setzt ihr Template per `ngTemplateOutlet` direkt in\nein selbst gerendertes `<li>` ein. Im laufenden Storybook geprüft (`Komponenten/Hero/\nStörer` → Story „Interaktiv“, DOM live im Browser per `querySelector` abgefragt,\nzusätzlich in der Play-Funktion der Story gepinnt): `<ul class=\"stoerer-list\">`\nhat ausschließlich `<li>` als direkte Kinder (`ul.stoerer-list > *` → `[\"LI\",\"LI\"]`),\n`<cds-stoerer>` selbst taucht im gerenderten DOM nirgends auf — Angular hängt\nunprojizierten Content ohne passendes `<ng-content>`-Ziel gar nicht erst ein, exakt\nwie bei `<cds-area-tab>` innerhalb von `<cds-area-tabs>`. Ein `items`-Array (die im\nTicket vermerkte Alternative) hätte denselben DOM-Baum ergeben, aber den\nKonsumenten gezwungen, das projizierte Icon jeder Kachel in ein Datenobjekt\numzuziehen; mit dieser Lösung bleibt die deklarative, Content-projizierende API\nerhalten.",
8
+ "jsDocTags": {},
9
+ "argTypes": {
10
+ "label": {
11
+ "name": "label",
12
+ "description": "Zugänglicher Name des Sets (`<aside aria-label>`); „Aktuelles“ wie im Mockup.",
13
+ "type": {
14
+ "name": "string"
15
+ },
16
+ "table": {
17
+ "category": "inputs",
18
+ "type": {
19
+ "summary": "string"
20
+ },
21
+ "defaultValue": {
22
+ "summary": "Aktuelles"
23
+ }
24
+ }
25
+ }
26
+ },
27
+ "apiDescription": "## Inputs\n\n```\nexport type StoererSetComponentInputs = {\n /**\n * Zugänglicher Name des Sets (`<aside aria-label>`); „Aktuelles“ wie im Mockup.\n *\n * @default Aktuelles\n */\n label?: string;\n}\n```",
28
+ "renderer": "angular",
29
+ "angularComponentMeta": {
30
+ "name": "StoererSetComponent",
31
+ "selector": "cds-stoerer-set",
32
+ "standalone": true,
33
+ "inputs": [
34
+ "label"
35
+ ],
36
+ "outputs": [],
37
+ "enums": []
38
+ }
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,192 @@
1
+ {
2
+ "components": {
3
+ "komponenten-inputs-forms-auswahlfeld": {
4
+ "id": "komponenten-inputs-forms-auswahlfeld",
5
+ "name": "SelectFieldComponent",
6
+ "path": "./src/lib/field/select-field.stories.ts",
7
+ "description": "Auswahlfeld — `<select>` im `.field`-Gerüst. Die Optionen kommen über `options`;\na11y-Verdrahtung wie beim Textfeld (aria-required/-invalid/-describedby).\n\nAls `ControlValueAccessor` (siehe FieldBase) direkt an Angular-Formulare\nanbindbar (`[(ngModel)]`, `formControlName`) bzw. ohne Formular per `[(value)]`.",
8
+ "jsDocTags": {},
9
+ "argTypes": {
10
+ "disabled": {
11
+ "name": "disabled",
12
+ "description": "Deaktiviert; auch über Angular-Forms (setDisabledState) steuerbar.",
13
+ "type": {
14
+ "name": "boolean"
15
+ },
16
+ "table": {
17
+ "category": "inputs",
18
+ "type": {
19
+ "summary": "boolean"
20
+ },
21
+ "defaultValue": {
22
+ "summary": false
23
+ }
24
+ }
25
+ },
26
+ "error": {
27
+ "name": "error",
28
+ "description": "Gesetzt = Fehlerzustand (.has-error + .error-msg).",
29
+ "type": {
30
+ "name": "string"
31
+ },
32
+ "table": {
33
+ "category": "inputs",
34
+ "type": {
35
+ "summary": "string"
36
+ },
37
+ "defaultValue": {
38
+ "summary": ""
39
+ }
40
+ }
41
+ },
42
+ "fieldId": {
43
+ "name": "fieldId",
44
+ "description": "id für die label/for- und aria-describedby-Verknüpfung. Default eindeutig.",
45
+ "type": {
46
+ "name": "string"
47
+ },
48
+ "table": {
49
+ "category": "inputs",
50
+ "type": {
51
+ "summary": "string"
52
+ },
53
+ "defaultValue": {}
54
+ }
55
+ },
56
+ "helper": {
57
+ "name": "helper",
58
+ "description": "Optionaler Hilfetext unter dem Feld.",
59
+ "type": {
60
+ "name": "string"
61
+ },
62
+ "table": {
63
+ "category": "inputs",
64
+ "type": {
65
+ "summary": "string"
66
+ },
67
+ "defaultValue": {
68
+ "summary": ""
69
+ }
70
+ }
71
+ },
72
+ "label": {
73
+ "name": "label",
74
+ "description": "Sichtbares Label.",
75
+ "type": {
76
+ "name": "string"
77
+ },
78
+ "table": {
79
+ "category": "inputs",
80
+ "type": {
81
+ "summary": "string"
82
+ },
83
+ "defaultValue": {
84
+ "summary": ""
85
+ }
86
+ }
87
+ },
88
+ "options": {
89
+ "name": "options",
90
+ "description": "Auswahloptionen (erste dient üblicherweise als Platzhalter, z. B. „Bitte wählen“).",
91
+ "type": {
92
+ "name": "other",
93
+ "value": "empty-enum"
94
+ },
95
+ "table": {
96
+ "category": "inputs",
97
+ "type": {
98
+ "summary": "string[]"
99
+ },
100
+ "defaultValue": {
101
+ "summary": "[]"
102
+ }
103
+ }
104
+ },
105
+ "required": {
106
+ "name": "required",
107
+ "description": "Pflichtfeld → .req-Asterisk + aria-required.",
108
+ "type": {
109
+ "name": "boolean"
110
+ },
111
+ "table": {
112
+ "category": "inputs",
113
+ "type": {
114
+ "summary": "boolean"
115
+ },
116
+ "defaultValue": {
117
+ "summary": false
118
+ }
119
+ }
120
+ },
121
+ "value": {
122
+ "name": "value",
123
+ "description": "Feldwert — Two-Way (`[(value)]`) UND Angular-Forms (ngModel/formControlName).",
124
+ "type": {
125
+ "name": "string"
126
+ },
127
+ "table": {
128
+ "category": "inputs",
129
+ "type": {
130
+ "summary": "string"
131
+ },
132
+ "defaultValue": {
133
+ "summary": ""
134
+ }
135
+ }
136
+ },
137
+ "disabledChange": {
138
+ "name": "disabledChange",
139
+ "description": "Deaktiviert; auch über Angular-Forms (setDisabledState) steuerbar.",
140
+ "type": {
141
+ "name": "other",
142
+ "value": "void"
143
+ },
144
+ "action": "disabledChange",
145
+ "table": {
146
+ "category": "outputs",
147
+ "type": {
148
+ "summary": "(e: boolean) => void"
149
+ }
150
+ }
151
+ },
152
+ "valueChange": {
153
+ "name": "valueChange",
154
+ "description": "Feldwert — Two-Way (`[(value)]`) UND Angular-Forms (ngModel/formControlName).",
155
+ "type": {
156
+ "name": "other",
157
+ "value": "void"
158
+ },
159
+ "action": "valueChange",
160
+ "table": {
161
+ "category": "outputs",
162
+ "type": {
163
+ "summary": "(e: string) => void"
164
+ }
165
+ }
166
+ }
167
+ },
168
+ "apiDescription": "## Inputs\n\n```\nexport type SelectFieldComponentInputs = {\n /**\n * Deaktiviert; auch über Angular-Forms (setDisabledState) steuerbar.\n *\n * @default false\n */\n disabled?: boolean; // two-way: [(disabled)]\n /**\n * Gesetzt = Fehlerzustand (.has-error + .error-msg).\n *\n * @default ''\n */\n error?: string;\n /** id für die label/for- und aria-describedby-Verknüpfung. Default eindeutig. */\n fieldId?: string;\n /**\n * Optionaler Hilfetext unter dem Feld.\n *\n * @default ''\n */\n helper?: string;\n /**\n * Sichtbares Label.\n *\n * @default ''\n */\n label?: string;\n /**\n * Auswahloptionen (erste dient üblicherweise als Platzhalter, z. B. „Bitte wählen“).\n *\n * @default []\n */\n options?: string[];\n /**\n * Pflichtfeld → .req-Asterisk + aria-required.\n *\n * @default false\n */\n required?: boolean;\n /**\n * Feldwert — Two-Way (`[(value)]`) UND Angular-Forms (ngModel/formControlName).\n *\n * @default ''\n */\n value?: string; // two-way: [(value)]\n}\n```\n\n## Outputs\n\n```\nexport type SelectFieldComponentOutputs = {\n /** Deaktiviert; auch über Angular-Forms (setDisabledState) steuerbar. */\n disabledChange: (e: boolean) => void;\n /** Feldwert — Two-Way (`[(value)]`) UND Angular-Forms (ngModel/formControlName). */\n valueChange: (e: string) => void;\n}\n```",
169
+ "renderer": "angular",
170
+ "angularComponentMeta": {
171
+ "name": "SelectFieldComponent",
172
+ "selector": "cds-select-field",
173
+ "standalone": true,
174
+ "inputs": [
175
+ "disabled",
176
+ "error",
177
+ "fieldId",
178
+ "helper",
179
+ "label",
180
+ "options",
181
+ "required",
182
+ "value"
183
+ ],
184
+ "outputs": [
185
+ "disabledChange",
186
+ "valueChange"
187
+ ],
188
+ "enums": []
189
+ }
190
+ }
191
+ }
192
+ }