hyperframes 0.8.162 → 0.8.163

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 (151) hide show
  1. package/dist/{add-UW7GCPQF.js → add-Y7BGO2MK.js} +11 -11
  2. package/dist/{animatedGifPrep-YAJTDXB7.js → animatedGifPrep-NUU6VMFL.js} +5 -5
  3. package/dist/api.js +11 -11
  4. package/dist/{asset-TWBPYQOL.js → asset-OONPCZS5.js} +2 -2
  5. package/dist/{assetCataloger-BIDQA34M.js → assetCataloger-YWJRJK23.js} +2 -2
  6. package/dist/{audio-DJIE4YLH.js → audio-KPTXNHDC.js} +10 -10
  7. package/dist/{auth-VTCEZYBT.js → auth-UKXSZ4WA.js} +1 -1
  8. package/dist/{autoUpdate-JA3SV472.js → autoUpdate-4MRUONUQ.js} +2 -2
  9. package/dist/{backgroundChecks-J3WJDPQJ.js → backgroundChecks-X5M7Z6L7.js} +3 -3
  10. package/dist/backgroundChecksWorker.js +3 -3
  11. package/dist/{batchRender-C2JCG5EK.js → batchRender-GJ65EZ26.js} +3 -3
  12. package/dist/{beats-QVJVXZV5.js → beats-EQNT7OZE.js} +4 -4
  13. package/dist/{benchmark-WNBAKOXS.js → benchmark-WXWALVZJ.js} +8 -8
  14. package/dist/{browser-VJOTRIXL.js → browser-ZSNFVRC3.js} +3 -3
  15. package/dist/{bundleWithLocalizedFonts-SLBVWQ7O.js → bundleWithLocalizedFonts-O3BXZLCD.js} +2 -2
  16. package/dist/{capture-GUO23PVN.js → capture-JFFYE7XM.js} +2 -2
  17. package/dist/{capture-M5ZAD3BI.js → capture-TKWJBFGC.js} +9 -9
  18. package/dist/{catalog-SAC4GFIN.js → catalog-LK5MNUQY.js} +11 -11
  19. package/dist/{catch-up-T5RIRFJF.js → catch-up-ISTWIF6K.js} +4 -4
  20. package/dist/{check-IRETF27J.js → check-YVEBXKNY.js} +30 -30
  21. package/dist/{checkBrowser-5IXR4QCK.js → checkBrowser-OJAXYTRD.js} +28 -27
  22. package/dist/{chunk-VXVRPIJA.js → chunk-23IS5QVP.js} +69 -1
  23. package/dist/{chunk-B5FZ2CQM.js → chunk-2ALJMIFW.js} +1 -1
  24. package/dist/{chunk-ZEWX3GHP.js → chunk-2XIPB4MP.js} +1 -1
  25. package/dist/{chunk-RTS7BGEC.js → chunk-3E3VMAAM.js} +1 -1
  26. package/dist/{chunk-MMV6IY6U.js → chunk-3KY7FUSS.js} +2 -2
  27. package/dist/{chunk-XTLV6UVP.js → chunk-3TKNBY6K.js} +2 -2
  28. package/dist/{chunk-LYIG2GZ5.js → chunk-42AER3PM.js} +1 -1
  29. package/dist/{chunk-5K34RPE5.js → chunk-43H7XDO6.js} +2 -2
  30. package/dist/{chunk-B7RUGHBT.js → chunk-4LXWLCIX.js} +1 -1
  31. package/dist/{chunk-GS5EXZBV.js → chunk-54E2ELUA.js} +9 -9
  32. package/dist/{chunk-4ID635FL.js → chunk-5K5YH6M7.js} +1 -1
  33. package/dist/{chunk-GJQHHAAX.js → chunk-74H5SHQL.js} +3 -3
  34. package/dist/{chunk-PLEMSN3E.js → chunk-A356JY2J.js} +29 -19
  35. package/dist/{chunk-OMJA7JP6.js → chunk-AFPGUKMN.js} +4 -4
  36. package/dist/{chunk-RGYEL7QD.js → chunk-AXATVUCD.js} +3 -3
  37. package/dist/{chunk-GG37I7B3.js → chunk-BHGIBGUZ.js} +1 -1
  38. package/dist/{chunk-5YSHR4XC.js → chunk-CXVBPW5F.js} +6 -6
  39. package/dist/{chunk-GIPNECWL.js → chunk-D5PUMG2P.js} +1 -1
  40. package/dist/{chunk-D33YJZOH.js → chunk-DSXDYQQV.js} +1 -1
  41. package/dist/{chunk-PPF65XAF.js → chunk-GD7VU7CY.js} +1 -1
  42. package/dist/{chunk-ERTJPFCH.js → chunk-H3JGPRWA.js} +1 -1
  43. package/dist/{chunk-EVRUR7DW.js → chunk-H45RC6HN.js} +1 -1
  44. package/dist/{chunk-DJZEIVAP.js → chunk-H46R2BND.js} +1 -1
  45. package/dist/{chunk-YLBV2PXM.js → chunk-HQMWZNO2.js} +12 -1
  46. package/dist/{chunk-XWWYGXJ5.js → chunk-JEW5CCRU.js} +2 -2
  47. package/dist/{chunk-FF5TAEPT.js → chunk-JYR3YAAK.js} +1 -1
  48. package/dist/{chunk-JJYFRAI4.js → chunk-LHETZ63N.js} +1 -1
  49. package/dist/{chunk-G642IIVK.js → chunk-LMHXUDSR.js} +1 -1
  50. package/dist/{chunk-NQR5SBXX.js → chunk-M4237QMQ.js} +1 -1
  51. package/dist/{chunk-YJKUE3LV.js → chunk-NU4PDQ6G.js} +1 -1
  52. package/dist/{chunk-Q3TFX4OZ.js → chunk-NZ7K76Y2.js} +1 -1
  53. package/dist/{chunk-MP676E4B.js → chunk-O2CXBATN.js} +4 -3
  54. package/dist/{chunk-PBNV5V5G.js → chunk-OFD2XWIQ.js} +13 -2
  55. package/dist/{chunk-KAKBRDU4.js → chunk-OGGPNDGO.js} +2 -2
  56. package/dist/{chunk-3LQEZ4EI.js → chunk-OZUYK6IS.js} +1 -1
  57. package/dist/{chunk-N2NDDTYW.js → chunk-QGYAHDOR.js} +2 -2
  58. package/dist/{chunk-ON2HYNGB.js → chunk-QXAXCRK5.js} +6 -6
  59. package/dist/{chunk-2ZLYSXZC.js → chunk-R64V3KQN.js} +10 -9
  60. package/dist/{chunk-T65MIV36.js → chunk-SQN7N27A.js} +3 -3
  61. package/dist/{chunk-KIJO75L4.js → chunk-TQMJKZS5.js} +18 -4
  62. package/dist/{chunk-P4QE7SSN.js → chunk-ULAB77ZO.js} +1 -1
  63. package/dist/{chunk-YU2QRNWN.js → chunk-UZOZ2W2E.js} +3 -2
  64. package/dist/{chunk-3NSVHCOH.js → chunk-VG3ZMY2H.js} +2 -2
  65. package/dist/{chunk-GNFWKGSQ.js → chunk-WJVDUUH2.js} +2 -2
  66. package/dist/{chunk-S6OLD4SL.js → chunk-WMXOKTGO.js} +7 -7
  67. package/dist/{chunk-T5BG7PYZ.js → chunk-Z6P5OVCF.js} +1 -1
  68. package/dist/{chunk-SB5DX6AD.js → chunk-Z6VBXCYN.js} +2 -2
  69. package/dist/{chunk-P47XYVEQ.js → chunk-ZJO4SLHC.js} +1 -1
  70. package/dist/{chunk-AAUK5GDI.js → chunk-ZVOCFUPA.js} +9 -9
  71. package/dist/{clean-WB62QULT.js → clean-PGEA3UPT.js} +11 -11
  72. package/dist/cli.js +53 -53
  73. package/dist/{cloud-E5WB4DWZ.js → cloud-SAODZ2PK.js} +4 -4
  74. package/dist/{cloudrun-BIQXBUDO.js → cloudrun-RMBT2JQK.js} +3 -3
  75. package/dist/commands/layout-audit.browser.js +347 -20
  76. package/dist/{compare-GHFVHZ5A.js → compare-R7X7LXCX.js} +22 -22
  77. package/dist/{compiler-57M6W5WY.js → compiler-RKH75FZH.js} +2 -2
  78. package/dist/{component-ZGCC3MHX.js → component-DTVCMTLX.js} +3 -3
  79. package/dist/{compositions-THPEDDIX.js → compositions-UXS2ISGS.js} +9 -9
  80. package/dist/{delete-6FWT7DZX.js → delete-LIGHRH4L.js} +2 -2
  81. package/dist/{dist-4JFB3WAR.js → dist-P5OHBFEV.js} +2 -2
  82. package/dist/{doctor-RDGDOUC4.js → doctor-6VR5JUWZ.js} +7 -7
  83. package/dist/{events-VHXICDA2.js → events-YP2MRCPP.js} +2 -2
  84. package/dist/{events-CU6FDXHC.js → events-ZQFIOH5Z.js} +3 -3
  85. package/dist/{feedback-PUPN6EKP.js → feedback-47UEIUOO.js} +7 -7
  86. package/dist/{figma-ZKWBF7QH.js → figma-ZTHHEDY5.js} +3 -3
  87. package/dist/fontLocalizeCli.js +7 -7
  88. package/dist/{get-JHIBQRPM.js → get-EZGQNT7G.js} +2 -2
  89. package/dist/{gpuPolicy-VGE3I5J4.js → gpuPolicy-SYV7N237.js} +5 -5
  90. package/dist/{grade-compare-GPLUXDPW.js → grade-compare-SEFOAA4E.js} +22 -22
  91. package/dist/{help-GO6RGM37.js → help-WIZONGVE.js} +1 -1
  92. package/dist/{history-RUTC4SH5.js → history-PE45CSGA.js} +6 -6
  93. package/dist/hyperframe-runtime.js +23 -23
  94. package/dist/hyperframe.manifest.json +1 -1
  95. package/dist/hyperframe.runtime.iife.js +23 -23
  96. package/dist/hyperframes-player.global.js +1 -1
  97. package/dist/{info-773VXW37.js → info-WIRSMQKB.js} +7 -7
  98. package/dist/{init-YXSIRYZI.js → init-N26RW4YN.js} +20 -20
  99. package/dist/{inspect-L4RRJEAA.js → inspect-XHQUASDV.js} +23 -23
  100. package/dist/{installer-T3STEB4U.js → installer-QWK7EA5M.js} +4 -4
  101. package/dist/{keyframes-P5IOQ6AM.js → keyframes-RNTYYHMK.js} +6 -6
  102. package/dist/{lambda-RAJA6ZNA.js → lambda-LQHGF3LK.js} +4 -4
  103. package/dist/{layout-OH2VTN5E.js → layout-YRCKPNAO.js} +23 -23
  104. package/dist/{lint-YEEPVE6Q.js → lint-HLOZHJVM.js} +6 -6
  105. package/dist/{list-QURRZTVN.js → list-X7NTQB32.js} +2 -2
  106. package/dist/{login-DFT4L5YY.js → login-S7PVNUEB.js} +4 -4
  107. package/dist/{media-treatment-ERQ2PBIN.js → media-treatment-465Y6CWE.js} +8 -8
  108. package/dist/{models-OA4MXEYG.js → models-J2FZXHMD.js} +8 -8
  109. package/dist/{motionShot-C2YDYRNB.js → motionShot-K6OBEZ2N.js} +11 -11
  110. package/dist/{normalize-audio-R23VODOA.js → normalize-audio-VODIXLAC.js} +4 -4
  111. package/dist/{open-GEOB4L3S.js → open-K5OZGYJ7.js} +4 -4
  112. package/dist/{parakeetRunner-DBLHMD5T.js → parakeetRunner-NDIU5PKO.js} +8 -8
  113. package/dist/{pipeline-FSY65OQ4.js → pipeline-UKGI44NN.js} +5 -5
  114. package/dist/{play-BYUS37GA.js → play-QOXKOZ6L.js} +16 -16
  115. package/dist/{present-BZLRNHDY.js → present-7CVCJIS3.js} +12 -12
  116. package/dist/{preview-TXML6PQ7.js → preview-HX5F6RGT.js} +15 -15
  117. package/dist/{producer-C5V2A3YL.js → producer-66MQWVVQ.js} +1 -1
  118. package/dist/{projectConfig-X2IEHCSK.js → projectConfig-EVBNJKPS.js} +6 -6
  119. package/dist/{publication-JEANCWBW.js → publication-F6BOBZMI.js} +2 -2
  120. package/dist/{publish-VX5OH4ST.js → publish-6KTQDKL6.js} +8 -8
  121. package/dist/{remove-background-IXCISD26.js → remove-background-TJTKY3YM.js} +6 -6
  122. package/dist/{render-57SXH6NS.js → render-TRU75TVB.js} +42 -29
  123. package/dist/{render-ISUT7Q3X.js → render-X4MWSR5L.js} +3 -3
  124. package/dist/{render-JTY7XQFQ.js → render-XS22VQHC.js} +9 -9
  125. package/dist/{render-batch-2C6RUP3F.js → render-batch-VKFOIMV5.js} +3 -3
  126. package/dist/{resolver-KTNKZVIB.js → resolver-VGAM26OR.js} +4 -4
  127. package/dist/{sherpa-GFRG3TMM.js → sherpa-3OI5VMCY.js} +9 -7
  128. package/dist/skills/hyperframes-cli/references/lint-validate-inspect.md +1 -1
  129. package/dist/{skills-2LBVMKVY.js → skills-RKDR4AXV.js} +5 -5
  130. package/dist/{skillsUpdateCheck-5DRXL565.js → skillsUpdateCheck-QWIERB7M.js} +3 -3
  131. package/dist/{snapshot-V2L77FCF.js → snapshot-SSSF334Y.js} +25 -25
  132. package/dist/{src-GPUDUKY6.js → src-LZXECBBQ.js} +4 -4
  133. package/dist/{src-IMCQRH4P.js → src-RQPKPFRO.js} +6 -6
  134. package/dist/{staticProjectServer-4CQ3KDQK.js → staticProjectServer-DMG2CER4.js} +12 -12
  135. package/dist/studio/assets/{hyperframes-player-CAclPB6q.js → hyperframes-player-oCk9rjq9.js} +1 -1
  136. package/dist/studio/assets/{index-DCwGKghK.js → index-BOQPXBQ0.js} +1 -1
  137. package/dist/studio/assets/{index-B82aOvgB.js → index-DK2wgdLx.js} +4 -4
  138. package/dist/studio/index.html +1 -1
  139. package/dist/{studio-api-RYCDLEOR.js → studio-api-KRPBPUYQ.js} +6 -6
  140. package/dist/{studioServer-B7H7EQ4U.js → studioServer-KWNULEM4.js} +54 -41
  141. package/dist/{telemetry-WVHWY3DU.js → telemetry-4G6CD3X7.js} +3 -3
  142. package/dist/{timeline-EDXJ5L45.js → timeline-TKPBJ4EP.js} +13 -13
  143. package/dist/{tokens-UNJONAXT.js → tokens-TX7THSB7.js} +2 -2
  144. package/dist/{transcribe-VX7ZE2IZ.js → transcribe-7DBONX4C.js} +12 -12
  145. package/dist/{transcribe-FL6NGWHF.js → transcribe-HOLKYWY5.js} +6 -6
  146. package/dist/{updateCheck-NLH5E44Q.js → updateCheck-64D7B73Z.js} +2 -2
  147. package/dist/{upgrade-RGQJA2B4.js → upgrade-MXQDGGYO.js} +2 -2
  148. package/dist/{urlDownloader-KDJGLR2Y.js → urlDownloader-Z435W35E.js} +4 -4
  149. package/dist/{validate-4AN4PDV7.js → validate-5ZNGP5QO.js} +17 -17
  150. package/dist/{video-AHO4CDCK.js → video-62JJK3XL.js} +5 -5
  151. package/package.json +1 -1
