@aziontech/theme 4.3.0 → 5.0.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.
@@ -173,7 +173,7 @@
173
173
 
174
174
 
175
175
  /*
176
- * `@aziontech/webkit` components use arbitrary values (`bg-[var(--x)]`) that
176
+ * `@aziontech/webkit` components use arbitrary values (`bg-(--x)`) that
177
177
  * Tailwind v4 only picks up when the source files are inside the scan.
178
178
  * Auto-detect scans the CWD only, so we point `@source` at the webkit
179
179
  * package via a monorepo-relative path (this file is under
@@ -197,12 +197,16 @@
197
197
  --color-blue-950: #000C1A;
198
198
  --color-gray-50: #FAFAFA;
199
199
  --color-gray-100: #F5F5F5;
200
+ --color-gray-150: #ECECEC;
200
201
  --color-gray-200: #E5E5E5;
202
+ --color-gray-250: #DADADA;
201
203
  --color-gray-300: #B2B2B2;
202
204
  --color-gray-400: #999999;
203
205
  --color-gray-500: #808080;
204
206
  --color-gray-600: #666666;
205
207
  --color-gray-700: #4D4D4D;
208
+ --color-gray-750: #2B2B2B;
209
+ --color-gray-775: #242424;
206
210
  --color-gray-800: #1A1A1A;
207
211
  --color-gray-900: #141414;
208
212
  --color-gray-950: #0A0A0A;
@@ -404,7 +408,9 @@
404
408
  --animate-fade-in: fadeIn 220ms ease-in-out;
405
409
  --animate-fade-out: fadeOut 220ms ease-in-out;
406
410
  --animate-slide-down: slideDown 220ms ease-in-out;
407
- --animate-highlight-fade: highlight ease-in forwards;
411
+ --animate-highlight-fade: highlight 1100ms ease-in forwards;
412
+ --animate-page-enter: pageEnter 240ms cubic-bezier(0.39, 0.57, 0.56, 1);
413
+ --animate-content-enter: contentEnter 240ms cubic-bezier(0.39, 0.57, 0.56, 1) var(--content-enter-delay, 0s) backwards;
408
414
  --animate-popup-scale-in: popupScaleIn 150ms cubic-bezier(0.39, 0.57, 0.56, 1);
409
415
  --animate-popup-scale-out: popupScaleOut 110ms cubic-bezier(0.55, 0.09, 0.68, 0.53);
410
416
  --animate-slide-in-left: slideInLeft 240ms cubic-bezier(0.39, 0.57, 0.56, 1);
@@ -663,7 +669,9 @@
663
669
  --animate-fade-in: fadeIn 220ms ease-in-out;
664
670
  --animate-fade-out: fadeOut 220ms ease-in-out;
665
671
  --animate-slide-down: slideDown 220ms ease-in-out;
666
- --animate-highlight-fade: highlight ease-in forwards;
672
+ --animate-highlight-fade: highlight 1100ms ease-in forwards;
673
+ --animate-page-enter: pageEnter 240ms cubic-bezier(0.39, 0.57, 0.56, 1);
674
+ --animate-content-enter: contentEnter 240ms cubic-bezier(0.39, 0.57, 0.56, 1) var(--content-enter-delay, 0s) backwards;
667
675
  --animate-popup-scale-in: popupScaleIn 150ms cubic-bezier(0.39, 0.57, 0.56, 1);
668
676
  --animate-popup-scale-out: popupScaleOut 110ms cubic-bezier(0.55, 0.09, 0.68, 0.53);
669
677
  --animate-slide-in-left: slideInLeft 240ms cubic-bezier(0.39, 0.57, 0.56, 1);
@@ -687,6 +695,19 @@
687
695
  --z-input-field: 1;
688
696
  --z-input-popup: 10;
689
697
  --z-input-overlay: 1100;
698
+ --layout-boundary-inline: var(--spacing-lg);
699
+ --layout-boundary-end: var(--spacing-lg);
700
+ --layout-boundary-start: var(--spacing-lg);
701
+ --layout-section-gap: var(--spacing-xl);
702
+ --layout-group-gap: var(--spacing-md);
703
+ --layout-measure: var(--container-7xl);
704
+ --layout-measure-focused: var(--container-4xl);
705
+ --layout-measure-form: var(--container-4xl);
706
+ --layout-measure-form-create: var(--container-5xl);
707
+ --layout-measure-content: var(--container-3xl);
708
+ --layout-measure-site: var(--container-6xl);
709
+ --layout-measure-site-header: var(--container-7xl);
710
+ --layout-measure-control: var(--container-3xs);
690
711
  --text-big-number-md-font-size: 1.25rem;
691
712
  --text-big-number-md-line-height: 1.25;
692
713
  --text-big-number-md-font-weight: 400;
@@ -699,6 +720,20 @@
699
720
  --text-big-number-lg-line-height: 1.25;
700
721
  --text-big-number-lg-font-weight: 400;
701
722
  --text-big-number-lg-font-family: Proto Mono;
723
+ --text-amount-lg-text-wrap-style: balance;
724
+ --text-amount-lg-font-size: 1.875rem;
725
+ --text-amount-lg-line-height: 1.25;
726
+ --text-amount-lg-font-weight: 400;
727
+ --text-amount-lg-letter-spacing: -0.08em;
728
+ --text-amount-md-text-wrap-style: balance;
729
+ --text-amount-md-font-size: 1rem;
730
+ --text-amount-md-line-height: 1.25;
731
+ --text-amount-md-font-weight: 400;
732
+ --text-amount-md-letter-spacing: -0.08em;
733
+ --text-amount-sm-font-size: 1rem;
734
+ --text-amount-sm-line-height: 1.5;
735
+ --text-amount-sm-font-weight: 400;
736
+ --text-amount-sm-letter-spacing: -0.08em;
702
737
  --text-heading-2xl-font-size: 1.875rem;
703
738
  --text-heading-2xl-line-height: 1.25;
704
739
  --text-heading-2xl-font-weight: 400;
@@ -734,6 +769,12 @@
734
769
  --text-label-code-sm-line-height: 1;
735
770
  --text-label-code-sm-font-weight: 400;
736
771
  --text-label-code-sm-letter-spacing: 0;
772
+ --text-body-code-sm-text-wrap-style: pretty;
773
+ --text-body-code-sm-font-family: Roboto Mono;
774
+ --text-body-code-sm-font-size: 0.75rem;
775
+ --text-body-code-sm-line-height: 1.625;
776
+ --text-body-code-sm-font-weight: 400;
777
+ --text-body-code-sm-letter-spacing: 0;
737
778
  --text-label-code-md-font-family: Roboto Mono;
738
779
  --text-label-code-md-font-size: 0.875rem;
739
780
  --text-label-code-md-line-height: 1;
@@ -745,21 +786,29 @@
745
786
  --text-label-code-lg-font-weight: 400;
746
787
  --text-label-code-lg-letter-spacing: 0;
747
788
  --text-body-lg-font-size: 1rem;
748
- --text-body-lg-line-height: 1.5;
789
+ --text-body-lg-font-weight: 400;
790
+ --text-body-lg-line-height: 1.375;
749
791
  --text-body-md-font-size: 1rem;
750
- --text-body-md-line-height: 1.5;
792
+ --text-body-md-font-weight: 400;
793
+ --text-body-md-line-height: 1.375;
794
+ --text-body-prose-md-font-size: 1rem;
795
+ --text-body-prose-md-font-weight: 400;
796
+ --text-body-prose-md-line-height: 1.625;
751
797
  --text-body-sm-font-size: 0.875rem;
752
- --text-body-sm-line-height: 1.5;
798
+ --text-body-sm-font-weight: 400;
799
+ --text-body-sm-line-height: 1.375;
753
800
  --text-body-xs-font-size: 0.75rem;
754
- --text-body-xs-line-height: 1.5;
801
+ --text-body-xs-font-weight: 400;
802
+ --text-body-xs-line-height: 1.375;
803
+ --text-body-xxs-font-size: 0.75rem;
804
+ --text-body-xxs-font-weight: 400;
805
+ --text-body-xxs-line-height: 1.5;
755
806
  --text-tag-sm-font-size: 0.75rem;
756
807
  --text-tag-sm-line-height: 1.25;
757
- --text-tag-sm-font-weight: 600;
808
+ --text-tag-sm-font-weight: 400;
758
809
  --text-tag-md-font-size: 0.75rem;
759
810
  --text-tag-md-line-height: 1.25;
760
- --text-tag-md-font-weight: 600;
761
- --text-body-xxs-font-size: 0.75rem;
762
- --text-body-xxs-line-height: 1.5;
811
+ --text-tag-md-font-weight: 400;
763
812
  --text-overline-md-font-family: Proto Mono;
764
813
  --text-overline-md-font-size: 0.75rem;
765
814
  --text-overline-md-line-height: 1.375;
@@ -801,6 +850,8 @@
801
850
  --text-big-number-md-font-size: 1.5rem;
802
851
  --text-big-number-sm-font-size: 1.25rem;
803
852
  --text-big-number-lg-font-size: 2.25rem;
853
+ --text-amount-lg-font-size: 3rem;
854
+ --text-amount-md-font-size: 1.25rem;
804
855
  --text-heading-2xl-font-size: 3rem;
805
856
  --text-heading-xl-font-size: 1.875rem;
806
857
  --text-heading-md-font-size: 1.25rem;
@@ -811,6 +862,8 @@
811
862
  @media (min-width: 768px) {
812
863
  --text-big-number-md-font-size: 2.25rem;
813
864
  --text-big-number-lg-font-size: 3.5rem;
865
+ --text-amount-lg-font-size: 3.5rem;
866
+ --text-amount-md-font-size: 1.5rem;
814
867
  --text-heading-2xl-font-size: 3.5rem;
815
868
  --text-heading-xl-font-size: 2.25rem;
816
869
  --text-heading-lg-font-size: 1.875rem;
@@ -833,12 +886,16 @@
833
886
  --surface-0: #FFFFFF;
834
887
  --surface-50: #FAFAFA;
835
888
  --surface-100: #F5F5F5;
889
+ --surface-150: #ECECEC;
836
890
  --surface-200: #E5E5E5;
891
+ --surface-250: #DADADA;
837
892
  --surface-300: #B2B2B2;
838
893
  --surface-400: #999999;
839
894
  --surface-500: #808080;
840
895
  --surface-600: #666666;
841
896
  --surface-700: #4D4D4D;
897
+ --surface-750: #2B2B2B;
898
+ --surface-775: #242424;
842
899
  --surface-800: #1A1A1A;
843
900
  --surface-900: #141414;
844
901
  --surface-950: #0A0A0A;
@@ -867,8 +924,8 @@
867
924
  --bg-selected: #E5E5E5;
868
925
  --bg-contrast: #141414;
869
926
  --bg-disabled: #E5E5E5;
870
- --border-default: #00000014;
871
- --border-muted: #00000014;
927
+ --border-default: #DADADA;
928
+ --border-muted: #ECECEC;
872
929
  --border-strong: #000000;
873
930
  --border-selected: #F3652B;
874
931
  --text-default: #141414;
@@ -904,12 +961,16 @@
904
961
  --surface-0: #FFFFFF;
905
962
  --surface-50: #FAFAFA;
906
963
  --surface-100: #F5F5F5;
964
+ --surface-150: #ECECEC;
907
965
  --surface-200: #E5E5E5;
966
+ --surface-250: #DADADA;
908
967
  --surface-300: #B2B2B2;
909
968
  --surface-400: #999999;
910
969
  --surface-500: #808080;
911
970
  --surface-600: #666666;
912
971
  --surface-700: #4D4D4D;
972
+ --surface-750: #2B2B2B;
973
+ --surface-775: #242424;
913
974
  --surface-800: #1A1A1A;
914
975
  --surface-900: #141414;
915
976
  --surface-950: #0A0A0A;
@@ -938,8 +999,8 @@
938
999
  --bg-selected: #1A1A1A;
939
1000
  --bg-contrast: #FAFAFA;
940
1001
  --bg-disabled: #1A1A1A;
941
- --border-default: #FFFFFF1A;
942
- --border-muted: #FFFFFF0D;
1002
+ --border-default: #2B2B2B;
1003
+ --border-muted: #242424;
943
1004
  --border-strong: #FFFFFF;
944
1005
  --border-selected: #F3652B;
945
1006
  --text-default: #FAFAFA;
@@ -992,8 +1053,8 @@
992
1053
  }
993
1054
 
994
1055
  @keyframes highlight {
995
- 0% { background-color: var(--surface-hover); font-weight: 500; }
996
- 100% { background-color: var(--surface-hover); font-weight: 500; }
1056
+ 0%, 40% { background-color: var(--surface-hover); font-weight: 500; }
1057
+ 100% { background-color: transparent; font-weight: 400; }
997
1058
  }
998
1059
 
999
1060
  @keyframes shimmer {
@@ -1001,6 +1062,16 @@
1001
1062
  100% { background-position: -200% 0; }
1002
1063
  }
1003
1064
 
1065
+ @keyframes pageEnter {
1066
+ 0% { opacity: 0; translate: calc(var(--page-enter-distance, var(--layout-boundary-inline)) * -1) 0; }
1067
+ 100% { opacity: 1; translate: 0 0; }
1068
+ }
1069
+
1070
+ @keyframes contentEnter {
1071
+ 0% { opacity: 0; translate: 0 var(--spacing-xs); }
1072
+ 100% { opacity: 1; translate: 0 0; }
1073
+ }
1074
+
1004
1075
  @keyframes popupScaleIn {
1005
1076
  0% { opacity: 0; transform: scale(0.9); }
1006
1077
  100% { opacity: 1; transform: scale(1); }
@@ -1096,6 +1167,29 @@
1096
1167
  font-family: var(--text-big-number-lg-font-family);
1097
1168
  }
1098
1169
 
1170
+ @utility text-amount-lg {
1171
+ text-wrap-style: var(--text-amount-lg-text-wrap-style);
1172
+ font-size: var(--text-amount-lg-font-size);
1173
+ line-height: var(--text-amount-lg-line-height);
1174
+ font-weight: var(--text-amount-lg-font-weight);
1175
+ letter-spacing: var(--text-amount-lg-letter-spacing);
1176
+ }
1177
+
1178
+ @utility text-amount-md {
1179
+ text-wrap-style: var(--text-amount-md-text-wrap-style);
1180
+ font-size: var(--text-amount-md-font-size);
1181
+ line-height: var(--text-amount-md-line-height);
1182
+ font-weight: var(--text-amount-md-font-weight);
1183
+ letter-spacing: var(--text-amount-md-letter-spacing);
1184
+ }
1185
+
1186
+ @utility text-amount-sm {
1187
+ font-size: var(--text-amount-sm-font-size);
1188
+ line-height: var(--text-amount-sm-line-height);
1189
+ font-weight: var(--text-amount-sm-font-weight);
1190
+ letter-spacing: var(--text-amount-sm-letter-spacing);
1191
+ }
1192
+
1099
1193
  @utility text-heading-2xl {
1100
1194
  font-size: var(--text-heading-2xl-font-size);
1101
1195
  line-height: var(--text-heading-2xl-line-height);
@@ -1164,6 +1258,15 @@
1164
1258
  letter-spacing: var(--text-label-code-sm-letter-spacing);
1165
1259
  }
1166
1260
 
1261
+ @utility text-body-code-sm {
1262
+ text-wrap-style: var(--text-body-code-sm-text-wrap-style);
1263
+ font-family: var(--text-body-code-sm-font-family);
1264
+ font-size: var(--text-body-code-sm-font-size);
1265
+ line-height: var(--text-body-code-sm-line-height);
1266
+ font-weight: var(--text-body-code-sm-font-weight);
1267
+ letter-spacing: var(--text-body-code-sm-letter-spacing);
1268
+ }
1269
+
1167
1270
  @utility text-label-code-md {
1168
1271
  font-family: var(--text-label-code-md-font-family);
1169
1272
  font-size: var(--text-label-code-md-font-size);
@@ -1182,24 +1285,40 @@
1182
1285
 
1183
1286
  @utility text-body-lg {
1184
1287
  font-size: var(--text-body-lg-font-size);
1288
+ font-weight: var(--text-body-lg-font-weight);
1185
1289
  line-height: var(--text-body-lg-line-height);
1186
1290
  }
1187
1291
 
1188
1292
  @utility text-body-md {
1189
1293
  font-size: var(--text-body-md-font-size);
1294
+ font-weight: var(--text-body-md-font-weight);
1190
1295
  line-height: var(--text-body-md-line-height);
1191
1296
  }
1192
1297
 
1298
+ @utility text-body-prose-md {
1299
+ font-size: var(--text-body-prose-md-font-size);
1300
+ font-weight: var(--text-body-prose-md-font-weight);
1301
+ line-height: var(--text-body-prose-md-line-height);
1302
+ }
1303
+
1193
1304
  @utility text-body-sm {
1194
1305
  font-size: var(--text-body-sm-font-size);
1306
+ font-weight: var(--text-body-sm-font-weight);
1195
1307
  line-height: var(--text-body-sm-line-height);
1196
1308
  }
1197
1309
 
1198
1310
  @utility text-body-xs {
1199
1311
  font-size: var(--text-body-xs-font-size);
1312
+ font-weight: var(--text-body-xs-font-weight);
1200
1313
  line-height: var(--text-body-xs-line-height);
1201
1314
  }
1202
1315
 
1316
+ @utility text-body-xxs {
1317
+ font-size: var(--text-body-xxs-font-size);
1318
+ font-weight: var(--text-body-xxs-font-weight);
1319
+ line-height: var(--text-body-xxs-line-height);
1320
+ }
1321
+
1203
1322
  @utility text-tag-sm {
1204
1323
  font-size: var(--text-tag-sm-font-size);
1205
1324
  line-height: var(--text-tag-sm-line-height);
@@ -1212,11 +1331,6 @@
1212
1331
  font-weight: var(--text-tag-md-font-weight);
1213
1332
  }
1214
1333
 
1215
- @utility text-body-xxs {
1216
- font-size: var(--text-body-xxs-font-size);
1217
- line-height: var(--text-body-xxs-line-height);
1218
- }
1219
-
1220
1334
  @utility text-overline-md {
1221
1335
  font-family: var(--text-overline-md-font-family);
1222
1336
  font-size: var(--text-overline-md-font-size);
@@ -1271,6 +1385,77 @@
1271
1385
  .text-link { transition: none; }
1272
1386
  }
1273
1387
 
1388
+ @utility layout-boundary {
1389
+ padding-inline: var(--layout-boundary-inline);
1390
+ padding-block-start: var(--layout-boundary-start);
1391
+ padding-block-end: var(--layout-boundary-end);
1392
+ }
1393
+
1394
+ @utility layout-boundary-inline {
1395
+ padding-inline: var(--layout-boundary-inline);
1396
+ }
1397
+
1398
+ @utility layout-section-start {
1399
+ margin-block-start: var(--layout-boundary-start);
1400
+ &:first-child { margin-block-start: 0; }
1401
+ }
1402
+
1403
+ @utility layout-group-start {
1404
+ margin-block-start: var(--layout-group-gap);
1405
+ &:first-child { margin-block-start: 0; }
1406
+ }
1407
+
1408
+ @utility layout-column {
1409
+ --layout-column-measure: var(--layout-measure);
1410
+ margin-inline: auto;
1411
+ width: 100%;
1412
+ max-width: var(--layout-column-measure);
1413
+ &:is(.layout-boundary, .layout-boundary-inline) { max-width: calc(var(--layout-column-measure) + 2 * var(--layout-boundary-inline)); }
1414
+ }
1415
+
1416
+ @utility layout-column-focused {
1417
+ --layout-column-measure: var(--layout-measure-focused);
1418
+ margin-inline: auto;
1419
+ width: 100%;
1420
+ max-width: var(--layout-column-measure);
1421
+ &:is(.layout-boundary, .layout-boundary-inline) { max-width: calc(var(--layout-column-measure) + 2 * var(--layout-boundary-inline)); }
1422
+ }
1423
+
1424
+ @utility layout-column-form {
1425
+ --layout-column-measure: var(--layout-measure-form);
1426
+ margin-inline: auto;
1427
+ width: 100%;
1428
+ max-width: var(--layout-column-measure);
1429
+ &:is(.layout-boundary, .layout-boundary-inline) { max-width: calc(var(--layout-column-measure) + 2 * var(--layout-boundary-inline)); }
1430
+ }
1431
+
1432
+ @utility layout-form-create {
1433
+ --layout-column-measure: var(--layout-measure-form-create);
1434
+ --layout-measure-control: var(--container-md);
1435
+ margin-inline: auto;
1436
+ width: 100%;
1437
+ max-width: var(--layout-column-measure);
1438
+ &:is(.layout-boundary, .layout-boundary-inline) { max-width: calc(var(--layout-column-measure) + 2 * var(--layout-boundary-inline)); }
1439
+ }
1440
+
1441
+ @utility layout-column-content {
1442
+ --layout-column-measure: var(--layout-measure-content);
1443
+ margin-inline: auto;
1444
+ width: 100%;
1445
+ max-width: var(--layout-column-measure);
1446
+ &:is(.layout-boundary, .layout-boundary-inline) { max-width: calc(var(--layout-column-measure) + 2 * var(--layout-boundary-inline)); }
1447
+ }
1448
+
1449
+ @utility layout-column-site {
1450
+ margin-inline: auto;
1451
+ width: 100%;
1452
+ max-width: min(var(--layout-measure-site), 100% - 2 * var(--layout-boundary-inline));
1453
+ }
1454
+
1455
+ @utility layout-field-control {
1456
+ &:not(#\#) { display: flex; flex: 1 1 0%; justify-content: flex-end; max-width: var(--layout-measure-control); }
1457
+ }
1458
+
1274
1459
  @utility bg-surface-0 { background-color: var(--surface-0); }
1275
1460
  @utility text-surface-0 { color: var(--surface-0); }
1276
1461
  @utility border-surface-0 { border-color: var(--surface-0); }
@@ -1280,9 +1465,15 @@
1280
1465
  @utility bg-surface-100 { background-color: var(--surface-100); }
1281
1466
  @utility text-surface-100 { color: var(--surface-100); }
1282
1467
  @utility border-surface-100 { border-color: var(--surface-100); }
1468
+ @utility bg-surface-150 { background-color: var(--surface-150); }
1469
+ @utility text-surface-150 { color: var(--surface-150); }
1470
+ @utility border-surface-150 { border-color: var(--surface-150); }
1283
1471
  @utility bg-surface-200 { background-color: var(--surface-200); }
1284
1472
  @utility text-surface-200 { color: var(--surface-200); }
1285
1473
  @utility border-surface-200 { border-color: var(--surface-200); }
1474
+ @utility bg-surface-250 { background-color: var(--surface-250); }
1475
+ @utility text-surface-250 { color: var(--surface-250); }
1476
+ @utility border-surface-250 { border-color: var(--surface-250); }
1286
1477
  @utility bg-surface-300 { background-color: var(--surface-300); }
1287
1478
  @utility text-surface-300 { color: var(--surface-300); }
1288
1479
  @utility border-surface-300 { border-color: var(--surface-300); }
@@ -1298,6 +1489,12 @@
1298
1489
  @utility bg-surface-700 { background-color: var(--surface-700); }
1299
1490
  @utility text-surface-700 { color: var(--surface-700); }
1300
1491
  @utility border-surface-700 { border-color: var(--surface-700); }
1492
+ @utility bg-surface-750 { background-color: var(--surface-750); }
1493
+ @utility text-surface-750 { color: var(--surface-750); }
1494
+ @utility border-surface-750 { border-color: var(--surface-750); }
1495
+ @utility bg-surface-775 { background-color: var(--surface-775); }
1496
+ @utility text-surface-775 { color: var(--surface-775); }
1497
+ @utility border-surface-775 { border-color: var(--surface-775); }
1301
1498
  @utility bg-surface-800 { background-color: var(--surface-800); }
1302
1499
  @utility text-surface-800 { color: var(--surface-800); }
1303
1500
  @utility border-surface-800 { border-color: var(--surface-800); }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@aziontech/theme",
3
3
  "type": "module",
4
- "version": "4.3.0",
4
+ "version": "5.0.0",
5
5
  "author": "aziontech",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -44,6 +44,7 @@
44
44
  ".": "./dist/v4/globals.css",
45
45
  "./animations": "./src/tokens/primitives/animations/animate.js",
46
46
  "./colors": "./src/tokens/primitives/colors/colors.js",
47
+ "./layouts": "./src/tokens/semantic/layouts.data.js",
47
48
  "./texts": "./src/tokens/semantic/texts.data.js",
48
49
  "./theme-colors": "./src/scripts/compile-theme.js"
49
50
  }
@@ -14,6 +14,10 @@
14
14
  * typography, breakpoints, animations, …)
15
15
  * - `tokens/semantic/{containers,spacings,texts}.data.js`
16
16
  * responsive-shaped semantic tokens
17
+ * - `tokens/semantic/layouts.data.js`
18
+ * layout tokens (all derived from --spacing-* /
19
+ * --container-*) + the `@utility` blocks that
20
+ * build the container system on them
17
21
  * - `tokens/primitives/animations/{animate,keyframes}.js`
18
22
  * animation utilities (`--animate-*`) + `@keyframes`
19
23
  * definitions + extra CSS (transform-origin) for
@@ -32,6 +36,7 @@ import { breakpoints } from '../tokens/primitives/breakpoints.js';
32
36
  import { compilePrimitivesVars } from './compile-primitives.js';
33
37
  import { compileThemeCss, compileThemeVars } from './compile-theme.js';
34
38
  import { containersData } from '../tokens/semantic/containers.data.js';
39
+ import { layoutsData, layoutsUtilities } from '../tokens/semantic/layouts.data.js';
35
40
  import { spacingsData } from '../tokens/semantic/spacings.data.js';
36
41
  import { textsData } from '../tokens/semantic/texts.data.js';
37
42
  import { zIndicesData } from '../tokens/semantic/z-indices.data.js';
@@ -92,6 +97,7 @@ const buildFlatModel = () => ({
92
97
  containers: flattenSingleValue(containersData, (k) => `--container-${k}`),
93
98
  spacings: flattenSingleValue(spacingsData, (k) => `--${k}`),
94
99
  zIndices: flattenSingleValue(zIndicesData, (k) => `--${k}`),
100
+ layouts: flattenSingleValue(layoutsData, (k) => `--${k}`),
95
101
  texts: flattenBundle(textsData),
96
102
  });
97
103
 
@@ -234,6 +240,33 @@ const emitSemanticColorUtilities = () => {
234
240
  * interactive element loses the hand cursor unless a component overrides it.
235
241
  * Disabled controls keep the default cursor.
236
242
  */
