@openkfw/design-tokens 1.0.2 → 1.0.4

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.
@@ -1,96 +0,0 @@
1
- import fs from "fs/promises"
2
- import path from "path"
3
-
4
- const svgCache = {}
5
-
6
- export default function postcssSvgLoadPlugin(options = {}) {
7
- return {
8
- postcssPlugin: "postcss-svg-load",
9
- async Once(root, { result }) {
10
- const cssFilePath = result.opts.from
11
- const baseDir = options.baseDir ?? (cssFilePath ? path.dirname(cssFilePath) : process.cwd())
12
- const cssVariables = {}
13
-
14
- root.walkRules((rule) => {
15
- if (rule.selector.startsWith(":root,")) {
16
- rule.walkDecls((decl) => {
17
- if (decl.prop.startsWith("--")) {
18
- cssVariables[decl.prop] = decl.value.trim()
19
- }
20
- })
21
- }
22
- })
23
-
24
- const svgLoadRegex = /svg-load\(\s*["']([^"']+)["'](?:\s*,\s*["']([^"']*)["'])?\s*\)/g
25
- const processingPromises = []
26
-
27
- root.walkDecls((decl) => {
28
- let match
29
- const matches = []
30
-
31
- while ((match = svgLoadRegex.exec(decl.value)) !== null) {
32
- matches.push(match)
33
- }
34
-
35
- for (const match of matches) {
36
- const [fullMatch, svgRelativePath, colorParam] = match
37
-
38
- let color = null
39
-
40
- if (colorParam !== undefined && colorParam !== "") {
41
- const varMatch = colorParam.match(/^var\((--[^)]+)\)$/)
42
- if (varMatch) {
43
- const varName = varMatch[1]
44
- if (cssVariables[varName]) {
45
- color = cssVariables[varName]
46
- } else {
47
- result.warn(`CSS variable ${varName} not found`, { node: decl })
48
- continue
49
- }
50
- } else {
51
- color = colorParam
52
- }
53
- }
54
-
55
- const svgAbsolutePath = path.resolve(baseDir, svgRelativePath)
56
- const cacheKey = `${svgAbsolutePath}::${color ?? ""}`
57
-
58
- const promise = (async () => {
59
- if (svgCache[cacheKey]) {
60
- decl.value = decl.value.replace(fullMatch, svgCache[cacheKey])
61
- return
62
- }
63
-
64
- try {
65
- let svgContent = await fs.readFile(svgAbsolutePath, "utf8")
66
-
67
- if (color !== null) {
68
- if (/<svg[^>]*fill="[^"]*"[^>]*>/.test(svgContent)) {
69
- svgContent = svgContent.replace(/(<svg[^>]*?)fill="[^"]*"([^>]*>)/, `$1fill="${color}"$2`)
70
- } else {
71
- svgContent = svgContent.replace(/(<svg[^>]*)>/, `$1 fill="${color}">`)
72
- }
73
- }
74
-
75
- const encodedSvg = encodeURIComponent(svgContent).replace(/'/g, "%27").replace(/"/g, "%22")
76
-
77
- const dataUrl = `url("data:image/svg+xml,${encodedSvg}")`
78
-
79
- svgCache[cacheKey] = dataUrl
80
-
81
- decl.value = decl.value.replace(fullMatch, dataUrl)
82
- } catch {
83
- result.warn(`SVG file not found: ${svgAbsolutePath}`, { node: decl })
84
- }
85
- })()
86
-
87
- processingPromises.push(promise)
88
- }
89
- })
90
-
91
- await Promise.all(processingPromises)
92
- }
93
- }
94
- }
95
-
96
- postcssSvgLoadPlugin.postcss = true
package/demo/src/App.ts DELETED
@@ -1,12 +0,0 @@
1
- import { initializeNavigation } from "./Navigation.js"
2
- import { initializeStickyHeader } from "./StickyHeader.js"
3
- import { initializeColorPalettes } from "./ColorPalette.js"
4
-
5
- // Initialize navigation (hamburger menu and offcanvas dialog)
6
- initializeNavigation()
7
-
8
- // Initialize sticky header behavior
9
- initializeStickyHeader()
10
-
11
- // Initialize color palette rendering
12
- initializeColorPalettes()
@@ -1,84 +0,0 @@
1
- declare global {
2
- interface Window {
3
- allTokens: AllTokens
4
- }
5
- }
6
-
7
- interface TokenValue {
8
- $description?: string
9
- $value?: string
10
- name?: string
11
- }
12
-
13
- interface TokenGroup {
14
- [key: string]: TokenValue | TokenGroup
15
- }
16
-
17
- interface AllTokens {
18
- semantic?: {
19
- color?: TokenGroup
20
- }
21
- base?: {
22
- color?: TokenGroup
23
- }
24
- }
25
-
26
- function getByPath(obj: TokenGroup, path: string): TokenValue | undefined {
27
- return path.split(".").reduce<TokenGroup | TokenValue | undefined>((o, k) => {
28
- if (!o || typeof o !== "object") return undefined
29
- return o[k as keyof typeof o] as TokenGroup | TokenValue | undefined
30
- }, obj)
31
- }
32
-
33
- function createColorPaletteItem(colorEl: HTMLElement, tokenGroup: string, tokenName: string | undefined): void {
34
- colorEl.classList.add("color-palette__color")
35
-
36
- const tokenKey = colorEl.dataset.token
37
- if (!tokenKey) return
38
-
39
- const wrapper = document.createElement("div")
40
- wrapper.className = "color-palette__item"
41
-
42
- const container = document.createElement("div")
43
- container.className = "color-palette__container"
44
-
45
- const desc = document.createElement("span")
46
- desc.className = "color-palette__label form-label"
47
-
48
- const btn = document.createElement("button")
49
- btn.type = "button"
50
- btn.role = "link"
51
-
52
- btn.addEventListener("click", () => {
53
- navigator.clipboard.writeText(`var(--${btn.textContent})`).catch((err) => {
54
- console.error("Failed to copy to clipboard:", err)
55
- })
56
- })
57
-
58
- const tokenColorPath =
59
- tokenName !== undefined
60
- ? window.allTokens[tokenGroup as keyof AllTokens]?.color?.[tokenName]
61
- : window.allTokens[tokenGroup as keyof AllTokens]?.color
62
- const token = tokenColorPath ? getByPath(tokenColorPath as TokenGroup, tokenKey) : undefined
63
-
64
- desc.textContent = token?.$description || ""
65
- btn.textContent = token?.name || "var(--kfw-color-fn)"
66
-
67
- colorEl.style.backgroundColor = token?.$value || ""
68
- colorEl.replaceWith(wrapper)
69
- wrapper.appendChild(colorEl)
70
- wrapper.appendChild(container)
71
- container.appendChild(desc)
72
- container.appendChild(btn)
73
- }
74
-
75
- export function initializeColorPalettes(): void {
76
- document.querySelectorAll<HTMLElement>(".color-palette").forEach((palette) => {
77
- const tokenGroup = palette.dataset.group || "semantic"
78
- const tokenName = palette.dataset.name
79
-
80
- palette.querySelectorAll<HTMLElement>("span[data-token]").forEach((colorEl) => {
81
- createColorPaletteItem(colorEl, tokenGroup, tokenName)
82
- })
83
- })
84
- }
@@ -1,55 +0,0 @@
1
- export function initializeNavigation(): void {
2
- const body = document.body
3
- const hamburger = document.querySelector<HTMLElement>(".header__hamburger")
4
- const dialog = document.getElementById("main-nav") as HTMLDialogElement | null
5
-
6
- if (!hamburger || !dialog) return
7
-
8
- const dialogContent = dialog.querySelector<HTMLElement>("[data-dialog-content]")
9
-
10
- const openNav = (): void => {
11
- hamburger.setAttribute("aria-expanded", "true")
12
- body.classList.add("no-scroll")
13
- dialog.showModal()
14
- }
15
-
16
- const closeNav = (): void => {
17
- body.classList.remove("no-scroll")
18
- hamburger.setAttribute("aria-expanded", "false")
19
- hamburger.focus()
20
- }
21
-
22
- hamburger.addEventListener("click", openNav)
23
-
24
- dialog.addEventListener("close", closeNav)
25
-
26
- dialog.addEventListener("click", (event) => {
27
- const target = event.target as HTMLElement | null
28
-
29
- if (!target) return
30
-
31
- const anchor = target.closest("a")
32
-
33
- if (anchor) {
34
- event.preventDefault() // Prevent immediate navigation, so we can scroll only after closing (after removing overflow: hidden)
35
- dialog.close()
36
-
37
- const href = anchor.getAttribute("href")
38
- if (!href) return
39
-
40
- if (href.startsWith("#")) {
41
- const scrollTarget = document.querySelector(href)
42
- if (scrollTarget) {
43
- scrollTarget.scrollIntoView({ behavior: "instant" })
44
- }
45
- } else {
46
- window.location.href = href
47
- }
48
- return
49
- }
50
-
51
- if (!dialogContent?.contains(target)) {
52
- dialog.close()
53
- }
54
- })
55
- }
@@ -1,40 +0,0 @@
1
- const STICKY_CLASS = "header--sticky"
2
- const STICKY_THRESHOLD_APPLY = 128 // Scroll position to apply sticky header
3
- const STICKY_THRESHOLD_REMOVE = 64 // Scroll position to remove sticky header (hysteresis)
4
-
5
- export function initializeStickyHeader(): void {
6
- const header = document.getElementById("sticky-header")
7
-
8
- if (!header) return
9
-
10
- let ticking = false
11
-
12
- const updateSticky = (): void => {
13
- const y = window.scrollY
14
- const isSticky = header.classList.contains(STICKY_CLASS)
15
-
16
- // Hysteresis to prevent flickering when scrolling near threshold
17
- if (y >= STICKY_THRESHOLD_APPLY && !isSticky) {
18
- header.classList.add(STICKY_CLASS)
19
- } else if (y < STICKY_THRESHOLD_REMOVE && isSticky) {
20
- header.classList.remove(STICKY_CLASS)
21
- }
22
- }
23
-
24
- window.addEventListener(
25
- "scroll",
26
- () => {
27
- if (!ticking) {
28
- requestAnimationFrame(() => {
29
- updateSticky()
30
- ticking = false
31
- })
32
- ticking = true
33
- }
34
- },
35
- { passive: true }
36
- )
37
-
38
- // Set initial state
39
- updateSticky()
40
- }
package/demo/src/main.ts DELETED
@@ -1 +0,0 @@
1
- import "./App"
@@ -1,12 +0,0 @@
1
- /* Custom Media Queries generated from KfW Design Tokens v0.6.3 */
2
-
3
- /* See: https://www.w3.org/TR/mediaqueries-5/#at-ruledef-custom-media */
4
-
5
- @custom-media --kfw-breakpoint-mobile (min-width: 600px);
6
- @custom-media --kfw-breakpoint-mobile-max (max-width: 600px);
7
- @custom-media --kfw-breakpoint-tablet (min-width: 840px);
8
- @custom-media --kfw-breakpoint-tablet-max (max-width: 840px);
9
- @custom-media --kfw-breakpoint-desktop (min-width: 960px);
10
- @custom-media --kfw-breakpoint-desktop-max (max-width: 960px);
11
- @custom-media --kfw-breakpoint-desktop-large (min-width: 1280px);
12
- @custom-media --kfw-breakpoint-desktop-large-max (max-width: 1280px);
package/output/README.md DELETED
@@ -1,38 +0,0 @@
1
- # README for the Folder Structure in /output
2
-
3
- This document outlines the structure of the /output directory and its contents.
4
-
5
- ## Folder Structure
6
-
7
- ```
8
- /output
9
- ├── /figma
10
- ├── /penpot
11
- ├── /json
12
- ├── /css
13
- ├── /js
14
- ├── /scss
15
- └── /web_thirdparty_16px (third-party)
16
- ```
17
-
18
- The `/output` directory contains all available export formats for design and development integration, including Figma, Penpot, JSON, CSS, SCSS, and JavaScript files.
19
-
20
-
21
- # 🧭 REM and Font Scaling Guidelines
22
-
23
- All KfW web applications (e.g., KfW.de, MeineKfW, OKP) use a root REM value of 62.5% to ensure optimal readability and consistent scaling.
24
- This means that 1rem is equivalent to 10px. Never use a font size of 10px directly. Always rely on rem units for scalable and accessible typography.
25
-
26
- Example:
27
-
28
- ```
29
- html {
30
- font-size: 62.5%; /* 1rem = 10px */
31
- }
32
-
33
- body {
34
- font-size: 1.6rem; /* 16px */
35
- }
36
- ```
37
-
38
- For third-party systems where the REM root value cannot be modified (i.e., the default browser setting of 16px = 100%), use the assets provided in the `/web_thirdparty_16px` folder.
@@ -1,293 +0,0 @@
1
- /**
2
- * KfW Design Tokens v1.0.2 | MPL-2.0 | https://github.com/openkfw/design-tokens
3
- */
4
-
5
- :root, :host { color-scheme: light; }
6
-
7
- :root, :host {
8
- --kfw-base-color-blue-100: #e9f5fb;
9
- --kfw-base-color-blue-400: #54b3e2;
10
- --kfw-base-color-blue-500: #007abc;
11
- --kfw-base-color-blue-600: #005a8c;
12
- --kfw-base-color-blue-700: #00446e;
13
- --kfw-base-color-blue-800: #00375b;
14
- --kfw-base-color-green-100: #ecfded;
15
- --kfw-base-color-green-300: #b7f9aa;
16
- --kfw-base-color-green-400: #94eb90;
17
- --kfw-base-color-green-700: #398357;
18
- --kfw-base-color-white-90: #ffffffe6;
19
- --kfw-base-color-white-95: #fffffff2;
20
- --kfw-base-color-white: #fff;
21
- --kfw-base-color-gray-50: #f6f7f8;
22
- --kfw-base-color-gray-100: #eef0f2;
23
- --kfw-base-color-gray-200: #d8dfe3;
24
- --kfw-base-color-gray-300: #a1adb5;
25
- --kfw-base-color-gray-400: #6d767d;
26
- --kfw-base-color-gray-500-10: #41484c1a;
27
- --kfw-base-color-gray-500-30: #41484c4d;
28
- --kfw-base-color-gray-500-90: #41484ce6;
29
- --kfw-base-color-gray-500: #41484c;
30
- --kfw-base-color-gray-600: #2d3134;
31
- --kfw-base-color-violet-400: #a455c5;
32
- --kfw-base-color-violet-500: #643179;
33
- --kfw-base-color-red-400: #c80538;
34
- --kfw-base-color-yellow-500: #eac80b;
35
- --kfw-base-fontfamily-sans: "KfW Centro Sans", Arial, "Helvetica Neue", Helvetica, sans-serif;
36
- --kfw-base-fontfamily-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
37
- --kfw-base-space-static-5: 0.5rem;
38
- --kfw-base-space-static-10: 1rem;
39
- --kfw-base-space-static-15: 1.5rem;
40
- --kfw-base-space-static-20: 2rem;
41
- --kfw-base-space-static-25: 2.5rem;
42
- --kfw-base-space-static-30: 3rem;
43
- --kfw-base-space-static-35: 3.5rem;
44
- --kfw-base-space-static-40: 4rem;
45
- --kfw-base-space-static-48: 4.8rem;
46
- --kfw-base-space-static-50: 5rem;
47
- --kfw-base-space-static-60: 6rem;
48
- --kfw-base-space-fluid-5-min: 0.5rem;
49
- --kfw-base-space-fluid-5-max: 1rem;
50
- --kfw-base-space-fluid-5-val: 0.735vi + 0.588px;
51
- --kfw-base-space-fluid-10-min: 1rem;
52
- --kfw-base-space-fluid-10-max: 1.5rem;
53
- --kfw-base-space-fluid-10-val: 0.735vi + 0.5588rem;
54
- --kfw-base-space-fluid-15-min: 1.5rem;
55
- --kfw-base-space-fluid-15-max: 2rem;
56
- --kfw-base-space-fluid-15-val: 0.735vi + 1.0588rem;
57
- --kfw-base-space-fluid-20-min: 2rem;
58
- --kfw-base-space-fluid-20-max: 2.5rem;
59
- --kfw-base-space-fluid-20-val: 0.735vi + 1.5588rem;
60
- --kfw-base-space-fluid-25-min: 2.5rem;
61
- --kfw-base-space-fluid-25-max: 3rem;
62
- --kfw-base-space-fluid-25-val: 0.735vi + 2.0588rem;
63
- --kfw-base-space-fluid-30-min: 3rem;
64
- --kfw-base-space-fluid-30-max: 3.5rem;
65
- --kfw-base-space-fluid-30-val: 0.735vi + 2.5588rem;
66
- --kfw-base-space-fluid-35-min: 3.5rem;
67
- --kfw-base-space-fluid-35-max: 4rem;
68
- --kfw-base-space-fluid-35-val: 0.735vi + 3.0588rem;
69
- --kfw-base-space-fluid-40-min: 4rem;
70
- --kfw-base-space-fluid-40-max: 5rem;
71
- --kfw-base-space-fluid-40-val: 1.471vi + 3.1176rem;
72
- --kfw-base-space-fluid-50-min: 5rem;
73
- --kfw-base-space-fluid-50-max: 6rem;
74
- --kfw-base-space-fluid-50-val: 1.471vi + 4.1176rem;
75
- --kfw-base-space-fluid-40-48-min: 4rem;
76
- --kfw-base-space-fluid-40-48-max: 4.8rem;
77
- --kfw-base-space-fluid-40-48-val: 1.471vi + 3.2941rem;
78
- --kfw-base-fontsize-static-sm: 1.4rem;
79
- --kfw-base-fontsize-static-md: 1.6rem;
80
- --kfw-base-fontsize-static-lg: 1.8rem;
81
- --kfw-base-fontsize-static-xl: 2rem;
82
- --kfw-base-fontsize-static-2xl: 2.2rem;
83
- --kfw-base-fontsize-static-3xl: 2.4rem;
84
- --kfw-base-fontsize-static-4xl: 2.5rem;
85
- --kfw-base-fontsize-static-5xl: 2.6rem;
86
- --kfw-base-fontsize-static-6xl: 2.8rem;
87
- --kfw-base-fontsize-static-7xl: 3rem;
88
- --kfw-base-fontsize-static-8xl: 3.2rem;
89
- --kfw-base-fontsize-static-9xl: 3.6rem;
90
- --kfw-base-fontsize-fluid-sm-min: 1.4rem;
91
- --kfw-base-fontsize-fluid-sm-max: 1.6rem;
92
- --kfw-base-fontsize-fluid-sm-val: 0.294vi + 1.2235rem;
93
- --kfw-base-fontsize-fluid-md-min: 1.6rem;
94
- --kfw-base-fontsize-fluid-md-max: 1.8rem;
95
- --kfw-base-fontsize-fluid-md-val: 0.294vi + 1.4235rem;
96
- --kfw-base-fontsize-fluid-lg-min: 1.8rem;
97
- --kfw-base-fontsize-fluid-lg-max: 2rem;
98
- --kfw-base-fontsize-fluid-lg-val: 0.294vi + 1.6235rem;
99
- --kfw-base-fontsize-fluid-xl-min: 2rem;
100
- --kfw-base-fontsize-fluid-xl-max: 2.2rem;
101
- --kfw-base-fontsize-fluid-xl-val: 0.294vi + 1.8235rem;
102
- --kfw-base-fontsize-fluid-xl-3xl-min: 2rem;
103
- --kfw-base-fontsize-fluid-xl-3xl-max: 2.4rem;
104
- --kfw-base-fontsize-fluid-xl-3xl-val: 0.588vi + 1.6471rem;
105
- --kfw-base-fontsize-fluid-2xl-min: 2.2rem;
106
- --kfw-base-fontsize-fluid-2xl-max: 2.4rem;
107
- --kfw-base-fontsize-fluid-2xl-val: 0.294vi + 2.0235rem;
108
- --kfw-base-fontsize-fluid-3xl-min: 2.4rem;
109
- --kfw-base-fontsize-fluid-3xl-max: 2.6rem;
110
- --kfw-base-fontsize-fluid-3xl-val: 0.294vi + 2.2235rem;
111
- --kfw-base-fontsize-fluid-4xl-min: 2.5rem;
112
- --kfw-base-fontsize-fluid-4xl-max: 3rem;
113
- --kfw-base-fontsize-fluid-4xl-val: 0.735vi + 2.0588rem;
114
- --kfw-base-fontsize-fluid-5xl-min: 2.6rem;
115
- --kfw-base-fontsize-fluid-5xl-max: 3rem;
116
- --kfw-base-fontsize-fluid-5xl-val: 0.588vi + 2.2471rem;
117
- --kfw-base-fontsize-fluid-6xl-min: 2.8rem;
118
- --kfw-base-fontsize-fluid-6xl-max: 3.2rem;
119
- --kfw-base-fontsize-fluid-6xl-val: 0.588vi + 2.4471rem;
120
- --kfw-base-fontsize-fluid-7xl-min: 3rem;
121
- --kfw-base-fontsize-fluid-7xl-max: 3.6rem;
122
- --kfw-base-fontsize-fluid-7xl-val: 0.882vi + 2.4706rem;
123
- --kfw-base-lineheight-2xs: 1.2;
124
- --kfw-base-lineheight-xs: 1.3;
125
- --kfw-base-lineheight-sm: 1.333;
126
- --kfw-base-lineheight-md: 1.4;
127
- --kfw-base-lineheight-lg: 1.45;
128
- --kfw-base-lineheight-xl: 1.5;
129
- --kfw-base-borderradius-sm: 2px;
130
- --kfw-base-borderradius-md: 4px;
131
- --kfw-base-borderradius-lg: 20px;
132
- --kfw-base-borderradius-circle: 9999px;
133
- --kfw-base-borderwidth-md: 1px;
134
- --kfw-base-borderwidth-lg: 2px;
135
- --kfw-base-fontweight-regular: 400;
136
- --kfw-base-fontweight-medium: 500;
137
- --kfw-base-wordspacing-normal: 0;
138
- --kfw-base-wordspacing-wide: 1.6px;
139
- --kfw-base-letterspacing-tight: -0.5px;
140
- --kfw-base-letterspacing-normal: 0;
141
- --kfw-base-letterspacing-wide: 0.5px;
142
- --kfw-base-letterspacing-wider: 1px;
143
- --kfw-base-offset: 2px;
144
- --kfw-base-layout-breakpoint-xs: 320px;
145
- --kfw-base-layout-breakpoint-sm: 600px;
146
- --kfw-base-layout-breakpoint-md: 840px;
147
- --kfw-base-layout-breakpoint-lg: 960px;
148
- --kfw-base-layout-breakpoint-xl: 1280px;
149
- --kfw-base-layout-container-sm: 89.6rem;
150
- --kfw-base-layout-container-md: 108rem;
151
- --kfw-base-layout-container-lg: 128rem;
152
- --kfw-base-layout-safezone-sm: 5.625vi;
153
- --kfw-base-layout-safezone-md: 6.667vi;
154
- --kfw-base-layout-safezone-lg: 7.5vi;
155
- --kfw-base-layout-safezone-xl: 0;
156
- --kfw-base-layout-gridgap-static-xs: 1.2rem;
157
- --kfw-base-layout-gridgap-static-sm: 1.8rem;
158
- --kfw-base-layout-gridgap-static-md: 2rem;
159
- --kfw-base-layout-gridgap-static-lg: 2.2rem;
160
- --kfw-base-layout-gridgap-static-xl: 2.6rem;
161
- --kfw-base-layout-gridgap-static-2xl: 3.6rem;
162
- --kfw-base-layout-gridgap-static-3xl: 4rem;
163
- --kfw-base-layout-gridgap-fluid-basic-min: 1.2rem;
164
- --kfw-base-layout-gridgap-fluid-basic-max: 3.6rem;
165
- --kfw-base-layout-gridgap-fluid-basic-val: 3.529vi - 0.9176rem;
166
- --kfw-base-layout-gridgap-fluid-large-min: 2rem;
167
- --kfw-base-layout-gridgap-fluid-large-max: 4rem;
168
- --kfw-base-layout-gridgap-fluid-large-val: 2.941vi + 0.2353rem;
169
- --kfw-base-layout-gridcolumn-1: 1;
170
- --kfw-base-layout-gridcolumn-2: 2;
171
- --kfw-base-layout-gridcolumn-3: 3;
172
- --kfw-base-layout-gridcolumn-4: 4;
173
- --kfw-base-layout-gridcolumn-6: 6;
174
- --kfw-base-layout-gridcolumn-8: 8;
175
- --kfw-base-layout-gridcolumn-10: 10;
176
- --kfw-base-layout-gridcolumn-12: 12;
177
- --kfw-color-fn: #005a8c; /** Main interaction color for buttons and links (Blue 600) */
178
- --kfw-color-fn-active: #00446e; /** Main interaction color when active (e.g., hover, Blue 700) */
179
- --kfw-color-fn-inactive: #a1adb5; /** Interaction color when inactive (Gray 300) */
180
- --kfw-color-fn-border: #2d3134; /** Interaction border color (Gray 600) */
181
- --kfw-color-fn-label: #2d3134; /** Interaction label color (Gray 600) */
182
- --kfw-color-text: #2d3134; /** Main text color for body (Gray 600) */
183
- --kfw-color-text-on-dark-bg: #fff; /** Main text color on dark background (White) */
184
- --kfw-color-text-headline-on-dark-bg: #b7f9aa; /** Headline text color on dark background (Green 300) */
185
- --kfw-color-text-on-disabled: #fff; /** Text color on disabled (White) */
186
- --kfw-color-background: #fff; /** Main background color for body (White) */
187
- --kfw-color-background-subtle: #f6f7f8; /** Neutral (Gray 50) */
188
- --kfw-color-background-disabled: #a1adb5; /** Disabled (Gray 300) */
189
- --kfw-color-background-light-blue: #e9f5fb; /** Light blue (Blue 100) */
190
- --kfw-color-background-light-green: #ecfded; /** Light green (Green 100) */
191
- --kfw-color-background-medium-green: #b7f9aa; /** Green Medium (Green 300) */
192
- --kfw-color-background-dark-blue: #00375b; /** Dark blue (Blue 800) */
193
- --kfw-color-background-dark-green: #398357; /** Dark green (Green 700) */
194
- --kfw-color-opaque-white-90: #ffffffe6; /** White 90% */
195
- --kfw-color-opaque-white-95: #fffffff2; /** White 95% */
196
- --kfw-color-opaque-gray-500-10: #41484c1a; /** Gray 500 10% */
197
- --kfw-color-opaque-gray-500-30: #41484c4d; /** Gray 500 30% */
198
- --kfw-color-opaque-gray-500-90: #41484ce6; /** Gray 500 90% */
199
- --kfw-color-state-danger: #c80538;
200
- --kfw-color-state-success: #398357;
201
- --kfw-color-state-warning: #a455c5;
202
- --kfw-color-status-red: #c80538;
203
- --kfw-color-status-yellow: #eac80b;
204
- --kfw-color-status-green: #398357;
205
- --kfw-color-line-6: #00446e;
206
- --kfw-color-line-7: #2d3134;
207
- --kfw-color-line-8: #a1adb5;
208
- --kfw-color-line-9: #005a8c;
209
- --kfw-color-line-10: #2d3134;
210
- --kfw-color-line-11: #b7f9aa;
211
- --kfw-color-line-12: #a1adb5;
212
- --kfw-color-product-container: #f6f7f8;
213
- --kfw-color-product-benefit: #007abc;
214
- --kfw-color-product-credit: #398357;
215
- --kfw-color-product-cooperation: #643179;
216
- --kfw-color-product-credit-benefit: #41484c;
217
- --kfw-color-icon: #005a8c;
218
- --kfw-color-icon-secondary: #54b3e2;
219
- --kfw-color-icon-disabled: #398357;
220
- --kfw-color-icon-disabled-secondary: #94eb90;
221
- --kfw-fontfamily: "KfW Centro Sans", Arial, "Helvetica Neue", Helvetica, sans-serif;
222
- --kfw-fontfamily-code: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
223
- --kfw-space-tiny: 0.5rem;
224
- --kfw-space-xsmall: 1rem;
225
- --kfw-space-midSmall: 1.5rem;
226
- --kfw-space-small: 2rem;
227
- --kfw-space-medium: 3rem;
228
- --kfw-space-large-min: 3.5rem;
229
- --kfw-space-large-max: 4rem;
230
- --kfw-space-large-val: 0.735vi + 3.0588rem;
231
- --kfw-space-xlarge-min: 4rem;
232
- --kfw-space-xlarge-max: 4.8rem;
233
- --kfw-space-xlarge-val: 1.471vi + 3.2941rem;
234
- --kfw-space-big-min: 5rem;
235
- --kfw-space-big-max: 6rem;
236
- --kfw-space-big-val: 1.471vi + 4.1176rem;
237
- --kfw-fontsize: 1.6rem;
238
- --kfw-fontsize-introduction: 2rem;
239
- --kfw-fontsize-large: 1.8rem;
240
- --kfw-fontsize-small: 1.4rem;
241
- --kfw-fontsize-heading-1-min: 3rem;
242
- --kfw-fontsize-heading-1-max: 3.6rem;
243
- --kfw-fontsize-heading-1-val: 0.882vi + 2.4706rem;
244
- --kfw-fontsize-heading-2-min: 2.8rem;
245
- --kfw-fontsize-heading-2-max: 3.2rem;
246
- --kfw-fontsize-heading-2-val: 0.588vi + 2.4471rem;
247
- --kfw-fontsize-heading-3-min: 2.4rem;
248
- --kfw-fontsize-heading-3-max: 2.6rem;
249
- --kfw-fontsize-heading-3-val: 0.294vi + 2.2235rem;
250
- --kfw-fontsize-heading-4-min: 2rem;
251
- --kfw-fontsize-heading-4-max: 2.2rem;
252
- --kfw-fontsize-heading-4-val: 0.294vi + 1.8235rem;
253
- --kfw-fontsize-heading-5: 1.8rem;
254
- --kfw-fontsize-heading-6: 1.6rem;
255
- --kfw-lineheight: 1.4;
256
- --kfw-lineheight-large: 1.45;
257
- --kfw-lineheight-lightspeech: 1.5;
258
- --kfw-lineheight-heading: 1.3;
259
- --kfw-lineheight-heading-5: 1.333;
260
- --kfw-lineheight-small: 1.2;
261
- --kfw-borderradius: 4px;
262
- --kfw-borderradius-small: 2px;
263
- --kfw-borderradius-large: 20px;
264
- --kfw-borderradius-circle: 9999px;
265
- --kfw-borderwidth: 1px;
266
- --kfw-borderwidth-large: 2px;
267
- --kfw-borderstyle: solid;
268
- --kfw-focusring-outline-width: 2px;
269
- --kfw-focusring-outline-offset: 2px;
270
- --kfw-focusring-outline-style: dashed;
271
- --kfw-focusring-outline-color: #00446e;
272
- --kfw-focusring-outline-radius: 4px;
273
- --kfw-fontweight: 400;
274
- --kfw-fontweight-bold: 500;
275
- --kfw-wordspacing-lightspeech: 1.6px;
276
- --kfw-breakpoint-mobile: 600px;
277
- --kfw-breakpoint-tablet: 840px;
278
- --kfw-breakpoint-desktop: 960px;
279
- --kfw-breakpoint-desktop-large: 1280px;
280
- --kfw-contentwrapper-narrow: 89.6rem;
281
- --kfw-contentwrapper-basic: 108rem;
282
- --kfw-contentwrapper-extended: 128rem;
283
- --kfw-safezone-mobile: 5.625vi;
284
- --kfw-safezone-tablet: 6.667vi;
285
- --kfw-safezone-desktop: 7.5vi;
286
- --kfw-safezone-desktop-large: 0;
287
- --kfw-gridgap-basic-min: 1.2rem;
288
- --kfw-gridgap-basic-max: 3.6rem;
289
- --kfw-gridgap-basic-val: 3.529vi - 0.9176rem;
290
- --kfw-gridgap-large-min: 2rem;
291
- --kfw-gridgap-large-max: 4rem;
292
- --kfw-gridgap-large-val: 2.941vi + 0.2353rem;
293
- }