@@ -1026,14 +1026,46 @@
1026
1026
  return { x: objectPositionOffset(x, freeX), y: objectPositionOffset(y, freeY) };
1027
1027
  }
1028
1028
 
1029
- // Return the alpha painted by an <img> at a viewport point. `null` means the
1030
- // browser would not let us inspect the image (not loaded or cross-origin), in
1031
- // which case callers preserve the conservative opaque fallback.
1032
- function imageAlphaAt(element, x, y) {
1033
- const sourceWidth = element.naturalWidth;
1034
- const sourceHeight = element.naturalHeight;
1029
+ const IDENTITY_FLIP = { flipX: false, flipY: false };
1030
+
1031
+ // 2D CSS matrix components [a, b, c, d], or null when the transform is 3D or unparsed.
1032
+ function transformMatrix(value) {
1033
+ if (!value || value === "none") return [1, 0, 0, 1];
1034
+ const match = /^matrix\(([^)]*)\)$/.exec(value.trim());
1035
+ if (!match) return null;
1036
+ const parts = match[1].split(",").map(Number);
1037
+ return parts.length === 6 && parts.every(Number.isFinite) ? parts.slice(0, 4) : null;
1038
+ }
1039
+
1040
+ // Which axes the element's paint is mirrored on, or null when a rotation, skew or 3D transform
1041
+ // (on it or an ancestor) means its bounding box no longer maps axis-aligned onto its pixels.
1042
+ function paintFlips(element) {
1043
+ let flipX = false;
1044
+ let flipY = false;
1045
+ for (let current = element; current; current = current.parentElement) {
1046
+ const style = getComputedStyle(current);
1047
+ const matrix = transformMatrix(style.transform);
1048
+ if (!matrix) return null;
1049
+ const [a, b, c, d] = matrix;
1050
+ if (Math.abs(b) > 1e-6 || Math.abs(c) > 1e-6) return null;
1051
+ if (style.rotate && style.rotate !== "none" && parseFloat(style.rotate) !== 0) return null;
1052
+ const scale = String(style.scale || "none")
1053
+ .trim()
1054
+ .split(/\s+/)
1055
+ .map(Number);
1056
+ const scaleX = Number.isFinite(scale[0]) ? scale[0] : 1;
1057
+ const scaleY = Number.isFinite(scale[1]) ? scale[1] : scaleX;
1058
+ if (a * scaleX < 0) flipX = !flipX;
1059
+ if (d * scaleY < 0) flipY = !flipY;
1060
+ }
1061
+ return flipX || flipY ? { flipX, flipY } : IDENTITY_FLIP;
1062
+ }
1063
+
1064
+ function paintedSourceMapping(element, sourceWidth, sourceHeight) {
1035
1065
  const rect = element.getBoundingClientRect();
1036
1066
  if (!sourceWidth || !sourceHeight || !rect.width || !rect.height) return null;
1067
+ const flips = paintFlips(element);
1068
+ if (!flips) return null;
1037
1069
 
1038
1070
  const style = getComputedStyle(element);
1039
1071
  const fit = style.objectFit || "fill";
@@ -1061,9 +1093,48 @@
1061
1093
  rect.width - paintedWidth,
1062
1094
  rect.height - paintedHeight,
1063
1095
  );