243
+ /**
244
+ * Emit a map of `@utility` blocks. A string value is a plain declaration; an object
245
+ * value is a nested rule keyed by a literal selector (`&:first-child { … }`), the way
246
+ * the typography utilities nest their `&:hover`.
247
+ */
248
+ const emitUtilities = (utilities) =>
249
+ Object.entries(utilities)
250
+ .map(([name, decls]) => {
251
+ const body = Object.entries(decls)
252
+ .map(([prop, value]) =>
253
+ typeof value === 'object'
254
+ ? ` ${prop} { ${formatStateDecls(value)}; }`
255
+ : ` ${prop}: ${value};`,
256
+ )
257
+ .join('\n');
258
+ return `@utility ${name} {\n${body}\n}`;
259
+ })
260
+ .join('\n\n');
261
+
262
+ /**
263
+ * The container system as `@utility` blocks — same reason as the typography
264
+ * utilities: `@layer components` classes are opaque to the variant resolver, and a
265
+ * layout class is exactly the kind a consumer wants behind a variant
266
+ * (`md:layout-column`).
267
+ */
268
+ const emitLayoutUtilities = () => emitUtilities(layoutsUtilities);
269
+
237
270
  const emitBaseLayer = () =>
238
271
  [
239
272
  '@layer base {',
@@ -310,6 +343,7 @@ const emitCssV4 = () => {
310
343
  ...(m.containers._ || {}),
311
344
  ...(m.spacings._ || {}),
312
345
  ...(m.zIndices._ || {}),
346
+ ...(m.layouts._ || {}),
313
347
  ...(m.texts._ || {}),
314
348
  };
315
349
 
@@ -319,6 +353,7 @@ const emitCssV4 = () => {
319
353
  ...(m.containers[bp] || {}),
320
354
  ...(m.spacings[bp] || {}),
321
355
  ...(m.zIndices[bp] || {}),
356
+ ...(m.layouts[bp] || {}),
322
357
  ...(m.texts[bp] || {}),
323
358
  };
324
359
  if (Object.keys(merged).length === 0) continue;
@@ -337,7 +372,7 @@ const emitCssV4 = () => {
337
372
  '@import "tailwindcss";',
338
373
  '',
339
374
  '/*',
340
- ' * `@aziontech/webkit` components use arbitrary values (`bg-[var(--x)]`) that',
375
+ ' * `@aziontech/webkit` components use arbitrary values (`bg-(--x)`) that',
341
376
  ' * Tailwind v4 only picks up when the source files are inside the scan.',
342
377
  ' * Auto-detect scans the CWD only, so we point `@source` at the webkit',
343
378
  ' * package via a monorepo-relative path (this file is under',
@@ -366,6 +401,8 @@ const emitCssV4 = () => {
366
401
  '',
367
402
  emitTextUtilities(),
368
403
  '',
404
+ emitLayoutUtilities(),
405
+ '',
369
406
  emitSemanticColorUtilities(),
370
407
  '',
371
408
  emitBaseLayer(),
@@ -179,7 +179,31 @@ export const spacingsData = {
179
179
  }
180
180
  ```
181
181
 
182
- `_` is the base value emitted in `:root`; the breakpoint keys (`sm`, `md`, `lg`, `xl`, `2xl`) become media-query overrides.
182
+ `_` is the base value emitted in `:root`; the breakpoint keys (`sm`, `md`, `lg`, `xl`, `2xl`) become media-query overrides. A bare string is accepted as shorthand for `{ _: value }`.
183
+
184
+ ### Derived groups (`layouts.data.js`)
185
+
186
+ `semantic/layouts` is a **derived** group: every value is a `var()` reference to `--spacing-*` /
187
+ `--container-*`, never a literal length.
188
+
189
+ ```js
190
+ // tokens/semantic/layouts.data.js
191
+ export const layoutsData = {
192
+ 'layout-boundary-inline': 'var(--spacing-lg)',
193
+ 'layout-measure': 'var(--container-7xl)'
194
+ // …
195
+ }
196
+ ```
197
+
198
+ That indirection is the whole point, and it is why these carry no breakpoint map of their own: the
199
+ spacing scale is already responsive (`--spacing-lg` is `1rem`, then `1.5rem` from `sm`), and a `var()`
200
+ is substituted at **use** time on the element — so a layout token follows the breakpoint override for
201
+ free. Giving it its own map would duplicate the spacing scale into layout and let the two drift.
202
+
203
+ The group also ships `layoutsUtilities`, the container-system classes (`.layout-column`,
204
+ `.layout-boundary`, …) emitted as Tailwind v4 `@utility` blocks so they support variants
205
+ (`md:layout-column`). Utilities are shaped exactly like `illustrationsUtilities`: a string value is a
206
+ declaration, an object value is a nested rule keyed by a literal selector (`'&:first-child'`).
183
207
 
184
208
  ---
185
209
 
@@ -25,6 +25,8 @@ export const animate: {
25
25
  'fade-out': string;
26
26
  'slide-down': string;
27
27
  'highlight-fade': string;
28
+ 'page-enter': string;
29
+ 'content-enter': string;
28
30
  'popup-scale-in': string;
29
31
  'popup-scale-out': string;
30
32
  'slide-in-left': string;
@@ -36,6 +38,8 @@ export const animate: {
36
38
  'flow-dash': string;
37
39
  };
38
40
  export const useWhen: {
41
+ 'page-enter': string;
42
+ 'content-enter': string;
39
43
  spin: string;
40
44
  ping: string;
41
45
  pulse: string;
@@ -1 +1 @@
1
- {"version":3,"file":"animate.d.ts","sourceRoot":"","sources":["animate.js"],"names":[],"mappings":"AAAA;;;;;EAKC;AAED;;;;;;;;;EASC;AAED;;;;;;;;;;;;;;;;;;;;EAsBC;AAED;;;;;;;;;;;;;;;;;;;;EAwBC"}
1
+ {"version":3,"file":"animate.d.ts","sourceRoot":"","sources":["animate.js"],"names":[],"mappings":"AAAA;;;;;EAKC;AAED;;;;;;;;;EASC;AAED;;;;;;;;;;;;;;;;;;;;;;EAwBC;AAED;;;;;;;;;;;;;;;;;;;;;;EA4BC"}
@@ -26,7 +26,9 @@ export const animate = {
26
26
  'fade-in': 'fadeIn 220ms ease-in-out',
27
27
  'fade-out': 'fadeOut 220ms ease-in-out',
28
28
  'slide-down': 'slideDown 220ms ease-in-out',
29
- 'highlight-fade': 'highlight ease-in forwards',
29
+ 'highlight-fade': `highlight ${duration['slow-03']} ease-in forwards`,
30
+ 'page-enter': `pageEnter ${duration['moderate-02']} ${curve['productive-entrance']}`,
31
+ 'content-enter': `contentEnter ${duration['moderate-02']} ${curve['productive-entrance']} var(--content-enter-delay, 0s) backwards`,
30
32
  'popup-scale-in': `popupScaleIn ${duration['moderate-01']} ${curve['productive-entrance']}`,
31
33
  'popup-scale-out': `popupScaleOut ${duration['fast-02']} ${curve['productive-exit']}`,
32
34
  'slide-in-left': `slideInLeft ${duration['moderate-02']} ${curve['productive-entrance']}`,
@@ -41,6 +43,10 @@ export const animate = {
41
43
  }
42
44
 
43
45
  export const useWhen = {
46
+ 'page-enter':
47
+ 'A page arriving on a route change — on the CONTENT ZONE only, never the shell. The chrome is the same before and after, and sliding it announces a reload that did not happen. Key it on the route path so a component serving several paths still replays it. Nothing inside the page may animate on mount at the same time: the two run in lockstep and read as one element travelling on a diagonal.',
48
+ 'content-enter':
49
+ 'Content settling INSIDE a page that is already on screen — a loading window resolving, a filtered list swapping, a step changing. Never on first paint of a page whose own entrance is already running (use it after that entrance, or after a wire). Stagger a follower with --content-enter-delay.',
44
50
  spin: 'Indeterminate circular spinners (loading icons).',
45
51
  ping: 'One-off attention ring radiating from a small element (notification dot).',
46
52
  pulse: 'Skeleton/placeholder opacity pulse while content loads.',
@@ -16,13 +16,21 @@ export namespace keyframes {
16
16
  '50%': string;
17
17
  };
18
18
  let highlight: {
19
- '0%': string;
19
+ '0%, 40%': string;
20
20
  '100%': string;
21
21
  };
22
22
  let shimmer: {
23
23
  '0%': string;
24
24
  '100%': string;
25
25
  };
26
+ let pageEnter: {
27
+ '0%': string;
28
+ '100%': string;
29
+ };
30
+ let contentEnter: {
31
+ '0%': string;
32
+ '100%': string;
33
+ };
26
34
  let popupScaleIn: {
27
35
  '0%': string;
28
36
  '100%': string;
@@ -1 +1 @@
1
- {"version":3,"file":"keyframes.d.ts","sourceRoot":"","sources":["keyframes.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmFA;;;;GAIG;AACH;;;;;;;EAGC"}
1
+ {"version":3,"file":"keyframes.d.ts","sourceRoot":"","sources":["keyframes.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6FA;;;;GAIG;AACH;;;;;;;EAGC"}
@@ -28,14 +28,24 @@ export const keyframes = {
28
28
  '0%, 100%': 'opacity: 1',
29
29
  '50%': 'opacity: 0'
30
30
  },
31
+ // Holds the highlight for the first 40% of the run, then fades it back to
32
+ // normal over the remaining 60% — a row-flash, not a permanent tint.
31
33
  highlight: {
32
- '0%': 'background-color: var(--surface-hover); font-weight: 500',
33
- '100%': 'background-color: var(--surface-hover); font-weight: 500'
34
+ '0%, 40%': 'background-color: var(--surface-hover); font-weight: 500',
35
+ '100%': 'background-color: transparent; font-weight: 400'
34
36
  },
35
37
  shimmer: {
36
38
  '0%': 'background-position: 200% 0',
37
39
  '100%': 'background-position: -200% 0'
38
40
  },
41
+ pageEnter: {
42
+ '0%': 'opacity: 0; translate: calc(var(--page-enter-distance, var(--layout-boundary-inline)) * -1) 0',
43
+ '100%': 'opacity: 1; translate: 0 0'
44
+ },
45
+ contentEnter: {
46
+ '0%': 'opacity: 0; translate: 0 var(--spacing-xs)',
47
+ '100%': 'opacity: 1; translate: 0 0'
48
+ },
39
49
  popupScaleIn: {
40
50
  '0%': 'opacity: 0; transform: scale(0.9)',
41
51
  '100%': 'opacity: 1; transform: scale(1)'