@aziontech/theme 4.3.0 → 4.3.1

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,18 @@
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-docs: var(--container-4xl);
708
+ --container-site: var(--container-5xl);
709
+ --layout-measure-control: var(--container-3xs);
690
710
  --text-big-number-md-font-size: 1.25rem;
691
711
  --text-big-number-md-line-height: 1.25;
692
712
  --text-big-number-md-font-weight: 400;
@@ -734,6 +754,12 @@
734
754
  --text-label-code-sm-line-height: 1;
735
755
  --text-label-code-sm-font-weight: 400;
736
756
  --text-label-code-sm-letter-spacing: 0;
757
+ --text-body-code-sm-text-wrap-style: pretty;
758
+ --text-body-code-sm-font-family: Roboto Mono;
759
+ --text-body-code-sm-font-size: 0.75rem;
760
+ --text-body-code-sm-line-height: 1.625;
761
+ --text-body-code-sm-font-weight: 400;
762
+ --text-body-code-sm-letter-spacing: 0;
737
763
  --text-label-code-md-font-family: Roboto Mono;
738
764
  --text-label-code-md-font-size: 0.875rem;
739
765
  --text-label-code-md-line-height: 1;
@@ -745,21 +771,29 @@
745
771
  --text-label-code-lg-font-weight: 400;
746
772
  --text-label-code-lg-letter-spacing: 0;
747
773
  --text-body-lg-font-size: 1rem;
748
- --text-body-lg-line-height: 1.5;
774
+ --text-body-lg-font-weight: 400;
775
+ --text-body-lg-line-height: 1.375;
749
776
  --text-body-md-font-size: 1rem;
750
- --text-body-md-line-height: 1.5;
777
+ --text-body-md-font-weight: 400;
778
+ --text-body-md-line-height: 1.375;
779
+ --text-body-prose-md-font-size: 1rem;
780
+ --text-body-prose-md-font-weight: 400;
781
+ --text-body-prose-md-line-height: 1.625;
751
782
  --text-body-sm-font-size: 0.875rem;
752
- --text-body-sm-line-height: 1.5;
783
+ --text-body-sm-font-weight: 400;
784
+ --text-body-sm-line-height: 1.375;
753
785
  --text-body-xs-font-size: 0.75rem;
754
- --text-body-xs-line-height: 1.5;
786
+ --text-body-xs-font-weight: 400;
787
+ --text-body-xs-line-height: 1.375;
788
+ --text-body-xxs-font-size: 0.75rem;
789
+ --text-body-xxs-font-weight: 400;
790
+ --text-body-xxs-line-height: 1.5;
755
791
  --text-tag-sm-font-size: 0.75rem;
756
792
  --text-tag-sm-line-height: 1.25;
757
- --text-tag-sm-font-weight: 600;
793
+ --text-tag-sm-font-weight: 400;
758
794
  --text-tag-md-font-size: 0.75rem;
759
795
  --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;
796
+ --text-tag-md-font-weight: 400;
763
797
  --text-overline-md-font-family: Proto Mono;
764
798
  --text-overline-md-font-size: 0.75rem;
765
799
  --text-overline-md-line-height: 1.375;
@@ -833,12 +867,16 @@
833
867
  --surface-0: #FFFFFF;
834
868
  --surface-50: #FAFAFA;
835
869
  --surface-100: #F5F5F5;
870
+ --surface-150: #ECECEC;
836
871
  --surface-200: #E5E5E5;
872
+ --surface-250: #DADADA;
837
873
  --surface-300: #B2B2B2;
838
874
  --surface-400: #999999;
839
875
  --surface-500: #808080;
840
876
  --surface-600: #666666;
841
877
  --surface-700: #4D4D4D;
878
+ --surface-750: #2B2B2B;
879
+ --surface-775: #242424;
842
880
  --surface-800: #1A1A1A;
843
881
  --surface-900: #141414;
844
882
  --surface-950: #0A0A0A;
@@ -867,8 +905,8 @@
867
905
  --bg-selected: #E5E5E5;
868
906
  --bg-contrast: #141414;
869
907
  --bg-disabled: #E5E5E5;
870
- --border-default: #00000014;
871
- --border-muted: #00000014;
908
+ --border-default: #DADADA;
909
+ --border-muted: #ECECEC;
872
910
  --border-strong: #000000;
873
911
  --border-selected: #F3652B;
874
912
  --text-default: #141414;
@@ -904,12 +942,16 @@
904
942
  --surface-0: #FFFFFF;
