govuk_publishing_components 59.0.1 → 59.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f549979959a86cf945676068de299c2d00a19ce4c3e8ccdd8d8d85879057d239
4
- data.tar.gz: baeb31f253180567c2810c48fbcac1c15cd720a6b85fa891926b8fc53d4a2a43
3
+ metadata.gz: 46378e005f9b8e1f68f50cae8d843ebc5b06512b3fa8e5900aa8c20d191ea619
4
+ data.tar.gz: 2bf23af67bcb32305135083c2a94f46f707cfcbfbcfc865611585c8dd1a5ec68
5
5
  SHA512:
6
- metadata.gz: 7266e69e402b5f8ce042a4b76b37afbd846241912f8fe19fe09b333d6c618ba10a4b961fdf0b692d58c179afcbf7acfa2e235345361d55776e93460922084b02
7
- data.tar.gz: eb1054ccb1591b786297f2fe4e478b11df0a16ba14a7f403118556456aba5294a16a6fb0795cd73a9cbac2eaa62505c2e18a52626f0434777f52720e63aeba7c
6
+ metadata.gz: 19e615ae1f19be0f1df33f0a39aa0c31db45270c058f1afced9270eb3371e641a6b5a7799c48ab10dfa5383a64fb13eaa03619790456f2cba40d4e611f06b85c
7
+ data.tar.gz: a581d2ae494882e79f08cf6ad62a56a40705ada55f6084af67a37999e3db81eaf895ef578bdf87f2c1f4750ec0f7a62427e7f54e7f88d193f317e3a04c018307
@@ -86,7 +86,7 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
86
86
  var inputNodename = elem.nodeName
87
87
  var inputTypes = ['text', 'search', 'email', 'number']
88
88
 
89
- input.section = labelText
89
+ input.section = labelText.replace(/\r?\n|\r/g, '')
90
90
 
91
91
  var isTextField = inputTypes.indexOf(inputType) !== -1 || inputNodename === 'TEXTAREA'
92
92
  var conditionalField = elem.closest('.govuk-checkboxes__conditional')
@@ -119,8 +119,8 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
119
119
  input.section = legend.innerText
120
120
  }
121
121
  }
122
- } else if (inputNodename === 'SELECT' && elem.options[elem.selectedIndex] && elem.options[elem.selectedIndex].value) {
123
- input.answer = elem.options[elem.selectedIndex].text
122
+ } else if (inputNodename === 'SELECT' && elem.querySelectorAll('option:checked')) {
123
+ input.answer = Array.from(elem.querySelectorAll('option:checked')).map(function (element) { return element.text }).join(',')
124
124
  } else if (isTextField && elem.value) {
125
125
  if (this.includeTextInputValues || elem.hasAttribute('data-ga4-form-include-input')) {
126
126
  if (this.useTextCount) {
@@ -160,9 +160,11 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
160
160
  if (fieldSection) {
161
161
  if (parentFieldSection) {
162
162
  answers[parentFieldSection] = answers[parentFieldSection] || {}
163
- answers[parentFieldSection][fieldSection] = answer
163
+ answers[parentFieldSection][fieldSection] = answers[parentFieldSection][fieldSection] || ''
164
+ answers[parentFieldSection][fieldSection] += ((answers[parentFieldSection][fieldSection] ? ',' : '') + answer)
164
165
  } else {
165
- answers[fieldSection] = answer
166
+ answers[fieldSection] = answers[fieldSection] || ''
167
+ answers[fieldSection] += ((answers[fieldSection] ? ',' : '') + answer)
166
168
  }
167
169
  }
168
170
  } else {
@@ -71,7 +71,8 @@ window.GOVUK.analyticsGa4.analyticsModules = window.GOVUK.analyticsGa4.analytics
71
71
 
72
72
  user_created_at: this.getMetaContent('user-created-at'),
73
73
  user_organisation_name: this.getMetaContent('user-organisation-name'),
74
- user_role: this.getMetaContent('user-role')
74
+ user_role: this.getMetaContent('user-role'),
75
+ user_id: this.getMetaContent('user-id')
75
76
  }
76
77
  }
77
78
  window.GOVUK.analyticsGa4.core.sendData(data)
@@ -169,21 +169,6 @@
169
169
  return getNavigationEntry().redirectCount > 0 || timing.redirectEnd > 0;
170
170
  }
171
171
 
172
- var Flags = {
173
- InitCalled: 1 << 0,
174
- NavTimingNotSupported: 1 << 1,
175
- UserTimingNotSupported: 1 << 2,
176
- VisibilityStateNotVisible: 1 << 3,
177
- BeaconSentFromUnloadHandler: 1 << 4,
178
- BeaconSentAfterTimeout: 1 << 5,
179
- PageLabelFromDocumentTitle: 1 << 6,
180
- PageLabelFromLabelProp: 1 << 7,
181
- PageLabelFromGlobalVariable: 1 << 8,
182
- PageLabelFromUrlPattern: 1 << 9,
183
- PageWasPrerendered: 1 << 10,
184
- PageWasBfCacheRestored: 1 << 11,
185
- BeaconBlockedByCsp: 1 << 12,
186
- };
187
172
  function addFlag(flags, flag) {
188
173
  return flags | flag;
189
174
  }
@@ -211,72 +196,6 @@
211
196
  }
212
197
  }
213
198
 
