@phcdevworks/spectre-ui 1.4.0 → 1.6.0

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/dist/index.css CHANGED
@@ -6,7 +6,7 @@
6
6
  --sp-surface-page: #f7f8fb;
7
7
  --sp-surface-card: #ffffff;
8
8
  --sp-surface-input: #ffffff;
9
- --sp-surface-overlay: rgba(20, 27, 36, 0.6);
9
+ --sp-surface-overlay: rgba(0, 0, 0, 0.6);
10
10
  --sp-surface-alternate: #eef1f6;
11
11
  --sp-surface-hero: linear-gradient(135deg, #5b6ee1 0%, #6f3fd7 100%);
12
12
  --sp-text-on-page-default: #141b24;
@@ -298,9 +298,9 @@
298
298
  --sp-button-cta-textdisabled: #8a96ad;
299
299
  --sp-button-cta-shadow: 0 4px 14px 0 rgba(51, 109, 244, 0.39);
300
300
  --sp-button-cta-focusring: rgba(51, 109, 244, 0.4);
301
- --sp-button-accent-bg: #7135dd;
302
- --sp-button-accent-bghover: #5d28b8;
303
- --sp-button-accent-bgactive: #4d2393;
301
+ --sp-button-accent-bg: #5d28b8;
302
+ --sp-button-accent-bghover: #4d2393;
303
+ --sp-button-accent-bgactive: #401f75;
304
304
  --sp-button-accent-bgdisabled: #ddccff;
305
305
  --sp-button-accent-text: #ffffff;
306
306
  --sp-button-accent-textdisabled: #8a96ad;
@@ -566,6 +566,10 @@
566
566
  --sp-component-badge-info-text: var(--sp-badge-info-text);
567
567
  --sp-component-badge-ghost-bg: var(--sp-button-ghost-bg);
568
568
  --sp-component-badge-ghost-text: var(--sp-button-ghost-text);
569
+ --sp-component-badge-accent-bg: var(--sp-button-accent-bg);
570
+ --sp-component-badge-accent-text: var(--sp-button-accent-text);
571
+ --sp-component-badge-cta-bg: var(--sp-button-cta-bg);
572
+ --sp-component-badge-cta-text: var(--sp-button-cta-text);
569
573
 
570
574
  /* badge hover states derived from Spectre token semantics */
571
575
  --sp-component-badge-primary-bg-hover: var(--sp-button-primary-bghover);
@@ -576,6 +580,8 @@
576
580
  --sp-component-badge-neutral-bg-hover: var(--sp-color-neutral-200);
577
581
  --sp-component-badge-info-bg-hover: var(--sp-color-info-200);
578
582
  --sp-component-badge-ghost-bg-hover: var(--sp-button-ghost-bghover);
583
+ --sp-component-badge-accent-bg-hover: var(--sp-button-accent-bghover);
584
+ --sp-component-badge-cta-bg-hover: var(--sp-button-cta-bghover);
579
585
 
580
586
  --sp-component-badge-padding-x-sm: var(--sp-space-8);
581
587
  --sp-component-badge-padding-x-md: var(--sp-space-12);
@@ -606,17 +612,33 @@
606
612
  --sp-component-iconbox-neutral-text: var(--sp-badge-neutral-text);
607
613
  --sp-component-iconbox-ghost-bg: var(--sp-button-ghost-bg);
608
614
  --sp-component-iconbox-ghost-text: var(--sp-button-ghost-text);
615
+ --sp-component-iconbox-accent-bg: var(--sp-button-accent-bg);
616
+ --sp-component-iconbox-accent-text: var(--sp-button-accent-text);
617
+ --sp-component-iconbox-cta-bg: var(--sp-button-cta-bg);
618
+ --sp-component-iconbox-cta-text: var(--sp-button-cta-text);
609
619
 
610
620
  /* testimonial roles */
611
621
  --sp-component-testimonial-bg: var(--sp-surface-card);
622
+ --sp-component-testimonial-bg-hover: var(--sp-color-neutral-50);
612
623
  --sp-component-testimonial-border: var(--sp-color-neutral-200);
624
+ --sp-component-testimonial-border-base: var(--sp-component-testimonial-ghost-border);
613
625
  --sp-component-testimonial-text: var(--sp-color-neutral-700);
614
626
  --sp-component-testimonial-author-name: var(--sp-color-neutral-900);
615
- --sp-component-testimonial-author-title: var(--sp-color-neutral-500);
616
- --sp-component-testimonial-quote-mark: var(--sp-color-neutral-500);
627
+ --sp-component-testimonial-author-title: var(--sp-color-neutral-600);
628
+ --sp-component-testimonial-quote-mark: var(--sp-color-neutral-600);
629
+ --sp-component-testimonial-shadow: var(--sp-shadow-none);
630
+ --sp-component-testimonial-shadow-elevated: var(--sp-shadow-lg);
631
+ --sp-component-testimonial-shadow-flat: var(--sp-shadow-none);
632
+ --sp-component-testimonial-shadow-outline: var(--sp-shadow-none);
633
+ --sp-component-testimonial-shadow-ghost: var(--sp-shadow-none);
634
+ --sp-component-testimonial-outline-bg: var(--sp-component-testimonial-bg);
635
+ --sp-component-testimonial-outline-border: var(--sp-component-testimonial-border);
636
+ --sp-component-testimonial-ghost-bg: var(--sp-button-ghost-bg);
637
+ --sp-component-testimonial-ghost-border: var(--sp-component-testimonial-ghost-bg);
617
638
 
618
639
  /* pricing card roles */
619
640
  --sp-component-pricing-card-bg: var(--sp-surface-card);
641
+ --sp-component-pricing-card-bg-hover: var(--sp-color-neutral-50);
620
642
  --sp-component-pricing-card-border: var(--sp-color-neutral-200);
621
643
  --sp-component-pricing-card-featured-bg: var(--sp-color-info-600);
622
644
  --sp-component-pricing-card-featured-text: var(--sp-button-text-on-primary);
@@ -624,7 +646,7 @@
624
646
  --sp-component-pricing-card-featured-badge-text: var(--sp-color-neutral-900);
625
647
  --sp-component-pricing-card-price: var(--sp-color-neutral-900);
626
648
  --sp-component-pricing-card-featured-price: var(--sp-color-white);
627
- --sp-component-pricing-card-price-description: var(--sp-color-neutral-500);
649
+ --sp-component-pricing-card-price-description: var(--sp-color-neutral-600);
628
650
 
629
651
  /* rating roles */
630
652
  --sp-component-rating-star-filled: var(--sp-color-warning-500);
@@ -637,17 +659,37 @@
637
659
 
638
660
  /* dark mode overrides mapped from Spectre token mode definitions */
639
661
  :where(:root[data-spectre-theme="dark"]) {
662
+ /* badge hover states remain manual as they are not currently exported as tokens */
663
+ --sp-component-badge-success-bg-hover: var(--sp-color-success-700);
664
+ --sp-component-badge-warning-bg-hover: var(--sp-color-warning-700);
665
+ --sp-component-badge-danger-bg-hover: var(--sp-color-error-700);
666
+ --sp-component-badge-neutral-bg-hover: var(--sp-color-neutral-600);
667
+ --sp-component-badge-info-bg-hover: var(--sp-color-info-700);
668
+
669
+ --sp-component-iconbox-primary-bg: var(--sp-color-neutral-800);
670
+ --sp-component-iconbox-primary-text: var(--sp-color-brand-400);
671
+ --sp-component-iconbox-success-bg: var(--sp-color-neutral-800);
672
+ --sp-component-iconbox-success-text: var(--sp-color-success-400);
673
+ --sp-component-iconbox-warning-bg: var(--sp-color-neutral-800);
674
+ --sp-component-iconbox-warning-text: var(--sp-color-warning-400);
675
+ --sp-component-iconbox-danger-bg: var(--sp-color-neutral-800);
676
+ --sp-component-iconbox-danger-text: var(--sp-color-error-400);
677
+ --sp-component-iconbox-info-bg: var(--sp-color-neutral-800);
678
+ --sp-component-iconbox-info-text: var(--sp-color-info-400);
679
+
640
680
  --sp-component-testimonial-bg: var(--sp-color-neutral-800);
681
+ --sp-component-testimonial-bg-hover: var(--sp-color-neutral-700);
641
682
  --sp-component-testimonial-border: var(--sp-color-neutral-700);
642
683
  --sp-component-testimonial-text: var(--sp-color-neutral-200);
643
684
  --sp-component-testimonial-author-name: var(--sp-color-neutral-100);
644
- --sp-component-testimonial-author-title: var(--sp-color-neutral-400);
645
- --sp-component-testimonial-quote-mark: var(--sp-color-neutral-400);
685
+ --sp-component-testimonial-author-title: var(--sp-color-neutral-300);
686
+ --sp-component-testimonial-quote-mark: var(--sp-color-neutral-300);
646
687
 
647
688
  --sp-component-pricing-card-bg: var(--sp-color-neutral-800);
689
+ --sp-component-pricing-card-bg-hover: var(--sp-color-neutral-700);
648
690
  --sp-component-pricing-card-border: var(--sp-color-neutral-700);
649
691
  --sp-component-pricing-card-price: var(--sp-color-neutral-100);
650
- --sp-component-pricing-card-price-description: var(--sp-color-neutral-400);
692
+ --sp-component-pricing-card-price-description: var(--sp-color-neutral-300);
651
693
 
652
694
  --sp-component-rating-star-filled: var(--sp-color-warning-400);
653
695
  --sp-component-rating-star-empty: var(--sp-color-neutral-700);
@@ -922,12 +964,20 @@
922
964
  line-height: var(--sp-font-sm-line-height);
923
965
  }
924
966
 
967
+ .sp-label--disabled {
968
+ color: var(--sp-component-input-role-text-disabled);
969
+ }
970
+
925
971
  .sp-helper-text {
926
972
  color: var(--sp-text-on-surface-meta);
927
973
  font-size: var(--sp-font-xs-size);
928
974
  line-height: var(--sp-font-xs-line-height);
929
975
  }
930
976
 
977
+ .sp-helper-text--disabled {
978
+ opacity: var(--sp-opacity-disabled);
979
+ }
980
+
931
981
  .sp-error-message {
932
982
  color: var(--sp-component-input-role-text-error);
933
983
  font-size: var(--sp-font-xs-size);
@@ -1089,11 +1139,15 @@
1089
1139
  height: 100%;
1090
1140
  }
1091
1141
 
1142
+ .sp-card:disabled,
1143
+ .sp-card[aria-disabled="true"],
1092
1144
  .sp-card--disabled {
1093
1145
  opacity: var(--sp-opacity-disabled);
1094
1146
  pointer-events: none;
1147
+ cursor: not-allowed;
1095
1148
  }
1096
1149
 
1150
+ .sp-card[aria-busy="true"],
1097
1151
  .sp-card--loading {
1098
1152
  opacity: var(--sp-opacity-active);
1099
1153
  pointer-events: none;
@@ -1108,14 +1162,20 @@
1108
1162
  }
1109
1163
 
1110
1164
  .sp-card--interactive:hover,
1111
- .sp-card--interactive:focus-visible,
1112
1165
  .sp-card--interactive:focus-within,
1113
1166
  .sp-card--interactive.sp-card--hover,
1114
- .sp-card--interactive.is-hover,
1167
+ .sp-card--interactive.is-hover {
1168
+ outline: none;
1169
+ transform: translateY(calc(var(--sp-component-border-width) * -1));
1170
+ box-shadow: var(--sp-component-card-shadow-elevated);
1171
+ }
1172
+
1173
+ .sp-card--interactive:focus-visible,
1115
1174
  .sp-card--interactive.sp-card--focus,
1116
1175
  .sp-card--interactive.is-focus {
1176
+ outline: none;
1117
1177
  transform: translateY(calc(var(--sp-component-border-width) * -1));
1118
- box-shadow: var(--sp-component-card-shadow-elevated);
1178
+ box-shadow: 0 0 0 calc(var(--sp-focus-ring-width) + var(--sp-component-border-width)) var(--sp-color-focus-primary);
1119
1179
  }
1120
1180
 
1121
1181
  .sp-card--interactive:active,
@@ -1142,6 +1202,10 @@
1142
1202
  white-space: nowrap;
1143
1203
  }