905
943
  --surface-50: #FAFAFA;
906
944
  --surface-100: #F5F5F5;
945
+ --surface-150: #ECECEC;
907
946
  --surface-200: #E5E5E5;
947
+ --surface-250: #DADADA;
908
948
  --surface-300: #B2B2B2;
909
949
  --surface-400: #999999;
910
950
  --surface-500: #808080;
911
951
  --surface-600: #666666;
912
952
  --surface-700: #4D4D4D;
953
+ --surface-750: #2B2B2B;
954
+ --surface-775: #242424;
913
955
  --surface-800: #1A1A1A;
914
956
  --surface-900: #141414;
915
957
  --surface-950: #0A0A0A;
@@ -938,8 +980,8 @@
938
980
  --bg-selected: #1A1A1A;
939
981
  --bg-contrast: #FAFAFA;
940
982
  --bg-disabled: #1A1A1A;
941
- --border-default: #FFFFFF1A;
942
- --border-muted: #FFFFFF0D;
983
+ --border-default: #2B2B2B;
984
+ --border-muted: #242424;
943
985
  --border-strong: #FFFFFF;
944
986
  --border-selected: #F3652B;
945
987
  --text-default: #FAFAFA;
@@ -992,8 +1034,8 @@
992
1034
  }
993
1035
 
994
1036
  @keyframes highlight {
995
- 0% { background-color: var(--surface-hover); font-weight: 500; }
996
- 100% { background-color: var(--surface-hover); font-weight: 500; }
1037
+ 0%, 40% { background-color: var(--surface-hover); font-weight: 500; }
1038
+ 100% { background-color: transparent; font-weight: 400; }
997
1039
  }
998
1040
 
999
1041
  @keyframes shimmer {
@@ -1001,6 +1043,16 @@
1001
1043
  100% { background-position: -200% 0; }
1002
1044
  }
1003
1045
 
1046
+ @keyframes pageEnter {
1047
+ 0% { opacity: 0; translate: calc(var(--page-enter-distance, var(--layout-boundary-inline)) * -1) 0; }
1048
+ 100% { opacity: 1; translate: 0 0; }
1049
+ }
1050
+
1051
+ @keyframes contentEnter {
1052
+ 0% { opacity: 0; translate: 0 var(--spacing-xs); }
1053
+ 100% { opacity: 1; translate: 0 0; }
1054
+ }
1055
+
1004
1056
  @keyframes popupScaleIn {
1005
1057
  0% { opacity: 0; transform: scale(0.9); }
1006
1058
  100% { opacity: 1; transform: scale(1); }
@@ -1164,6 +1216,15 @@
1164
1216
  letter-spacing: var(--text-label-code-sm-letter-spacing);
1165
1217
  }
1166
1218
 
