(value: any, opacity?: number)
| 71 | // An optional opacity (0-100) overrides the color's own alpha. Note: neutral |
| 72 | // colors are returned untouched, so opacity is ignored for them. |
| 73 | export function convertColor(value: any, opacity?: number) { |
| 74 | if (typeof value !== 'string') { |
| 75 | return value; |
| 76 | } |
| 77 | return value.replace(/rgba?\([^)]+\)/g, value => { |
| 78 | let match = value.match(/rgba?\(([^)]+)\)/); |
| 79 | if (!match) { |
| 80 | return value; |
| 81 | } |
| 82 | let parts = match[1].split(',').map(x => parseFloat(x.trim())); |
| 83 | let [r, g, b] = parts; |
| 84 | let alpha = opacity != null ? opacity / 100 : (parts[3] ?? 1); |
| 85 | let [L, C, H] = rgbToOklch(r, g, b); |
| 86 | if (C < NEUTRAL_CHROMA) { |
| 87 | return value; |
| 88 | } |
| 89 | let offset = Math.round((H - BRAND_REF_HUE) * 10) / 10; |
| 90 | return brand(Math.round(L * 1e4) / 1e4, Math.round(C * 1e4) / 1e4, offset, alpha); |
| 91 | }); |
| 92 | } |
| 93 | |
| 94 | export function token(name: string) { |
| 95 | let token = name.split('.').reduce((acc, curr) => { |
no test coverage detected