1144
1204
 
1205
+ .sp-badge--full {
1206
+ width: 100%;
1207
+ }
1208
+
1145
1209
  .sp-badge--sm {
1146
1210
  padding: var(--sp-component-badge-padding-y-sm) var(--sp-component-badge-padding-x-sm);
1147
1211
  font-size: var(--sp-font-xs-size);
@@ -1166,8 +1230,8 @@
1166
1230
  }
1167
1231
 
1168
1232
  .sp-badge--primary.sp-badge--interactive:hover,
1169
- .sp-badge--primary.sp-badge--interactive.sp-badge--hover,
1170
- .sp-badge--primary.sp-badge--interactive.is-hover {
1233
+ .sp-badge--primary.sp-badge--hover,
1234
+ .sp-badge--primary.is-hover {
1171
1235
  background-color: var(--sp-component-badge-primary-bg-hover);
1172
1236
  }
1173
1237
 
@@ -1178,8 +1242,8 @@
1178
1242
  }
1179
1243
 
1180
1244
  .sp-badge--secondary.sp-badge--interactive:hover,
1181
- .sp-badge--secondary.sp-badge--interactive.sp-badge--hover,
1182
- .sp-badge--secondary.sp-badge--interactive.is-hover {
1245
+ .sp-badge--secondary.sp-badge--hover,
1246
+ .sp-badge--secondary.is-hover {
1183
1247
  background-color: var(--sp-component-badge-secondary-bg-hover);
1184
1248
  }
1185
1249
 
@@ -1189,8 +1253,8 @@
1189
1253
  }
