@ankhorage/surface 0.2.1 → 0.2.3
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/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @ankhorage/surface
|
|
2
2
|
|
|
3
|
+
## 0.2.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 55908af: Align Surface color-tone role palette mappings with the background/foreground lane direction used by app-facing theme tooling.
|
|
8
|
+
|
|
9
|
+
## 0.2.2
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- 1711172: Update @ankhorage/contracts
|
|
14
|
+
|
|
3
15
|
## 0.2.1
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
|
@@ -142,8 +142,8 @@ function getColorToneRolePalette(colorTone) {
|
|
|
142
142
|
return {
|
|
143
143
|
bg: 'pastel',
|
|
144
144
|
surface: 'pastel',
|
|
145
|
-
primary: '
|
|
146
|
-
secondary: '
|
|
145
|
+
primary: 'jewel',
|
|
146
|
+
secondary: 'jewel',
|
|
147
147
|
accent: 'jewel',
|
|
148
148
|
highlight: 'fluorescent',
|
|
149
149
|
};
|
|
@@ -151,8 +151,8 @@ function getColorToneRolePalette(colorTone) {
|
|
|
151
151
|
return {
|
|
152
152
|
bg: 'earth',
|
|
153
153
|
surface: 'earth',
|
|
154
|
-
primary: '
|
|
155
|
-
secondary: '
|
|
154
|
+
primary: 'mineral',
|
|
155
|
+
secondary: 'mineral',
|
|
156
156
|
accent: 'jewel',
|
|
157
157
|
highlight: 'jewel',
|
|
158
158
|
};
|
|
@@ -185,9 +185,9 @@ function getColorToneRolePalette(colorTone) {
|
|
|
185
185
|
};
|
|
186
186
|
case 'fluorescent':
|
|
187
187
|
return {
|
|
188
|
-
bg: '
|
|
189
|
-
surface: '
|
|
190
|
-
primary: '
|
|
188
|
+
bg: 'obsidian',
|
|
189
|
+
surface: 'obsidian',
|
|
190
|
+
primary: 'fluorescent',
|
|
191
191
|
secondary: 'jewel',
|
|
192
192
|
accent: 'fluorescent',
|
|
193
193
|
highlight: 'fluorescent',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"colorEngine.js","sourceRoot":"","sources":["../../src/theme/colorEngine.ts"],"names":[],"mappings":"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","sourcesContent":["import { formatHex, modeOklch, oklch, useMode } from 'culori';\n\nimport type {\n ActionSemantics,\n BorderSemantics,\n ColorHarmony,\n ColorScale,\n ColorTone,\n ContentSemantics,\n NeutralSemantics,\n RoleSemantics,\n SurfaceSemantics,\n ThemeConfig,\n ThemeSemantics,\n} from './types';\n\nuseMode(modeOklch);\n\ninterface OklchColor {\n mode: 'oklch';\n l: number;\n c: number;\n h?: number;\n}\n\nexport const SCALE_STEPS = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950] as const;\n\ntype RolePaletteKind =\n | 'grayscale'\n | 'neutral'\n | 'pastel'\n | 'earth'\n | 'mineral'\n | 'muted'\n | 'jewel'\n | 'fluorescent'\n | 'obsidian'\n | 'vaporwave'\n | 'monochromeAccent';\n\n/**\n * Deterministic Lightness Curves (OKLCH L)\n */\nconst LIGHTNESS_CURVES = {\n light: [0.98, 0.95, 0.9, 0.82, 0.72, 0.62, 0.52, 0.42, 0.32, 0.22, 0.15],\n dark: [0.12, 0.16, 0.2, 0.26, 0.34, 0.62, 0.7, 0.78, 0.86, 0.92, 0.96],\n} as const;\n\n/**\n * Lightness anchors per internal palette kind\n */\nconst ROLE_PALETTE_LIGHTNESS_ANCHORS: Record<RolePaletteKind, number> = {\n grayscale: 0.62,\n neutral: 0.62,\n pastel: 0.7,\n earth: 0.55,\n mineral: 0.58,\n muted: 0.6,\n jewel: 0.62,\n fluorescent: 0.65,\n obsidian: 0.12,\n vaporwave: 0.7,\n monochromeAccent: 0.62,\n};\n\n/**\n * Chroma curve per step to prevent \"tinted whites\" and \"glow\"\n * Peak energy at 500, falloff at extremes.\n */\nconst CHROMA_BY_STEP = [0.1, 0.18, 0.3, 0.45, 0.7, 1.0, 0.92, 0.8, 0.6, 0.4, 0.25] as const;\n\n/**\n * Deterministic Chroma Anchors (OKLCH C)\n */\nconst ROLE_PALETTE_CHROMA_ANCHORS: Record<RolePaletteKind, number> = {\n grayscale: 0,\n neutral: 0.02,\n pastel: 0.08,\n earth: 0.05,\n mineral: 0.07,\n muted: 0.04,\n jewel: 0.16,\n fluorescent: 0.26,\n obsidian: 0.01,\n vaporwave: 0.2,\n monochromeAccent: 0.02,\n};\n\n/**\n * Chroma Hierarchy Rule\n */\nconst CHROMA_HIERARCHY = {\n primary: 1.0,\n secondary: 0.7,\n accent: 0.4,\n surface: 0.1,\n} as const;\n\n/**\n * Semantic Step Mapping\n */\nconst SEMANTIC_STEPS = {\n light: {\n bg: 0, // 50\n bgSubtle: 1, // 100\n surface: 1, // 100\n surfaceHover: 2, // 200\n surfaceActive: 3, // 300\n border: 3, // 300\n borderStrong: 4, // 400\n divider: 2, // 200\n text: 9, // 900\n textMuted: 7, // 700\n textSubtle: 6, // 600\n solid: 5, // 500\n softBg: 1, // 100\n softHover: 2, // 200\n softActive: 3, // 300\n outline: 4, // 400\n },\n dark: {\n bg: 0, // 50\n bgSubtle: 1, // 100\n surface: 1, // 100\n surfaceHover: 2, // 200\n surfaceActive: 3, // 300\n border: 3, // 300\n borderStrong: 4, // 400\n divider: 2, // 200\n text: 10, // 950\n textMuted: 8, // 800\n textSubtle: 7, // 700\n solid: 5, // 500\n softBg: 1, // 100\n softHover: 2, // 200\n softActive: 3, // 300\n outline: 4, // 400\n },\n} as const;\n\nexport function generateColorScale(baseColor: OklchColor, isDark: boolean): ColorScale {\n const scale: Partial<ColorScale> = {};\n const curve = isDark ? LIGHTNESS_CURVES.dark : LIGHTNESS_CURVES.light;\n\n // Dark-mode chroma rule: reduce chroma by 25%\n const chromaMultiplier = isDark ? 0.75 : 1.0;\n const targetChroma = baseColor.c * chromaMultiplier;\n\n SCALE_STEPS.forEach((step, index) => {\n const lightness = curve[index];\n const chromaByStep = CHROMA_BY_STEP[index];\n if (lightness === undefined || chromaByStep === undefined) {\n return;\n }\n // Apply chroma falloff curve per step\n const stepChroma = targetChroma * chromaByStep;\n const stepColor = { ...baseColor, l: lightness, c: stepChroma };\n scale[step as keyof ColorScale] = formatHex(stepColor);\n });\n\n return scale as ColorScale;\n}\n\n/**\n * Deterministic Harmony Hues\n */\nfunction getHarmonyHues(baseHue: number, mode: ColorHarmony): number[] {\n const h = (baseHue + 360) % 360;\n switch (mode) {\n case 'monochromatic':\n return [h];\n case 'analogous':\n return [h, (h - 30 + 360) % 360, (h + 30) % 360];\n case 'complementary':\n return [h, (h + 180) % 360];\n case 'splitComplementary':\n return [h, (h + 150) % 360, (h + 210) % 360];\n case 'triadic':\n return [h, (h + 120) % 360, (h + 240) % 360];\n case 'tetradic':\n return [h, (h + 90) % 360, (h + 180) % 360, (h + 270) % 360];\n default:\n return [h];\n }\n}\n\nfunction getColorToneRolePalette(colorTone: ColorTone): {\n bg: RolePaletteKind;\n surface: RolePaletteKind;\n primary: RolePaletteKind;\n secondary: RolePaletteKind;\n accent: RolePaletteKind;\n highlight: RolePaletteKind;\n} {\n switch (colorTone) {\n case 'pastel':\n return {\n bg: 'pastel',\n surface: 'pastel',\n primary: 'pastel',\n secondary: 'pastel',\n accent: 'jewel',\n highlight: 'fluorescent',\n };\n\n case 'earth':\n return {\n bg: 'earth',\n surface: 'earth',\n primary: 'earth',\n secondary: 'earth',\n accent: 'jewel',\n highlight: 'jewel',\n };\n\n case 'mineral':\n return {\n bg: 'mineral',\n surface: 'mineral',\n primary: 'jewel',\n secondary: 'mineral',\n accent: 'jewel',\n highlight: 'fluorescent',\n };\n\n case 'muted':\n return {\n bg: 'muted',\n surface: 'muted',\n primary: 'jewel',\n secondary: 'muted',\n accent: 'jewel',\n highlight: 'fluorescent',\n };\n\n case 'jewel':\n return {\n bg: 'grayscale',\n surface: 'grayscale',\n primary: 'jewel',\n secondary: 'jewel',\n accent: 'jewel',\n highlight: 'fluorescent',\n };\n\n case 'fluorescent':\n return {\n bg: 'grayscale',\n surface: 'grayscale',\n primary: 'jewel',\n secondary: 'jewel',\n accent: 'fluorescent',\n highlight: 'fluorescent',\n };\n\n case 'obsidian':\n return {\n bg: 'obsidian',\n surface: 'obsidian',\n primary: 'fluorescent',\n secondary: 'jewel',\n accent: 'fluorescent',\n highlight: 'fluorescent',\n };\n\n case 'vaporwave':\n return {\n bg: 'pastel',\n surface: 'pastel',\n primary: 'fluorescent',\n secondary: 'jewel',\n accent: 'fluorescent',\n highlight: 'fluorescent',\n };\n\n case 'monochromeAccent':\n return {\n bg: 'grayscale',\n surface: 'grayscale',\n primary: 'jewel',\n secondary: 'grayscale',\n accent: 'jewel',\n highlight: 'fluorescent',\n };\n\n default: // neutral\n return {\n bg: 'grayscale',\n surface: 'grayscale',\n primary: 'jewel',\n secondary: 'pastel',\n accent: 'jewel',\n highlight: 'fluorescent',\n };\n }\n}\n\n/**\n * Simple OKLCH L-based contrast check\n */\nfunction getBestContrast(solidHex: string, neutral50: string, neutral950: string): string {\n const solid = oklch(solidHex);\n const n50 = oklch(neutral50);\n const n950 = oklch(neutral950);\n\n if (!solid || !n50 || !n950) return neutral50;\n\n const diff50 = Math.abs(solid.l - n50.l);\n const diff950 = Math.abs(solid.l - n950.l);\n\n return diff50 >= diff950 ? neutral50 : neutral950;\n}\n\nexport function generatePalette(\n config: ThemeConfig,\n mode: 'light' | 'dark' = 'light',\n): {\n colors: Record<string, string>;\n scales: Record<string, ColorScale>;\n semantics: ThemeSemantics;\n} {\n const modeConfig = mode === 'dark' ? config.dark : config.light;\n const { primaryColor, harmony, colorTone } = modeConfig;\n\n let base = oklch(primaryColor);\n if (!base) {\n console.warn(\n `[colorEngine] Invalid primary color: \"${primaryColor}\". Falling back to default blue.`,\n );\n base = oklch('#3B82F6');\n }\n\n const baseHue = base?.h ?? 0;\n const hues = getHarmonyHues(baseHue, harmony);\n const rolePalette = getColorToneRolePalette(colorTone);\n\n // 1. Resolve Chromas\n const getC = (t: RolePaletteKind) => ROLE_PALETTE_CHROMA_ANCHORS[t];\n const getHue = (index: number, fallback: number) => hues[index] ?? fallback;\n\n const primaryChroma = getC(rolePalette.primary);\n const secondaryChroma = getC(rolePalette.secondary) * CHROMA_HIERARCHY.secondary;\n const tertiaryChroma = getC(rolePalette.accent) * CHROMA_HIERARCHY.accent;\n const highlightChroma = getC(rolePalette.highlight);\n const surfaceChroma = Math.min(0.02, getC(rolePalette.bg) * CHROMA_HIERARCHY.surface);\n\n // 2. Stable Role Assignment\n let pHue = getHue(0, baseHue);\n let sHue = getHue(0, baseHue);\n let aHue = getHue(0, baseHue);\n let hHue =\n harmony === 'tetradic' ? getHue(3, getHue(0, baseHue)) : (getHue(0, baseHue) + 60) % 360; // Yellow-ish offset if no tetradic\n\n switch (harmony) {\n case 'complementary':\n pHue = getHue(0, pHue);\n aHue = getHue(1, pHue);\n sHue = (getHue(0, pHue) + 30) % 360;\n break;\n case 'splitComplementary':\n case 'triadic':\n pHue = getHue(0, pHue);\n sHue = getHue(1, pHue);\n aHue = getHue(2, sHue);\n break;\n case 'tetradic':\n pHue = getHue(0, pHue);\n sHue = getHue(1, pHue);\n aHue = getHue(2, sHue);\n hHue = getHue(3, aHue);\n break;\n case 'analogous':\n pHue = getHue(1, pHue);\n sHue = getHue(0, pHue);\n aHue = getHue(2, sHue);\n break;\n }\n\n // 3. Build Bases with tuned lightness\n const getL = (t: RolePaletteKind) => ROLE_PALETTE_LIGHTNESS_ANCHORS[t];\n\n const primaryBase: OklchColor = {\n mode: 'oklch',\n l: getL(rolePalette.primary),\n c: primaryChroma,\n h: pHue,\n };\n const secondaryBase: OklchColor = {\n mode: 'oklch',\n l: getL(rolePalette.secondary),\n c: secondaryChroma,\n h: sHue,\n };\n const accentBase: OklchColor = {\n mode: 'oklch',\n l: getL(rolePalette.accent),\n c: tertiaryChroma,\n h: aHue,\n };\n const highlightBase: OklchColor = {\n mode: 'oklch',\n l: getL(rolePalette.highlight),\n c: highlightChroma,\n h: hHue,\n };\n const dangerBase: OklchColor = {\n mode: 'oklch',\n l: 0.6,\n c: 0.2,\n h: 25,\n };\n const successBase: OklchColor = {\n mode: 'oklch',\n l: 0.6,\n c: 0.2,\n h: 145,\n };\n const warningBase: OklchColor = {\n mode: 'oklch',\n l: 0.75,\n c: 0.15,\n h: 85,\n };\n\n const neutralBase: OklchColor =\n surfaceChroma === 0\n ? { mode: 'oklch', l: 0.62, c: 0 }\n : { mode: 'oklch', l: 0.62, c: surfaceChroma, h: 260 };\n\n // 4. Generate Scales\n const isDark = mode === 'dark';\n const scales = {\n primary: generateColorScale(primaryBase, isDark),\n secondary: generateColorScale(secondaryBase, isDark),\n accent: generateColorScale(accentBase, isDark),\n highlight: generateColorScale(highlightBase, isDark),\n neutral: generateColorScale(neutralBase, isDark),\n danger: generateColorScale(dangerBase, isDark),\n success: generateColorScale(successBase, isDark),\n warning: generateColorScale(warningBase, isDark),\n };\n\n // 5. Mappings\n const steps = isDark ? SEMANTIC_STEPS.dark : SEMANTIC_STEPS.light;\n const getStep = (s: ColorScale, idx: number) => {\n const key = SCALE_STEPS[idx] ?? SCALE_STEPS[SCALE_STEPS.length - 1] ?? 950;\n return s[key];\n };\n\n const getNeutralMapping = (scale: ColorScale): NeutralSemantics => ({\n bg: getStep(scale, steps.bg),\n bgSubtle: getStep(scale, steps.bgSubtle),\n surface: getStep(scale, steps.surface),\n surfaceHover: getStep(scale, steps.surfaceHover),\n surfaceActive: getStep(scale, steps.surfaceActive),\n border: getStep(scale, steps.border),\n borderStrong: getStep(scale, steps.borderStrong),\n divider: getStep(scale, steps.divider),\n text: getStep(scale, steps.text),\n textMuted: getStep(scale, steps.textMuted),\n textSubtle: getStep(scale, steps.textSubtle),\n });\n\n const getColorMapping = (scale: ColorScale, neutralScale: ColorScale): RoleSemantics => {\n const solid = getStep(scale, steps.solid);\n const softChromaLimit = 0.08;\n\n // Chroma capping for soft tokens\n const getSoftStep = (idx: number) => {\n const hex = getStep(scale, idx);\n const color = oklch(hex);\n if (color && color.c > softChromaLimit) {\n return formatHex({ ...color, c: softChromaLimit });\n }\n return hex;\n };\n\n return {\n base: solid,\n hover: getStep(scale, 6), // 600\n strong: getStep(scale, 7), // 700\n softBg: getSoftStep(steps.softBg),\n softHover: getSoftStep(steps.softHover),\n softActive: getSoftStep(steps.softActive),\n outline: getStep(scale, steps.outline),\n onSolidText: getBestContrast(solid, getStep(neutralScale, 0), getStep(neutralScale, 10)),\n };\n };\n\n const neutral = getNeutralMapping(scales.neutral);\n const brand = getColorMapping(scales.primary, scales.neutral);\n const neutralAction = getColorMapping(scales.neutral, scales.neutral);\n const danger = getColorMapping(scales.danger, scales.neutral);\n const success = getColorMapping(scales.success, scales.neutral);\n const warning = getColorMapping(scales.warning, scales.neutral);\n\n const colors: Record<string, string> = {\n primary: getStep(scales.primary, steps.solid),\n secondary: getStep(scales.secondary, steps.solid),\n accent: getStep(scales.accent, steps.solid),\n highlight: getStep(scales.highlight, steps.solid),\n background: neutral.bg,\n surface: neutral.surface,\n text: neutral.text,\n textSecondary: neutral.textMuted,\n border: neutral.border,\n error: getStep(scales.danger, steps.solid),\n success: getStep(scales.success, steps.solid),\n warning: getStep(scales.warning, steps.solid),\n };\n\n const surface: SurfaceSemantics = {\n default: neutral.surface,\n subtle: neutral.bgSubtle,\n raised: neutral.surface,\n };\n\n const content: ContentSemantics = {\n default: neutral.text,\n muted: neutral.textMuted,\n subtle: neutral.textSubtle,\n inverse: brand.onSolidText,\n };\n\n const border: BorderSemantics = {\n default: neutral.border,\n strong: neutral.borderStrong,\n focus: brand.outline,\n };\n\n const action: ActionSemantics = {\n primary: brand,\n neutral: neutralAction,\n danger,\n };\n\n return {\n colors,\n scales,\n semantics: {\n neutral,\n brand,\n secondary: getColorMapping(scales.secondary, scales.neutral),\n accent: getColorMapping(scales.accent, scales.neutral),\n highlight: getColorMapping(scales.highlight, scales.neutral),\n danger,\n success,\n warning,\n surface,\n content,\n border,\n action,\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"colorEngine.js","sourceRoot":"","sources":["../../src/theme/colorEngine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAgB9D,OAAO,CAAC,SAAS,CAAC,CAAC;AASnB,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAU,CAAC;AAe3F;;GAEG;AACH,MAAM,gBAAgB,GAAG;IACvB,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IACxE,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;CAC9D,CAAC;AAEX;;GAEG;AACH,MAAM,8BAA8B,GAAoC;IACtE,SAAS,EAAE,IAAI;IACf,OAAO,EAAE,IAAI;IACb,MAAM,EAAE,GAAG;IACX,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,GAAG;IACV,KAAK,EAAE,IAAI;IACX,WAAW,EAAE,IAAI;IACjB,QAAQ,EAAE,IAAI;IACd,SAAS,EAAE,GAAG;IACd,gBAAgB,EAAE,IAAI;CACvB,CAAC;AAEF;;;GAGG;AACH,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAU,CAAC;AAE5F;;GAEG;AACH,MAAM,2BAA2B,GAAoC;IACnE,SAAS,EAAE,CAAC;IACZ,OAAO,EAAE,IAAI;IACb,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,IAAI;IACX,WAAW,EAAE,IAAI;IACjB,QAAQ,EAAE,IAAI;IACd,SAAS,EAAE,GAAG;IACd,gBAAgB,EAAE,IAAI;CACvB,CAAC;AAEF;;GAEG;AACH,MAAM,gBAAgB,GAAG;IACvB,OAAO,EAAE,GAAG;IACZ,SAAS,EAAE,GAAG;IACd,MAAM,EAAE,GAAG;IACX,OAAO,EAAE,GAAG;CACJ,CAAC;AAEX;;GAEG;AACH,MAAM,cAAc,GAAG;IACrB,KAAK,EAAE;QACL,EAAE,EAAE,CAAC,EAAE,KAAK;QACZ,QAAQ,EAAE,CAAC,EAAE,MAAM;QACnB,OAAO,EAAE,CAAC,EAAE,MAAM;QAClB,YAAY,EAAE,CAAC,EAAE,MAAM;QACvB,aAAa,EAAE,CAAC,EAAE,MAAM;QACxB,MAAM,EAAE,CAAC,EAAE,MAAM;QACjB,YAAY,EAAE,CAAC,EAAE,MAAM;QACvB,OAAO,EAAE,CAAC,EAAE,MAAM;QAClB,IAAI,EAAE,CAAC,EAAE,MAAM;QACf,SAAS,EAAE,CAAC,EAAE,MAAM;QACpB,UAAU,EAAE,CAAC,EAAE,MAAM;QACrB,KAAK,EAAE,CAAC,EAAE,MAAM;QAChB,MAAM,EAAE,CAAC,EAAE,MAAM;QACjB,SAAS,EAAE,CAAC,EAAE,MAAM;QACpB,UAAU,EAAE,CAAC,EAAE,MAAM;QACrB,OAAO,EAAE,CAAC,EAAE,MAAM;KACnB;IACD,IAAI,EAAE;QACJ,EAAE,EAAE,CAAC,EAAE,KAAK;QACZ,QAAQ,EAAE,CAAC,EAAE,MAAM;QACnB,OAAO,EAAE,CAAC,EAAE,MAAM;QAClB,YAAY,EAAE,CAAC,EAAE,MAAM;QACvB,aAAa,EAAE,CAAC,EAAE,MAAM;QACxB,MAAM,EAAE,CAAC,EAAE,MAAM;QACjB,YAAY,EAAE,CAAC,EAAE,MAAM;QACvB,OAAO,EAAE,CAAC,EAAE,MAAM;QAClB,IAAI,EAAE,EAAE,EAAE,MAAM;QAChB,SAAS,EAAE,CAAC,EAAE,MAAM;QACpB,UAAU,EAAE,CAAC,EAAE,MAAM;QACrB,KAAK,EAAE,CAAC,EAAE,MAAM;QAChB,MAAM,EAAE,CAAC,EAAE,MAAM;QACjB,SAAS,EAAE,CAAC,EAAE,MAAM;QACpB,UAAU,EAAE,CAAC,EAAE,MAAM;QACrB,OAAO,EAAE,CAAC,EAAE,MAAM;KACnB;CACO,CAAC;AAEX,MAAM,UAAU,kBAAkB,CAAC,SAAqB,EAAE,MAAe;IACvE,MAAM,KAAK,GAAwB,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC;IAEtE,8CAA8C;IAC9C,MAAM,gBAAgB,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IAC7C,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,GAAG,gBAAgB,CAAC;IAEpD,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAClC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,YAAY,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,SAAS,KAAK,SAAS,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC1D,OAAO;QACT,CAAC;QACD,sCAAsC;QACtC,MAAM,UAAU,GAAG,YAAY,GAAG,YAAY,CAAC;QAC/C,MAAM,SAAS,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC;QAChE,KAAK,CAAC,IAAwB,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,OAAO,KAAmB,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,OAAe,EAAE,IAAkB;IACzD,MAAM,CAAC,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IAChC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,eAAe;YAClB,OAAO,CAAC,CAAC,CAAC,CAAC;QACb,KAAK,WAAW;YACd,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;QACnD,KAAK,eAAe;YAClB,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;QAC9B,KAAK,oBAAoB;YACvB,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;QAC/C,KAAK,SAAS;YACZ,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;QAC/C,KAAK,UAAU;YACb,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;QAC/D;YACE,OAAO,CAAC,CAAC,CAAC,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,SAAoB;IAQnD,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO;gBACL,EAAE,EAAE,QAAQ;gBACZ,OAAO,EAAE,QAAQ;gBACjB,OAAO,EAAE,OAAO;gBAChB,SAAS,EAAE,OAAO;gBAClB,MAAM,EAAE,OAAO;gBACf,SAAS,EAAE,aAAa;aACzB,CAAC;QAEJ,KAAK,OAAO;YACV,OAAO;gBACL,EAAE,EAAE,OAAO;gBACX,OAAO,EAAE,OAAO;gBAChB,OAAO,EAAE,SAAS;gBAClB,SAAS,EAAE,SAAS;gBACpB,MAAM,EAAE,OAAO;gBACf,SAAS,EAAE,OAAO;aACnB,CAAC;QAEJ,KAAK,SAAS;YACZ,OAAO;gBACL,EAAE,EAAE,SAAS;gBACb,OAAO,EAAE,SAAS;gBAClB,OAAO,EAAE,OAAO;gBAChB,SAAS,EAAE,SAAS;gBACpB,MAAM,EAAE,OAAO;gBACf,SAAS,EAAE,aAAa;aACzB,CAAC;QAEJ,KAAK,OAAO;YACV,OAAO;gBACL,EAAE,EAAE,OAAO;gBACX,OAAO,EAAE,OAAO;gBAChB,OAAO,EAAE,OAAO;gBAChB,SAAS,EAAE,OAAO;gBAClB,MAAM,EAAE,OAAO;gBACf,SAAS,EAAE,aAAa;aACzB,CAAC;QAEJ,KAAK,OAAO;YACV,OAAO;gBACL,EAAE,EAAE,WAAW;gBACf,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,OAAO;gBAChB,SAAS,EAAE,OAAO;gBAClB,MAAM,EAAE,OAAO;gBACf,SAAS,EAAE,aAAa;aACzB,CAAC;QAEJ,KAAK,aAAa;YAChB,OAAO;gBACL,EAAE,EAAE,UAAU;gBACd,OAAO,EAAE,UAAU;gBACnB,OAAO,EAAE,aAAa;gBACtB,SAAS,EAAE,OAAO;gBAClB,MAAM,EAAE,aAAa;gBACrB,SAAS,EAAE,aAAa;aACzB,CAAC;QAEJ,KAAK,UAAU;YACb,OAAO;gBACL,EAAE,EAAE,UAAU;gBACd,OAAO,EAAE,UAAU;gBACnB,OAAO,EAAE,aAAa;gBACtB,SAAS,EAAE,OAAO;gBAClB,MAAM,EAAE,aAAa;gBACrB,SAAS,EAAE,aAAa;aACzB,CAAC;QAEJ,KAAK,WAAW;YACd,OAAO;gBACL,EAAE,EAAE,QAAQ;gBACZ,OAAO,EAAE,QAAQ;gBACjB,OAAO,EAAE,aAAa;gBACtB,SAAS,EAAE,OAAO;gBAClB,MAAM,EAAE,aAAa;gBACrB,SAAS,EAAE,aAAa;aACzB,CAAC;QAEJ,KAAK,kBAAkB;YACrB,OAAO;gBACL,EAAE,EAAE,WAAW;gBACf,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,OAAO;gBAChB,SAAS,EAAE,WAAW;gBACtB,MAAM,EAAE,OAAO;gBACf,SAAS,EAAE,aAAa;aACzB,CAAC;QAEJ,SAAS,UAAU;YACjB,OAAO;gBACL,EAAE,EAAE,WAAW;gBACf,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,OAAO;gBAChB,SAAS,EAAE,QAAQ;gBACnB,MAAM,EAAE,OAAO;gBACf,SAAS,EAAE,aAAa;aACzB,CAAC;IACN,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,QAAgB,EAAE,SAAiB,EAAE,UAAkB;IAC9E,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;IAE/B,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAE9C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAE3C,OAAO,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,MAAmB,EACnB,OAAyB,OAAO;IAMhC,MAAM,UAAU,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;IAChE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC;IAExD,IAAI,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CACV,yCAAyC,YAAY,kCAAkC,CACxF,CAAC;QACF,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;IAEvD,qBAAqB;IACrB,MAAM,IAAI,GAAG,CAAC,CAAkB,EAAE,EAAE,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,QAAgB,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC;IAE5E,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,gBAAgB,CAAC,SAAS,CAAC;IACjF,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC;IAC1E,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAEtF,4BAA4B;IAC5B,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC9B,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC9B,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC9B,IAAI,IAAI,GACN,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,mCAAmC;IAE/H,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,eAAe;YAClB,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACvB,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACvB,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;YACpC,MAAM;QACR,KAAK,oBAAoB,CAAC;QAC1B,KAAK,SAAS;YACZ,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACvB,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACvB,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACvB,MAAM;QACR,KAAK,UAAU;YACb,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACvB,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACvB,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACvB,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACvB,MAAM;QACR,KAAK,WAAW;YACd,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACvB,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACvB,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACvB,MAAM;IACV,CAAC;IAED,sCAAsC;IACtC,MAAM,IAAI,GAAG,CAAC,CAAkB,EAAE,EAAE,CAAC,8BAA8B,CAAC,CAAC,CAAC,CAAC;IAEvE,MAAM,WAAW,GAAe;QAC9B,IAAI,EAAE,OAAO;QACb,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;QAC5B,CAAC,EAAE,aAAa;QAChB,CAAC,EAAE,IAAI;KACR,CAAC;IACF,MAAM,aAAa,GAAe;QAChC,IAAI,EAAE,OAAO;QACb,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;QAC9B,CAAC,EAAE,eAAe;QAClB,CAAC,EAAE,IAAI;KACR,CAAC;IACF,MAAM,UAAU,GAAe;QAC7B,IAAI,EAAE,OAAO;QACb,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QAC3B,CAAC,EAAE,cAAc;QACjB,CAAC,EAAE,IAAI;KACR,CAAC;IACF,MAAM,aAAa,GAAe;QAChC,IAAI,EAAE,OAAO;QACb,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;QAC9B,CAAC,EAAE,eAAe;QAClB,CAAC,EAAE,IAAI;KACR,CAAC;IACF,MAAM,UAAU,GAAe;QAC7B,IAAI,EAAE,OAAO;QACb,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,EAAE;KACN,CAAC;IACF,MAAM,WAAW,GAAe;QAC9B,IAAI,EAAE,OAAO;QACb,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;KACP,CAAC;IACF,MAAM,WAAW,GAAe;QAC9B,IAAI,EAAE,OAAO;QACb,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,EAAE;KACN,CAAC;IAEF,MAAM,WAAW,GACf,aAAa,KAAK,CAAC;QACjB,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE;QAClC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IAE3D,qBAAqB;IACrB,MAAM,MAAM,GAAG,IAAI,KAAK,MAAM,CAAC;IAC/B,MAAM,MAAM,GAAG;QACb,OAAO,EAAE,kBAAkB,CAAC,WAAW,EAAE,MAAM,CAAC;QAChD,SAAS,EAAE,kBAAkB,CAAC,aAAa,EAAE,MAAM,CAAC;QACpD,MAAM,EAAE,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC;QAC9C,SAAS,EAAE,kBAAkB,CAAC,aAAa,EAAE,MAAM,CAAC;QACpD,OAAO,EAAE,kBAAkB,CAAC,WAAW,EAAE,MAAM,CAAC;QAChD,MAAM,EAAE,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC;QAC9C,OAAO,EAAE,kBAAkB,CAAC,WAAW,EAAE,MAAM,CAAC;QAChD,OAAO,EAAE,kBAAkB,CAAC,WAAW,EAAE,MAAM,CAAC;KACjD,CAAC;IAEF,cAAc;IACd,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC;IAClE,MAAM,OAAO,GAAG,CAAC,CAAa,EAAE,GAAW,EAAE,EAAE;QAC7C,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;QAC3E,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,CAAC,KAAiB,EAAoB,EAAE,CAAC,CAAC;QAClE,EAAE,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;QAC5B,QAAQ,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC;QACxC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;QACtC,YAAY,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC;QAChD,aAAa,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC;QAClD,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC;QACpC,YAAY,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC;QAChD,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;QACtC,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC;QAChC,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;QAC1C,UAAU,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC;KAC7C,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,CAAC,KAAiB,EAAE,YAAwB,EAAiB,EAAE;QACrF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,eAAe,GAAG,IAAI,CAAC;QAE7B,iCAAiC;QACjC,MAAM,WAAW,GAAG,CAAC,GAAW,EAAE,EAAE;YAClC,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAChC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YACzB,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,GAAG,eAAe,EAAE,CAAC;gBACvC,OAAO,SAAS,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC;YACrD,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM;YAChC,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM;YACjC,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC;YACjC,SAAS,EAAE,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC;YACvC,UAAU,EAAE,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC;YACzC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;YACtC,WAAW,EAAE,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;SACzF,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9D,MAAM,aAAa,GAAG,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAEhE,MAAM,MAAM,GAA2B;QACrC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC;QAC7C,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC;QACjD,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC;QAC3C,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC;QACjD,UAAU,EAAE,OAAO,CAAC,EAAE;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,aAAa,EAAE,OAAO,CAAC,SAAS;QAChC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC;QAC1C,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC;QAC7C,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC;KAC9C,CAAC;IAEF,MAAM,OAAO,GAAqB;QAChC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,MAAM,EAAE,OAAO,CAAC,QAAQ;QACxB,MAAM,EAAE,OAAO,CAAC,OAAO;KACxB,CAAC;IAEF,MAAM,OAAO,GAAqB;QAChC,OAAO,EAAE,OAAO,CAAC,IAAI;QACrB,KAAK,EAAE,OAAO,CAAC,SAAS;QACxB,MAAM,EAAE,OAAO,CAAC,UAAU;QAC1B,OAAO,EAAE,KAAK,CAAC,WAAW;KAC3B,CAAC;IAEF,MAAM,MAAM,GAAoB;QAC9B,OAAO,EAAE,OAAO,CAAC,MAAM;QACvB,MAAM,EAAE,OAAO,CAAC,YAAY;QAC5B,KAAK,EAAE,KAAK,CAAC,OAAO;KACrB,CAAC;IAEF,MAAM,MAAM,GAAoB;QAC9B,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,aAAa;QACtB,MAAM;KACP,CAAC;IAEF,OAAO;QACL,MAAM;QACN,MAAM;QACN,SAAS,EAAE;YACT,OAAO;YACP,KAAK;YACL,SAAS,EAAE,eAAe,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC;YAC5D,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC;YACtD,SAAS,EAAE,eAAe,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC;YAC5D,MAAM;YACN,OAAO;YACP,OAAO;YACP,OAAO;YACP,OAAO;YACP,MAAM;YACN,MAAM;SACP;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { formatHex, modeOklch, oklch, useMode } from 'culori';\n\nimport type {\n ActionSemantics,\n BorderSemantics,\n ColorHarmony,\n ColorScale,\n ColorTone,\n ContentSemantics,\n NeutralSemantics,\n RoleSemantics,\n SurfaceSemantics,\n ThemeConfig,\n ThemeSemantics,\n} from './types';\n\nuseMode(modeOklch);\n\ninterface OklchColor {\n mode: 'oklch';\n l: number;\n c: number;\n h?: number;\n}\n\nexport const SCALE_STEPS = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950] as const;\n\ntype RolePaletteKind =\n | 'grayscale'\n | 'neutral'\n | 'pastel'\n | 'earth'\n | 'mineral'\n | 'muted'\n | 'jewel'\n | 'fluorescent'\n | 'obsidian'\n | 'vaporwave'\n | 'monochromeAccent';\n\n/**\n * Deterministic Lightness Curves (OKLCH L)\n */\nconst LIGHTNESS_CURVES = {\n light: [0.98, 0.95, 0.9, 0.82, 0.72, 0.62, 0.52, 0.42, 0.32, 0.22, 0.15],\n dark: [0.12, 0.16, 0.2, 0.26, 0.34, 0.62, 0.7, 0.78, 0.86, 0.92, 0.96],\n} as const;\n\n/**\n * Lightness anchors per internal palette kind\n */\nconst ROLE_PALETTE_LIGHTNESS_ANCHORS: Record<RolePaletteKind, number> = {\n grayscale: 0.62,\n neutral: 0.62,\n pastel: 0.7,\n earth: 0.55,\n mineral: 0.58,\n muted: 0.6,\n jewel: 0.62,\n fluorescent: 0.65,\n obsidian: 0.12,\n vaporwave: 0.7,\n monochromeAccent: 0.62,\n};\n\n/**\n * Chroma curve per step to prevent \"tinted whites\" and \"glow\"\n * Peak energy at 500, falloff at extremes.\n */\nconst CHROMA_BY_STEP = [0.1, 0.18, 0.3, 0.45, 0.7, 1.0, 0.92, 0.8, 0.6, 0.4, 0.25] as const;\n\n/**\n * Deterministic Chroma Anchors (OKLCH C)\n */\nconst ROLE_PALETTE_CHROMA_ANCHORS: Record<RolePaletteKind, number> = {\n grayscale: 0,\n neutral: 0.02,\n pastel: 0.08,\n earth: 0.05,\n mineral: 0.07,\n muted: 0.04,\n jewel: 0.16,\n fluorescent: 0.26,\n obsidian: 0.01,\n vaporwave: 0.2,\n monochromeAccent: 0.02,\n};\n\n/**\n * Chroma Hierarchy Rule\n */\nconst CHROMA_HIERARCHY = {\n primary: 1.0,\n secondary: 0.7,\n accent: 0.4,\n surface: 0.1,\n} as const;\n\n/**\n * Semantic Step Mapping\n */\nconst SEMANTIC_STEPS = {\n light: {\n bg: 0, // 50\n bgSubtle: 1, // 100\n surface: 1, // 100\n surfaceHover: 2, // 200\n surfaceActive: 3, // 300\n border: 3, // 300\n borderStrong: 4, // 400\n divider: 2, // 200\n text: 9, // 900\n textMuted: 7, // 700\n textSubtle: 6, // 600\n solid: 5, // 500\n softBg: 1, // 100\n softHover: 2, // 200\n softActive: 3, // 300\n outline: 4, // 400\n },\n dark: {\n bg: 0, // 50\n bgSubtle: 1, // 100\n surface: 1, // 100\n surfaceHover: 2, // 200\n surfaceActive: 3, // 300\n border: 3, // 300\n borderStrong: 4, // 400\n divider: 2, // 200\n text: 10, // 950\n textMuted: 8, // 800\n textSubtle: 7, // 700\n solid: 5, // 500\n softBg: 1, // 100\n softHover: 2, // 200\n softActive: 3, // 300\n outline: 4, // 400\n },\n} as const;\n\nexport function generateColorScale(baseColor: OklchColor, isDark: boolean): ColorScale {\n const scale: Partial<ColorScale> = {};\n const curve = isDark ? LIGHTNESS_CURVES.dark : LIGHTNESS_CURVES.light;\n\n // Dark-mode chroma rule: reduce chroma by 25%\n const chromaMultiplier = isDark ? 0.75 : 1.0;\n const targetChroma = baseColor.c * chromaMultiplier;\n\n SCALE_STEPS.forEach((step, index) => {\n const lightness = curve[index];\n const chromaByStep = CHROMA_BY_STEP[index];\n if (lightness === undefined || chromaByStep === undefined) {\n return;\n }\n // Apply chroma falloff curve per step\n const stepChroma = targetChroma * chromaByStep;\n const stepColor = { ...baseColor, l: lightness, c: stepChroma };\n scale[step as keyof ColorScale] = formatHex(stepColor);\n });\n\n return scale as ColorScale;\n}\n\n/**\n * Deterministic Harmony Hues\n */\nfunction getHarmonyHues(baseHue: number, mode: ColorHarmony): number[] {\n const h = (baseHue + 360) % 360;\n switch (mode) {\n case 'monochromatic':\n return [h];\n case 'analogous':\n return [h, (h - 30 + 360) % 360, (h + 30) % 360];\n case 'complementary':\n return [h, (h + 180) % 360];\n case 'splitComplementary':\n return [h, (h + 150) % 360, (h + 210) % 360];\n case 'triadic':\n return [h, (h + 120) % 360, (h + 240) % 360];\n case 'tetradic':\n return [h, (h + 90) % 360, (h + 180) % 360, (h + 270) % 360];\n default:\n return [h];\n }\n}\n\nfunction getColorToneRolePalette(colorTone: ColorTone): {\n bg: RolePaletteKind;\n surface: RolePaletteKind;\n primary: RolePaletteKind;\n secondary: RolePaletteKind;\n accent: RolePaletteKind;\n highlight: RolePaletteKind;\n} {\n switch (colorTone) {\n case 'pastel':\n return {\n bg: 'pastel',\n surface: 'pastel',\n primary: 'jewel',\n secondary: 'jewel',\n accent: 'jewel',\n highlight: 'fluorescent',\n };\n\n case 'earth':\n return {\n bg: 'earth',\n surface: 'earth',\n primary: 'mineral',\n secondary: 'mineral',\n accent: 'jewel',\n highlight: 'jewel',\n };\n\n case 'mineral':\n return {\n bg: 'mineral',\n surface: 'mineral',\n primary: 'jewel',\n secondary: 'mineral',\n accent: 'jewel',\n highlight: 'fluorescent',\n };\n\n case 'muted':\n return {\n bg: 'muted',\n surface: 'muted',\n primary: 'jewel',\n secondary: 'muted',\n accent: 'jewel',\n highlight: 'fluorescent',\n };\n\n case 'jewel':\n return {\n bg: 'grayscale',\n surface: 'grayscale',\n primary: 'jewel',\n secondary: 'jewel',\n accent: 'jewel',\n highlight: 'fluorescent',\n };\n\n case 'fluorescent':\n return {\n bg: 'obsidian',\n surface: 'obsidian',\n primary: 'fluorescent',\n secondary: 'jewel',\n accent: 'fluorescent',\n highlight: 'fluorescent',\n };\n\n case 'obsidian':\n return {\n bg: 'obsidian',\n surface: 'obsidian',\n primary: 'fluorescent',\n secondary: 'jewel',\n accent: 'fluorescent',\n highlight: 'fluorescent',\n };\n\n case 'vaporwave':\n return {\n bg: 'pastel',\n surface: 'pastel',\n primary: 'fluorescent',\n secondary: 'jewel',\n accent: 'fluorescent',\n highlight: 'fluorescent',\n };\n\n case 'monochromeAccent':\n return {\n bg: 'grayscale',\n surface: 'grayscale',\n primary: 'jewel',\n secondary: 'grayscale',\n accent: 'jewel',\n highlight: 'fluorescent',\n };\n\n default: // neutral\n return {\n bg: 'grayscale',\n surface: 'grayscale',\n primary: 'jewel',\n secondary: 'pastel',\n accent: 'jewel',\n highlight: 'fluorescent',\n };\n }\n}\n\n/**\n * Simple OKLCH L-based contrast check\n */\nfunction getBestContrast(solidHex: string, neutral50: string, neutral950: string): string {\n const solid = oklch(solidHex);\n const n50 = oklch(neutral50);\n const n950 = oklch(neutral950);\n\n if (!solid || !n50 || !n950) return neutral50;\n\n const diff50 = Math.abs(solid.l - n50.l);\n const diff950 = Math.abs(solid.l - n950.l);\n\n return diff50 >= diff950 ? neutral50 : neutral950;\n}\n\nexport function generatePalette(\n config: ThemeConfig,\n mode: 'light' | 'dark' = 'light',\n): {\n colors: Record<string, string>;\n scales: Record<string, ColorScale>;\n semantics: ThemeSemantics;\n} {\n const modeConfig = mode === 'dark' ? config.dark : config.light;\n const { primaryColor, harmony, colorTone } = modeConfig;\n\n let base = oklch(primaryColor);\n if (!base) {\n console.warn(\n `[colorEngine] Invalid primary color: \"${primaryColor}\". Falling back to default blue.`,\n );\n base = oklch('#3B82F6');\n }\n\n const baseHue = base?.h ?? 0;\n const hues = getHarmonyHues(baseHue, harmony);\n const rolePalette = getColorToneRolePalette(colorTone);\n\n // 1. Resolve Chromas\n const getC = (t: RolePaletteKind) => ROLE_PALETTE_CHROMA_ANCHORS[t];\n const getHue = (index: number, fallback: number) => hues[index] ?? fallback;\n\n const primaryChroma = getC(rolePalette.primary);\n const secondaryChroma = getC(rolePalette.secondary) * CHROMA_HIERARCHY.secondary;\n const tertiaryChroma = getC(rolePalette.accent) * CHROMA_HIERARCHY.accent;\n const highlightChroma = getC(rolePalette.highlight);\n const surfaceChroma = Math.min(0.02, getC(rolePalette.bg) * CHROMA_HIERARCHY.surface);\n\n // 2. Stable Role Assignment\n let pHue = getHue(0, baseHue);\n let sHue = getHue(0, baseHue);\n let aHue = getHue(0, baseHue);\n let hHue =\n harmony === 'tetradic' ? getHue(3, getHue(0, baseHue)) : (getHue(0, baseHue) + 60) % 360; // Yellow-ish offset if no tetradic\n\n switch (harmony) {\n case 'complementary':\n pHue = getHue(0, pHue);\n aHue = getHue(1, pHue);\n sHue = (getHue(0, pHue) + 30) % 360;\n break;\n case 'splitComplementary':\n case 'triadic':\n pHue = getHue(0, pHue);\n sHue = getHue(1, pHue);\n aHue = getHue(2, sHue);\n break;\n case 'tetradic':\n pHue = getHue(0, pHue);\n sHue = getHue(1, pHue);\n aHue = getHue(2, sHue);\n hHue = getHue(3, aHue);\n break;\n case 'analogous':\n pHue = getHue(1, pHue);\n sHue = getHue(0, pHue);\n aHue = getHue(2, sHue);\n break;\n }\n\n // 3. Build Bases with tuned lightness\n const getL = (t: RolePaletteKind) => ROLE_PALETTE_LIGHTNESS_ANCHORS[t];\n\n const primaryBase: OklchColor = {\n mode: 'oklch',\n l: getL(rolePalette.primary),\n c: primaryChroma,\n h: pHue,\n };\n const secondaryBase: OklchColor = {\n mode: 'oklch',\n l: getL(rolePalette.secondary),\n c: secondaryChroma,\n h: sHue,\n };\n const accentBase: OklchColor = {\n mode: 'oklch',\n l: getL(rolePalette.accent),\n c: tertiaryChroma,\n h: aHue,\n };\n const highlightBase: OklchColor = {\n mode: 'oklch',\n l: getL(rolePalette.highlight),\n c: highlightChroma,\n h: hHue,\n };\n const dangerBase: OklchColor = {\n mode: 'oklch',\n l: 0.6,\n c: 0.2,\n h: 25,\n };\n const successBase: OklchColor = {\n mode: 'oklch',\n l: 0.6,\n c: 0.2,\n h: 145,\n };\n const warningBase: OklchColor = {\n mode: 'oklch',\n l: 0.75,\n c: 0.15,\n h: 85,\n };\n\n const neutralBase: OklchColor =\n surfaceChroma === 0\n ? { mode: 'oklch', l: 0.62, c: 0 }\n : { mode: 'oklch', l: 0.62, c: surfaceChroma, h: 260 };\n\n // 4. Generate Scales\n const isDark = mode === 'dark';\n const scales = {\n primary: generateColorScale(primaryBase, isDark),\n secondary: generateColorScale(secondaryBase, isDark),\n accent: generateColorScale(accentBase, isDark),\n highlight: generateColorScale(highlightBase, isDark),\n neutral: generateColorScale(neutralBase, isDark),\n danger: generateColorScale(dangerBase, isDark),\n success: generateColorScale(successBase, isDark),\n warning: generateColorScale(warningBase, isDark),\n };\n\n // 5. Mappings\n const steps = isDark ? SEMANTIC_STEPS.dark : SEMANTIC_STEPS.light;\n const getStep = (s: ColorScale, idx: number) => {\n const key = SCALE_STEPS[idx] ?? SCALE_STEPS[SCALE_STEPS.length - 1] ?? 950;\n return s[key];\n };\n\n const getNeutralMapping = (scale: ColorScale): NeutralSemantics => ({\n bg: getStep(scale, steps.bg),\n bgSubtle: getStep(scale, steps.bgSubtle),\n surface: getStep(scale, steps.surface),\n surfaceHover: getStep(scale, steps.surfaceHover),\n surfaceActive: getStep(scale, steps.surfaceActive),\n border: getStep(scale, steps.border),\n borderStrong: getStep(scale, steps.borderStrong),\n divider: getStep(scale, steps.divider),\n text: getStep(scale, steps.text),\n textMuted: getStep(scale, steps.textMuted),\n textSubtle: getStep(scale, steps.textSubtle),\n });\n\n const getColorMapping = (scale: ColorScale, neutralScale: ColorScale): RoleSemantics => {\n const solid = getStep(scale, steps.solid);\n const softChromaLimit = 0.08;\n\n // Chroma capping for soft tokens\n const getSoftStep = (idx: number) => {\n const hex = getStep(scale, idx);\n const color = oklch(hex);\n if (color && color.c > softChromaLimit) {\n return formatHex({ ...color, c: softChromaLimit });\n }\n return hex;\n };\n\n return {\n base: solid,\n hover: getStep(scale, 6), // 600\n strong: getStep(scale, 7), // 700\n softBg: getSoftStep(steps.softBg),\n softHover: getSoftStep(steps.softHover),\n softActive: getSoftStep(steps.softActive),\n outline: getStep(scale, steps.outline),\n onSolidText: getBestContrast(solid, getStep(neutralScale, 0), getStep(neutralScale, 10)),\n };\n };\n\n const neutral = getNeutralMapping(scales.neutral);\n const brand = getColorMapping(scales.primary, scales.neutral);\n const neutralAction = getColorMapping(scales.neutral, scales.neutral);\n const danger = getColorMapping(scales.danger, scales.neutral);\n const success = getColorMapping(scales.success, scales.neutral);\n const warning = getColorMapping(scales.warning, scales.neutral);\n\n const colors: Record<string, string> = {\n primary: getStep(scales.primary, steps.solid),\n secondary: getStep(scales.secondary, steps.solid),\n accent: getStep(scales.accent, steps.solid),\n highlight: getStep(scales.highlight, steps.solid),\n background: neutral.bg,\n surface: neutral.surface,\n text: neutral.text,\n textSecondary: neutral.textMuted,\n border: neutral.border,\n error: getStep(scales.danger, steps.solid),\n success: getStep(scales.success, steps.solid),\n warning: getStep(scales.warning, steps.solid),\n };\n\n const surface: SurfaceSemantics = {\n default: neutral.surface,\n subtle: neutral.bgSubtle,\n raised: neutral.surface,\n };\n\n const content: ContentSemantics = {\n default: neutral.text,\n muted: neutral.textMuted,\n subtle: neutral.textSubtle,\n inverse: brand.onSolidText,\n };\n\n const border: BorderSemantics = {\n default: neutral.border,\n strong: neutral.borderStrong,\n focus: brand.outline,\n };\n\n const action: ActionSemantics = {\n primary: brand,\n neutral: neutralAction,\n danger,\n };\n\n return {\n colors,\n scales,\n semantics: {\n neutral,\n brand,\n secondary: getColorMapping(scales.secondary, scales.neutral),\n accent: getColorMapping(scales.accent, scales.neutral),\n highlight: getColorMapping(scales.highlight, scales.neutral),\n danger,\n success,\n warning,\n surface,\n content,\n border,\n action,\n },\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ankhorage/surface",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.3",
|
|
5
5
|
"description": "Stable UI foundation for React Native and React Native Web.",
|
|
6
6
|
"homepage": "https://github.com/ankhorage/surface#readme",
|
|
7
7
|
"bugs": {
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
}
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@ankhorage/contracts": "^0.3.
|
|
44
|
+
"@ankhorage/contracts": "^0.3.1",
|
|
45
45
|
"@types/culori": "^4.0.1",
|
|
46
46
|
"culori": "^4.0.2"
|
|
47
47
|
},
|
|
@@ -2,7 +2,7 @@ import { describe, expect, it } from 'bun:test';
|
|
|
2
2
|
import { oklch } from 'culori';
|
|
3
3
|
|
|
4
4
|
import { generatePalette } from './colorEngine';
|
|
5
|
-
import type { ThemeConfig } from './types';
|
|
5
|
+
import type { ColorTone, ThemeConfig, ThemeSemantics } from './types';
|
|
6
6
|
|
|
7
7
|
const mockConfig: ThemeConfig = {
|
|
8
8
|
id: 'test',
|
|
@@ -19,6 +19,55 @@ const mockConfig: ThemeConfig = {
|
|
|
19
19
|
},
|
|
20
20
|
};
|
|
21
21
|
|
|
22
|
+
function configForColorTone(colorTone: ColorTone): ThemeConfig {
|
|
23
|
+
return {
|
|
24
|
+
...mockConfig,
|
|
25
|
+
light: {
|
|
26
|
+
...mockConfig.light,
|
|
27
|
+
colorTone,
|
|
28
|
+
},
|
|
29
|
+
dark: {
|
|
30
|
+
...mockConfig.dark,
|
|
31
|
+
colorTone,
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function lightness(hex: string): number {
|
|
37
|
+
const color = oklch(hex);
|
|
38
|
+
if (!color) {
|
|
39
|
+
throw new Error(`Expected valid OKLCH color for ${hex}.`);
|
|
40
|
+
}
|
|
41
|
+
return color.l;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function chroma(hex: string): number {
|
|
45
|
+
const color = oklch(hex);
|
|
46
|
+
if (!color) {
|
|
47
|
+
throw new Error(`Expected valid OKLCH color for ${hex}.`);
|
|
48
|
+
}
|
|
49
|
+
return color.c;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function expectRequiredSemanticRoles(semantics: ThemeSemantics) {
|
|
53
|
+
expect(semantics.neutral.bg).toBeDefined();
|
|
54
|
+
expect(semantics.neutral.surface).toBeDefined();
|
|
55
|
+
expect(semantics.neutral.text).toBeDefined();
|
|
56
|
+
expect(semantics.brand.base).toBeDefined();
|
|
57
|
+
expect(semantics.secondary.base).toBeDefined();
|
|
58
|
+
expect(semantics.accent.base).toBeDefined();
|
|
59
|
+
expect(semantics.highlight.base).toBeDefined();
|
|
60
|
+
expect(semantics.danger.base).toBeDefined();
|
|
61
|
+
expect(semantics.success.base).toBeDefined();
|
|
62
|
+
expect(semantics.warning.base).toBeDefined();
|
|
63
|
+
expect(semantics.surface.default).toBeDefined();
|
|
64
|
+
expect(semantics.content.default).toBeDefined();
|
|
65
|
+
expect(semantics.border.default).toBeDefined();
|
|
66
|
+
expect(semantics.action.primary.base).toBeDefined();
|
|
67
|
+
expect(semantics.action.neutral.base).toBeDefined();
|
|
68
|
+
expect(semantics.action.danger.base).toBeDefined();
|
|
69
|
+
}
|
|
70
|
+
|
|
22
71
|
describe('colorEngine', () => {
|
|
23
72
|
it('should generate a stable palette with deterministic chroma hierarchy', () => {
|
|
24
73
|
const { colors, semantics, scales } = generatePalette(mockConfig, 'light');
|
|
@@ -111,4 +160,68 @@ describe('colorEngine', () => {
|
|
|
111
160
|
expect(fallbackBlue).toBeDefined();
|
|
112
161
|
expect(p?.h).toBeCloseTo(fallbackBlue?.h ?? 0, 0);
|
|
113
162
|
});
|
|
163
|
+
|
|
164
|
+
it('keeps fluorescent and obsidian dark surfaces low-lightness', () => {
|
|
165
|
+
const fluorescent = generatePalette(configForColorTone('fluorescent'), 'dark');
|
|
166
|
+
const obsidian = generatePalette(configForColorTone('obsidian'), 'dark');
|
|
167
|
+
|
|
168
|
+
expect(lightness(fluorescent.semantics.neutral.bg)).toBeLessThan(0.2);
|
|
169
|
+
expect(lightness(fluorescent.semantics.surface.default)).toBeLessThan(0.2);
|
|
170
|
+
expect(lightness(obsidian.semantics.neutral.bg)).toBeLessThan(0.2);
|
|
171
|
+
expect(lightness(obsidian.semantics.surface.default)).toBeLessThan(0.2);
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
it('keeps fluorescent action colors higher chroma than neutral actions', () => {
|
|
175
|
+
const fluorescent = generatePalette(configForColorTone('fluorescent'), 'light');
|
|
176
|
+
const neutral = generatePalette(configForColorTone('neutral'), 'light');
|
|
177
|
+
|
|
178
|
+
expect(chroma(fluorescent.semantics.brand.base)).toBeGreaterThan(
|
|
179
|
+
chroma(neutral.semantics.action.neutral.base),
|
|
180
|
+
);
|
|
181
|
+
expect(chroma(fluorescent.semantics.accent.base)).toBeGreaterThan(
|
|
182
|
+
chroma(neutral.semantics.action.neutral.base),
|
|
183
|
+
);
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
it('keeps pastel backgrounds lower chroma than foreground and action colors', () => {
|
|
187
|
+
const { semantics } = generatePalette(configForColorTone('pastel'), 'light');
|
|
188
|
+
|
|
189
|
+
expect(chroma(semantics.neutral.bg)).toBeLessThan(chroma(semantics.brand.base));
|
|
190
|
+
expect(chroma(semantics.neutral.bg)).toBeLessThan(chroma(semantics.accent.base));
|
|
191
|
+
expect(chroma(semantics.surface.default)).toBeLessThan(chroma(semantics.action.primary.base));
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
it('keeps earth action colors aligned with mineral-like chroma', () => {
|
|
195
|
+
const earth = generatePalette(configForColorTone('earth'), 'light');
|
|
196
|
+
const mineral = generatePalette(configForColorTone('mineral'), 'light');
|
|
197
|
+
|
|
198
|
+
expect(chroma(earth.semantics.brand.base)).toBeGreaterThan(chroma(earth.semantics.neutral.bg));
|
|
199
|
+
expect(chroma(earth.semantics.secondary.base)).toBeCloseTo(
|
|
200
|
+
chroma(mineral.semantics.secondary.base),
|
|
201
|
+
3,
|
|
202
|
+
);
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
it('emits required semantic roles for every color tone', () => {
|
|
206
|
+
const colorTones: readonly ColorTone[] = [
|
|
207
|
+
'neutral',
|
|
208
|
+
'pastel',
|
|
209
|
+
'earth',
|
|
210
|
+
'mineral',
|
|
211
|
+
'muted',
|
|
212
|
+
'jewel',
|
|
213
|
+
'fluorescent',
|
|
214
|
+
'obsidian',
|
|
215
|
+
'vaporwave',
|
|
216
|
+
'monochromeAccent',
|
|
217
|
+
];
|
|
218
|
+
|
|
219
|
+
for (const colorTone of colorTones) {
|
|
220
|
+
const light = generatePalette(configForColorTone(colorTone), 'light');
|
|
221
|
+
const dark = generatePalette(configForColorTone(colorTone), 'dark');
|
|
222
|
+
|
|
223
|
+
expectRequiredSemanticRoles(light.semantics);
|
|
224
|
+
expectRequiredSemanticRoles(dark.semantics);
|
|
225
|
+
}
|
|
226
|
+
});
|
|
114
227
|
});
|
package/src/theme/colorEngine.ts
CHANGED
|
@@ -197,8 +197,8 @@ function getColorToneRolePalette(colorTone: ColorTone): {
|
|
|
197
197
|
return {
|
|
198
198
|
bg: 'pastel',
|
|
199
199
|
surface: 'pastel',
|
|
200
|
-
primary: '
|
|
201
|
-
secondary: '
|
|
200
|
+
primary: 'jewel',
|
|
201
|
+
secondary: 'jewel',
|
|
202
202
|
accent: 'jewel',
|
|
203
203
|
highlight: 'fluorescent',
|
|
204
204
|
};
|
|
@@ -207,8 +207,8 @@ function getColorToneRolePalette(colorTone: ColorTone): {
|
|
|
207
207
|
return {
|
|
208
208
|
bg: 'earth',
|
|
209
209
|
surface: 'earth',
|
|
210
|
-
primary: '
|
|
211
|
-
secondary: '
|
|
210
|
+
primary: 'mineral',
|
|
211
|
+
secondary: 'mineral',
|
|
212
212
|
accent: 'jewel',
|
|
213
213
|
highlight: 'jewel',
|
|
214
214
|
};
|
|
@@ -245,9 +245,9 @@ function getColorToneRolePalette(colorTone: ColorTone): {
|
|
|
245
245
|
|
|
246
246
|
case 'fluorescent':
|
|
247
247
|
return {
|
|
248
|
-
bg: '
|
|
249
|
-
surface: '
|
|
250
|
-
primary: '
|
|
248
|
+
bg: 'obsidian',
|
|
249
|
+
surface: 'obsidian',
|
|
250
|
+
primary: 'fluorescent',
|
|
251
251
|
secondary: 'jewel',
|
|
252
252
|
accent: 'fluorescent',
|
|
253
253
|
highlight: 'fluorescent',
|