hyperframes 0.8.150 → 0.8.152

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 (193) hide show
  1. package/dist/{add-3ZIFEN2U.js → add-SA33REHW.js} +14 -14
  2. package/dist/{animatedGifPrep-77LPFLKJ.js → animatedGifPrep-3YXJQZ7L.js} +9 -9
  3. package/dist/api.js +19 -19
  4. package/dist/{asset-EYSZEHM6.js → asset-PUVPTWPD.js} +2 -2
  5. package/dist/{assetCataloger-KX3HD7ZI.js → assetCataloger-VWE2PLBX.js} +4 -4
  6. package/dist/{auth-L6IWNRXY.js → auth-PS3M6AI7.js} +1 -1
  7. package/dist/{autoUpdate-2O3HZB65.js → autoUpdate-CMO4SHWU.js} +2 -2
  8. package/dist/{backgroundChecks-BH2LMJYE.js → backgroundChecks-EDZ2A55J.js} +3 -3
  9. package/dist/backgroundChecksWorker.js +3 -3
  10. package/dist/{batchRender-ZBKAYLWU.js → batchRender-7PLJISCN.js} +5 -5
  11. package/dist/{beats-IVLF2566.js → beats-2MDSIOE7.js} +15 -15
  12. package/dist/{benchmark-SYZFW2G7.js → benchmark-KBBXAPI4.js} +10 -10
  13. package/dist/{browser-OSW3L25S.js → browser-OMWKZRSW.js} +5 -5
  14. package/dist/{bundleWithLocalizedFonts-I4CWOXLK.js → bundleWithLocalizedFonts-76DMCRIW.js} +2 -2
  15. package/dist/{capture-AZOQ57TM.js → capture-LRUUXH5Q.js} +2 -2
  16. package/dist/{capture-V5ICGSVJ.js → capture-YGDC7GN3.js} +13 -13
  17. package/dist/{catalog-VBJOA2Y5.js → catalog-SMEBKEVO.js} +14 -14
  18. package/dist/{catch-up-TKSEDNJK.js → catch-up-OMILX3WE.js} +4 -4
  19. package/dist/{check-3HFISKDB.js → check-NUZ62LIW.js} +288 -64
  20. package/dist/{checkBrowser-MXBDNZJB.js → checkBrowser-MSTVEL4V.js} +181 -38
  21. package/dist/{chunk-73RBX2E7.js → chunk-3DZBQ7MH.js} +3 -3
  22. package/dist/{chunk-6QB7F2II.js → chunk-3E4OCOC5.js} +1 -1
  23. package/dist/{chunk-OQ7XMM3S.js → chunk-3HPJM5IQ.js} +1 -1
  24. package/dist/{chunk-UJB7356Y.js → chunk-3LO7BBJX.js} +3 -3
  25. package/dist/{chunk-APDLWWFG.js → chunk-3VGU2SH7.js} +1 -1
  26. package/dist/{chunk-DUUFDLC4.js → chunk-4MLYMDQ4.js} +1 -1
  27. package/dist/{chunk-AXPNVC3N.js → chunk-4UMKAUZI.js} +1 -1
  28. package/dist/{chunk-XPQSL5VS.js → chunk-54DMWFQZ.js} +8 -1
  29. package/dist/chunk-57GN6KWT.js +179 -0
  30. package/dist/{chunk-374QQGBQ.js → chunk-5CS4T6C6.js} +63 -12
  31. package/dist/{chunk-PCWOSS7G.js → chunk-5ERVRJMV.js} +3 -3
  32. package/dist/{chunk-TZPZE5PS.js → chunk-5VMSUW4Z.js} +6 -3
  33. package/dist/{chunk-M6UDJ2E7.js → chunk-6Z4YJ5Q3.js} +3 -3
  34. package/dist/{chunk-FJWEYVEM.js → chunk-7FYFEXD2.js} +658 -198
  35. package/dist/{chunk-UQYQ7TBA.js → chunk-7NPSXBIN.js} +2 -2
  36. package/dist/chunk-7TASSBN2.js +215 -0
  37. package/dist/{chunk-F2RLIE7P.js → chunk-ANS56TPS.js} +11 -11
  38. package/dist/{chunk-DOVJRUFM.js → chunk-BQK3J7XO.js} +1 -1
  39. package/dist/{chunk-FPAT5HTI.js → chunk-BYJYQWEX.js} +10 -10
  40. package/dist/{chunk-XXPYZBZ3.js → chunk-C6TPGUWD.js} +2 -2
  41. package/dist/{chunk-XQMEGSHG.js → chunk-D6RJXQLD.js} +1 -1
  42. package/dist/{chunk-RW7NLGPD.js → chunk-DFXK7KUO.js} +25 -17
  43. package/dist/{chunk-6SFPQ2RZ.js → chunk-E6EYZ33P.js} +2 -2
  44. package/dist/{chunk-AKYQGZLU.js → chunk-EVTHG34H.js} +2 -2
  45. package/dist/{chunk-5NAYNDBT.js → chunk-EXH6L2XZ.js} +6 -2
  46. package/dist/{chunk-AIJS74LG.js → chunk-FFDC5OWV.js} +8 -2
  47. package/dist/{chunk-4WFNTWKZ.js → chunk-FNN5QINS.js} +2 -2
  48. package/dist/{chunk-DMKI64EZ.js → chunk-FSZAFCU7.js} +1 -1
  49. package/dist/{chunk-S5F26DUL.js → chunk-GQETH4PE.js} +3 -3
  50. package/dist/{chunk-3UAIVF4L.js → chunk-H2SGM2V2.js} +1 -1
  51. package/dist/{chunk-O4DC5CHF.js → chunk-H7FXBK3Q.js} +1 -1
  52. package/dist/{chunk-UVVI2NJQ.js → chunk-HBCRRCTX.js} +109 -31
  53. package/dist/{chunk-NFQY7EIC.js → chunk-IBYC3VUA.js} +1 -1
  54. package/dist/{chunk-2KAL22B5.js → chunk-IEDT4EXE.js} +1 -1
  55. package/dist/{chunk-I6DATIHC.js → chunk-IZIRIDJH.js} +2 -2
  56. package/dist/{chunk-Z6WZDGCS.js → chunk-IZKXUYZE.js} +2 -2
  57. package/dist/chunk-KCFF4ENE.js +24 -0
  58. package/dist/{chunk-6KWA3XPS.js → chunk-KZ3L3W4Q.js} +1 -1
  59. package/dist/{chunk-7IEGPJ4P.js → chunk-LBT4AMSF.js} +1 -1
  60. package/dist/{chunk-7JTFPUMA.js → chunk-LECTCGGS.js} +1 -1
  61. package/dist/{chunk-7E4VHPKJ.js → chunk-LVPSWUS6.js} +5 -5
  62. package/dist/{chunk-6NPFJ255.js → chunk-MNHPG2UO.js} +1 -1
  63. package/dist/{chunk-FN6KAS7A.js → chunk-NHAG2KCE.js} +7 -7
  64. package/dist/{chunk-423DJVX2.js → chunk-PKO2EWO7.js} +1 -1
  65. package/dist/{chunk-ZNHAJCEA.js → chunk-PRXAOZWZ.js} +28 -13
  66. package/dist/{chunk-VQ7YIURZ.js → chunk-PTXZDSW5.js} +5 -5
  67. package/dist/{chunk-XANZ4R4P.js → chunk-QECEOV6W.js} +3 -3
  68. package/dist/{chunk-BLRJKBKP.js → chunk-QESSGUKX.js} +1 -1
  69. package/dist/{chunk-WLIUULZQ.js → chunk-RN5I2DP5.js} +29 -15
  70. package/dist/chunk-S3RCK56N.js +3795 -0
  71. package/dist/{chunk-UAIUVPZE.js → chunk-SWCSL6WS.js} +6 -6
  72. package/dist/{chunk-2PSPARWP.js → chunk-TYXH3EKP.js} +4 -0
  73. package/dist/{chunk-FMNVTKX2.js → chunk-U3BCDVZO.js} +1 -1
  74. package/dist/{chunk-LW5VFBSY.js → chunk-VS732BUG.js} +1 -1
  75. package/dist/{chunk-LFNQDTSH.js → chunk-VYKPBRCB.js} +63 -12
  76. package/dist/{chunk-M5B42RL5.js → chunk-WUUOFMHU.js} +3 -3
  77. package/dist/{chunk-A6ZO4BX7.js → chunk-XEFFJRYX.js} +2 -2
  78. package/dist/{chunk-EL5QVJEG.js → chunk-XINGD6MS.js} +4 -4
  79. package/dist/chunk-XSEGMQYA.js +30 -0
  80. package/dist/{chunk-CZQLCBWY.js → chunk-YG2Y55KF.js} +1 -1
  81. package/dist/{chunk-B3XLIBFL.js → chunk-YIJMVFEJ.js} +1 -1
  82. package/dist/{chunk-JDB65PPT.js → chunk-YOEGUBBY.js} +13 -12
  83. package/dist/{chunk-AFRXL75S.js → chunk-YYEYOFHW.js} +1 -1
  84. package/dist/{chunk-R5A7454P.js → chunk-ZTM3RMAD.js} +2 -2
  85. package/dist/{clean-7HU7S7DT.js → clean-F75G45BI.js} +56 -35
  86. package/dist/cli.js +53 -53
  87. package/dist/{cloud-HAXHBO25.js → cloud-KVJAOUWH.js} +4 -4
  88. package/dist/{cloudrun-A3PIJ6DX.js → cloudrun-Q7Q7O4GY.js} +6 -6
  89. package/dist/{compare-6IPSQMSM.js → compare-DGUJ4QWU.js} +30 -30
  90. package/dist/{compiler-UQP2VXN6.js → compiler-NCN6PTVH.js} +6 -6
  91. package/dist/{component-FF3AU24M.js → component-PSYGT3JV.js} +3 -3
  92. package/dist/{compositions-JSH4MZXB.js → compositions-J3GAETIC.js} +13 -13
  93. package/dist/{delete-G763SW64.js → delete-MR7LRGRP.js} +2 -2
  94. package/dist/{deterministicFonts-C5JQLCTS.js → deterministicFonts-EOMDR6ZF.js} +3 -3
  95. package/dist/{dist-HUMFCJ6T.js → dist-2YYJYYPY.js} +3 -3
  96. package/dist/{dist-Z7Q3JS7K.js → dist-3MHXG6EJ.js} +4 -4
  97. package/dist/{doctor-WZB6WMBY.js → doctor-JOUGR5UK.js} +15 -15
  98. package/dist/{events-T4YFQC5G.js → events-63BKDWVO.js} +3 -3
  99. package/dist/{events-MUWJJCC7.js → events-FZFBJCIH.js} +2 -2
  100. package/dist/{feedback-AUTHQNN2.js → feedback-QLKWUDXR.js} +8 -8
  101. package/dist/{ffmpeg-TZB5WAYE.js → ffmpeg-MJFMBBSF.js} +2 -2
  102. package/dist/{figma-NBG6WBI7.js → figma-YJ7HGVQC.js} +3 -3
  103. package/dist/fontLocalizeCli.js +12 -12
  104. package/dist/{get-OXBJLKLV.js → get-54MUUXMR.js} +2 -2
  105. package/dist/{gpuPolicy-HBCCEQUS.js → gpuPolicy-5OVNR75D.js} +9 -9
  106. package/dist/{grade-compare-2LX4FDH7.js → grade-compare-7IDUF673.js} +32 -32
  107. package/dist/{gsapParserAcorn-VXZ3ZIF2.js → gsapParserAcorn-7NCK2LVT.js} +2 -2
  108. package/dist/{help-LJI46EDO.js → help-GQFYO5LU.js} +1 -1
  109. package/dist/{history-MFKAQEHU.js → history-UI3O7CSO.js} +77 -205
  110. package/dist/hyperframe-runtime.js +54 -54
  111. package/dist/hyperframe.manifest.json +1 -1
  112. package/dist/hyperframe.runtime.iife.js +54 -54
  113. package/dist/hyperframes-player.global.js +3 -3
  114. package/dist/{info-D6Y5O2QE.js → info-VQV3APEX.js} +9 -9
  115. package/dist/{init-47NZPEBI.js → init-2UBFV5D7.js} +31 -31
  116. package/dist/{inspect-U5UXJK5D.js → inspect-36ACJ3CO.js} +31 -31
  117. package/dist/{installer-AW7VFVTQ.js → installer-GDUZDJG4.js} +7 -7
  118. package/dist/{keyframes-5G334NWB.js → keyframes-GPBU34BG.js} +227 -82
  119. package/dist/{lambda-GASGXN3A.js → lambda-CBJVLTHY.js} +7 -7
  120. package/dist/{layout-OXAQFLJS.js → layout-2IHFV6EI.js} +31 -31
  121. package/dist/{lint-F36QFSNF.js → lint-IR6IYCEO.js} +9 -9
  122. package/dist/{lintProject-SSEXWCH6.js → lintProject-XQWXJYSC.js} +3 -3
  123. package/dist/{list-TR6QCI53.js → list-UAGKWARH.js} +2 -2
  124. package/dist/{login-6LA2RWTC.js → login-2GYCNCZF.js} +4 -4
  125. package/dist/{manager-ES2UFT4X.js → manager-X44GKUEL.js} +3 -3
  126. package/dist/{manager-GWU5J6RJ.js → manager-ZLJD3EAY.js} +2 -2
  127. package/dist/{media-treatment-BOHYDWVY.js → media-treatment-Z553F7XI.js} +14 -14
  128. package/dist/{models-6GW5Q3IW.js → models-6AZTNNSO.js} +15 -15
  129. package/dist/{motionShot-O7AOMPUN.js → motionShot-ARRL7WXT.js} +29 -16
  130. package/dist/{normalize-audio-UO5B4O76.js → normalize-audio-CME4NUB6.js} +6 -6
  131. package/dist/{open-JV2EHVKM.js → open-HU2VXUFD.js} +4 -4
  132. package/dist/{parakeetRunner-23DZUF6G.js → parakeetRunner-X5MKFMCB.js} +16 -16
  133. package/dist/{pipeline-KTICSIK7.js → pipeline-MNFTEBJU.js} +11 -11
  134. package/dist/{play-CMUYPXBC.js → play-2BBJDDAZ.js} +24 -24
  135. package/dist/{preflight-JOD4OXGC.js → preflight-JYOX64YP.js} +4 -4
  136. package/dist/{present-ZDT5FM2H.js → present-OE2WL2NY.js} +20 -20
  137. package/dist/{preview-ASHLGKDD.js → preview-RYSCCAWJ.js} +21 -21
  138. package/dist/{producer-FFH2KUAZ.js → producer-SQWNRO66.js} +1 -1
  139. package/dist/{projectConfig-FHIAOPKW.js → projectConfig-B55Z7YKQ.js} +9 -9
  140. package/dist/{publication-WO5ZXURT.js → publication-MDZCOBJP.js} +4 -4
  141. package/dist/{publish-QWO2W7FB.js → publish-AILV36BO.js} +12 -12
  142. package/dist/{remove-background-BO5MQR25.js → remove-background-6F72LKHG.js} +12 -12
  143. package/dist/{render-XTJKGT3G.js → render-2MZKU3L5.js} +10 -10
  144. package/dist/{render-SDHFXL3Y.js → render-5EREH6YD.js} +95 -37
  145. package/dist/{render-HS3YOLSD.js → render-6GH5FSXU.js} +5 -5
  146. package/dist/{render-batch-J64AJHQY.js → render-batch-UMBUQWWS.js} +5 -5
  147. package/dist/renderSetupWorker.js +6 -6
  148. package/dist/{resolver-IHNWMDJA.js → resolver-KO6WWO5P.js} +6 -6
  149. package/dist/{sherpa-FXBBYMDR.js → sherpa-DADGYWNR.js} +15 -15
  150. package/dist/skills/hyperframes/references/frame-worker-core.md +11 -9
  151. package/dist/skills/hyperframes/references/subagent-dispatch.md +1 -1
  152. package/dist/skills/hyperframes-cli/SKILL.md +3 -0
  153. package/dist/skills/hyperframes-cli/references/lint-validate-inspect.md +5 -1
  154. package/dist/skills/media-use/audio/scripts/lib/tts.cleanup.test.mjs +175 -0
  155. package/dist/skills/media-use/audio/scripts/lib/tts.mjs +24 -19
  156. package/dist/skills/media-use/references/grading.md +1 -2
  157. package/dist/skills/media-use/references/meta.md +17 -17
  158. package/dist/skills/media-use/references/operations.md +6 -6
  159. package/dist/skills/media-use/references/setup-providers.md +3 -4
  160. package/dist/skills/media-use/scripts/lib/cutlist.mjs +9 -2
  161. package/dist/skills/media-use/scripts/lib/cutlist.test.mjs +12 -0
  162. package/dist/skills/media-use/scripts/lib/telemetry.mjs +4 -1
  163. package/dist/skills/media-use/scripts/lib/telemetry.test.mjs +20 -0
  164. package/dist/skills/media-use/scripts/transcript-cut.mjs +23 -4
  165. package/dist/skills/media-use/scripts/transcript-cut.test.mjs +224 -0
  166. package/dist/{skills-ALLSN7TB.js → skills-QLKSNU4Y.js} +5 -5
  167. package/dist/{skillsUpdateCheck-EIT5NWM6.js → skillsUpdateCheck-Z2QQGF2W.js} +3 -3
  168. package/dist/{snapshot-Y3I76OIZ.js → snapshot-D5BBFXOS.js} +342 -154
  169. package/dist/{src-7V6LBC56.js → src-AVQBAECC.js} +10 -8
  170. package/dist/{src-S5IZVJUX.js → src-V7263E47.js} +11 -11
  171. package/dist/{staticProjectServer-QLWWGHZE.js → staticProjectServer-HNWSVEWN.js} +20 -20
  172. package/dist/studio/assets/{hyperframes-player-kup62bDR.js → hyperframes-player-0BY7-PK7.js} +1 -1
  173. package/dist/studio/assets/{index-B8BBYY8L.js → index-COrWdzlj.js} +1 -1
  174. package/dist/studio/assets/{index-CS_m0TkX.js → index-p-VXwuJ2.js} +132 -132
  175. package/dist/studio/assets/{index-DQ5jGodF.js → index-rmD5k_ES.js} +1 -1
  176. package/dist/studio/index.html +1 -1
  177. package/dist/{studio-api-UBFLZ3DA.js → studio-api-UXKTDWLT.js} +30 -16
  178. package/dist/{studioServer-REOVCIFP.js → studioServer-JOVR24O3.js} +51 -51
  179. package/dist/{synthesize-22B7L5GX.js → synthesize-MBDVUSH3.js} +2 -1
  180. package/dist/{telemetry-C3GDIXHO.js → telemetry-UW7XAM5W.js} +3 -3
  181. package/dist/{timeline-H42EGLMT.js → timeline-JSGTZ3AN.js} +73 -20
  182. package/dist/{tokens-2K7ISTKV.js → tokens-ADDBGTQ7.js} +2 -2
  183. package/dist/{transcribe-NUPASAUP.js → transcribe-FEHOK626.js} +14 -14
  184. package/dist/{transcribe-DVM7UFZZ.js → transcribe-P6MJGSZJ.js} +20 -20
  185. package/dist/{tts-QSAQZVEZ.js → tts-POI553RG.js} +1 -1
  186. package/dist/{updateCheck-3RWFSEZD.js → updateCheck-IBWMLXQ4.js} +2 -2
  187. package/dist/{upgrade-YKKL36N7.js → upgrade-NHZ7AYPO.js} +2 -2
  188. package/dist/{urlDownloader-6JNJYLPN.js → urlDownloader-ULDRBWS5.js} +8 -8
  189. package/dist/{validate-Z7KQT7GO.js → validate-NVWNXNBV.js} +25 -25
  190. package/dist/{video-EXL2JDSL.js → video-74DRD2DN.js} +9 -9
  191. package/package.json +1 -1
  192. package/dist/chunk-CEND6BLF.js +0 -3795
  193. package/dist/chunk-WBLXWOYK.js +0 -15
