@koda-sl/baker-cli 0.448.0 → 0.449.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.
Files changed (72) hide show
  1. package/dist/{canvas-KTALW6HY.js → canvas-DPCBGW7K.js} +12 -12
  2. package/dist/{catalog-Y3XADCSY.js → catalog-ME44ZRZF.js} +4 -4
  3. package/dist/{chunk-JWI6GIFJ.js → chunk-2QHODRR6.js} +2 -2
  4. package/dist/{chunk-BAVBLIAD.js → chunk-54UVGFX3.js} +2 -2
  5. package/dist/{chunk-4D7UBVSG.js → chunk-5Y5UAJWD.js} +2 -2
  6. package/dist/{chunk-UQ4QIV56.js → chunk-647RO73Q.js} +2 -2
  7. package/dist/{chunk-OJ5R2OFK.js → chunk-FD27ZDVP.js} +3 -3
  8. package/dist/{chunk-BY6M3TE5.js → chunk-GBMP4F45.js} +10 -10
  9. package/dist/{chunk-PN4WWIHS.js → chunk-GLCPTMPG.js} +3 -3
  10. package/dist/{chunk-J4LSFZCF.js → chunk-IBURXTL4.js} +5 -5
  11. package/dist/{chunk-TD2CL5FE.js → chunk-J5IY3GVE.js} +3 -3
  12. package/dist/{chunk-5QGMMZFQ.js → chunk-K66OLA6Y.js} +2 -2
  13. package/dist/{chunk-W4VS475D.js → chunk-K7FZXIOZ.js} +2 -2
  14. package/dist/{chunk-Y6QAJNKP.js → chunk-KFE3S63W.js} +48 -18
  15. package/dist/chunk-KFE3S63W.js.map +1 -0
  16. package/dist/{chunk-Y5YBNAIS.js → chunk-TT5R35PJ.js} +6 -6
  17. package/dist/{chunk-Q43MLYXE.js → chunk-Z2EOC6PL.js} +2 -2
  18. package/dist/cli.js +3 -3
  19. package/dist/{creatives-AG6FCCHY.js → creatives-SJTJU6VT.js} +5 -5
  20. package/dist/{critique-D74VSOGJ.js → critique-65W63MFZ.js} +4 -4
  21. package/dist/engine/index.js +3 -3
  22. package/dist/{feedback-FFF3KELE.js → feedback-XNJQ63DS.js} +2 -2
  23. package/dist/{feedback-record-DTCSUXRO.js → feedback-record-FDLMWMDG.js} +6 -6
  24. package/dist/{fit-PXZSHQRM.js → fit-7237F5EB.js} +3 -3
  25. package/dist/{make-NHZAHTV4.js → make-LCNP76OF.js} +9 -9
  26. package/dist/{rerun-NTDXIB4E.js → rerun-CET74VPF.js} +11 -11
  27. package/dist/{run-MZ7JLI75.js → run-XQ7EM3JT.js} +11 -11
  28. package/dist/{scaffold-ad-M5CWSLZ4.js → scaffold-ad-U2KSHKBC.js} +8 -8
  29. package/dist/{scaffold-static-ad-QW3JWMXA.js → scaffold-static-ad-63LQKUSO.js} +13 -13
  30. package/dist/{scaffold-video-EVRMU6WP.js → scaffold-video-MUS6LHJQ.js} +8 -8
  31. package/dist/{select-VYPVEO5J.js → select-4Z7BW5RH.js} +6 -6
  32. package/dist/{set-prompt-VH3S47Z7.js → set-prompt-OB2V3XJP.js} +5 -5
  33. package/dist/{stale-LTRROC3C.js → stale-DAYXOY3Z.js} +5 -5
  34. package/dist/{sync-definition-TQDIRIR5.js → sync-definition-ILS2B2BJ.js} +8 -8
  35. package/dist/{translate-IHRONQW3.js → translate-TA5KQIU7.js} +8 -8
  36. package/dist/{validate-5MDFJ76K.js → validate-LDBAAXQO.js} +6 -6
  37. package/dist/{winning-ads-BXRQ7SBY.js → winning-ads-ASH5DSV3.js} +2 -2
  38. package/package.json +1 -1
  39. package/dist/chunk-Y6QAJNKP.js.map +0 -1
  40. /package/dist/{canvas-KTALW6HY.js.map → canvas-DPCBGW7K.js.map} +0 -0
  41. /package/dist/{catalog-Y3XADCSY.js.map → catalog-ME44ZRZF.js.map} +0 -0
  42. /package/dist/{chunk-JWI6GIFJ.js.map → chunk-2QHODRR6.js.map} +0 -0
  43. /package/dist/{chunk-BAVBLIAD.js.map → chunk-54UVGFX3.js.map} +0 -0
  44. /package/dist/{chunk-4D7UBVSG.js.map → chunk-5Y5UAJWD.js.map} +0 -0
  45. /package/dist/{chunk-UQ4QIV56.js.map → chunk-647RO73Q.js.map} +0 -0
  46. /package/dist/{chunk-OJ5R2OFK.js.map → chunk-FD27ZDVP.js.map} +0 -0
  47. /package/dist/{chunk-BY6M3TE5.js.map → chunk-GBMP4F45.js.map} +0 -0
  48. /package/dist/{chunk-PN4WWIHS.js.map → chunk-GLCPTMPG.js.map} +0 -0
  49. /package/dist/{chunk-J4LSFZCF.js.map → chunk-IBURXTL4.js.map} +0 -0
  50. /package/dist/{chunk-TD2CL5FE.js.map → chunk-J5IY3GVE.js.map} +0 -0
  51. /package/dist/{chunk-5QGMMZFQ.js.map → chunk-K66OLA6Y.js.map} +0 -0
  52. /package/dist/{chunk-W4VS475D.js.map → chunk-K7FZXIOZ.js.map} +0 -0
  53. /package/dist/{chunk-Y5YBNAIS.js.map → chunk-TT5R35PJ.js.map} +0 -0
  54. /package/dist/{chunk-Q43MLYXE.js.map → chunk-Z2EOC6PL.js.map} +0 -0
  55. /package/dist/{creatives-AG6FCCHY.js.map → creatives-SJTJU6VT.js.map} +0 -0
  56. /package/dist/{critique-D74VSOGJ.js.map → critique-65W63MFZ.js.map} +0 -0
  57. /package/dist/{feedback-FFF3KELE.js.map → feedback-XNJQ63DS.js.map} +0 -0
  58. /package/dist/{feedback-record-DTCSUXRO.js.map → feedback-record-FDLMWMDG.js.map} +0 -0
  59. /package/dist/{fit-PXZSHQRM.js.map → fit-7237F5EB.js.map} +0 -0
  60. /package/dist/{make-NHZAHTV4.js.map → make-LCNP76OF.js.map} +0 -0
  61. /package/dist/{rerun-NTDXIB4E.js.map → rerun-CET74VPF.js.map} +0 -0
  62. /package/dist/{run-MZ7JLI75.js.map → run-XQ7EM3JT.js.map} +0 -0
  63. /package/dist/{scaffold-ad-M5CWSLZ4.js.map → scaffold-ad-U2KSHKBC.js.map} +0 -0
  64. /package/dist/{scaffold-static-ad-QW3JWMXA.js.map → scaffold-static-ad-63LQKUSO.js.map} +0 -0
  65. /package/dist/{scaffold-video-EVRMU6WP.js.map → scaffold-video-MUS6LHJQ.js.map} +0 -0
  66. /package/dist/{select-VYPVEO5J.js.map → select-4Z7BW5RH.js.map} +0 -0
  67. /package/dist/{set-prompt-VH3S47Z7.js.map → set-prompt-OB2V3XJP.js.map} +0 -0
  68. /package/dist/{stale-LTRROC3C.js.map → stale-DAYXOY3Z.js.map} +0 -0
  69. /package/dist/{sync-definition-TQDIRIR5.js.map → sync-definition-ILS2B2BJ.js.map} +0 -0
  70. /package/dist/{translate-IHRONQW3.js.map → translate-TA5KQIU7.js.map} +0 -0
  71. /package/dist/{validate-5MDFJ76K.js.map → validate-LDBAAXQO.js.map} +0 -0
  72. /package/dist/{winning-ads-BXRQ7SBY.js.map → winning-ads-ASH5DSV3.js.map} +0 -0
