@phcdevworks/spectre-ui 1.1.1 → 1.2.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
@@ -17,9 +17,9 @@
17
17
  --sp-text-on-surface-subtle: #657287;
18
18
  --sp-text-on-surface-meta: #657287;
19
19
  --sp-component-card-text: #141b24;
20
- --sp-component-card-text-muted: #657287;
20
+ --sp-component-card-text-muted: #4b576a;
21
21
  --sp-component-input-text: #141b24;
22
- --sp-component-input-placeholder: #8a96ad;
22
+ --sp-component-input-placeholder: #657287;
23
23
  --sp-button-text-default: #141b24;
24
24
  --sp-button-text-on-primary: #ffffff;
25
25
  --sp-badge-neutral-bg: #eef1f6;
@@ -176,13 +176,25 @@
176
176
  --sp-font-md-weight: 500;
177
177
  --sp-font-lg-size: 1.25rem;
178
178
  --sp-font-lg-line-height: 2rem;
179
- --sp-font-lg-weight: 500;
179
+ --sp-font-lg-weight: 600;
180
180
  --sp-font-xl-size: 1.5rem;
181
181
  --sp-font-xl-line-height: 2.125rem;
182
182
  --sp-font-xl-weight: 600;
183
183
  --sp-font-2xl-size: 1.875rem;
184
184
  --sp-font-2xl-line-height: 2.5rem;
185
- --sp-font-2xl-weight: 600;
185
+ --sp-font-2xl-weight: 700;
186
+ --sp-font-3xl-size: 2.25rem;
187
+ --sp-font-3xl-line-height: 2.75rem;
188
+ --sp-font-3xl-weight: 700;
189
+ --sp-font-4xl-size: 3rem;
190
+ --sp-font-4xl-line-height: 3.5rem;
191
+ --sp-font-4xl-weight: 800;
192
+ --sp-font-5xl-size: 3.75rem;
193
+ --sp-font-5xl-line-height: 4.25rem;
194
+ --sp-font-5xl-weight: 800;
195
+ --sp-font-6xl-size: 4.5rem;
196
+ --sp-font-6xl-line-height: 5rem;
197
+ --sp-font-6xl-weight: 900;
186
198
  --sp-font-xs-letter-spacing: 0.02em;
187
199
  --sp-text-on-page-default: #141b24;
188
200
  --sp-text-on-page-muted: #4b576a;
@@ -254,6 +266,7 @@
254
266
  --sp-button-primary-text: #ffffff;
255
267
  --sp-button-primary-textdisabled: #8a96ad;
256
268
  --sp-button-primary-focusring: rgba(14, 165, 233, 0.4);
269
+ --sp-button-primary-focusvisible: {colors.info.500} / 0.4;
257
270
  --sp-button-secondary-bg: #ffffff;
258
271
  --sp-button-secondary-bghover: #f7f8fb;
259
272
  --sp-button-secondary-bgactive: #eef1f6;
@@ -263,6 +276,7 @@
263
276
  --sp-button-secondary-border: #075985;
264
277
  --sp-button-secondary-borderdisabled: #d9dfeb;
265
278
  --sp-button-secondary-focusring: rgba(14, 165, 233, 0.4);
279
+ --sp-button-secondary-focusvisible: {colors.info.500} / 0.4;
266
280
  --sp-button-ghost-bg: transparent;
267
281
  --sp-button-ghost-bghover: #f0f9ff;
268
282
  --sp-button-ghost-bgactive: #e0f2fe;
@@ -270,6 +284,7 @@
270
284
  --sp-button-ghost-text: #075985;
271
285
  --sp-button-ghost-textdisabled: #8a96ad;
272
286
  --sp-button-ghost-focusring: rgba(14, 165, 233, 0.4);
287
+ --sp-button-ghost-focusvisible: {colors.info.500} / 0.4;
273
288
  --sp-button-danger-bg: #dc2626;
274
289
  --sp-button-danger-bghover: #b91c1c;
275
290
  --sp-button-danger-bgactive: #991b1b;
@@ -299,13 +314,16 @@
299
314
  --sp-button-accent-text: #ffffff;
300
315
  --sp-button-accent-textdisabled: #8a96ad;
301
316
  --sp-button-accent-focusring: rgba(133, 79, 247, 0.4);
317
+ --sp-button-accent-focusvisible: {colors.accent.500} / 0.4;
302
318
  --sp-form-default-bg: #ffffff;
303
319
  --sp-form-default-border: #b7c1d4;