1219
+ @utility text-body-code-sm {
1220
+ text-wrap-style: var(--text-body-code-sm-text-wrap-style);
1221
+ font-family: var(--text-body-code-sm-font-family);
1222
+ font-size: var(--text-body-code-sm-font-size);
1223
+ line-height: var(--text-body-code-sm-line-height);
1224
+ font-weight: var(--text-body-code-sm-font-weight);
1225
+ letter-spacing: var(--text-body-code-sm-letter-spacing);
1226
+ }
1227
+
1167
1228
  @utility text-label-code-md {
1168
1229
  font-family: var(--text-label-code-md-font-family);
1169
1230
  font-size: var(--text-label-code-md-font-size);
@@ -1182,24 +1243,40 @@
1182
1243
 
1183
1244
  @utility text-body-lg {
1184
1245
  font-size: var(--text-body-lg-font-size);
1246
+ font-weight: var(--text-body-lg-font-weight);
1185
1247
  line-height: var(--text-body-lg-line-height);
1186
1248
  }
1187
1249
 
1188
1250
  @utility text-body-md {
1189
1251
  font-size: var(--text-body-md-font-size);
1252
+ font-weight: var(--text-body-md-font-weight);
1190
1253
  line-height: var(--text-body-md-line-height);
1191
1254
  }
1192
1255
 
1256
+ @utility text-body-prose-md {
1257
+ font-size: var(--text-body-prose-md-font-size);
1258
+ font-weight: var(--text-body-prose-md-font-weight);
1259
+ line-height: var(--text-body-prose-md-line-height);
1260
+ }
1261
+
1193
1262
  @utility text-body-sm {
1194
1263
  font-size: var(--text-body-sm-font-size);
1264
+ font-weight: var(--text-body-sm-font-weight);
1195
1265
  line-height: var(--text-body-sm-line-height);
1196
1266
  }
1197
1267
 
1198
1268
  @utility text-body-xs {
1199
1269
  font-size: var(--text-body-xs-font-size);
1270
+ font-weight: var(--text-body-xs-font-weight);
1200
1271
  line-height: var(--text-body-xs-line-height);
1201
1272
  }
1202
1273
 
1274
+ @utility text-body-xxs {
1275
+ font-size: var(--text-body-xxs-font-size);
1276
+ font-weight: var(--text-body-xxs-font-weight);
1277
+ line-height: var(--text-body-xxs-line-height);
1278
+ }
1279
+
1203
1280
  @utility text-tag-sm {
1204
1281
  font-size: var(--text-tag-sm-font-size);
1205
1282
  line-height: var(--text-tag-sm-line-height);
@@ -1212,11 +1289,6 @@
1212
1289
  font-weight: var(--text-tag-md-font-weight);
1213
1290
  }
1214
1291
 
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
1292
  @utility text-overline-md {
1221
1293
  font-family: var(--text-overline-md-font-family);
1222
1294
  font-size: var(--text-overline-md-font-size);
@@ -1271,6 +1343,71 @@
1271
1343
  .text-link { transition: none; }
1272
1344
  }
1273
1345
 
1346
+ @utility layout-boundary {
1347
+ padding-inline: var(--layout-boundary-inline);
1348
+ padding-block-start: var(--layout-boundary-start);
1349
+ padding-block-end: var(--layout-boundary-end);
1350
+ }
1351
+
1352
+ @utility layout-boundary-inline {
1353
+ padding-inline: var(--layout-boundary-inline);
1354
+ }
1355
+
1356
+ @utility layout-section-start {
1357
+ margin-block-start: var(--layout-boundary-start);
1358
+ &:first-child { margin-block-start: 0; }
1359
+ }
1360
+
1361
+ @utility layout-group-start {
1362
+ margin-block-start: var(--layout-group-gap);
1363
+ &:first-child { margin-block-start: 0; }
1364
+ }
1365
+
1366
+ @utility layout-column {
1367
+ --layout-column-measure: var(--layout-measure);
1368
+ margin-inline: auto;
1369
+ width: 100%;
1370
+ max-width: var(--layout-column-measure);
1371
+ &:is(.layout-boundary, .layout-boundary-inline) { max-width: calc(var(--layout-column-measure) + 2 * var(--layout-boundary-inline)); }
1372
+ }
1373
+
1374
+ @utility layout-column-focused {
1375
+ --layout-column-measure: var(--layout-measure-focused);
1376
+ margin-inline: auto;
1377
+ width: 100%;
1378
+ max-width: var(--layout-column-measure);
1379
+ &:is(.layout-boundary, .layout-boundary-inline) { max-width: calc(var(--layout-column-measure) + 2 * var(--layout-boundary-inline)); }
1380
+ }
1381
+
1382
+ @utility layout-column-form {
1383
+ --layout-column-measure: var(--layout-measure-form);
1384
+ margin-inline: auto;
1385
+ width: 100%;
1386
+ max-width: var(--layout-column-measure);
1387
+ &:is(.layout-boundary, .layout-boundary-inline) { max-width: calc(var(--layout-column-measure) + 2 * var(--layout-boundary-inline)); }
1388
+ }
1389
+
1390
+ @utility layout-form-create {
1391
+ --layout-column-measure: var(--layout-measure-form-create);
1392
+ --layout-measure-control: var(--container-md);
1393
+ margin-inline: auto;
1394
+ width: 100%;
1395
+ max-width: var(--layout-column-measure);
1396
+ &:is(.layout-boundary, .layout-boundary-inline) { max-width: calc(var(--layout-column-measure) + 2 * var(--layout-boundary-inline)); }
1397
+ }
1398
+
1399
+ @utility layout-column-docs {
1400
+ --layout-column-measure: var(--layout-measure-docs);
1401
+ margin-inline: auto;
1402
+ width: 100%;
1403
+ max-width: var(--layout-column-measure);
1404
+ &:is(.layout-boundary, .layout-boundary-inline) { max-width: calc(var(--layout-column-measure) + 2 * var(--layout-boundary-inline)); }
1405
+ }
1406
+
1407
+ @utility layout-field-control {
1408
+ &:not(#\#) { display: flex; flex: 1 1 0%; justify-content: flex-end; max-width: var(--layout-measure-control); }
1409
+ }
1410
+
1274
1411
  @utility bg-surface-0 { background-color: var(--surface-0); }
1275
1412
  @utility text-surface-0 { color: var(--surface-0); }
1276
1413
  @utility border-surface-0 { border-color: var(--surface-0); }
@@ -1280,9 +1417,15 @@
1280
1417
  @utility bg-surface-100 { background-color: var(--surface-100); }
1281
1418
  @utility text-surface-100 { color: var(--surface-100); }
1282
1419
  @utility border-surface-100 { border-color: var(--surface-100); }
1420
+ @utility bg-surface-150 { background-color: var(--surface-150); }
1421
+ @utility text-surface-150 { color: var(--surface-150); }
1422
+ @utility border-surface-150 { border-color: var(--surface-150); }
1283
1423
  @utility bg-surface-200 { background-color: var(--surface-200); }
1284
1424
  @utility text-surface-200 { color: var(--surface-200); }
1285
1425
  @utility border-surface-200 { border-color: var(--surface-200); }
1426
+ @utility bg-surface-250 { background-color: var(--surface-250); }
1427
+ @utility text-surface-250 { color: var(--surface-250); }
1428
+ @utility border-surface-250 { border-color: var(--surface-250); }
1286
1429
  @utility bg-surface-300 { background-color: var(--surface-300); }
1287
1430
  @utility text-surface-300 { color: var(--surface-300); }
1288
1431
  @utility border-surface-300 { border-color: var(--surface-300); }
@@ -1298,6 +1441,12 @@
1298
1441
  @utility bg-surface-700 { background-color: var(--surface-700); }
1299
1442
  @utility text-surface-700 { color: var(--surface-700); }
1300
1443
  @utility border-surface-700 { border-color: var(--surface-700); }
1444
+ @utility bg-surface-750 { background-color: var(--surface-750); }
1445
+ @utility text-surface-750 { color: var(--surface-750); }
1446
+ @utility border-surface-750 { border-color: var(--surface-750); }
1447
+ @utility bg-surface-775 { background-color: var(--surface-775); }
1448
+ @utility text-surface-775 { color: var(--surface-775); }
1449
+ @utility border-surface-775 { border-color: var(--surface-775); }
1301
1450
  @utility bg-surface-800 { background-color: var(--surface-800); }
1302
1451
  @utility text-surface-800 { color: var(--surface-800); }
1303
1452
  @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": "4.3.1",
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)'
@@ -20,12 +20,16 @@ export namespace primitives {
20
20
  export let gray: {
21
21
  50: string;
22
22
  100: string;
23
+ 150: string;
23
24
  200: string;
25
+ 250: string;
24
26
  300: string;
25
27
  400: string;
26
28
  500: string;
27
29
  600: string;
28
30
  700: string;
31
+ 750: string;
32
+ 775: string;
29
33
  800: string;
30
34
  900: string;
31
35
  950: string;
@@ -1 +1 @@
1
- {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["colors.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCACuC,YAAY;sBAAZ,YAAY;sBAD7B,YAAY"}
1
+ {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["colors.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCACuC,YAAY;sBAAZ,YAAY;sBAD7B,YAAY"}
@@ -21,15 +21,24 @@ export const primitives = {
21
21
  900: '#001833',
22
22
  950: '#000C1A'
23
23
  },
24
+ // 250 / 750 / 775 fill the two widest gaps in the ramp so an OPAQUE neutral rule has a step
25
+ // to live on. The scale jumped 200 → 300 (229 → 178) and 700 → 800 (77 → 26), and the steps
26
+ // bracketing those gaps are already spoken for by background roles — which is why an opaque
27
+ // border landed exactly on `--bg-selected` / `--bg-disabled` and disappeared. 700 / 800 / 900
28
+ // are the dark background anchors and keep their values untouched.
24
29
  gray: {
25
30
  50: '#FAFAFA',
26
31
  100: '#F5F5F5',
32
+ 150: '#ECECEC',
27
33
  200: '#E5E5E5',
34
+ 250: '#DADADA',
28
35
  300: '#B2B2B2',
29
36
  400: '#999999',
30
37
  500: '#808080',
31
38
  600: '#666666',
32
39
  700: '#4D4D4D',
40
+ 750: '#2B2B2B',
41
+ 775: '#242424',
33
42
  800: '#1A1A1A',
34
43
  900: '#141414',
35
44
  950: '#0A0A0A'