1064
- const localX = x - rect.left - offsets.x;
1065
- const localY = y - rect.top - offsets.y;
1066
- if (localX < 0 || localY < 0 || localX >= paintedWidth || localY >= paintedHeight) return 0;
1096
+ return {
1097
+ rect: { left: rect.left, top: rect.top, right: rect.right, bottom: rect.bottom },
1098
+ offsets,
1099
+ ...flips,
1100
+ paintedWidth,
1101
+ paintedHeight,
1102
+ scaleX,
1103
+ scaleY,
1104
+ sourceWidth,
1105
+ sourceHeight,
1106
+ };
1107
+ }
1108
+
1109
+ // The source pixel painted at a viewport point, or null outside the painted content box.
1110
+ function sourcePixelAt(mapping, x, y) {
1111
+ const { rect, offsets } = mapping;
1112
+ const localX = (mapping.flipX ? rect.right - x : x - rect.left) - offsets.x;
1113
+ const localY = (mapping.flipY ? rect.bottom - y : y - rect.top) - offsets.y;
1114
+ if (
1115
+ localX < 0 ||
1116
+ localY < 0 ||
1117
+ localX >= mapping.paintedWidth ||
1118
+ localY >= mapping.paintedHeight
1119
+ ) {
1120
+ return null;
1121
+ }
1122
+ return {
1123
+ x: Math.min(mapping.sourceWidth - 1, Math.max(0, Math.floor(localX / mapping.scaleX))),
1124
+ y: Math.min(mapping.sourceHeight - 1, Math.max(0, Math.floor(localY / mapping.scaleY))),
1125
+ };
1126
+ }
1127
+
1128
+ // Return the alpha painted by an <img> at a viewport point. `null` means the
1129
+ // browser would not let us inspect the image (not loaded or cross-origin), in
1130
+ // which case callers preserve the conservative opaque fallback.
1131
+ function imageAlphaAt(element, x, y) {
1132
+ const sourceWidth = element.naturalWidth;
1133
+ const sourceHeight = element.naturalHeight;
1134
+ const mapping = paintedSourceMapping(element, sourceWidth, sourceHeight);
1135
+ if (!mapping) return null;
1136
+ const pixel = sourcePixelAt(mapping, x, y);
1137
+ if (!pixel) return 0;
1067
1138
 
1068
1139
  try {
1069
1140
  let cached = imageAlphaCanvases.get(element);
@@ -1083,25 +1154,129 @@
1083
1154
  cached = { context, width: sourceWidth, height: sourceHeight, source };
1084
1155
  imageAlphaCanvases.set(element, cached);
1085
1156
  }
1086
- const sourceX = Math.min(sourceWidth - 1, Math.max(0, Math.floor(localX / scaleX)));
1087
- const sourceY = Math.min(sourceHeight - 1, Math.max(0, Math.floor(localY / scaleY)));
1088
- return cached.context.getImageData(sourceX, sourceY, 1, 1).data[3] / 255;
1157
+ return cached.context.getImageData(pixel.x, pixel.y, 1, 1).data[3] / 255;
1089
1158
  } catch {
1090
1159
  return null;
1091
1160
  }
