@appmax_npm/ds-prime 1.0.0-alpha.185 → 1.0.0-alpha.186

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.
@@ -23,6 +23,8 @@ export interface FranchisePresetResult {
23
23
  preset: any;
24
24
  primaryRamp: Record<number, string>;
25
25
  secondaryRamp: Record<number, string>;
26
+ primaryContrastRamp: Record<number, string>;
27
+ secondaryContrastRamp: Record<number, string>;
26
28
  }
27
29
  /**
28
30
  * Constrói um preset customizado para um franqueado a partir de um preset base
@@ -95,12 +95,34 @@ function getLuminance(hex) {
95
95
  0.0722 * (b / 255 <= 0.03928 ? b / 255 / 12.92 : Math.pow((b / 255 + 0.055) / 1.055, 2.4)));
96
96
  }
97
97
  /**
98
- * Verifica se uma cor é clara demais para uso como primary interativa
99
- * Threshold 0.65captura cores como #B2D1FF, #CCCCCC, #FFFFFF
100
- * sem afetar cores médias como #6699CC, #0052CC
98
+ * Verifica se uma cor é clara demais para uso como primary interativa.
99
+ * Threshold 0.85 dispara o ajuste de luminância em cores quase-brancas
100
+ * (#F5F5F5, #FFFFFF). Cores médias/claras como #C4FFC4, #B2D1FF, #6699CC
101
+ * passam direto e o contraste é resolvido via --primary-contrast por shade.
101
102
  */
102
103
  function isLightColor(hex) {
103
- return getLuminance(hex) > 0.65;
104
+ return getLuminance(hex) > 0.85;
105
+ }
106
+ /**
107
+ * Decide a melhor cor de texto (preto ou branco) para usar sobre um fundo.
108
+ * Usa luma YIQ — mais simples e perceptualmente próxima ao WCAG completo.
109
+ */
110
+ function pickContrastColor(hex) {
111
+ const rgb = hexToRgb(hex);
112
+ if (!rgb)
113
+ return '#ffffff';
114
+ const luma = (0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b) / 255;
115
+ return luma > 0.5 ? '#171717' : '#ffffff';
116
+ }
117
+ /**
118
+ * Aplica pickContrastColor em cada shade de uma rampa.
119
+ */
120
+ function generateContrastRamp(ramp) {
121
+ const out = {};
122
+ for (const [shade, hex] of Object.entries(ramp)) {
123
+ out[Number(shade)] = pickContrastColor(hex);
124
+ }
125
+ return out;
104
126
  }
105
127
  /**
106
128
  * Converte RGB para HSL
@@ -228,6 +250,8 @@ export function buildFranchisePreset(basePreset, colors) {
228
250
  preset: basePreset,
229
251
  primaryRamp: {},
230
252
  secondaryRamp: {},
253
+ primaryContrastRamp: {},
254
+ secondaryContrastRamp: {},
231
255
  };
232
256
  }
233
257
  if (!isValidColor(colors.secondary)) {
@@ -236,6 +260,8 @@ export function buildFranchisePreset(basePreset, colors) {
236
260
  preset: basePreset,
237
261
  primaryRamp: {},
238
262
  secondaryRamp: {},
263
+ primaryContrastRamp: {},
264
+ secondaryContrastRamp: {},
239
265
  };
240
266
  }
241
267
  // Verificar contraste mínimo (WCAG AA = 4.5:1)
@@ -366,10 +392,14 @@ export function buildFranchisePreset(basePreset, colors) {
366
392
  },
367
393
  components: componentOverrides,
368
394
  });
395
+ const primaryContrastRamp = generateContrastRamp(primaryRamp);
396
+ const secondaryContrastRamp = generateContrastRamp(secondaryRamp);
369
397
  return {
370
398
  preset: customPreset,
371
399
  primaryRamp,
372
400
  secondaryRamp,
401
+ primaryContrastRamp,
402
+ secondaryContrastRamp,
373
403
  };
374
404
  }
375
405
  /**