304
320
  --sp-form-default-text: #141b24;
305
- --sp-form-default-placeholder: #8a96ad;
321
+ --sp-form-default-placeholder: #657287;
306
322
  --sp-form-hover-border: #0ea5e9;
307
323
  --sp-form-focus-border: #0ea5e9;
308
324
  --sp-form-focus-ring: #0ea5e9;
325
+ --sp-form-focusvisible-border: {colors.info.500};
326
+ --sp-form-focusvisible-ring: {colors.info.500};
309
327
  --sp-form-valid-border: #22c55e;
310
328
  --sp-form-valid-bg: #f0fdf4;
311
329
  --sp-form-valid-text: #15803d;
@@ -347,22 +365,22 @@
347
365
  --sp-surface-overlay: #222b38;
348
366
  --sp-surface-hero: linear-gradient(135deg, #401f75 0%, #5d28b8 100%);
349
367
  --sp-text-on-page-default: #f7f8fb;
350
- --sp-text-on-page-muted: #d9dfeb;
351
- --sp-text-on-page-subtle: #b7c1d4;
352
- --sp-text-on-page-meta: #b7c1d4;
368
+ --sp-text-on-page-muted: #b7c1d4;
369
+ --sp-text-on-page-subtle: #8a96ad;
370
+ --sp-text-on-page-meta: #8a96ad;
353
371
  --sp-text-on-surface-default: #eef1f6;
354
- --sp-text-on-surface-muted: #d9dfeb;
355
- --sp-text-on-surface-subtle: #b7c1d4;
356
- --sp-text-on-surface-meta: #b7c1d4;
372
+ --sp-text-on-surface-muted: #b7c1d4;
373
+ --sp-text-on-surface-subtle: #8a96ad;
374
+ --sp-text-on-surface-meta: #8a96ad;
357
375
  --sp-component-card-text: #eef1f6;
358
- --sp-component-card-text-muted: #d9dfeb;
376
+ --sp-component-card-text-muted: #b7c1d4;
359
377
  --sp-component-input-text: #eef1f6;
360
- --sp-component-input-placeholder: #8a96ad;
378
+ --sp-component-input-placeholder: #b7c1d4;
361
379
  --sp-button-text-default: #eef1f6;
362
380
  --sp-button-text-on-primary: #ffffff;
363
381
  --sp-badge-neutral-bg: #374253;
364
382
  --sp-badge-neutral-text: #eef1f6;
365
- --sp-badge-info-bg: #082f49;
383
+ --sp-badge-info-bg: #0c4a6e;
366
384
  --sp-badge-info-text: #e0f2fe;
367
385
  --sp-badge-success-bg: #166534;
368
386
  --sp-badge-success-text: #dcfce7;
@@ -372,7 +390,7 @@
372
390
  --sp-badge-danger-text: #fee2e2;
373
391
  --sp-icon-box-bg: #222b38;
374
392
  --sp-icon-box-border: #374253;
375
- --sp-icon-box-icon-default: #7dd3fc;
393
+ --sp-icon-box-icon-default: #38bdf8;
376
394
  --sp-icon-box-icon-success: #4ade80;
377
395
  --sp-icon-box-icon-warning: #ffc21a;
378
396
  --sp-icon-box-icon-danger: #f87171;
@@ -483,15 +501,14 @@
483
501
  --sp-component-button-success-bg-disabled: var(--sp-button-success-bgdisabled);
484
502
  --sp-component-button-success-text: var(--sp-button-success-text);
485
503
  --sp-component-button-success-text-disabled: var(--sp-button-success-textdisabled);
486
- /* FLAG: buttons.cta tokens in spectre-tokens v2.x use warning.500 (Gold),
487
- which violates the Aesthetic Audit guardrails. Remaining on accent palette. */
488
- --sp-component-button-cta-bg: var(--sp-color-accent-600);
489
- --sp-component-button-cta-bg-hover: var(--sp-color-accent-700);
490
- --sp-component-button-cta-bg-active: var(--sp-color-accent-800);
491
- --sp-component-button-cta-bg-disabled: var(--sp-color-accent-200);
492
- --sp-component-button-cta-text: var(--sp-color-neutral-50);
493
- --sp-component-button-cta-text-disabled: var(--sp-color-neutral-400);
494
- --sp-component-button-cta-shadow: 0 4px 14px 0 var(--sp-color-accent-500) / 0.39;
504
+ /* CTA button alignment restored to official tokens as they now use the brand palette (Blue). */
505
+ --sp-component-button-cta-bg: var(--sp-button-cta-bg);
506
+ --sp-component-button-cta-bg-hover: var(--sp-button-cta-bghover);
507
+ --sp-component-button-cta-bg-active: var(--sp-button-cta-bgactive);
508
+ --sp-component-button-cta-bg-disabled: var(--sp-button-cta-bgdisabled);
509
+ --sp-component-button-cta-text: var(--sp-button-cta-text);
510
+ --sp-component-button-cta-text-disabled: var(--sp-button-cta-textdisabled);
511
+ --sp-component-button-cta-shadow: var(--sp-button-cta-shadow);
495
512
  --sp-component-button-accent-bg: var(--sp-button-accent-bg);
496
513
  --sp-component-button-accent-bg-hover: var(--sp-button-accent-bghover);
497
514
  --sp-component-button-accent-bg-active: var(--sp-button-accent-bgactive);
@@ -520,6 +537,7 @@
520
537
  --sp-component-input-role-bg: var(--sp-form-default-bg);
521
538
  --sp-component-input-role-text: var(--sp-form-default-text);
522
539
  --sp-component-input-role-placeholder: var(--sp-form-default-placeholder);
540
+ --sp-component-input-role-border-hover: var(--sp-form-hover-border);
523
541
  --sp-component-input-role-border-focus: var(--sp-form-focus-border);
524
542
  --sp-component-input-role-ring: var(--sp-form-focus-ring);
525
543
  --sp-component-input-role-border-error: var(--sp-form-invalid-border);
@@ -553,7 +571,7 @@
553
571
  --sp-component-badge-info-bg: var(--sp-badge-info-bg);
554
572
  --sp-component-badge-info-text: var(--sp-badge-info-text);
555
573
 
556
- /* badge hover states missing from core token exports, mapped to semantic logic */
574
+ /* badge hover states derived from Spectre token semantics */
557
575
  --sp-component-badge-primary-bg-hover: var(--sp-button-primary-bghover);
558
576
  --sp-component-badge-secondary-bg-hover: var(--sp-button-secondary-bghover);
559
577
  --sp-component-badge-success-bg-hover: var(--sp-color-success-200);
@@ -596,10 +614,8 @@
596
614
  /* pricing card roles */
597
615
  --sp-component-pricing-card-bg: var(--sp-surface-card);
598
616
  --sp-component-pricing-card-border: var(--sp-color-neutral-200);
599
- /* FLAG: component.pricingCard.featuredBg in tokens is info.600 (Blue), which clashing
600
- with the warning.500 (Gold) badge. Remaining on neutral-900 to pass Aesthetic Audit. */
601
- --sp-component-pricing-card-featured-bg: var(--sp-color-neutral-900);
602
- --sp-component-pricing-card-featured-text: var(--sp-color-neutral-50);
617
+ --sp-component-pricing-card-featured-bg: var(--sp-color-info-600);
618
+ --sp-component-pricing-card-featured-text: var(--sp-button-text-on-primary);
603
619
  --sp-component-pricing-card-featured-badge-bg: var(--sp-color-warning-500);
604
620
  --sp-component-pricing-card-featured-badge-text: var(--sp-color-neutral-900);
605
621
  --sp-component-pricing-card-price: var(--sp-color-neutral-900);
@@ -610,22 +626,26 @@
610
626
  --sp-component-rating-star-filled: var(--sp-color-warning-500);
611
627
  --sp-component-rating-star-empty: var(--sp-color-neutral-200);
612
628
  --sp-component-rating-text: var(--sp-color-neutral-500);
629
+ --sp-component-rating-size-sm: var(--sp-font-sm-size);
630
+ --sp-component-rating-size-md: var(--sp-font-md-size);
631
+ --sp-component-rating-size-lg: var(--sp-font-lg-size);
613
632
  }