1092
1161
  }
1093
1162
 
1163
+ const OCCLUDING_ALPHA = 0.6;
1164
+ const VIDEO_ALPHA_MAX_SIDE = 480;
1165
+ let videoAlphaFrames = new Map();
1166
+ let videoAlphaScratch = null;
1167
+
1168
+ function videoAlphaContext(width, height) {
1169
+ if (!videoAlphaScratch) {
1170
+ const canvas = document.createElement("canvas");
1171
+ const context = canvas.getContext("2d", { willReadFrequently: true });
1172
+ if (!context) return null;
1173
+ videoAlphaScratch = { canvas, context };
1174
+ }
1175
+ videoAlphaScratch.canvas.width = width;
1176
+ videoAlphaScratch.canvas.height = height;
1177
+ return videoAlphaScratch.context;
1178
+ }
1179
+
1180
+ // Read once per audit call, so per sample time, and only for a video some text probe lands under.
1181
+ function videoAlphaFrame(video) {
1182
+ let frame = videoAlphaFrames.get(video);
1183
+ if (!frame) {
1184
+ frame = readVideoAlphaFrame(video);
1185
+ videoAlphaFrames.set(video, frame);
1186
+ }
1187
+ return frame;
1188
+ }
1189
+
1190
+ function unreadVideoFrame(reason) {
1191
+ return { kind: "unread", reason };
1192
+ }
1193
+
1194
+ // "opaque" keeps a video's whole box occluding; "matte" judges each point by the decoded
1195
+ // frame's alpha; "unread" falls back to opaque and is reported, never guessed.
1196
+ function readVideoAlphaFrame(video) {
1197
+ if (video.seeking) return unreadVideoFrame("the seek had not landed");
1198
+ if (video.readyState < 2) return unreadVideoFrame("no frame was decoded at this time");
1199
+ if (!video.videoWidth || !video.videoHeight)
1200
+ return unreadVideoFrame("the video has no frame size");
1201
+ const mapping = paintedSourceMapping(video, video.videoWidth, video.videoHeight);
1202
+ if (!mapping) return unreadVideoFrame("it is rotated, skewed or transformed in 3D");
1203
+ const downscale = Math.min(
1204
+ 1,
1205
+ VIDEO_ALPHA_MAX_SIDE / Math.max(mapping.sourceWidth, mapping.sourceHeight),
1206
+ );
1207
+ const width = Math.max(1, Math.round(mapping.sourceWidth * downscale));
1208
+ const height = Math.max(1, Math.round(mapping.sourceHeight * downscale));
1209
+ let rgba;
1210
+ try {
1211
+ const context = videoAlphaContext(width, height);
1212
+ if (!context) return unreadVideoFrame("no 2D canvas was available");
1213
+ context.clearRect(0, 0, width, height);
1214
+ context.drawImage(video, 0, 0, width, height);
1215
+ rgba = context.getImageData(0, 0, width, height).data;
1216
+ } catch (error) {
1217
+ return unreadVideoFrame(
1218
+ error && error.name === "SecurityError"
1219
+ ? "its source is cross-origin"
1220
+ : "its frame could not be drawn",
1221
+ );
1222
+ }
1223
+ return classifyVideoAlpha(rgba, width, height, mapping, opacityChain(video));
1224
+ }
1225
+
1226
+ function classifyVideoAlpha(rgba, width, height, mapping, opacity) {
1227
+ const alpha = new Uint8Array(width * height);
1228
+ let clear = 0;
1229
+ let painted = 0;
1230
+ for (let index = 0; index < alpha.length; index++) {
1231
+ alpha[index] = rgba[index * 4 + 3];
1232
+ if (alpha[index] < OCCLUDING_ALPHA * 255) clear += 1;
1233
+ if (alpha[index] > 0) painted += 1;
1234
+ }
1235
+ if (clear === 0) return { kind: "opaque" };
1236
+ if (painted === 0) return unreadVideoFrame("its frame read back fully transparent");
1237
+ return {
1238
+ kind: "matte",
1239
+ alpha,
1240
+ width,
1241
+ height,
1242
+ opacity,
1243
+ mapping: {
1244
+ ...mapping,
1245
+ sourceWidth: width,
1246
+ sourceHeight: height,
1247
+ scaleX: mapping.paintedWidth / width,
1248
+ scaleY: mapping.paintedHeight / height,
1249
+ },
1250
+ };
1251
+ }
1252
+
1253
+ function matteOccludesAt(frame, x, y) {
1254
+ const pixel = sourcePixelAt(frame.mapping, x, y);
1255
+ if (!pixel) return false;
1256
+ return (frame.alpha[pixel.y * frame.width + pixel.x] / 255) * frame.opacity >= OCCLUDING_ALPHA;
1257
+ }
1258
+
1259
+ // A video with an opaque CSS background paints that background behind its clear pixels.
1260
+ function matteFrameFor(element) {
1261
+ if (element.tagName !== "VIDEO") return null;
1262
+ if (hasOpaqueBackground(getComputedStyle(element))) return null;
1263
+ const frame = videoAlphaFrame(element);
1264
+ return frame.kind === "matte" ? frame : null;
1265
+ }
1266
+
1094
1267
  // An element hides text beneath it when it paints opaque pixels at near-full