1190
1254
 
1191
1255
  .sp-badge--success.sp-badge--interactive:hover,
1192
- .sp-badge--success.sp-badge--interactive.sp-badge--hover,
1193
- .sp-badge--success.sp-badge--interactive.is-hover {
1256
+ .sp-badge--success.sp-badge--hover,
1257
+ .sp-badge--success.is-hover {
1194
1258
  background-color: var(--sp-component-badge-success-bg-hover);
1195
1259
  }
1196
1260
 
@@ -1200,8 +1264,8 @@
1200
1264
  }
1201
1265
 
1202
1266
  .sp-badge--warning.sp-badge--interactive:hover,
1203
- .sp-badge--warning.sp-badge--interactive.sp-badge--hover,
1204
- .sp-badge--warning.sp-badge--interactive.is-hover {
1267
+ .sp-badge--warning.sp-badge--hover,
1268
+ .sp-badge--warning.is-hover {
1205
1269
  background-color: var(--sp-component-badge-warning-bg-hover);
1206
1270
  }
1207
1271
 
@@ -1211,8 +1275,8 @@
1211
1275
  }
1212
1276
 
1213
1277
  .sp-badge--danger.sp-badge--interactive:hover,
1214
- .sp-badge--danger.sp-badge--interactive.sp-badge--hover,
1215
- .sp-badge--danger.sp-badge--interactive.is-hover {
1278
+ .sp-badge--danger.sp-badge--hover,
1279
+ .sp-badge--danger.is-hover {
1216
1280
  background-color: var(--sp-component-badge-danger-bg-hover);
1217
1281
  }
1218
1282
 
@@ -1222,8 +1286,8 @@
1222
1286
  }