614
633
 
615
- /* dark mode overrides for complex component tokens not yet exported by spectre-tokens v2.x */
634
+ /* dark mode overrides mapped from Spectre token mode definitions */
616
635
  :root[data-spectre-theme="dark"] {
617
636
  --sp-component-testimonial-bg: var(--sp-color-neutral-800);
618
637
  --sp-component-testimonial-border: var(--sp-color-neutral-700);
619
- --sp-component-testimonial-text: var(--sp-color-neutral-300);
638
+ --sp-component-testimonial-text: var(--sp-color-neutral-200);
620
639
  --sp-component-testimonial-author-name: var(--sp-color-neutral-100);
621
- --sp-component-testimonial-author-title: var(--sp-color-neutral-400);
640
+ --sp-component-testimonial-author-title: var(--sp-color-neutral-300);
622
641
  --sp-component-testimonial-quote-mark: var(--sp-color-neutral-600);
623
642
 
624
643
  --sp-component-pricing-card-bg: var(--sp-color-neutral-800);
625
644
  --sp-component-pricing-card-border: var(--sp-color-neutral-700);
626
645
  --sp-component-pricing-card-price: var(--sp-color-neutral-100);
627
- --sp-component-pricing-card-price-description: var(--sp-color-neutral-400);
646
+ --sp-component-pricing-card-price-description: var(--sp-color-neutral-300);
628
647
 
648
+ --sp-component-rating-star-filled: var(--sp-color-warning-400);
629
649
  --sp-component-rating-star-empty: var(--sp-color-neutral-700);
630
650
  --sp-component-rating-text: var(--sp-color-neutral-400);
631
651
 
@@ -637,14 +657,20 @@
637
657
  --sp-component-badge-danger-text: var(--sp-color-error-100);
638
658
  --sp-component-badge-neutral-bg: var(--sp-color-neutral-700);
639
659
  --sp-component-badge-neutral-text: var(--sp-color-neutral-100);
640
- --sp-component-badge-info-bg: var(--sp-color-info-800);
660
+ --sp-component-badge-info-bg: var(--sp-color-info-900);
641
661
  --sp-component-badge-info-text: var(--sp-color-info-100);
642
662
 
643
663
  --sp-component-badge-success-bg-hover: var(--sp-color-success-700);
644
- --sp-component-badge-warning-bg-hover: var(--sp-color-warning-700);
664
+ --sp-component-badge-warning-bg-hover: var(--sp-color-warning-800);
645
665
  --sp-component-badge-danger-bg-hover: var(--sp-color-error-700);
646
666
  --sp-component-badge-neutral-bg-hover: var(--sp-color-neutral-600);
647
667
  --sp-component-badge-info-bg-hover: var(--sp-color-info-700);
668
+
669
+ --sp-component-iconbox-primary-bg: var(--sp-color-brand-900);
670
+ --sp-component-iconbox-success-bg: var(--sp-color-success-900);
671
+ --sp-component-iconbox-warning-bg: var(--sp-color-warning-900);
672
+ --sp-component-iconbox-danger-bg: var(--sp-color-error-900);
673
+ --sp-component-iconbox-info-bg: var(--sp-color-info-900);
648
674
  }