1095
1268
  // opacity: raster content (img/video/canvas), a background image, or a solid
1096
1269
  // background colour. Low-opacity overlays (grain, scrims) do not occlude.
1097
1270
  function isOpaqueOccluder(element, x, y) {
1098
1271
  const opacity = opacityChain(element);
1099
- if (opacity < 0.6) return false;
1272
+ if (opacity < OCCLUDING_ALPHA) return false;
1100
1273
  if (IGNORE_TAGS.has(element.tagName)) return false;
1101
1274
  if (element.tagName === "IMG") {
1102
1275
  const alpha = imageAlphaAt(element, x, y);
1103
- if (alpha !== null) return alpha * opacity >= 0.6;
1276
+ if (alpha !== null) return alpha * opacity >= OCCLUDING_ALPHA;
1104
1277
  }
1278
+ const matte = matteFrameFor(element);
1279
+ if (matte) return matteOccludesAt(matte, x, y);
1105
1280
  if (RASTER_TAGS.has(element.tagName)) return true;
1106
1281
  return hasOpaqueBackground(getComputedStyle(element));
1107
1282
  }
@@ -1150,7 +1325,7 @@
1150
1325
  // there is related to the text, non-opaque, sharing a 3D context with it, or
1151
1326
  // part of a transient crossfade overlap.
1152
1327
  // fallow-ignore-next-line complexity