214
- var LogEvent = {
215
- // Internal events
216
- EvaluationStart: 1,
217
- EvaluationEnd: 2,
218
- InitCalled: 3,
219
- MarkCalled: 4,
220
- MeasureCalled: 5,
221
- AddDataCalled: 6,
222
- SendCalled: 7,
223
- ForceSampleCalled: 8,
224
- DataCollectionStart: 9,
225
- UnloadHandlerTriggered: 10,
226
- OnloadHandlerTriggered: 11,
227
- MarkLoadTimeCalled: 12,
228
- SendCancelledPageHidden: 13,
229
- // Data collection events
230
- SessionIsSampled: 21,
231
- SessionIsNotSampled: 22,
232
- MainBeaconSent: 23,
233
- UserTimingBeaconSent: 24,
234
- InteractionBeaconSent: 25,
235
- CustomDataBeaconSent: 26,
236
- // Metric information
237
- NavigationStart: 41,
238
- PerformanceEntryReceived: 42,
239
- PerformanceEntryProcessed: 43,
240
- TrackingParamAdded: 44,
241
- // Errors
242
- PerformanceObserverError: 51,
243
- InputEventPermissionError: 52,
244
- InnerHtmlAccessError: 53,
245
- EventTargetAccessError: 54,
246
- CookieReadError: 55,
247
- CookieSetError: 56,
248
- PageLabelEvaluationError: 57,
249
- // Browser support messages
250
- NavTimingNotSupported: 71,
251
- PaintTimingNotSupported: 72,
252
- // POST beacon events
253
- PostBeaconInitialised: 80,
254
- PostBeaconSendCalled: 81,
255
- PostBeaconTimeoutReached: 82,
256
- PostBeaconSent: 83,
257
- PostBeaconAlreadySent: 84,
258
- PostBeaconCancelled: 85,
259
- PostBeaconStopRecording: 86,
260
- PostBeaconMetricRejected: 87,
261
- // PostBeaconDisabled: 88, // Not used
262
- PostBeaconSendFailed: 89,
263
- PostBeaconCSPViolation: 90,
264
- PostBeaconCollector: 91,
265
- };
266
- var Logger = /** @class */ (function () {
267
- function Logger() {
268
- this.events = [];
269
- }
270
- Logger.prototype.logEvent = function (event, args) {
271
- if (args === void 0) { args = []; }
272
- this.events.push([now(), event, args]);
273
- };
274
- Logger.prototype.getEvents = function () {
275
- return this.events;
276
- };
277
- return Logger;
278
- }());
279
-
280
199
  var START_MARK = "LUX_start";
281
200
  var END_MARK = "LUX_end";
282
201
  var BOOLEAN_TRUE = "true";
@@ -336,7 +255,7 @@
336
255
  return str;
337
256
  }
338
257
 
339
- var VERSION = "4.1.1";
258
+ var VERSION = "4.2.0";
340
259
  /**
341
260
  * Returns the version of the script as a float to be stored in legacy systems that do not support
342
261
  * string versions.
@@ -398,7 +317,7 @@
398
317
  this.sessionId = opts.sessionId;
399
318
  this.pageId = opts.pageId;
400
319
  this.maxMeasureTimeout = window.setTimeout(function () {
401
- _this.logger.logEvent(LogEvent.PostBeaconTimeoutReached);
320
+ _this.logger.logEvent(82 /* LogEvent.PostBeaconTimeoutReached */);
402
321
  _this.stopRecording();
403
322
  _this.send();
404
323
  }, this.config.maxMeasureTime - msSincePageInit());
@@ -416,8 +335,8 @@
416
335
  }
417
336
  // Update the V2 beacon URL
418
337
  _this.config.beaconUrlV2 = _this.config.beaconUrlFallback;
419
- _this.logger.logEvent(LogEvent.PostBeaconCSPViolation, [_this.config.beaconUrlV2]);
420
- _this.addFlag(Flags.BeaconBlockedByCsp);
338
+ _this.logger.logEvent(90 /* LogEvent.PostBeaconCSPViolation */, [_this.config.beaconUrlV2]);
339
+ _this.addFlag(4096 /* Flags.BeaconBlockedByCsp */);
421
340
  // Not all browsers return false if sendBeacon fails. In this case, `this.isSent` will be
422
341
  // true, even though the beacon wasn't sent. We need to reset this flag to ensure we can
423
342
  // retry sending the beacon.
@@ -429,7 +348,7 @@
429
348
  }
430
349
  }
431
350
  });
432
- this.logger.logEvent(LogEvent.PostBeaconInitialised);
351
+ this.logger.logEvent(80 /* LogEvent.PostBeaconInitialised */);
433
352
  }
434
353
  Beacon.prototype.isBeingSampled = function () {
435
354
  var bucket = parseInt(String(this.sessionId).slice(-2));
@@ -437,7 +356,7 @@
437
356
  };
438
357
  Beacon.prototype.stopRecording = function () {
439
358
  this.isRecording = false;
440
- this.logger.logEvent(LogEvent.PostBeaconStopRecording);
359
+ this.logger.logEvent(86 /* LogEvent.PostBeaconStopRecording */);
441
360
  };
442
361
  Beacon.prototype.addCollector = function (metric, collector) {
443
362
  this.metricCollectors[metric] = collector;
@@ -452,7 +371,7 @@
452
371
  this.onBeforeSendCbs.push(cb);
453
372
  };