1223
1287
 
1224
1288
  .sp-badge--neutral.sp-badge--interactive:hover,
1225
- .sp-badge--neutral.sp-badge--interactive.sp-badge--hover,
1226
- .sp-badge--neutral.sp-badge--interactive.is-hover {
1289
+ .sp-badge--neutral.sp-badge--hover,
1290
+ .sp-badge--neutral.is-hover {
1227
1291
  background-color: var(--sp-component-badge-neutral-bg-hover);
1228
1292
  }
1229
1293
 
@@ -1233,8 +1297,8 @@
1233
1297
  }
1234
1298
 
1235
1299
  .sp-badge--info.sp-badge--interactive:hover,
1236
- .sp-badge--info.sp-badge--interactive.sp-badge--hover,
1237
- .sp-badge--info.sp-badge--interactive.is-hover {
1300
+ .sp-badge--info.sp-badge--hover,
1301
+ .sp-badge--info.is-hover {
1238
1302
  background-color: var(--sp-component-badge-info-bg-hover);
1239
1303
  }
1240
1304
 
@@ -1244,11 +1308,33 @@
1244
1308
  }
1245
1309
 
1246
1310
  .sp-badge--ghost.sp-badge--interactive:hover,
1247
- .sp-badge--ghost.sp-badge--interactive.sp-badge--hover,
1248
- .sp-badge--ghost.sp-badge--interactive.is-hover {
1311
+ .sp-badge--ghost.sp-badge--hover,
1312
+ .sp-badge--ghost.is-hover {
1249
1313
  background-color: var(--sp-component-badge-ghost-bg-hover);
1250
1314
  }
1251
1315
 
1316
+ .sp-badge--accent {
1317
+ background-color: var(--sp-component-badge-accent-bg);
1318
+ color: var(--sp-component-badge-accent-text);
1319
+ }
1320
+
1321
+ .sp-badge--accent.sp-badge--interactive:hover,
1322
+ .sp-badge--accent.sp-badge--hover,
1323
+ .sp-badge--accent.is-hover {
1324
+ background-color: var(--sp-component-badge-accent-bg-hover);
1325
+ }
1326
+
1327
+ .sp-badge--cta {
1328
+ background-color: var(--sp-component-badge-cta-bg);
1329
+ color: var(--sp-component-badge-cta-text);
1330
+ }
1331
+
1332
+ .sp-badge--cta.sp-badge--interactive:hover,
1333
+ .sp-badge--cta.sp-badge--hover,
1334
+ .sp-badge--cta.is-hover {
1335
+ background-color: var(--sp-component-badge-cta-bg-hover);
1336
+ }
1337
+
1252
1338
  .sp-badge--interactive {
1253
1339
  cursor: pointer;
1254
1340
  transition:
@@ -1260,24 +1346,27 @@
1260
1346
  }
1261
1347
 
1262
1348
  .sp-badge--interactive:active,
1263
- .sp-badge--interactive.sp-badge--active,
1264
- .sp-badge--interactive.is-active {
1349
+ .sp-badge--active,
1350
+ .sp-badge.is-active {
1265
1351
  opacity: var(--sp-opacity-active);
1266
1352
  }
1267
1353
 
1268
1354
  .sp-badge--interactive:focus-visible,
1269
- .sp-badge--interactive.sp-badge--focus,
1270
- .sp-badge--interactive.is-focus {
1355
+ .sp-badge--focus,
1356
+ .sp-badge.is-focus {
1271
1357
  outline: none;
1272
1358
  box-shadow: 0 0 0 calc(var(--sp-focus-ring-width) + var(--sp-component-border-width)) var(--sp-color-focus-primary);
1273
1359
  }
1274
1360
 
1361
+ .sp-badge:disabled,
1362
+ .sp-badge[aria-disabled="true"],
1275
1363
  .sp-badge--disabled {
1276
1364
  opacity: var(--sp-opacity-disabled);
1277
1365
  pointer-events: none;
1278
1366
  }
1279
1367
 
1280
- .sp-badge--loading {
1368
+ .sp-badge--loading,
1369
+ .sp-badge[aria-busy="true"] {
1281
1370
  opacity: var(--sp-opacity-active);
1282
1371
  pointer-events: none;
1283
1372
  }
@@ -1362,6 +1451,10 @@
1362
1451
  font-size: var(--sp-font-lg-size);
1363
1452
  }
1364
1453
 
1454
+ .sp-iconbox--full {
1455
+ width: 100%;
1456
+ }
1457
+
1365
1458
  .sp-iconbox--pill {
1366
1459
  border-radius: var(--sp-radius-pill);
1367
1460
  }
@@ -1407,25 +1500,35 @@
1407
1500
  color: var(--sp-component-iconbox-ghost-text);
1408
1501
  }
1409
1502
 
1503
+ .sp-iconbox--accent {
1504
+ background-color: var(--sp-component-iconbox-accent-bg);
1505
+ color: var(--sp-component-iconbox-accent-text);
1506
+ }
1507
+
1508
+ .sp-iconbox--cta {
1509
+ background-color: var(--sp-component-iconbox-cta-bg);
1510
+ color: var(--sp-component-iconbox-cta-text);
1511
+ }
1512
+
1410
1513
  .sp-iconbox--interactive {
1411
1514
  cursor: pointer;
1412
1515
  }
1413
1516
 
1414
1517
  .sp-iconbox--interactive:hover,
1415
- .sp-iconbox--interactive.sp-iconbox--hover,
1416
- .sp-iconbox--interactive.is-hover {
1518
+ .sp-iconbox--hover,
1519
+ .sp-iconbox.is-hover {
1417
1520
  opacity: var(--sp-opacity-hover);
1418
1521
  }
1419
1522
 
1420
1523
  .sp-iconbox--interactive:active,
1421
- .sp-iconbox--interactive.sp-iconbox--active,
1422
- .sp-iconbox--interactive.is-active {
1524
+ .sp-iconbox--active,
1525
+ .sp-iconbox.is-active {
1423
1526
  opacity: var(--sp-opacity-active);
1424
1527
  }
1425
1528
 
1426
1529
  .sp-iconbox--interactive:focus-visible,
1427
- .sp-iconbox--interactive.sp-iconbox--focus,
1428
- .sp-iconbox--interactive.is-focus {
1530
+ .sp-iconbox--focus,
1531
+ .sp-iconbox.is-focus {
1429
1532
  outline: none;
1430
1533
  box-shadow: 0 0 0 calc(var(--sp-focus-ring-width) + var(--sp-component-border-width)) var(--sp-color-focus-primary);
1431
1534
  }
@@ -1438,7 +1541,8 @@
1438
1541
  cursor: not-allowed;
1439
1542
  }
1440
1543
 
1441
- .sp-iconbox--loading {
1544
+ .sp-iconbox--loading,
1545
+ .sp-iconbox[aria-busy="true"] {
1442
1546
  opacity: var(--sp-opacity-active);
1443
1547
  pointer-events: none;
1444
1548
  }
@@ -1447,20 +1551,46 @@
1447
1551
 
1448
1552
  .sp-testimonial {
1449
1553
  background-color: var(--sp-component-testimonial-bg);
1450
- border: var(--sp-component-border-width) solid var(--sp-component-testimonial-border);
1554
+ border: var(--sp-component-border-width) solid var(--sp-component-testimonial-border-base);
1451
1555
  border-radius: var(--sp-radius-lg);
1452
1556
  padding: var(--sp-space-32);
1453
1557
  display: flex;
1454
1558
  flex-direction: column;
1455
1559
  gap: var(--sp-space-24);
1560
+ box-shadow: var(--sp-component-testimonial-shadow);
1561
+ }
1562
+
1563
+ .sp-testimonial--elevated {
1564
+ box-shadow: var(--sp-component-testimonial-shadow-elevated);
1565
+ }
1566
+
1567
+ .sp-testimonial--flat {
1568
+ box-shadow: var(--sp-component-testimonial-shadow-flat);
1569
+ border-color: var(--sp-component-testimonial-border);
1570
+ }
1571
+
1572
+ .sp-testimonial--outline {
1573
+ background-color: var(--sp-component-testimonial-outline-bg);
1574
+ border-color: var(--sp-component-testimonial-outline-border);
1575
+ box-shadow: var(--sp-component-testimonial-shadow-outline);
1456
1576
  }
1457
1577
 
1578
+ .sp-testimonial--ghost {
1579
+ background-color: var(--sp-component-testimonial-ghost-bg);
1580
+ border-color: var(--sp-component-testimonial-ghost-border);
1581
+ box-shadow: var(--sp-component-testimonial-shadow-ghost);
1582
+ }
1583
+
1584
+ .sp-testimonial:disabled,
1585
+ .sp-testimonial[aria-disabled="true"],
1458
1586
  .sp-testimonial--disabled {
1459
1587
  opacity: var(--sp-opacity-disabled);
1460
1588
  pointer-events: none;
1589
+ cursor: not-allowed;
1461
1590
  }
1462
1591
 
1463
- .sp-testimonial--loading {
1592
+ .sp-testimonial--loading,
1593
+ .sp-testimonial[aria-busy="true"] {
1464
1594
  opacity: var(--sp-opacity-active);
1465
1595
  pointer-events: none;
1466
1596
  }
@@ -1482,7 +1612,8 @@
1482
1612
  .sp-testimonial--interactive.sp-testimonial--hover,
1483
1613
  .sp-testimonial--interactive.is-hover {
1484
1614
  transform: translateY(calc(var(--sp-component-border-width) * -1));
1485
- box-shadow: var(--sp-shadow-lg);
1615
+ box-shadow: var(--sp-component-testimonial-shadow-elevated);
1616
+ background-color: var(--sp-component-testimonial-bg-hover);
1486
1617
  }
1487
1618
 
1488
1619
  .sp-testimonial--interactive:active,
@@ -1565,12 +1696,15 @@
1565
1696
  border: none;
1566
1697
  }
1567
1698
 
1699
+ .sp-pricing-card:disabled,
1700
+ .sp-pricing-card[aria-disabled="true"],
1568
1701
  .sp-pricing-card--disabled {
1569
1702
  opacity: var(--sp-opacity-disabled);
1570
1703
  pointer-events: none;
1571
1704
  }
1572
1705
 
1573
- .sp-pricing-card--loading {
1706
+ .sp-pricing-card--loading,
1707
+ .sp-pricing-card[aria-busy="true"] {
1574
1708
  opacity: var(--sp-opacity-active);
1575
1709
  pointer-events: none;
1576
1710
  }
@@ -1586,37 +1720,38 @@
1586
1720
  .sp-pricing-card--interactive:hover,
1587
1721
  .sp-pricing-card--interactive:focus-within,
1588
1722
  .sp-pricing-card--interactive.sp-pricing-card--hover,
1589
- .sp-pricing-card--interactive.is-hover {
1723
+ .sp-pricing-card.is-hover {
1590
1724
  transform: translateY(calc(var(--sp-component-border-width) * -1));
1591
1725
  box-shadow: var(--sp-shadow-lg);
1726
+ background-color: var(--sp-component-pricing-card-bg-hover);
1592
1727
  }
1593
1728
 
1594
1729
  .sp-pricing-card--featured.sp-pricing-card--interactive:hover,
1595
1730
  .sp-pricing-card--featured.sp-pricing-card--interactive:focus-visible,
1596
1731
  .sp-pricing-card--featured.sp-pricing-card--interactive:focus-within,
1597
1732
  .sp-pricing-card--featured.sp-pricing-card--interactive.sp-pricing-card--hover,
1598
- .sp-pricing-card--featured.sp-pricing-card--interactive.is-hover,
1733
+ .sp-pricing-card--featured.is-hover,
1599
1734
  .sp-pricing-card--featured.sp-pricing-card--interactive.sp-pricing-card--focus,
1600
- .sp-pricing-card--featured.sp-pricing-card--interactive.is-focus {
1735
+ .sp-pricing-card--featured.is-focus {
1601
1736
  transform: scale(1.05) translateY(calc(var(--sp-component-border-width) * -1));
1602
1737
  }
1603
1738
 
1604
1739
  .sp-pricing-card--interactive:active,
1605
1740
  .sp-pricing-card--interactive.sp-pricing-card--active,
1606
- .sp-pricing-card--interactive.is-active {
1741
+ .sp-pricing-card.is-active {
1607
1742
  opacity: var(--sp-opacity-active);
1608
1743
  transform: translateY(0);
1609
1744
  }
1610
1745
 
1611
1746
  .sp-pricing-card--featured.sp-pricing-card--interactive:active,
1612
1747
  .sp-pricing-card--featured.sp-pricing-card--interactive.sp-pricing-card--active,
1613
- .sp-pricing-card--featured.sp-pricing-card--interactive.is-active {
1748
+ .sp-pricing-card--featured.is-active {
1614
1749
  transform: scale(1.05) translateY(0);
1615
1750
  }
1616
1751
 
1617
1752
  .sp-pricing-card--interactive:focus-visible,
1618
1753
  .sp-pricing-card--interactive.sp-pricing-card--focus,
1619
- .sp-pricing-card--interactive.is-focus {
1754
+ .sp-pricing-card.is-focus {
1620
1755
  outline: none;
1621
1756
  transform: translateY(calc(var(--sp-component-border-width) * -1));
1622
1757
  box-shadow: 0 0 0 calc(var(--sp-focus-ring-width) + var(--sp-component-border-width)) var(--sp-color-focus-primary);
@@ -1685,6 +1820,14 @@
1685
1820
  font-size: var(--sp-component-rating-size-lg);
1686
1821
  }
1687
1822
 
1823
+ .sp-rating--full {
1824
+ width: 100%;
1825
+ }
1826
+
1827
+ .sp-rating--pill {
1828
+ border-radius: var(--sp-radius-pill);
1829
+ }
1830
+
1688
1831
  .sp-rating:disabled,
1689
1832
  .sp-rating[aria-disabled="true"],
1690
1833
  .sp-rating--disabled {
package/dist/index.d.cts CHANGED
@@ -25,10 +25,6 @@ declare const BUTTON_SIZES: {
25
25
  };
26
26
  type ButtonVariant = keyof typeof BUTTON_VARIANTS;
27
27
  type ButtonSize = keyof typeof BUTTON_SIZES;
28
- /**
29
- * Generate classes for the Button component.
30
- * @sync v2.x - Synced with latest design tokens, including CTA variants.
31
- */
32
28
  interface ButtonRecipeOptions {
33
29
  variant?: ButtonVariant;
34
30
  size?: ButtonSize;
@@ -89,6 +85,14 @@ interface InputRecipeOptions {
89
85
  loading?: boolean;
90
86
  }
91
87
  declare function getInputClasses(opts?: InputRecipeOptions): string;
88
+ declare function getInputWrapperClasses(): string;
89
+ declare function getInputLabelClasses(opts?: {
90
+ disabled?: boolean;
91
+ }): string;
92
+ declare function getInputHelperTextClasses(opts?: {
93
+ disabled?: boolean;
94
+ }): string;
95
+ declare function getInputErrorMessageClasses(): string;
92
96
 
93
97
  declare const BADGE_VARIANTS: {
94
98
  readonly primary: true;
@@ -99,6 +103,8 @@ declare const BADGE_VARIANTS: {
99
103
  readonly neutral: true;
100
104
  readonly info: true;
101
105
  readonly ghost: true;
106
+ readonly accent: true;
107
+ readonly cta: true;
102
108
  };
103
109
  declare const BADGE_SIZES: {
104
110
  readonly sm: true;
@@ -107,10 +113,6 @@ declare const BADGE_SIZES: {
107
113
  };
108
114
  type BadgeVariant = keyof typeof BADGE_VARIANTS;
109
115
  type BadgeSize = keyof typeof BADGE_SIZES;
110
- /**
111
- * Generate classes for the Badge component.
112
- * @sync v2.x - Synced with latest design tokens, including hover states.
113
- */
114
116
  interface BadgeRecipeOptions {
115
117
  variant?: BadgeVariant;
116
118
  size?: BadgeSize;
@@ -120,6 +122,7 @@ interface BadgeRecipeOptions {
120
122
  active?: boolean;
121
123
  disabled?: boolean;
122
124
  loading?: boolean;
125
+ fullWidth?: boolean;
123
126
  }
124
127
  declare function getBadgeClasses(opts?: BadgeRecipeOptions): string;
125
128
 
@@ -132,6 +135,8 @@ declare const ICONBOX_VARIANTS: {
132
135
  readonly info: true;
133
136
  readonly neutral: true;
134
137
  readonly ghost: true;
138
+ readonly accent: true;
139
+ readonly cta: true;
135
140
  };
136
141
  declare const ICONBOX_SIZES: {
137
142
  readonly sm: true;
@@ -150,14 +155,19 @@ interface IconBoxRecipeOptions {
150
155
  focused?: boolean;
151
156
  active?: boolean;
152
157
  pill?: boolean;
158
+ fullWidth?: boolean;
153
159
  }
154
160
  declare function getIconBoxClasses(opts?: IconBoxRecipeOptions): string;
155
161
 
156
- /**
157
- * Generate classes for the Testimonial component.
158
- * @sync v2.x - Synced with latest design tokens.
159
- */
162
+ declare const TESTIMONIAL_VARIANTS: {
163
+ readonly elevated: true;
164
+ readonly flat: true;
165
+ readonly outline: true;
166
+ readonly ghost: true;
167
+ };
168
+ type TestimonialVariant = keyof typeof TESTIMONIAL_VARIANTS;
160
169
  interface TestimonialRecipeOptions {
170
+ variant?: TestimonialVariant;
161
171
  disabled?: boolean;
162
172
  loading?: boolean;
163
173
  interactive?: boolean;
@@ -173,10 +183,6 @@ declare function getTestimonialAuthorInfoClasses(): string;
173
183
  declare function getTestimonialAuthorNameClasses(): string;
174
184
  declare function getTestimonialAuthorTitleClasses(): string;
175
185
 
176
- /**
177
- * Generate classes for the PricingCard component.
178
- * @sync v2.x - Synced with latest design tokens.
179
- */
180
186
  interface PricingCardRecipeOptions {
181
187
  featured?: boolean;
182
188
  disabled?: boolean;
@@ -199,10 +205,6 @@ declare const RATING_SIZES: {
199
205
  readonly lg: true;
200
206
  };
201
207
  type RatingSize = keyof typeof RATING_SIZES;
202
- /**
203
- * Generate classes for the Rating component.
204
- * @sync v2.x - Synced with latest design tokens.
205
- */
206
208
  interface RatingRecipeOptions {
207
209
  size?: RatingSize;
208
210
  disabled?: boolean;
@@ -211,10 +213,12 @@ interface RatingRecipeOptions {
211
213
  hovered?: boolean;
212
214
  focused?: boolean;
213
215
  active?: boolean;
216
+ pill?: boolean;
217
+ fullWidth?: boolean;
214
218
  }
215
219
  declare function getRatingClasses(opts?: RatingRecipeOptions): string;
216
220
  declare function getRatingStarsClasses(): string;
217
221
  declare function getRatingStarClasses(isFilled?: boolean): string;
218
222
  declare function getRatingTextClasses(): string;
219
223
 
220
- export { type BadgeRecipeOptions, type BadgeSize, type BadgeVariant, type ButtonRecipeOptions, type ButtonSize, type ButtonVariant, type CardRecipeOptions, type CardVariant, type IconBoxRecipeOptions, type IconBoxSize, type IconBoxVariant, type InputRecipeOptions, type InputSize, type InputState, type PricingCardRecipeOptions, type RatingRecipeOptions, type TestimonialRecipeOptions, getBadgeClasses, getButtonClasses, getCardClasses, getIconBoxClasses, getInputClasses, getPricingCardBadgeClasses, getPricingCardClasses, getPricingCardDescriptionClasses, getPricingCardPriceClasses, getPricingCardPriceContainerClasses, getRatingClasses, getRatingStarClasses, getRatingStarsClasses, getRatingTextClasses, getTestimonialAuthorClasses, getTestimonialAuthorInfoClasses, getTestimonialAuthorNameClasses, getTestimonialAuthorTitleClasses, getTestimonialClasses, getTestimonialQuoteClasses, spectreBaseStylesPath, spectreComponentsStylesPath, spectreIndexStylesPath, spectreStyles, spectreUtilitiesStylesPath };
224
+ export { type BadgeRecipeOptions, type BadgeSize, type BadgeVariant, type ButtonRecipeOptions, type ButtonSize, type ButtonVariant, type CardRecipeOptions, type CardVariant, type IconBoxRecipeOptions, type IconBoxSize, type IconBoxVariant, type InputRecipeOptions, type InputSize, type InputState, type PricingCardRecipeOptions, type RatingRecipeOptions, type RatingSize, type TestimonialRecipeOptions, getBadgeClasses, getButtonClasses, getCardClasses, getIconBoxClasses, getInputClasses, getInputErrorMessageClasses, getInputHelperTextClasses, getInputLabelClasses, getInputWrapperClasses, getPricingCardBadgeClasses, getPricingCardClasses, getPricingCardDescriptionClasses, getPricingCardPriceClasses, getPricingCardPriceContainerClasses, getRatingClasses, getRatingStarClasses, getRatingStarsClasses, getRatingTextClasses, getTestimonialAuthorClasses, getTestimonialAuthorInfoClasses, getTestimonialAuthorNameClasses, getTestimonialAuthorTitleClasses, getTestimonialClasses, getTestimonialQuoteClasses, spectreBaseStylesPath, spectreComponentsStylesPath, spectreIndexStylesPath, spectreStyles, spectreUtilitiesStylesPath };