1153
- function occluderAt(element, x, y) {
1328
+ function occluderAt(element, x, y, seenMattes) {
1154
1329
  // Walk the paint-ordered stack: a transparent layer on top must not mask an opaque one below it.
1155
1330
  const stack =
1156
1331
  typeof document.elementsFromPoint === "function"
@@ -1163,6 +1338,8 @@
1163
1338
  // Pair-specific exemptions excuse this hit only; keep walking for deeper occluders.
1164
1339
  if (sharedPreserve3d(element, hit)) continue;
1165
1340
  if (isCrossSceneTransitionOverlap(element, hit)) continue;
1341
+ const matte = seenMattes && matteFrameFor(hit);
1342
+ if (matte && !seenMattes.has(matte)) seenMattes.set(matte, hit);
1166
1343
  if (isOpaqueOccluder(hit, x, y)) return hit;
1167
1344
  }
1168
1345
  return null;
@@ -1196,21 +1373,162 @@
1196
1373
  function occlusionCoverage(element, textRects) {
1197
1374
  let occluder = null;
1198
1375
  let hits = 0;
1376
+ let opaqueHits = 0;
1377
+ // Every matte above the text, including where its alpha is clear: a feature narrower than the
1378
+ // probe grid (an arm, a mic stand) can hide a word between two probe columns.
1379
+ const seenMattes = new Map();
1199
1380
  for (const textRect of textRects) {
1200
1381
  for (const yFraction of OCCLUSION_PROBE_Y_FRACTIONS) {
1201
1382
  const y = textRect.top + textRect.height * yFraction;
1202
1383
  for (const xFraction of OCCLUSION_PROBE_X_FRACTIONS) {
1203
- const hit = occluderAt(element, textRect.left + textRect.width * xFraction, y);
1384
+ const x = textRect.left + textRect.width * xFraction;
1385
+ const hit = occluderAt(element, x, y, seenMattes);
1204
1386
  if (!hit) continue;
1205
1387
  hits += 1;
1206
1388
  if (!occluder) occluder = hit;
1389
+ if (!matteFrameFor(hit)) opaqueHits += 1;
1207
1390
  }
1208
1391
  }
1209
1392
  }
1393
+ const judgeByMatte = opaqueHits === 0 && seenMattes.size > 0;
1210
1394
  return {
1211
- occluder,
1395
+ occluder: occluder || (judgeByMatte ? seenMattes.values().next().value : null),
1212
1396
  coveredFraction: round(hits / (OCCLUSION_GRID_POINTS * textRects.length)),
1397
+ mattes: judgeByMatte ? [...seenMattes.keys()] : [],
1398
+ };
1399
+ }
1400
+
1401
+ // Thresholds from measuring rendered words against real subject mattes: a word reads as
1402
+ // deliberately tucked behind the subject at 30-55% covered, and is lost at 80%, or when it
1403
+ // and its neighbour are both half covered.
1404
+ const MATTE_WORD_LOST_COVERAGE = 0.8;
1405
+ const MATTE_PAIR_LOST_COVERAGE = 0.5;
1406
+ const MATTE_MAX_SAMPLES_PER_AXIS = 48;
1407
+
1408
+ function wordClientRects(element) {
1409
+ const words = [];
1410
+ for (const node of directTextNodes(element)) {
1411
+ for (const match of (node.textContent || "").matchAll(/\S+/g)) {
1412
+ const range = document.createRange();
1413
+ range.setStart(node, match.index);
1414
+ range.setEnd(node, match.index + match[0].length);
1415
+ const rects = Array.from(range.getClientRects()).filter(
1416
+ (rect) => rect.width > 0.5 && rect.height > 0.5,
1417
+ );
1418
+ range.detach();
1419
+ if (rects.length > 0) words.push({ word: match[0], rects });
1420
+ }
1421
+ }
1422
+ return words;
1423
+ }
1424
+
1425
+ function matteSampleCount(length, mattes) {
1426
+ const pitch = Math.max(1, Math.min(...mattes.map((matte) => matte.mapping.scaleX)));
1427
+ return Math.max(1, Math.min(MATTE_MAX_SAMPLES_PER_AXIS, Math.ceil(length / pitch)));
1428
+ }
1429
+
1430
+ // Area-weighted share of the rects under any matte's occluding alpha, sampled at the matte's resolution.
1431
+ function matteCoverage(rects, mattes) {
1432
+ let coveredArea = 0;
1433
+ let totalArea = 0;
1434
+ for (const rect of rects) {
1435
+ const cols = matteSampleCount(rect.width, mattes);
1436
+ const rows = matteSampleCount(rect.height, mattes);
1437
+ let covered = 0;
1438
+ for (let row = 0; row < rows; row++) {
1439
+ const y = rect.top + ((row + 0.5) * rect.height) / rows;
1440
+ for (let col = 0; col < cols; col++) {
1441
+ const x = rect.left + ((col + 0.5) * rect.width) / cols;
1442
+ if (mattes.some((matte) => matteOccludesAt(matte, x, y))) covered += 1;
1443
+ }
1444
+ }
1445
+ const area = rect.width * rect.height;
1446
+ coveredArea += (area * covered) / (rows * cols);
1447
+ totalArea += area;
1448
+ }
1449
+ return totalArea > 0 ? round(coveredArea / totalArea) : 0;
1450
+ }
1451
+
1452
+ function lostNeighbourPair(words) {
1453
+ for (let index = 1; index < words.length; index++) {
1454
+ const pair = [words[index - 1], words[index]];
1455
+ if (pair.every((word) => word.coverage >= MATTE_PAIR_LOST_COVERAGE)) return pair;
1456
+ }
1457
+ return null;
1458
+ }
1459
+
1460
+ function percent(fraction) {
1461
+ return `${Math.round(fraction * 100)}%`;
1462
+ }
1463
+
1464
+ function lostWordsMessage(lostWord, pair) {
1465
+ if (lostWord) {
1466
+ return `"${lostWord.word}" is ${percent(lostWord.coverage)} behind a transparent video's matte.`;
1467
+ }
1468
+ return `Neighbouring words "${pair[0].word}" and "${pair[1].word}" are ${percent(pair[0].coverage)} and ${percent(pair[1].coverage)} behind a transparent video's matte.`;
1469
+ }
1470
+
1471
+ function markMatteWordsLost(issue, lostWord, pair) {
1472
+ issue.severity = "error";
1473
+ issue.message = lostWordsMessage(lostWord, pair);
1474
+ issue.fixHint =
1475
+ "Move or resize the text so no word is 80% behind the matte and no two neighbouring words are each half behind it, or mark intentional layering with data-layout-allow-occlusion.";
1476
+ }
1477
+
1478
+ // Text behind a cutout is judged per rendered word against the decoded alpha: partial cover is
1479
+ // reported as info with its share, a lost word is an error.
1480
+ function matteOcclusionIssue(element, time, textRect, text, occluder, mattes) {
1481
+ const words = wordClientRects(element).map(({ word, rects }) => ({
1482
+ word,
1483
+ coverage: matteCoverage(rects, mattes),
1484
+ }));
1485
+ if (words.length === 0) return null;
1486
+ const peak = words.reduce((top, word) => (word.coverage > top.coverage ? word : top));
1487
+ if (peak.coverage <= 0) return null;
1488
+ const issue = {
1489
+ code: "text_occluded",
1490
+ severity: "info",
1491
+ time,
1492
+ selector: uniqueSelectorFor(element),
1493
+ containerSelector: uniqueSelectorFor(occluder),
1494
+ text,
1495
+ message: `Text sits partly behind a transparent video's matte; its most covered word "${peak.word}" is ${percent(peak.coverage)} hidden.`,
1496
+ rect: textRect,
1497
+ coveredFraction: peak.coverage,
1213
1498
  };
1499
+ const lostWord = peak.coverage >= MATTE_WORD_LOST_COVERAGE ? peak : null;
1500
+ const pair = lostNeighbourPair(words);
1501
+ if (lostWord || pair) markMatteWordsLost(issue, lostWord, pair);
1502
+ return { issue, first: words[0], last: words[words.length - 1] };
1503
+ }
1504
+
1505
+ // Captions often render one word per element, so the neighbour rule also spans sibling elements.
1506
+ function markLostSiblingWords(matteResults) {
1507
+ for (const [element, result] of matteResults) {
1508
+ const next = element.nextElementSibling && matteResults.get(element.nextElementSibling);
1509
+ if (!next) continue;
1510
+ const pair = [result.last, next.first];
1511
+ if (!pair.every((word) => word.coverage >= MATTE_PAIR_LOST_COVERAGE)) continue;
1512
+ for (const { issue } of [result, next]) {
1513
+ if (issue.severity !== "error") markMatteWordsLost(issue, null, pair);
1514
+ }
1515
+ }
1516
+ }
1517
+
1518
+ function unreadVideoIssues(time) {
1519
+ const issues = [];
1520
+ for (const [video, frame] of videoAlphaFrames) {
1521
+ if (frame.kind !== "unread") continue;
1522
+ issues.push({
1523
+ code: "video_alpha_unread",
1524
+ severity: "info",
1525
+ time,
1526
+ selector: uniqueSelectorFor(video),
1527
+ message: `Could not read this video's frame alpha (${frame.reason}), so text under it was judged as if the video were opaque.`,
1528
+ rect: toRect(video.getBoundingClientRect()),
1529
+ });
1530
+ }
1531
+ return issues;
1214
1532
  }
1215
1533
 
1216
1534
  // pointer-events:none hides elements from elementFromPoint — both probed text AND occluders.
@@ -1240,18 +1558,23 @@
1240
1558
  }
1241
1559
 
1242
1560
  // text_occluded: atomic labels flag at any hit; prose needs coveredFraction >= proseCoverageFloor (default 0.15).