@@ -5,14 +5,24 @@ var require = __hf_createRequire(import.meta.url);
5
5
  var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
+ pngDimensions,
9
+ reportArtifacts,
10
+ withProjectLock
11
+ } from "./chunk-57GN6KWT.js";
12
+ import {
13
+ checkSnapshotDirectory,
8
14
  rectToBbox
9
- } from "./chunk-WBLXWOYK.js";
15
+ } from "./chunk-XSEGMQYA.js";
16
+ import {
17
+ captureArtifactRevision
18
+ } from "./chunk-KCFF4ENE.js";
19
+ import "./chunk-7TASSBN2.js";
10
20
  import {
11
21
  loadProducer
12
- } from "./chunk-6QB7F2II.js";
22
+ } from "./chunk-3E4OCOC5.js";
13
23
  import {
14
24
  trackLintRun
15
- } from "./chunk-73RBX2E7.js";
25
+ } from "./chunk-3DZBQ7MH.js";
16
26
  import {
17
27
  assertionTargets,
18
28
  buildLayoutSampleTimes,
@@ -31,46 +41,49 @@ import {
31
41
  mergeSampleTimes,
32
42
  parseAt,
33
43
  readMotionSpec
34
- } from "./chunk-FPAT5HTI.js";
35
- import "./chunk-S5F26DUL.js";
44
+ } from "./chunk-BYJYQWEX.js";
45
+ import "./chunk-GQETH4PE.js";
36
46
  import "./chunk-XUHOIDKG.js";
