@ethlete/cli 3.0.0-next.26 → 3.0.0-next.27

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 (557) hide show
  1. package/CHANGELOG.md +328 -0
  2. package/build-info.json +1 -0
  3. package/design/define-call.ts +72 -30
  4. package/design/define-part.ts +37 -4
  5. package/design/icon-sheet.ts +1 -1
  6. package/design/interaction-rows.ts +13 -6
  7. package/design/mark-part.ts +51 -1
  8. package/design/token-sheet.ts +1 -1
  9. package/design/web/frame-fit.ts +7 -0
  10. package/design/web/frame-surfaces.ts +294 -0
  11. package/design/web/frame.ts +41 -15
  12. package/design/web/surface-interactive.css +42 -0
  13. package/design/with-action.ts +29 -0
  14. package/package.json +3 -1
  15. package/src/index.js +9 -1
  16. package/src/index.js.map +1 -1
  17. package/src/lib/design/asset-shot.js +2 -2
  18. package/src/lib/design/asset-shot.js.map +1 -1
  19. package/src/lib/design/build-watch.d.ts +26 -0
  20. package/src/lib/design/build-watch.js +138 -0
  21. package/src/lib/design/build-watch.js.map +1 -0
  22. package/src/lib/design/check.js +142 -16
  23. package/src/lib/design/check.js.map +1 -1
  24. package/src/lib/design/commit-hunks.d.ts +22 -0
  25. package/src/lib/design/commit-hunks.js +173 -0
  26. package/src/lib/design/commit-hunks.js.map +1 -0
  27. package/src/lib/design/design-command.d.ts +2 -0
  28. package/src/lib/design/design-command.js +160 -11
  29. package/src/lib/design/design-command.js.map +1 -1
  30. package/src/lib/design/force-interactions.d.ts +1 -1
  31. package/src/lib/design/force-interactions.js +4 -2
  32. package/src/lib/design/force-interactions.js.map +1 -1
  33. package/src/lib/design/inbox-command.js +9 -5
  34. package/src/lib/design/inbox-command.js.map +1 -1
  35. package/src/lib/design/mcp-command.d.ts +5 -1
  36. package/src/lib/design/mcp-command.js +29 -11
  37. package/src/lib/design/mcp-command.js.map +1 -1
  38. package/src/lib/design/merge-compare.d.ts +10 -2
  39. package/src/lib/design/merge-compare.js +63 -11
  40. package/src/lib/design/merge-compare.js.map +1 -1
  41. package/src/lib/design/motion-command.js +1 -1
  42. package/src/lib/design/motion-command.js.map +1 -1
  43. package/src/lib/design/motion-shot.js +3 -2
  44. package/src/lib/design/motion-shot.js.map +1 -1
  45. package/src/lib/design/new-call.js +19 -10
  46. package/src/lib/design/new-call.js.map +1 -1
  47. package/src/lib/design/part-marks.d.ts +3 -2
  48. package/src/lib/design/part-marks.js +13 -5
  49. package/src/lib/design/part-marks.js.map +1 -1
  50. package/src/lib/design/paths.d.ts +28 -0
  51. package/src/lib/design/paths.js.map +1 -1
  52. package/src/lib/design/product-command.d.ts +1 -1
  53. package/src/lib/design/product-command.js +12 -14
  54. package/src/lib/design/product-command.js.map +1 -1
  55. package/src/lib/design/ready-shots.d.ts +29 -3
  56. package/src/lib/design/ready-shots.js +105 -5
  57. package/src/lib/design/ready-shots.js.map +1 -1
  58. package/src/lib/design/render-packages.d.ts +4 -17
  59. package/src/lib/design/render-packages.js +20 -63
  60. package/src/lib/design/render-packages.js.map +1 -1
  61. package/src/lib/design/render-worker.js +1 -3
  62. package/src/lib/design/render-worker.js.map +1 -1
  63. package/src/lib/design/render.d.ts +2 -0
  64. package/src/lib/design/render.js +32 -7
  65. package/src/lib/design/render.js.map +1 -1
  66. package/src/lib/design/serve.d.ts +21 -1
  67. package/src/lib/design/serve.js +133 -19
  68. package/src/lib/design/serve.js.map +1 -1
  69. package/src/lib/design/server-identity.d.ts +36 -0
  70. package/src/lib/design/server-identity.js +68 -0
  71. package/src/lib/design/server-identity.js.map +1 -0
  72. package/src/lib/design/settle-frames.d.ts +4 -0
  73. package/src/lib/design/settle-frames.js +22 -0
  74. package/src/lib/design/settle-frames.js.map +1 -0
  75. package/src/lib/design/shot-command.d.ts +25 -4
  76. package/src/lib/design/shot-command.js +132 -46
  77. package/src/lib/design/shot-command.js.map +1 -1
  78. package/src/lib/design/shot.d.ts +50 -0
  79. package/src/lib/design/shot.js +143 -17
  80. package/src/lib/design/shot.js.map +1 -1
  81. package/src/lib/design/sketch-command.d.ts +6 -1
  82. package/src/lib/design/sketch-command.js +358 -126
  83. package/src/lib/design/sketch-command.js.map +1 -1
  84. package/src/lib/design/stale-cli-dist.d.ts +11 -0
  85. package/src/lib/design/stale-cli-dist.js +56 -0
  86. package/src/lib/design/stale-cli-dist.js.map +1 -0
  87. package/src/lib/design/stamp.d.ts +18 -1
  88. package/src/lib/design/stamp.js +53 -7
  89. package/src/lib/design/stamp.js.map +1 -1
  90. package/src/lib/design/started-by-studio.d.ts +1 -0
  91. package/src/lib/design/started-by-studio.js +6 -0
  92. package/src/lib/design/started-by-studio.js.map +1 -0
  93. package/src/lib/design/studio-api.d.ts +27 -8
  94. package/src/lib/design/studio-api.js +263 -58
  95. package/src/lib/design/studio-api.js.map +1 -1
  96. package/src/lib/design/system/accept-command.d.ts +39 -5
  97. package/src/lib/design/system/accept-command.js +109 -25
  98. package/src/lib/design/system/accept-command.js.map +1 -1
  99. package/src/lib/design/system/accepted-pictures.d.ts +83 -0
  100. package/src/lib/design/system/accepted-pictures.js +324 -0
  101. package/src/lib/design/system/accepted-pictures.js.map +1 -0
  102. package/src/lib/design/system/action-lost.d.ts +59 -0
  103. package/src/lib/design/system/action-lost.js +120 -0
  104. package/src/lib/design/system/action-lost.js.map +1 -0
  105. package/src/lib/design/system/action-press.d.ts +23 -0
  106. package/src/lib/design/system/action-press.js +76 -0
  107. package/src/lib/design/system/action-press.js.map +1 -0
  108. package/src/lib/design/system/action-undeclared.d.ts +34 -0
  109. package/src/lib/design/system/action-undeclared.js +81 -0
  110. package/src/lib/design/system/action-undeclared.js.map +1 -0
  111. package/src/lib/design/system/actions-command.d.ts +101 -0
  112. package/src/lib/design/system/actions-command.js +695 -0
  113. package/src/lib/design/system/actions-command.js.map +1 -0
  114. package/src/lib/design/system/actions.d.ts +158 -0
  115. package/src/lib/design/system/actions.js +295 -0
  116. package/src/lib/design/system/actions.js.map +1 -0
  117. package/src/lib/design/system/app-files.d.ts +10 -0
  118. package/src/lib/design/system/app-files.js +159 -0
  119. package/src/lib/design/system/app-files.js.map +1 -0
  120. package/src/lib/design/system/bespoke-controls.d.ts +30 -0
  121. package/src/lib/design/system/bespoke-controls.js +147 -0
  122. package/src/lib/design/system/bespoke-controls.js.map +1 -0
  123. package/src/lib/design/system/build-ready-contract.d.ts +27 -0
  124. package/src/lib/design/system/build-ready-contract.js +12 -0
  125. package/src/lib/design/system/build-ready-contract.js.map +1 -0
  126. package/src/lib/design/system/check-rules.d.ts +1 -0
  127. package/src/lib/design/system/check-rules.js +82 -0
  128. package/src/lib/design/system/check-rules.js.map +1 -0
  129. package/src/lib/design/system/check-system.d.ts +61 -6
  130. package/src/lib/design/system/check-system.js +479 -68
  131. package/src/lib/design/system/check-system.js.map +1 -1
  132. package/src/lib/design/system/comments/comment.d.ts +4 -1
  133. package/src/lib/design/system/comments/comment.js +13 -4
  134. package/src/lib/design/system/comments/comment.js.map +1 -1
  135. package/src/lib/design/system/comments/inbox.js +2 -2
  136. package/src/lib/design/system/comments/inbox.js.map +1 -1
  137. package/src/lib/design/system/compare-command.d.ts +119 -0
  138. package/src/lib/design/system/compare-command.js +558 -0
  139. package/src/lib/design/system/compare-command.js.map +1 -0
  140. package/src/lib/design/system/complete-command.js +1 -1
  141. package/src/lib/design/system/complete-command.js.map +1 -1
  142. package/src/lib/design/system/complete.d.ts +32 -1
  143. package/src/lib/design/system/complete.js +144 -48
  144. package/src/lib/design/system/complete.js.map +1 -1
  145. package/src/lib/design/system/component-outputs.d.ts +20 -0
  146. package/src/lib/design/system/component-outputs.js +86 -0
  147. package/src/lib/design/system/component-outputs.js.map +1 -0
  148. package/src/lib/design/system/contrast-check.d.ts +1 -1
  149. package/src/lib/design/system/contrast-check.js +14 -3
  150. package/src/lib/design/system/contrast-check.js.map +1 -1
  151. package/src/lib/design/system/demo-backdrop.d.ts +11 -0
  152. package/src/lib/design/system/demo-backdrop.js +41 -0
  153. package/src/lib/design/system/demo-backdrop.js.map +1 -0
  154. package/src/lib/design/system/design-hash.d.ts +31 -0
  155. package/src/lib/design/system/design-hash.js +73 -0
  156. package/src/lib/design/system/design-hash.js.map +1 -0
  157. package/src/lib/design/system/disabled-interaction.d.ts +8 -0
  158. package/src/lib/design/system/disabled-interaction.js +37 -0
  159. package/src/lib/design/system/disabled-interaction.js.map +1 -0
  160. package/src/lib/design/system/dom-command.d.ts +36 -0
  161. package/src/lib/design/system/dom-command.js +175 -0
  162. package/src/lib/design/system/dom-command.js.map +1 -0
  163. package/src/lib/design/system/drawn-open-points.d.ts +25 -3
  164. package/src/lib/design/system/drawn-open-points.js +65 -14
  165. package/src/lib/design/system/drawn-open-points.js.map +1 -1
  166. package/src/lib/design/system/dropped-props.d.ts +25 -0
  167. package/src/lib/design/system/dropped-props.js +159 -0
  168. package/src/lib/design/system/dropped-props.js.map +1 -0
  169. package/src/lib/design/system/embedded-actions.d.ts +21 -0
  170. package/src/lib/design/system/embedded-actions.js +37 -0
  171. package/src/lib/design/system/embedded-actions.js.map +1 -0
  172. package/src/lib/design/system/exceptions.js +2 -1
  173. package/src/lib/design/system/exceptions.js.map +1 -1
  174. package/src/lib/design/system/flows/flow.js +2 -1
  175. package/src/lib/design/system/flows/flow.js.map +1 -1
  176. package/src/lib/design/system/frozen-animations.d.ts +13 -0
  177. package/src/lib/design/system/frozen-animations.js +51 -0
  178. package/src/lib/design/system/frozen-animations.js.map +1 -0
  179. package/src/lib/design/system/go-batch.d.ts +24 -0
  180. package/src/lib/design/system/go-batch.js +110 -0
  181. package/src/lib/design/system/go-batch.js.map +1 -0
  182. package/src/lib/design/system/go-command.d.ts +4 -0
  183. package/src/lib/design/system/go-command.js +64 -0
  184. package/src/lib/design/system/go-command.js.map +1 -0
  185. package/src/lib/design/system/go-guard.d.ts +26 -0
  186. package/src/lib/design/system/go-guard.js +70 -0
  187. package/src/lib/design/system/go-guard.js.map +1 -0
  188. package/src/lib/design/system/go-step.d.ts +13 -0
  189. package/src/lib/design/system/go-step.js +84 -0
  190. package/src/lib/design/system/go-step.js.map +1 -0
  191. package/src/lib/design/system/handoff.js +2 -1
  192. package/src/lib/design/system/handoff.js.map +1 -1
  193. package/src/lib/design/system/harness-build-cache.d.ts +35 -0
  194. package/src/lib/design/system/harness-build-cache.js +175 -0
  195. package/src/lib/design/system/harness-build-cache.js.map +1 -0
  196. package/src/lib/design/system/harness-command.d.ts +7 -0
  197. package/src/lib/design/system/harness-command.js +51 -0
  198. package/src/lib/design/system/harness-command.js.map +1 -0
  199. package/src/lib/design/system/harness-config.d.ts +9 -0
  200. package/src/lib/design/system/harness-config.js +65 -0
  201. package/src/lib/design/system/harness-config.js.map +1 -0
  202. package/src/lib/design/system/harness-map.d.ts +44 -0
  203. package/src/lib/design/system/harness-map.js +126 -0
  204. package/src/lib/design/system/harness-map.js.map +1 -0
  205. package/src/lib/design/system/harness-samples.d.ts +20 -0
  206. package/src/lib/design/system/harness-samples.js +92 -0
  207. package/src/lib/design/system/harness-samples.js.map +1 -0
  208. package/src/lib/design/system/harness-server.d.ts +40 -0
  209. package/src/lib/design/system/harness-server.js +296 -0
  210. package/src/lib/design/system/harness-server.js.map +1 -0
  211. package/src/lib/design/system/imports.js +14 -1
  212. package/src/lib/design/system/imports.js.map +1 -1
  213. package/src/lib/design/system/in-order-at-once.d.ts +6 -0
  214. package/src/lib/design/system/in-order-at-once.js +28 -0
  215. package/src/lib/design/system/in-order-at-once.js.map +1 -0
  216. package/src/lib/design/system/inventory-approval.js +2 -1
  217. package/src/lib/design/system/inventory-approval.js.map +1 -1
  218. package/src/lib/design/system/inventory.d.ts +13 -4
  219. package/src/lib/design/system/inventory.js +36 -7
  220. package/src/lib/design/system/inventory.js.map +1 -1
  221. package/src/lib/design/system/list-system.d.ts +4 -0
  222. package/src/lib/design/system/list-system.js +12 -3
  223. package/src/lib/design/system/list-system.js.map +1 -1
  224. package/src/lib/design/system/live-actions.d.ts +121 -0
  225. package/src/lib/design/system/live-actions.js +665 -0
  226. package/src/lib/design/system/live-actions.js.map +1 -0
  227. package/src/lib/design/system/live-compare.d.ts +136 -0
  228. package/src/lib/design/system/live-compare.js +441 -0
  229. package/src/lib/design/system/live-compare.js.map +1 -0
  230. package/src/lib/design/system/live-uncovered.d.ts +40 -0
  231. package/src/lib/design/system/live-uncovered.js +123 -0
  232. package/src/lib/design/system/live-uncovered.js.map +1 -0
  233. package/src/lib/design/system/nested-scroll.d.ts +7 -0
  234. package/src/lib/design/system/nested-scroll.js +25 -0
  235. package/src/lib/design/system/nested-scroll.js.map +1 -0
  236. package/src/lib/design/system/notes/note.js +2 -1
  237. package/src/lib/design/system/notes/note.js.map +1 -1
  238. package/src/lib/design/system/occluded.d.ts +13 -0
  239. package/src/lib/design/system/occluded.js +111 -0
  240. package/src/lib/design/system/occluded.js.map +1 -0
  241. package/src/lib/design/system/open-points.d.ts +24 -6
  242. package/src/lib/design/system/open-points.js +59 -30
  243. package/src/lib/design/system/open-points.js.map +1 -1
  244. package/src/lib/design/system/part-build-ready.d.ts +39 -0
  245. package/src/lib/design/system/part-build-ready.js +107 -0
  246. package/src/lib/design/system/part-build-ready.js.map +1 -0
  247. package/src/lib/design/system/part-command.js +2 -9
  248. package/src/lib/design/system/part-command.js.map +1 -1
  249. package/src/lib/design/system/part-compare.d.ts +123 -0
  250. package/src/lib/design/system/part-compare.js +396 -0
  251. package/src/lib/design/system/part-compare.js.map +1 -0
  252. package/src/lib/design/system/part-go.d.ts +70 -0
  253. package/src/lib/design/system/part-go.js +94 -0
  254. package/src/lib/design/system/part-go.js.map +1 -0
  255. package/src/lib/design/system/part-ready.d.ts +44 -6
  256. package/src/lib/design/system/part-ready.js +88 -17
  257. package/src/lib/design/system/part-ready.js.map +1 -1
  258. package/src/lib/design/system/part-task.d.ts +147 -0
  259. package/src/lib/design/system/part-task.js +285 -0
  260. package/src/lib/design/system/part-task.js.map +1 -0
  261. package/src/lib/design/system/pointer-focus.d.ts +81 -0
  262. package/src/lib/design/system/pointer-focus.js +152 -0
  263. package/src/lib/design/system/pointer-focus.js.map +1 -0
  264. package/src/lib/design/system/prettier.d.ts +10 -0
  265. package/src/lib/design/system/prettier.js +36 -0
  266. package/src/lib/design/system/prettier.js.map +1 -0
  267. package/src/lib/design/system/reach.d.ts +12 -0
  268. package/src/lib/design/system/reach.js +186 -0
  269. package/src/lib/design/system/reach.js.map +1 -0
  270. package/src/lib/design/system/reachable-controls.d.ts +6 -0
  271. package/src/lib/design/system/reachable-controls.js +19 -0
  272. package/src/lib/design/system/reachable-controls.js.map +1 -0
  273. package/src/lib/design/system/reachable-files.d.ts +14 -0
  274. package/src/lib/design/system/reachable-files.js +101 -0
  275. package/src/lib/design/system/reachable-files.js.map +1 -0
  276. package/src/lib/design/system/reached-state.d.ts +23 -0
  277. package/src/lib/design/system/reached-state.js +53 -0
  278. package/src/lib/design/system/reached-state.js.map +1 -0
  279. package/src/lib/design/system/read-open-points.d.ts +9 -3
  280. package/src/lib/design/system/read-open-points.js +38 -9
  281. package/src/lib/design/system/read-open-points.js.map +1 -1
  282. package/src/lib/design/system/ready-command.d.ts +6 -2
  283. package/src/lib/design/system/ready-command.js +32 -15
  284. package/src/lib/design/system/ready-command.js.map +1 -1
  285. package/src/lib/design/system/render-check.d.ts +50 -0
  286. package/src/lib/design/system/render-check.js +341 -88
  287. package/src/lib/design/system/render-check.js.map +1 -1
  288. package/src/lib/design/system/resolve-product.js +5 -0
  289. package/src/lib/design/system/resolve-product.js.map +1 -1
  290. package/src/lib/design/system/rules/app-spec.d.ts +30 -0
  291. package/src/lib/design/system/rules/app-spec.js +87 -0
  292. package/src/lib/design/system/rules/app-spec.js.map +1 -0
  293. package/src/lib/design/system/rules/canonical-class.d.ts +2 -0
  294. package/src/lib/design/system/rules/canonical-class.js +36 -110
  295. package/src/lib/design/system/rules/canonical-class.js.map +1 -1
  296. package/src/lib/design/system/rules/capability-place.d.ts +44 -0
  297. package/src/lib/design/system/rules/capability-place.js +116 -0
  298. package/src/lib/design/system/rules/capability-place.js.map +1 -0
  299. package/src/lib/design/system/rules/denied-class.d.ts +9 -0
  300. package/src/lib/design/system/rules/denied-class.js +121 -0
  301. package/src/lib/design/system/rules/denied-class.js.map +1 -0
  302. package/src/lib/design/system/rules/exemptions.d.ts +18 -0
  303. package/src/lib/design/system/rules/exemptions.js +18 -0
  304. package/src/lib/design/system/rules/exemptions.js.map +1 -0
  305. package/src/lib/design/system/rules/flow.js +1 -1
  306. package/src/lib/design/system/rules/flow.js.map +1 -1
  307. package/src/lib/design/system/rules/glued-interpolation.d.ts +8 -0
  308. package/src/lib/design/system/rules/glued-interpolation.js +61 -0
  309. package/src/lib/design/system/rules/glued-interpolation.js.map +1 -0
  310. package/src/lib/design/system/rules/hard-coded-colour.js +2 -1
  311. package/src/lib/design/system/rules/hard-coded-colour.js.map +1 -1
  312. package/src/lib/design/system/rules/implemented-components.d.ts +22 -0
  313. package/src/lib/design/system/rules/implemented-components.js +45 -0
  314. package/src/lib/design/system/rules/implemented-components.js.map +1 -0
  315. package/src/lib/design/system/rules/implements.d.ts +2 -1
  316. package/src/lib/design/system/rules/implements.js +26 -21
  317. package/src/lib/design/system/rules/implements.js.map +1 -1
  318. package/src/lib/design/system/rules/inline-svg.js +4 -1
  319. package/src/lib/design/system/rules/inline-svg.js.map +1 -1
  320. package/src/lib/design/system/rules/inline-ui-in-page-open.d.ts +13 -0
  321. package/src/lib/design/system/rules/inline-ui-in-page-open.js +5 -0
  322. package/src/lib/design/system/rules/inline-ui-in-page-open.js.map +1 -0
  323. package/src/lib/design/system/rules/inline-ui-in-page.d.ts +18 -0
  324. package/src/lib/design/system/rules/inline-ui-in-page.js +123 -0
  325. package/src/lib/design/system/rules/inline-ui-in-page.js.map +1 -0
  326. package/src/lib/design/system/rules/inline-ui.d.ts +16 -0
  327. package/src/lib/design/system/rules/inline-ui.js +100 -0
  328. package/src/lib/design/system/rules/inline-ui.js.map +1 -0
  329. package/src/lib/design/system/rules/motion.d.ts +1 -1
  330. package/src/lib/design/system/rules/motion.js +25 -17
  331. package/src/lib/design/system/rules/motion.js.map +1 -1
  332. package/src/lib/design/system/rules/native-title.d.ts +7 -0
  333. package/src/lib/design/system/rules/native-title.js +64 -0
  334. package/src/lib/design/system/rules/native-title.js.map +1 -0
  335. package/src/lib/design/system/rules/orphan-endpoint-known.d.ts +12 -0
  336. package/src/lib/design/system/rules/orphan-endpoint-known.js +20 -0
  337. package/src/lib/design/system/rules/orphan-endpoint-known.js.map +1 -0
  338. package/src/lib/design/system/rules/orphan-endpoint.d.ts +23 -0
  339. package/src/lib/design/system/rules/orphan-endpoint.js +166 -0
  340. package/src/lib/design/system/rules/orphan-endpoint.js.map +1 -0
  341. package/src/lib/design/system/rules/part-rewrite.d.ts +13 -0
  342. package/src/lib/design/system/rules/part-rewrite.js +125 -0
  343. package/src/lib/design/system/rules/part-rewrite.js.map +1 -0
  344. package/src/lib/design/system/rules/sample-default-known.d.ts +5 -0
  345. package/src/lib/design/system/rules/sample-default-known.js +17 -0
  346. package/src/lib/design/system/rules/sample-default-known.js.map +1 -0
  347. package/src/lib/design/system/rules/sample-default.d.ts +22 -0
  348. package/src/lib/design/system/rules/sample-default.js +92 -0
  349. package/src/lib/design/system/rules/sample-default.js.map +1 -0
  350. package/src/lib/design/system/rules/stale-replace.js +4 -0
  351. package/src/lib/design/system/rules/stale-replace.js.map +1 -1
  352. package/src/lib/design/system/rules/state-in-component.d.ts +16 -0
  353. package/src/lib/design/system/rules/state-in-component.js +101 -0
  354. package/src/lib/design/system/rules/state-in-component.js.map +1 -0
  355. package/src/lib/design/system/rules/tailwind-classes.d.ts +51 -0
  356. package/src/lib/design/system/rules/tailwind-classes.js +232 -0
  357. package/src/lib/design/system/rules/tailwind-classes.js.map +1 -0
  358. package/src/lib/design/system/rules/top-level-await.d.ts +9 -0
  359. package/src/lib/design/system/rules/top-level-await.js +62 -0
  360. package/src/lib/design/system/rules/top-level-await.js.map +1 -0
  361. package/src/lib/design/system/rules/unbound-input-known.d.ts +5 -0
  362. package/src/lib/design/system/rules/unbound-input-known.js +47 -0
  363. package/src/lib/design/system/rules/unbound-input-known.js.map +1 -0
  364. package/src/lib/design/system/rules/unbound-input.d.ts +22 -0
  365. package/src/lib/design/system/rules/unbound-input.js +61 -0
  366. package/src/lib/design/system/rules/unbound-input.js.map +1 -0
  367. package/src/lib/design/system/rules/uncovered-region.d.ts +13 -0
  368. package/src/lib/design/system/rules/uncovered-region.js +36 -0
  369. package/src/lib/design/system/rules/uncovered-region.js.map +1 -0
  370. package/src/lib/design/system/rules/undefined-class.d.ts +9 -0
  371. package/src/lib/design/system/rules/undefined-class.js +32 -0
  372. package/src/lib/design/system/rules/undefined-class.js.map +1 -0
  373. package/src/lib/design/system/rules/undefined-token.d.ts +1 -1
  374. package/src/lib/design/system/rules/undefined-token.js +7 -61
  375. package/src/lib/design/system/rules/undefined-token.js.map +1 -1
  376. package/src/lib/design/system/rules/utility-css.d.ts +2 -1
  377. package/src/lib/design/system/rules/utility-css.js +29 -14
  378. package/src/lib/design/system/rules/utility-css.js.map +1 -1
  379. package/src/lib/design/system/rules/view-coverage.d.ts +8 -0
  380. package/src/lib/design/system/rules/view-coverage.js +51 -0
  381. package/src/lib/design/system/rules/view-coverage.js.map +1 -0
  382. package/src/lib/design/system/rules/visible-change.d.ts +20 -0
  383. package/src/lib/design/system/rules/visible-change.js +48 -0
  384. package/src/lib/design/system/rules/visible-change.js.map +1 -0
  385. package/src/lib/design/system/sdk-errors.d.ts +14 -0
  386. package/src/lib/design/system/sdk-errors.js +38 -0
  387. package/src/lib/design/system/sdk-errors.js.map +1 -0
  388. package/src/lib/design/system/see-through.d.ts +12 -0
  389. package/src/lib/design/system/see-through.js +112 -0
  390. package/src/lib/design/system/see-through.js.map +1 -0
  391. package/src/lib/design/system/settled-panes.d.ts +18 -0
  392. package/src/lib/design/system/settled-panes.js +70 -0
  393. package/src/lib/design/system/settled-panes.js.map +1 -0
  394. package/src/lib/design/system/sketch/after-merge.d.ts +11 -0
  395. package/src/lib/design/system/sketch/after-merge.js +51 -0
  396. package/src/lib/design/system/sketch/after-merge.js.map +1 -0
  397. package/src/lib/design/system/sketch/aktuell-placeholders.d.ts +30 -0
  398. package/src/lib/design/system/sketch/aktuell-placeholders.js +87 -0
  399. package/src/lib/design/system/sketch/aktuell-placeholders.js.map +1 -0
  400. package/src/lib/design/system/sketch/baseline.d.ts +19 -1
  401. package/src/lib/design/system/sketch/baseline.js +29 -7
  402. package/src/lib/design/system/sketch/baseline.js.map +1 -1
  403. package/src/lib/design/system/sketch/check-sketches.d.ts +10 -0
  404. package/src/lib/design/system/sketch/check-sketches.js +50 -4
  405. package/src/lib/design/system/sketch/check-sketches.js.map +1 -1
  406. package/src/lib/design/system/sketch/cli-args.d.ts +12 -2
  407. package/src/lib/design/system/sketch/cli-args.js +18 -3
  408. package/src/lib/design/system/sketch/cli-args.js.map +1 -1
  409. package/src/lib/design/system/sketch/edit-sketch.d.ts +21 -0
  410. package/src/lib/design/system/sketch/edit-sketch.js +117 -0
  411. package/src/lib/design/system/sketch/edit-sketch.js.map +1 -0
  412. package/src/lib/design/system/sketch/frame-budget.d.ts +24 -0
  413. package/src/lib/design/system/sketch/frame-budget.js +23 -0
  414. package/src/lib/design/system/sketch/frame-budget.js.map +1 -0
  415. package/src/lib/design/system/sketch/identical-renders.d.ts +31 -0
  416. package/src/lib/design/system/sketch/identical-renders.js +137 -0
  417. package/src/lib/design/system/sketch/identical-renders.js.map +1 -0
  418. package/src/lib/design/system/sketch/merge-shared.d.ts +2 -0
  419. package/src/lib/design/system/sketch/merge-shared.js +7 -10
  420. package/src/lib/design/system/sketch/merge-shared.js.map +1 -1
  421. package/src/lib/design/system/sketch/merge-step.d.ts +35 -0
  422. package/src/lib/design/system/sketch/merge-step.js +98 -0
  423. package/src/lib/design/system/sketch/merge-step.js.map +1 -0
  424. package/src/lib/design/system/sketch/merge.d.ts +10 -3
  425. package/src/lib/design/system/sketch/merge.js +103 -30
  426. package/src/lib/design/system/sketch/merge.js.map +1 -1
  427. package/src/lib/design/system/sketch/merged-layout.d.ts +17 -0
  428. package/src/lib/design/system/sketch/merged-layout.js +57 -0
  429. package/src/lib/design/system/sketch/merged-layout.js.map +1 -0
  430. package/src/lib/design/system/sketch/merged-parts.d.ts +40 -10
  431. package/src/lib/design/system/sketch/merged-parts.js +112 -49
  432. package/src/lib/design/system/sketch/merged-parts.js.map +1 -1
  433. package/src/lib/design/system/sketch/no-visible-change.d.ts +10 -0
  434. package/src/lib/design/system/sketch/no-visible-change.js +16 -6
  435. package/src/lib/design/system/sketch/no-visible-change.js.map +1 -1
  436. package/src/lib/design/system/sketch/part-definition.d.ts +21 -1
  437. package/src/lib/design/system/sketch/part-definition.js +79 -17
  438. package/src/lib/design/system/sketch/part-definition.js.map +1 -1
  439. package/src/lib/design/system/sketch/rebase-port.d.ts +24 -0
  440. package/src/lib/design/system/sketch/rebase-port.js +170 -0
  441. package/src/lib/design/system/sketch/rebase-port.js.map +1 -0
  442. package/src/lib/design/system/sketch/sample-mark-drift.d.ts +33 -0
  443. package/src/lib/design/system/sketch/sample-mark-drift.js +88 -0
  444. package/src/lib/design/system/sketch/sample-mark-drift.js.map +1 -0
  445. package/src/lib/design/system/sketch/sketch-check-worker.d.ts +1 -0
  446. package/src/lib/design/system/sketch/sketch-check-worker.js +27 -0
  447. package/src/lib/design/system/sketch/sketch-check-worker.js.map +1 -0
  448. package/src/lib/design/system/sketch/sketch-checker.d.ts +27 -0
  449. package/src/lib/design/system/sketch/sketch-checker.js +99 -0
  450. package/src/lib/design/system/sketch/sketch-checker.js.map +1 -0
  451. package/src/lib/design/system/sketch/sketch.d.ts +63 -2
  452. package/src/lib/design/system/sketch/sketch.js +185 -30
  453. package/src/lib/design/system/sketch/sketch.js.map +1 -1
  454. package/src/lib/design/system/sketch/stale-base.d.ts +22 -0
  455. package/src/lib/design/system/sketch/stale-base.js +56 -0
  456. package/src/lib/design/system/sketch/stale-base.js.map +1 -0
  457. package/src/lib/design/system/sketch/unchanged-states.d.ts +32 -0
  458. package/src/lib/design/system/sketch/unchanged-states.js +52 -13
  459. package/src/lib/design/system/sketch/unchanged-states.js.map +1 -1
  460. package/src/lib/design/system/sketch/unused-closure.js +16 -4
  461. package/src/lib/design/system/sketch/unused-closure.js.map +1 -1
  462. package/src/lib/design/system/sketch/viewed-shots.d.ts +24 -0
  463. package/src/lib/design/system/sketch/viewed-shots.js +61 -0
  464. package/src/lib/design/system/sketch/viewed-shots.js.map +1 -0
  465. package/src/lib/design/system/slow-checks.d.ts +40 -0
  466. package/src/lib/design/system/slow-checks.js +197 -0
  467. package/src/lib/design/system/slow-checks.js.map +1 -0
  468. package/src/lib/design/system/slow-run.d.ts +57 -0
  469. package/src/lib/design/system/slow-run.js +253 -0
  470. package/src/lib/design/system/slow-run.js.map +1 -0
  471. package/src/lib/design/system/stale-design-mocks.d.ts +20 -0
  472. package/src/lib/design/system/stale-design-mocks.js +59 -0
  473. package/src/lib/design/system/stale-design-mocks.js.map +1 -0
  474. package/src/lib/design/system/stale-dist.d.ts +25 -0
  475. package/src/lib/design/system/stale-dist.js +91 -0
  476. package/src/lib/design/system/stale-dist.js.map +1 -0
  477. package/src/lib/design/system/stale-parts.d.ts +30 -0
  478. package/src/lib/design/system/stale-parts.js +106 -0
  479. package/src/lib/design/system/stale-parts.js.map +1 -0
  480. package/src/lib/design/system/surface-nesting.d.ts +11 -0
  481. package/src/lib/design/system/surface-nesting.js +86 -0
  482. package/src/lib/design/system/surface-nesting.js.map +1 -0
  483. package/src/lib/design/system/system-command.js +8 -6
  484. package/src/lib/design/system/system-command.js.map +1 -1
  485. package/src/lib/design/system/system-modules.d.ts +16 -1
  486. package/src/lib/design/system/system-modules.js +18 -2
  487. package/src/lib/design/system/system-modules.js.map +1 -1
  488. package/src/lib/design/system/task-command.d.ts +51 -0
  489. package/src/lib/design/system/task-command.js +233 -0
  490. package/src/lib/design/system/task-command.js.map +1 -0
  491. package/src/lib/design/system/theming-text.d.ts +2 -0
  492. package/src/lib/design/system/theming-text.js +6 -0
  493. package/src/lib/design/system/theming-text.js.map +1 -0
  494. package/src/lib/design/system/tom-confirm.d.ts +40 -0
  495. package/src/lib/design/system/tom-confirm.js +55 -0
  496. package/src/lib/design/system/tom-confirm.js.map +1 -0
  497. package/src/lib/design/system/touched-parts.d.ts +16 -0
  498. package/src/lib/design/system/touched-parts.js +122 -0
  499. package/src/lib/design/system/touched-parts.js.map +1 -0
  500. package/src/lib/design/system/ts-source.d.ts +2 -0
  501. package/src/lib/design/system/ts-source.js +15 -1
  502. package/src/lib/design/system/ts-source.js.map +1 -1
  503. package/src/lib/design/system/unchanged-rows.d.ts +15 -0
  504. package/src/lib/design/system/unchanged-rows.js +134 -0
  505. package/src/lib/design/system/unchanged-rows.js.map +1 -0
  506. package/src/lib/design/system/uncommitted-decisions.d.ts +6 -0
  507. package/src/lib/design/system/uncommitted-decisions.js +38 -0
  508. package/src/lib/design/system/uncommitted-decisions.js.map +1 -0
  509. package/src/lib/design/system/uncovered-regions.d.ts +61 -0
  510. package/src/lib/design/system/uncovered-regions.js +171 -0
  511. package/src/lib/design/system/uncovered-regions.js.map +1 -0
  512. package/src/lib/design/system/unused-base-parts.d.ts +7 -0
  513. package/src/lib/design/system/unused-base-parts.js +76 -0
  514. package/src/lib/design/system/unused-base-parts.js.map +1 -0
  515. package/src/lib/design/system/visible-change-command.d.ts +48 -0
  516. package/src/lib/design/system/visible-change-command.js +308 -0
  517. package/src/lib/design/system/visible-change-command.js.map +1 -0
  518. package/src/lib/design/system/visible-change-parts.d.ts +28 -0
  519. package/src/lib/design/system/visible-change-parts.js +96 -0
  520. package/src/lib/design/system/visible-change-parts.js.map +1 -0
  521. package/src/lib/design/system/visible-change.d.ts +82 -0
  522. package/src/lib/design/system/visible-change.js +149 -0
  523. package/src/lib/design/system/visible-change.js.map +1 -0
  524. package/src/lib/design/thumb.d.ts +19 -2
  525. package/src/lib/design/thumb.js +50 -15
  526. package/src/lib/design/thumb.js.map +1 -1
  527. package/src/lib/design/typecheck.d.ts +1 -1
  528. package/src/lib/design/typecheck.js +3 -3
  529. package/src/lib/design/typecheck.js.map +1 -1
  530. package/src/lib/design/unstable-cells.d.ts +23 -0
  531. package/src/lib/design/unstable-cells.js +40 -0
  532. package/src/lib/design/unstable-cells.js.map +1 -0
  533. package/src/lib/design/variant-diff.js +1 -1
  534. package/src/lib/design/variant-diff.js.map +1 -1
  535. package/src/lib/design/wait.d.ts +15 -0
  536. package/src/lib/design/wait.js +30 -0
  537. package/src/lib/design/wait.js.map +1 -0
  538. package/src/lib/json-file.d.ts +11 -0
  539. package/src/lib/json-file.js +21 -0
  540. package/src/lib/json-file.js.map +1 -0
  541. package/src/lib/source-hash.d.ts +7 -0
  542. package/src/lib/source-hash.js +62 -0
  543. package/src/lib/source-hash.js.map +1 -0
  544. package/src/lib/update/agent-setup.js +2 -1
  545. package/src/lib/update/agent-setup.js.map +1 -1
  546. package/src/lib/update/migration-manifest.d.ts +12 -0
  547. package/src/lib/update/migration-manifest.js +13 -0
  548. package/src/lib/update/migration-manifest.js.map +1 -1
  549. package/src/lib/update/migration-record.js +2 -1
  550. package/src/lib/update/migration-record.js.map +1 -1
  551. package/src/lib/update/pending.js +2 -1
  552. package/src/lib/update/pending.js.map +1 -1
  553. package/src/lib/update/run-migrations.d.ts +3 -2
  554. package/src/lib/update/run-migrations.js +38 -5
  555. package/src/lib/update/run-migrations.js.map +1 -1
  556. package/src/lib/update/tasks.js +2 -1
  557. package/src/lib/update/tasks.js.map +1 -1