1243
- function occludedTextIssue(element, time, proseCoverageFloor) {
1561
+ function occludedTextIssue(element, time, proseCoverageFloor, matteResults) {
1244
1562
  if (hasAllowOcclusionFlag(element)) return null;
1245
1563
  if (!hasVisibleTextInk(element)) return null;
1246
1564
  const textRect = textRectFor(element, true);
1247
1565
  if (!textRect) return null;
1248
1566
  const textRects = textClientRects(element, true);
1249
1567
  const text = textContentFor(element, true);
1250
- const { occluder, coveredFraction } = occlusionCoverage(
1568
+ const { occluder, coveredFraction, mattes } = occlusionCoverage(
1251
1569
  element,
1252
1570
  textRects.length > 0 ? textRects : [textRect],
1253
1571
  );
1254
1572
  if (!occluder) return null;
1573
+ if (mattes.length > 0) {
1574
+ const result = matteOcclusionIssue(element, time, textRect, text, occluder, mattes);
1575
+ if (result) matteResults.set(element, result);
1576
+ return result ? result.issue : null;
1577
+ }
1255
1578
  if (!isAtomicLabel(text) && coveredFraction < proseCoverageFloor) return null;
1256
1579
  return {
1257
1580
  code: "text_occluded",
@@ -2015,6 +2338,8 @@
2015
2338
  isVisibleElement(element, 0.05),
2016
2339
  );
2017
2340
  const issues = [];
2341
+ const matteResults = new Map();
2342
+ videoAlphaFrames = new Map();
2018
2343
 
2019
2344
  const restoreHits = restoreHitTesting(root);
2020
2345
  try {
@@ -2023,7 +2348,7 @@
2023
2348
  const clipped = clippedTextIssue(element, time, tolerance);
2024
2349
  if (clipped) issues.push(clipped);
2025
2350
  issues.push(...textOverflowIssues(element, root, rootRect, time, tolerance, clipped));
2026
- const occluded = occludedTextIssue(element, time, proseCoverageFloor);
2351
+ const occluded = occludedTextIssue(element, time, proseCoverageFloor, matteResults);
2027
2352
  if (occluded) issues.push(occluded);
2028
2353
  const invisible = invisibleTextIssue(element, time);
2029
2354
  if (invisible) issues.push(invisible);
@@ -2031,6 +2356,8 @@
2031
2356
  } finally {
2032
2357
  restoreHits();
2033
2358
  }
2359
+ markLostSiblingWords(matteResults);
2360
+ issues.push(...unreadVideoIssues(time));
2034
2361
 
2035
2362
  issues.push(...containerOverflowIssues(root, time, tolerance));
2036
2363
  issues.push(...contentOverlapIssues(root, time));
@@ -16,42 +16,42 @@ import "./chunk-MRF4AMKD.js";
16
16
  import {
17
17
  openSettledCompositionPage,
18
18
  seekCompositionTimeline
19
- } from "./chunk-ON2HYNGB.js";
20
- import "./chunk-B5FZ2CQM.js";
19
+ } from "./chunk-QXAXCRK5.js";
20
+ import "./chunk-2ALJMIFW.js";
21
21
  import "./chunk-FH7WODJH.js";
22
- import "./chunk-ERTJPFCH.js";
22
+ import "./chunk-H3JGPRWA.js";
23
23
  import "./chunk-WPNE5NEP.js";
24
24
  import "./chunk-K2FLNJVB.js";
25
25
  import {
26
26
  serveStaticProjectHtml
27
- } from "./chunk-RGYEL7QD.js";
27
+ } from "./chunk-AXATVUCD.js";
28
28
  import "./chunk-X7MTZ4T2.js";
29
- import "./chunk-XWWYGXJ5.js";
30
- import "./chunk-SB5DX6AD.js";
29
+ import "./chunk-JEW5CCRU.js";
30
+ import "./chunk-Z6VBXCYN.js";
31
31
  import "./chunk-442JNXRM.js";
32
32
  import "./chunk-XUHOIDKG.js";
33
- import "./chunk-5YSHR4XC.js";
34
- import "./chunk-GIPNECWL.js";
33
+ import "./chunk-CXVBPW5F.js";
34
+ import "./chunk-D5PUMG2P.js";
35
35
  import "./chunk-6JR2XUEE.js";
36
36
  import "./chunk-C6TPGUWD.js";
37
- import "./chunk-4ID635FL.js";
37
+ import "./chunk-5K5YH6M7.js";
38
38
  import "./chunk-JGYHWVXQ.js";
39
39
  import "./chunk-FFDC5OWV.js";
40
- import "./chunk-GG37I7B3.js";
40
+ import "./chunk-BHGIBGUZ.js";
41
41
  import "./chunk-XT7X6QCP.js";
42
42
  import "./chunk-4YYJOFKS.js";
43
43
  import "./chunk-HVW7ABXD.js";
44
- import "./chunk-D33YJZOH.js";
45
- import "./chunk-N2NDDTYW.js";
46
- import "./chunk-EVRUR7DW.js";
44
+ import "./chunk-DSXDYQQV.js";
45
+ import "./chunk-QGYAHDOR.js";
46
+ import "./chunk-H45RC6HN.js";
47
47
  import "./chunk-AWDFDFI3.js";
48
48
  import "./chunk-P6LJ4Y32.js";
49
49
  import "./chunk-GMECXFAN.js";
50
50
  import "./chunk-5CS4T6C6.js";
51
51
  import {
52
52
  trackCompareSheet
53
- } from "./chunk-YLBV2PXM.js";
54
- import "./chunk-ZEWX3GHP.js";
53
+ } from "./chunk-HQMWZNO2.js";
54
+ import "./chunk-2XIPB4MP.js";
55
55
  import "./chunk-VWG7OQKU.js";
56
56
  import "./chunk-QWQ6GQTI.js";
57
57
  import {
@@ -69,21 +69,21 @@ import "./chunk-EOOEC32M.js";
69
69
  import "./chunk-TJSTGSAW.js";
70
70
  import {
71
71
  withMeta
72
- } from "./chunk-T5BG7PYZ.js";
72
+ } from "./chunk-Z6P5OVCF.js";
73
73
  import "./chunk-K4WIOZFP.js";
74
74
  import "./chunk-XUXGIA7H.js";
75
75
  import "./chunk-WERLJGIC.js";
76
76
  import "./chunk-ISN5GRYI.js";
77
- import "./chunk-3NSVHCOH.js";
77
+ import "./chunk-VG3ZMY2H.js";
78
78
  import "./chunk-EOVYQ3IG.js";
79
79
  import "./chunk-XT6MXC7A.js";