37
- import "./chunk-A6ZO4BX7.js";
47
+ import "./chunk-XEFFJRYX.js";
38
48
  import "./chunk-X7MTZ4T2.js";
39
- import "./chunk-UAIUVPZE.js";
49
+ import "./chunk-SWCSL6WS.js";
40
50
  import "./chunk-FH7WODJH.js";
41
- import "./chunk-AXPNVC3N.js";
42
- import "./chunk-423DJVX2.js";
51
+ import "./chunk-4UMKAUZI.js";
52
+ import "./chunk-PKO2EWO7.js";
43
53
  import "./chunk-WPNE5NEP.js";
44
- import "./chunk-UVVI2NJQ.js";
45
- import "./chunk-ZNHAJCEA.js";
46
- import "./chunk-FJWEYVEM.js";
47
- import "./chunk-XXPYZBZ3.js";
48
- import "./chunk-EL5QVJEG.js";
49
- import "./chunk-AIJS74LG.js";
54
+ import "./chunk-HBCRRCTX.js";
55
+ import "./chunk-PRXAOZWZ.js";
56
+ import "./chunk-C6TPGUWD.js";
57
+ import {
58
+ recordArtifacts
59
+ } from "./chunk-7FYFEXD2.js";
60
+ import "./chunk-XINGD6MS.js";
61
+ import "./chunk-FFDC5OWV.js";
50
62
  import {
51
63
  resolveProject
52
- } from "./chunk-NFQY7EIC.js";
64
+ } from "./chunk-IBYC3VUA.js";
53
65
  import "./chunk-K2FLNJVB.js";
