@ngstarter-ui/components 21.0.1 → 21.0.2

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.
@@ -1268,7 +1268,7 @@ function generateNgsThemeProperties(primaryColor, colorScheme = 'light') {
1268
1268
  return {
1269
1269
  '--ngs-color-primary-seed': primaryColor,
1270
1270
  '--ngs-color-primary': primaryColor,
1271
- '--ngs-color-on-primary': contrastColor('--ngs-color-primary'),
1271
+ '--ngs-color-on-primary': '#ffffff',
1272
1272
  };
1273
1273
  }
1274
1274
  return colorScheme === 'dark'
@@ -1298,27 +1298,27 @@ function generateLightThemeProperties(seed) {
1298
1298
  return withSharedGeneratedProperties({
1299
1299
  '--ngs-color-primary': primary,
1300
1300
  '--ngs-color-primary-seed': primary,
1301
- '--ngs-color-on-primary': contrastColor('--ngs-color-primary'),
1301
+ '--ngs-color-on-primary': contrastColor(primary),
1302
1302
  '--ngs-color-primary-container': primaryContainer,
1303
- '--ngs-color-on-primary-container': contrastColor('--ngs-color-primary-container'),
1303
+ '--ngs-color-on-primary-container': contrastColor(primaryContainer),
1304
1304
  '--ngs-color-secondary': secondary,
1305
- '--ngs-color-on-secondary': contrastColor('--ngs-color-secondary'),
1305
+ '--ngs-color-on-secondary': contrastColor(secondary),
1306
1306
  '--ngs-color-secondary-container': secondaryContainer,
1307
- '--ngs-color-on-secondary-container': contrastColor('--ngs-color-secondary-container'),
1307
+ '--ngs-color-on-secondary-container': contrastColor(secondaryContainer),
1308
1308
  '--ngs-color-tertiary': tertiary,
1309
- '--ngs-color-on-tertiary': contrastColor('--ngs-color-tertiary'),
1309
+ '--ngs-color-on-tertiary': contrastColor(tertiary),
1310
1310
  '--ngs-color-tertiary-container': tertiaryContainer,
1311
- '--ngs-color-on-tertiary-container': contrastColor('--ngs-color-tertiary-container'),
1311
+ '--ngs-color-on-tertiary-container': contrastColor(tertiaryContainer),
1312
1312
  '--ngs-color-info': info,
1313
- '--ngs-color-on-info': contrastColor('--ngs-color-info'),
1313
+ '--ngs-color-on-info': contrastColor(info),
1314
1314
  '--ngs-color-info-container': infoContainer,
1315
- '--ngs-color-on-info-container': contrastColor('--ngs-color-info-container'),
1315
+ '--ngs-color-on-info-container': contrastColor(infoContainer),
1316
1316
  ...status,
1317
1317
  '--ngs-color-background': neutral[0],
1318
- '--ngs-color-on-background': contrastColor('--ngs-color-background'),
1318
+ '--ngs-color-on-background': contrastColor(neutral[0]),
1319
1319
  '--ngs-color-surface': neutral[1],
1320
1320
  '--ngs-color-surface-bright': '#ffffff',
1321
- '--ngs-color-on-surface': contrastColor('--ngs-color-surface'),
1321
+ '--ngs-color-on-surface': contrastColor(neutral[1]),
1322
1322
  '--ngs-color-on-surface-variant': neutral[6],
1323
1323
  '--ngs-color-neutral-50': neutral[0],
1324
1324
  '--ngs-color-neutral-100': neutral[1],
@@ -1361,7 +1361,7 @@ function generateLightThemeProperties(seed) {
1361
1361
  }
1362
1362
  function generateDarkThemeProperties(seed) {
1363
1363
  const source = rgbToHsl(seed);
1364
- const primary = colorFromTone(source, 76, 0.82);
1364
+ const primary = colorFromTone(source, 82, 0.82);
1365
1365
  const primaryContainer = colorFromTone(source, 28, 0.78);
1366
1366
  const secondary = colorFromTone(source, 78, 0.36, -8);
1367
1367
  const secondaryContainer = colorFromTone(source, 28, 0.3, -8);
@@ -1377,27 +1377,27 @@ function generateDarkThemeProperties(seed) {
1377
1377
  return withSharedGeneratedProperties({
1378
1378
  '--ngs-color-primary': primary,
1379
1379
  '--ngs-color-primary-seed': toHex(seed),
1380
- '--ngs-color-on-primary': contrastColor('--ngs-color-primary'),
1380
+ '--ngs-color-on-primary': contrastColor(primary),
1381
1381
  '--ngs-color-primary-container': primaryContainer,
1382
- '--ngs-color-on-primary-container': contrastColor('--ngs-color-primary-container'),
1382
+ '--ngs-color-on-primary-container': contrastColor(primaryContainer),
1383
1383
  '--ngs-color-secondary': secondary,
1384
- '--ngs-color-on-secondary': contrastColor('--ngs-color-secondary'),
1384
+ '--ngs-color-on-secondary': contrastColor(secondary),
1385
1385
  '--ngs-color-secondary-container': secondaryContainer,
1386
- '--ngs-color-on-secondary-container': contrastColor('--ngs-color-secondary-container'),
1386
+ '--ngs-color-on-secondary-container': contrastColor(secondaryContainer),
1387
1387
  '--ngs-color-tertiary': tertiary,
1388
- '--ngs-color-on-tertiary': contrastColor('--ngs-color-tertiary'),
1388
+ '--ngs-color-on-tertiary': contrastColor(tertiary),
1389
1389
  '--ngs-color-tertiary-container': tertiaryContainer,
1390
- '--ngs-color-on-tertiary-container': contrastColor('--ngs-color-tertiary-container'),
1390
+ '--ngs-color-on-tertiary-container': contrastColor(tertiaryContainer),
1391
1391
  '--ngs-color-info': info,
1392
- '--ngs-color-on-info': contrastColor('--ngs-color-info'),
1392
+ '--ngs-color-on-info': contrastColor(info),
1393
1393
  '--ngs-color-info-container': infoContainer,
1394
- '--ngs-color-on-info-container': contrastColor('--ngs-color-info-container'),
1394
+ '--ngs-color-on-info-container': contrastColor(infoContainer),
1395
1395
  ...status,
1396
1396
  '--ngs-color-background': neutral[0],
1397
- '--ngs-color-on-background': contrastColor('--ngs-color-background'),
1397
+ '--ngs-color-on-background': contrastColor(neutral[0]),
1398
1398
  '--ngs-color-surface': neutral[1],
1399
1399
  '--ngs-color-surface-bright': neutral[2],
1400
- '--ngs-color-on-surface': contrastColor('--ngs-color-surface'),
1400
+ '--ngs-color-on-surface': contrastColor(neutral[1]),
1401
1401
  '--ngs-color-on-surface-variant': neutral[8],
1402
1402
  '--ngs-color-neutral-50': neutral[0],
1403
1403
  '--ngs-color-neutral-100': neutral[1],
@@ -1476,47 +1476,59 @@ function makeNeutralScale(source, colorScheme) {
1476
1476
  }
1477
1477
  function makeStatusColors(colorScheme) {
1478
1478
  if (colorScheme === 'dark') {
1479
+ const danger = '#f87171';
1480
+ const dangerContainer = '#7f1d1d';
1481
+ const success = '#4ade80';
1482
+ const successContainer = '#166534';
1483
+ const warning = '#fbbf24';
1484
+ const warningContainer = '#78350f';
1479
1485
  return {
1480
- '--ngs-color-danger': '#f87171',
1481
- '--ngs-color-on-danger': contrastColor('--ngs-color-danger'),
1482
- '--ngs-color-danger-container': '#7f1d1d',
1483
- '--ngs-color-on-danger-container': contrastColor('--ngs-color-danger-container'),
1486
+ '--ngs-color-danger': danger,
1487
+ '--ngs-color-on-danger': contrastColor(danger),
1488
+ '--ngs-color-danger-container': dangerContainer,
1489
+ '--ngs-color-on-danger-container': contrastColor(dangerContainer),
1484
1490
  '--ngs-color-danger-container-lowest': '#1f0707',
1485
1491
  '--ngs-color-danger-container-low': '#2f0b0b',
1486
1492
  '--ngs-color-danger-container-high': '#5f1717',
1487
1493
  '--ngs-color-danger-container-highest': '#7f1d1d',
1488
- '--ngs-color-success': '#4ade80',
1489
- '--ngs-color-on-success': contrastColor('--ngs-color-success'),
1490
- '--ngs-color-success-container': '#166534',
1491
- '--ngs-color-on-success-container': contrastColor('--ngs-color-success-container'),
1492
- '--ngs-color-warning': '#fbbf24',
1493
- '--ngs-color-on-warning': contrastColor('--ngs-color-warning'),
1494
- '--ngs-color-warning-container': '#78350f',
1495
- '--ngs-color-on-warning-container': contrastColor('--ngs-color-warning-container'),
1496
- '--ngs-color-orange-container': '#78350f',
1497
- '--ngs-color-on-orange-container': contrastColor('--ngs-color-orange-container'),
1494
+ '--ngs-color-success': success,
1495
+ '--ngs-color-on-success': contrastColor(success),
1496
+ '--ngs-color-success-container': successContainer,
1497
+ '--ngs-color-on-success-container': contrastColor(successContainer),
1498
+ '--ngs-color-warning': warning,
1499
+ '--ngs-color-on-warning': contrastColor(warning),
1500
+ '--ngs-color-warning-container': warningContainer,
1501
+ '--ngs-color-on-warning-container': contrastColor(warningContainer),
1502
+ '--ngs-color-orange-container': warningContainer,
1503
+ '--ngs-color-on-orange-container': contrastColor(warningContainer),
1498
1504
  '--ngs-color-green-500': '#4ade80',
1499
1505
  };
1500
1506
  }
1507
+ const danger = '#dc2626';
1508
+ const dangerContainer = '#fee2e2';
1509
+ const success = '#16a34a';
1510
+ const successContainer = '#dcfce7';
1511
+ const warning = '#d97706';
1512
+ const warningContainer = '#fef3c7';
1501
1513
  return {
1502
- '--ngs-color-danger': '#dc2626',
1503
- '--ngs-color-on-danger': contrastColor('--ngs-color-danger'),
1504
- '--ngs-color-danger-container': '#fee2e2',
1505
- '--ngs-color-on-danger-container': contrastColor('--ngs-color-danger-container'),
1514
+ '--ngs-color-danger': danger,
1515
+ '--ngs-color-on-danger': contrastColor(danger),
1516
+ '--ngs-color-danger-container': dangerContainer,
1517
+ '--ngs-color-on-danger-container': contrastColor(dangerContainer),
1506
1518
  '--ngs-color-danger-container-lowest': '#fffafa',
1507
1519
  '--ngs-color-danger-container-low': '#fef2f2',
1508
1520
  '--ngs-color-danger-container-high': '#fecaca',
1509
1521
  '--ngs-color-danger-container-highest': '#fca5a5',
1510
- '--ngs-color-success': '#16a34a',
1511
- '--ngs-color-on-success': contrastColor('--ngs-color-success'),
1512
- '--ngs-color-success-container': '#dcfce7',
1513
- '--ngs-color-on-success-container': contrastColor('--ngs-color-success-container'),
1514
- '--ngs-color-warning': '#d97706',
1515
- '--ngs-color-on-warning': contrastColor('--ngs-color-warning'),
1516
- '--ngs-color-warning-container': '#fef3c7',
1517
- '--ngs-color-on-warning-container': contrastColor('--ngs-color-warning-container'),
1518
- '--ngs-color-orange-container': '#fef3c7',
1519
- '--ngs-color-on-orange-container': contrastColor('--ngs-color-orange-container'),
1522
+ '--ngs-color-success': success,
1523
+ '--ngs-color-on-success': contrastColor(success),
1524
+ '--ngs-color-success-container': successContainer,
1525
+ '--ngs-color-on-success-container': contrastColor(successContainer),
1526
+ '--ngs-color-warning': warning,
1527
+ '--ngs-color-on-warning': contrastColor(warning),
1528
+ '--ngs-color-warning-container': warningContainer,
1529
+ '--ngs-color-on-warning-container': contrastColor(warningContainer),
1530
+ '--ngs-color-orange-container': warningContainer,
1531
+ '--ngs-color-on-orange-container': contrastColor(warningContainer),
1520
1532
  '--ngs-color-green-500': '#16a34a',
1521
1533
  };
1522
1534
  }
@@ -1527,8 +1539,15 @@ function colorFromTone(source, lightness, saturationMultiplier = 1, hueShift = 0
1527
1539
  l: lightness,
1528
1540
  });
1529
1541
  }
1530
- function contrastColor(propertyName) {
1531
- return `contrast-color(var(${propertyName}))`;
1542
+ function contrastColor(color) {
1543
+ const rgb = parseColor(color);
1544
+ if (!rgb) {
1545
+ return '#ffffff';
1546
+ }
1547
+ const luminance = relativeLuminance(rgb);
1548
+ const contrastWithBlack = (luminance + 0.05) / 0.05;
1549
+ const contrastWithWhite = 1.05 / (luminance + 0.05);
1550
+ return contrastWithBlack >= contrastWithWhite ? '#000000' : '#ffffff';
1532
1551
  }
1533
1552
  function parseColor(color) {
1534
1553
  const value = color.trim().toLowerCase();
@@ -1682,6 +1701,15 @@ function toHex({ r, g, b }) {
1682
1701
  function toHexChannel(value) {
1683
1702
  return clamp(Math.round(value), 0, 255).toString(16).padStart(2, '0');
1684
1703
  }
1704
+ function relativeLuminance({ r, g, b }) {
1705
+ const [red, green, blue] = [r, g, b].map(channel => {
1706
+ const normalized = channel / 255;
1707
+ return normalized <= 0.03928
1708
+ ? normalized / 12.92
1709
+ : ((normalized + 0.055) / 1.055) ** 2.4;
1710
+ });
1711
+ return 0.2126 * red + 0.7152 * green + 0.0722 * blue;
1712
+ }
1685
1713
  function normalizeHue(hue) {
1686
1714
  return ((hue % 360) + 360) % 360;
1687
1715
  }