@conciso/design-system 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 (141) hide show
  1. package/CHANGELOG.md +1786 -0
  2. package/LICENSE +21 -0
  3. package/NOTICE +15 -0
  4. package/README.md +134 -0
  5. package/assets/brand/LICENSE +11 -0
  6. package/assets/brand/README.md +45 -0
  7. package/assets/brand/logo-conciso-dark.svg +4 -0
  8. package/assets/brand/logo-conciso-light.svg +4 -0
  9. package/assets/brand/logo-conciso.svg +4 -0
  10. package/css/base.css +303 -0
  11. package/css/components.css +1633 -0
  12. package/css/dark-mode.css +716 -0
  13. package/css/fonts.css +20 -0
  14. package/css/tokens.css +209 -0
  15. package/dist/conciso-ds.css +2891 -0
  16. package/fonts/LibreBaskerville-OFL.txt +93 -0
  17. package/fonts/Montserrat-OFL.txt +93 -0
  18. package/fonts/libre-baskerville-400-latin-ext.woff2 +0 -0
  19. package/fonts/libre-baskerville-400-latin.woff2 +0 -0
  20. package/fonts/libre-baskerville-400i-latin-ext.woff2 +0 -0
  21. package/fonts/libre-baskerville-400i-latin.woff2 +0 -0
  22. package/fonts/libre-baskerville-700-latin-ext.woff2 +0 -0
  23. package/fonts/libre-baskerville-700-latin.woff2 +0 -0
  24. package/fonts/montserrat-300-latin-ext.woff2 +0 -0
  25. package/fonts/montserrat-300-latin.woff2 +0 -0
  26. package/fonts/montserrat-400-latin-ext.woff2 +0 -0
  27. package/fonts/montserrat-400-latin.woff2 +0 -0
  28. package/fonts/montserrat-400i-latin-ext.woff2 +0 -0
  29. package/fonts/montserrat-400i-latin.woff2 +0 -0
  30. package/fonts/montserrat-500-latin-ext.woff2 +0 -0
  31. package/fonts/montserrat-500-latin.woff2 +0 -0
  32. package/fonts/montserrat-700-latin-ext.woff2 +0 -0
  33. package/fonts/montserrat-700-latin.woff2 +0 -0
  34. package/icons/LICENSE-heroicons +21 -0
  35. package/icons/README.md +186 -0
  36. package/icons/icons.js +1156 -0
  37. package/icons/icons.json +1152 -0
  38. package/icons/manifest.json +595 -0
  39. package/icons/source/co-building.svg +1 -0
  40. package/icons/source/co-mark.svg +1 -0
  41. package/icons/source/es-window-check.svg +1 -0
  42. package/icons/source/ki-bot.svg +1 -0
  43. package/icons/source/ui-academic-cap.svg +1 -0
  44. package/icons/source/ui-adjustments-horizontal.svg +1 -0
  45. package/icons/source/ui-arrow-down-tray-2.svg +1 -0
  46. package/icons/source/ui-arrow-down-tray.svg +1 -0
  47. package/icons/source/ui-arrow-path.svg +1 -0
  48. package/icons/source/ui-arrow-trending-up.svg +1 -0
  49. package/icons/source/ui-banknotes.svg +1 -0
  50. package/icons/source/ui-bars-3-center-left.svg +1 -0
  51. package/icons/source/ui-bars-3.svg +1 -0
  52. package/icons/source/ui-bolt-2.svg +1 -0
  53. package/icons/source/ui-bolt.svg +1 -0
  54. package/icons/source/ui-book-open.svg +1 -0
  55. package/icons/source/ui-briefcase-2.svg +1 -0
  56. package/icons/source/ui-briefcase.svg +1 -0
  57. package/icons/source/ui-building-office.svg +1 -0
  58. package/icons/source/ui-calendar-days.svg +1 -0
  59. package/icons/source/ui-calendar.svg +1 -0
  60. package/icons/source/ui-caret-down.svg +1 -0
  61. package/icons/source/ui-chart-bar.svg +1 -0
  62. package/icons/source/ui-chat-bubble-left-right.svg +1 -0
  63. package/icons/source/ui-chat-bubble-oval-left-ellipsis.svg +1 -0
  64. package/icons/source/ui-chat-bubble-oval.svg +1 -0
  65. package/icons/source/ui-check-badge.svg +1 -0
  66. package/icons/source/ui-check-circle-2.svg +1 -0
  67. package/icons/source/ui-check-circle.svg +1 -0
  68. package/icons/source/ui-check.svg +1 -0
  69. package/icons/source/ui-chevron-down.svg +1 -0
  70. package/icons/source/ui-chevron-up-down.svg +1 -0
  71. package/icons/source/ui-circle-stack.svg +1 -0
  72. package/icons/source/ui-clock.svg +1 -0
  73. package/icons/source/ui-code-bracket-2.svg +1 -0
  74. package/icons/source/ui-code-bracket-square.svg +1 -0
  75. package/icons/source/ui-code-bracket.svg +1 -0
  76. package/icons/source/ui-cog-6tooth.svg +1 -0
  77. package/icons/source/ui-cog.svg +1 -0
  78. package/icons/source/ui-computer-desktop.svg +1 -0
  79. package/icons/source/ui-cpu-chip-2.svg +1 -0
  80. package/icons/source/ui-cpu-chip.svg +1 -0
  81. package/icons/source/ui-cube-2.svg +1 -0
  82. package/icons/source/ui-cube-transparent.svg +1 -0
  83. package/icons/source/ui-cube.svg +1 -0
  84. package/icons/source/ui-currency-euro.svg +1 -0
  85. package/icons/source/ui-cursor-arrow-rays.svg +1 -0
  86. package/icons/source/ui-device-phone-mobile.svg +1 -0
  87. package/icons/source/ui-document-text.svg +1 -0
  88. package/icons/source/ui-face-smile.svg +1 -0
  89. package/icons/source/ui-flag.svg +1 -0
  90. package/icons/source/ui-folder.svg +1 -0
  91. package/icons/source/ui-hand-raised.svg +1 -0
  92. package/icons/source/ui-heart.svg +1 -0
  93. package/icons/source/ui-information-circle.svg +1 -0
  94. package/icons/source/ui-language.svg +1 -0
  95. package/icons/source/ui-link.svg +1 -0
  96. package/icons/source/ui-list-bullet.svg +1 -0
  97. package/icons/source/ui-lock-closed-2.svg +1 -0
  98. package/icons/source/ui-lock-closed.svg +1 -0
  99. package/icons/source/ui-magnifying-glass.svg +1 -0
  100. package/icons/source/ui-map-pin-2.svg +1 -0
  101. package/icons/source/ui-map-pin.svg +1 -0
  102. package/icons/source/ui-megaphone.svg +1 -0
  103. package/icons/source/ui-newspaper-2.svg +1 -0
  104. package/icons/source/ui-newspaper.svg +1 -0
  105. package/icons/source/ui-pause.svg +1 -0
  106. package/icons/source/ui-pencil-square.svg +1 -0
  107. package/icons/source/ui-photo.svg +1 -0
  108. package/icons/source/ui-play.svg +1 -0
  109. package/icons/source/ui-puzzle-piece.svg +1 -0
  110. package/icons/source/ui-quote.svg +1 -0
  111. package/icons/source/ui-rectangle-stack.svg +1 -0
  112. package/icons/source/ui-rocket-launch.svg +1 -0
  113. package/icons/source/ui-shield-check-2.svg +1 -0
  114. package/icons/source/ui-shield-check.svg +1 -0
  115. package/icons/source/ui-sparkles-2.svg +1 -0
  116. package/icons/source/ui-sparkles-3.svg +1 -0
  117. package/icons/source/ui-sparkles-4.svg +1 -0
  118. package/icons/source/ui-sparkles.svg +1 -0
  119. package/icons/source/ui-square-2-stack.svg +1 -0
  120. package/icons/source/ui-squares-2x2.svg +1 -0
  121. package/icons/source/ui-squares-plus.svg +1 -0
  122. package/icons/source/ui-star-2.svg +1 -0
  123. package/icons/source/ui-star.svg +1 -0
  124. package/icons/source/ui-sun.svg +1 -0
  125. package/icons/source/ui-swatch.svg +1 -0
  126. package/icons/source/ui-table-cells.svg +1 -0
  127. package/icons/source/ui-tag.svg +1 -0
  128. package/icons/source/ui-trophy-2.svg +1 -0
  129. package/icons/source/ui-trophy.svg +1 -0
  130. package/icons/source/ui-user-group-2.svg +1 -0
  131. package/icons/source/ui-user-group.svg +1 -0
  132. package/icons/source/ui-users-2.svg +1 -0
  133. package/icons/source/ui-users.svg +1 -0
  134. package/icons/source/ui-viewfinder-circle.svg +1 -0
  135. package/icons/source/ui-window.svg +1 -0
  136. package/icons/source/ui-wrench-screwdriver.svg +1 -0
  137. package/icons/source/wo-network.svg +1 -0
  138. package/package.json +87 -0
  139. package/tokens/tokens.js +229 -0
  140. package/tokens/tokens.json +227 -0
  141. package/tokens/tokens.scss +228 -0