454
373
  Beacon.prototype.send = function () {
455
- this.logger.logEvent(LogEvent.PostBeaconSendCalled);
374
+ this.logger.logEvent(81 /* LogEvent.PostBeaconSendCalled */);
456
375
  for (var _i = 0, _a = this.onBeforeSendCbs; _i < _a.length; _i++) {
457
376
  var cb = _a[_i];
458
377
  cb();
@@ -463,8 +382,8 @@
463
382
  var collectionStart = now();
464
383
  var metricData = {};
465
384
  for (var metric in this.metricCollectors) {
466
- var data = this.metricCollectors[metric]();
467
- this.logger.logEvent(LogEvent.PostBeaconCollector, [metric, !!data]);
385
+ var data = this.metricCollectors[metric](this.config);
386
+ this.logger.logEvent(91 /* LogEvent.PostBeaconCollector */, [metric, !!data]);
468
387
  if (data) {
469
388
  metricData[metric] = data;
470
389
  }
@@ -472,11 +391,11 @@
472
391
  if (!Object.keys(metricData).length && !this.config.allowEmptyPostBeacon) {
473
392
  // TODO: This is only required while the new beacon is supplementary. Once it's the primary
474
393
  // beacon, we should send it regardless of how much metric data it has.
475
- this.logger.logEvent(LogEvent.PostBeaconCancelled);
394
+ this.logger.logEvent(85 /* LogEvent.PostBeaconCancelled */);
476
395
  return;
477
396
  }
478
397
  if (this.isSent) {
479
- this.logger.logEvent(LogEvent.PostBeaconAlreadySent);
398
+ this.logger.logEvent(84 /* LogEvent.PostBeaconAlreadySent */);
480
399
  return;
481
400
  }
482
401
  // Only clear the max measure timeout if there's data to send.
@@ -495,14 +414,14 @@
495
414
  try {
496
415
  if (sendBeacon(beaconUrl, JSON.stringify(payload))) {
497
416
  this.isSent = true;
498
- this.logger.logEvent(LogEvent.PostBeaconSent, [beaconUrl, payload]);
417
+ this.logger.logEvent(83 /* LogEvent.PostBeaconSent */, [beaconUrl, payload]);
499
418
  }
500
419
  }
501
420
  catch (e) {
502
421
  // Intentionally empty; handled below
503
422
  }
504
423
  if (!this.isSent) {
505
- this.logger.logEvent(LogEvent.PostBeaconSendFailed, [beaconUrl, payload]);
424
+ this.logger.logEvent(89 /* LogEvent.PostBeaconSendFailed */, [beaconUrl, payload]);
506
425
  }
507
426
  };
508
427
  return Beacon;
@@ -545,6 +464,7 @@
545
464
  interactionBeaconDelay: getProperty(obj, "interactionBeaconDelay", 200),
546
465
  jspagelabel: getProperty(obj, "jspagelabel"),
547
466
  label: getProperty(obj, "label"),
467
+ maxAttributionEntries: getProperty(obj, "maxAttributionEntries", 25),
548
468
  maxBeaconUrlLength: getProperty(obj, "maxBeaconUrlLength", 8190),
549
469
  maxBeaconUTEntries: getProperty(obj, "maxBeaconUTEntries", 20),
550
470
  maxErrors: getProperty(obj, "maxErrors", 5),
@@ -703,12 +623,25 @@
703
623
  return trackingParams;
704
624
  }
705
625
 
626
+ var Logger = /** @class */ (function () {
627
+ function Logger() {
628
+ this.events = [];
629
+ }
630
+ Logger.prototype.logEvent = function (event, args) {
631
+ if (args === void 0) { args = []; }
632
+ this.events.push([now(), event, args]);
633
+ };
634
+ Logger.prototype.getEvents = function () {
635
+ return this.events;
636
+ };
637
+ return Logger;
638
+ }());
639
+
706
640
  var sessionValue = 0;
707
641
  var sessionEntries = [];
708
642
  var sessionAttributions = [];
709
643
  var largestEntry;
710
644
  var maximumSessionValue = 0;
711
- var MAX_CLS_SOURCES = 50;
712
645
  function processEntry$3(entry) {
713
646
  if (!entry.hadRecentInput) {
714
647
  var firstEntry = sessionEntries[0];
@@ -748,7 +681,10 @@
748
681
  maximumSessionValue = 0;
749
682
  largestEntry = undefined;
750
683
  }
751
- function getData$3() {
684
+ function getData$3(config) {
685
+ if (!("LayoutShift" in self)) {
686
+ return undefined;
687
+ }
752
688
  return {
753
689
  value: maximumSessionValue,
754
690
  startTime: sessionEntries[0] ? processTimeMetric(sessionEntries[0].startTime) : null,
@@ -758,7 +694,7 @@
758
694
  startTime: processTimeMetric(largestEntry.startTime),
759
695
  }
760
696
  : null,
761
- sources: sessionAttributions.length ? sessionAttributions.slice(0, MAX_CLS_SOURCES) : null,
697
+ sources: sessionAttributions.length ? sessionAttributions.slice(0, config.maxAttributionEntries) : null,
762
698
  };
763
699
  }
764
700
 
@@ -795,8 +731,6 @@
795
731
  return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
796
732
  };
797
733
 
798
- var MAX_LOAF_ENTRIES = 50;
799
- var MAX_LOAF_SCRIPTS = 50;
800
734
  var entries = [];
801
735
  function processEntry$2(entry) {
802
736
  entries.push(entry);
@@ -807,7 +741,7 @@
807
741
  function getEntries$1() {
808
742
  return entries;
809
743
  }
810
- function getData$2() {
744
+ function getData$2(config) {
811
745
  var summarizedEntries = [];
812
746
  var totalDuration = 0;
813
747
  var totalBlockingDuration = 0;
@@ -835,34 +769,42 @@
835
769
  totalEntries: entries.length,
836
770
  totalStyleAndLayoutDuration: floor(totalStyleAndLayoutDuration),
837
771
  totalWorkDuration: floor(totalWorkDuration),
838
- entries: summarizedEntries.slice(0, MAX_LOAF_ENTRIES),
839
- scripts: summarizeLoAFScripts(entries.flatMap(function (entry) { return entry.scripts; })).slice(0, MAX_LOAF_SCRIPTS),
840
- };
772
+ scripts: summarizeLoAFScripts(entries.flatMap(function (entry) { return entry.scripts; }), config),
773
+ // Only keep the slowest LoAF entries
774
+ entries: summarizedEntries
775
+ .sort(function (a, b) { return b.duration - a.duration; })
776
+ .slice(0, config.maxAttributionEntries)
777
+ .sort(function (a, b) { return a.startTime - b.startTime; }),
778
+ };
841
779
  }
842
- function summarizeLoAFScripts(scripts) {
780
+ function summarizeLoAFScripts(scripts, config) {
843
781
  var summary = {};
844
782
  scripts.forEach(function (script) {
845
- var key = script.invoker + ":" + script.sourceURL + ":" + script.sourceFunctionName;
783
+ var key = script.sourceURL;
846
784
  if (!summary[key]) {
847
785
  summary[key] = {
848
786
  sourceUrl: script.sourceURL,
849
- sourceFunctionName: script.sourceFunctionName,
787
+ sourceFunctionName: "",
850
788
  timings: [],
851
789
  totalEntries: 0,
852
790
  totalDuration: 0,
791
+ totalBlockingDuration: 0,
853
792
  totalPauseDuration: 0,
854
793
  totalForcedStyleAndLayoutDuration: 0,
855
- invoker: script.invoker,
794
+ invoker: "",
856
795
  inpPhase: script.inpPhase,
857
796
  };
858
797
  }
859
798
  summary[key].totalEntries++;
860
799
  summary[key].totalDuration += script.duration;
800
+ summary[key].totalBlockingDuration += max(0, script.duration - 50);
861
801
  summary[key].totalPauseDuration += script.pauseDuration;
862
802
  summary[key].totalForcedStyleAndLayoutDuration += script.forcedStyleAndLayoutDuration;
863
803
  summary[key].timings.push([floor(script.startTime), floor(script.duration)]);
864
804
  });
865
- return Object.values(summary).map(function (script) { return (__assign(__assign({}, script), { totalDuration: floor(script.totalDuration), totalPauseDuration: floor(script.totalPauseDuration), totalForcedStyleAndLayoutDuration: floor(script.totalForcedStyleAndLayoutDuration) })); });
805
+ return Object.values(summary).map(function (script) { return (__assign(__assign({}, script), { totalDuration: floor(script.totalDuration), totalPauseDuration: floor(script.totalPauseDuration), totalForcedStyleAndLayoutDuration: floor(script.totalForcedStyleAndLayoutDuration) })); })
806
+ .sort(function (a, b) { return b.totalDuration - a.totalDuration; })
807
+ .slice(0, config.maxAttributionEntries);
866
808
  }
867
809
 
868
810
  /**
@@ -947,7 +889,7 @@
947
889
  var index = Math.min(slowestEntries.length - 1, Math.floor(getInteractionCount() / 50));
948
890
  return slowestEntries[index];
949
891
  }
950
- function getData$1() {
892
+ function getData$1(config) {
951
893
  var _a;
952
894
  var interaction = getHighPercentileInteraction();
953
895
  if (!interaction) {
@@ -967,7 +909,7 @@
967
909
  script.inpPhase = getINPPhase(script, interaction);
968
910
  return script;
969
911
  });
970
- var loafScripts = summarizeLoAFScripts(inpScripts);
912
+ var loafScripts = summarizeLoAFScripts(inpScripts, config);
971
913
  return {
972
914
  value: interaction.duration,
973
915
  startTime: processTimeMetric(startTime),
@@ -1162,7 +1104,7 @@
1162
1104
  // -------------------------------------------------------------------------
1163
1105
  var logger = new Logger();
1164
1106
  var globalConfig = fromObject(LUX);
1165
- logger.logEvent(LogEvent.EvaluationStart, [VERSION, JSON.stringify(globalConfig)]);
1107
+ logger.logEvent(1 /* LogEvent.EvaluationStart */, [VERSION, JSON.stringify(globalConfig)]);
1166
1108
  // Variable aliases that allow the minifier to reduce file size.
1167
1109
  var document = window.document;
1168
1110
  var addEventListener = window.addEventListener;
@@ -1226,18 +1168,9 @@
1226
1168
  // Storing the customer ID in a local variable makes it possible to run multiple instances of lux.js
1227
1169
  // on the same page.
1228
1170
  var _thisCustomerId = LUX.customerid;
1229
- var initPostBeacon = function () {
1230
- return new Beacon({
1231
- config: globalConfig,
1232
- logger: logger,
1233
- customerId: getCustomerId(),
1234
- sessionId: gUid,
1235
- pageId: gSyncId,
1236
- });
1237
- };
1238
- var beacon = initPostBeacon();
1171
+ var beaconCollectors = [];
1239
1172
  var logEntry = function (entry) {
1240
- logger.logEvent(LogEvent.PerformanceEntryReceived, [entry]);
1173
+ logger.logEvent(42 /* LogEvent.PerformanceEntryReceived */, [entry]);
1241
1174
  };
1242
1175
  // Most PerformanceEntry types we log an event for and add it to the global entry store.
1243
1176
  var processAndLogEntry = function (entry) {
@@ -1254,19 +1187,19 @@
1254
1187
  // Process the LCP entry for the new beacon
1255
1188
  processEntry(entry);
1256
1189
  })) {
1257
- beacon.addCollector(BeaconMetricKey.LCP, getData);
1190
+ beaconCollectors.push([BeaconMetricKey.LCP, getData]);
1258
1191
  }