80
- import "./chunk-PLEMSN3E.js";
81
- import "./chunk-LYIG2GZ5.js";
80
+ import "./chunk-A356JY2J.js";
81
+ import "./chunk-42AER3PM.js";
82
82
  import "./chunk-KCF6GHJP.js";
83
83
  import "./chunk-JYVGYKXG.js";
84
84
  import "./chunk-7KDQAD2W.js";
85
- import "./chunk-Q3TFX4OZ.js";
86
- import "./chunk-P47XYVEQ.js";
85
+ import "./chunk-NZ7K76Y2.js";
86
+ import "./chunk-ZJO4SLHC.js";
87
87
  import "./chunk-VC76R6W2.js";
88
88
  import "./chunk-UJKQWGFF.js";
89
89
  import "./chunk-ALLKNYC3.js";
@@ -287,7 +287,7 @@ function cleanupPreparedCompareVariants(variants) {
287
287
  }
288
288
  async function renderCompareVariant(variant, opts) {
289
289
  try {
290
- const { bundleToSingleHtml } = await import("./compiler-57M6W5WY.js");
290
+ const { bundleToSingleHtml } = await import("./compiler-RKH75FZH.js");
291
291
  const html = await bundleToSingleHtml(variant.projectDir);
292
292
  const server = await serveStaticProjectHtml(variant.projectDir, html);
293
293
  try {
@@ -24,7 +24,7 @@ import {
24
24
  scopeCssToComposition,
25
25
  validateHyperframeHtmlContract,
26
26
  wrapScopedCompositionScript
27
- } from "./chunk-LYIG2GZ5.js";
27
+ } from "./chunk-42AER3PM.js";
28
28
  import "./chunk-KCF6GHJP.js";
29
29
  import {
30
30
  AFTER_FONTS_SCRIPT_TYPE,
@@ -56,7 +56,7 @@ import {
56
56
  shouldClampResolvedMediaDuration,
57
57
  stripEmbeddedRuntimeScripts,
58
58
  styleElementsFor
59
- } from "./chunk-P47XYVEQ.js";
59
+ } from "./chunk-ZJO4SLHC.js";
60
60
  import "./chunk-VC76R6W2.js";
61
61
  import "./chunk-UJKQWGFF.js";
62
62
  import "./chunk-ALLKNYC3.js";
@@ -7,7 +7,7 @@ var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  downloadRender,
9
9
  runAssetImport
10
- } from "./chunk-KAKBRDU4.js";
10
+ } from "./chunk-OGGPNDGO.js";
11
11
  import {
12
12
  FigmaClientError,
13
13
  createFigmaClient,
@@ -16,7 +16,7 @@ import {
16
16
  readBindings,
17
17
  resolveBindings,
18
18
  withFigmaErrors
19
- } from "./chunk-3LQEZ4EI.js";
19
+ } from "./chunk-OZUYK6IS.js";
20
20
  import "./chunk-K2FLNJVB.js";
21
21
  import {
22
22
  defineCommand
@@ -159,7 +159,7 @@ var component_default = defineCommand({
159
159
  `${result.unresolved.length} binding(s) reference tokens not yet imported \u2014 colors baked as literals (flagged data-figma-unresolved). Run \`hyperframes figma tokens\` on the source/library file, then re-import to link them.`
160
160
  );
161
161
  }
162
- const { trackFigmaImport } = await import("./telemetry-WVHWY3DU.js");
162
+ const { trackFigmaImport } = await import("./telemetry-4G6CD3X7.js");
163
163
  trackFigmaImport({
164
164
  phase: "component",
165
165
  unresolvedBindings: result.unresolved.length,
@@ -6,13 +6,13 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  resolveProject
9
- } from "./chunk-YJKUE3LV.js";
9
+ } from "./chunk-NU4PDQ6G.js";
10
10
  import "./chunk-K2FLNJVB.js";
11
11
  import {
12
12
  ensureDOMParser
13
13
  } from "./chunk-442JNXRM.js";
14
- import "./chunk-YLBV2PXM.js";
15
- import "./chunk-ZEWX3GHP.js";
14
+ import "./chunk-HQMWZNO2.js";
15
+ import "./chunk-2XIPB4MP.js";
16
16
  import "./chunk-VWG7OQKU.js";
17
17
  import "./chunk-QWQ6GQTI.js";
18
18
  import {
@@ -25,22 +25,22 @@ import {
25
25
  } from "./chunk-ZTZA4UWZ.js";
26
26
  import {
27
27
  withMeta
28
- } from "./chunk-T5BG7PYZ.js";
28
+ } from "./chunk-Z6P5OVCF.js";
29
29
  import "./chunk-K4WIOZFP.js";
30
30
  import "./chunk-XUXGIA7H.js";
31
31
  import "./chunk-WERLJGIC.js";
32
32
  import "./chunk-ISN5GRYI.js";
33
- import "./chunk-3NSVHCOH.js";
33
+ import "./chunk-VG3ZMY2H.js";
34
34
  import "./chunk-XT6MXC7A.js";
35
35
  import {
36
36
  resolveReferencedStart
37
- } from "./chunk-PLEMSN3E.js";
38
- import "./chunk-LYIG2GZ5.js";
37
+ } from "./chunk-A356JY2J.js";
38
+ import "./chunk-42AER3PM.js";
39
39
  import "./chunk-KCF6GHJP.js";
40
40
  import "./chunk-JYVGYKXG.js";
41
41
  import "./chunk-7KDQAD2W.js";
42
- import "./chunk-Q3TFX4OZ.js";
43
- import "./chunk-P47XYVEQ.js";
42
+ import "./chunk-NZ7K76Y2.js";
43
+ import "./chunk-ZJO4SLHC.js";
44
44
  import "./chunk-VC76R6W2.js";
45
45
  import "./chunk-UJKQWGFF.js";
46
46
  import "./chunk-ALLKNYC3.js";
@@ -25,12 +25,12 @@ import {
25
25
  } from "./chunk-ZTZA4UWZ.js";
26
26
  import {
27
27
  withMeta
28
- } from "./chunk-T5BG7PYZ.js";
28
+ } from "./chunk-Z6P5OVCF.js";
29
29
  import "./chunk-K4WIOZFP.js";
30
30
  import "./chunk-XUXGIA7H.js";
31
31
  import "./chunk-WERLJGIC.js";
32
32
  import "./chunk-ISN5GRYI.js";
33
- import "./chunk-3NSVHCOH.js";
33
+ import "./chunk-VG3ZMY2H.js";
34
34
  import "./chunk-BXCMXMJQ.js";
35
35
  import "./chunk-EOVYQ3IG.js";
36
36
  import "./chunk-OFQWTKPW.js";