@@ -22,16 +22,21 @@ export type FrameBox = {
22
22
  * An element of a drawn frame that looks interactive. `control` is a native control, an interactive role or a known
23
23
  * SDK control; `unclassified` has a pointer cursor or a matched `:hover` rule and sits in no control. `marked` is the
24
24
  * `data-et-control` that declares it, `within` every `data-et-control` around it, nearest first. `owner` is the
25
- * embedded part whose `data-et-part` root draws it, or `null` for the frame's own part.
25
+ * embedded part whose `data-et-part` root draws it, or `null` for the frame's own part. `label` is its accessible name
26
+ * or text, which tells apart two controls at the same path.
26
27
  */
27
28
  export type FoundControl = {
28
29
  kind: 'control' | 'unclassified';
29
30
  what: string;
30
31
  path: string;
32
+ label?: string | null;
31
33
  marked: string | null;
32
34
  within: string[];
33
35
  owner?: string | null;
34
36
  box?: FrameBox | null;
37
+ covered?: boolean;
38
+ /** The element's `data-et-action`, or `undefined` for an element the action check does not press. */
39
+ action?: string | null;
35
40
  };
36
41
  /** A rule of the part's own stylesheet that sets `properties` on `path`, an element the embedded part `owner` draws. */
37
42
  export type FoundOverride = {
@@ -74,6 +79,7 @@ export type SeenFrame = {
74
79
  look?: string;
75
80
  keyboard?: boolean;
76
81
  box?: FrameBox | null;
82
+ covered?: boolean;
77
83
  }[];
78
84
  surfaces: {
79
85
  id: string;
@@ -82,6 +88,10 @@ export type SeenFrame = {
82
88
  }[];
83
89
  found?: FoundControl[];
84
90
  overrides?: FoundOverride[];
91
+ backdrop?: {
92
+ path: string;
93
+ fill: string;
94
+ } | null;
85
95
  };
86
96
  export type DeclaredControl = {
87
97
  kind: string;
@@ -113,6 +123,20 @@ export declare const controlStateGapsOf: (options: {
113
123
  controls: unknown;
114
124
  states: string[];
115
125
  }) => CompletenessGap[];
126
+ /**
127
+ * The `CONTROL-STATE` gaps render check fails a part on. Only a sketch variant fails, and only on interaction states
128
+ * its base part, `base`, does not already draw as a gap: product check leaves those gaps to `design complete`.
129
+ */
130
+ export declare const introducedControlStateGapsOf: (options: {
131
+ part: string;
132
+ controls: unknown;
133
+ states: string[];
134
+ sketch: boolean;
135
+ base: {
136
+ controls: unknown;
137
+ states: string[];
138
+ } | null;
139
+ }) => CompletenessGap[];
116
140
  /** How much of its frame one rest state changes against `base`, the first state of its part, from 0 to 1. */
117
141
  export type StateChange = {
118
142
  state: string;
@@ -150,6 +174,13 @@ export declare const completenessGapLineOf: (gap: CompletenessGap) => string;
150
174
  export declare const isMissingStateGap: (gap: CompletenessGap) => boolean;
151
175
  export declare const SDK_CONTROLS: string[];
152
176
  export declare const PLAIN_CONTROL_SELECTOR: string;
177
+ export declare const seeFrame: (options: {
178
+ discover: boolean;
179
+ part: string;
180
+ ownCss: string[];
181
+ controlParts: Record<string, string>;
182
+ clip: boolean;
183
+ }) => string;
153
184
  /** Where a rest frame of a part is drawn: its state at a preset, or at a width, as `/__design/shot` takes it. */
154
185
  export type FrameAddress = {
155
186
  state: string;
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.partsCompletenessOf = exports.completenessOf = exports.inventoryIdsOf = exports.seePart = exports.PLAIN_CONTROL_SELECTOR = exports.SDK_CONTROLS = exports.isMissingStateGap = exports.completenessGapLineOf = exports.completenessGapsOf = exports.findingKeyOf = exports.isFindingOf = exports.smallChangeHintsOf = exports.controlStateGapsOf = exports.isControlPart = exports.isInteractionState = exports.declaredControlsOf = void 0;
12
+ exports.partsCompletenessOf = exports.completenessOf = exports.inventoryIdsOf = exports.seePart = exports.seeFrame = exports.PLAIN_CONTROL_SELECTOR = exports.SDK_CONTROLS = exports.isMissingStateGap = exports.completenessGapLineOf = exports.completenessGapsOf = exports.findingKeyOf = exports.isFindingOf = exports.smallChangeHintsOf = exports.introducedControlStateGapsOf = exports.controlStateGapsOf = exports.isControlPart = exports.isInteractionState = exports.declaredControlsOf = void 0;
13
13
  const fs_1 = require("fs");
14
14
  const path_1 = require("path");
15
15
  const browser_1 = require("../browser");
@@ -17,6 +17,7 @@ const force_interactions_1 = require("../force-interactions");
17
17
  const serve_1 = require("../serve");
18
18
  const shot_1 = require("../shot");
19
19
  const thumb_1 = require("../thumb");
20
+ const actions_1 = require("./actions");
20
21
  const resolve_product_1 = require("./resolve-product");
21
22
  const contact_sheet_1 = require("../contact-sheet");
22
23
  const baseline_1 = require("./sketch/baseline");
@@ -25,6 +26,7 @@ const system_modules_1 = require("./system-modules");
25
26
  const exceptions_1 = require("./exceptions");
26
27
  const inventory_approval_1 = require("./inventory-approval");
27
28
  const option_values_1 = require("./rules/option-values");
29
+ const demo_backdrop_1 = require("./demo-backdrop");
28
30
  const KINDS = {
29
31
  disclosure: { surface: 'body', closed: 'collapsed' },
30
32
  button: { adds: ['active'] },
@@ -54,7 +56,7 @@ const requiredInteractionsOf = (control) => {
54
56
  ];
55
57
  };
56
58
  const gridGapOf = (options) => {
57
- const { grid, states, interactions } = options;
59
+ const { grid, states, interactions, disabledStates = new Set() } = options;
58
60
  const fix = `draw its states with interactionRows, which gives the grid a column per interaction (${interactions.join(', ')})`;
59
61
  if (!isRecord(grid) || !Array.isArray(grid['columns']) || !isRecord(grid['rows']))
60
62
  return `the part has no grid - ${fix}`;
@@ -62,12 +64,14 @@ const gridGapOf = (options) => {
62
64
  const missing = interactions.filter((interaction) => !columns.includes(interaction));
63
65
  if (missing.length > 0)
64
66
  return `its grid has no column ${missing.join(', ')} - ${fix}`;
65
- const holes = Object.entries(grid['rows']).flatMap(([row, cells]) => interactions
66
- .filter((interaction) => {
67
- const state = isRecord(cells) ? cells[interaction] : undefined;
68
- return typeof state !== 'string' || !states.includes(state);
69
- })
70
- .map((interaction) => `${row} ${interaction}`));
67
+ const holes = Object.entries(grid['rows']).flatMap(([row, cells]) => isRecord(cells) && typeof cells['rest'] === 'string' && disabledStates.has(cells['rest'])
68
+ ? []
69
+ : interactions
70
+ .filter((interaction) => {
71
+ const state = isRecord(cells) ? cells[interaction] : undefined;
72
+ return typeof state !== 'string' || !states.includes(state);
73
+ })
74
+ .map((interaction) => `${row} ${interaction}`));
71
75
  return holes.length > 0 ? `its grid draws no state in ${holes.join(', ')} - ${fix}` : null;
72
76
  };
73
77
  const declaredControlsOf = (value) => isRecord(value)
@@ -147,6 +151,18 @@ const controlStateGapsOf = (options) => {
147
151
  }));
148
152
  };
149
153
  exports.controlStateGapsOf = controlStateGapsOf;
154
+ /**
155
+ * The `CONTROL-STATE` gaps render check fails a part on. Only a sketch variant fails, and only on interaction states
156
+ * its base part, `base`, does not already draw as a gap: product check leaves those gaps to `design complete`.
157
+ */
158
+ const introducedControlStateGapsOf = (options) => {
159
+ const { part, controls, states, sketch, base } = options;
160
+ if (!sketch)
161
+ return [];
162
+ const inherited = new Set(base && !(0, exports.isControlPart)({ part, controls: base.controls }) ? base.states.filter(exports.isInteractionState) : []);
163
+ return (0, exports.controlStateGapsOf)({ part, controls, states: states.filter((state) => !inherited.has(state)) });
164
+ };
165
+ exports.introducedControlStateGapsOf = introducedControlStateGapsOf;
150
166
  const SMALL_CHANGE = 0.1;
151
167
  /**
152
168
  * One hint per state of an element or component that is no control part whose pixels differ from its first state in
@@ -166,7 +182,7 @@ const isFindingOf = (declared) => (found) => {
166
182
  !(found.kind === 'control' && found.marked !== null);
167
183
  };
168
184
  exports.isFindingOf = isFindingOf;
169
- const findingKeyOf = (found) => `${found.kind} ${found.what} ${found.path}`;
185
+ const findingKeyOf = (found) => { var _a; return `${found.kind} ${found.what} ${found.path} ${(_a = found.label) !== null && _a !== void 0 ? _a : ''}`; };
170
186
  exports.findingKeyOf = findingKeyOf;
171
187
  const NATIVE_CONTROLS = ['button', 'a[href]', 'input:not([type="hidden"])', 'select', 'textarea', 'summary'];
172
188
  const discoveryGapsOf = (options) => {
@@ -207,6 +223,28 @@ const discoveryGapsOf = (options) => {
207
223
  };
208
224
  });
209
225
  };
226
+ const actionGapsOf = (options) => {
227
+ var _a, _b, _c;
228
+ const { part, declared, frames } = options;
229
+ const groups = new Map();
230
+ for (const frame of frames.filter((seen) => seen.interaction === null))
231
+ for (const found of (_a = frame.found) !== null && _a !== void 0 ? _a : []) {
232
+ if (found.action !== null ||
233
+ ((_b = found.owner) !== null && _b !== void 0 ? _b : null) !== null ||
234
+ found.within.some((id) => { var _a, _b; return ((_b = (_a = declared[id]) === null || _a === void 0 ? void 0 : _a.part) !== null && _b !== void 0 ? _b : null) !== null; }))
235
+ continue;
236
+ const key = (0, exports.findingKeyOf)(found);
237
+ const group = (_c = groups.get(key)) !== null && _c !== void 0 ? _c : { found, states: [] };
238
+ if (!group.states.includes(frame.state))
239
+ group.states.push(frame.state);
240
+ groups.set(key, group);
241
+ }
242
+ return [...groups.values()].map(({ found, states }) => ({
243
+ code: 'ACTION-UNDECLARED',
244
+ target: part,
245
+ detail: `${found.what}${found.label ? ` "${found.label}"` : ''} at ${found.path} in ${statesShownOf(states)} - declare what it does: data-et-action="<state>" or "emit:<output>"`,
246
+ }));
247
+ };
210
248
  const isUndeclaredControlGap = (gap) => gap.code === 'CONTROL-UNDECLARED';
211
249
  const statesShownOf = (states) => states.length > 4 ? `${states.slice(0, 3).join(', ')} and ${states.length - 3} more` : states.join(', ');
212
250
  const overrideGapsOf = (options) => {
@@ -499,7 +537,10 @@ const completenessGapsOf = (options) => {
499
537
  detail: `${control.part} is not design complete: ${used.length} gap(s) - run design complete ${control.part}`,
500
538
  });
501
539
  const interactions = control.part === null && !part.startsWith('pages/') ? requiredInteractionsOf(control) : [];
502
- const gridGap = interactions.length > 0 ? gridGapOf({ grid, states, interactions }) : null;
540
+ const disabledStates = new Set(frames
541
+ .filter((frame) => frame.interaction === null && frame.controls.some((seen) => seen.id === id && seen.disabled))
542
+ .map((frame) => frame.state));
543
+ const gridGap = interactions.length > 0 ? gridGapOf({ grid, states, interactions, disabledStates }) : null;
503
544
  if (gridGap)
504
545
  gaps.push({ code: 'CONTROL-GRID-MISSING', target: `${part}.${id}`, detail: gridGap });
505
546
  if (!seenIds.has(id)) {
@@ -517,6 +558,7 @@ const completenessGapsOf = (options) => {
517
558
  return [
518
559
  ...gaps,
519
560
  ...discoveryGapsOf({ part, declared, frames }).filter((gap) => !isUndeclaredControlGap(gap)),
561
+ ...actionGapsOf({ part, declared, frames }),
520
562
  ...ownerGapsOf({ part, declared, frames, referenced }),
521
563
  ...overrideGapsOf({ part, frames }),
522
564
  ...inventoryGapsOf({ part, inventory }),
@@ -682,10 +724,11 @@ const LIKELY_CONTROLS = [...exports.SDK_CONTROLS, ...PLAIN_CONTROLS];
682
724
  const LOOK_PROPERTIES = [...COLOUR_PROPERTIES, 'opacity', 'box-shadow', 'font-weight', 'text-decoration-line'];
683
725
  const OPTION_SELECTOR = '[role="option"], [role^="menuitem"], [data-et-option]';
684
726
  const COMPOSITE_ROLES = ['grid', 'listbox', 'menu', 'menubar', 'radiogroup', 'tablist', 'tree', 'treegrid'];
685
- const FOCUS_CONTAINER = COMPOSITE_ROLES.flatMap((role) => [
686
- `[role="${role}"][tabindex="-1"]`,
687
- `[role="${role}"][aria-activedescendant]`,
688
- ]).join(', ');
727
+ const DIALOG_ROLES = ['dialog', 'alertdialog'];
728
+ const FOCUS_CONTAINER = [
729
+ ...COMPOSITE_ROLES.flatMap((role) => [`[role="${role}"][tabindex="-1"]`, `[role="${role}"][aria-activedescendant]`]),
730
+ ...DIALOG_ROLES.map((role) => `[role="${role}"][tabindex="-1"]`),
731
+ ].join(', ');
689
732
  exports.PLAIN_CONTROL_SELECTOR = `:is(${PLAIN_CONTROLS.join(', ')}):not(${FOCUS_CONTAINER})`;
690
733
  const discoverControls = `((root) => {
691
734
  const LIKELY = ${JSON.stringify(LIKELY_CONTROLS)};
@@ -695,7 +738,7 @@ const discoverControls = `((root) => {
695
738
  const sdk = ${JSON.stringify(exports.SDK_CONTROLS.join(', '))};
696
739
  const rendered = (element) => element.getClientRects().length > 0;
697
740
  const HOVER = /(?<!\\\\):hover(?![\\w-])/g;
698
- const FORCED_HOVER = /:is\\(:hover,\\s*\\[data-et-force~="?hover"?\\]\\)/g;
741
+ const FORCED_HOVER = /:is\\(:hover,\\s*\\[data-et-force~="?hover"?\\](?:,\\s*\\[data-et-force~="?active"?\\])?\\)/g;
699
742
  const hoveredOf = (written) => {
700
743
  const selector = written.replace(FORCED_HOVER, ':hover');
701
744
  const match = new RegExp(HOVER.source).exec(selector);
@@ -756,6 +799,8 @@ const discoverControls = `((root) => {
756
799
  }
757
800
  return null;
758
801
  };
802
+ const labelOf = (element) =>
803
+ (element.getAttribute('aria-label') ?? element.innerText ?? element.textContent ?? '').replace(/\\s+/g, ' ').trim().slice(0, 60) || null;
759
804
  const found = [];
760
805
  for (const element of root.querySelectorAll('*')) {
761
806
  if (!rendered(element)) continue;
@@ -763,7 +808,7 @@ const discoverControls = `((root) => {
763
808
  if (what) {
764
809
  const inSdk = element.parentElement.closest(sdk);
765
810
  if (inSdk !== null && root.contains(inSdk)) continue;
766
- found.push({ kind: 'control', what: what.startsWith('[') ? element.tagName.toLowerCase() + what : what, path: pathOf(element), marked: markedOf(element), within: withinOf(element), owner: ownerOf(element)?.key ?? null, box: frameBoxOf(element) });
811
+ found.push({ kind: 'control', what: what.startsWith('[') ? element.tagName.toLowerCase() + what : what, path: pathOf(element), label: labelOf(element), marked: markedOf(element), within: withinOf(element), owner: ownerOf(element)?.key ?? null, box: frameBoxOf(element), covered: isCovered(element), ...(element.matches(${JSON.stringify(actions_1.INTERACTIVE_SELECTOR)}) ? { action: element.getAttribute('data-et-action') } : {}) });
767
812
  continue;
768
813
  }
769
814
  const cursor = getComputedStyle(element).cursor;
@@ -773,7 +818,7 @@ const discoverControls = `((root) => {
773
818
  for (let at = element; at && !inControl; at = at.parentElement) inControl = at.hasAttribute('data-et-control') || isLikely(at);
774
819
  if (inControl) continue;
775
820
  const reason = [pointer ? 'cursor: pointer' : '', hovered.has(element) ? ':hover rule' : ''].filter(Boolean).join(' and ');
776
- found.push({ kind: 'unclassified', what: nameOf(element) + ' with ' + reason, path: pathOf(element), marked: null, within: [], owner: ownerOf(element)?.key ?? null, box: frameBoxOf(element) });
821
+ found.push({ kind: 'unclassified', what: nameOf(element) + ' with ' + reason, path: pathOf(element), label: labelOf(element), marked: null, within: [], owner: ownerOf(element)?.key ?? null, box: frameBoxOf(element), covered: isCovered(element) });
777
822
  }
778
823
  return found;
779
824
  })`;
@@ -857,7 +902,31 @@ const seeFrame = (options) => `(() => {
857
902
  ? { x: Math.round(box.left - ORIGIN.left), y: Math.round(box.top - ORIGIN.top), width: Math.round(box.width), height: Math.round(box.height) }
858
903
  : null;
859
904
  };
905
+ const isCovered = (element) => {
906
+ const box = element.getBoundingClientRect();
907
+ if (box.width <= 0 || box.height <= 0) return false;
908
+ const x = [box.left + 1, box.left + box.width / 2, box.right - 1];
909
+ const y = [box.top + 1, box.top + box.height / 2, box.bottom - 1];
910
+ const points = [[x[1], y[1]], [x[0], y[0]], [x[2], y[0]], [x[0], y[2]], [x[2], y[2]]];
911
+ let hit = false;
912
+ const inline = element.style.getPropertyValue('pointer-events');
913
+ const priority = element.style.getPropertyPriority('pointer-events');
914
+ element.style.setProperty('pointer-events', 'auto', 'important');
915
+ try {
916
+ for (const [px, py] of points) {
917
+ const top = document.elementFromPoint(px, py);
918
+ if (top === null) return false;
919
+ if (element.contains(top)) return false;
920
+ hit = true;
921
+ }
922
+ } finally {
923
+ if (inline) element.style.setProperty('pointer-events', inline, priority);
924
+ else element.style.removeProperty('pointer-events');
925
+ }
926
+ return hit;
927
+ };
860
928
  const OWN = ${JSON.stringify(options.part)};
929
+ const CONTROL_PARTS = ${JSON.stringify(options.controlParts)};
861
930
  const tokensOf = (element, name) => (element.getAttribute(name) ?? '').split(' ').filter(Boolean);
862
931
  const ownerOf = (element) => {
863
932
  const slotted = tokensOf(element, 'data-et-slot');
@@ -936,15 +1005,21 @@ const seeFrame = (options) => `(() => {
936
1005
  const box = element.getBoundingClientRect();
937
1006
  const x = Math.max(0, box.x + scrollX - ${PAD});
938
1007
  const y = Math.max(0, box.y + scrollY - ${PAD});
1008
+ const width = Math.min(box.x + scrollX + box.width + ${PAD}, document.documentElement.scrollWidth) - x;
1009
+ const height = Math.min(box.y + scrollY + box.height + ${PAD}, document.documentElement.scrollHeight) - y;
939
1010
  return {
940
1011
  at,
941
1012
  forced: tokensOf(element, 'data-et-force'),
942
- box: box.width > 0 && box.height > 0 ? { x, y, width: box.width + ${PAD * 2}, height: box.height + ${PAD * 2} } : null,
1013
+ box: box.width > 0 && box.height > 0 && width > 0 && height > 0 ? { x, y, width, height } : null,
943
1014
  selected: isSelected(element),
944
1015
  look: lookOf(element),
945
1016
  };
946
1017
  };
947
- const controls = [...root.querySelectorAll('[data-et-control]')].filter((element) => ownerOf(element) === null).map((element) => {
1018
+ const isOwnControl = (element) => {
1019
+ const owner = ownerOf(element);
1020
+ return owner === null || CONTROL_PARTS[element.getAttribute('data-et-control')] === owner.key;
1021
+ };
1022
+ const controls = [...root.querySelectorAll('[data-et-control]')].filter(isOwnControl).map((element) => {
948
1023
  const parts = ${controlPartsOf}(element);
949
1024
  const forced = new Set(parts.flatMap((part) => tokensOf(part, 'data-et-force')));
950
1025
  for (const part of parts) if (forced.size > 0) part.setAttribute('data-et-force', [...forced].join(' '));
@@ -953,10 +1028,12 @@ const seeFrame = (options) => `(() => {
953
1028
  disabled: parts.some(isDisabled),
954
1029
  keyboard: parts.some(isKeyboard),
955
1030
  frameBox: frameBoxOf(element),
1031
+ covered: isCovered(element),
956
1032
  ...tagged(element),
957
1033
  };
958
1034
  });
959
- const surfaces = [...root.querySelectorAll('[data-et-surface]')].filter((element) => ownerOf(element) === null).map((element) => ({
1035
+ const partRoot = [root, ...root.querySelectorAll('[data-et-part]')].find((element) => (element.getAttribute('data-et-part') ?? '').split(' ').includes(${JSON.stringify(options.part)}));
1036
+ const surfaces = [...root.querySelectorAll('[data-et-surface]')].filter((element) => ownerOf(element) === null && !(element === partRoot && element.getAttribute('data-et-surface') === '')).map((element) => ({
960
1037
  id: element.getAttribute('data-et-surface'),
961
1038
  shown: shown(element),
962
1039
  options: [...element.querySelectorAll(${JSON.stringify(OPTION_SELECTOR)})].filter((option) => ownerOf(option) === null && shown(option)).map((option) => ({ ...tagged(option), named: option.id !== '' && named.has(option.id), keyboard: isKeyboard(option) })),
@@ -967,8 +1044,10 @@ const seeFrame = (options) => `(() => {
967
1044
  surfaces,
968
1045
  found: discover ? ${discoverControls}(root) : [],
969
1046
  overrides: discover ? ${findOverrides}(${JSON.stringify(options.ownCss)}) : [],
1047
+ backdrop: discover ? ${(0, demo_backdrop_1.findDemoBackdrop)(options.part)}(root) : null,
970
1048
  };
971
1049
  })()`;
1050
+ exports.seeFrame = seeFrame;
972
1051
  const forceOn = ({ at, interaction, on, }) => `((at, interaction, on) => {
973
1052
  const found = document.querySelector('[data-et-complete="' + at + '"]');
974
1053
  for (const element of found.hasAttribute('data-et-control') ? ${controlPartsOf}(found) : [found]) {
@@ -981,22 +1060,22 @@ const forceOn = ({ at, interaction, on, }) => `((at, interaction, on) => {
981
1060
  })(${JSON.stringify(at)}, ${JSON.stringify(interaction)}, ${JSON.stringify(on)})`;
982
1061
  const FORCEABLE = new Set(['hover', 'focus-visible', 'active']);
983
1062
  const seeFrames = (options) => __awaiter(void 0, void 0, void 0, function* () {
984
- const { browser, base, frames, part, ownCss } = options;
1063
+ const { browser, base, frames, part, ownCss, controlParts } = options;
985
1064
  const context = yield browser.newContext();
986
1065
  const seen = [];
987
1066
  const refused = [];
988
1067
  const shots = [];
989
1068
  try {
990
1069
  const page = yield context.newPage();
991
- for (const frame of frames) {
1070
+ const seeOne = (frame) => __awaiter(void 0, void 0, void 0, function* () {
992
1071
  yield page.setViewportSize((0, shot_1.viewportOf)(frame.size));
993
1072
  yield (0, thumb_1.openFrame)(page, `${base}/frame.html?${frame.search}`);
994
1073
  yield page.addStyleTag({ content: NO_MOTION });
995
- yield page.evaluate(thumb_1.settled);
996
- const found = (yield page.evaluate(seeFrame({ discover: frame.interaction === null, part, ownCss, clip: frame.clip })));
1074
+ yield (0, thumb_1.awaitSettled)(page);
1075
+ const found = (yield page.evaluate((0, exports.seeFrame)({ discover: frame.interaction === null, part, ownCss, controlParts, clip: frame.clip })));
997
1076
  if ('refused' in found) {
998
1077
  refused.push(`${frame.state}: ${found.refused}`);
999
- continue;
1078
+ return;
1000
1079
  }
1001
1080
  if (frame.interaction === null) {
1002
1081
  const box = frame.clip ? yield page.locator('#root').boundingBox() : null;
@@ -1016,7 +1095,7 @@ const seeFrames = (options) => __awaiter(void 0, void 0, void 0, function* () {
1016
1095
  const drawn = yield shot();
1017
1096
  const drawnColours = (yield page.evaluate(colourSnapshot(element.at)));
1018
1097
  yield page.evaluate(forceOn({ at: element.at, interaction, on: false }));
1019
- yield page.evaluate(thumb_1.settled);
1098
+ yield (0, thumb_1.awaitSettled)(page);
1020
1099
  const rest = yield shot();
1021
1100
  const restColours = (yield page.evaluate(colourSnapshot(element.at)));
1022
1101
  yield page.evaluate(forceOn({ at: element.at, interaction, on: true }));
@@ -1032,7 +1111,7 @@ const seeFrames = (options) => __awaiter(void 0, void 0, void 0, function* () {
1032
1111
  const controls = [];
1033
1112
  const surfaces = [];
1034
1113
  for (const control of found.controls)
1035
- controls.push(Object.assign(Object.assign({ id: control.id, forced: yield forcedOf(control), selected: control.selected, disabled: control.disabled, look: control.look }, (control.keyboard ? { keyboard: true } : {})), { box: control.frameBox }));
1114
+ controls.push(Object.assign(Object.assign(Object.assign({ id: control.id, forced: yield forcedOf(control), selected: control.selected, disabled: control.disabled, look: control.look }, (control.keyboard ? { keyboard: true } : {})), { box: control.frameBox }), (control.covered ? { covered: true } : {})));
1036
1115
  for (const surface of found.surfaces) {
1037
1116
  const options = [];
1038
1117
  for (const option of surface.options)
@@ -1046,7 +1125,16 @@ const seeFrames = (options) => __awaiter(void 0, void 0, void 0, function* () {
1046
1125
  surfaces,
1047
1126
  found: found.found,
1048
1127
  overrides: found.overrides,
1128
+ backdrop: found.backdrop,
1049
1129
  });
1130
+ });
1131
+ for (const frame of frames) {
1132
+ try {
1133
+ yield seeOne(frame);
1134
+ }
1135
+ catch (error) {
1136
+ refused.push(`${frame.state}: design check could not draw this frame (${error instanceof Error ? error.message.split('\n')[0] : String(error)})`);
1137
+ }
1050
1138
  }
1051
1139
  }
1052
1140
  finally {
@@ -1072,7 +1160,7 @@ const seeFrames = (options) => __awaiter(void 0, void 0, void 0, function* () {
1072
1160
  * once at its first preset or width, and answers what each frame showed, or why its module did not load as a string.
1073
1161
  */
1074
1162
  const seePart = (options) => __awaiter(void 0, void 0, void 0, function* () {
1075
- var _a, _b, _c, _d, _e;
1163
+ var _a, _b, _c, _d, _e, _f;
1076
1164
  const { product, part, system, base, load, draw, restOnly = false, sketch = null } = options;
1077
1165
  const key = (0, resolve_product_1.partKeyOf)(part);
1078
1166
  const loaded = yield load((0, system_modules_1.productModuleIdOf)({ file: part.file, product: product.name, sketch }))
@@ -1118,7 +1206,8 @@ const seePart = (options) => __awaiter(void 0, void 0, void 0, function* () {
1118
1206
  .filter((file) => file.endsWith('.css'))
1119
1207
  .sort()
1120
1208
  .map((file) => (0, fs_1.readFileSync)((0, path_1.join)(dir, file), 'utf8'));
1121
- const { seen, refused, changes } = yield draw((browser) => seeFrames({ browser, base, frames, part: key, ownCss }));
1209
+ const controlParts = Object.fromEntries(Object.entries((_f = (0, exports.declaredControlsOf)(definition === null || definition === void 0 ? void 0 : definition.controls)) !== null && _f !== void 0 ? _f : {}).flatMap(([id, control]) => control.part === null ? [] : [[id, control.part]]));
1210
+ const { seen, refused, changes } = yield draw((browser) => seeFrames({ browser, base, frames, part: key, ownCss, controlParts }));
1122
1211
  const owner = (0, inventory_approval_1.partOwnerOf)({ product, part });
1123
1212
  return {
1124
1213
  definition,
@@ -1219,13 +1308,17 @@ const partsCompletenessOf = (options) => __awaiter(void 0, void 0, void 0, funct
1219
1308
  const optionProblems = optionValuesOf(resolved, definition !== null && definition !== void 0 ? definition : {});
1220
1309
  hints.set(key, [
1221
1310
  ...(0, exports.smallChangeHintsOf)({ part: key, controls: definition === null || definition === void 0 ? void 0 : definition.controls, changes }),
1222
- ...(0, exports.controlStateGapsOf)({ part: key, controls: definition === null || definition === void 0 ? void 0 : definition.controls, states }).map(exports.completenessGapLineOf),
1223
- ...discoveryGapsOf({ part: key, declared: (_b = (0, exports.declaredControlsOf)(definition === null || definition === void 0 ? void 0 : definition.controls)) !== null && _b !== void 0 ? _b : {}, frames: seen })
1224
- .filter(isUndeclaredControlGap)
1225
- .map(exports.completenessGapLineOf),
1226
- ...optionProblems
1227
- .filter((gap) => gap.code === 'OPTION-VALUE-MISSING')
1228
- .map((gap) => (0, exports.completenessGapLineOf)(Object.assign(Object.assign({}, gap), { target: key }))),
1311
+ ...[
1312
+ ...(0, exports.controlStateGapsOf)({ part: key, controls: definition === null || definition === void 0 ? void 0 : definition.controls, states }),
1313
+ ...discoveryGapsOf({
1314
+ part: key,
1315
+ declared: (_b = (0, exports.declaredControlsOf)(definition === null || definition === void 0 ? void 0 : definition.controls)) !== null && _b !== void 0 ? _b : {},
1316
+ frames: seen,
1317
+ }).filter(isUndeclaredControlGap),
1318
+ ...optionProblems
1319
+ .filter((gap) => gap.code === 'OPTION-VALUE-MISSING')
1320
+ .map((gap) => (Object.assign(Object.assign({}, gap), { target: key }))),
1321
+ ].map((gap) => `HINT ${(0, exports.completenessGapLineOf)(gap)}`),
1229
1322
  ]);
1230
1323
  const sketched = ((_c = product.parts.find((candidate) => (0, resolve_product_1.partKeyOf)(candidate) === key)) === null || _c === void 0 ? void 0 : _c.file) !== resolved.file;
1231
1324
  const reviewed = sketched || (0, merged_parts_1.readMerged)(owner.dir)[key] === hash;
@@ -1242,18 +1335,21 @@ const partsCompletenessOf = (options) => __awaiter(void 0, void 0, void 0, funct
1242
1335
  part: key,
1243
1336
  exceptions: (0, exceptions_1.readExceptions)(owner.dir),
1244
1337
  hash,
1245
- gaps: (0, exports.completenessGapsOf)({
1246
- part: key,
1247
- controls: definition === null || definition === void 0 ? void 0 : definition.controls,
1248
- states,
1249
- frames: seen,
1250
- reviewed,
1251
- grid: definition === null || definition === void 0 ? void 0 : definition.grid,
1252
- referenced,
1253
- inventory: resolved.layer === 'pages'
1254
- ? (0, inventory_approval_1.inventoryStateOf)({ approval: (0, inventory_approval_1.readInventory)(owner.dir)[key], ids: (0, exports.inventoryIdsOf)(seen), hash })
1255
- : undefined,
1256
- }),
1338
+ gaps: [
1339
+ ...(0, exports.completenessGapsOf)({
1340
+ part: key,
1341
+ controls: definition === null || definition === void 0 ? void 0 : definition.controls,
1342
+ states,
1343
+ frames: seen,
1344
+ reviewed,
1345
+ grid: definition === null || definition === void 0 ? void 0 : definition.grid,
1346
+ referenced,
1347
+ inventory: resolved.layer === 'pages'
1348
+ ? (0, inventory_approval_1.inventoryStateOf)({ approval: (0, inventory_approval_1.readInventory)(owner.dir)[key], ids: (0, exports.inventoryIdsOf)(seen), hash })
1349
+ : undefined,
1350
+ }),
1351
+ ...(resolved.layer === 'pages' ? [] : (0, demo_backdrop_1.demoBackdropGapsOf)({ part: key, frames: seen })),
1352
+ ],
1257
1353
  });
1258
1354
  exceptions.push(...excepted.listed);
1259
1355
  return [