1259
1192
  if (observe("layout-shift", function (entry) {
1260
1193
  processEntry$3(entry);
1261
1194
  logEntry(entry);
1262
1195
  })) {
1263
- beacon.addCollector(BeaconMetricKey.CLS, getData$3);
1196
+ beaconCollectors.push([BeaconMetricKey.CLS, getData$3]);
1264
1197
  }
1265
1198
  if (observe("long-animation-frame", function (entry) {
1266
1199
  processEntry$2(entry);
1267
1200
  logEntry(entry);
1268
1201
  })) {
1269
- beacon.addCollector(BeaconMetricKey.LoAF, getData$2);
1202
+ beaconCollectors.push([BeaconMetricKey.LoAF, getData$2]);
1270
1203
  }
1271
1204
  var handleINPEntry_1 = function (entry) {
1272
1205
  processEntry$1(entry);
@@ -1298,25 +1231,40 @@
1298
1231
  processingEnd: entry.processingEnd,
1299
1232
  });
1300
1233
  }, { durationThreshold: 0 })) {
1301
- beacon.addCollector(BeaconMetricKey.INP, getData$1);
1234
+ beaconCollectors.push([BeaconMetricKey.INP, getData$1]);
1302
1235
  }
1303
1236
  }
1304
1237
  catch (e) {
1305
- logger.logEvent(LogEvent.PerformanceObserverError, [e]);
1238
+ logger.logEvent(51 /* LogEvent.PerformanceObserverError */, [e]);
1306
1239
  }
1240
+ var initPostBeacon = function () {
1241
+ var b = new Beacon({
1242
+ config: globalConfig,
1243
+ logger: logger,
1244
+ customerId: getCustomerId(),
1245
+ sessionId: gUid,
1246
+ pageId: gSyncId,
1247
+ });
1248
+ beaconCollectors.forEach(function (_a) {
1249
+ var metric = _a[0], collector = _a[1];
1250
+ b.addCollector(metric, collector);
1251
+ });
1252
+ return b;
1253
+ };
1254
+ var beacon = initPostBeacon();
1307
1255
  if (_sample()) {
1308
- logger.logEvent(LogEvent.SessionIsSampled, [globalConfig.samplerate]);
1256
+ logger.logEvent(21 /* LogEvent.SessionIsSampled */, [globalConfig.samplerate]);
1309
1257
  }
1310
1258
  else {
1311
- logger.logEvent(LogEvent.SessionIsNotSampled, [globalConfig.samplerate]);
1259
+ logger.logEvent(22 /* LogEvent.SessionIsNotSampled */, [globalConfig.samplerate]);
1312
1260
  }
1313
1261
  var gLuxSnippetStart = LUX.ns ? LUX.ns - timing.navigationStart : 0;