@@ -25,22 +25,22 @@ Subcommands:
25
25
  Full guide: __tooling__/docs/tools/baker/canvas.md`
26
26
  },
27
27
  subCommands: {
28
- run: () => import("./run-MZ7JLI75.js").then((m) => m.runCommand),
29
- rerun: () => import("./rerun-NTDXIB4E.js").then((m) => m.rerunCommand),
30
- validate: () => import("./validate-5MDFJ76K.js").then((m) => m.validateCommand),
31
- critique: () => import("./critique-D74VSOGJ.js").then((m) => m.critiqueCommand),
28
+ run: () => import("./run-XQ7EM3JT.js").then((m) => m.runCommand),
29
+ rerun: () => import("./rerun-CET74VPF.js").then((m) => m.rerunCommand),
30
+ validate: () => import("./validate-LDBAAXQO.js").then((m) => m.validateCommand),
31
+ critique: () => import("./critique-65W63MFZ.js").then((m) => m.critiqueCommand),
32
32
  "viewer-check": () => import("./viewer-check-45T2HLAH.js").then((m) => m.viewerCheckCommand),
33
- catalog: () => import("./catalog-Y3XADCSY.js").then((m) => m.catalogCommand),
33
+ catalog: () => import("./catalog-ME44ZRZF.js").then((m) => m.catalogCommand),
34
34
  inspect: () => import("./inspect-Q5NHBBHX.js").then((m) => m.inspectCommand),
35
- "scaffold-ad": () => import("./scaffold-ad-M5CWSLZ4.js").then((m) => m.scaffoldAdCommand),
36
- "scaffold-video": () => import("./scaffold-video-EVRMU6WP.js").then((m) => m.scaffoldVideoCommand),
37
- "scaffold-static-ad": () => import("./scaffold-static-ad-QW3JWMXA.js").then((m) => m.scaffoldStaticAdCommand),
38
- "set-prompt": () => import("./set-prompt-VH3S47Z7.js").then((m) => m.setPromptCommand),
39
- "sync-definition": () => import("./sync-definition-TQDIRIR5.js").then((m) => m.syncDefinitionCommand),
40
- stale: () => import("./stale-LTRROC3C.js").then((m) => m.staleCommand)
35
+ "scaffold-ad": () => import("./scaffold-ad-U2KSHKBC.js").then((m) => m.scaffoldAdCommand),
36
+ "scaffold-video": () => import("./scaffold-video-MUS6LHJQ.js").then((m) => m.scaffoldVideoCommand),
37
+ "scaffold-static-ad": () => import("./scaffold-static-ad-63LQKUSO.js").then((m) => m.scaffoldStaticAdCommand),
38
+ "set-prompt": () => import("./set-prompt-OB2V3XJP.js").then((m) => m.setPromptCommand),
39
+ "sync-definition": () => import("./sync-definition-ILS2B2BJ.js").then((m) => m.syncDefinitionCommand),
40
+ stale: () => import("./stale-DAYXOY3Z.js").then((m) => m.staleCommand)
41
41
  }
42
42
  });
43
43
  export {
44
44
  canvasCommand
45
45
  };
46
- //# sourceMappingURL=canvas-KTALW6HY.js.map
46
+ //# sourceMappingURL=canvas-DPCBGW7K.js.map
@@ -2,10 +2,10 @@ import {
2
2
  catalogView,
3
3
  defaultRegistry,
4
4
  generateCatalog
5
- } from "./chunk-PN4WWIHS.js";
6
- import "./chunk-5QGMMZFQ.js";
5
+ } from "./chunk-GLCPTMPG.js";
6
+ import "./chunk-K66OLA6Y.js";
7
7
  import "./chunk-W3B4BHQU.js";
8
- import "./chunk-Y6QAJNKP.js";
8
+ import "./chunk-KFE3S63W.js";
9
9
  import "./chunk-DGCUPJZD.js";
10
10
  import "./chunk-VB6WJJR3.js";
11
11
  import "./chunk-CHSNHVYF.js";
@@ -62,4 +62,4 @@ var catalogCommand = defineCommand({
62
62
  export {
63
63
  catalogCommand
64
64
  };
65
- //# sourceMappingURL=catalog-Y3XADCSY.js.map
65
+ //# sourceMappingURL=catalog-ME44ZRZF.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  latestVersion
3
- } from "./chunk-4D7UBVSG.js";
3
+ } from "./chunk-5Y5UAJWD.js";
4
4
  import {
5
5
  canvasOutputsRoot
6
6
  } from "./chunk-DZSIUEGH.js";
@@ -16,4 +16,4 @@ async function versionOf(slug, run) {
16
16
  export {
17
17
  versionOf
18
18
  };
19
- //# sourceMappingURL=chunk-JWI6GIFJ.js.map
19
+ //# sourceMappingURL=chunk-2QHODRR6.js.map
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-DZSIUEGH.js";
7
7
  import {
8
8
  bytesOf
9
- } from "./chunk-Y6QAJNKP.js";
9
+ } from "./chunk-KFE3S63W.js";
10
10
  import {
11
11
  CONCEPT_CARRY_LEVELS
12
12
  } from "./chunk-VB6WJJR3.js";
@@ -437,4 +437,4 @@ export {
437
437
  fitReference,
438
438
  fitCommand
439
439
  };
440
- //# sourceMappingURL=chunk-BAVBLIAD.js.map
440
+ //# sourceMappingURL=chunk-54UVGFX3.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  prepareCanvas,
3
3
  unsuppliedPlaceholderAssets
4
- } from "./chunk-Q43MLYXE.js";
4
+ } from "./chunk-Z2EOC6PL.js";
5
5
  import {
6
6
  isSourceStale
7
7
  } from "./chunk-XF4JUKVF.js";
@@ -108,4 +108,4 @@ export {
108
108
  staleCreatives,
109
109
  clearLegacyDirtyMarker
110
110
  };
111
- //# sourceMappingURL=chunk-4D7UBVSG.js.map
111
+ //# sourceMappingURL=chunk-5Y5UAJWD.js.map
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  leadVersion,
7
7
  writeSeriesMemberCanvas
8
- } from "./chunk-J4LSFZCF.js";
8
+ } from "./chunk-IBURXTL4.js";
9
9
  import {
10
10
  definitionFieldsOf,
11
11
  setDefinitionFields,
@@ -89,4 +89,4 @@ export {
89
89
  makeSeriesAd,
90
90
  seriesMadeEnvelope
91
91
  };
92
- //# sourceMappingURL=chunk-UQ4QIV56.js.map
92
+ //# sourceMappingURL=chunk-647RO73Q.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  languageTag
3
- } from "./chunk-Q43MLYXE.js";
3
+ } from "./chunk-Z2EOC6PL.js";
4
4
  import {
5
5
  parseRefExpr
6
- } from "./chunk-5QGMMZFQ.js";
6
+ } from "./chunk-K66OLA6Y.js";
7
7
  import {
8
8
  AWARENESS_VALUES
9
9
  } from "./chunk-5HYSKH77.js";
@@ -301,4 +301,4 @@ export {
301
301
  buildInitialRunRecord,
302
302
  buildFailedRunRecord
303
303
  };
304
- //# sourceMappingURL=chunk-OJ5R2OFK.js.map
304
+ //# sourceMappingURL=chunk-FD27ZDVP.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  nodeParamsPreview
3
- } from "./chunk-W4VS475D.js";
3
+ } from "./chunk-K7FZXIOZ.js";
4
4
  import {
5
5
  outputRatioWarningsFor
6
- } from "./chunk-TD2CL5FE.js";
6
+ } from "./chunk-J5IY3GVE.js";
7
7
  import {
8
8
  waitForSheet
9
9
  } from "./chunk-WN4KX7GE.js";
@@ -30,7 +30,7 @@ import {
30
30
  variantImage,
31
31
  versionRun,
32
32
  writeSeriesMemberCanvas
33
- } from "./chunk-J4LSFZCF.js";
33
+ } from "./chunk-IBURXTL4.js";
34
34
  import {
35
35
  buildFailedRunRecord,
36
36
  buildInitialRunRecord,
@@ -39,7 +39,7 @@ import {
39
39
  finalFiles,
40
40
  finalOutputLabelsFromCanvas,
41
41
  nodeOutputsToRecord
42
- } from "./chunk-OJ5R2OFK.js";
42
+ } from "./chunk-FD27ZDVP.js";
43
43
  import {
44
44
  clearLegacyDirtyMarker,
45
45
  readRenderState,
@@ -48,7 +48,7 @@ import {
48
48
  recordReviewOutcome,
49
49
  recordSeriesLeadRun,
50
50
  recordSnapshot
51
- } from "./chunk-4D7UBVSG.js";
51
+ } from "./chunk-5Y5UAJWD.js";
52
52
  import {
53
53
  BRAND_LOGO_ROLE,
54
54
  CLAIMS_MODEL,
@@ -76,7 +76,7 @@ import {
76
76
  uncastPeople,
77
77
  wireNamedPeople,
78
78
  wireProofBadges
79
- } from "./chunk-Q43MLYXE.js";
79
+ } from "./chunk-Z2EOC6PL.js";
80
80
  import {
81
81
  advanceDefinitionStatus
82
82
  } from "./chunk-3ACMDRSE.js";
@@ -118,7 +118,7 @@ import {
118
118
  createEngineFromEnv,
119
119
  resolveConcurrency,
120
120
  ulid
121
- } from "./chunk-PN4WWIHS.js";
121
+ } from "./chunk-GLCPTMPG.js";
122
122
  import {
123
123
  BackendClient,
124
124
  LOGO_COMPOSITE_ROLE,
@@ -140,7 +140,7 @@ import {
140
140
  regenerateTargets,
141
141
  rolesById,
142
142
  staticMasterFormat
143
- } from "./chunk-5QGMMZFQ.js";
143
+ } from "./chunk-K66OLA6Y.js";
144
144
  import {
145
145
  requireCredentialsFromEnv
146
146
  } from "./chunk-W3B4BHQU.js";
@@ -152,7 +152,7 @@ import {
152
152
  reviewRenderedStatic,
153
153
  samePictureSizes,
154
154
  staticVerdict
155
- } from "./chunk-Y6QAJNKP.js";
155
+ } from "./chunk-KFE3S63W.js";
156
156
  import {
157
157
  AdSpecSchema,
158
158
  adSpecJsonSchema,
@@ -3144,4 +3144,4 @@ export {
3144
3144
  executeCanvasRun,
3145
3145
  buildBackendClient
3146
3146
  };
3147
- //# sourceMappingURL=chunk-BY6M3TE5.js.map
3147
+ //# sourceMappingURL=chunk-GBMP4F45.js.map
@@ -20,7 +20,7 @@ import {
20
20
  topologicalLayers,
21
21
  validateCanvas,
22
22
  validateCanvasDeep
23
- } from "./chunk-5QGMMZFQ.js";
23
+ } from "./chunk-K66OLA6Y.js";
24
24
  import {
25
25
  remoteCacheEnabledFromEnv
26
26
  } from "./chunk-W3B4BHQU.js";
@@ -38,7 +38,7 @@ import {
38
38
  roleKey,
39
39
  shownBoxes,
40
40
  withWordmark
41
- } from "./chunk-Y6QAJNKP.js";
41
+ } from "./chunk-KFE3S63W.js";
42
42
  import {
43
43
  frameGround,
44
44
  nativeSurfaceHtml,
@@ -5186,4 +5186,4 @@ export {
5186
5186
  defaultRegistry,
5187
5187
  createEngineFromEnv
5188
5188
  };
5189
- //# sourceMappingURL=chunk-PN4WWIHS.js.map
5189
+ //# sourceMappingURL=chunk-GLCPTMPG.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  finalOutputLabelsFromCanvas,
3
3
  parseDefinitionStrategyFields
4
- } from "./chunk-OJ5R2OFK.js";
4
+ } from "./chunk-FD27ZDVP.js";
5
5
  import {
6
6
  readRenderState
7
- } from "./chunk-4D7UBVSG.js";
7
+ } from "./chunk-5Y5UAJWD.js";
8
8
  import {
9
9
  STATIC_AD_ROLE,
10
10
  formatOfAdaptId,
@@ -12,7 +12,7 @@ import {
12
12
  isSignatureLine,
13
13
  sameTag,
14
14
  seriesMemberAd
15
- } from "./chunk-Q43MLYXE.js";
15
+ } from "./chunk-Z2EOC6PL.js";
16
16
  import {
17
17
  fetchRunRecord
18
18
  } from "./chunk-A4LOJ2VD.js";
@@ -31,7 +31,7 @@ import {
31
31
  nodesWithRole,
32
32
  relaidPictureRole,
33
33
  rolesById
34
- } from "./chunk-5QGMMZFQ.js";
34
+ } from "./chunk-K66OLA6Y.js";
35
35
  import {
36
36
  isAdSpec,
37
37
  readAdSpec
@@ -506,4 +506,4 @@ export {
506
506
  writeSeriesMemberCanvas,
507
507
  seriesRunHints
508
508
  };
509
- //# sourceMappingURL=chunk-J4LSFZCF.js.map
509
+ //# sourceMappingURL=chunk-IBURXTL4.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  loadCompositionMeta
3
- } from "./chunk-PN4WWIHS.js";
3
+ } from "./chunk-GLCPTMPG.js";
4
4
  import {
5
5
  parseRefExpr
6
- } from "./chunk-5QGMMZFQ.js";
6
+ } from "./chunk-K66OLA6Y.js";
7
7
  import {
8
8
  resolveAdaptFormats
9
9
  } from "./chunk-CHSNHVYF.js";
@@ -93,4 +93,4 @@ async function outputRatioWarningsFor(canvas, canvasPath) {
93
93
  export {
94
94
  outputRatioWarningsFor
95
95
  };
96
- //# sourceMappingURL=chunk-TD2CL5FE.js.map
96
+ //# sourceMappingURL=chunk-J5IY3GVE.js.map
@@ -7,7 +7,7 @@ import {
7
7
  safeRectPx,
8
8
  staticSafeArea,
9
9
  textMismatch
10
- } from "./chunk-Y6QAJNKP.js";
10
+ } from "./chunk-KFE3S63W.js";
11
11
  import {
12
12
  HAND_LETTERED,
13
13
  conceptSummary,
@@ -4380,4 +4380,4 @@ export {
4380
4380
  canSpellNumbers,
4381
4381
  spellNumber
4382
4382
  };
4383
- //# sourceMappingURL=chunk-5QGMMZFQ.js.map
4383
+ //# sourceMappingURL=chunk-K66OLA6Y.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  REF_PREFIX
3
- } from "./chunk-5QGMMZFQ.js";
3
+ } from "./chunk-K66OLA6Y.js";
4
4
 
5
5
  // src/commands/canvas/node-preview.ts
6
6
  var MAX_PARAMS_PREVIEW_LENGTH = 4e3;
@@ -57,4 +57,4 @@ ${body}` : header || body || compactJson(record);
57
57
  export {
58
58
  nodeParamsPreview
59
59
  };
