helsingborg-stad / styleguide
Package info
github.com/helsingborg-stad/styleguide
Language:TypeScript
pkg:composer/helsingborg-stad/styleguide
Requires
- php: ^8.2
- erusev/parsedown: ^1.7
- helsingborg-stad/component-library: 5.47.6
- ramsey/uuid: 4.9.4
Requires (Dev)
- carthage-software/mago: 1.26.0
- phpunit/phpunit: ^9.6
Suggests
None
Provides
None
Conflicts
None
Replaces
None
- dev-main-1.x
- 3.48.2
- 3.48.1
- 3.48.0
- 3.47.0
- 3.46.13
- 3.46.12
- 3.46.11
- 3.46.10
- 3.46.9
- 3.46.8
- 3.46.6
- 3.46.5
- 3.46.4
- 3.46.3
- 3.46.1
- 3.46.0
- 3.45.4
- 3.45.3
- 3.45.2
- 3.45.1
- 3.45.0
- 3.44.15
- 3.44.14
- 3.44.6
- 3.44.4
- 3.44.2
- 3.44.0
- 3.43.9
- 3.43.5
- 3.43.3
- 3.43.1
- 3.42.13
- 3.42.11
- 3.42.9
- 3.42.7
- 3.42.5
- 3.42.3
- 3.42.1
- 3.41.17
- 3.41.15
- 3.41.13
- 3.41.9
- 3.41.6
- 3.41.4
- 3.41.2
- 3.41.0
- 3.40.0
- 3.39.9
- 3.39.8
- 3.39.2
- 3.39.0
- 3.38.0
- 3.37.0
- 3.36.16
- 3.36.14
- 3.36.12
- 3.36.7
- 3.36.3
- 3.35.0
- 3.34.8
- 3.34.7
- 3.34.6
- 3.34.4
- 3.34.2
- 3.34.1
- 3.33.7
- 3.33.5
- 3.33.4
- 3.33.2
- 3.33.0
- 3.32.5
- 3.32.2
- 3.32.0
- 3.31.4
- 3.31.2
- 3.31.0
- 3.30.0
- 3.29.2
- 3.29.0
- 3.27.0
- 3.26.0
- 3.25.0
- 3.24.18
- 3.24.16
- 3.24.14
- 3.24.13
- 3.24.11
- 3.24.9
- 3.24.7
- 3.24.2
- 3.24.0
- 3.23.8
- 3.23.5
- 3.23.2
- 3.23.0
- 3.22.4
- 3.22.2
- 3.22.0
- 3.21.1
- 3.20.5
- 3.20.3
- 3.20.1
- 3.19.12
- 3.19.10
- 3.19.8
- 3.19.0
- 3.18.6
- 3.18.4
- 3.18.2
- 3.18.0
- 3.17.22
- 3.17.20
- 3.17.18
- 3.17.16
- 3.17.14
- 3.17.12
- 3.17.10
- 3.17.8
- 3.17.6
- 3.17.4
- 3.17.2
- 3.17.0
- 3.16.8
- 3.16.6
- 3.16.4
- 3.16.2
- 3.16.0
- 3.15.0
- 3.14.15
- 3.14.13
- 3.14.11
- 3.14.9
- 3.14.7
- 3.14.5
- 3.14.3
- 3.14.1
- 3.13.8
- 3.13.6
- 3.13.4
- 3.13.1
- 3.12.2
- 3.12.0
- 3.11.0
- 3.10.7
- 3.10.5
- 3.10.3
- 3.10.1
- 3.9.5
- 3.9.3
- 3.9.1
- 3.8.1
- 3.7.1
- 3.6.0
- 3.4.3
- 3.4.1
- 3.2.0
- 3.1.4
- 3.1.2
- 3.0.6
- 3.0.4
- 3.0.2
- 3.0.0
- 2.281.17
- 2.281.14
- 2.281.10
- 2.281.8
- 2.281.6
- 2.281.4
- 2.281.2
- 2.281.0
- 2.280.12
- 2.280.10
- 2.280.8
- 2.280.7
- 2.280.5
- 2.280.3
- 2.280.1
- 2.279.4
- 2.279.2
- 2.279.0
- 2.278.2
- 2.277.9
- 2.277.7
- 2.277.5
- 2.277.3
- 2.277.1
- 2.276.3
- 2.276.1
- 2.275.10
- 2.275.8
- 2.275.6
- 2.275.4
- 2.275.1
- 2.274.0
- 2.273.14
- 2.273.12
- 2.273.9
- 2.273.7
- 2.273.5
- 2.273.2
- 2.273.0
- 2.272.0
- 2.271.1
- 2.270.2
- 2.269.0
- 2.268.34
- 2.268.32
- 2.268.30
- 2.268.28
- 2.268.26
- 2.268.24
- 2.268.22
- 2.268.20
- 2.268.18
- 2.268.16
- 2.268.14
- 2.268.12
- 2.268.9
- 2.268.8
- 2.268.7
- 2.268.5
- 2.268.3
- 2.268.0
- 2.267.4
- 2.267.2
- 2.266.14
- 2.266.12
- 2.266.10
- 2.266.7
- 2.266.5
- 2.266.3
- 2.266.1
- 2.265.8
- 2.265.6
- 2.265.4
- 2.265.2
- 2.265.0
- 2.264.12
- 2.264.10
- 2.264.8
- 2.264.6
- 2.264.4
- 2.264.2
- 2.264.0
- 2.263.0
- 2.262.1
- 2.261.1
- 2.260.8
- 2.260.6
- 2.260.5
- 2.260.3
- 2.259.0
- 2.258.7
- 2.258.5
- 2.258.3
- 2.258.0
- 2.257.0
- 2.256.21
- 2.256.19
- 2.256.17
- 2.256.15
- 2.256.13
- 2.256.12
- 2.256.9
- 2.256.7
- 2.256.5
- 2.256.3
- 2.256.1
- 2.255.3
- 2.255.2
- 2.255.0
- 2.254.4
- 2.254.2
- 2.254.0
- 2.253.5
- 2.253.3
- 2.253.1
- 2.250.2
- 2.249.9
- 2.249.7
- 2.249.3
- 2.249.1
- 2.249.0
- 2.248.5
- 2.248.4
- 2.248.2
- 2.248.0
- 2.247.6
- 2.247.4
- 2.247.2
- 2.247.0
- 2.246.29
- 2.246.27
- 2.246.26
- 2.246.24
- 2.246.22
- 2.246.20
- 2.246.18
- 2.246.16
- 2.246.14
- 2.246.12
- 2.246.10
- 2.246.8
- 2.246.7
- 2.246.6
- 2.246.5
- 2.246.3
- 2.246.1
- 2.245.2
- 2.245.0
- 2.244.4
- 2.244.3
- 2.244.0
- 2.243.0
- 2.242.8
- 2.242.6
- 2.242.4
- 2.242.1
- 2.242.0
- 2.241.0
- 2.240.2
- 2.240.0
- 2.239.2
- 2.239.0
- 2.238.0
- 2.237.0
- 2.235.12
- 2.235.10
- 2.235.8
- 2.235.6
- 2.235.4
- 2.235.2
- 2.235.0
- 2.234.7
- 2.234.4
- 2.234.2
- 2.234.0
- 2.233.33
- 2.233.31
- 2.233.29
- 2.233.28
- 2.233.25
- 2.233.23
- 2.233.21
- 2.233.19
- 2.233.15
- 2.233.13
- 2.233.11
- 2.233.9
- 2.233.7
- 2.233.4
- 2.233.1
- 2.232.13
- 2.232.11
- 2.232.9
- 2.232.6
- 2.232.3
- 2.232.0
- 2.231.0
- 2.230.3
- 2.230.0
- 2.229.0
- 2.228.0
- 2.227.2
- 2.227.0
- 2.226.1
- 2.225.9
- 2.225.6
- 2.225.4
- 2.225.2
- 2.225.0
- 2.224.4
- 2.224.2
- 2.224.0
- 2.223.2
- 2.223.0
- 2.222.4
- 2.222.2
- 2.221.6
- 2.221.4
- 2.221.2
- 2.220.2
- 2.220.0
- 2.219.2
- 2.219.0
- 2.218.0
- 2.217.2
- 2.217.0
- 2.216.0
- 2.215.6
- 2.214.5
- 2.214.1
- 2.213.0
- 2.212.15
- 2.212.13
- 2.212.11
- 2.212.8
- 2.212.6
- 2.212.4
- 2.212.2
- 2.212.0
- 2.211.7
- 2.211.4
- 2.210.0
- 2.209.7
- 2.209.4
- 2.208.9
- 2.208.7
- 2.208.5
- 2.208.3
- 2.208.1
- 2.207.11
- 2.207.7
- 2.207.5
- 2.207.1
- 2.206.20
- 2.206.18
- 2.206.15
- 2.206.14
- 2.206.12
- 2.206.7
- 2.206.5
- 2.206.4
- 2.206.2
- 2.206.0
- 2.205.9
- 2.205.7
- 2.205.5
- 2.205.3
- 2.205.0
- 2.204.3
- 2.203.0
- 2.202.16
- 2.202.14
- 2.202.12
- 2.202.10
- 2.202.8
- 2.202.6
- 2.202.4
- 2.202.2
- 2.201.1
- 2.200.3
- 2.200.1
- 2.199.0
- 2.198.50
- 2.198.48
- 2.198.46
- 2.198.44
- 2.198.42
- 2.198.39
- 2.198.35
- 2.198.33
- 2.198.30
- 2.198.28
- 2.198.25
- 2.198.23
- 2.198.21
- 2.198.19
- 2.198.17
- 2.198.13
- 2.198.11
- 2.198.9
- 2.198.7
- 2.198.3
- 2.198.1
- 2.197.17
- 2.197.14
- 2.197.12
- 2.197.9
- 2.197.6
- 2.197.4
- 2.197.2
- 2.196.6
- 2.196.4
- 2.196.0
- 2.195.4
- 2.195.2
- 2.194.10
- 2.194.9
- 2.194.8
- 2.194.7
- 2.194.5
- 2.194.3
- 2.194.1
- 2.193.13
- 2.193.11
- 2.193.9
- 2.193.7
- 2.193.5
- 2.193.3
- 2.193.1
- 2.193.0
- 2.192.9
- 2.192.8
- 2.192.7
- 2.192.5
- 2.192.3
- 2.192.1
- 2.191.4
- 2.191.2
- 2.191.0
- 2.190.20
- 2.190.18
- 2.190.15
- 2.190.11
- 2.190.9
- 2.190.8
- 2.190.7
- 2.190.5
- 2.190.3
- 2.190.1
- 2.189.35
- 2.189.28
- 2.189.24
- 2.189.22
- 2.189.14
- 2.189.11
- 2.189.8
- 2.189.6
- 2.189.4
- 2.189.2
- 2.189.1
- 2.189.0
- 2.188.6
- 2.188.3
- 2.188.0
- 2.187.4
- 2.187.2
- 2.186.0
- 2.185.9
- 2.185.7
- 2.185.5
- 2.185.3
- 2.185.1
- 2.184.4
- 2.184.1
- 2.183.1
- 2.182.5
- 2.182.2
- 2.181.3
- 2.180.3
- 2.180.1
- 2.179.9
- 2.179.7
- 2.179.5
- 2.179.2
- 2.179.0
- 2.178.0
- 2.177.2
- 2.176.5
- 2.176.2
- 2.175.4
- 2.175.2
- 2.174.4
- 2.174.2
- 2.174.0
- 2.173.17
- 2.173.15
- 2.173.12
- 2.173.10
- 2.173.8
- 2.173.6
- 2.173.4
- 2.173.2
- 2.173.0
- 2.171.0
- 2.170.4
- 2.170.2
- 2.170.0
- 2.169.14
- 2.169.12
- 2.169.10
- 2.169.8
- 2.169.6
- 2.169.4
- 2.169.1
- 2.167.6
- 2.167.4
- 2.167.2
- 2.167.0
- 2.166.1
- 2.165.1
- 2.164.2
- 2.164.0
- 2.163.2
- 2.162.1
- 2.161.5
- 2.161.1
- 2.160.0
- 2.159.3
- 2.158.3
- 2.158.1
- 2.157.2
- 2.156.0
- 2.154.9
- 2.154.7
- 2.154.5
- 2.154.1
- 2.152.3
- v0.11.1408
- v0.11.1407
- v0.11.1406
- v0.11.1405
- v0.11.1404
- v0.11.1403
- v0.11.1402
- v0.11.1401
- v0.11.1400
- v0.11.1399
- v0.11.1398
- v0.11.1397
- v0.11.1396
- v0.11.1395
- v0.11.1394
- v0.11.1393
- v0.11.1392
- v0.11.1391
- v0.11.1390
- v0.11.1389
- v0.11.1388
- v0.11.1387
- v0.11.1386
- v0.11.1385
- v0.11.1384
- v0.11.1383
- v0.11.1382
- v0.11.1381
- v0.11.1380
- v0.11.1379
- v0.11.1378
- v0.11.1377
- v0.11.1376
- v0.11.1375
- v0.11.1374
- v0.11.1373
- v0.11.1372
- v0.11.1371
- v0.11.1370
- v0.11.1369
- v0.11.1368
- v0.11.1367
- v0.11.1366
- v0.11.1365
- v0.11.1364
- v0.11.1363
- v0.11.1362
- v0.11.1361
- v0.11.1360
- v0.11.1359
- v0.11.1358
- v0.11.1357
- v0.11.1356
- v0.11.1355
- v0.11.1354
- v0.11.1353
- v0.11.1352
- v0.11.1351
- v0.11.1350
- v0.11.1349
- v0.11.1348
- v0.11.1347
- v0.11.1346
- v0.11.1345
- v0.11.1344
- v0.11.1343
- v0.11.1342
- v0.11.1341
- v0.11.1340
- v0.11.1339
- v0.11.1338
- v0.11.1337
- v0.11.1336
- v0.11.1335
- v0.11.1334
- v0.11.1333
- v0.11.1332
- v0.11.1331
- v0.11.1330
- v0.11.1329
- v0.11.1328
- v0.11.1327
- v0.11.1326
- v0.11.1325
- v0.11.1324
- v0.11.1323
- v0.11.1322
- v0.11.1321
- v0.11.1320
- v0.11.1319
- v0.11.1318
- v0.11.1317
- v0.11.1316
- v0.11.1315
- v0.11.1314
- v0.11.1313
- v0.11.1312
- v0.11.1311
- v0.11.1310
- v0.11.1309
- v0.11.1308
- v0.11.1307
- v0.11.1306
- v0.11.1305
- v0.11.1304
- v0.11.1303
- v0.11.1302
- v0.11.1301
- v0.11.1300
- v0.11.1299
- v0.11.1298
- v0.11.1297
- v0.11.1296
- v0.11.1295
- v0.11.1294
- v0.11.1293
- v0.11.1292
- v0.11.1291
- v0.11.1290
- v0.11.1289
- v0.11.1288
- v0.11.1287
- v0.11.1286
- v0.11.1285
- v0.11.1284
- v0.11.1283
- v0.11.1282
- v0.11.1281
- v0.11.1280
- v0.11.1279
- v0.11.1278
- v0.11.1277
- v0.11.1276
- v0.11.1275
- v0.11.1274
- v0.11.1273
- v0.11.1272
- v0.11.1271
- v0.11.1270
- v0.11.1269
- v0.11.1268
- v0.11.1267
- v0.11.1266
- v0.11.1265
- v0.11.1264
- v0.11.1263
- v0.11.1262
- v0.11.1261
- v0.11.1260
- v0.11.1259
- v0.11.1258
- v0.11.1257
- v0.11.1256
- v0.11.1255
- v0.11.1254
- v0.11.1253
- v0.11.1252
- v0.11.1251
- v0.11.1250
- v0.11.1249
- v0.11.1248
- v0.11.1247
- v0.11.1246
- v0.11.1245
- v0.11.1244
- v0.11.1243
- v0.11.1242
- v0.11.1241
- v0.11.1240
- v0.11.1239
- v0.11.1238
- v0.11.1237
- v0.11.1236
- v0.11.1235
- v0.11.1234
- v0.11.1233
- v0.11.1232
- v0.11.1231
- v0.11.1230
- v0.11.1229
- v0.11.1228
- v0.11.1227
- v0.11.1226
- v0.11.1225
- v0.11.1224
- v0.11.1223
- v0.11.1222
- v0.11.1221
- v0.11.1220
- v0.11.1219
- v0.11.1218
- v0.11.1217
- v0.11.1216
- v0.11.1215
- v0.11.1214
- v0.11.1213
- v0.11.1212
- v0.11.1211
- v0.11.1210
- v0.11.1209
- v0.11.1208
- v0.11.1207
- v0.11.1206
- v0.11.1205
- v0.11.1204
- v0.11.1203
- v0.11.1202
- v0.11.1201
- v0.11.1200
- v0.11.1199
- v0.11.1198
- v0.11.1197
- v0.11.1196
- v0.11.1195
- v0.11.1194
- v0.11.1193
- v0.11.1192
- v0.11.1191
- v0.11.1190
- v0.11.1189
- v0.11.1188
- v0.11.1187
- v0.11.1186
- v0.11.1185
- v0.11.1184
- v0.11.1183
- v0.11.1182
- v0.11.1181
- v0.11.1180
- v0.11.1179
- v0.11.1178
- v0.11.1177
- v0.11.1176
- v0.11.1175
- v0.11.1174
- v0.11.1173
- v0.11.1172
- v0.11.1171
- v0.11.1170
- v0.11.1169
- v0.11.1168
- v0.11.1167
- v0.11.1166
- v0.11.1165
- v0.11.1164
- v0.11.1163
- v0.11.1162
- v0.11.1161
- v0.11.1160
- v0.11.1159
- v0.11.1158
- v0.11.1157
- v0.11.1156
- v0.11.1155
- v0.11.1154
- v0.11.1153
- v0.11.1152
- v0.11.1151
- v0.11.1150
- v0.11.1149
- v0.11.1148
- v0.11.1147
- v0.11.1146
- v0.11.1145
- v0.11.1144
- v0.11.1143
- v0.11.1142
- v0.11.1141
- v0.11.1140
- v0.11.1139
- v0.11.1138
- v0.11.1137
- v0.11.1136
- v0.11.1135
- v0.11.1134
- v0.11.1133
- v0.11.1132
- v0.11.1131
- v0.11.1130
- v0.11.1129
- v0.11.1128
- v0.11.1127
- v0.11.1126
- v0.11.1125
- v0.11.1124
- v0.11.1123
- v0.11.1122
- v0.11.1121
- v0.11.1120
- v0.11.1119
- v0.11.1118
- v0.11.1117
- v0.11.1116
- v0.11.1115
- v0.11.1114
- v0.11.1113
- v0.11.1112
- v0.11.1111
- v0.11.1110
- v0.11.1109
- v0.11.1108
- v0.11.1107
- v0.11.1106
- v0.11.1105
- v0.11.1104
- v0.11.1103
- v0.11.1102
- v0.11.1101
- v0.11.1100
- v0.11.1099
- v0.11.1098
- v0.11.1097
- v0.11.1096
- v0.11.1095
- v0.11.1094
- v0.11.1093
- v0.11.1092
- v0.11.1091
- v0.11.1090
- v0.11.1089
- v0.11.1088
- v0.11.1087
- v0.11.1086
- v0.11.1085
- v0.11.1084
- v0.11.1083
- v0.11.1082
- v0.11.1081
- v0.11.1080
- v0.11.1079
- v0.11.1078
- v0.11.1077
- v0.11.1076
- v0.11.1075
- v0.11.1074
- v0.11.1073
- v0.11.1072
- v0.11.1071
- v0.11.1070
- v0.11.1069
- v0.11.1068
- v0.11.1067
- v0.11.1066
- v0.11.1065
- v0.11.1064
- v0.11.1063
- v0.11.1062
- v0.11.1061
- v0.11.1060
- v0.11.1059
- v0.11.1058
- v0.11.1057
- v0.11.1056
- v0.11.1055
- v0.11.1054
- v0.11.1053
- v0.11.1052
- v0.11.1051
- v0.11.1050
- v0.11.1049
- v0.11.1048
- v0.11.1047
- v0.11.1046
- v0.11.1045
- v0.11.1044
- v0.11.1043
- v0.11.1042
- v0.11.1041
- v0.11.1040
- v0.11.1039
- v0.11.1038
- v0.11.1037
- v0.11.1036
- v0.11.1035
- v0.11.1034
- v0.11.1033
- v0.11.1032
- v0.11.1031
- v0.11.1030
- v0.11.1029
- v0.11.1028
- v0.11.1027
- v0.11.1026
- v0.11.1025
- v0.11.1024
- v0.11.1023
- v0.11.1022
- v0.11.1021
- v0.11.1020
- v0.11.1019
- v0.11.1018
- v0.11.1017
- v0.11.1016
- v0.11.1015
- v0.11.1014
- v0.11.1013
- v0.11.1012
- v0.11.1011
- v0.11.1010
- v0.11.1009
- v0.11.1008
- v0.11.1007
- v0.11.1006
- v0.11.1005
- v0.11.1004
- v0.11.1003
- v0.11.1002
- v0.11.1001
- v0.11.1000
- v0.11.999
- v0.11.998
- v0.11.997
- v0.11.996
- v0.11.995
- v0.11.994
- v0.11.993
- v0.11.992
- v0.11.991
- v0.11.990
- v0.11.989
- v0.11.988
- v0.11.987
- v0.11.986
- v0.11.985
- v0.11.984
- v0.11.983
- v0.11.982
- v0.11.981
- v0.11.980
- v0.11.979
- v0.11.978
- v0.11.977
- v0.11.976
- v0.11.975
- v0.11.974
- v0.11.973
- v0.11.972
- v0.11.971
- v0.11.970
- v0.11.969
- v0.11.968
- v0.11.967
- v0.11.966
- v0.11.965
- v0.11.964
- v0.11.963
- v0.11.962
- v0.11.961
- v0.11.960
- v0.11.959
- v0.11.958
- v0.11.957
- v0.11.956
- v0.11.955
- v0.11.954
- v0.11.953
- v0.11.952
- v0.11.951
- v0.11.950
- v0.11.949
- v0.11.948
- v0.11.947
- v0.11.946
- v0.11.945
- v0.11.944
- v0.11.943
- v0.11.942
- v0.11.941
- v0.11.940
- v0.11.939
- v0.11.938
- v0.11.937
- v0.11.936
- v0.11.935
- v0.11.934
- v0.11.933
- v0.11.932
- v0.11.931
- v0.11.930
- v0.11.929
- v0.11.928
- v0.11.927
- v0.11.926
- v0.11.925
- v0.11.924
- v0.11.923
- v0.11.922
- v0.11.921
- v0.11.920
- v0.11.919
- v0.11.918
- v0.11.917
- v0.11.916
- v0.11.915
- v0.11.914
- v0.11.913
- v0.11.912
- v0.11.911
- v0.11.910
- v0.11.909
- v0.11.908
- v0.11.907
- v0.11.906
- v0.11.905
- v0.11.904
- v0.11.903
- v0.11.902
- v0.11.901
- v0.11.900
- v0.11.899
- v0.11.898
- v0.11.897
- v0.11.896
- v0.11.895
- v0.11.894
- v0.11.893
- v0.11.892
- v0.11.891
- v0.11.890
- v0.11.889
- v0.11.888
- v0.11.887
- v0.11.886
- v0.11.885
- v0.11.884
- v0.11.883
- v0.11.882
- v0.11.881
- v0.11.880
- v0.11.879
- v0.11.878
- v0.11.877
- v0.11.876
- v0.11.875
- v0.11.874
- v0.11.873
- v0.11.872
- v0.11.871
- v0.11.870
- v0.11.869
- v0.11.868
- v0.11.867
- v0.11.866
- v0.11.865
- v0.11.864
- v0.11.863
- v0.11.862
- v0.11.861
- v0.11.860
- v0.11.859
- v0.11.858
- v0.11.857
- v0.11.856
- v0.11.855
- v0.11.854
- v0.11.853
- v0.11.852
- v0.11.851
- v0.11.850
- v0.11.849
- v0.11.848
- v0.11.847
- v0.11.846
- v0.11.845
- v0.11.844
- v0.11.843
- v0.11.842
- v0.11.841
- v0.11.840
- v0.11.839
- v0.11.838
- v0.11.837
- v0.11.836
- v0.11.835
- v0.11.834
- v0.11.833
- v0.11.832
- v0.11.831
- v0.11.830
- v0.11.829
- v0.11.828
- v0.11.827
- v0.11.826
- v0.11.825
- v0.11.824
- v0.11.823
- v0.11.822
- v0.11.821
- v0.11.820
- v0.11.819
- v0.11.818
- v0.11.817
- v0.11.816
- v0.11.815
- v0.11.814
- v0.11.813
- v0.11.812
- v0.11.811
- v0.11.810
- v0.11.809
- v0.11.808
- v0.11.807
- v0.11.806
- v0.11.805
- v0.11.804
- v0.11.803
- v0.11.802
- v0.11.801
- v0.11.800
- v0.11.799
- v0.11.798
- v0.11.797
- v0.11.796
- v0.11.795
- v0.11.794
- v0.11.793
- v0.11.792
- v0.11.791
- v0.11.790
- v0.11.789
- v0.11.788
- v0.11.787
- v0.11.786
- v0.11.785
- v0.11.784
- v0.11.783
- v0.11.782
- v0.11.781
- v0.11.780
- v0.11.779
- v0.11.778
- v0.11.777
- v0.11.776
- v0.11.775
- v0.11.774
- v0.11.773
- v0.11.772
- v0.11.771
- v0.11.770
- v0.11.769
- v0.11.768
- v0.11.767
- v0.11.766
- v0.11.765
- v0.11.764
- v0.11.763
- v0.11.762
- v0.11.761
- v0.11.760
- v0.11.759
- v0.11.758
- v0.11.757
- v0.11.756
- v0.11.755
- v0.11.754
- v0.11.753
- v0.11.752
- v0.11.751
- v0.11.750
- v0.11.749
- v0.11.748
- v0.11.747
- v0.11.746
- v0.11.745
- v0.11.744
- v0.11.743
- v0.11.742
- v0.11.741
- v0.11.740
- v0.11.739
- v0.11.738
- v0.11.737
- v0.11.736
- v0.11.735
- v0.11.734
- v0.11.733
- v0.11.732
- v0.11.731
- v0.11.730
- v0.11.729
- v0.11.728
- v0.11.727
- v0.11.726
- v0.11.725
- v0.11.724
- v0.11.723
- v0.11.722
- v0.11.721
- v0.11.720
- v0.11.719
- v0.11.718
- v0.11.717
- v0.11.716
- v0.11.715
- v0.11.714
- v0.11.713
- v0.11.712
- v0.11.711
- v0.11.710
- v0.11.709
- v0.11.708
- v0.11.707
- v0.11.706
- v0.11.705
- v0.11.704
- v0.11.703
- v0.11.702
- v0.11.701
- v0.11.700
- v0.11.699
- v0.11.698
- v0.11.697
- v0.11.696
- v0.11.695
- v0.11.694
- v0.11.693
- v0.11.692
- v0.11.691
- v0.11.690
- v0.11.689
- v0.11.688
- v0.11.687
- v0.11.686
- v0.11.685
- v0.11.684
- v0.11.683
- v0.11.682
- v0.11.681
- v0.11.680
- v0.11.679
- v0.11.678
- v0.11.677
- v0.11.676
- v0.11.675
- v0.11.674
- v0.11.673
- v0.11.672
- v0.11.671
- v0.11.670
- v0.11.669
- v0.11.668
- v0.11.667
- v0.11.666
- v0.11.665
- v0.11.664
- v0.11.663
- v0.11.662
- v0.11.661
- v0.11.660
- v0.11.659
- v0.11.658
- v0.11.657
- v0.11.656
- v0.11.655
- v0.11.654
- v0.11.653
- v0.11.652
- v0.11.651
- v0.11.650
- v0.11.649
- v0.11.648
- v0.11.647
- v0.11.646
- v0.11.645
- v0.11.644
- v0.11.643
- v0.11.642
- v0.11.641
- v0.11.640
- v0.11.639
- v0.11.638
- v0.11.637
- v0.11.636
- v0.11.635
- v0.11.634
- v0.11.633
- v0.11.632
- v0.11.631
- v0.11.630
- v0.11.629
- v0.11.628
- v0.11.627
- v0.11.626
- v0.11.625
- v0.11.624
- v0.11.623
- v0.11.622
- v0.11.621
- v0.11.620
- v0.11.619
- v0.11.618
- v0.11.617
- v0.11.616
- v0.11.615
- v0.11.614
- v0.11.613
- v0.11.612
- v0.11.611
- v0.11.610
- v0.11.609
- v0.11.608
- v0.11.607
- v0.11.606
- v0.11.605
- v0.11.604
- v0.11.603
- v0.11.602
- v0.11.601
- v0.11.600
- v0.11.599
- v0.11.598
- v0.11.597
- v0.11.596
- v0.11.595
- v0.11.594
- v0.11.593
- v0.11.592
- v0.11.591
- v0.11.590
- v0.11.589
- v0.11.588
- v0.11.587
- v0.11.586
- v0.11.585
- v0.11.584
- v0.11.583
- v0.11.582
- v0.11.581
- v0.11.580
- v0.11.579
- v0.11.578
- v0.11.577
- v0.11.576
- v0.11.575
- v0.11.574
- v0.11.573
- v0.11.572
- v0.11.571
- v0.11.570
- v0.11.569
- v0.11.568
- v0.11.567
- v0.11.566
- v0.11.565
- v0.11.564
- v0.11.563
- v0.11.562
- v0.11.561
- v0.11.560
- v0.11.559
- v0.11.558
- v0.11.557
- v0.11.556
- v0.11.555
- v0.11.554
- v0.11.553
- v0.11.552
- v0.11.551
- v0.11.550
- v0.11.549
- v0.11.548
- v0.11.547
- v0.11.546
- v0.11.545
- v0.11.544
- v0.11.543
- v0.11.542
- v0.11.541
- v0.11.540
- v0.11.539
- v0.11.538
- v0.11.537
- v0.11.536
- v0.11.535
- v0.11.534
- v0.11.533
- v0.11.532
- v0.11.531
- v0.11.530
- v0.11.529
- v0.11.528
- v0.11.527
- v0.11.526
- v0.11.525
- v0.11.524
- v0.11.523
- v0.11.522
- v0.11.521
- v0.11.520
- v0.11.519
- v0.11.518
- v0.11.517
- v0.11.516
- v0.11.515
- v0.11.514
- v0.11.513
- v0.11.512
- v0.11.511
- v0.11.510
- v0.11.509
- v0.11.508
- v0.11.507
- v0.11.506
- v0.11.505
- v0.11.504
- v0.11.503
- v0.11.502
- v0.11.501
- v0.11.500
- v0.11.499
- v0.11.498
- v0.11.497
- v0.11.496
- v0.11.495
- v0.11.494
- v0.11.493
- v0.11.492
- v0.11.491
- v0.11.490
- v0.11.489
- v0.11.488
- v0.11.487
- v0.11.486
- v0.11.485
- v0.11.484
- v0.11.483
- v0.11.482
- v0.11.481
- v0.11.480
- v0.11.479
- v0.11.478
- v0.11.477
- v0.11.476
- v0.11.475
- v0.11.474
- v0.11.473
- v0.11.472
- v0.11.471
- v0.11.470
- v0.11.469
- v0.11.468
- v0.11.467
- v0.11.466
- v0.11.465
- v0.11.464
- v0.11.463
- v0.11.462
- v0.11.461
- v0.11.460
- v0.11.459
- v0.11.458
- v0.11.457
- v0.11.456
- v0.11.455
- v0.11.454
- v0.11.453
- v0.11.452
- v0.11.451
- v0.11.450
- v0.11.449
- v0.11.448
- v0.11.447
- v0.11.446
- v0.11.445
- v0.11.444
- v0.11.443
- v0.11.442
- v0.11.441
- v0.11.440
- v0.11.439
- v0.11.438
- v0.11.437
- v0.11.436
- v0.11.435
- v0.11.434
- v0.11.433
- v0.11.432
- v0.11.431
- v0.11.430
- v0.11.429
- v0.11.428
- v0.11.427
- v0.11.426
- v0.11.425
- v0.11.424
- v0.11.423
- v0.11.422
- v0.11.421
- v0.11.420
- v0.11.419
- v0.11.418
- v0.11.417
- v0.11.416
- v0.11.415
- v0.11.414
- v0.11.413
- v0.11.412
- v0.11.411
- v0.11.410
- v0.11.409
- v0.11.408
- v0.11.407
- v0.11.406
- v0.11.405
- v0.11.404
- v0.11.403
- v0.11.402
- v0.11.401
- v0.11.400
- v0.11.399
- v0.11.398
- v0.11.397
- v0.11.396
- v0.11.395
- v0.11.394
- v0.11.393
- v0.11.392
- v0.11.391
- v0.11.390
- v0.11.389
- v0.11.388
- v0.11.387
- v0.11.386
- v0.11.385
- v0.11.384
- v0.11.383
- v0.11.382
- v0.11.381
- v0.11.380
- v0.11.379
- v0.11.378
- v0.11.377
- v0.11.376
- v0.11.375
- v0.11.374
- v0.11.373
- v0.11.372
- v0.11.371
- v0.11.370
- v0.11.369
- v0.11.368
- v0.11.367
- v0.11.366
- v0.11.365
- v0.11.364
- v0.11.363
- v0.11.362
- v0.11.361
- v0.11.360
- v0.11.359
- v0.11.358
- v0.11.357
- v0.11.356
- v0.11.355
- v0.11.354
- v0.11.353
- v0.11.352
- v0.11.351
- v0.11.350
- v0.11.349
- v0.11.348
- v0.11.347
- v0.11.346
- v0.11.345
- v0.11.344
- v0.11.343
- v0.11.342
- v0.11.341
- v0.11.340
- v0.11.339
- v0.11.338
- v0.11.337
- v0.11.336
- v0.11.335
- v0.11.334
- v0.11.333
- v0.11.332
- v0.11.331
- v0.11.330
- v0.11.329
- v0.11.328
- v0.11.327
- v0.11.326
- v0.11.325
- v0.11.324
- v0.11.323
- v0.11.322
- v0.11.321
- v0.11.320
- v0.11.319
- v0.11.318
- v0.11.317
- v0.11.316
- v0.11.315
- v0.11.314
- v0.11.313
- v0.11.312
- v0.11.311
- v0.11.310
- v0.11.309
- v0.11.308
- v0.11.307
- v0.11.306
- v0.11.305
- v0.11.304
- v0.11.303
- v0.11.302
- v0.11.301
- v0.11.300
- v0.11.299
- v0.11.298
- v0.11.297
- v0.11.296
- v0.11.295
- v0.11.294
- v0.11.293
- v0.11.292
- v0.11.291
- v0.11.290
- v0.11.289
- v0.11.288
- v0.11.287
- v0.11.286
- v0.11.285
- v0.11.284
- v0.11.283
- v0.11.282
- v0.11.281
- v0.11.280
- v0.11.279
- v0.11.278
- v0.11.277
- v0.11.276
- v0.11.275
- v0.11.274
- v0.11.273
- v0.11.272
- v0.11.271
- v0.11.270
- v0.11.269
- v0.11.268
- v0.11.267
- v0.11.266
- v0.11.265
- v0.11.264
- v0.11.263
- v0.11.262
- v0.11.261
- v0.11.260
- v0.11.259
- v0.11.258
- v0.11.257
- v0.11.256
- v0.11.255
- v0.11.254
- v0.11.253
- v0.11.252
- v0.11.251
- v0.11.250
- v0.11.249
- v0.11.248
- v0.11.247
- v0.11.246
- v0.11.245
- v0.11.244
- v0.11.243
- v0.11.242
- v0.11.241
- v0.11.240
- v0.11.239
- v0.11.238
- v0.11.237
- v0.11.236
- v0.11.235
- v0.11.234
- v0.11.233
- v0.11.232
- v0.11.231
- v0.11.230
- v0.11.229
- v0.11.228
- v0.11.227
- v0.11.226
- v0.11.225
- v0.11.224
- v0.11.223
- v0.11.222
- v0.11.221
- v0.11.220
- v0.11.219
- v0.11.218
- v0.11.217
- v0.11.216
- v0.11.215
- v0.11.214
- v0.11.213
- v0.11.212
- v0.11.211
- v0.11.210
- v0.11.209
- v0.11.208
- v0.11.207
- v0.11.206
- v0.11.205
- v0.11.204
- v0.11.203
- v0.11.202
- v0.11.201
- v0.11.200
- v0.11.199
- v0.11.198
- v0.11.197
- v0.11.196
- v0.11.195
- v0.11.194
- v0.11.193
- v0.11.192
- v0.11.191
- v0.11.190
- v0.11.189
- v0.11.188
- v0.11.187
- v0.11.186
- v0.11.185
- v0.11.184
- v0.11.183
- v0.11.182
- v0.11.181
- v0.11.180
- v0.11.179
- v0.11.178
- v0.11.177
- v0.11.176
- v0.11.175
- v0.11.174
- v0.11.173
- v0.11.172
- v0.11.171
- v0.11.170
- v0.11.169
- v0.11.168
- v0.11.167
- v0.11.166
- v0.11.165
- v0.11.164
- v0.11.163
- v0.11.162
- v0.11.161
- v0.11.160
- v0.11.159
- v0.11.158
- v0.11.157
- v0.11.156
- v0.11.155
- v0.11.154
- v0.11.153
- v0.11.152
- v0.11.151
- v0.11.150
- v0.11.149
- v0.11.148
- v0.11.147
- v0.11.146
- v0.11.145
- v0.11.144
- v0.11.143
- v0.11.142
- v0.11.141
- v0.11.140
- v0.11.139
- v0.11.138
- v0.11.137
- v0.11.136
- v0.11.135
- v0.11.134
- v0.11.133
- v0.11.132
- v0.11.131
- v0.11.130
- v0.11.129
- v0.11.128
- v0.11.127
- v0.11.126
- v0.11.125
- v0.11.124
- v0.11.123
- v0.11.122
- v0.11.121
- v0.11.120
- v0.11.119
- v0.11.118
- v0.11.117
- v0.11.116
- v0.11.115
- v0.11.114
- v0.11.113
- v0.11.112
- v0.11.111
- v0.11.110
- v0.11.109
- v0.11.108
- v0.11.107
- v0.11.106
- v0.11.105
- v0.11.104
- v0.11.103
- v0.11.102
- v0.11.101
- v0.11.100
- v0.11.99
- v0.11.98
- v0.11.97
- v0.11.96
- v0.11.95
- v0.11.94
- v0.11.93
- v0.11.92
- v0.11.91
- v0.11.90
- v0.11.89
- v0.11.88
- v0.11.87
- v0.11.86
- v0.11.85
- v0.11.84
- v0.11.83
- v0.11.82
- v0.11.81
- v0.11.80
- v0.11.79
- v0.11.78
- v0.11.77
- v0.11.76
- v0.11.75
- v0.11.74
- v0.11.73
- v0.11.72
- v0.11.71
- v0.11.70
- v0.11.69
- v0.11.68
- v0.11.67
- v0.11.66
- v0.11.65
- v0.11.64
- v0.11.63
- v0.11.62
- v0.11.61
- v0.11.60
- v0.11.59
- v0.11.58
- v0.11.57
- v0.11.56
- v0.11.55
- v0.11.54
- v0.11.53
- v0.11.52
- v0.11.51
- v0.11.50
- v0.11.49
- v0.11.48
- v0.11.47
- v0.11.46
- v0.11.45
- v0.11.44
- v0.11.43
- v0.11.42
- v0.11.41
- v0.11.40
- v0.11.39
- v0.11.38
- v0.11.37
- v0.11.36
- v0.11.35
- v0.11.34
- v0.11.33
- v0.11.32
- v0.11.31
- v0.11.30
- v0.11.29
- 0.11.28
- 0.11.27
- 0.11.26
- 0.11.25
- 0.11.24
- 0.11.21
- 0.11.20
- 0.11.19
- 0.11.18
- v0.11.17
- v0.11.16
- v0.11.15
- v0.11.14
- v0.11.13
- v0.11.12
- v0.11.11
- v0.11.10
- v0.11.9
- v0.11.8
- v0.11.7
- v0.11.6
- v0.11.5
- v0.11.4
- v0.11.3
- v0.11.2
- v0.11.1
- v0.11.0
- 0.10.16
- 0.10.15
- 0.10.14
- 0.10.13
- 0.10.12
- 0.10.11
- 0.10.10
- 0.10.9
- 0.10.8
- 0.10.7
- 0.10.6
- 0.10.5
- 0.10.4
- 0.10.3
- 0.10.2
- 0.10.1
- 0.10.0
- 0.9.1
- 0.9.0
- 0.8.7
- 0.8.6
- 0.8.5
- 0.3.11
- 0.3.10
- 0.3.9
- 0.2.6
- 0.0.8
- 0.0.7
- 0.0.6
- 0.0.5
- 0.0.4
- 0.0.3
- 0.0.2
- 0.0.1
- dev-fix/image-caption-container-query
- dev-feat/option-card-eyebrow-token-helpers
- dev-thorbrink-enable-automatic-dist-releases
- dev-fix/nav-current-link-color
- dev-fix/drawer-design-builder-area-colors
- dev-fix/drawer-secondary-current-item-color
- dev-release
- dev-codex/lqip-gaussian-blur
- dev-feat/ttl-chat-session
- dev-perf/replace-filter-shadows
- dev-feat/release-by-shell-test
- dev-codex/c-image-empty-dimensions
- dev-codex/follow-component-library-main
- dev-feat/refactor-whole-popover
- dev-master
- dev-thorbrink-fix-field-legends-main1x
- dev-thorbrink-fix-field-legends
- dev-feat/typescale-fluid
- dev-feat/inset-inherit-collection
- dev-feat/inherit-inset-card-accordion
- dev-copilot/fix-components-architecture-issues
- dev-copilot/fix-release-job-failure
- dev-copilot/add-common-parameters-docs
- dev-refactor/remove-unused-mixin-button
- dev-refactor/changing-tab-button-styling
- dev-refactor/design-builder
- dev-feature/style-editor
- dev-copilot/analyze-dead-code
- dev-feat/reduced-vars
- dev-copilot/convert-components-to-token-create
- dev-feat/css-vars-editor
This package is auto-updated.
Last update: 2026-11-12 14:15:55 UTC
README
Styleguide
Summary
The style guide is intended for websites within Helsingborgs stad / Municipio Websites and others who use our platform. The guide provides examples, markup and themes for our standardized components. The Helsingborg Styleguide is a flexible and minimalistic component-based framework built in the BEM standard & designed around the Atomic Design principle.
Release Notes
Requirements
- NodeJS >= 16
- PHP >= 8
- Composer
Installation
- Clone the repo:
git clone git@github.com:helsingborg-stad/styleguide.git
- Run the build script in the cloned project:
cd styleguide && php build.php
Development
- Start by running the steps under Installation.
- Run webpack in watch-mode:
npm run watch
Storybook (Blade-rendered components)
Storybook is configured as a frontend shell while components continue to be rendered by Blade.
Run:
npm run storybook
This starts:
- Storybook UI on
http://localhost:6006 - PHP server for Blade rendering on
http://127.0.0.1:8000
In Storybook, open Blade/Components and select a component route from controls.
Optional: point Storybook to another Blade server using:
STORYBOOK_BLADE_BASE_URL=http://your-host:port npm run storybook:ui
Deployment
Production Docker image
The Docker image workflow publishes
ghcr.io/helsingborg-stad/styleguide:<version> after the source-tagged release
workflow completes successfully. It also builds the same image for independently
pushed semver tags (including v prefixes and prereleases) when the tag matches
package.json's version. Build metadata + is mapped to _ in the Docker tag.
Other tags do not publish an image. The image supports linux/amd64 and
linux/arm64; use the published digest to pin a deployment to an immutable
build.
The image build, context rules, tag verification, and runtime entrypoint live in
docker/. GitHub requires the workflow entrypoint to remain in
.github/workflows/, so the Composer release workflow remains independent.
The image uses the
Helsingborg OpenLiteSpeed base
version 0.1.2 with PHP 8.3, pinned by digest, and serves HTTP on port 80.
The base image's entrypoint requires root to initialize OpenLiteSpeed, then
starts its web workers as nobody; don't override the container user without
replacing that startup contract. For Kubernetes, set the container image to
the release tag or digest, expose container port 80, and configure an HTTP
readiness probe on /. Terminate TLS and handle ingress at the cluster ingress
controller, not in this container. Application files, including Composer
dependencies, are owned by ubuntu (UID 1000). The image writes compiled Blade
templates to /var/www/vhosts/localhost/html/cache; keep that directory
writable by ubuntu. Only /var/www/vhosts/localhost/html/public is served as
the web root.
If the GHCR package is private, configure an imagePullSecret with read access
to it.
To build locally, use Docker BuildKit and a GitHub token with access to the
repository's Composer and private npm packages. Set GH_TOKEN in your shell
before running:
docker build -f docker/Dockerfile --secret id=github_token,env=GH_TOKEN -t styleguide:local .
docker run --rm -p 8080:80 styleguide:local
GitHub Actions uses GITHUB_TOKEN as a build secret rather than storing package
credentials in the image. Ensure this repository's Actions have read access to
@helsingborg-stad/openstreetmap and permission to publish to GHCR.
The GitHub workflow .github/workflows/build-and-deploy.yml supports deployments to different stages using GitHub Environments.
Configure deploy stages
- In GitHub, go to Settings → Environments for this repository.
- Create environments for the stages you want to deploy to (for example
stageandproduction). - Add environment Secrets for deploy values:
BACKUP_PATHDEPLOY_PATHDEPLOY_HOSTDEPLOY_USERDEPLOY_KEYDEPLOY_PORT
- Set environment-specific secret values (
stageandproduction) so each environment can use separate SSH host/user/port and deploy paths.
Run deployments
- Automatic deploys by branch:
- push to
stagedeploys tostage - push to
masterdeploys toproduction
- push to
- Stage or production (manual): run the workflow Build and deploy styleguide from the Actions tab and select
deploy_stage(stageorproduction).
Deploy stage controls which GitHub Environment secrets are used (stage branch -> stage, master branch -> production, or selected deploy_stage for manual runs), so stage and production can use separate SSH configs and deploy paths.
Design Tokens System
This project uses design tokens as the single source of truth for visual values (spacing, radius, typography, color, shadow). The token system is built to keep component styles consistent while still allowing controlled overrides in consuming implementations.
Goal
- Keep design decisions centralized and reusable.
- Avoid hardcoded one-off values in component styles.
- Make components themeable at runtime through CSS custom properties.
- Keep the API stable and explicit through JSON schemas and component token declarations.
Architecture (how it works)
- Global tokens source:
source/data/design-tokens.json- Defines categories and CSS variable defaults.
- Generated Sass output:
source/sass/setting/_design-tokens.scss- Auto-generated from the JSON file by:
npm run tokens
- Component token declaration:
source/components/<component>/component.json
- Each component lists which global tokens it is allowed to consume in its
tokensarray. - Vite still supports the legacy
source/data/c-*.jsonlookup as a fallback, but new component work should use the component-localcomponent.jsonfile.
- Build-time token injection:
vite.config.mjs
- Exposes a custom Sass function
getComponentTokens($name)that reads token arrays fromsource/components/<component>/component.json.
- Component-scoped token mapping:
source/sass/mixin/_tokens.scss@include tokens.create(...)maps global tokens (--color--surface) to component-scoped tokens (--c-card--color--surface).- Components then consume these values with
tokens.getRawValue(...),tokens.getCalculatedValue(...), ortokens.getDerivedAliasValue(...)for derived component aliases.
Token Helper Functions
tokens.getRawValue($prefix, $token)- Reads a raw component token such as color, font family, or border token.
tokens.getRawValue($prefix: $_, $token: "color--surface", $inheritVariable: "color-background")- Use this when a real token should resolve as explicit component override -> inherit hook -> token default.
tokens.getCalculatedValue($prefix, $token, $multiplier)- Reads a scale-based numeric token and applies the multiplier against
var(--base).
- Reads a scale-based numeric token and applies the multiplier against
tokens.getCalculatedValue($prefix: $_, $token: "space", $multiplier: 2, $inheritVariable: "space")- Use this when a scale-based token also needs inherit precedence.
tokens.getDefaultRawValue($prefix, $token)- Reads the
-defaulttoken variable emitted bytokens.create(..., $emitDefaultTokenVariables: true).
- Reads the
tokens.getDerivedAliasValue($prefix, $variable, $inheritVariable)- Use this for derived component aliases such as
--c-typography--h2-font-size, where precedence must be explicit alias override -> inherit hook -> alias default.
- Use this for derived component aliases such as
Short-hand Token Helpers (design-tokens)
source/sass/mixin/_design-tokens.scss wraps the token API above in short functions that compute values the same way the components do. Use them in components and in plugins or themes that depend on @helsingborg-stad/styleguide, instead of copying the arithmetic.
| Helper | Output (no prefix) |
|---|---|
token("line-height-heading") |
var(--line-height-heading) |
color("primary") |
var(--color--primary) |
space(2) |
calc((var(--space)) * var(--base) * 2) |
radius() / radius(0.5) |
calc((var(--border-radius)) * var(--base) * 1) |
border-width() |
calc((var(--border-width)) * var(--base) * 1) |
size(5) |
calc((var(--base)) * 5) (not affected by --space) |
font-size(90) |
var(--font-size-90) |
font-weight("bold") |
var(--font-weight-bold) |
@include focus-ring($offset: 2) |
Outline in --color--focus, border-width(3) wide, offset size($offset * 0.25) |
Every helper takes an optional $prefix. With a prefix, each value can be overridden locally through --{prefix}--{token} and falls back to the global token, like component tokens. Surface colors also honour the --inherit-* hooks, exactly as tokens.getRawValue() does.
Usage from a plugin that has @helsingborg-stad/styleguide as an npm dependency (Sass NodePackageImporter, e.g. css.preprocessorOptions.scss.importers: [new NodePackageImporter()] in Vite):
@use "pkg:@helsingborg-stad/styleguide/source/sass/mixin/design-tokens" as dt with ( $prefix: "mod-guide-wizard" ); .mod-guide-wizard__panel { padding: dt.space(3); // calc((var(--mod-guide-wizard--space, var(--space))) * var(--base) * 3) color: dt.color("primary"); // var(--mod-guide-wizard--color--primary, var(--color--primary)) border-radius: dt.radius(); &:focus-visible { @include dt.focus-ring; } }
Without the package importer, add node_modules to the Sass load paths and use @use "@helsingborg-stad/styleguide/source/sass/mixin/design-tokens" as dt. A module can only be configured with with (...) once per compilation; pass $prefix per call (dt.space(2, "my-prefix")) when a stylesheet needs several prefixes, as the components in this repository do.
Intended Usage
1) Define or update global tokens
Edit source/data/design-tokens.json and run:
npm run tokens
This regenerates source/sass/setting/_design-tokens.scss.
Example (global token):
{
"id": "radius",
"label": "Radius",
"settings": [
{
"variable": "--border-radius",
"label": "Border Radius",
"type": "range",
"default": 1,
"min": 0,
"max": 5,
"step": 0.25
}
]
}
2) Declare which tokens a component may consume
Example in source/components/button/component.json:
{
"tokens": [
"base",
"border-radius",
"border-width",
"space",
"color--primary",
"color--surface",
"shadow"
]
}
3) Create component-local token aliases in Sass
@use "../mixin/tokens"; $_: "c-example"; @include tokens.create($_, getComponentTokens($_)); .c-example { border-radius: tokens.getCalculatedValue($_, "border-radius"); background: tokens.getRawValue($_, "color--surface"); color: tokens.getRawValue($_, "color--surface-contrast"); filter: tokens.getCalculatedValue($_, "shadow", 2); padding: tokens.getCalculatedValue($_, "space", 2); }
Derived alias example:
@use "../mixin/tokens"; $_: "c-typography"; @include tokens.create($prefix: $_, $tokens: getComponentTokens($_), $emitDefaultTokenVariables: true); :root { --#{$_}--font-size-lead-default: #{tokens.getRawValue($_, "font-size-200")}; } .#{$_}__variant--lead { font-size: tokens.getDerivedAliasValue($_, "font-size-lead", "font-size"); }
4) Override tokens in implementation (theme or local instance)
Global theme override:
:root { --color--primary: #0052cc; --color--primary-contrast: #ffffff; --border-radius: 0.75; }
Component instance override:
.c-card--campaign { --c-card--color--surface: #111827; --c-card--color--surface-contrast: #f9fafb; --c-card--border-radius: 1.5; }
Runtime override with JavaScript:
const card = document.querySelector('.c-card'); card?.style.setProperty('--c-card--color--surface', '#1f2937');
Architectural Flexibility
- Scoped customization: The same component can have different appearances by overriding
--c-<component>--*per instance. - Global theming: Change
:roottoken values to update all components consistently. - Explicit token mapping only in
tokens.create(...):- Every consumed token must be listed in the component token manifest.
- Companion tokens such as
-borderand-altmust be declared in global tokens and referenced explicitly. - Shadow internals (
shadow-color,shadow-amount) must be listed directly.
Architectural Limitations (important)
- Do not edit generated token Sass directly:
source/sass/setting/_design-tokens.scssis generated and overwritten.
- Allowed token names are schema-driven:
- Component token arrays are validated against
source/design-tokens-schema.jsonenum values.
- Component token arrays are validated against
- Component must declare tokens it consumes:
- If a token is missing from
source/components/<component>/component.json, it will not be mapped bytokens.create(...).
- If a token is missing from
tokens.getCalculatedValue(...)assumes scale-based numeric usage:- It returns
calc(var(--c-...--token) * var(--base) * multiplier)(except special cases likebaseandshadow). - For raw values or non-scale tokens, use
tokens.getRawValue(...).
- It returns
- Use
tokens.getDerivedAliasValue(...)for derived component aliases:- This applies when the runtime variable is not itself a token, but a component alias such as
--c-typography--h2-font-size. - Keep the
-defaultalias variable token-only, and apply inherit precedence at the usage site.
- This applies when the runtime variable is not itself a token, but a component alias such as
- No implicit companion generation:
- Token behavior is declarative; add companion tokens explicitly in token JSON and component manifests.
Recommended Workflow
- Add/update token definitions in
source/data/design-tokens.json. - Run
npm run tokens. - Add token usage list in
source/components/your-component/component.json. - Consume via
@include tokens.create($_, getComponentTokens($_));in component Sass. - Use
tokens.getRawValue(...)andtokens.getCalculatedValue(...)in styles. - Validate by running watch/build and checking component previews.
Global Token Reference
The base token surface lives in source/data/design-tokens.json. These are the system-level tokens that components consume through tokens.create(...).
In the tables below, Can the user manipulate it? means the supported direct customization path in the token source and design-token UI. Tokens marked No are locked or derived tokens and should normally be changed indirectly by editing their upstream inputs. They can still be overridden in raw CSS if absolutely necessary, but that is not the intended primary workflow.
Base
| Token | Purpose | How it is derived | Can the user manipulate it? |
|---|---|---|---|
--base |
Foundation unit for spacing, size, and radius calculations across the system. | Defaults to calc(1rem/2). Locked because it is a system baseline rather than a regular theme knob. |
No, not as a primary UI/token-source control. Change indirectly through root sizing or raw CSS only if the whole system baseline must move. |
--base-font-size |
Root type size that drives the type scale. | Defaults to 16px with a 18px option. All computed font-size tokens derive from it. |
Yes. |
Layout
| Token | Purpose | How it is derived | Can the user manipulate it? |
|---|---|---|---|
--container-width-multiplier |
Controls the main content width scale. | Direct numeric token. Default 160. |
Yes. |
--container-width |
Final container width token used by layouts. | Derived as calc(var(--base) * var(--container-width-multiplier)). |
No. Change --container-width-multiplier or --base instead. |
--container-width-wide-multiplier |
Controls how much wider the wide container is than the default container. | Direct numeric token. Default 1.25. |
Yes. |
--container-width-wide |
Final wide-container width token. | Derived as calc(var(--container-width) * var(--container-width-wide-multiplier)). |
No. Change --container-width-wide-multiplier or upstream container tokens instead. |
Radius
| Token | Purpose | How it is derived | Can the user manipulate it? |
|---|---|---|---|
--border-radius |
Radius scale input used by components for rounded corners. | Direct numeric token. Default 1. Components usually multiply it by --base. |
Yes. |
--corner-shape |
Controls the corner rendering mode where corner-shape is used. |
Direct select token. Default round. |
Yes. |
Typography
| Token | Purpose | How it is derived | Can the user manipulate it? |
|---|---|---|---|
--font-family-base |
Default body font family. | Direct font token. Default "Roboto", sans-serif. |
Yes. |
--font-family-heading |
Heading font family. | Defaults to var(--font-family-base), so it inherits the body font unless explicitly changed. |
Yes. |
--font-family-code |
Monospace/code font family. | Direct token with a fixed default stack. Marked locked. | No, not through the intended token UI flow. |
--font-size-scale-ratio |
Ratio used to generate the full font-size scale. | Direct select token. Default 1.250. |
Yes. |
--font-weight-normal |
Default text weight. | Direct select token. Default 400. |
Yes. |
--font-weight-medium |
Medium emphasis font weight. | Direct select token. Default 500. |
Yes. |
--font-weight-bold |
Strong emphasis font weight. | Direct select token. Default 700. |
Yes. |
--font-weight-heading |
Default heading weight. | Direct select token. Default 700. |
Yes. |
--line-height-base |
Default body line height. | Direct numeric token. Default 1.625. |
Yes. |
--line-height-heading |
Default heading line height. | Direct numeric token. Default 1.33. |
Yes. |
--letter-spacing-base |
Default text letter spacing. | Direct numeric token. Default 0em. |
Yes. |
Font Sizes
| Token | Purpose | How it is derived | Can the user manipulate it? |
|---|---|---|---|
--font-size-80 |
Two steps below the base type size. | Derived as calc(var(--base-font-size) * pow(var(--font-size-scale-ratio), -2)). |
No. Change --base-font-size or --font-size-scale-ratio instead. |
--font-size-90 |
One step below the base type size. | Derived as calc(var(--base-font-size) * pow(var(--font-size-scale-ratio), -1)). |
No. Change --base-font-size or --font-size-scale-ratio instead. |
--font-size-100 |
Base type size token. | Derived as var(--base-font-size). |
No. Change --base-font-size instead. |
--font-size-200 |
One step above the base type size. | Derived as calc(var(--base-font-size) * pow(var(--font-size-scale-ratio), 1)). |
No. Change --base-font-size or --font-size-scale-ratio instead. |
--font-size-300 |
Two steps above the base type size. | Derived as calc(var(--base-font-size) * pow(var(--font-size-scale-ratio), 2)). |
No. Change --base-font-size or --font-size-scale-ratio instead. |
--font-size-400 |
Three steps above the base type size. | Derived as calc(var(--base-font-size) * pow(var(--font-size-scale-ratio), 3)). |
No. Change --base-font-size or --font-size-scale-ratio instead. |
--font-size-500 |
Four steps above the base type size. | Derived as calc(var(--base-font-size) * pow(var(--font-size-scale-ratio), 4)). |
No. Change --base-font-size or --font-size-scale-ratio instead. |
--font-size-600 |
Five steps above the base type size. | Derived as calc(var(--base-font-size) * pow(var(--font-size-scale-ratio), 5)). |
No. Change --base-font-size or --font-size-scale-ratio instead. |
--font-size-700 |
Six steps above the base type size. | Derived as calc(var(--base-font-size) * pow(var(--font-size-scale-ratio), 6)). |
No. Change --base-font-size or --font-size-scale-ratio instead. |
--font-size-800 |
Seven steps above the base type size. | Derived as calc(var(--base-font-size) * pow(var(--font-size-scale-ratio), 7)). |
No. Change --base-font-size or --font-size-scale-ratio instead. |
Borders
| Token | Purpose | How it is derived | Can the user manipulate it? |
|---|---|---|---|
--border-width |
Base border width token for UI elements. | Direct numeric token. Default 0.125. |
Yes. |
--color--border-mix-amount |
Mix ratio used when generating derived *-border companion colors. |
Direct percentage token. Default 10%. |
Yes. |
Spacing
| Token | Purpose | How it is derived | Can the user manipulate it? |
|---|---|---|---|
--space |
Standard internal spacing token for paddings and margins inside components. | Direct numeric token. Default 1. |
Yes. |
--outer-space |
Spacing token for gaps between components or outer layout rhythm. | Direct numeric token. Default 1. |
Yes. |
Shadows
| Token | Purpose | How it is derived | Can the user manipulate it? |
|---|---|---|---|
--shadow-color |
Base color used by shadow formulas. | Direct RGBA token. Default rgba(0, 0, 0, 0.1). |
Yes. |
--shadow-amount |
Global multiplier for shadow intensity. | Direct numeric token. Default 0.7. Components typically combine it with --base in shadow calculations. |
Yes. |
Brand Colors
| Token | Purpose | How it is derived | Can the user manipulate it? |
|---|---|---|---|
--color--primary |
Main brand/action color. | Direct color token. Default #2d2d2d. |
Yes. |
--color--primary-contrast |
Text/icon color on top of primary backgrounds. | Direct color token. Default #ffffff. |
Yes. |
--color--primary-border |
Border/emphasis companion for primary surfaces. | Derived as color-mix(in srgb, var(--color--primary-contrast) var(--color--border-mix-amount), var(--color--primary)). |
No. Change --color--primary, --color--primary-contrast, or --color--border-mix-amount instead. |
--color--primary-alt |
Softer alternate primary surface. | Derived as color-mix(in srgb, var(--color--primary-contrast) var(--color--alt-mix-amount), var(--color--primary)). |
No. Change --color--primary, --color--primary-contrast, or --color--alt-mix-amount instead. |
--color--secondary |
Secondary brand color. | Direct color token. Default #6e6e6e. |
Yes. |
--color--secondary-contrast |
Text/icon color on top of secondary backgrounds. | Direct color token. Default #ffffff. |
Yes. |
--color--secondary-border |
Border/emphasis companion for secondary surfaces. | Derived as color-mix(in srgb, var(--color--secondary-contrast) var(--color--border-mix-amount), var(--color--secondary)). |
No. Change --color--secondary, --color--secondary-contrast, or --color--border-mix-amount instead. |
--color--secondary-alt |
Softer alternate secondary surface. | Derived as color-mix(in srgb, var(--color--secondary-contrast) var(--color--alt-mix-amount), var(--color--secondary)). |
No. Change --color--secondary, --color--secondary-contrast, or --color--alt-mix-amount instead. |
Layout Colors
| Token | Purpose | How it is derived | Can the user manipulate it? |
|---|---|---|---|
--color--alt-mix-amount |
Mix ratio used when generating *-alt surface colors. |
Direct percentage token. Default 4%. |
Yes. |
--color--background |
Main page/application background color. | Direct color token. Default #f5f5f5. |
Yes. |
--color--background-contrast |
Foreground color for content on background surfaces. | Direct color token. Default #2d2d2d. |
Yes. |
--color--background-contrast-muted |
Muted foreground for background surfaces. | Derived as color-mix(in srgb, var(--color--background-contrast) 67.5%, var(--color--background)). |
No. Change --color--background or --color--background-contrast instead. |
--color--background-border |
Border/emphasis companion for background surfaces. | Derived as color-mix(in srgb, var(--color--background-contrast) var(--color--border-mix-amount), var(--color--background)). |
No. Change --color--background, --color--background-contrast, or --color--border-mix-amount instead. |
--color--surface |
Default elevated/content surface color. | Direct color token. Default #ffffff. |
Yes. |
--color--surface-contrast |
Foreground color for content on surface backgrounds. | Direct color token. Default #2d2d2d. |
Yes. |
--color--surface-contrast-muted |
Muted foreground for surface backgrounds. | Derived as color-mix(in srgb, var(--color--surface-contrast) 67.5%, var(--color--surface)). |
No. Change --color--surface or --color--surface-contrast instead. |
--color--surface-border |
Border/emphasis companion for surface elements. | Derived as color-mix(in srgb, var(--color--surface-contrast) var(--color--border-mix-amount), var(--color--surface)). |
No. Change --color--surface, --color--surface-contrast, or --color--border-mix-amount instead. |
--color--surface-alt |
Softer alternate surface color. | Derived as color-mix(in srgb, var(--color--surface-contrast-muted) var(--color--alt-mix-amount), var(--color--surface)). |
No. Change --color--surface, --color--surface-contrast, or --color--alt-mix-amount instead. |
UI Colors
| Token | Purpose | How it is derived | Can the user manipulate it? |
|---|---|---|---|
--color--focus |
Focus ring and focus state color. | Direct color token. Default #4d90fe. |
Yes. |
--color--alpha |
Overlay color including opacity. | Direct RGBA token. Default rgba(0, 0, 0, 0.1). |
Yes. |
--color--alpha-contrast |
Foreground color on top of alpha overlays. | Direct color token. Default #ffffff. |
Yes. |
--color--alpha-border |
Border/emphasis companion for alpha overlays. | Derived as color-mix(in srgb, var(--color--alpha-contrast) var(--color--border-mix-amount), var(--color--alpha)). |
No. Change --color--alpha, --color--alpha-contrast, or --color--border-mix-amount instead. |
State Colors
| Token | Purpose | How it is derived | Can the user manipulate it? |
|---|---|---|---|
--color--success |
Success state background/accent color. | Direct color token. Default #4caf50. |
Yes. |
--color--success-contrast |
Foreground color for success surfaces. | Direct color token. Default #ffffff. |
Yes. |
--color--success-border |
Border/emphasis companion for success surfaces. | Derived as color-mix(in srgb, var(--color--success-contrast) var(--color--border-mix-amount), var(--color--success)). |
No. Change --color--success, --color--success-contrast, or --color--border-mix-amount instead. |
--color--warning |
Warning state background/accent color. | Direct color token. Default #ffb300. |
Yes. |
--color--warning-contrast |
Foreground color for warning surfaces. | Direct color token. Default #2d2d2d. |
Yes. |
--color--warning-border |
Border/emphasis companion for warning surfaces. | Derived as color-mix(in srgb, var(--color--warning-contrast) var(--color--border-mix-amount), var(--color--warning)). |
No. Change --color--warning, --color--warning-contrast, or --color--border-mix-amount instead. |
--color--danger |
Danger/error state background/accent color. | Direct color token. Default #e53935. |
Yes. |
--color--danger-contrast |
Foreground color for danger surfaces. | Direct color token. Default #ffffff. |
Yes. |
--color--danger-border |
Border/emphasis companion for danger surfaces. | Derived as color-mix(in srgb, var(--color--danger-contrast) var(--color--border-mix-amount), var(--color--danger)). |
No. Change --color--danger, --color--danger-contrast, or --color--border-mix-amount instead. |
--color--info |
Informational state background/accent color. | Direct color token. Default #039be5. |
Yes. |
--color--info-contrast |
Foreground color for info surfaces. | Direct color token. Default #ffffff. |
Yes. |
--color--info-border |
Border/emphasis companion for info surfaces. | Derived as color-mix(in srgb, var(--color--info-contrast) var(--color--border-mix-amount), var(--color--info)). |
No. Change --color--info, --color--info-contrast, or --color--border-mix-amount instead. |
Related Files
source/data/design-tokens.json(global token source)build-design-tokens.mjs(JSON -> generated Sass compiler)source/sass/setting/_design-tokens.scss(generated root CSS vars)source/sass/mixin/_tokens.scss(token API for components)source/sass/mixin/_design-tokens.scss(short-hand token helpers for components, plugins and themes)source/components/*/component.json(component token whitelists)source/design-tokens-schema.json,source/component-schema.json, andsource/utility-schema.json(validation/contracts)
Testing
Playwright component customizer panel testing rules and coverage requirements are documented in playwright.md.
Contribution Rule-Set (Do and Don't)
The rules below are aligned with the validator tests in source/validators/Tests and should be followed for all component and style changes.
Do
- Do use design tokens as the source of truth in component styles.
- Do declare component token usage in
source/components/<component>/component.json. - Do namespace component CSS custom properties so they remain component-scoped.
- Do declare each
--inherit-*variable with@propertyandinherits: falsewhen used. - Do keep JavaScript tests adjacent to the file under test (
*.test.ts/*.test.js). - Do run validator and unit tests before opening a PR.
Don't
- Don't use Sass variables in component SCSS, except the allowed component name variable
$_in token helper calls. - Don't mix token/Sass variable patterns in utility files that should rely on CSS custom properties.
- Don't use un-namespaced CSS custom properties in component SCSS.
- Don't reference CSS variables that are not declared in design tokens / generated variable sources.
- Don't edit generated token output directly (for example
source/sass/setting/_design-tokens.scss), as it will be overwritten.
When A Component Affects Another Component
When a component needs to affect the appearance or functionality of an inner component, only two methods are allowed.
1. Inherit Variables
Some components declare --inherit-* variables specifically to pass settings down to another component. These variables always take precedence over the receiving component's default values and should be the first choice when the receiving component explicitly supports them.
Example flow:
- Override:
source/components/segment/text.scss - Declaration:
source/components/typography/style.scss - Implementation:
source/components/typography/style.scss
2. Direct Component Targeting
Direct targeting may be used for smaller modifications, especially when the affected property is not exposed through an inherit variable. This is only allowed for outer-context adaptation on the outermost element of the inner component.
Example:
Test-Backed Rules (Source of Truth)
source/validators/Tests/NoSassVariablesTest.phpsource/validators/Tests/TokenMixingTest.phpsource/validators/Tests/CssVariablesNamespacedTest.phpsource/validators/Tests/CssVariablesReferencesDesignTokensTest.phpsource/validators/Tests/InheritVariablesDeclaredTest.php
Quick Verification Before PR
# PHP validator tests (SCSS/token contracts) ./vendor/bin/phpunit source/validators/Tests # JavaScript unit tests npm test
Jest is used as testing framework for JavaScript in the StyleGuide.
Test files should be added adjacent to the file that is the subject fo testing. Naming convention for test files is to use the same name as the file that is subject for testing and be appended with ".test.js" or "test.ts". The ".ts" file ending enables some IDE's, like VS Code, to add intellisense for Jest.
Example file accompanied by test file
source/js
├── gallery.js
├── gallery.test.ts
Test scripts
- Run tests:
npm test - Runs tests in file watch mode:
npm run test:dev
VS Code Devcontainer & Codespaces
Configuration for Codespaces is available and to get it up and running do the following after opening a Codespace:
- Run task
Setup. - Run task
Serve.
License
Distributed under the MIT License.
Acknowledgements
Composer release distribution (main-1.x)
Stable Styleguide tags are unprefixed (3.44.6, not v3.44.6). New tags
point to the versioned source commit on main-1.x. Their GitHub Releases
include styleguide-<version>.zip, whose root contains assets/ (including
the Vite manifest, CSS/JS, utility class map and Material Symbols sprite),
source/, both design-token JSON files, composer.json, composer.lock,
LICENSE and README.md. Composer dependencies are installed during the
build, but neither vendor/ nor node_modules/ belongs in the ZIP.
The deployment workflow still uses php ./build.php --cleanup independently;
that mode removes Composer manifests and is not used to make this ZIP.
For stable versions, use composer require helsingborg-stad/styleguide:<version> --prefer-dist with Composer 2.1.0 or newer. The version placeholder in
composer.json is expanded by the installing client, not Packagist; Composer
2.0.0 does not support it. Existing locks retain their previous GitHub archive
URL until updated; existing tags and release assets are not modified.
--prefer-source checks out the source tag and installs its declared PHP
dependencies, but does not contain generated assets. From that checkout, run
composer install, npm ci (with access to the org's npm registry), then
npm run build. Development branches (dev-main-1.x, legacy dev-release)
have no matching release ZIP; install them explicitly with --prefer-source
and build locally. Do not use --prefer-dist for development versions:
Composer may try a nonexistent URL and silently fall back to source. Keep
the frozen release branch for existing consumers until private use of
dev-release is inventoried; public indexed searches alone cannot prove
there are none.
To reproduce a release locally on a clean, versioned source checkout, set up PHP 8.3, Composer 2.1+ and Node 24, configure npm access to GitHub Packages, then run:
composer install --no-interaction --prefer-dist npm ci composer test npm run typecheck npm test -- --watch=false npm run build python3 -m unittest discover -s scripts -p 'test_release_package.py' python3 scripts/release_package.py create /tmp/styleguide-<version>.zip python3 scripts/release_package.py check /tmp/styleguide-<version>.zip bash scripts/test_composer_dist.sh /tmp/styleguide-<version>.zip <version>
The Python script uses only the standard library and archives the tracked
runtime allowlist plus all generated assets/dist/ files. It checks actual ZIP
contents, manifest targets, token data, forbidden paths and unresolved
vendor/ CSS URLs. The Composer smoke test installs the ZIP through a local test-only package
repository into an isolated consumer, checks package-root placement
and resolves PHP dependencies. No GitHub tooling is needed to build or test.
Publication gate and pilot: Automatic publishing requires repository
variable DIST_RELEASE_VERIFIED=true; until then, an authorized maintainer
can run workflow_dispatch on main-1.x with pilot=true for a new version.
Before enabling automatic publication, verify the pilot's live
https://repo.packagist.org/p2/helsingborg-stad/styleguide.json entry exposes
the expected dist URL, and perform clean Packagist installs using both
Composer 2.1.0 and the current 2.x client. Inspect installed
vendor/helsingborg-stad/styleguide/assets/dist/manifest.json to distinguish
dist from source fallback; also test --prefer-source and a dev-main-1.x
source install. Confirm Municipio and other consumers' developer/CI Composer
versions (Municipio currently specifies composer:v2, not an exact minimum)
before relying on the 2.1+ contract. A local artifact test is not a substitute
for this Packagist pilot.
After Packagist indexes the pilot, run
bash scripts/check_packagist_release.sh <version> <composer-binary> twice:
once with a Composer 2.1.0 executable and once with a current Composer 2.x
executable. The script asserts the Packagist metadata, real dist install
without source fallback, and source checkout. Separately install
dev-main-1.x using --prefer-source in a clean consumer and check its Git
checkout; repeat with dev-release only if supporting a legacy consumer.
Composer 2.0 is unsupported for the placeholder URL. The publicly indexed
release history skips patches (for example 3.44.0 → 3.44.4); the failed
November 5 release job calculated 3.44.2 before a 502, while the subsequent
published release was 3.44.4. This is consistent with version bumps being
committed before publication and a later attempt allocating another patch,
not evidence that the GitVersion conventional-commit regex needs changing.
Keep that policy unchanged; retry a failed publication promptly on its
original versioned commit, before later version bumps.
Release runs are serialized, and the pinned version action writes version
files to main-1.x. The workflow captures that exact SHA, runs the shared test
workflow against it, and builds the ZIP only after every suite passes. The test
workflow runs Node checks, PHPUnit, Playwright and built-output validation in
parallel, with suite-specific reports and artifacts. Pushes and pull requests
also run the same tests independently; release tests are a separate invocation.
Release tests upload reports as artifacts rather than creating report checks on
the triggering commit, which can differ from the versioned commit under test.
The workflow rejects a version bump based on a newer branch tip than the
triggering commit, so the reused workflow definitions match the tested source.
It also refuses to publish if the branch advanced. The publication script
checks existing tags and compares existing
asset bytes; rerun the same commit/version after a failed upload rather than
moving a tag or replacing a release asset. GitHub may expose a new tag before
its draft release asset is available, so Packagist can briefly index a URL
that returns 404. Treat this as a publication window: do not update consumer
locks until the published asset downloads successfully; rerun a failed
publication promptly and investigate any published release missing an asset.
Commits pushed by GITHUB_TOKEN do not start a new test workflow, which is why
the release workflow explicitly invokes the reusable test workflow for the
versioned SHA before publishing. The same
pattern can be reused elsewhere by replacing the repository-specific version
action, allowlist, build command and publication adapter while retaining local
archive validation and immutable tag/asset checks.
GitVersion ignores base-version candidates whose source commits predate 2026-11-05 UTC to avoid repeatedly evaluating the older release history. The cutoff retains the source-tagged 3.44.14 release and later releases; it does not delete tags or exclude commits from the increment calculation. Version calculations on older history, or after removing the retained release tags, may therefore differ. Revalidate the cutoff before changing it or rewriting release history.