1314
1262
  if (!performance.timing) {
1315
- logger.logEvent(LogEvent.NavTimingNotSupported);
1316
- gFlags = addFlag(gFlags, Flags.NavTimingNotSupported);
1317
- beacon.addFlag(Flags.NavTimingNotSupported);
1263
+ logger.logEvent(71 /* LogEvent.NavTimingNotSupported */);
1264
+ gFlags = addFlag(gFlags, 2 /* Flags.NavTimingNotSupported */);
1265
+ beacon.addFlag(2 /* Flags.NavTimingNotSupported */);
1318
1266
  }
1319
- logger.logEvent(LogEvent.NavigationStart, [timing.navigationStart]);
1267
+ logger.logEvent(41 /* LogEvent.NavigationStart */, [timing.navigationStart]);
1320
1268
  ////////////////////// FID BEGIN
1321
1269
  // FIRST INPUT DELAY (FID)
1322
1270
  // The basic idea behind FID is to attach various input event listeners and measure the time
@@ -1362,7 +1310,7 @@
1362
1310
  }
1363
1311
  catch (e) {
1364
1312
  // bail - no need to return anything
1365
- logger.logEvent(LogEvent.InputEventPermissionError);
1313
+ logger.logEvent(52 /* LogEvent.InputEventPermissionError */);
1366
1314
  return;
1367
1315
  }
1368
1316
  if (bCancelable) {
@@ -1401,7 +1349,7 @@
1401
1349
  for (var _i = 0; _i < arguments.length; _i++) {
1402
1350
  args[_i] = arguments[_i];
1403
1351
  }
1404
- logger.logEvent(LogEvent.MarkCalled, args);
1352
+ logger.logEvent(4 /* LogEvent.MarkCalled */, args);
1405
1353
  if (performance.mark) {
1406
1354
  // Use the native performance.mark where possible...
1407
1355
  return performance.mark.apply(performance, args);
@@ -1419,8 +1367,8 @@
1419
1367
  startTime: startTime,
1420
1368
  };
1421
1369
  gaMarks.push(entry);
1422
- gFlags = addFlag(gFlags, Flags.UserTimingNotSupported);
1423
- beacon.addFlag(Flags.UserTimingNotSupported);
1370
+ gFlags = addFlag(gFlags, 4 /* Flags.UserTimingNotSupported */);
1371
+ beacon.addFlag(4 /* Flags.UserTimingNotSupported */);
1424
1372
  return entry;
1425
1373
  }
1426
1374
  }
@@ -1431,7 +1379,7 @@
1431
1379
  for (var _i = 0; _i < arguments.length; _i++) {
1432
1380
  args[_i] = arguments[_i];
1433
1381
  }
1434
- logger.logEvent(LogEvent.MeasureCalled, args);
1382
+ logger.logEvent(5 /* LogEvent.MeasureCalled */, args);
1435
1383
  var name = args[0];
1436
1384
  var startMarkName = args[1];
1437
1385
  var endMarkName = args[2];
@@ -1522,8 +1470,8 @@
1522
1470
  duration: duration,
1523
1471
  };
1524
1472
  gaMeasures.push(entry);
1525
- gFlags = addFlag(gFlags, Flags.UserTimingNotSupported);
1526
- beacon.addFlag(Flags.UserTimingNotSupported);
1473
+ gFlags = addFlag(gFlags, 4 /* Flags.UserTimingNotSupported */);
1474
+ beacon.addFlag(4 /* Flags.UserTimingNotSupported */);
1527
1475
  return entry;
1528
1476
  }
1529
1477
  }
@@ -1620,7 +1568,7 @@
1620
1568
  if (entry.identifier && entry.startTime) {
1621
1569
  var value = processTimeMetric(entry.startTime);
1622
1570
  if (shouldReportValue(value)) {
1623
- logger.logEvent(LogEvent.PerformanceEntryProcessed, [entry]);
1571
+ logger.logEvent(43 /* LogEvent.PerformanceEntryProcessed */, [entry]);
1624
1572
  aET.push(entry.identifier + "|" + value);
1625
1573
  }
1626
1574
  }
@@ -1649,7 +1597,7 @@
1649
1597
  }
1650
1598
  // Only process entries that we calculated to have a valid duration
1651
1599
  if (dur > 0) {
1652
- logger.logEvent(LogEvent.PerformanceEntryProcessed, [entry]);
1600
+ logger.logEvent(43 /* LogEvent.PerformanceEntryProcessed */, [entry]);
1653
1601
  var type = entry.attribution[0].name;
1654
1602
  if (!hCPU[type]) {
1655
1603
  hCPU[type] = 0;
@@ -1719,13 +1667,6 @@
1719
1667
  var median = arrayMedian(aValues);
1720
1668
  return { count: count, median: median, max: max, fci: fci };
1721
1669
  }
1722
- function getCLS() {
1723
- if (!("LayoutShift" in self)) {
1724
- return undefined;
1725
- }
1726
- var clsData = getData$3();
1727
- return clsData.value.toFixed(6);
1728
- }
1729
1670
  // Return the median value from an array of integers.
1730
1671
  function arrayMedian(aValues) {
1731
1672
  if (0 === aValues.length) {
@@ -1799,7 +1740,7 @@
1799
1740
  return aIx.join(",");
1800
1741
  }
1801
1742
  function _addData(name, value) {
1802
- logger.logEvent(LogEvent.AddDataCalled, [name, value]);
1743
+ logger.logEvent(6 /* LogEvent.AddDataCalled */, [name, value]);
1803
1744
  if (typeof name === "string") {
1804
1745
  addCustomDataValue(name, value);
1805
1746
  }
@@ -1847,7 +1788,7 @@
1847
1788
  else {
1848
1789
  _mark(START_MARK);
1849
1790
  }
1850
- logger.logEvent(LogEvent.InitCalled);
1791
+ logger.logEvent(3 /* LogEvent.InitCalled */);
1851
1792
  // This is an edge case where LUX.auto = true but LUX.init() has been called. In this case, the
1852
1793
  // POST beacon will not be sent automatically, so we need to send it here.
1853
1794
  if (globalConfig.auto && !beacon.isSent) {
@@ -1875,8 +1816,8 @@
1875
1816
  // Clear flags then set the flag that init was called (ie, this is a SPA).
1876
1817
  if (clearFlags) {
1877
1818
  gFlags = 0;
1878
- gFlags = addFlag(gFlags, Flags.InitCalled);
1879
- beacon.addFlag(Flags.InitCalled);
1819
+ gFlags = addFlag(gFlags, 1 /* Flags.InitCalled */);
1820
+ beacon.addFlag(1 /* Flags.InitCalled */);
1880
1821
  }
1881
1822
  // Reset the maximum measure timeout
1882
1823
  createMaxMeasureTimeout();
@@ -1973,7 +1914,7 @@
1973
1914
  }
1974
1915
  catch (e) {
1975
1916
  // It seems like IE throws an error when accessing the innerHTML property
1976
- logger.logEvent(LogEvent.InnerHtmlAccessError);
1917
+ logger.logEvent(53 /* LogEvent.InnerHtmlAccessError */);
1977
1918
  return -1;
1978
1919
  }
1979
1920
  }
@@ -2092,7 +2033,7 @@
2092
2033
  var lastEntry = lcpEntries[lcpEntries.length - 1];
2093
2034
  var value = processTimeMetric(lastEntry.startTime);
2094
2035
  if (shouldReportValue(value)) {
2095
- logger.logEvent(LogEvent.PerformanceEntryProcessed, [lastEntry]);
2036
+ logger.logEvent(43 /* LogEvent.PerformanceEntryProcessed */, [lastEntry]);
2096
2037
  return value;
2097
2038
  }
2098
2039
  }
@@ -2119,7 +2060,7 @@
2119
2060
  // If IE/Edge, use the prefixed `msFirstPaint` property (see http://msdn.microsoft.com/ff974719).
2120
2061
  return floor(timing.msFirstPaint - timing.navigationStart);
2121
2062
  }
