@webmate-studio/builder 0.2.141 → 0.2.143

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webmate-studio/builder",
3
- "version": "0.2.141",
3
+ "version": "0.2.143",
4
4
  "type": "module",
5
5
  "description": "Webmate Studio Component Builder",
6
6
  "keywords": [
@@ -74,6 +74,14 @@ export function generateColorScale(baseHex, curve) {
74
74
  c = base.c;
75
75
  } else {
76
76
  c = computeChroma(L[i], L[8], base.c, stdDev, chromaScale);
77
+
78
+ // Neutraltöne: Helle Stufen extra dämpfen, damit Steps 2-5
79
+ // nicht zu farbig wirken. Nahe der Base bleibt volle Chroma.
80
+ if (isLowChroma && L[i] > L[8]) {
81
+ const distFromBase = (L[i] - L[8]) / (0.985 - L[8]); // 0 bei Base, 1 bei Step 1
82
+ const damping = 1.0 - 0.55 * distFromBase * distFromBase;
83
+ c *= damping;
84
+ }
77
85
  }
78
86
 
79
87
  const mapped = gamutMapOklch(L[i], c, base.h);
@@ -249,10 +257,10 @@ function buildLightnessRamp(baseL, isLowChroma = false) {
249
257
 
250
258
  if (isLowChroma) {
251
259
  // Neutraltöne: Step 12 muss sehr dunkel sein (Hauptschriftfarbe),
252
- // Step 11 = Low-Contrast Text, volle Spreizung nach unten
260
+ // Step 11 = Low-Contrast Text, gleichmäßigere Verteilung nach unten
253
261
  const bottomL = 0.25;
254
262
  const darkRange = safeBaseL - bottomL;
255
- step10L = safeBaseL - darkRange * 0.12;
263
+ step10L = safeBaseL - darkRange * 0.20;
256
264
  step11L = safeBaseL - darkRange * 0.55;
257
265
  step12L = bottomL;
258
266
  } else {
@@ -352,13 +360,18 @@ function computeChroma(stepL, baseL, baseC, stdDev, chromaScale) {
352
360
  gaussian = 0.97 * Math.exp((-12 / stdDev) * edgeDiff * edgeDiff);
353
361
  }
354
362
 
355
- // Lightness-Begrenzung: Asymmetrisch
356
- // Helle Seite (L > 0.85): Chroma fällt steil auf 0 → Steps 1-2 bleiben fast weiß
357
- // Dunkle Seite (L < 0.3): Chroma fällt moderat Steps 11-12 behalten Farbton
358
- // Mitte (0.3-0.85): Nahezu volle Chroma möglich
363
+ // Lightness-Begrenzung: Asymmetrisch + Chroma-abhängig
364
+ // Bei hochgesättigten Farben (Grün, Cyan) wirken schon kleine Chroma-Werte
365
+ // bei hoher Lightness "neonig". Der Einsatzpunkt wird daher bei hoher
366
+ // Base-Chroma nach unten verschoben.
367
+ // Helle Seite: Einsatz ab threshold (0.85 bei C=0, 0.75 bei C≥0.17)
368
+ // Dunkle Seite (L < 0.3): Chroma fällt moderat
369
+ // Mitte: volle Chroma möglich
370
+ const chromaFactor = Math.min(baseC / 0.17, 1.0); // 0 bei grau, 1 bei gesättigtem Grün
371
+ const lightThreshold = 0.85 - chromaFactor * 0.10; // 0.85 → 0.75
359
372
  let lightnessLimit;
360
- if (stepL > 0.85) {
361
- const t = (stepL - 0.85) / 0.15;
373
+ if (stepL > lightThreshold) {
374
+ const t = (stepL - lightThreshold) / (1.0 - lightThreshold);
362
375
  lightnessLimit = 1.0 - t * t;
363
376
  } else if (stepL < 0.3) {
364
377
  const t = stepL / 0.3;