@ngstarter-ui/components 1.0.47 → 1.0.48

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.
@@ -1157,8 +1157,6 @@ function provideNgsTheme(options = {}) {
1157
1157
  };
1158
1158
  }
1159
1159
 
1160
- const LIGHT_TEXT = '#ffffff';
1161
- const DARK_TEXT = '#0f172a';
1162
1160
  const NGS_GENERATED_THEME_PROPERTY_NAMES = [
1163
1161
  '--ngs-color-primary-seed',
1164
1162
  '--ngs-color-primary',
@@ -1270,6 +1268,7 @@ function generateNgsThemeProperties(primaryColor, colorScheme = 'light') {
1270
1268
  return {
1271
1269
  '--ngs-color-primary-seed': primaryColor,
1272
1270
  '--ngs-color-primary': primaryColor,
1271
+ '--ngs-color-on-primary': contrastColor('--ngs-color-primary'),
1273
1272
  };
1274
1273
  }
1275
1274
  return colorScheme === 'dark'
@@ -1299,27 +1298,27 @@ function generateLightThemeProperties(seed) {
1299
1298
  return withSharedGeneratedProperties({
1300
1299
  '--ngs-color-primary': primary,
1301
1300
  '--ngs-color-primary-seed': primary,
1302
- '--ngs-color-on-primary': readableOn(primary),
1301
+ '--ngs-color-on-primary': contrastColor('--ngs-color-primary'),
1303
1302
  '--ngs-color-primary-container': primaryContainer,
1304
- '--ngs-color-on-primary-container': readableOn(primaryContainer, DARK_TEXT, primary),
1303
+ '--ngs-color-on-primary-container': contrastColor('--ngs-color-primary-container'),
1305
1304
  '--ngs-color-secondary': secondary,
1306
- '--ngs-color-on-secondary': readableOn(secondary),
1305
+ '--ngs-color-on-secondary': contrastColor('--ngs-color-secondary'),
1307
1306
  '--ngs-color-secondary-container': secondaryContainer,
1308
- '--ngs-color-on-secondary-container': readableOn(secondaryContainer, DARK_TEXT, secondary),
1307
+ '--ngs-color-on-secondary-container': contrastColor('--ngs-color-secondary-container'),
1309
1308
  '--ngs-color-tertiary': tertiary,
1310
- '--ngs-color-on-tertiary': readableOn(tertiary),
1309
+ '--ngs-color-on-tertiary': contrastColor('--ngs-color-tertiary'),
1311
1310
  '--ngs-color-tertiary-container': tertiaryContainer,
1312
- '--ngs-color-on-tertiary-container': readableOn(tertiaryContainer, DARK_TEXT, tertiary),
1311
+ '--ngs-color-on-tertiary-container': contrastColor('--ngs-color-tertiary-container'),
1313
1312
  '--ngs-color-info': info,
1314
- '--ngs-color-on-info': readableOn(info),
1313
+ '--ngs-color-on-info': contrastColor('--ngs-color-info'),
1315
1314
  '--ngs-color-info-container': infoContainer,
1316
- '--ngs-color-on-info-container': readableOn(infoContainer, DARK_TEXT, info),
1315
+ '--ngs-color-on-info-container': contrastColor('--ngs-color-info-container'),
1317
1316
  ...status,
1318
1317
  '--ngs-color-background': neutral[0],
1319
- '--ngs-color-on-background': neutral[11],
1318
+ '--ngs-color-on-background': contrastColor('--ngs-color-background'),
1320
1319
  '--ngs-color-surface': neutral[1],
1321
1320
  '--ngs-color-surface-bright': '#ffffff',
1322
- '--ngs-color-on-surface': neutral[11],
1321
+ '--ngs-color-on-surface': contrastColor('--ngs-color-surface'),
1323
1322
  '--ngs-color-on-surface-variant': neutral[6],
1324
1323
  '--ngs-color-neutral-50': neutral[0],
1325
1324
  '--ngs-color-neutral-100': neutral[1],
@@ -1348,13 +1347,13 @@ function generateLightThemeProperties(seed) {
1348
1347
  '--ngs-color-strong': neutral[6],
1349
1348
  '--ngs-state-selected-color': primary,
1350
1349
  '--ngs-button-tonal-bg': secondaryContainer,
1351
- '--ngs-button-tonal-color': readableOn(secondaryContainer, DARK_TEXT, secondary),
1350
+ '--ngs-button-tonal-color': 'var(--ngs-color-on-secondary-container)',
1352
1351
  '--ngs-button-outlined-border': outlineVariant,
1353
1352
  '--ngs-field-border-color': outlineVariant,
1354
1353
  '--ngs-field-border-focus-color': primary,
1355
1354
  '--ngs-field-filled-bg': neutral[1],
1356
1355
  '--ngs-dropdown-item-selected-bg': primaryContainer,
1357
- '--ngs-dropdown-item-selected-color': readableOn(primaryContainer, DARK_TEXT, primary),
1356
+ '--ngs-dropdown-item-selected-color': 'var(--ngs-color-on-primary-container)',
1358
1357
  '--ngs-nav-item-active-color': primary,
1359
1358
  '--ngs-nav-item-active-bg': primaryContainer,
1360
1359
  '--ngs-nav-item-active-icon-color': primary,
@@ -1378,27 +1377,27 @@ function generateDarkThemeProperties(seed) {
1378
1377
  return withSharedGeneratedProperties({
1379
1378
  '--ngs-color-primary': primary,
1380
1379
  '--ngs-color-primary-seed': toHex(seed),
1381
- '--ngs-color-on-primary': readableOn(primary),
1380
+ '--ngs-color-on-primary': contrastColor('--ngs-color-primary'),
1382
1381
  '--ngs-color-primary-container': primaryContainer,
1383
- '--ngs-color-on-primary-container': readableOn(primaryContainer),
1382
+ '--ngs-color-on-primary-container': contrastColor('--ngs-color-primary-container'),
1384
1383
  '--ngs-color-secondary': secondary,
1385
- '--ngs-color-on-secondary': readableOn(secondary),
1384
+ '--ngs-color-on-secondary': contrastColor('--ngs-color-secondary'),
1386
1385
  '--ngs-color-secondary-container': secondaryContainer,
1387
- '--ngs-color-on-secondary-container': readableOn(secondaryContainer),
1386
+ '--ngs-color-on-secondary-container': contrastColor('--ngs-color-secondary-container'),
1388
1387
  '--ngs-color-tertiary': tertiary,
1389
- '--ngs-color-on-tertiary': readableOn(tertiary),
1388
+ '--ngs-color-on-tertiary': contrastColor('--ngs-color-tertiary'),
1390
1389
  '--ngs-color-tertiary-container': tertiaryContainer,
1391
- '--ngs-color-on-tertiary-container': readableOn(tertiaryContainer),
1390
+ '--ngs-color-on-tertiary-container': contrastColor('--ngs-color-tertiary-container'),
1392
1391
  '--ngs-color-info': info,
1393
- '--ngs-color-on-info': readableOn(info),
1392
+ '--ngs-color-on-info': contrastColor('--ngs-color-info'),
1394
1393
  '--ngs-color-info-container': infoContainer,
1395
- '--ngs-color-on-info-container': readableOn(infoContainer),
1394
+ '--ngs-color-on-info-container': contrastColor('--ngs-color-info-container'),
1396
1395
  ...status,
1397
1396
  '--ngs-color-background': neutral[0],
1398
- '--ngs-color-on-background': neutral[11],
1397
+ '--ngs-color-on-background': contrastColor('--ngs-color-background'),
1399
1398
  '--ngs-color-surface': neutral[1],
1400
1399
  '--ngs-color-surface-bright': neutral[2],
1401
- '--ngs-color-on-surface': neutral[11],
1400
+ '--ngs-color-on-surface': contrastColor('--ngs-color-surface'),
1402
1401
  '--ngs-color-on-surface-variant': neutral[8],
1403
1402
  '--ngs-color-neutral-50': neutral[0],
1404
1403
  '--ngs-color-neutral-100': neutral[1],
@@ -1427,13 +1426,13 @@ function generateDarkThemeProperties(seed) {
1427
1426
  '--ngs-color-strong': neutral[9],
1428
1427
  '--ngs-state-selected-color': primary,
1429
1428
  '--ngs-button-tonal-bg': secondaryContainer,
1430
- '--ngs-button-tonal-color': readableOn(secondaryContainer),
1429
+ '--ngs-button-tonal-color': 'var(--ngs-color-on-secondary-container)',
1431
1430
  '--ngs-button-outlined-border': outlineVariant,
1432
1431
  '--ngs-field-border-color': outlineVariant,
1433
1432
  '--ngs-field-border-focus-color': primary,
1434
1433
  '--ngs-field-filled-bg': neutral[2],
1435
1434
  '--ngs-dropdown-item-selected-bg': primaryContainer,
1436
- '--ngs-dropdown-item-selected-color': readableOn(primaryContainer),
1435
+ '--ngs-dropdown-item-selected-color': 'var(--ngs-color-on-primary-container)',
1437
1436
  '--ngs-nav-item-active-color': primary,
1438
1437
  '--ngs-nav-item-active-bg': primaryContainer,
1439
1438
  '--ngs-nav-item-active-icon-color': primary,
@@ -1479,45 +1478,45 @@ function makeStatusColors(colorScheme) {
1479
1478
  if (colorScheme === 'dark') {
1480
1479
  return {
1481
1480
  '--ngs-color-danger': '#f87171',
1482
- '--ngs-color-on-danger': '#450a0a',
1481
+ '--ngs-color-on-danger': contrastColor('--ngs-color-danger'),
1483
1482
  '--ngs-color-danger-container': '#7f1d1d',
1484
- '--ngs-color-on-danger-container': '#fef2f2',
1483
+ '--ngs-color-on-danger-container': contrastColor('--ngs-color-danger-container'),
1485
1484
  '--ngs-color-danger-container-lowest': '#1f0707',
1486
1485
  '--ngs-color-danger-container-low': '#2f0b0b',
1487
1486
  '--ngs-color-danger-container-high': '#5f1717',
1488
1487
  '--ngs-color-danger-container-highest': '#7f1d1d',
1489
1488
  '--ngs-color-success': '#4ade80',
1490
- '--ngs-color-on-success': '#052e16',
1489
+ '--ngs-color-on-success': contrastColor('--ngs-color-success'),
1491
1490
  '--ngs-color-success-container': '#166534',
1492
- '--ngs-color-on-success-container': '#dcfce7',
1491
+ '--ngs-color-on-success-container': contrastColor('--ngs-color-success-container'),
1493
1492
  '--ngs-color-warning': '#fbbf24',
1494
- '--ngs-color-on-warning': '#451a03',
1493
+ '--ngs-color-on-warning': contrastColor('--ngs-color-warning'),
1495
1494
  '--ngs-color-warning-container': '#78350f',
1496
- '--ngs-color-on-warning-container': '#fef3c7',
1495
+ '--ngs-color-on-warning-container': contrastColor('--ngs-color-warning-container'),
1497
1496
  '--ngs-color-orange-container': '#78350f',
1498
- '--ngs-color-on-orange-container': '#fef3c7',
1497
+ '--ngs-color-on-orange-container': contrastColor('--ngs-color-orange-container'),
1499
1498
  '--ngs-color-green-500': '#4ade80',
1500
1499
  };
1501
1500
  }
1502
1501
  return {
1503
1502
  '--ngs-color-danger': '#dc2626',
1504
- '--ngs-color-on-danger': '#ffffff',
1503
+ '--ngs-color-on-danger': contrastColor('--ngs-color-danger'),
1505
1504
  '--ngs-color-danger-container': '#fee2e2',
1506
- '--ngs-color-on-danger-container': '#7f1d1d',
1505
+ '--ngs-color-on-danger-container': contrastColor('--ngs-color-danger-container'),
1507
1506
  '--ngs-color-danger-container-lowest': '#fffafa',
1508
1507
  '--ngs-color-danger-container-low': '#fef2f2',
1509
1508
  '--ngs-color-danger-container-high': '#fecaca',
1510
1509
  '--ngs-color-danger-container-highest': '#fca5a5',
1511
1510
  '--ngs-color-success': '#16a34a',
1512
- '--ngs-color-on-success': '#ffffff',
1511
+ '--ngs-color-on-success': contrastColor('--ngs-color-success'),
1513
1512
  '--ngs-color-success-container': '#dcfce7',
1514
- '--ngs-color-on-success-container': '#14532d',
1513
+ '--ngs-color-on-success-container': contrastColor('--ngs-color-success-container'),
1515
1514
  '--ngs-color-warning': '#d97706',
1516
- '--ngs-color-on-warning': '#ffffff',
1515
+ '--ngs-color-on-warning': contrastColor('--ngs-color-warning'),
1517
1516
  '--ngs-color-warning-container': '#fef3c7',
1518
- '--ngs-color-on-warning-container': '#78350f',
1517
+ '--ngs-color-on-warning-container': contrastColor('--ngs-color-warning-container'),
1519
1518
  '--ngs-color-orange-container': '#fef3c7',
1520
- '--ngs-color-on-orange-container': '#78350f',
1519
+ '--ngs-color-on-orange-container': contrastColor('--ngs-color-orange-container'),
1521
1520
  '--ngs-color-green-500': '#16a34a',
1522
1521
  };
1523
1522
  }
@@ -1528,14 +1527,8 @@ function colorFromTone(source, lightness, saturationMultiplier = 1, hueShift = 0
1528
1527
  l: lightness,
1529
1528
  });
1530
1529
  }
1531
- function readableOn(color, dark = DARK_TEXT, light = LIGHT_TEXT) {
1532
- const bg = parseColor(color);
1533
- if (!bg) {
1534
- return light;
1535
- }
1536
- const darkContrast = contrastRatio(bg, parseColor(dark) ?? { r: 15, g: 23, b: 42 });
1537
- const lightContrast = contrastRatio(bg, parseColor(light) ?? { r: 255, g: 255, b: 255 });
1538
- return darkContrast >= lightContrast ? dark : light;
1530
+ function contrastColor(propertyName) {
1531
+ return `contrast-color(var(${propertyName}))`;
1539
1532
  }
1540
1533
  function parseColor(color) {
1541
1534
  const value = color.trim().toLowerCase();
@@ -1689,21 +1682,6 @@ function toHex({ r, g, b }) {
1689
1682
  function toHexChannel(value) {
1690
1683
  return clamp(Math.round(value), 0, 255).toString(16).padStart(2, '0');
1691
1684
  }
1692
- function contrastRatio(first, second) {
1693
- const firstLuminance = relativeLuminance(first);
1694
- const secondLuminance = relativeLuminance(second);
1695
- const lighter = Math.max(firstLuminance, secondLuminance);
1696
- const darker = Math.min(firstLuminance, secondLuminance);
1697
- return (lighter + 0.05) / (darker + 0.05);
1698
- }
1699
- function relativeLuminance({ r, g, b }) {
1700
- return [r, g, b]
1701
- .map(channel => {
1702
- const value = channel / 255;
1703
- return value <= 0.03928 ? value / 12.92 : Math.pow((value + 0.055) / 1.055, 2.4);
1704
- })
1705
- .reduce((total, value, index) => total + value * [0.2126, 0.7152, 0.0722][index], 0);
1706
- }
1707
1685
  function normalizeHue(hue) {
1708
1686
  return ((hue % 360) + 360) % 360;
1709
1687
  }