649
675
 
650
676
  /* BUTTONS -------------------------------------------------------------- */
@@ -684,6 +710,13 @@
684
710
  opacity: var(--sp-opacity-active);
685
711
  }
686
712
 
713
+ .sp-btn:focus-visible,
714
+ .sp-btn--focus,
715
+ .sp-btn.is-focus {
716
+ outline: none;
717
+ box-shadow: 0 0 0 calc(var(--sp-focus-ring-width) + var(--sp-component-border-width)) var(--sp-color-focus-primary);
718
+ }
719
+
687
720
  .sp-btn--full {
688
721
  width: 100%;
689
722
  }
@@ -968,8 +1001,14 @@
968
1001
  border-radius: var(--sp-radius-pill);
969
1002
  }
970
1003
 
1004
+ .sp-input:hover,
1005
+ .sp-input--hover {
1006
+ border-color: var(--sp-component-input-role-border-hover);
1007
+ }
1008
+
971
1009
  .sp-input:focus,
972
- .sp-input--focus {
1010
+ .sp-input--focus,
1011
+ .sp-input.is-focus {
973
1012
  border-color: var(--sp-component-input-role-border-focus);
974
1013
  box-shadow: 0 0 0 calc(var(--sp-focus-ring-width) + var(--sp-component-border-width)) var(--sp-component-input-role-ring);
975
1014
  outline: none;
@@ -988,11 +1027,14 @@
988
1027
  color: var(--sp-component-input-role-text);
989
1028
  }
990
1029
 
1030
+ .sp-input:disabled,
1031
+ .sp-input[aria-disabled="true"],
991
1032
  .sp-input--disabled {
992
1033
  background-color: var(--sp-component-input-role-bg-disabled);
993
1034
  color: var(--sp-component-input-role-text-disabled);
994
1035
  border-color: var(--sp-component-input-role-border-disabled);
995
1036
  cursor: not-allowed;
1037
+ pointer-events: none;
996
1038
  }
997
1039
 
998
1040
  .sp-input--disabled::placeholder {
@@ -1063,6 +1105,11 @@
1063
1105
  pointer-events: none;
1064
1106
  }
1065
1107
 
1108
+ .sp-card--loading {
1109
+ opacity: var(--sp-opacity-active);
1110
+ pointer-events: none;
1111
+ }
1112
+
1066
1113
  .sp-card--interactive {
1067
1114
  cursor: pointer;
1068
1115
  transition:
@@ -1072,7 +1119,11 @@
1072
1119
 
1073
1120
  .sp-card--interactive:hover,
1074
1121
  .sp-card--interactive:focus-visible,
1075
- .sp-card--interactive:focus-within {
1122
+ .sp-card--interactive:focus-within,
1123
+ .sp-card--interactive.sp-card--hover,
1124
+ .sp-card--interactive.is-hover,
1125
+ .sp-card--interactive.sp-card--focus,
1126
+ .sp-card--interactive.is-focus {
1076
1127
  transform: translateY(calc(var(--sp-component-border-width) * -1));
1077
1128
  box-shadow: var(--sp-component-card-shadow-elevated);
1078
1129
  }
@@ -1117,7 +1168,9 @@
1117
1168
  color: var(--sp-component-badge-primary-text);
1118
1169
  }
1119
1170
 
1120
- .sp-badge--primary.sp-badge--interactive:hover {
1171
+ .sp-badge--primary.sp-badge--interactive:hover,
1172
+ .sp-badge--primary.sp-badge--interactive.sp-badge--hover,
1173
+ .sp-badge--primary.sp-badge--interactive.is-hover {
1121
1174
  background-color: var(--sp-component-badge-primary-bg-hover);
1122
1175
  }
1123
1176
 
@@ -1127,7 +1180,9 @@
1127
1180
  border-color: var(--sp-component-badge-secondary-border);
1128
1181
  }
1129
1182
 
1130
- .sp-badge--secondary.sp-badge--interactive:hover {
1183
+ .sp-badge--secondary.sp-badge--interactive:hover,
1184
+ .sp-badge--secondary.sp-badge--interactive.sp-badge--hover,
1185
+ .sp-badge--secondary.sp-badge--interactive.is-hover {
1131
1186
  background-color: var(--sp-component-badge-secondary-bg-hover);
1132
1187
  }
1133
1188
 
@@ -1136,7 +1191,9 @@
1136
1191
  color: var(--sp-component-badge-success-text);
1137
1192
  }
1138
1193
 
1139
- .sp-badge--success.sp-badge--interactive:hover {
1194
+ .sp-badge--success.sp-badge--interactive:hover,
1195
+ .sp-badge--success.sp-badge--interactive.sp-badge--hover,
1196
+ .sp-badge--success.sp-badge--interactive.is-hover {
1140
1197
  background-color: var(--sp-component-badge-success-bg-hover);
1141
1198
  }
1142
1199
 
@@ -1145,7 +1202,9 @@
1145
1202
  color: var(--sp-component-badge-warning-text);
1146
1203
  }
1147
1204
 
1148
- .sp-badge--warning.sp-badge--interactive:hover {
1205
+ .sp-badge--warning.sp-badge--interactive:hover,
1206
+ .sp-badge--warning.sp-badge--interactive.sp-badge--hover,
1207
+ .sp-badge--warning.sp-badge--interactive.is-hover {
1149
1208
  background-color: var(--sp-component-badge-warning-bg-hover);
1150
1209
  }
1151
1210
 
@@ -1154,7 +1213,9 @@
1154
1213
  color: var(--sp-component-badge-danger-text);
1155
1214
  }
1156
1215
 
1157
- .sp-badge--danger.sp-badge--interactive:hover {
1216
+ .sp-badge--danger.sp-badge--interactive:hover,
1217
+ .sp-badge--danger.sp-badge--interactive.sp-badge--hover,
1218
+ .sp-badge--danger.sp-badge--interactive.is-hover {
1158
1219
  background-color: var(--sp-component-badge-danger-bg-hover);
1159
1220
  }
1160
1221
 
@@ -1163,7 +1224,9 @@
1163
1224
  color: var(--sp-component-badge-neutral-text);
1164
1225
  }
1165
1226
 
1166
- .sp-badge--neutral.sp-badge--interactive:hover {
1227
+ .sp-badge--neutral.sp-badge--interactive:hover,
1228
+ .sp-badge--neutral.sp-badge--interactive.sp-badge--hover,
1229
+ .sp-badge--neutral.sp-badge--interactive.is-hover {
1167
1230
  background-color: var(--sp-component-badge-neutral-bg-hover);
1168
1231
  }
1169
1232
 
@@ -1172,13 +1235,33 @@
1172
1235
  color: var(--sp-component-badge-info-text);
1173
1236
  }
1174
1237
 
1175
- .sp-badge--info.sp-badge--interactive:hover {
1238
+ .sp-badge--info.sp-badge--interactive:hover,
1239
+ .sp-badge--info.sp-badge--interactive.sp-badge--hover,
1240
+ .sp-badge--info.sp-badge--interactive.is-hover {
1176
1241
  background-color: var(--sp-component-badge-info-bg-hover);
1177
1242
  }
1178
1243
 
1179
1244
  .sp-badge--interactive {
1180
1245
  cursor: pointer;
1181
- transition: background-color var(--sp-duration-fast) var(--sp-easing-out);
1246
+ transition:
1247
+ background-color var(--sp-duration-fast) var(--sp-easing-out),
1248
+ color var(--sp-duration-fast) var(--sp-easing-out),
1249
+ box-shadow var(--sp-duration-fast) var(--sp-easing-out),
1250
+ border-color var(--sp-duration-fast) var(--sp-easing-out),
1251
+ opacity var(--sp-duration-fast) var(--sp-easing-out);
1252
+ }
1253
+
1254
+ .sp-badge--interactive:active,
1255
+ .sp-badge--interactive.sp-badge--active,
1256
+ .sp-badge--interactive.is-active {
1257
+ opacity: var(--sp-opacity-active);
1258
+ }
1259
+
1260
+ .sp-badge--interactive:focus-visible,
1261
+ .sp-badge--interactive.sp-badge--focus,
1262
+ .sp-badge--interactive.is-focus {
1263
+ outline: none;
1264
+ box-shadow: 0 0 0 calc(var(--sp-focus-ring-width) + var(--sp-component-border-width)) var(--sp-color-focus-primary);
1182
1265
  }
1183
1266
 
1184
1267
  .sp-badge--disabled {
@@ -1203,6 +1286,12 @@
1203
1286
  font-family: var(--sp-font-family-sans);
1204
1287
  font-weight: var(--sp-font-md-weight);
1205
1288
  line-height: 0;
1289
+ transition:
1290
+ background-color var(--sp-duration-fast) var(--sp-easing-out),
1291
+ color var(--sp-duration-fast) var(--sp-easing-out),
1292
+ box-shadow var(--sp-duration-fast) var(--sp-easing-out),
1293
+ border-color var(--sp-duration-fast) var(--sp-easing-out),
1294
+ opacity var(--sp-duration-fast) var(--sp-easing-out);
1206
1295
  }
1207
1296
 
1208
1297
  /* Harden icon rendering:
@@ -1296,9 +1385,35 @@
1296
1385
  color: var(--sp-component-iconbox-info-text);
1297
1386
  }
1298
1387
 
1388
+ .sp-iconbox--interactive {
1389
+ cursor: pointer;
1390
+ }
1391
+
1392
+ .sp-iconbox--interactive:hover,
1393
+ .sp-iconbox--interactive.sp-iconbox--hover,
1394
+ .sp-iconbox--interactive.is-hover {
1395
+ opacity: var(--sp-opacity-hover);
1396
+ }
1397
+
1398
+ .sp-iconbox--interactive:active,
1399
+ .sp-iconbox--interactive.sp-iconbox--active,
1400
+ .sp-iconbox--interactive.is-active {
1401
+ opacity: var(--sp-opacity-active);
1402
+ }
1403
+
1404
+ .sp-iconbox--interactive:focus-visible,
1405
+ .sp-iconbox--interactive.sp-iconbox--focus,
1406
+ .sp-iconbox--interactive.is-focus {
1407
+ outline: none;
1408
+ box-shadow: 0 0 0 calc(var(--sp-focus-ring-width) + var(--sp-component-border-width)) var(--sp-color-focus-primary);
1409
+ }
1410
+
1411
+ .sp-iconbox:disabled,
1412
+ .sp-iconbox[aria-disabled="true"],
1299
1413
  .sp-iconbox--disabled {
1300
1414
  opacity: var(--sp-opacity-disabled);
1301
1415
  pointer-events: none;
1416
+ cursor: not-allowed;
1302
1417
  }
1303
1418
 
1304
1419
  .sp-iconbox--loading {
@@ -1395,6 +1510,11 @@
1395
1510
  pointer-events: none;
1396
1511
  }
1397
1512
 
1513
+ .sp-pricing-card--loading {
1514
+ opacity: var(--sp-opacity-active);
1515
+ pointer-events: none;
1516
+ }
1517
+
1398
1518
  .sp-pricing-card-badge {
1399
1519
  position: absolute;
1400
1520
  top: var(--sp-space-16);
@@ -1439,6 +1559,19 @@
1439
1559
  display: inline-flex;
1440
1560
  align-items: center;
1441
1561
  gap: var(--sp-space-8);
1562
+ font-size: var(--sp-component-rating-size-md);
1563
+ }
1564
+
1565
+ .sp-rating--sm {
1566
+ font-size: var(--sp-component-rating-size-sm);
1567
+ }
1568
+
1569
+ .sp-rating--md {
1570
+ font-size: var(--sp-component-rating-size-md);
1571
+ }
1572
+
1573
+ .sp-rating--lg {
1574
+ font-size: var(--sp-component-rating-size-lg);
1442
1575
  }
1443
1576
 
1444
1577
  .sp-rating--disabled {
package/dist/index.d.cts CHANGED
@@ -8,10 +8,22 @@ declare const spectreStyles: {
8
8
  utilities: string;
9
9
  };
10
10
 
11
- declare const buttonVariants: readonly ["primary", "secondary", "ghost", "danger", "success", "cta", "accent"];
12
- declare const buttonSizes: readonly ["sm", "md", "lg"];
13
- type ButtonVariant = (typeof buttonVariants)[number];
14
- type ButtonSize = (typeof buttonSizes)[number];
11
+ declare const BUTTON_VARIANTS: {
12
+ readonly primary: true;
13
+ readonly secondary: true;
14
+ readonly ghost: true;
15
+ readonly danger: true;
16
+ readonly success: true;
17
+ readonly cta: true;
18
+ readonly accent: true;
19
+ };
20
+ declare const BUTTON_SIZES: {
21
+ readonly sm: true;
22
+ readonly md: true;
23
+ readonly lg: true;
24
+ };
25
+ type ButtonVariant = keyof typeof BUTTON_VARIANTS;
26
+ type ButtonSize = keyof typeof BUTTON_SIZES;
15
27
  /**
16
28
  * Generate classes for the Button component.
17
29
  * @sync v2.x - Synced with latest design tokens, including CTA variants.
@@ -22,38 +34,73 @@ interface ButtonRecipeOptions {
22
34
  fullWidth?: boolean;
23
35
  loading?: boolean;
24
36
  disabled?: boolean;
37
+ hovered?: boolean;
38
+ focused?: boolean;
39
+ active?: boolean;
25
40
  iconOnly?: boolean;
26
41
  pill?: boolean;
27
42
  }
28
43
  declare function getButtonClasses(opts?: ButtonRecipeOptions): string;
29
44
 
30
- declare const cardVariants: readonly ["elevated", "flat", "outline", "ghost"];
31
- type CardVariant = (typeof cardVariants)[number];
45
+ declare const CARD_VARIANTS: {
46
+ readonly elevated: true;
47
+ readonly flat: true;
48
+ readonly outline: true;
49
+ readonly ghost: true;
50
+ };
51
+ type CardVariant = keyof typeof CARD_VARIANTS;
32
52
  interface CardRecipeOptions {
33
53
  variant?: CardVariant;
34
54
  interactive?: boolean;
35
55
  padded?: boolean;
36
56
  fullHeight?: boolean;
37
57
  disabled?: boolean;
58
+ loading?: boolean;
59
+ hovered?: boolean;
60
+ focused?: boolean;
38
61
  }
39
62
  declare function getCardClasses(opts?: CardRecipeOptions): string;
40
63
 
41
- declare const inputStates: readonly ["default", "error", "success", "disabled", "loading"];
42
- declare const inputSizes: readonly ["sm", "md", "lg"];
43
- type InputState = (typeof inputStates)[number];
44
- type InputSize = (typeof inputSizes)[number];
64
+ declare const INPUT_STATES: {
65
+ readonly default: true;
66
+ readonly error: true;
67
+ readonly success: true;
68
+ readonly disabled: true;
69
+ readonly loading: true;
70
+ };
71
+ declare const INPUT_SIZES: {
72
+ readonly sm: true;
73
+ readonly md: true;
74
+ readonly lg: true;
75
+ };
76
+ type InputState = keyof typeof INPUT_STATES;
77
+ type InputSize = keyof typeof INPUT_SIZES;
45
78
  interface InputRecipeOptions {
46
79
  state?: InputState;
47
80
  size?: InputSize;
48
81
  fullWidth?: boolean;
49
82
  pill?: boolean;
83
+ focused?: boolean;
84
+ hovered?: boolean;
50
85
  }
51
86
  declare function getInputClasses(opts?: InputRecipeOptions): string;
52
87
 
53
- declare const badgeVariants: readonly ["primary", "secondary", "success", "warning", "danger", "neutral", "info"];
54
- declare const badgeSizes: readonly ["sm", "md", "lg"];
55
- type BadgeVariant = (typeof badgeVariants)[number];
56
- type BadgeSize = (typeof badgeSizes)[number];
88
+ declare const BADGE_VARIANTS: {
89
+ readonly primary: true;
90
+ readonly secondary: true;
91
+ readonly success: true;
92
+ readonly warning: true;
93
+ readonly danger: true;
94
+ readonly neutral: true;
95
+ readonly info: true;
96
+ };
97
+ declare const BADGE_SIZES: {
98
+ readonly sm: true;
99
+ readonly md: true;
100
+ readonly lg: true;
101
+ };
102
+ type BadgeVariant = keyof typeof BADGE_VARIANTS;
103
+ type BadgeSize = keyof typeof BADGE_SIZES;
57
104
  /**
58
105
  * Generate classes for the Badge component.
59
106
  * @sync v2.x - Synced with latest design tokens, including hover states.
@@ -62,20 +109,37 @@ interface BadgeRecipeOptions {
62
109
  variant?: BadgeVariant;
63
110
  size?: BadgeSize;
64
111
  interactive?: boolean;
112
+ hovered?: boolean;
113
+ focused?: boolean;
114
+ active?: boolean;
65
115
  disabled?: boolean;
66
116
  loading?: boolean;
67
117
  }
68
118
  declare function getBadgeClasses(opts?: BadgeRecipeOptions): string;
69
119
 
70
- declare const iconBoxVariants: readonly ["primary", "success", "warning", "danger", "info"];
71
- declare const iconBoxSizes: readonly ["sm", "md", "lg"];
72
- type IconBoxVariant = (typeof iconBoxVariants)[number];
73
- type IconBoxSize = (typeof iconBoxSizes)[number];
120
+ declare const ICONBOX_VARIANTS: {
121
+ readonly primary: true;
122
+ readonly success: true;
123
+ readonly warning: true;
124
+ readonly danger: true;
125
+ readonly info: true;
126
+ };
127
+ declare const ICONBOX_SIZES: {
128
+ readonly sm: true;
129
+ readonly md: true;
130
+ readonly lg: true;
131
+ };
132
+ type IconBoxVariant = keyof typeof ICONBOX_VARIANTS;
133
+ type IconBoxSize = keyof typeof ICONBOX_SIZES;
74
134
  interface IconBoxRecipeOptions {
75
135
  variant?: IconBoxVariant;
76
136
  size?: IconBoxSize;
77
137
  disabled?: boolean;
78
138
  loading?: boolean;
139
+ interactive?: boolean;
140
+ hovered?: boolean;
141
+ focused?: boolean;
142
+ active?: boolean;
79
143
  }
80
144
  declare function getIconBoxClasses(opts?: IconBoxRecipeOptions): string;
81
145
 
@@ -101,6 +165,7 @@ declare function getTestimonialAuthorTitleClasses(): string;
101
165
  interface PricingCardRecipeOptions {
102
166
  featured?: boolean;
103
167
  disabled?: boolean;
168
+ loading?: boolean;
104
169
  }
105
170
  declare function getPricingCardClasses(opts?: PricingCardRecipeOptions): string;
106
171
  declare function getPricingCardBadgeClasses(): string;
@@ -108,11 +173,18 @@ declare function getPricingCardPriceContainerClasses(): string;
108
173
  declare function getPricingCardPriceClasses(): string;
109
174
  declare function getPricingCardDescriptionClasses(): string;
110
175
 
176
+ declare const RATING_SIZES: {
177
+ readonly sm: true;
178
+ readonly md: true;
179
+ readonly lg: true;
180
+ };
181
+ type RatingSize = keyof typeof RATING_SIZES;
111
182
  /**
112
183
  * Generate classes for the Rating component.
113
184
  * @sync v2.x - Synced with latest design tokens.
114
185
  */
115
186
  interface RatingRecipeOptions {
187
+ size?: RatingSize;
116
188
  disabled?: boolean;
117
189
  loading?: boolean;
118
190
  }