66
+ import "./chunk-DQBY7FRR.js";
54
67
  import {
55
68
  resolveLocalBrowserGpuMode
56
- } from "./chunk-AKYQGZLU.js";
69
+ } from "./chunk-EVTHG34H.js";
57
70
  import "./chunk-442JNXRM.js";
58
- import "./chunk-XQMEGSHG.js";
71
+ import "./chunk-D6RJXQLD.js";
59
72
  import "./chunk-XT7X6QCP.js";
60
73
  import "./chunk-4YYJOFKS.js";
61
74
  import "./chunk-HVW7ABXD.js";
62
- import "./chunk-BLRJKBKP.js";
63
- import "./chunk-M6UDJ2E7.js";
64
- import "./chunk-OQ7XMM3S.js";
75
+ import "./chunk-QESSGUKX.js";
76
+ import "./chunk-6Z4YJ5Q3.js";
77
+ import "./chunk-3HPJM5IQ.js";
65
78
  import "./chunk-AWDFDFI3.js";
66
79
  import "./chunk-P6LJ4Y32.js";
67
80
  import "./chunk-GMECXFAN.js";
68
- import "./chunk-374QQGBQ.js";
81
+ import "./chunk-5CS4T6C6.js";
69
82
  import {
70
83
  trackCheckReport,
71
84
  trackCommandFailure
72
- } from "./chunk-3UAIVF4L.js";
73
- import "./chunk-6KWA3XPS.js";
85
+ } from "./chunk-H2SGM2V2.js";
86
+ import "./chunk-KZ3L3W4Q.js";
74
87
  import "./chunk-VWG7OQKU.js";
75
88
  import "./chunk-XBSPQ52S.js";
76
89
  import {
@@ -94,26 +107,26 @@ import "./chunk-TJSTGSAW.js";
94
107
  import "./chunk-Q5X2B5WT.js";
95
108
  import {
96
109
  withMeta
97
- } from "./chunk-AFRXL75S.js";
110
+ } from "./chunk-YYEYOFHW.js";
98
111
  import "./chunk-K4WIOZFP.js";
99
112
  import "./chunk-XUXGIA7H.js";
100
113
  import "./chunk-WERLJGIC.js";
101
114
  import "./chunk-ISN5GRYI.js";
102
- import "./chunk-I6DATIHC.js";
115
+ import "./chunk-IZIRIDJH.js";
103
116
  import "./chunk-EOVYQ3IG.js";
104
117
  import "./chunk-AMKC3AXA.js";
105
118
  import {
106
119
  extractMediaMetadata,
107
120
  findHdrAutoPromotion
108
- } from "./chunk-5NAYNDBT.js";
109
- import "./chunk-WLIUULZQ.js";
121
+ } from "./chunk-EXH6L2XZ.js";
122
+ import "./chunk-RN5I2DP5.js";
110
123
  import "./chunk-NE55C6S5.js";