2122
- logger.logEvent(LogEvent.PaintTimingNotSupported);
2063
+ logger.logEvent(72 /* LogEvent.PaintTimingNotSupported */);
2123
2064
  return undefined;
2124
2065
  }
2125
2066
  function getINPDetails() {
@@ -2285,7 +2226,7 @@
2285
2226
  // Mark the load time of the current page. Intended to be used in SPAs where it is not desirable to
2286
2227
  // send the beacon as soon as the page has finished loading.
2287
2228
  function _markLoadTime(time) {
2288
- logger.logEvent(LogEvent.MarkLoadTimeCalled, [time]);
2229
+ logger.logEvent(12 /* LogEvent.MarkLoadTimeCalled */, [time]);
2289
2230
  if (time) {
2290
2231
  _mark(END_MARK, { startTime: time });
2291
2232
  }
@@ -2296,8 +2237,8 @@
2296
2237
  function createMaxMeasureTimeout() {
2297
2238
  clearMaxMeasureTimeout();
2298
2239
  gMaxMeasureTimeout = setTimeout(function () {
2299
- gFlags = addFlag(gFlags, Flags.BeaconSentAfterTimeout);
2300
- beacon.addFlag(Flags.BeaconSentAfterTimeout);
2240
+ gFlags = addFlag(gFlags, 32 /* Flags.BeaconSentAfterTimeout */);
2241
+ beacon.addFlag(32 /* Flags.BeaconSentAfterTimeout */);
2301
2242
  _sendLux();
2302
2243
  }, globalConfig.maxMeasureTime - msSincePageInit());
2303
2244
  }
@@ -2330,7 +2271,7 @@
2330
2271
  function _sendLux() {
2331
2272
  var _a;
2332
2273
  if (!isVisible() && !globalConfig.trackHiddenPages) {
2333
- logger.logEvent(LogEvent.SendCancelledPageHidden);
2274
+ logger.logEvent(13 /* LogEvent.SendCancelledPageHidden */);
2334
2275
  return;
2335
2276
  }
2336
2277
  clearMaxMeasureTimeout();
@@ -2342,7 +2283,7 @@
2342
2283
  ) {
2343
2284
  return;
2344
2285
  }
2345
- logger.logEvent(LogEvent.DataCollectionStart);
2286
+ logger.logEvent(9 /* LogEvent.DataCollectionStart */);
2346
2287
  var startMark = _getMark(START_MARK);
2347
2288
  var endMark = _getMark(END_MARK);
2348
2289
  if (!startMark || (endMark && endMark.startTime < startMark.startTime)) {
@@ -2353,7 +2294,7 @@
2353
2294
  // Store any tracking parameters as custom data
2354
2295
  var trackingParams = getTrackingParams();
2355
2296
  for (var key in trackingParams) {
2356
- logger.logEvent(LogEvent.TrackingParamAdded, [key, trackingParams[key]]);
2297
+ logger.logEvent(44 /* LogEvent.TrackingParamAdded */, [key, trackingParams[key]]);
2357
2298
  addCustomDataValue("_" + key, trackingParams[key]);
2358
2299
  }
2359
2300
  var sIx = "";
@@ -2370,15 +2311,15 @@
2370
2311
  }
2371
2312
  var sET = elementTimingValues(); // Element Timing data
2372
2313
  var sCPU = cpuTimes();
2373
- var CLS = getCLS();
2314
+ var clsData = getData$3(globalConfig);
2374
2315
  var sLuxjs = selfLoading();
2375
2316
  if (!isVisible()) {
2376
- gFlags = addFlag(gFlags, Flags.VisibilityStateNotVisible);
2377
- beacon.addFlag(Flags.VisibilityStateNotVisible);
2317
+ gFlags = addFlag(gFlags, 8 /* Flags.VisibilityStateNotVisible */);
2318
+ beacon.addFlag(8 /* Flags.VisibilityStateNotVisible */);
2378
2319
  }
2379
2320
  if (wasPrerendered()) {
2380
- gFlags = addFlag(gFlags, Flags.PageWasPrerendered);
2381
- beacon.addFlag(Flags.PageWasPrerendered);
2321
+ gFlags = addFlag(gFlags, 1024 /* Flags.PageWasPrerendered */);
2322
+ beacon.addFlag(1024 /* Flags.PageWasPrerendered */);
2382
2323
  }
2383
2324
  if (globalConfig.serverTiming) {
2384
2325
  var navEntry = getNavigationEntry();
@@ -2449,9 +2390,9 @@
2449
2390
  (typeof gFirstInputDelay !== "undefined" ? "&FID=" + gFirstInputDelay : "") +
2450
2391
  (sCPU ? "&CPU=" + sCPU : "") +
2451
2392
  (sET ? "&ET=" + sET : "") + // element timing
2452
- (typeof CLS !== "undefined" ? "&CLS=" + CLS : "") +
2393
+ (clsData ? "&CLS=" + clsData.value.toFixed(6) : "") +
2453
2394
  // INP and sub-parts
2454
- (typeof INP !== "undefined" ? getINPString(INP) : "");
2395
+ (INP ? getINPString(INP) : "");
2455
2396
  // We add the user timing entries last so that we can split them to reduce the URL size if necessary.
2456
2397
  var utValues = userTimingValues();
2457
2398
  var _b = fitUserTimingEntries(utValues, globalConfig, baseUrl + metricsQueryString), beaconUtValues = _b[0], remainingUtValues = _b[1];
@@ -2459,7 +2400,7 @@
2459
2400
  var mainBeaconUrl = baseUrl +
2460
2401
  metricsQueryString +
2461
2402
  (beaconUtValues.length > 0 ? "&UT=" + beaconUtValues.join(",") : "");
2462
- logger.logEvent(LogEvent.MainBeaconSent, [mainBeaconUrl]);
2403
+ logger.logEvent(23 /* LogEvent.MainBeaconSent */, [mainBeaconUrl]);
2463
2404
  _sendBeacon(mainBeaconUrl);
2464
2405
  // Set some states.
2465
2406
  gbLuxSent = 1;
@@ -2469,7 +2410,7 @@
2469
2410
  while (remainingUtValues.length) {
2470
2411
  _a = fitUserTimingEntries(remainingUtValues, globalConfig, baseUrl), beaconUtValues = _a[0], remainingUtValues = _a[1];
2471
2412
  var utBeaconUrl = baseUrl + "&UT=" + beaconUtValues.join(",");
2472
- logger.logEvent(LogEvent.UserTimingBeaconSent, [utBeaconUrl]);
2413
+ logger.logEvent(24 /* LogEvent.UserTimingBeaconSent */, [utBeaconUrl]);
2473
2414
  _sendBeacon(utBeaconUrl);
2474
2415
  }
2475
2416
  }
@@ -2497,7 +2438,7 @@
2497
2438
  sIx +
2498
2439
  (typeof gFirstInputDelay !== "undefined" ? "&FID=" + gFirstInputDelay : "") +
2499
2440
  (typeof INP !== "undefined" ? getINPString(INP) : "");
2500
- logger.logEvent(LogEvent.InteractionBeaconSent, [beaconUrl]);
2441
+ logger.logEvent(25 /* LogEvent.InteractionBeaconSent */, [beaconUrl]);
2501
2442
  _sendBeacon(beaconUrl);
2502
2443
  gbIxSent = 1;
2503
2444
  }
@@ -2516,7 +2457,7 @@
2516
2457
  var customDataValues = valuesToString(getUpdatedCustomData());
2517
2458
  if (customDataValues) {
2518
2459
  var beaconUrl = _getBeaconUrl(getUpdatedCustomData());
2519
- logger.logEvent(LogEvent.CustomDataBeaconSent, [beaconUrl]);
2460
+ logger.logEvent(26 /* LogEvent.CustomDataBeaconSent */, [beaconUrl]);
2520
2461
  _sendBeacon(beaconUrl);
2521
2462
  }
2522
2463
  }
