@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.
- package/README.md +2 -148
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/package.json +29 -39
- package/LICENSE +0 -386
- package/demo/dist/css/style.min.css +0 -1
- package/demo/scripts/build-custom-media.js +0 -39
- package/demo/scripts/build-icons-css.js +0 -41
- package/demo/scripts/map-icons.js +0 -348
- package/demo/scripts/postcss.svg-load-plugin.js +0 -96
- package/demo/src/App.ts +0 -12
- package/demo/src/ColorPalette.ts +0 -84
- package/demo/src/Navigation.ts +0 -55
- package/demo/src/StickyHeader.ts +0 -40
- package/demo/src/main.ts +0 -1
- package/demo/src/vendor/gen-custom-media.css +0 -12
- package/output/README.md +0 -38
- package/output/css/kfw-design-tokens.light.css +0 -293
- package/output/figma/kfw-design-tokens.light.json +0 -736
- package/output/js/kfw-design-tokens.d.ts +0 -311
- package/output/js/kfw-design-tokens.light.js +0 -293
- package/output/json/kfw-design-tokens.json +0 -8016
- package/output/penpot/kfw-design-tokens.light.json +0 -736
- package/output/scss/kfw-design-tokens.light.scss +0 -288
- package/output/web_thirdparty_16px/css/kfw-design-tokens.light.css +0 -293
- package/output/web_thirdparty_16px/js/kfw-design-tokens.light.d.ts +0 -559
- package/output/web_thirdparty_16px/js/kfw-design-tokens.light.js +0 -293
- package/output/web_thirdparty_16px/scss/kfw-design-tokens.light.scss +0 -288
- package/tokens/tokens.json +0 -506
|
@@ -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()
|
package/demo/src/ColorPalette.ts
DELETED
|
@@ -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
|
-
}
|
package/demo/src/Navigation.ts
DELETED
|
@@ -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
|
-
}
|
package/demo/src/StickyHeader.ts
DELETED
|
@@ -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
|
-
}
|