111
124
  import "./chunk-JYVGYKXG.js";
112
- import "./chunk-PCWOSS7G.js";
113
- import "./chunk-CEND6BLF.js";
125
+ import "./chunk-5ERVRJMV.js";
126
+ import "./chunk-S3RCK56N.js";
114
127
  import "./chunk-VC76R6W2.js";
115
128
  import "./chunk-UJKQWGFF.js";
116
- import "./chunk-LFNQDTSH.js";
129
+ import "./chunk-VYKPBRCB.js";
117
130
  import "./chunk-OFQWTKPW.js";
118
131
  import "./chunk-DPVXBVLL.js";
119
132
  import "./chunk-T76PLPD6.js";
@@ -123,16 +136,16 @@ import "./chunk-TWWSYAKJ.js";
123
136
  import {
124
137
  lintProject,
125
138
  shouldBlockRender
126
- } from "./chunk-JDB65PPT.js";
139
+ } from "./chunk-YOEGUBBY.js";
127
140
  import {
128
141
  resolveProjectRelativeSrc
129
142
  } from "./chunk-IWFLMU2N.js";
130
- import "./chunk-APDLWWFG.js";
143
+ import "./chunk-3VGU2SH7.js";
131
144
  import "./chunk-VAS6HQX3.js";
132
145
  import "./chunk-3RM2ETQT.js";
133
146
  import "./chunk-BSQ7XANM.js";
134
147
  import "./chunk-SDYDNHEE.js";
135
- import "./chunk-2PSPARWP.js";
148
+ import "./chunk-TYXH3EKP.js";
136
149
  import "./chunk-IXLUTE6N.js";
137
150
  import {
138
151
  normalizeErrorMessage
@@ -140,13 +153,18 @@ import {
140
153
  import "./chunk-3GXQPCJC.js";
141
154
  import "./chunk-M2WBOQ2Q.js";
142
155
 
156
+ // src/commands/check.ts
157
+ import { randomUUID } from "crypto";
158
+ import { mkdirSync as mkdirSync2, writeFileSync as writeFileSync2 } from "fs";
159
+ import { join as join2, resolve } from "path";
160
+
143
161
  // src/utils/checkPipeline.ts
144
162
  import { mkdirSync, writeFileSync } from "fs";
145
163
  import { join, relative } from "path";
146
164
 
147
165
  // src/utils/hdrPromotion.ts
148
166
  async function bundleProjectHtml(projectDir) {
149
- const { bundleToSingleHtml } = await import("./compiler-UQP2VXN6.js");
167
+ const { bundleToSingleHtml } = await import("./compiler-NCN6PTVH.js");
150
168
  return bundleToSingleHtml(projectDir);
151
169
  }
152
170
  async function collectBundledRenderMedia(html) {
@@ -255,22 +273,61 @@ function gateSampleTimes(duration, seeks, fallback) {
255
273
  const fractions = seeks && seeks.length > 0 ? seeks : [fallback];
256
274
  return mergeSampleTimes(fractions.map((fraction) => fraction * duration));
257
275
  }
258
- async function buildSampleGrid(driver, options) {
259
- const duration = await driver.getDuration();
276
+ function validateSampleRange([start, end], duration) {
277
+ if (!Number.isFinite(start + end) || start < 0 || end <= start || end > duration)
278
+ throw new Error(`Check range must lie within the composition duration (${duration} seconds)`);
279
+ }
280
+ function gateSamplesInRange(flag, samples, inRange, range) {
281
+ if (!range) return samples;
282
+ const selected = samples.filter(inRange);
283
+ if (samples.length > 0 && selected.length === 0) {
284
+ throw new Error(`No ${flag} seek samples lie within --range`);
285
+ }
286
+ return selected;
287
+ }
288
+ function layoutSamplesInRange(options, duration) {
289
+ if (!options.range)
290
+ return {
291
+ inRange: (_t) => true,
292
+ baseSamples: buildLayoutSampleTimes({ duration, samples: options.samples, at: options.at })
293
+ };
294
+ validateSampleRange(options.range, duration);
295
+ const [start, end] = options.range;
296
+ const inRange = (t) => t >= start && t <= end;
297
+ const selected = (options.at ?? []).filter(inRange);
298
+ if (options.at?.length && !selected.length) throw new Error("No --at samples lie within --range");
260
299
  const baseSamples = buildLayoutSampleTimes({
261
- duration,
300
+ duration: end - start,
262
301
  samples: options.samples,
263
- at: options.at
264
- });
302
+ at: selected.map((t) => t - start)
303
+ }).map((t) => t + start);
304
+ return { inRange, baseSamples };
305
+ }
306
+ async function buildSampleGrid(driver, options) {
307
+ const duration = await driver.getDuration();
308
+ const { inRange, baseSamples } = layoutSamplesInRange(options, duration);
265
309
  const transitions = options.atTransitions ? buildTransitionSampleTimes({
266
310
  duration,
267
- boundaries: await driver.getTransitionBoundaries(),
311
+ boundaries: (await driver.getTransitionBoundaries()).filter(inRange),
268
312
  cap: options.maxTransitionSamples
269
313
  }) : { times: [], dropped: 0 };
270
- const captionSamples = options.captionZone ? gateSampleTimes(duration, options.captionZone.seek, 1) : [];
271
- const frameSamples = options.frameCheck ? gateSampleTimes(duration, options.frameCheck.seek, 0.5) : [];
272
- const auditSamples = mergeSampleTimes(baseSamples, transitions.times);
273
- const layoutSamples = mergeSampleTimes(auditSamples, captionSamples, frameSamples);
314
+ const captionSamples = gateSamplesInRange(
315
+ "--caption-zone",
316
+ options.captionZone ? gateSampleTimes(duration, options.captionZone.seek, 1) : [],
317
+ inRange,
318
+ options.range
319
+ );
320
+ const frameSamples = gateSamplesInRange(
321
+ "--frame-check",
322
+ options.frameCheck ? gateSampleTimes(duration, options.frameCheck.seek, 0.5) : [],
323
+ inRange,
324
+ options.range
325
+ );
326
+ transitions.times = transitions.times.filter(inRange);
327
+ const auditSamples = mergeSampleTimes(baseSamples, transitions.times).filter(inRange);
328
+ const layoutSamples = mergeSampleTimes(auditSamples, captionSamples, frameSamples).filter(
329
+ inRange
330
+ );
274
331
  if (layoutSamples.length === 0) {
275
332
  throw new Error("Could not determine composition duration \u2014 no layout samples run");
276
333
  }
@@ -462,7 +519,7 @@ async function collectGridSamples(driver, options, grid, motion) {
462
519
  collected.screenshots.push({ time, pngBase64: capture.pngBase64 });
463
520
  }
464
521
  }
465
- await collectMotionOverlapSamples(driver, grid, collected);
522
+ await collectMotionOverlapSamples(driver, grid, collected, options.range);
466
523
  return collected;
467
524
  }
468
525
  var OVERLAP_SAMPLE_FPS = 8;
@@ -478,9 +535,11 @@ function buildOverlapSampleTimes(duration) {
478
535
  Array.from({ length: count }, (_, index) => Math.round(index * step * 1e3) / 1e3)
479
536
  );
480
537
  }