@@ -2580,7 +2521,7 @@
2580
2521
  }
2581
2522
  }
2582
2523
  catch (e) {
2583
- logger.logEvent(LogEvent.EventTargetAccessError);
2524
+ logger.logEvent(54 /* LogEvent.EventTargetAccessError */);
2584
2525
  }
2585
2526
  if (target) {
2586
2527
  if (e.clientX) {
@@ -2599,9 +2540,9 @@
2599
2540
  }
2600
2541
  function _addUnloadHandlers() {
2601
2542
  var onunload = function () {
2602
- gFlags = addFlag(gFlags, Flags.BeaconSentFromUnloadHandler);
2603
- beacon.addFlag(Flags.BeaconSentFromUnloadHandler);
2604
- logger.logEvent(LogEvent.UnloadHandlerTriggered);
2543
+ gFlags = addFlag(gFlags, 16 /* Flags.BeaconSentFromUnloadHandler */);
2544
+ beacon.addFlag(16 /* Flags.BeaconSentFromUnloadHandler */);
2545
+ logger.logEvent(10 /* LogEvent.UnloadHandlerTriggered */);
2605
2546
  _sendLux();
2606
2547
  _sendIx();
2607
2548
  beacon.send();
@@ -2677,15 +2618,15 @@
2677
2618
  // Return the current page label.
2678
2619
  function _getPageLabel() {
2679
2620
  if (LUX.label) {
2680
- gFlags = addFlag(gFlags, Flags.PageLabelFromLabelProp);
2681
- beacon.addFlag(Flags.PageLabelFromLabelProp);
2621
+ gFlags = addFlag(gFlags, 128 /* Flags.PageLabelFromLabelProp */);
2622
+ beacon.addFlag(128 /* Flags.PageLabelFromLabelProp */);
2682
2623
  return LUX.label;
2683
2624
  }
2684
2625
  if (typeof LUX.pagegroups !== "undefined") {
2685
2626
  var label = getMatchesFromPatternMap(LUX.pagegroups, location.hostname, location.pathname, true);
2686
2627
  if (label) {
2687
- gFlags = addFlag(gFlags, Flags.PageLabelFromUrlPattern);
2688
- beacon.addFlag(Flags.PageLabelFromUrlPattern);
2628
+ gFlags = addFlag(gFlags, 512 /* Flags.PageLabelFromUrlPattern */);
2629
+ beacon.addFlag(512 /* Flags.PageLabelFromUrlPattern */);
2689
2630
  return label;
2690
2631
  }
2691
2632
  }
@@ -2694,18 +2635,18 @@
2694
2635
  try {
2695
2636
  var label = evaluateJsPageLabel();
2696
2637
  if (label) {
2697
- gFlags = addFlag(gFlags, Flags.PageLabelFromGlobalVariable);
2698
- beacon.addFlag(Flags.PageLabelFromGlobalVariable);
2638
+ gFlags = addFlag(gFlags, 256 /* Flags.PageLabelFromGlobalVariable */);
2639
+ beacon.addFlag(256 /* Flags.PageLabelFromGlobalVariable */);
2699
2640
  return label;
2700
2641
  }
2701
2642
  }
2702
2643
  catch (e) {
2703
- logger.logEvent(LogEvent.PageLabelEvaluationError, [LUX.jspagelabel, e]);
2644
+ logger.logEvent(57 /* LogEvent.PageLabelEvaluationError */, [LUX.jspagelabel, e]);
2704
2645
  }
2705
2646
  }
2706
2647
  // default to document.title
2707
- gFlags = addFlag(gFlags, Flags.PageLabelFromDocumentTitle);
2708
- beacon.addFlag(Flags.PageLabelFromDocumentTitle);
2648
+ gFlags = addFlag(gFlags, 64 /* Flags.PageLabelFromDocumentTitle */);
2649
+ beacon.addFlag(64 /* Flags.PageLabelFromDocumentTitle */);
2709
2650
  return document.title;
2710
2651
  }
2711
2652
  function _getCookie(name) {
@@ -2721,7 +2662,7 @@
2721
2662
  }
2722
2663
  }
2723
2664
  catch (e) {
2724
- logger.logEvent(LogEvent.CookieReadError);
2665
+ logger.logEvent(55 /* LogEvent.CookieReadError */);
2725
2666
  }
2726
2667
  return undefined;
2727
2668
  }