60
- //# sourceMappingURL=chunk-W4VS475D.js.map
60
+ //# sourceMappingURL=chunk-K7FZXIOZ.js.map
@@ -222,11 +222,12 @@ var SPAN_SLACK = 2;
222
222
  var MIN_MATCH = 0.5;
223
223
  var ALLOWED_MATCH = 0.8;
224
224
  function normalizeCopy(text) {
225
- return text.replace(/[™®℠©]/g, "").normalize("NFKC").toLowerCase().replace(/[’'`´ʼ‘]/g, "").replace(/\s*&\s*/g, " and ").replace(/[^\p{L}\p{N}%€$£]+/gu, " ").trim();
225
+ return text.replace(/[™®℠©]/g, "").normalize("NFKC").toLowerCase().replace(/[’'`´ʼ‘]/g, "").replace(/\s*&\s*/g, " and ").replace(/[^\p{L}\p{N}%€$£]+/gu, " ").replace(new RegExp("(\\p{N})([%\u20AC$\xA3])", "gu"), "$1 $2").replace(new RegExp("([\u20AC$\xA3])(\\p{N})", "gu"), "$1 $2").trim();
226
226
  }
227
+ var CLOCK = /^\d{1,2}:\d{2}(?:\s?[ap]\.?\s?m\.?)?$/i;
227
228
  function isInterfaceChrome(raw) {
228
229
  const text = raw.trim();
229
- if (/^\d{1,2}:\d{2}(?:\s?[ap]\.?\s?m\.?)?$/i.test(text)) return true;
230
+ if (CLOCK.test(text)) return true;
230
231
  if (/^\d{1,3}$/.test(text)) return true;
231
232
  return new RegExp("^\\p{L}$", "u").test(text);
232
233
  }
@@ -333,6 +334,23 @@ function hyphenatedCompounds(texts) {
333
334
  }
334
335
  return out;
335
336
  }
337
+ var LIST_MARKER = /^\s*(\d{1,2})[.)]\s+(?=\S)/u;
338
+ var listMarker = (text) => text.match(LIST_MARKER)?.[1] ?? null;
339
+ var withoutListMarker = (text) => text.replace(LIST_MARKER, "");
340
+ function trademarked(texts) {
341
+ const out = /* @__PURE__ */ new Set();
342
+ for (const text of texts) {
343
+ for (const [, word = ""] of text.matchAll(/([\p{L}\p{N}]+)\s?[®™]/gu)) out.add(word.toLowerCase());
344
+ }
345
+ return out;
346
+ }
347
+ function withoutTrademarkLetters(text, marked) {
348
+ if (marked.size === 0) return text;
349
+ return text.replace(
350
+ /([\p{L}\p{N}]+)\s?(?:\((?:r|tm)\)|r|tm)(?![\p{L}\p{N}])/giu,
351
+ (whole, word) => marked.has(word.toLowerCase()) ? word : whole
352
+ );
353
+ }
336
354
  function joinHyphenBreaks(texts, compounds) {
337
355
  const out = [];
338
356
  let carry = "";
@@ -358,14 +376,17 @@ function lineParts(text) {
358
376
  }
359
377
  function textMismatch(expected, boxes, opts = {}) {
360
378
  const compounds = hyphenatedCompounds(expected.map((line) => line.text));
361
- const texts = readingOrder(boxes.filter((b) => b.kind === "text")).map((b) => b.text);
379
+ const clockAsked = expected.some((line) => CLOCK.test(line.text.trim()));
380
+ const read = boxes.filter((b) => b.kind === "text" && (clockAsked || !CLOCK.test(b.text.trim())));
381
+ const texts = readingOrder(read).map((b) => b.text);
362
382
  const joined = joinHyphenBreaks(texts, compounds);
383
+ const marked = trademarked(expected.map((line) => line.text));
363
384
  const words = joined.flatMap(
364
- (text, box) => normalizeCopy(text).split(" ").filter((word) => word.length > 0).map((word) => ({ word, box }))
385
+ (text, box) => normalizeCopy(withoutTrademarkLetters(text, marked)).split(" ").filter((word) => word.length > 0).map((word) => ({ word, box }))
365
386
  );
366
387
  const claimed = /* @__PURE__ */ new Set();
367
388
  const parts = expected.flatMap(
368
- (line, lineIndex) => lineParts(line.text).map((text) => ({ lineIndex, text: normalizeCopy(text) }))
389
+ (line, lineIndex) => lineParts(line.text).map((text) => ({ lineIndex, text: normalizeCopy(withoutListMarker(text)) }))
369
390
  );
370
391
  const matches = assign(
371
392
  parts.map((part) => part.text),
@@ -373,7 +394,8 @@ function textMismatch(expected, boxes, opts = {}) {
373
394
  claimed,
374
395
  MIN_MATCH
375
396
  );
376
- const allowed = (opts.allowed ?? []).map(normalizeCopy).filter((a) => a.length > 0);
397
+ const markers = expected.flatMap((line) => lineParts(line.text).flatMap((text) => listMarker(text) ?? []));
398
+ const allowed = [...opts.allowed ?? [], ...markers].map(normalizeCopy).filter((a) => a.length > 0);
377
399
  for (let before = -1; claimed.size !== before; ) {
378
400
  before = claimed.size;
379
401
  assign(allowed, words, claimed, ALLOWED_MATCH);
@@ -391,8 +413,8 @@ function textMismatch(expected, boxes, opts = {}) {
391
413
  if (lineMatches.length === 0) return [];
392
414
  const score = Math.min(...lineMatches.map((match) => match?.similarity ?? 0));
393
415
  if (score >= 1 - MAX_LINE_DISTANCE) return [];
394
- const read = lineMatches.flatMap((match) => match ? [match.span.text] : []).join(" ");
395
- return [{ ...line, read: read.length > 0 ? read : null, similarity: score }];
416
+ const read2 = lineMatches.flatMap((match) => match ? [match.span.text] : []).join(" ");
417
+ return [{ ...line, read: read2.length > 0 ? read2 : null, similarity: score }];
396
418
  });
397
419
  const extra = [];
398
420
  words.forEach(({ word, box }, index) => {
@@ -405,7 +427,7 @@ function textMismatch(expected, boxes, opts = {}) {
405
427
  extra.push({ text: word, box });
406
428
  }
407
429
  });
408
- const unasked = extra.filter((chunk) => !isInterfaceChrome(joined[chunk.box] ?? "")).map((chunk) => chunk.text);
430
+ const unasked = extra.filter((chunk) => !isInterfaceChrome(joined[chunk.box] ?? "")).map((chunk) => chunk.text.replace(new RegExp("(\\p{N}) ([%\u20AC$\xA3])", "gu"), "$1$2").replace(new RegExp("([\u20AC$\xA3]) (\\p{N})", "gu"), "$1$2"));
409
431
  return { ok: lines.length === 0 && unasked.length === 0, lines, extra: unasked };
410
432
  }
411
433
 
@@ -640,7 +662,7 @@ var CopyRead = z2.object({
640
662
  seen: z2.string().nullable()
641
663
  });
642
664
  function comparableCopy(text) {
643
- return text.replace(/[‘’‚′]/g, "'").replace(/[“”„″]/g, '"').replace(/[‐-―−]/g, "-").replace(/…/g, "...").replace(/[«»]/g, '"').replace(/\s+/g, " ").trim().replace(/^"([^"]*)"$/, "$1").trim().toLowerCase();
665
+ return text.replace(/[‘’‚′]/g, "'").replace(/[“”„″]/g, '"').replace(/[‐-―−]/g, "-").replace(/…/g, "...").replace(/[«»]/g, '"').replace(/\s*[·•]\s*/g, " ").replace(/\s+/g, " ").replace(/ (?=[%€$£:;!?])/g, "").replace(/(?<=[€$£]) (?=\d)/g, "").trim().replace(/^"([^"]*)"$/, "$1").trim().toLowerCase();
644
666
  }
645
667
  function copyFindings(json, copy, formats, scrolled = {}) {
646
668
  if (copy.length === 0) return [];
@@ -881,9 +903,10 @@ var folded = (text) => normalizeCopy(text).normalize("NFD").replace(new RegExp("
881
903
  var MISSPELT_NAME = 0.7;
882
904
  function misspeltNames(texts, names) {
883
905
  const out = [];
906
+ const distinct = names.filter((name, i) => names.findIndex((n) => folded(n) === folded(name)) === i);
884
907
  for (const chunk of texts) {
885
908
  const words = folded(chunk).split(" ").filter(Boolean);
886
- for (const name of names) {
909
+ for (const name of distinct) {
887
910
  const want = folded(name);
888
911
  const size = want.split(" ").length;
889
912
  if (want.length < 4) continue;
@@ -921,8 +944,9 @@ function typeScaleFindings(format, lines, boxes) {
921
944
  const ratio = ratioOf(format);
922
945
  if (ratio === null) return [];
923
946
  const lead = leadLine(lines);
947
+ const leadsWithHeadline = lead !== void 0 && HEADLINE_ROLES.has(roleKey(lead.role));
924
948
  const supporting = lines.filter(
925
- (l) => l !== lead && l.lettering === "designed" && !BUTTON_ROLES.has(roleKey(l.role)) && !FINE_PRINT_ROLES.has(roleKey(l.role))
949
+ (l) => l !== lead && !(leadsWithHeadline && HEADLINE_ROLES.has(roleKey(l.role))) && l.lettering === "designed" && !BUTTON_ROLES.has(roleKey(l.role)) && !FINE_PRINT_ROLES.has(roleKey(l.role))
926
950
  );
927
951
  const out = [];
928
952
  const leadHeight = lead ? tallest(lead, boxes) : null;
@@ -1015,7 +1039,7 @@ function contextItems(opts) {
1015
1039
  opts.thumbnails ? "7. THUMBNAIL: at thumbnail size the lead line (the largest words) cannot be read. Judge only whether those words can be read, nothing else. That is blocking: most people only ever see the ad that small." : "7. THUMBNAIL: the lead line (the largest words) would be unreadable on a phone feed. That is blocking."
1016
1040
  ],
1017
1041
  sizes: opts.formats.length > 1 ? [
1018
- "12. SIZES: one size loses what the others are built on: the letter sheet, the email or chat window, the post card, the comic's panels and their order, the product the ad is about, or a size that shows something the others do not (blocking; report it on the size that differs). Rearranged for its shape is fine."
1042
+ "12. SIZES: one size loses what the others are built on: the letter sheet, the email or chat window, the post card, the comic's panels and their order, the product the ad is about (blocking; report it on the size that differs). A size that shows more of the scene (words on a prop now readable, more of the room), or is arranged, sized or decorated differently for its shape (a title without its frame, an extra brand shape filling the height), is never a finding."
1019
1043
  ] : []
1020
1044
  };
1021
1045
  }
@@ -1072,6 +1096,7 @@ function mostOfALine(chunk, copy) {
1072
1096
  var SIGN_CLAIM = /[%\p{Sc}]/u;
1073
1097
  var PRICE = /[€$£]\s?\d|\d\s?[€$£]/;
1074
1098
  var COPY_SIZE_SHARE = 0.8;
1099
+ var HEADLINE_SIZE_SHARE = 0.8;
1075
1100
  function extraWordFindings(format, extra, boxes, copyBoxes, offers) {
1076
1101
  if (extra.length === 0) return [];
1077
1102
  const heights = copyBoxes.map((b) => b.y1 - b.y0).filter((h) => h > 0);
@@ -1079,15 +1104,20 @@ function extraWordFindings(format, extra, boxes, copyBoxes, offers) {
1079
1104
  const boxOf = (chunk) => boxes.find((b) => b.kind === "text" && normalizeCopy(b.text).includes(normalizeCopy(chunk)));
1080
1105
  const height = (chunk) => {
1081
1106
  const box = boxOf(chunk);
1082
- return box === void 0 ? Number.POSITIVE_INFINITY : box.y1 - box.y0;
1107
+ return box === void 0 ? null : box.y1 - box.y0;
1083
1108
  };
1084
1109
  const sorted = [...heights].sort((a, b) => a - b);
1085
1110
  const usual = sorted[Math.floor(sorted.length / 2)] ?? 0;
1086
- const underCopy = extra.filter((chunk) => height(chunk) < usual * COPY_SIZE_SHARE);
1087
- const scenery = (chunk) => height(chunk) < smallest * SCENE_PRINT_SCALE || underCopy.length >= SCENE_BLOCK_LINES && underCopy.includes(chunk);
1111
+ const tallest2 = sorted.at(-1) ?? 0;
1112
+ const underCopy = extra.filter((chunk) => (height(chunk) ?? 0) < usual * COPY_SIZE_SHARE);
1113
+ const scenery = (chunk) => {
1114
+ const h = height(chunk);
1115
+ return h !== null && h < smallest * SCENE_PRINT_SCALE || underCopy.length >= SCENE_BLOCK_LINES && underCopy.includes(chunk);
1116
+ };
1117
+ const belowHeadline = (chunk) => (height(chunk) ?? 0) < tallest2 * HEADLINE_SIZE_SHARE;
1088
1118
  const offered = new Set([...offers].map(normalizeCopy));
1089
1119
  const claims = (chunk) => SIGN_CLAIM.test(chunk) || offered.has(normalizeCopy(chunk));
1090
- const printed = (chunk) => usual > 0 && underCopy.includes(chunk) && (!claims(chunk) || scenery(chunk));
1120
+ const printed = (chunk) => usual > 0 && belowHeadline(chunk) && (!claims(chunk) || underCopy.includes(chunk) && scenery(chunk));
1091
1121
  const quote = (chunks) => chunks.map((e) => `"${e}"`).join(", ");
1092
1122
  const asCopy = extra.filter((chunk) => !printed(chunk));
1093
1123
  const prices = extra.filter((chunk) => printed(chunk) && PRICE.test(chunk));
@@ -1408,4 +1438,4 @@ export {
1408
1438
  checkStaticImage,
1409
1439
  reviewRenderedStatic
1410
1440
  };
1411
- //# sourceMappingURL=chunk-Y6QAJNKP.js.map
1441
+ //# sourceMappingURL=chunk-KFE3S63W.js.map