481
- async function collectMotionOverlapSamples(driver, grid, collected) {
538
+ async function collectMotionOverlapSamples(driver, grid, collected, range) {
482
539
  const baseTimes = new Set(grid.layoutSamples);
483
- for (const time of buildOverlapSampleTimes(grid.duration)) {
540
+ const overlapTimes = buildOverlapSampleTimes(range ? range[1] - range[0] : grid.duration);
541
+ const shiftedTimes = range ? mergeSampleTimes(overlapTimes.map((time) => time + range[0])) : overlapTimes;
542
+ for (const time of shiftedTimes) {
484
543
  if (baseTimes.has(time)) continue;
485
544
  await driver.seekGeometry(time);
486
545
  collected.layoutIssues.push(...await driver.collectOverlap(time));
@@ -875,7 +934,11 @@ function annotationBoxesFrom(issues) {
875
934
  async function runAuditGrid(driver, options, motion) {
876
935
  await driver.initialize(options.contrast);
877
936
  const grid = await buildSampleGrid(driver, options);
878
- const plan = await planMotionSampling(driver, motion, grid.duration);
937
+ const plan = await planMotionSampling(
938
+ driver,
939
+ options.range ? { kind: "none" } : motion,
940
+ grid.duration
941
+ );
879
942
  const seekLoopStart = Date.now();
880
943
  const collected = await collectGridSamples(driver, options, grid, plan);
881
944
  const seekLoopMs = Date.now() - seekLoopStart;
@@ -889,7 +952,7 @@ async function runAuditGrid(driver, options, motion) {
889
952
  motionIssues = [...motionIssues, ...await driver.anchorMotionIssues(evaluated)];
890
953
  }
891
954
  const userPicked = new Set(grid.userPickedSamples);
892
- const sweepFindings = detectSweepStatic(
955
+ const sweepFindings = options.range ? [] : detectSweepStatic(
893
956
  grid.duration,
894
957
  collected.layoutStateSignatures.filter((sample) => !userPicked.has(sample.time)),
895
958
  motionIssues,
@@ -901,6 +964,22 @@ async function runAuditGrid(driver, options, motion) {
901
964
  );
902
965
  const offPivotFindings = detectOffPivotRotation(collected.indicatorFrames);
903
966
  const contrast = buildContrastResults(collected.contrastEntries);
967
+ if (options.components?.length) {
968
+ if (!driver.matchComponents)
969
+ throw new Error("Component filtering unavailable in this check driver");
970
+ const findings = [
971
+ ...collected.layoutIssues,
972
+ ...sweepFindings,
973
+ ...rotationFindings,
974
+ ...offPivotFindings,
975
+ ...motionIssues,
976
+ ...contrast.findings
977
+ ];
978
+ const matches = await driver.matchComponents(options.components, findings);
979
+ findings.forEach((finding, i) => {
980
+ finding.componentMatch = matches[i];
981
+ });
982
+ }
904
983
  return {
905
984
  duration: grid.duration,
906
985
  layoutSamples: grid.layoutSamples,
@@ -1116,8 +1195,9 @@ function buildLintSection(result) {
1116
1195
  return { ...section(findings), filesScanned: result.results.length };
1117
1196
  }
1118
1197
  function buildReport(options, lint, browser, motion, extraMotionFindings, snapshotFiles, hdrPromotion = null, hdrInspection = "available") {
1119
- const layout = shapeLayoutSection(browser.layoutIssues, browser, options);
1120
- const shapedMotion = shapeLayoutFindings(browser.motionIssues, options);
1198
+ const shaping = options.components?.length ? { ...options, maxIssues: Number.MAX_SAFE_INTEGER } : options;
1199
+ const layout = shapeLayoutSection(browser.layoutIssues, browser, shaping);
1200
+ const shapedMotion = shapeLayoutFindings(browser.motionIssues, shaping);
1121
1201
  const motionFindings = [...shapedMotion.findings, ...extraMotionFindings];
1122
1202
  const runtime = section(browser.runtimeFindings);
1123
1203
  const motionSection = section(motionFindings);
@@ -1133,7 +1213,7 @@ function buildReport(options, lint, browser, motion, extraMotionFindings, snapsh
1133
1213
  layout,
1134
1214
  motion: {
1135
1215
  ...motionSection,
1136
- enabled: motion.kind !== "none",
1216
+ enabled: motion.kind !== "none" && !options.range,
1137
1217
  specPath: motion.kind === "none" ? void 0 : motion.path,
1138
1218
  samples: browser.motionSampleCount
1139
1219
  },
@@ -1154,7 +1234,7 @@ function buildReport(options, lint, browser, motion, extraMotionFindings, snapsh
1154
1234
  };
1155
1235
  trackCheckReport({
1156
1236
  contrastGate: options.contrast,
1157
- motionGate: motion.kind !== "none",
1237
+ motionGate: motion.kind !== "none" && !options.range,
1158
1238
  captionZoneGate: options.captionZone !== void 0,
1159
1239
  frameCheckGate: options.frameCheck !== void 0,
1160
1240
  snapshotsGate: options.snapshots,
@@ -1177,6 +1257,35 @@ function buildReport(options, lint, browser, motion, extraMotionFindings, snapsh
1177
1257
  exitCode: checkExitCode(report),
1178
1258
  runId: getRunId()
1179
1259
  });
1260
+ return filterComponentReport(report, options);
1261
+ }
1262
+ function filterComponentReport(report, options) {
1263
+ if (!options.range && !options.components?.length) return report;
1264
+ {
1265
+ report.scope = {
1266
+ range: options.range,
1267
+ components: options.components,
1268
+ hiddenFindings: 0,
1269
+ notes: [
1270
+ "Static lint and unscoped runtime failures remain project-wide.",
1271
+ ...options.range ? [
1272
+ "Whole-timeline motion assertions and frozen-sweep detection are skipped for range checks."
1273
+ ] : []
1274
+ ]
1275
+ };
1276
+ for (const group of [report.layout, report.motion, report.contrast]) {
1277
+ const before = group.findings.length;
1278
+ group.findings = group.findings.filter((f) => f.componentMatch !== false);
1279
+ report.scope.hiddenFindings += before - group.findings.length;
1280
+ if (group !== report.contrast && group.findings.length > options.maxIssues) {
1281
+ group.findings = group.findings.slice(0, options.maxIssues);
1282
+ report.scope.notes.push(
1283
+ "Selected findings exceed --max-issues; increase it to see the remainder."
1284
+ );
1285
+ if (group === report.layout) report.layout.truncated = true;
1286
+ }
1287
+ }
1288
+ }
1180
1289
  return report;
1181
1290
  }
1182
1291
  function shapeLayoutSection(issues, browser, options) {
@@ -1292,19 +1401,19 @@ function resolveMotionSpec(projectDir) {
1292
1401
  };
1293
1402
  }
1294
1403
  async function runBrowserCheck(project, options, motion) {
1295
- const module = await import("./checkBrowser-MXBDNZJB.js");
1404
+ const module = await import("./checkBrowser-MSTVEL4V.js");
1296
1405
  return module.runBrowserCheck(project, options, motion, runAuditGrid);
1297
1406
  }
1298
1407
  async function writeSnapshot(projectDir, index, time, pngBase64) {
1299
- const snapshotDir = join(projectDir, "snapshots");
1408
+ const snapshotDir = checkSnapshotDirectory(projectDir);
1300
1409
  mkdirSync(snapshotDir, { recursive: true });
1301
1410
  const filename = `frame-${String(index).padStart(2, "0")}-at-${time.toFixed(1)}s.png`;
1302
1411
  const path = join(snapshotDir, filename);
1303
1412
  writeFileSync(path, Buffer.from(pngBase64, "base64"));
1304
- return join("snapshots", filename);
1413
+ return relative(projectDir, path);
1305
1414
  }
1306
1415
  async function captureFindingCrops(project, options, requests) {
1307
- const module = await import("./checkBrowser-MXBDNZJB.js");
1416
+ const module = await import("./checkBrowser-MSTVEL4V.js");
1308
1417
  return module.captureFindingCrops(project, options, requests);
1309
1418
  }
1310
1419
  var DEFAULT_DEPENDENCIES2 = {
@@ -1325,9 +1434,86 @@ var examples = [
1325
1434
  ];
1326
1435
  var DEFAULT_COMMAND_DEPENDENCIES = {
1327
1436
  resolveProject,
1328
- runPipeline: runCheckPipeline,
1437
+ async runPipeline(project, options) {
1438
+ const capture = await captureArtifactRevision(project.dir).catch(warnNotRecorded);
1439
+ const report = await runCheckPipeline(project, options);
1440
+ const images = (files) => files.map((file) => resolve(project.dir, file));
1441
+ reportArtifacts("check", "frame", images(report.snapshots.files));
1442
+ reportArtifacts("check", "finding", images(report.snapshots.findingFiles));
1443
+ if (!capture) return report;
1444
+ try {
1445
+ return { ...report, saved: await saveCheckReport(project, options, report, capture) };
1446
+ } catch (error) {
1447
+ warnNotRecorded(error);
1448
+ return report;
1449
+ }
1450
+ },
1329
1451
  withMeta
1330
1452
  };
1453
+ function warnNotRecorded(error) {
1454
+ console.warn(`${c.warn("\u26A0")} Check report was not recorded: ${normalizeErrorMessage(error)}`);
1455
+ return void 0;
1456
+ }
1457
+ async function saveCheckReport(project, options, report, capture) {
1458
+ const id = randomUUID();
1459
+ const directory = join2(project.dir, ".hyperframes", "artifacts", "checks");
1460
+ mkdirSync2(directory, { recursive: true });
1461
+ const path = join2(directory, `${id}.json`);
1462
+ writeFileSync2(path, JSON.stringify(report, null, 2) + "\n", { flag: "wx" });
1463
+ const reportScope = "scope" in report && typeof report.scope === "object" && report.scope !== null ? report.scope : void 0;
1464
+ const artifacts = [
1465
+ {
1466
+ kind: "check",
1467
+ id,
1468
+ scope: reportScope ? "scoped" : "project",
1469
+ report: resolve(path),
1470
+ metadata: {
1471
+ ok: report.ok,
1472
+ browserSkipped: report.browserSkipped,
1473
+ scope: reportScope,
1474
+ options
1475
+ }
1476
+ }
1477
+ ];
1478
+ for (const [index, image] of report.snapshots.files.entries()) {
1479
+ artifacts.push({
1480
+ kind: "snapshot",
1481
+ id: `${id}-${index}`,
1482
+ scope: "full",
1483
+ image: resolve(project.dir, image),
1484
+ time: report.snapshots.times[index],
1485
+ metadata: {
1486
+ checkId: id,
1487
+ ...pngDimensions(resolve(project.dir, image))
1488
+ }
1489
+ });
1490
+ }
1491
+ const crops = selectFindingCropRequests(report);
1492
+ for (const [index, image] of report.snapshots.findingFiles.entries()) {
1493
+ const crop = crops.find((request) => image.endsWith(request.filename));
1494
+ artifacts.push({
1495
+ kind: "snapshot",
1496
+ id: `${id}-crop-${index}`,
1497
+ scope: "finding",
1498
+ image: resolve(project.dir, image),
1499
+ time: crop?.time,
1500
+ metadata: {
1501
+ checkId: id,
1502
+ finding: crop,
1503
+ ...pngDimensions(resolve(project.dir, image))
1504
+ }
1505
+ });
1506
+ }
1507
+ const [saved] = await recordArtifacts(project.dir, capture, artifacts);
1508
+ if (!saved) throw new Error("no history record was written");
1509
+ reportArtifacts("check", "check-report", [resolve(path)]);
1510
+ return {
1511
+ id: saved.id,
1512
+ revision: saved.revision,
1513
+ report: saved.report,
1514
+ attribution: saved.attribution
1515
+ };
1516
+ }
1331
1517
  var CHECK_COMMAND_ARGS = {
1332
1518
  dir: { type: "positional", description: "Project directory", required: false },
1333
1519
  json: { type: "boolean", description: "Output agent-readable JSON", default: false },
@@ -1336,6 +1522,14 @@ var CHECK_COMMAND_ARGS = {
1336
1522
  description: "Number of midpoint samples across the duration (default: 9)",
1337
1523
  default: "9"
1338
1524
  },
1525
+ range: {
1526
+ type: "string",
1527
+ description: "Runtime sample interval in global seconds: start,end. Static lint remains project-wide."
1528
+ },
1529
+ components: {
1530
+ type: "string",
1531
+ description: "CSS selector list: filter findings involving these components or descendants; preserve full-check status."
1532
+ },
1339
1533
  at: {
1340
1534
  type: "string",
1341
1535
  description: "Comma-separated timestamps in seconds (e.g., --at 1.5,4,7.25)"
@@ -1391,7 +1585,7 @@ var CHECK_COMMAND_ARGS = {
1391
1585
  },
1392
1586
  snapshots: {
1393
1587
  type: "boolean",
1394
- description: "Save the five contrast-pass PNGs under snapshots/",
1588
+ description: "Save contrast-pass PNGs under .hyperframes/artifacts/snapshots/",
1395
1589
  default: false
1396
1590
  },
1397
1591
  "caption-zone": {
@@ -1423,11 +1617,21 @@ function createCheckCommand(dependencies = DEFAULT_COMMAND_DEPENDENCIES) {
1423
1617
  if (!asJson) {
1424
1618
  console.log(`${c.accent("\u25C6")} Checking ${c.accent(project.name)}`);
1425
1619
  }
1426
- const report = await dependencies.runPipeline(project, options);
1620
+ const report = await withProjectLock(
1621
+ project.dir,
1622
+ "check",
1623
+ () => dependencies.runPipeline(project, options)
1624
+ );
1427
1625
  if (asJson) {
1428
1626
  console.log(JSON.stringify(dependencies.withMeta(report), null, 2));
1429
1627
  } else {
1430
1628
  printHumanReport(report);
1629
+ if (report.saved) {
1630
+ console.log(`Report: ${report.saved.report}`);
1631
+ console.log(
1632
+ `Revision: ${report.saved.revision ?? "none"} (${report.saved.attribution})`
1633
+ );
1634
+ }
1431
1635
  }
1432
1636
  setCommandExitCode(checkExitCode(report));
1433
1637
  } catch (error) {
@@ -1448,6 +1652,8 @@ function parseCheckOptions(args) {
1448
1652
  const maxTransitionSamples = positiveInteger(args["max-transition-samples"], 0);
1449
1653
  return {
1450
1654
  samples: positiveInteger(args.samples, DEFAULT_CHECK_OPTIONS.samples),
1655
+ range: parseCheckRange(args.range),
1656
+ components: typeof args.components === "string" ? [args.components] : void 0,
1451
1657
  at: parseAt(args.at),
1452
1658
  atTransitions: args["at-transitions"] === true,
1453
1659
  maxTransitionSamples: maxTransitionSamples > 0 ? maxTransitionSamples : void 0,
@@ -1465,6 +1671,14 @@ function parseCheckOptions(args) {
1465
1671
  browserGpuMode: resolveLocalBrowserGpuMode(args["browser-gpu"])
1466
1672
  };
1467
1673
  }
1674
+ function parseCheckRange(value) {
1675
+ if (value === void 0) return void 0;
1676
+ const parts = String(value).split(/[,:]/);
1677
+ const start = Number(parts[0]), end = Number(parts[1]);
1678
+ if (parts.length !== 2 || parts.some((p) => !p.trim()) || !Number.isFinite(start) || !Number.isFinite(end) || start < 0 || end <= start)
1679
+ throw new Error("Invalid --range: use non-negative start,end with end > start");
1680
+ return [start, end];
1681
+ }
1468
1682
  var CAPTION_ZONE_FIELDS = /* @__PURE__ */ new Set(["x0", "y0", "x1", "y1", "severity", "seek"]);
1469
1683
  var FRAME_CHECK_FIELDS = /* @__PURE__ */ new Set(["severity", "seek", "tol"]);
1470
1684
  var LAYOUT_FIELDS = /* @__PURE__ */ new Set(["proseCoverageFloor"]);
@@ -1622,6 +1836,12 @@ function nonNegativeNumber(value, fallback) {
1622
1836
  return Number.isFinite(parsed) && parsed >= 0 ? parsed : fallback;
1623
1837
  }
1624
1838
  function printHumanReport(report) {
1839
+ if (report.scope) {
1840
+ console.log(
1841
+ `Scope: ${report.scope.range ? report.scope.range.join("\u2013") + "s" : "full timeline"}; ${report.scope.hiddenFindings} findings hidden by component filter. Counts/status include hidden findings.`
1842
+ );
1843
+ for (const note of report.scope.notes) console.log(note);
1844
+ }
1625
1845
  printSection("Lint", report.lint);
1626
1846
  if (report.browserSkipped) {
1627
1847
  console.log();
@@ -1638,10 +1858,13 @@ function printHumanReport(report) {
1638
1858
  const label = report.ok ? c.success("Check passed") : c.error("Check failed");
1639
1859
  console.log(`${report.ok ? c.success("\u25C7") : c.error("\u25C7")} ${label}`);
1640
1860
  }
1861
+ function isEmptySection(section2) {
1862
+ return section2.findings.length === 0 && section2.errorCount + section2.warningCount + section2.infoCount === 0;
1863
+ }
1641
1864
  function printSection(title, section2) {
1642
1865
  console.log();
1643
1866
  console.log(c.bold(title));
1644
- if (section2.findings.length === 0) {
1867
+ if (isEmptySection(section2)) {
1645
1868
  console.log(` ${c.success("\u25C7")} 0 errors, 0 warnings`);
1646
1869
  return;
1647
1870
  }
@@ -1651,7 +1874,7 @@ function printSection(title, section2) {
1651
1874
  function printLayoutSection(title, section2) {
1652
1875
  console.log();
1653
1876
  console.log(c.bold(title));
1654
- if (section2.findings.length === 0) {
1877
+ if (isEmptySection(section2)) {
1655
1878
  console.log(` ${c.success("\u25C7")} 0 issues across ${section2.samples.length} sample(s)`);
1656
1879
  } else {
1657
1880
  for (const finding of section2.findings) {
@@ -1674,7 +1897,7 @@ function printContrastSection(report) {
1674
1897
  console.log(` ${c.dim("\u25C7")} skipped`);
1675
1898
  return;
1676
1899
  }
1677
- if (section2.findings.length === 0) {
1900
+ if (isEmptySection(section2)) {
1678
1901
  console.log(
1679
1902
  ` ${c.success("\u25C7")} ${section2.passed}/${section2.checked} text checks pass WCAG AA`
1680
1903
  );
@@ -1725,6 +1948,7 @@ export {
1725
1948
  createCheckCommand,
1726
1949
  check_default as default,
1727
1950
  examples,
1951
+ parseCheckRange,
1728
1952
  parseFrameCheck,
1729
1953
  parseLayout
1730
1954
  };