@@ -2736,7 +2677,7 @@
2736
2677
  "; path=/; SameSite=Lax";
2737
2678
  }
2738
2679
  catch (e) {
2739
- logger.logEvent(LogEvent.CookieSetError);
2680
+ logger.logEvent(56 /* LogEvent.CookieSetError */);
2740
2681
  }
2741
2682
  }
2742
2683
  // Set "LUX.auto=false" to disable send results automatically and
@@ -2754,7 +2695,7 @@
2754
2695
  var elapsedTime = msSincePageInit();
2755
2696
  var timeRemaining = globalConfig.minMeasureTime - elapsedTime;
2756
2697
  if (timeRemaining <= 0) {
2757
- logger.logEvent(LogEvent.OnloadHandlerTriggered, [
2698
+ logger.logEvent(11 /* LogEvent.OnloadHandlerTriggered */, [
2758
2699
  elapsedTime,
2759
2700
  globalConfig.minMeasureTime,
2760
2701
  ]);
@@ -2789,8 +2730,8 @@
2789
2730
  _markLoadTime();
2790
2731
  }
2791
2732
  // Flag the current page as a bfcache restore
2792
- gFlags = addFlag(gFlags, Flags.PageWasBfCacheRestored);
2793
- beacon.addFlag(Flags.PageWasBfCacheRestored);
2733
+ gFlags = addFlag(gFlags, 2048 /* Flags.PageWasBfCacheRestored */);
2734
+ beacon.addFlag(2048 /* Flags.PageWasBfCacheRestored */);
2794
2735
  }, 0);
2795
2736
  }
2796
2737
  });
@@ -2814,7 +2755,7 @@
2814
2755
  globalLux.init = _init;
2815
2756
  globalLux.markLoadTime = _markLoadTime;
2816
2757
  globalLux.send = function () {
2817
- logger.logEvent(LogEvent.SendCalled);
2758
+ logger.logEvent(7 /* LogEvent.SendCalled */);
2818
2759
  beacon.send();
2819
2760
  _sendLux();
2820
2761
  };
@@ -2825,7 +2766,7 @@
2825
2766
  return logger.getEvents();
2826
2767
  };
2827
2768
  globalLux.forceSample = function () {
2828
- logger.logEvent(LogEvent.ForceSampleCalled);
2769
+ logger.logEvent(8 /* LogEvent.ForceSampleCalled */);
2829
2770
  setUniqueId(createSyncId(true));
2830
2771
  };
2831
2772
  globalLux.doUpdate = function () {
@@ -2852,7 +2793,7 @@
2852
2793
  if (typeof window.LUX_ae !== "undefined") {
2853
2794
  window.LUX_ae.forEach(errorHandler);
2854
2795
  }
2855
- logger.logEvent(LogEvent.EvaluationEnd);
2796
+ logger.logEvent(2 /* LogEvent.EvaluationEnd */);
2856
2797
  return globalLux;
2857
2798
  })();
2858
2799
  window.LUX = LUX;
@@ -27,6 +27,10 @@ $choices-button-dimension: 12px !default;
27
27
  font-family: $govuk-font-family;
28
28
  }
29
29
 
30
+ .choices[data-type="select-one"] .choices__list--dropdown .choices__list .choices__placeholder {
31
+ opacity: 1;
32
+ }
33
+
30
34
  .choices[data-type*="select-one"]::after {
31
35
  @include govuk-shape-arrow($direction: down, $base: 10px, $display: inline-block);
32
36
  @include prefixed-transform($translateY: -50%);
@@ -17,6 +17,11 @@
17
17
  margin: 0 0 govuk-spacing(6) 0;
18
18
  }
19
19
 
20
+ .address {
21
+ // Override the browser default of italics for <address>
22
+ font-style: normal;
23
+ }
24
+
20
25
  .contact {
21
26
  position: relative;
22
27
  @include govuk-clearfix;
@@ -64,7 +64,7 @@ module GovukPublishingComponents
64
64
  end
65
65
 
66
66
  def skip_the_gov_uk_account?
67
- @skip_account == "true" || @skip_account == true
67
+ @skip_account == true
68
68
  end
69
69
  end
70
70
  end
@@ -1,3 +1,3 @@
1
1
  module GovukPublishingComponents
2
- VERSION = "59.0.1".freeze
2
+ VERSION = "59.1.0".freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: govuk_publishing_components
3
3
  version: !ruby/object:Gem::Version
4
- version: 59.0.1
4
+ version: 59.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GOV.UK Dev
@@ -2186,7 +2186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
2186
2186
  - !ruby/object:Gem::Version
2187
2187
  version: '0'
2188
2188
  requirements: []
2189
- rubygems_version: 3.7.0
2189
+ rubygems_version: 3.7.1
2190
2190
  specification_version: 4
2191
2191
  summary: A gem to document components in GOV.UK frontend applications
2192
2192
  test_files: []