package/css/fonts.css ADDED
@@ -0,0 +1,20 @@
1
+ /* Conciso Design System — Self-Host-Fonts (DSGVO: keine Google-CDN-Anfrage).
2
+ Montserrat + Libre Baskerville, Subsets latin + latin-ext, font-display:swap.
3
+ Lizenz: SIL Open Font License 1.1 (siehe fonts/*-OFL.txt). Generiert. */
4
+
5
+ @font-face{font-family:'Libre Baskerville';font-style:italic;font-weight:400;font-display:swap;src:url('../fonts/libre-baskerville-400i-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}
6
+ @font-face{font-family:'Libre Baskerville';font-style:italic;font-weight:400;font-display:swap;src:url('../fonts/libre-baskerville-400i-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}
7
+ @font-face{font-family:'Libre Baskerville';font-style:normal;font-weight:400;font-display:swap;src:url('../fonts/libre-baskerville-400-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}
8
+ @font-face{font-family:'Libre Baskerville';font-style:normal;font-weight:400;font-display:swap;src:url('../fonts/libre-baskerville-400-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}
9
+ @font-face{font-family:'Libre Baskerville';font-style:normal;font-weight:700;font-display:swap;src:url('../fonts/libre-baskerville-700-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}
10
+ @font-face{font-family:'Libre Baskerville';font-style:normal;font-weight:700;font-display:swap;src:url('../fonts/libre-baskerville-700-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}
11
+ @font-face{font-family:'Montserrat';font-style:italic;font-weight:400;font-display:swap;src:url('../fonts/montserrat-400i-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}
12
+ @font-face{font-family:'Montserrat';font-style:italic;font-weight:400;font-display:swap;src:url('../fonts/montserrat-400i-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}
13
+ @font-face{font-family:'Montserrat';font-style:normal;font-weight:300;font-display:swap;src:url('../fonts/montserrat-300-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}
14
+ @font-face{font-family:'Montserrat';font-style:normal;font-weight:300;font-display:swap;src:url('../fonts/montserrat-300-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}
15
+ @font-face{font-family:'Montserrat';font-style:normal;font-weight:400;font-display:swap;src:url('../fonts/montserrat-400-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}
16
+ @font-face{font-family:'Montserrat';font-style:normal;font-weight:400;font-display:swap;src:url('../fonts/montserrat-400-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}
17
+ @font-face{font-family:'Montserrat';font-style:normal;font-weight:500;font-display:swap;src:url('../fonts/montserrat-500-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}
18
+ @font-face{font-family:'Montserrat';font-style:normal;font-weight:500;font-display:swap;src:url('../fonts/montserrat-500-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}
19
+ @font-face{font-family:'Montserrat';font-style:normal;font-weight:700;font-display:swap;src:url('../fonts/montserrat-700-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}
20
+ @font-face{font-family:'Montserrat';font-style:normal;font-weight:700;font-display:swap;src:url('../fonts/montserrat-700-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}
package/css/tokens.css ADDED
@@ -0,0 +1,209 @@
1
+ /* ── Design Tokens ── */
2
+ :root {
3
+ /* ── Corporate (Global Brand) ── */
4
+ --co-500:#00BEBE; --co-50:#E0F7F7; --co-100:#B3ECEC; --co-200:#80DEDE;
5
+ --co-300:#4DD0D0; --co-400:#26C2C2; --co-600:#009E9E; --co-700:#007575;
6
+ --co-800:#004F4F; --co-900:#002B2B; --co-ink:var(--co-700);
7
+
8
+ /* ── AI.Applied ── */
9
+ --ki-500:#B5E61C; --ki-50:#F4FCD5; --ki-100:#E6F8A0; --ki-200:#D6F06D;
10
+ --ki-300:#C8EA42; --ki-400:#BEE82D; --ki-600:#8FAF0E; --ki-700:#6B8208;
11
+ --ki-800:#475705; --ki-900:#242C02; --ki-ink:var(--ki-800); /* farbiger ki-Text/Icons; flippt im Dark auf --ki-200 (dark-mode.css), da ki-800 dunkel-auf-dunkel wäre */
12
+
13
+ /* ── Wirksame Organisationen ── */
14
+ --wo-500:#44A030; --wo-50:#EBF5E6; --wo-100:#CEEAC3; --wo-200:#A3D48E;
15
+ --wo-300:#72BD58; --wo-400:#55AD3F; --wo-600:#347A22; --wo-700:#285E1A;
16
+ --wo-800:#183A0E; --wo-900:#0A1F05; --wo-ink:var(--wo-700);
17
+
18
+ /* ── Effektive Software ── */
19
+ --es-500:#2F5FD4; --es-50:#EAF0FB; --es-100:#C8D9F5; --es-200:#98B7EE;
20
+ --es-300:#6593E5; --es-400:#4677DC; --es-600:#2249B2; --es-700:#1B3D9A;
21
+ --es-800:#112568; --es-900:#071035; --es-ink:var(--es-700);
22
+
23
+ /* ── Bereichs-Akzenttext ──
24
+ --XX-ink ist farbiger Text und farbige Icons, die in BEIDEN Modi lesbar bleiben müssen:
25
+ Light der dunkle Ton (-700, ki -800 weil ki-700 nur 4,05:1 trägt), Dark der helle (-200,
26
+ es -100). Bisher gab es das nur für ki, und genau deshalb ist bei jeder Korrektur die Gefahr,
27
+ eine Light-Farbe zu setzen, die im Dark dunkel-auf-dunkel läuft: co-700 trägt auf Weiß 5,52:1
28
+ und auf der dunklen Seite nur 3,17:1. Wer farbigen Text setzt, nimmt --XX-ink. */
29
+
30
+ /* ── Rosé ── */
31
+ --ro-500:#C23060; --ro-50:#FDEDF2; --ro-100:#F9CEDD; --ro-200:#F0A0BE;
32
+ --ro-300:#E06898; --ro-400:#CF4478; --ro-600:#A02050; --ro-700:#7E1639;
33
+ --ro-800:#560E26; --ro-900:#2E0513;
34
+
35
+ /* ── Bereichs-Bänder ──
36
+ --XX-band ist die Fläche großer getönter Sektionen (Hero, CTA-Band). Im Light identisch mit
37
+ --XX-50, es gibt also nichts zu unterscheiden. Getrennt wird es erst im Dark: dort muss ein
38
+ Band dunkler bleiben als die Karten, die darauf sitzen, während eine Badge- oder Kachel-Füllung
39
+ umgekehrt heller als ihr Grund sein muss, um überhaupt als Fläche zu lesen. Ein Wert kann
40
+ beides nicht leisten, deshalb zwei Token. */
41
+ --co-band:var(--co-50); --ki-band:var(--ki-50); --es-band:var(--es-50); --wo-band:var(--wo-50);
42
+
43
+ /* ── Bauteil-Füllungen ──
44
+ --XX-fill ist die Füllung von Pill und Bereichs-Badge. Im Light ist das der ruhige Tint, also
45
+ dasselbe Rezept wie bei den Icon-Kacheln: zarte Fläche, kräftige dunkle Schrift darauf
46
+ (7,5 bis 11,4:1). WCAG verlangt für diese Fläche nichts, das Label trägt die Aussage, und
47
+ darüber entscheidet das Markenrad: „Ruhig“. Die Schrift wirkt auf dem zarten Grund kräftiger,
48
+ weil sie nicht mit der Fläche konkurriert.
49
+ Getrennt wird es erst im Dark: dort liegt helle Schrift auf dunklem Tint, und wenn der Tint
50
+ fast die Helligkeit der Karte hat, hält nichts mehr die Pill zusammen. Deshalb dort eigene,
51
+ gehobene Werte (siehe dark-mode.css). Gleiche Rolle, zwei Werte, wie bei --XX-band.
52
+ Kein --ro-fill: Rosé ist Akzent- und Statusfarbe, es gibt weder ro-Pill noch ro-Badge.
53
+
54
+ Abgrenzung nach oben und unten: --XX-50 bleibt der RUHIGE Tint, in beiden Modi. Er trägt
55
+ dekorative Flächen (Icon-Kachel, Timeline-Marker, Hover-Füllung des Chips, Inline-Code), die
56
+ nicht als Fläche lesen müssen: WCAG verlangt dort nichts, und das Markenrad sagt „Ruhig“.
57
+ --XX-band ist die große Sektionsfläche. Drei Rollen, drei Namen. */
58
+ --co-fill:var(--co-50); --ki-fill:var(--ki-50); --es-fill:var(--es-50); --wo-fill:var(--wo-50);
59
+
60
+
61
+ /* ── Neutrals ── */
62
+ --n-0:#FFFFFF; --n-50:#F5F7F7; --n-100:#E8EDED; --n-200:#C9D3D3;
63
+ --n-300:#A0B0B0; --n-400:#6E8585; --n-500:#4A6565; --n-600:#2E4545;
64
+ --n-700:#1A2E2E; --n-800:#0D1F1F; --n-900:#060F0F;
65
+
66
+ /* ── Semantic ──
67
+ --c-* sind Text-Farben (Required-Asterisk, Inline-Fehlertext, Do/Don't-Marker).
68
+ Werte sind in beiden Modi auf AA-Lesbarkeit auf der jeweiligen page-bg ausgelegt.
69
+ Light: dunklere/gedeckte Sättigung für Kontrast auf weiß. Dark-Overrides in dark-mode.css.
70
+ --c-*-bg sind Tint-Hintergründe für Callouts; Text darauf via --badge-*-text. */
71
+ /* Die -bg-Tints sind Bauteil-Füllungen (Callout, Status-Badge, Trend-Chip) und müssen als FLÄCHE
72
+ lesen: 1,3:1 gegen Weiß UND gegen n-50 (CONTRIBUTING § 3). Die alten Werte lagen bei 1,02 bis
73
+ 1,16:1, das Element las nur noch als farbiger Text. Neu gemessen Fläche Weiß / n-50 und Text
74
+ darauf: success 1,43 / 1,33 mit 4,91:1 · warning 1,47 / 1,37 mit 4,84:1 · error 1,60 / 1,49
75
+ mit 4,99:1. Beim Warnton musste der Text mitwandern (--badge-warn-text), auf der kräftigeren
76
+ Füllung trug #8A5E0A nur 3,87:1. */
77
+ --c-success:#0E6644; --c-success-bg:#A9E5C8; /* Text auf #fff: 6.99:1 ✓ AAA */
78
+ --c-warning:#785008; --c-warning-bg:#F5D08C; /* Text auf #fff 7,12:1, auf dem eigenen Tint 4,84:1 (vorher #8A5E0A: 5,70 bzw. nur 3,87:1) */
79
+ --c-error:#9B2020; --c-error-bg:#F5BFBF; /* Text auf #fff 8,01:1, auf dem eigenen Tint 4,99:1 (vorher #B22020: 6,73 bzw. nur 4,19:1) */
80
+
81
+ /* ── Component color tokens (theme-overridable) ── */
82
+ --badge-ok-text:var(--c-success); --badge-warn-text:var(--c-warning); --badge-err-text:var(--c-error); /* dieselben Töne wie die semantischen Textfarben: sie stehen auf denselben Tints, zwei Werte dafür wären zwei Quellen der Wahrheit */
83
+ --badge-neu-bg:var(--n-200); --badge-neu-text:var(--n-600); /* n-200 statt n-100: als Füllung trug n-100 nur 1,18:1 gegen Weiß und 1,10:1 gegen n-50, n-200 gibt 1,53 / 1,42:1. Text darauf 6,69:1 */
84
+ --cbadge-aa-bg:#E6F9F1; --cbadge-aa-text:#0a5c38;
85
+ --cbadge-aaa-bg:#D0F0FF; --cbadge-aaa-text:#004466;
86
+ --cbadge-fail-bg:#FDEAEA; --cbadge-fail-text:#9b2020;
87
+
88
+ /* ── Surfaces & Text ── */
89
+ --bg-page:#FFFFFF; --bg-surface:var(--n-0); --bg-overlay:rgba(0,94,94,.06); --bg-code:var(--n-800);
90
+ /* --bg-surface-hover: gehobene Fläche interaktiver Elemente im Hover. Light bewusst gleich
91
+ --bg-surface: auf weißem Grund trägt die Tiefe der Schatten (--e3), eine Aufhellung gäbe es
92
+ nicht. Im Dark trägt der Schatten weniger, dort hebt der Zustand zusätzlich die Fläche.
93
+ Es ist ein Zustand, keine dritte statische Flächen-Stufe. */
94
+ --bg-surface-hover:var(--bg-surface);
95
+ /* --bg-plate: helle Platte unter Fremd-Assets, die nur in einer dunklen Fassung vorliegen
96
+ (Kundenlogos). Im Dark gedämpft statt reinweiß, weil eine reinweiße Fläche dieser Größe
97
+ auf dunklem Grund blendet. */
98
+ --bg-plate:#FFFFFF;
99
+ --tx-brand:#333E48; --tx-primary:#333E48; --tx-secondary:var(--n-500); --tx-muted:#5A7171; /* Auf Weiß 5,20:1, auf n-50 4,84:1, auf getönten Hellflächen 4,66 bis 4,73:1.
100
+ Vorher #5E7676: auf Weiß 4,85:1 ✓, aber auf n-50 und getönten Gründen nur 4,35 bis 4,51:1, also
101
+ genau dort unter AA, wo gedämpfter Text meist sitzt (Meta-Zeilen, Annotationen, Specimen-Labels).
102
+ Bleibt klar heller als --tx-secondary (#4A6565, 5,63 bis 6,29:1), die Hierarchie bleibt also. */
103
+
104
+ /* ── Typography ── */
105
+ --font:'Montserrat','Segoe UI',system-ui,-apple-system,sans-serif;
106
+ --font-display:'Libre Baskerville','Georgia',serif;
107
+ /* --font-mono: dritte Schriftrolle des Systems (Code/Werte), bisher zehnmal hart im CSS.
108
+ Wert unverändert übernommen, reiner Struktur-Schritt, keine gerenderte Änderung. */
109
+ --font-mono:'Courier New',monospace;
110
+
111
+ /* ── Typography Scale ──
112
+ Einheiten rem-basiert (Juli 2026, WCAG 1.4.4 "Resize Text"): 1rem = 16px bei Default-Root
113
+ (body: font-size:16px). Umrechnung px→rem = px/16. rem respektiert die vom Nutzer im Browser
114
+ eingestellte Standardschriftgröße; px täte das nicht.
115
+ Minimum-Font-Size systemweit: 12 px = 0.75rem. Das Minimum gilt bei Default-Root und skaliert
116
+ bei größerer Nutzereinstellung nach oben. Tokens darunter wurden eliminiert oder angehoben,
117
+ damit Inhalte unter allen Bedingungen gut lesbar bleiben (Bildschirm, Mobile, Print). */
118
+ /* Sans-serif (Montserrat)
119
+ Body-Skala (Mai 2026): 16 / 14 / 12 px. Body Md ist Standard-Fließtext (war 14, jetzt 16
120
+ für bessere Lesbarkeit auf C-Level-Mittelstand-Zielgruppe und iOS-Auto-Zoom-Fix bei Form-Inputs).
121
+ Body Sm = 14 px für Meta-Daten/Card-Meta. Body Xs = 12 px für Captions. */
122
+ --ty-caption: 400 0.75rem/1rem var(--font);
123
+ --ty-body-xs: 400 0.75rem/1rem var(--font);
124
+ --ty-body-sm: 400 0.875rem/1.25rem var(--font);
125
+ --ty-body-md: 400 1rem/1.5rem var(--font);
126
+ /* label-xs und label-sm haben dieselben Metriken — label-xs ist die "Eyebrow"-Variante,
127
+ mit text-transform:uppercase + letter-spacing am Use-Site. label-sm ist für Mixed-Case-Labels. */
128
+ --ty-label-xs: 500 0.75rem/1rem var(--font);
129
+ --ty-label-sm: 500 0.75rem/1rem var(--font);
130
+ --ty-label-md: 500 0.875rem/1.25rem var(--font);
131
+ /* Title-Sm (Mai 2026): 20 px statt 18 px, damit Card-Titel mit klarer 4-px-Stufe über
132
+ dem neuen 16-px-Body-Md sitzen. Title-Lg ist entfallen, das Logo nutzt jetzt eine eigene
133
+ Klasse .nav-logo-text mit fest verdrahteten Metriken. */
134
+ --ty-title-sm: 500 1.25rem/1.75rem var(--font);
135
+ --ty-label-xs-strong: 600 0.75rem/1rem var(--font);
136
+ --ty-name: 600 0.875rem/1.25rem var(--font);
137
+ /* Display / serif (Libre Baskerville) */
138
+ --ty-serif-sm: 400 1.0625rem/1.75rem var(--font-display);
139
+ --ty-serif-md: 400 1.25rem/1.75rem var(--font-display);
140
+ --ty-serif-lg: 400 1.25rem/2rem var(--font-display);
141
+ /* Headline/Display fluid: font-size via clamp(), Zeilenhöhe als unitless Ratio
142
+ (skaliert proportional zur gerechneten Größe, nie < 1 — siehe line-height-Konvention).
143
+ rem-basiert (Juli 2026, WCAG 1.4.4 "Resize Text"): Min/Max in rem, Mittel-Term als
144
+ rem + vw, damit die Schrift auch die Browser-Standardschriftgröße respektiert (px+vw
145
+ reagierte nur auf Seiten-Zoom). Mittel-Term = Zwei-Anker-Fluid-Kurve (Anker 360 px → Min,
146
+ 1240 px → Max); rem-Anteil trägt die Basis (resize-fähig), vw fügt fluides Wachstum hinzu.
147
+ Max = bisheriger Fixwert → Desktop unverändert; Min greift am Phone (alle ≥ 1.25rem =
148
+ 20 px @ Default, also ≥ Font-Size-Minimum). Mirror von --ty-display-lg. */
149
+ --ty-headline-xs: 400 clamp(1.25rem, 1.2rem + 0.23vw, 1.375rem)/1.35 var(--font-display);
150
+ --ty-headline-sm: 400 clamp(1.3125rem, 1.236rem + 0.34vw, 1.5rem)/1.33 var(--font-display);
151
+ --ty-headline-md: 400 clamp(1.4375rem, 1.31rem + 0.57vw, 1.75rem)/1.3 var(--font-display);
152
+ --ty-display-sm: 400 clamp(1.75rem, 1.546rem + 0.91vw, 2.25rem)/1.22 var(--font-display);
153
+ --ty-display-md: 400 clamp(1.875rem, 1.619rem + 1.14vw, 2.5rem)/1.2 var(--font-display);
154
+ --ty-display-lg: 400 clamp(1.75rem, 1.29rem + 2.05vw, 2.875rem)/1.15 var(--font-display);
155
+
156
+ /* ── Spacing ── */
157
+ --s1:4px;--s2:8px;--s3:12px;--s4:16px;--s5:20px;--s6:24px;--s8:32px;--s10:40px;--s12:48px;--s16:64px;
158
+
159
+ /* ── Shape (5 Stufen) ── */
160
+ --r-xs:4px; --r-sm:8px; --r-md:12px; --r-lg:16px; --r-xl:28px; --r-full:9999px;
161
+
162
+ /* ── Elevation (Shadow + Tonal Overlay) ── */
163
+ --e0:none;
164
+ --e1:0 1px 2px rgba(0,0,0,.30),0 1px 3px 1px rgba(0,0,0,.15);
165
+ --e2:0 1px 2px rgba(0,0,0,.30),0 2px 6px 2px rgba(0,0,0,.15);
166
+ --e3:0 1px 3px rgba(0,0,0,.30),0 4px 8px 3px rgba(0,0,0,.15);
167
+ --e4:0 2px 3px rgba(0,0,0,.30),0 6px 10px 4px rgba(0,0,0,.15);
168
+ --e5:0 4px 4px rgba(0,0,0,.30),0 8px 12px 6px rgba(0,0,0,.15);
169
+ /* Tonal overlay: primärfarbe auf Oberfläche aufgebracht */
170
+ --tonal-1:rgba(0,190,190,.05); --tonal-2:rgba(0,190,190,.08);
171
+ --tonal-3:rgba(0,190,190,.11); --tonal-4:rgba(0,190,190,.12);
172
+ --tonal-5:rgba(0,190,190,.14);
173
+
174
+ /* ── Motion ── */
175
+ --m-fast:150ms cubic-bezier(.4,0,.2,1); --m-std:250ms cubic-bezier(.4,0,.2,1);
176
+
177
+ /* ── Icon Stroke-Width ── */
178
+ --icon-stroke-micro:1;
179
+ --icon-stroke-sm:1.25;
180
+ --icon-stroke-md:1.5;
181
+ --icon-stroke-lg:2;
182
+ --icon-stroke-xl:2.5;
183
+
184
+ /* ── Borders ──
185
+ Zwei Rollen, nicht zwei Stärken: --bd ist die Trennlinie INNERHALB eines Bauteils
186
+ (Card-Footer, Tabellenzeile, Caption-Kante), --bd-strong die AUSSENKANTE einer Fläche
187
+ (Karte, Kasten, schwebendes Panel). Beide sind 1px; die Kante muss nur mehr tragen, weil sie
188
+ eine Fläche gegen ihren Grund abgrenzt, während die Trennlinie innerhalb einer schon
189
+ abgegrenzten Fläche liegt.
190
+ --bd-strong-c war n-200 und trug im Light nur 1,53:1 gegen Weiß und 1,42:1 gegen eine
191
+ n-50-Sektion; eine weiße Karte auf weißem Grund war damit praktisch randlos, obwohl genau
192
+ dieser Rand sie laut Konvention zur Fläche macht. n-300 gibt 2,25:1 bzw. 2,09:1 und bleibt
193
+ ruhig. Der Dark-Wert (#8694A5, 4,21:1) war nie das Problem und ändert sich nicht.
194
+ --bd-c / --bd-strong-c halten die reine Farbe. --bd und --bd-strong sind Shorthand-Werte und
195
+ lassen sich nicht in border-color einsetzen; Regeln, die nur die Farbe brauchen (z. B. der
196
+ verstärkte Rand schwebender Panels im Dark), greifen deshalb auf die -c-Variante zu, statt den
197
+ Hexwert ein zweites Mal zu führen. */
198
+ --bd-c:var(--n-100); --bd-strong-c:var(--n-300);
199
+ --bd:1px solid var(--bd-c); --bd-strong:1px solid var(--bd-strong-c);
200
+ --field-border:var(--n-400); /* Formularfeld-Rahmen: 4.13:1 auf bg-surface (#fff) → WCAG 1.4.11 ✓. n-200 (#C9D3D3) verfehlte mit 1.5:1. */
201
+
202
+ /* ── Focus ── */
203
+ /* Sichtbarer Ring co-700 (nicht co-500): co-500 #00BEBE erreicht auf Weiß nur 2,3:1 und verfehlt
204
+ die 3:1-Schwelle für Fokus-Indikatoren (WCAG 2.4.11). co-700 #007575 = 5,5:1. Gilt global (alle
205
+ :focus-visible-Ringe im DS nutzen diese Tokens). Dark bleibt co-500 (dort 4,7:1 auf dunklem Grund,
206
+ co-700 wäre dunkel-auf-dunkel) — s. dark-mode.css. */
207
+ --focus-ring:0 0 0 3px var(--co-50),0 0 0 5px var(--co-700);
208
+ --focus-aa:0 0 0 2px var(--bg-surface),0 0 0 4px var(--co-700);
209
+ }