@ethlete/cli 3.0.0-next.25 → 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 (592) hide show
  1. package/CHANGELOG.md +417 -0
  2. package/build-info.json +1 -0
  3. package/design/define-call.ts +99 -31
  4. package/design/define-part.ts +50 -3
  5. package/design/icon-sheet.ts +1 -1
  6. package/design/interaction-rows.ts +13 -6
  7. package/design/logo-sheet.ts +52 -0
  8. package/design/mark-part.ts +51 -1
  9. package/design/motion-drive.ts +215 -0
  10. package/design/motion-runtime.ts +14 -2
  11. package/design/motion-tokens.ts +177 -0
  12. package/design/token-sheet.ts +1 -1
  13. package/design/web/frame-fill.ts +4 -0
  14. package/design/web/frame-fit.ts +7 -0
  15. package/design/web/frame-scheme.ts +44 -0
  16. package/design/web/frame-surfaces.ts +294 -0
  17. package/design/web/frame.ts +162 -43
  18. package/design/web/surface-interactive.css +42 -0
  19. package/design/with-action.ts +29 -0
  20. package/package.json +3 -1
  21. package/src/index.js +9 -1
  22. package/src/index.js.map +1 -1
  23. package/src/lib/design/asset-shot.js +2 -2
  24. package/src/lib/design/asset-shot.js.map +1 -1
  25. package/src/lib/design/build-watch.d.ts +26 -0
  26. package/src/lib/design/build-watch.js +138 -0
  27. package/src/lib/design/build-watch.js.map +1 -0
  28. package/src/lib/design/calls-tsconfig.d.ts +2 -0
  29. package/src/lib/design/calls-tsconfig.js +10 -3
  30. package/src/lib/design/calls-tsconfig.js.map +1 -1
  31. package/src/lib/design/check.d.ts +1 -0
  32. package/src/lib/design/check.js +195 -13
  33. package/src/lib/design/check.js.map +1 -1
  34. package/src/lib/design/commit-hunks.d.ts +22 -0
  35. package/src/lib/design/commit-hunks.js +173 -0
  36. package/src/lib/design/commit-hunks.js.map +1 -0
  37. package/src/lib/design/contact-sheet.d.ts +9 -0
  38. package/src/lib/design/contact-sheet.js +38 -4
  39. package/src/lib/design/contact-sheet.js.map +1 -1
  40. package/src/lib/design/design-command.d.ts +2 -0
  41. package/src/lib/design/design-command.js +183 -15
  42. package/src/lib/design/design-command.js.map +1 -1
  43. package/src/lib/design/draw-ledger.d.ts +36 -0
  44. package/src/lib/design/draw-ledger.js +52 -0
  45. package/src/lib/design/draw-ledger.js.map +1 -0
  46. package/src/lib/design/force-interactions.d.ts +1 -1
  47. package/src/lib/design/force-interactions.js +4 -2
  48. package/src/lib/design/force-interactions.js.map +1 -1
  49. package/src/lib/design/inbox-command.js +9 -5
  50. package/src/lib/design/inbox-command.js.map +1 -1
  51. package/src/lib/design/mcp-command.d.ts +28 -3
  52. package/src/lib/design/mcp-command.js +134 -21
  53. package/src/lib/design/mcp-command.js.map +1 -1
  54. package/src/lib/design/merge-compare.d.ts +10 -2
  55. package/src/lib/design/merge-compare.js +63 -11
  56. package/src/lib/design/merge-compare.js.map +1 -1
  57. package/src/lib/design/motion-command.js +10 -16
  58. package/src/lib/design/motion-command.js.map +1 -1
  59. package/src/lib/design/motion-shot.js +3 -2
  60. package/src/lib/design/motion-shot.js.map +1 -1
  61. package/src/lib/design/new-call.js +19 -10
  62. package/src/lib/design/new-call.js.map +1 -1
  63. package/src/lib/design/part-marks.d.ts +3 -2
  64. package/src/lib/design/part-marks.js +13 -5
  65. package/src/lib/design/part-marks.js.map +1 -1
  66. package/src/lib/design/paths.d.ts +42 -0
  67. package/src/lib/design/paths.js +50 -1
  68. package/src/lib/design/paths.js.map +1 -1
  69. package/src/lib/design/product-command.d.ts +1 -1
  70. package/src/lib/design/product-command.js +12 -14
  71. package/src/lib/design/product-command.js.map +1 -1
  72. package/src/lib/design/ready-shots.d.ts +29 -3
  73. package/src/lib/design/ready-shots.js +105 -5
  74. package/src/lib/design/ready-shots.js.map +1 -1
  75. package/src/lib/design/render-packages.d.ts +9 -17
  76. package/src/lib/design/render-packages.js +25 -63
  77. package/src/lib/design/render-packages.js.map +1 -1
  78. package/src/lib/design/render-worker.js +2 -3
  79. package/src/lib/design/render-worker.js.map +1 -1
  80. package/src/lib/design/render.d.ts +2 -0
  81. package/src/lib/design/render.js +32 -7
  82. package/src/lib/design/render.js.map +1 -1
  83. package/src/lib/design/serve.d.ts +23 -3
  84. package/src/lib/design/serve.js +288 -35
  85. package/src/lib/design/serve.js.map +1 -1
  86. package/src/lib/design/server-identity.d.ts +36 -0
  87. package/src/lib/design/server-identity.js +68 -0
  88. package/src/lib/design/server-identity.js.map +1 -0
  89. package/src/lib/design/settle-frames.d.ts +4 -0
  90. package/src/lib/design/settle-frames.js +22 -0
  91. package/src/lib/design/settle-frames.js.map +1 -0
  92. package/src/lib/design/shot-command.d.ts +30 -6
  93. package/src/lib/design/shot-command.js +144 -56
  94. package/src/lib/design/shot-command.js.map +1 -1
  95. package/src/lib/design/shot-store.d.ts +24 -0
  96. package/src/lib/design/shot-store.js +120 -0
  97. package/src/lib/design/shot-store.js.map +1 -0
  98. package/src/lib/design/shot.d.ts +71 -1
  99. package/src/lib/design/shot.js +253 -40
  100. package/src/lib/design/shot.js.map +1 -1
  101. package/src/lib/design/sketch-command.d.ts +6 -1
  102. package/src/lib/design/sketch-command.js +452 -136
  103. package/src/lib/design/sketch-command.js.map +1 -1
  104. package/src/lib/design/ssr-shims.d.ts +2 -0
  105. package/src/lib/design/ssr-shims.js +12 -1
  106. package/src/lib/design/ssr-shims.js.map +1 -1
  107. package/src/lib/design/stale-cli-dist.d.ts +11 -0
  108. package/src/lib/design/stale-cli-dist.js +56 -0
  109. package/src/lib/design/stale-cli-dist.js.map +1 -0
  110. package/src/lib/design/stamp.d.ts +18 -1
  111. package/src/lib/design/stamp.js +53 -7
  112. package/src/lib/design/stamp.js.map +1 -1
  113. package/src/lib/design/started-by-studio.d.ts +1 -0
  114. package/src/lib/design/started-by-studio.js +6 -0
  115. package/src/lib/design/started-by-studio.js.map +1 -0
  116. package/src/lib/design/studio-api.d.ts +35 -4
  117. package/src/lib/design/studio-api.js +312 -41
  118. package/src/lib/design/studio-api.js.map +1 -1
  119. package/src/lib/design/system/accept-command.d.ts +39 -5
  120. package/src/lib/design/system/accept-command.js +109 -25
  121. package/src/lib/design/system/accept-command.js.map +1 -1
  122. package/src/lib/design/system/accepted-pictures.d.ts +83 -0
  123. package/src/lib/design/system/accepted-pictures.js +324 -0
  124. package/src/lib/design/system/accepted-pictures.js.map +1 -0
  125. package/src/lib/design/system/action-lost.d.ts +59 -0
  126. package/src/lib/design/system/action-lost.js +120 -0
  127. package/src/lib/design/system/action-lost.js.map +1 -0
  128. package/src/lib/design/system/action-press.d.ts +23 -0
  129. package/src/lib/design/system/action-press.js +76 -0
  130. package/src/lib/design/system/action-press.js.map +1 -0
  131. package/src/lib/design/system/action-undeclared.d.ts +34 -0
  132. package/src/lib/design/system/action-undeclared.js +81 -0
  133. package/src/lib/design/system/action-undeclared.js.map +1 -0
  134. package/src/lib/design/system/actions-command.d.ts +101 -0
  135. package/src/lib/design/system/actions-command.js +695 -0
  136. package/src/lib/design/system/actions-command.js.map +1 -0
  137. package/src/lib/design/system/actions.d.ts +158 -0
  138. package/src/lib/design/system/actions.js +295 -0
  139. package/src/lib/design/system/actions.js.map +1 -0
  140. package/src/lib/design/system/app-files.d.ts +10 -0
  141. package/src/lib/design/system/app-files.js +159 -0
  142. package/src/lib/design/system/app-files.js.map +1 -0
  143. package/src/lib/design/system/bespoke-controls.d.ts +30 -0
  144. package/src/lib/design/system/bespoke-controls.js +147 -0
  145. package/src/lib/design/system/bespoke-controls.js.map +1 -0
  146. package/src/lib/design/system/build-ready-contract.d.ts +27 -0
  147. package/src/lib/design/system/build-ready-contract.js +12 -0
  148. package/src/lib/design/system/build-ready-contract.js.map +1 -0
  149. package/src/lib/design/system/check-rules.d.ts +1 -0
  150. package/src/lib/design/system/check-rules.js +82 -0
  151. package/src/lib/design/system/check-rules.js.map +1 -0
  152. package/src/lib/design/system/check-system.d.ts +62 -3
  153. package/src/lib/design/system/check-system.js +527 -34
  154. package/src/lib/design/system/check-system.js.map +1 -1
  155. package/src/lib/design/system/colour.d.ts +4 -1
  156. package/src/lib/design/system/colour.js +54 -2
  157. package/src/lib/design/system/colour.js.map +1 -1
  158. package/src/lib/design/system/comments/comment.d.ts +4 -1
  159. package/src/lib/design/system/comments/comment.js +13 -4
  160. package/src/lib/design/system/comments/comment.js.map +1 -1
  161. package/src/lib/design/system/comments/inbox.js +2 -2
  162. package/src/lib/design/system/comments/inbox.js.map +1 -1
  163. package/src/lib/design/system/compare-command.d.ts +119 -0
  164. package/src/lib/design/system/compare-command.js +558 -0
  165. package/src/lib/design/system/compare-command.js.map +1 -0
  166. package/src/lib/design/system/complete-command.js +7 -3
  167. package/src/lib/design/system/complete-command.js.map +1 -1
  168. package/src/lib/design/system/complete.d.ts +99 -3
  169. package/src/lib/design/system/complete.js +358 -88
  170. package/src/lib/design/system/complete.js.map +1 -1
  171. package/src/lib/design/system/component-outputs.d.ts +20 -0
  172. package/src/lib/design/system/component-outputs.js +86 -0
  173. package/src/lib/design/system/component-outputs.js.map +1 -0
  174. package/src/lib/design/system/contrast-check.d.ts +6 -1
  175. package/src/lib/design/system/contrast-check.js +179 -13
  176. package/src/lib/design/system/contrast-check.js.map +1 -1
  177. package/src/lib/design/system/demo-backdrop.d.ts +11 -0
  178. package/src/lib/design/system/demo-backdrop.js +41 -0
  179. package/src/lib/design/system/demo-backdrop.js.map +1 -0
  180. package/src/lib/design/system/design-hash.d.ts +31 -0
  181. package/src/lib/design/system/design-hash.js +73 -0
  182. package/src/lib/design/system/design-hash.js.map +1 -0
  183. package/src/lib/design/system/disabled-interaction.d.ts +8 -0
  184. package/src/lib/design/system/disabled-interaction.js +37 -0
  185. package/src/lib/design/system/disabled-interaction.js.map +1 -0
  186. package/src/lib/design/system/dom-command.d.ts +36 -0
  187. package/src/lib/design/system/dom-command.js +175 -0
  188. package/src/lib/design/system/dom-command.js.map +1 -0
  189. package/src/lib/design/system/drawn-open-points.d.ts +38 -0
  190. package/src/lib/design/system/drawn-open-points.js +94 -0
  191. package/src/lib/design/system/drawn-open-points.js.map +1 -0
  192. package/src/lib/design/system/dropped-props.d.ts +25 -0
  193. package/src/lib/design/system/dropped-props.js +159 -0
  194. package/src/lib/design/system/dropped-props.js.map +1 -0
  195. package/src/lib/design/system/embedded-actions.d.ts +21 -0
  196. package/src/lib/design/system/embedded-actions.js +37 -0
  197. package/src/lib/design/system/embedded-actions.js.map +1 -0
  198. package/src/lib/design/system/exceptions.js +2 -1
  199. package/src/lib/design/system/exceptions.js.map +1 -1
  200. package/src/lib/design/system/flows/flow.js +2 -1
  201. package/src/lib/design/system/flows/flow.js.map +1 -1
  202. package/src/lib/design/system/frozen-animations.d.ts +13 -0
  203. package/src/lib/design/system/frozen-animations.js +51 -0
  204. package/src/lib/design/system/frozen-animations.js.map +1 -0
  205. package/src/lib/design/system/go-batch.d.ts +24 -0
  206. package/src/lib/design/system/go-batch.js +110 -0
  207. package/src/lib/design/system/go-batch.js.map +1 -0
  208. package/src/lib/design/system/go-command.d.ts +4 -0
  209. package/src/lib/design/system/go-command.js +64 -0
  210. package/src/lib/design/system/go-command.js.map +1 -0
  211. package/src/lib/design/system/go-guard.d.ts +26 -0
  212. package/src/lib/design/system/go-guard.js +70 -0
  213. package/src/lib/design/system/go-guard.js.map +1 -0
  214. package/src/lib/design/system/go-step.d.ts +13 -0
  215. package/src/lib/design/system/go-step.js +84 -0
  216. package/src/lib/design/system/go-step.js.map +1 -0
  217. package/src/lib/design/system/handoff.js +2 -1
  218. package/src/lib/design/system/handoff.js.map +1 -1
  219. package/src/lib/design/system/harness-build-cache.d.ts +35 -0
  220. package/src/lib/design/system/harness-build-cache.js +175 -0
  221. package/src/lib/design/system/harness-build-cache.js.map +1 -0
  222. package/src/lib/design/system/harness-command.d.ts +7 -0
  223. package/src/lib/design/system/harness-command.js +51 -0
  224. package/src/lib/design/system/harness-command.js.map +1 -0
  225. package/src/lib/design/system/harness-config.d.ts +9 -0
  226. package/src/lib/design/system/harness-config.js +65 -0
  227. package/src/lib/design/system/harness-config.js.map +1 -0
  228. package/src/lib/design/system/harness-map.d.ts +44 -0
  229. package/src/lib/design/system/harness-map.js +126 -0
  230. package/src/lib/design/system/harness-map.js.map +1 -0
  231. package/src/lib/design/system/harness-samples.d.ts +20 -0
  232. package/src/lib/design/system/harness-samples.js +92 -0
  233. package/src/lib/design/system/harness-samples.js.map +1 -0
  234. package/src/lib/design/system/harness-server.d.ts +40 -0
  235. package/src/lib/design/system/harness-server.js +296 -0
  236. package/src/lib/design/system/harness-server.js.map +1 -0
  237. package/src/lib/design/system/imports.js +14 -1
  238. package/src/lib/design/system/imports.js.map +1 -1
  239. package/src/lib/design/system/in-order-at-once.d.ts +6 -0
  240. package/src/lib/design/system/in-order-at-once.js +28 -0
  241. package/src/lib/design/system/in-order-at-once.js.map +1 -0
  242. package/src/lib/design/system/inventory-approval.js +2 -1
  243. package/src/lib/design/system/inventory-approval.js.map +1 -1
  244. package/src/lib/design/system/inventory.d.ts +13 -4
  245. package/src/lib/design/system/inventory.js +36 -7
  246. package/src/lib/design/system/inventory.js.map +1 -1
  247. package/src/lib/design/system/list-system.d.ts +8 -1
  248. package/src/lib/design/system/list-system.js +13 -3
  249. package/src/lib/design/system/list-system.js.map +1 -1
  250. package/src/lib/design/system/live-actions.d.ts +121 -0
  251. package/src/lib/design/system/live-actions.js +665 -0
  252. package/src/lib/design/system/live-actions.js.map +1 -0
  253. package/src/lib/design/system/live-compare.d.ts +136 -0
  254. package/src/lib/design/system/live-compare.js +441 -0
  255. package/src/lib/design/system/live-compare.js.map +1 -0
  256. package/src/lib/design/system/live-uncovered.d.ts +40 -0
  257. package/src/lib/design/system/live-uncovered.js +123 -0
  258. package/src/lib/design/system/live-uncovered.js.map +1 -0
  259. package/src/lib/design/system/nested-scroll.d.ts +7 -0
  260. package/src/lib/design/system/nested-scroll.js +25 -0
  261. package/src/lib/design/system/nested-scroll.js.map +1 -0
  262. package/src/lib/design/system/notes/note.js +2 -1
  263. package/src/lib/design/system/notes/note.js.map +1 -1
  264. package/src/lib/design/system/occluded.d.ts +13 -0
  265. package/src/lib/design/system/occluded.js +111 -0
  266. package/src/lib/design/system/occluded.js.map +1 -0
  267. package/src/lib/design/system/open-points.d.ts +119 -0
  268. package/src/lib/design/system/open-points.js +185 -0
  269. package/src/lib/design/system/open-points.js.map +1 -0
  270. package/src/lib/design/system/part-build-ready.d.ts +39 -0
  271. package/src/lib/design/system/part-build-ready.js +107 -0
  272. package/src/lib/design/system/part-build-ready.js.map +1 -0
  273. package/src/lib/design/system/part-command.js +2 -9
  274. package/src/lib/design/system/part-command.js.map +1 -1
  275. package/src/lib/design/system/part-compare.d.ts +123 -0
  276. package/src/lib/design/system/part-compare.js +396 -0
  277. package/src/lib/design/system/part-compare.js.map +1 -0
  278. package/src/lib/design/system/part-go.d.ts +70 -0
  279. package/src/lib/design/system/part-go.js +94 -0
  280. package/src/lib/design/system/part-go.js.map +1 -0
  281. package/src/lib/design/system/part-ready.d.ts +90 -0
  282. package/src/lib/design/system/part-ready.js +172 -0
  283. package/src/lib/design/system/part-ready.js.map +1 -0
  284. package/src/lib/design/system/part-task.d.ts +147 -0
  285. package/src/lib/design/system/part-task.js +285 -0
  286. package/src/lib/design/system/part-task.js.map +1 -0
  287. package/src/lib/design/system/pointer-focus.d.ts +81 -0
  288. package/src/lib/design/system/pointer-focus.js +152 -0
  289. package/src/lib/design/system/pointer-focus.js.map +1 -0
  290. package/src/lib/design/system/prettier.d.ts +10 -0
  291. package/src/lib/design/system/prettier.js +36 -0
  292. package/src/lib/design/system/prettier.js.map +1 -0
  293. package/src/lib/design/system/reach.d.ts +12 -0
  294. package/src/lib/design/system/reach.js +186 -0
  295. package/src/lib/design/system/reach.js.map +1 -0
  296. package/src/lib/design/system/reachable-controls.d.ts +6 -0
  297. package/src/lib/design/system/reachable-controls.js +19 -0
  298. package/src/lib/design/system/reachable-controls.js.map +1 -0
  299. package/src/lib/design/system/reachable-files.d.ts +14 -0
  300. package/src/lib/design/system/reachable-files.js +101 -0
  301. package/src/lib/design/system/reachable-files.js.map +1 -0
  302. package/src/lib/design/system/reached-state.d.ts +23 -0
  303. package/src/lib/design/system/reached-state.js +53 -0
  304. package/src/lib/design/system/reached-state.js.map +1 -0
  305. package/src/lib/design/system/read-open-points.d.ts +33 -0
  306. package/src/lib/design/system/read-open-points.js +110 -0
  307. package/src/lib/design/system/read-open-points.js.map +1 -0
  308. package/src/lib/design/system/ready-command.d.ts +11 -0
  309. package/src/lib/design/system/ready-command.js +82 -0
  310. package/src/lib/design/system/ready-command.js.map +1 -0
  311. package/src/lib/design/system/render-check.d.ts +52 -0
  312. package/src/lib/design/system/render-check.js +479 -60
  313. package/src/lib/design/system/render-check.js.map +1 -1
  314. package/src/lib/design/system/resolve-product.d.ts +2 -1
  315. package/src/lib/design/system/resolve-product.js +25 -3
  316. package/src/lib/design/system/resolve-product.js.map +1 -1
  317. package/src/lib/design/system/rules/app-spec.d.ts +30 -0
  318. package/src/lib/design/system/rules/app-spec.js +87 -0
  319. package/src/lib/design/system/rules/app-spec.js.map +1 -0
  320. package/src/lib/design/system/rules/canonical-class.d.ts +2 -0
  321. package/src/lib/design/system/rules/canonical-class.js +36 -110
  322. package/src/lib/design/system/rules/canonical-class.js.map +1 -1
  323. package/src/lib/design/system/rules/capability-place.d.ts +44 -0
  324. package/src/lib/design/system/rules/capability-place.js +116 -0
  325. package/src/lib/design/system/rules/capability-place.js.map +1 -0
  326. package/src/lib/design/system/rules/denied-class.d.ts +9 -0
  327. package/src/lib/design/system/rules/denied-class.js +121 -0
  328. package/src/lib/design/system/rules/denied-class.js.map +1 -0
  329. package/src/lib/design/system/rules/exemptions.d.ts +18 -0
  330. package/src/lib/design/system/rules/exemptions.js +18 -0
  331. package/src/lib/design/system/rules/exemptions.js.map +1 -0
  332. package/src/lib/design/system/rules/flow.js +1 -1
  333. package/src/lib/design/system/rules/flow.js.map +1 -1
  334. package/src/lib/design/system/rules/glued-interpolation.d.ts +8 -0
  335. package/src/lib/design/system/rules/glued-interpolation.js +61 -0
  336. package/src/lib/design/system/rules/glued-interpolation.js.map +1 -0
  337. package/src/lib/design/system/rules/hard-coded-colour.js +2 -1
  338. package/src/lib/design/system/rules/hard-coded-colour.js.map +1 -1
  339. package/src/lib/design/system/rules/implemented-components.d.ts +22 -0
  340. package/src/lib/design/system/rules/implemented-components.js +45 -0
  341. package/src/lib/design/system/rules/implemented-components.js.map +1 -0
  342. package/src/lib/design/system/rules/implements.d.ts +8 -0
  343. package/src/lib/design/system/rules/implements.js +48 -0
  344. package/src/lib/design/system/rules/implements.js.map +1 -0
  345. package/src/lib/design/system/rules/inline-svg.js +4 -1
  346. package/src/lib/design/system/rules/inline-svg.js.map +1 -1
  347. package/src/lib/design/system/rules/inline-ui-in-page-open.d.ts +13 -0
  348. package/src/lib/design/system/rules/inline-ui-in-page-open.js +5 -0
  349. package/src/lib/design/system/rules/inline-ui-in-page-open.js.map +1 -0
  350. package/src/lib/design/system/rules/inline-ui-in-page.d.ts +18 -0
  351. package/src/lib/design/system/rules/inline-ui-in-page.js +123 -0
  352. package/src/lib/design/system/rules/inline-ui-in-page.js.map +1 -0
  353. package/src/lib/design/system/rules/inline-ui.d.ts +16 -0
  354. package/src/lib/design/system/rules/inline-ui.js +100 -0
  355. package/src/lib/design/system/rules/inline-ui.js.map +1 -0
  356. package/src/lib/design/system/rules/motion.d.ts +2 -0
  357. package/src/lib/design/system/rules/motion.js +35 -2
  358. package/src/lib/design/system/rules/motion.js.map +1 -1
  359. package/src/lib/design/system/rules/native-title.d.ts +7 -0
  360. package/src/lib/design/system/rules/native-title.js +64 -0
  361. package/src/lib/design/system/rules/native-title.js.map +1 -0
  362. package/src/lib/design/system/rules/option-values.d.ts +15 -0
  363. package/src/lib/design/system/rules/option-values.js +145 -0
  364. package/src/lib/design/system/rules/option-values.js.map +1 -0
  365. package/src/lib/design/system/rules/orphan-endpoint-known.d.ts +12 -0
  366. package/src/lib/design/system/rules/orphan-endpoint-known.js +20 -0
  367. package/src/lib/design/system/rules/orphan-endpoint-known.js.map +1 -0
  368. package/src/lib/design/system/rules/orphan-endpoint.d.ts +23 -0
  369. package/src/lib/design/system/rules/orphan-endpoint.js +166 -0
  370. package/src/lib/design/system/rules/orphan-endpoint.js.map +1 -0
  371. package/src/lib/design/system/rules/part-rewrite.d.ts +13 -0
  372. package/src/lib/design/system/rules/part-rewrite.js +125 -0
  373. package/src/lib/design/system/rules/part-rewrite.js.map +1 -0
  374. package/src/lib/design/system/rules/sample-default-known.d.ts +5 -0
  375. package/src/lib/design/system/rules/sample-default-known.js +17 -0
  376. package/src/lib/design/system/rules/sample-default-known.js.map +1 -0
  377. package/src/lib/design/system/rules/sample-default.d.ts +22 -0
  378. package/src/lib/design/system/rules/sample-default.js +92 -0
  379. package/src/lib/design/system/rules/sample-default.js.map +1 -0
  380. package/src/lib/design/system/rules/stale-replace.js +45 -3
  381. package/src/lib/design/system/rules/stale-replace.js.map +1 -1
  382. package/src/lib/design/system/rules/state-in-component.d.ts +16 -0
  383. package/src/lib/design/system/rules/state-in-component.js +101 -0
  384. package/src/lib/design/system/rules/state-in-component.js.map +1 -0
  385. package/src/lib/design/system/rules/tailwind-classes.d.ts +51 -0
  386. package/src/lib/design/system/rules/tailwind-classes.js +232 -0
  387. package/src/lib/design/system/rules/tailwind-classes.js.map +1 -0
  388. package/src/lib/design/system/rules/top-level-await.d.ts +9 -0
  389. package/src/lib/design/system/rules/top-level-await.js +62 -0
  390. package/src/lib/design/system/rules/top-level-await.js.map +1 -0
  391. package/src/lib/design/system/rules/unbound-input-known.d.ts +5 -0
  392. package/src/lib/design/system/rules/unbound-input-known.js +47 -0
  393. package/src/lib/design/system/rules/unbound-input-known.js.map +1 -0
  394. package/src/lib/design/system/rules/unbound-input.d.ts +22 -0
  395. package/src/lib/design/system/rules/unbound-input.js +61 -0
  396. package/src/lib/design/system/rules/unbound-input.js.map +1 -0
  397. package/src/lib/design/system/rules/uncovered-region.d.ts +13 -0
  398. package/src/lib/design/system/rules/uncovered-region.js +36 -0
  399. package/src/lib/design/system/rules/uncovered-region.js.map +1 -0
  400. package/src/lib/design/system/rules/undefined-class.d.ts +9 -0
  401. package/src/lib/design/system/rules/undefined-class.js +32 -0
  402. package/src/lib/design/system/rules/undefined-class.js.map +1 -0
  403. package/src/lib/design/system/rules/undefined-token.d.ts +1 -1
  404. package/src/lib/design/system/rules/undefined-token.js +7 -61
  405. package/src/lib/design/system/rules/undefined-token.js.map +1 -1
  406. package/src/lib/design/system/rules/utility-css.d.ts +2 -1
  407. package/src/lib/design/system/rules/utility-css.js +29 -14
  408. package/src/lib/design/system/rules/utility-css.js.map +1 -1
  409. package/src/lib/design/system/rules/view-coverage.d.ts +8 -0
  410. package/src/lib/design/system/rules/view-coverage.js +51 -0
  411. package/src/lib/design/system/rules/view-coverage.js.map +1 -0
  412. package/src/lib/design/system/rules/visible-change.d.ts +20 -0
  413. package/src/lib/design/system/rules/visible-change.js +48 -0
  414. package/src/lib/design/system/rules/visible-change.js.map +1 -0
  415. package/src/lib/design/system/sdk-errors.d.ts +14 -0
  416. package/src/lib/design/system/sdk-errors.js +38 -0
  417. package/src/lib/design/system/sdk-errors.js.map +1 -0
  418. package/src/lib/design/system/see-through.d.ts +12 -0
  419. package/src/lib/design/system/see-through.js +112 -0
  420. package/src/lib/design/system/see-through.js.map +1 -0
  421. package/src/lib/design/system/settled-panes.d.ts +18 -0
  422. package/src/lib/design/system/settled-panes.js +70 -0
  423. package/src/lib/design/system/settled-panes.js.map +1 -0
  424. package/src/lib/design/system/sketch/after-merge.d.ts +11 -0
  425. package/src/lib/design/system/sketch/after-merge.js +51 -0
  426. package/src/lib/design/system/sketch/after-merge.js.map +1 -0
  427. package/src/lib/design/system/sketch/aktuell-placeholders.d.ts +30 -0
  428. package/src/lib/design/system/sketch/aktuell-placeholders.js +87 -0
  429. package/src/lib/design/system/sketch/aktuell-placeholders.js.map +1 -0
  430. package/src/lib/design/system/sketch/baseline.d.ts +29 -2
  431. package/src/lib/design/system/sketch/baseline.js +33 -9
  432. package/src/lib/design/system/sketch/baseline.js.map +1 -1
  433. package/src/lib/design/system/sketch/check-sketches.d.ts +11 -0
  434. package/src/lib/design/system/sketch/check-sketches.js +54 -6
  435. package/src/lib/design/system/sketch/check-sketches.js.map +1 -1
  436. package/src/lib/design/system/sketch/cli-args.d.ts +12 -2
  437. package/src/lib/design/system/sketch/cli-args.js +18 -3
  438. package/src/lib/design/system/sketch/cli-args.js.map +1 -1
  439. package/src/lib/design/system/sketch/edit-sketch.d.ts +21 -0
  440. package/src/lib/design/system/sketch/edit-sketch.js +117 -0
  441. package/src/lib/design/system/sketch/edit-sketch.js.map +1 -0
  442. package/src/lib/design/system/sketch/frame-budget.d.ts +24 -0
  443. package/src/lib/design/system/sketch/frame-budget.js +23 -0
  444. package/src/lib/design/system/sketch/frame-budget.js.map +1 -0
  445. package/src/lib/design/system/sketch/identical-renders.d.ts +31 -0
  446. package/src/lib/design/system/sketch/identical-renders.js +137 -0
  447. package/src/lib/design/system/sketch/identical-renders.js.map +1 -0
  448. package/src/lib/design/system/sketch/merge-shared.d.ts +2 -0
  449. package/src/lib/design/system/sketch/merge-shared.js +7 -10
  450. package/src/lib/design/system/sketch/merge-shared.js.map +1 -1
  451. package/src/lib/design/system/sketch/merge-step.d.ts +35 -0
  452. package/src/lib/design/system/sketch/merge-step.js +98 -0
  453. package/src/lib/design/system/sketch/merge-step.js.map +1 -0
  454. package/src/lib/design/system/sketch/merge.d.ts +10 -3
  455. package/src/lib/design/system/sketch/merge.js +122 -17
  456. package/src/lib/design/system/sketch/merge.js.map +1 -1
  457. package/src/lib/design/system/sketch/merged-layout.d.ts +17 -0
  458. package/src/lib/design/system/sketch/merged-layout.js +57 -0
  459. package/src/lib/design/system/sketch/merged-layout.js.map +1 -0
  460. package/src/lib/design/system/sketch/merged-parts.d.ts +41 -11
  461. package/src/lib/design/system/sketch/merged-parts.js +113 -50
  462. package/src/lib/design/system/sketch/merged-parts.js.map +1 -1
  463. package/src/lib/design/system/sketch/no-visible-change.d.ts +10 -0
  464. package/src/lib/design/system/sketch/no-visible-change.js +16 -6
  465. package/src/lib/design/system/sketch/no-visible-change.js.map +1 -1
  466. package/src/lib/design/system/sketch/part-definition.d.ts +56 -0
  467. package/src/lib/design/system/sketch/part-definition.js +129 -13
  468. package/src/lib/design/system/sketch/part-definition.js.map +1 -1
  469. package/src/lib/design/system/sketch/rebase-port.d.ts +24 -0
  470. package/src/lib/design/system/sketch/rebase-port.js +170 -0
  471. package/src/lib/design/system/sketch/rebase-port.js.map +1 -0
  472. package/src/lib/design/system/sketch/sample-mark-drift.d.ts +33 -0
  473. package/src/lib/design/system/sketch/sample-mark-drift.js +88 -0
  474. package/src/lib/design/system/sketch/sample-mark-drift.js.map +1 -0
  475. package/src/lib/design/system/sketch/sketch-check-worker.d.ts +1 -0
  476. package/src/lib/design/system/sketch/sketch-check-worker.js +27 -0
  477. package/src/lib/design/system/sketch/sketch-check-worker.js.map +1 -0
  478. package/src/lib/design/system/sketch/sketch-checker.d.ts +27 -0
  479. package/src/lib/design/system/sketch/sketch-checker.js +99 -0
  480. package/src/lib/design/system/sketch/sketch-checker.js.map +1 -0
  481. package/src/lib/design/system/sketch/sketch.d.ts +78 -2
  482. package/src/lib/design/system/sketch/sketch.js +247 -54
  483. package/src/lib/design/system/sketch/sketch.js.map +1 -1
  484. package/src/lib/design/system/sketch/stale-base.d.ts +22 -0
  485. package/src/lib/design/system/sketch/stale-base.js +56 -0
  486. package/src/lib/design/system/sketch/stale-base.js.map +1 -0
  487. package/src/lib/design/system/sketch/unchanged-states.d.ts +36 -1
  488. package/src/lib/design/system/sketch/unchanged-states.js +60 -17
  489. package/src/lib/design/system/sketch/unchanged-states.js.map +1 -1
  490. package/src/lib/design/system/sketch/unused-closure.js +26 -4
  491. package/src/lib/design/system/sketch/unused-closure.js.map +1 -1
  492. package/src/lib/design/system/sketch/unused-files.d.ts +1 -1
  493. package/src/lib/design/system/sketch/unused-files.js +6 -3
  494. package/src/lib/design/system/sketch/unused-files.js.map +1 -1
  495. package/src/lib/design/system/sketch/viewed-shots.d.ts +24 -0
  496. package/src/lib/design/system/sketch/viewed-shots.js +61 -0
  497. package/src/lib/design/system/sketch/viewed-shots.js.map +1 -0
  498. package/src/lib/design/system/slow-checks.d.ts +40 -0
  499. package/src/lib/design/system/slow-checks.js +197 -0
  500. package/src/lib/design/system/slow-checks.js.map +1 -0
  501. package/src/lib/design/system/slow-run.d.ts +57 -0
  502. package/src/lib/design/system/slow-run.js +253 -0
  503. package/src/lib/design/system/slow-run.js.map +1 -0
  504. package/src/lib/design/system/stale-design-mocks.d.ts +20 -0
  505. package/src/lib/design/system/stale-design-mocks.js +59 -0
  506. package/src/lib/design/system/stale-design-mocks.js.map +1 -0
  507. package/src/lib/design/system/stale-dist.d.ts +25 -0
  508. package/src/lib/design/system/stale-dist.js +91 -0
  509. package/src/lib/design/system/stale-dist.js.map +1 -0
  510. package/src/lib/design/system/stale-parts.d.ts +30 -0
  511. package/src/lib/design/system/stale-parts.js +106 -0
  512. package/src/lib/design/system/stale-parts.js.map +1 -0
  513. package/src/lib/design/system/surface-nesting.d.ts +11 -0
  514. package/src/lib/design/system/surface-nesting.js +86 -0
  515. package/src/lib/design/system/surface-nesting.js.map +1 -0
  516. package/src/lib/design/system/system-command.js +8 -6
  517. package/src/lib/design/system/system-command.js.map +1 -1
  518. package/src/lib/design/system/system-modules.d.ts +16 -1
  519. package/src/lib/design/system/system-modules.js +18 -2
  520. package/src/lib/design/system/system-modules.js.map +1 -1
  521. package/src/lib/design/system/system-tsconfig.js +2 -2
  522. package/src/lib/design/system/system-tsconfig.js.map +1 -1
  523. package/src/lib/design/system/task-command.d.ts +51 -0
  524. package/src/lib/design/system/task-command.js +233 -0
  525. package/src/lib/design/system/task-command.js.map +1 -0
  526. package/src/lib/design/system/theming-text.d.ts +2 -0
  527. package/src/lib/design/system/theming-text.js +6 -0
  528. package/src/lib/design/system/theming-text.js.map +1 -0
  529. package/src/lib/design/system/tom-confirm.d.ts +40 -0
  530. package/src/lib/design/system/tom-confirm.js +55 -0
  531. package/src/lib/design/system/tom-confirm.js.map +1 -0
  532. package/src/lib/design/system/touched-parts.d.ts +16 -0
  533. package/src/lib/design/system/touched-parts.js +122 -0
  534. package/src/lib/design/system/touched-parts.js.map +1 -0
  535. package/src/lib/design/system/ts-source.d.ts +5 -0
  536. package/src/lib/design/system/ts-source.js +35 -4
  537. package/src/lib/design/system/ts-source.js.map +1 -1
  538. package/src/lib/design/system/unchanged-rows.d.ts +15 -0
  539. package/src/lib/design/system/unchanged-rows.js +134 -0
  540. package/src/lib/design/system/unchanged-rows.js.map +1 -0
  541. package/src/lib/design/system/uncommitted-decisions.d.ts +6 -0
  542. package/src/lib/design/system/uncommitted-decisions.js +38 -0
  543. package/src/lib/design/system/uncommitted-decisions.js.map +1 -0
  544. package/src/lib/design/system/uncovered-regions.d.ts +61 -0
  545. package/src/lib/design/system/uncovered-regions.js +171 -0
  546. package/src/lib/design/system/uncovered-regions.js.map +1 -0
  547. package/src/lib/design/system/unused-base-parts.d.ts +7 -0
  548. package/src/lib/design/system/unused-base-parts.js +76 -0
  549. package/src/lib/design/system/unused-base-parts.js.map +1 -0
  550. package/src/lib/design/system/visible-change-command.d.ts +48 -0
  551. package/src/lib/design/system/visible-change-command.js +308 -0
  552. package/src/lib/design/system/visible-change-command.js.map +1 -0
  553. package/src/lib/design/system/visible-change-parts.d.ts +28 -0
  554. package/src/lib/design/system/visible-change-parts.js +96 -0
  555. package/src/lib/design/system/visible-change-parts.js.map +1 -0
  556. package/src/lib/design/system/visible-change.d.ts +82 -0
  557. package/src/lib/design/system/visible-change.js +149 -0
  558. package/src/lib/design/system/visible-change.js.map +1 -0
  559. package/src/lib/design/thumb.d.ts +50 -6
  560. package/src/lib/design/thumb.js +154 -54
  561. package/src/lib/design/thumb.js.map +1 -1
  562. package/src/lib/design/typecheck.d.ts +1 -1
  563. package/src/lib/design/typecheck.js +3 -3
  564. package/src/lib/design/typecheck.js.map +1 -1
  565. package/src/lib/design/unstable-cells.d.ts +23 -0
  566. package/src/lib/design/unstable-cells.js +40 -0
  567. package/src/lib/design/unstable-cells.js.map +1 -0
  568. package/src/lib/design/variant-diff.js +1 -1
  569. package/src/lib/design/variant-diff.js.map +1 -1
  570. package/src/lib/design/wait.d.ts +15 -0
  571. package/src/lib/design/wait.js +30 -0
  572. package/src/lib/design/wait.js.map +1 -0
  573. package/src/lib/json-file.d.ts +11 -0
  574. package/src/lib/json-file.js +21 -0
  575. package/src/lib/json-file.js.map +1 -0
  576. package/src/lib/source-hash.d.ts +7 -0
  577. package/src/lib/source-hash.js +62 -0
  578. package/src/lib/source-hash.js.map +1 -0
  579. package/src/lib/update/agent-setup.js +2 -1
  580. package/src/lib/update/agent-setup.js.map +1 -1
  581. package/src/lib/update/migration-manifest.d.ts +12 -0
  582. package/src/lib/update/migration-manifest.js +13 -0
  583. package/src/lib/update/migration-manifest.js.map +1 -1
  584. package/src/lib/update/migration-record.js +2 -1
  585. package/src/lib/update/migration-record.js.map +1 -1
  586. package/src/lib/update/pending.js +2 -1
  587. package/src/lib/update/pending.js.map +1 -1
  588. package/src/lib/update/run-migrations.d.ts +3 -2
  589. package/src/lib/update/run-migrations.js +38 -5
  590. package/src/lib/update/run-migrations.js.map +1 -1
  591. package/src/lib/update/tasks.js +2 -1
  592. package/src/lib/update/tasks.js.map +1 -1
@@ -29,15 +29,23 @@ export const html = (strings: TemplateStringsArray, ...values: unknown[]) => joi
29
29
  /** Marks a template literal as CSS, for the same reason `html` does it for markup. */
30
30
  export const css = (strings: TemplateStringsArray, ...values: unknown[]) => join(strings, values);
31
31
 
32
- const emitted = new Set<string>();
32
+ const rendered = new Set<string>();
33
+ const taken = new Set<string>();
33
34
 
34
- /** The `<style>` tags for the sheets not yet in `seen`, which it then records. */
35
- export const unseenStyles = (styles: string[], seen: Set<string>) => {
35
+ /** The sheets in `styles` not yet in `seen`, which it then records, joined as one stylesheet. */
36
+ export const unseenStyles = (styles: Iterable<string>, seen: Set<string>) => {
36
37
  const fresh = [...new Set(styles)].filter((style) => !seen.has(style));
37
38
 
38
39
  for (const style of fresh) seen.add(style);
39
40
 
40
- return fresh.map((style) => `<style>${style}</style>`).join('');
41
+ return fresh.join('\n');
42
+ };
43
+
44
+ /** `drawn` with the component styles `ng()` rendered since the last drawing appended to its `styles`. */
45
+ export const withNgStyles = <T extends Drawing>(drawn: T): T => {
46
+ const sdk = unseenStyles(rendered, taken);
47
+
48
+ return sdk ? { ...drawn, styles: [drawn.styles, sdk].filter(Boolean).join('\n') } : drawn;
41
49
  };
42
50
 
43
51
  /** A form field `ng()` builds: its value, the errors it shows (a kind, or a kind and a message), and whether it is touched. */
@@ -50,6 +58,9 @@ export type NgField = { value: unknown; errors?: (string | { kind: string; messa
50
58
  export type NgOptions = { imports?: string[]; fields?: Record<string, NgField> };
51
59
 
52
60
  const render = async (template: string, options: NgOptions) => {
61
+ if (typeof location === 'undefined')
62
+ return { markup: template.replace(/<([a-zA-Z][\w:.-]*)/g, '<$1 data-et-ng'), styles: [] };
63
+
53
64
  const params = new URLSearchParams(location.search);
54
65
  const response = await fetch('/__design/render', {
55
66
  method: 'POST',
@@ -70,12 +81,15 @@ const render = async (template: string, options: NgOptions) => {
70
81
 
71
82
  /**
72
83
  * Renders an Angular template with the real components on the design server and resolves with its
73
- * markup, led by the component styles this frame has not received yet. Rejects with the render error.
84
+ * markup. The component styles go into the `styles` of the drawing the frame shows. Rejects with the render error.
85
+ * Outside a browser it resolves with the template unrendered, each element marked `data-et-ng`.
74
86
  */
75
87
  export const ng = async (template: string, options: NgOptions = {}) => {
76
88
  const { markup, styles } = await render(template, options);
77
89
 
78
- return unseenStyles(styles, emitted) + markup;
90
+ for (const style of styles) rendered.add(style);
91
+
92
+ return markup;
79
93
  };
80
94
 
81
95
  /** A click on an element that matches `click` inside the drawing shows the state `go`. */
@@ -113,8 +127,8 @@ export const switchStates =
113
127
  */
114
128
  export const ngStates = async <TState extends string>(templates: Record<TState, string>, options: NgOptions = {}) => {
115
129
  const names = Object.keys(templates) as TState[];
116
- const rendered = await Promise.all(names.map((name) => render(templates[name], options)));
117
- const states = Object.fromEntries(names.map((name, index) => [name, rendered[index]?.markup ?? ''])) as Record<
130
+ const drawnStates = await Promise.all(names.map((name) => render(templates[name], options)));
131
+ const states = Object.fromEntries(names.map((name, index) => [name, drawnStates[index]?.markup ?? ''])) as Record<
118
132
  TState,
119
133
  string
120
134
  >;
@@ -122,12 +136,10 @@ export const ngStates = async <TState extends string>(templates: Record<TState,
122
136
 
123
137
  if (first === undefined) throw new Error('design-explore: ngStates() needs at least one state');
124
138
 
139
+ for (const style of drawnStates.flatMap((entry) => entry.styles)) rendered.add(style);
140
+
125
141
  return {
126
- body:
127
- unseenStyles(
128
- rendered.flatMap((entry) => entry.styles),
129
- emitted,
130
- ) + `<div data-de-states="${first}" style="display: contents">${states[first]}</div>`,
142
+ body: `<div data-de-states="${first}" style="display: contents">${states[first]}</div>`,
131
143
  on: (rules: StateRule<TState>[]) => switchStates(states, rules),
132
144
  };
133
145
  };
@@ -245,27 +257,84 @@ export const placeOverlays = (root: HTMLElement) => {
245
257
  }
246
258
  };
247
259
 
260
+ const setStyle = (
261
+ element: HTMLElement,
262
+ write: { property: 'paddingTop' | 'minHeight' | 'minWidth'; value: string },
263
+ ) => {
264
+ const { property, value } = write;
265
+
266
+ if (element.style[property] !== value) element.style[property] = value;
267
+ };
268
+
269
+ const fitPaddingTops = new WeakMap<HTMLElement, string>();
270
+
248
271
  /**
249
272
  * Grows `root` to cover every absolutely or fixed positioned element inside it, such as an open
250
273
  * overlay pane, so a frame measured or shot from `root` shows them. Skips a fixed element on all four
251
- * edges of the viewport, such as a backdrop. Grows sideways too with `sideways`. Safe to run again.
274
+ * edges of the viewport, such as a backdrop, and counts an absolute element only as far as the
275
+ * overflow boxes that clip it. Grows sideways and up too with `sideways`, up by a top padding that
276
+ * moves the content below an element drawn above it. Safe to run again.
252
277
  */
253
278
  export const fitOutOfFlow = (root: HTMLElement, options: { sideways: boolean }) => {
254
279
  const view = root.ownerDocument.defaultView;
255
280
 
256
281
  if (!view) return;
257
282
 
258
- const box = root.getBoundingClientRect();
259
- const style = view.getComputedStyle(root);
260
283
  const fillsViewport = (style: CSSStyleDeclaration) =>
261
284
  style.position === 'fixed' &&
262
285
  [style.top, style.right, style.bottom, style.left].every((edge) => parseFloat(edge) === 0);
263
- const outOfFlow = [...root.querySelectorAll('*')]
264
- .map((element) => ({ element, style: view.getComputedStyle(element) }))
265
- .filter(({ style }) => ['absolute', 'fixed'].includes(style.position) && !fillsViewport(style))
266
- .map(({ element }) => element)
267
- .map((element) => element.getBoundingClientRect())
268
- .filter((rect) => rect.width > 0 && rect.height > 0);
286
+ const clips = (style: CSSStyleDeclaration) =>
287
+ [style.overflow, style.overflowX, style.overflowY].some((overflow) => overflow && overflow !== 'visible');
288
+ const holdsAbsolute = (style: CSSStyleDeclaration) =>
289
+ !['static', ''].includes(style.position) || !['none', ''].includes(style.transform);
290
+ const clipped = (element: Element) => {
291
+ let { top, right, bottom, left } = element.getBoundingClientRect();
292
+ let escaping = true;
293
+
294
+ for (let ancestor = element.parentElement; ancestor && ancestor !== root; ancestor = ancestor.parentElement) {
295
+ const style = view.getComputedStyle(ancestor);
296
+
297
+ if (escaping && holdsAbsolute(style)) escaping = false;
298
+ if (!escaping && clips(style)) {
299
+ const box = ancestor.getBoundingClientRect();
300
+
301
+ top = Math.max(top, box.top);
302
+ right = Math.min(right, box.right);
303
+ bottom = Math.min(bottom, box.bottom);
304
+ left = Math.max(left, box.left);
305
+ }
306
+ if (style.position === 'fixed') break;
307
+ if (style.position === 'absolute') escaping = true;
308
+ }
309
+
310
+ return { top, right, bottom, left, width: right - left, height: bottom - top };
311
+ };
312
+ const outOfFlowOf = () =>
313
+ [...root.querySelectorAll('*')]
314
+ .map((element) => ({ element, style: view.getComputedStyle(element) }))
315
+ .filter(({ style }) => ['absolute', 'fixed'].includes(style.position) && !fillsViewport(style))
316
+ .map(({ element, style }) => (style.position === 'fixed' ? element.getBoundingClientRect() : clipped(element)))
317
+ .filter((rect) => rect.width > 0 && rect.height > 0);
318
+
319
+ if (options.sideways) {
320
+ const fitted = fitPaddingTops.get(root);
321
+
322
+ if (fitted !== undefined) setStyle(root, { property: 'paddingTop', value: fitted });
323
+
324
+ const top = Math.min(...outOfFlowOf().map((rect) => rect.top));
325
+ const rootTop = root.getBoundingClientRect().top;
326
+
327
+ if (top < rootTop) {
328
+ const padding = parseFloat(view.getComputedStyle(root).paddingTop) || 0;
329
+
330
+ fitPaddingTops.set(root, root.style.paddingTop);
331
+ setStyle(root, { property: 'paddingTop', value: `${Math.ceil(2 * padding + rootTop - top)}px` });
332
+ } else fitPaddingTops.delete(root);
333
+ }
334
+
335
+ const box = root.getBoundingClientRect();
336
+ const style = view.getComputedStyle(root);
337
+ const outOfFlow = outOfFlowOf();
269
338
  const extentOf = ({ side, start, paddings }: { side: 'bottom' | 'right'; start: number; paddings: string[] }) => {
270
339
  const extent = Math.max(0, ...outOfFlow.map((rect) => Math.ceil(rect[side] - start)));
271
340
  const [before, after] = paddings.map((padding) => parseFloat(padding) || 0) as [number, number];
@@ -275,16 +344,14 @@ export const fitOutOfFlow = (root: HTMLElement, options: { sideways: boolean })
275
344
  return `${style.boxSizing === 'border-box' ? extent + after : extent - before}px`;
276
345
  };
277
346
 
278
- root.style.minHeight = extentOf({
279
- side: 'bottom',
280
- start: box.top,
281
- paddings: [style.paddingTop, style.paddingBottom],
347
+ setStyle(root, {
348
+ property: 'minHeight',
349
+ value: extentOf({ side: 'bottom', start: box.top, paddings: [style.paddingTop, style.paddingBottom] }),
282
350
  });
283
351
  if (options.sideways)
284
- root.style.minWidth = extentOf({
285
- side: 'right',
286
- start: box.left,
287
- paddings: [style.paddingLeft, style.paddingRight],
352
+ setStyle(root, {
353
+ property: 'minWidth',
354
+ value: extentOf({ side: 'right', start: box.left, paddings: [style.paddingLeft, style.paddingRight] }),
288
355
  });
289
356
  };
290
357
 
@@ -305,7 +372,8 @@ export type CallVariant = {
305
372
  verdict?: 'chosen' | 'rejected';
306
373
  /** The `key` of the round that drew it. Left out by a call that runs no rounds. */
307
374
  round?: string;
308
- load: () => Promise<{ default: Drawing }>;
375
+ /** A drawing that needs `ng()` default-exports a promise of it: a top-level `await` can hang WebKit when its frame is removed. */
376
+ load: () => Promise<{ default: Drawing | Promise<Drawing> }>;
309
377
  };
310
378
 
311
379
  /**
@@ -1,4 +1,4 @@
1
- import { Drawing } from './define-call';
1
+ import { Drawing, withNgStyles } from './define-call';
2
2
  import { forceBody } from './mark-part';
3
3
 
4
4
  export { contrastRatioOf } from './contrast';
@@ -10,12 +10,16 @@ export { iconSheet } from './icon-sheet';
10
10
  export type { IconSheetIcon, IconSheetOptions } from './icon-sheet';
11
11
  export { interactionRows } from './interaction-rows';
12
12
  export type { InteractionRowsOptions } from './interaction-rows';
13
+ export { logoSheet } from './logo-sheet';
14
+ export type { LogoSheetMark, LogoSheetOptions } from './logo-sheet';
13
15
  export { spring } from './spring';
14
16
  export type { Spring } from './spring';
15
17
  export { svgAsset } from './svg-asset';
16
18
  export type { SvgAssetOptions } from './svg-asset';
17
19
  export { tokenSheet } from './token-sheet';
18
20
  export type { TokenSheetOptions } from './token-sheet';
21
+ export { withAction } from './with-action';
22
+ export type { ActionTarget } from './with-action';
19
23
 
20
24
  /** An interaction Studio can force on a part's root element. Rest is always drawn and never listed. */
21
25
  export type Interaction = 'hover' | 'focus-visible' | 'active' | 'disabled';
@@ -24,6 +28,8 @@ export type Interaction = 'hover' | 'focus-visible' | 'active' | 'disabled';
24
28
  * One part of a product's design system. `note` records why the part has its current shape, and
25
29
  * `madeBy` the model ids that drew it, written by a sketch merge.
26
30
  * `states` names each state it is drawn in with the props for that state, and `render` draws it.
31
+ * `frame` wraps the body of each of the part's own states in a demo frame (padding, a page background); a part that
32
+ * calls `render` of this one gets the part without it.
27
33
  * `styles` is the part's stylesheet: every drawing of the part gets it before the styles `render` returns, and a
28
34
  * host that embeds a piece of the part's markup takes it from the default export.
29
35
  * A part that responds to its width lists the container `widths` it is drawn at; without them a
@@ -33,16 +39,22 @@ export type Interaction = 'hover' | 'focus-visible' | 'active' | 'disabled';
33
39
  * `controls` names each control the part draws, keyed by the id its markup carries in `data-et-control`; `design
34
40
  * complete` requires the states and surfaces its `kind` and `input` need, see `Control`.
35
41
  * `motions` names each motion between two of its states, see `Motion`; a rule in `rules` can name one.
42
+ * `unreachable` lists the state pairs no user can move between, each with its `reason`; they need no motion.
43
+ * `instant` is the reason every switch between two states happens at once; no pair then needs a motion.
44
+ * `omits` records mock option values deliberately left off the grid, each with a reason.
36
45
  * `checks.skip` names the render checks of `design check` the part breaks on purpose, such as
37
46
  * `CLIPPED` for a part that cuts its content. To skip a check for one element only, put
38
47
  * `data-et-skip="CLIPPED"` on it; the check then ignores that element and everything inside it.
39
48
  * `contrast` feeds the contrast check of `design check`, see `PartContrast`.
49
+ * `implements` links the part to the code that builds it, see `PartLink`.
50
+ * `sample` makes an embedded instance of the part comparable across the states of its host, see `PartSample`.
40
51
  */
41
52
  export type Part<TProps, TState extends string = string> = {
42
53
  note: string;
43
54
  madeBy?: string[];
44
55
  states: Record<TState, TProps>;
45
56
  styles?: string;
57
+ frame?: (body: string, props: TProps) => string;
46
58
  widths?: number[];
47
59
  interactions?: Interaction[];
48
60
  grid?: StateGrid<TState>;
@@ -50,10 +62,30 @@ export type Part<TProps, TState extends string = string> = {
50
62
  checks?: { skip?: RenderCheck[] };
51
63
  contrast?: PartContrast;
52
64
  motions?: Record<string, Motion<TState>>;
65
+ unreachable?: { from: TState; to: TState; reason: string }[];
66
+ instant?: string;
67
+ omits?: { option: keyof TProps & string; value: string; reason: string }[];
53
68
  rules?: PartRule<TState>[];
69
+ implements?: PartLink;
70
+ sample?: PartSample<TProps>;
54
71
  render: (props: TProps, options?: RenderOptions) => DrawnPart | Promise<DrawnPart>;
55
72
  };
56
73
 
74
+ /**
75
+ * The code a part is built in: a component or element names the repo-relative path of its `.component.ts`, a page
76
+ * names its route and, for `design compare`, the presentational `component` it renders. `design check` fails on a
77
+ * path that does not exist, and lists a part without a link as open.
78
+ */
79
+ /**
80
+ * The prop `id` a host passes to name an embedded instance, and the props `marks` that carry its sample marks. Every
81
+ * state of one host that draws the same `id` must pass the same `marks`: `design sketch check` warns and
82
+ * `design sketch ready` refuses with `SAMPLE-MARK-DRIFT` otherwise. A host state that shows another sample passes
83
+ * another `id`.
84
+ */
85
+ export type PartSample<TProps> = { id: keyof TProps & string; marks: readonly (keyof TProps & string)[] };
86
+
87
+ export type PartLink = `${string}.component.ts` | { route: `/${string}`; component?: `${string}.component.ts` };
88
+
57
89
  /** What `play` of a motion may use, so Studio controls time: `at` schedules `fn` at `ms` into the motion on the tool's clock, `random` is seeded, `rect` measures a selector in the `from` state. */
58
90
  export type MotionContext = {
59
91
  at: (ms: number, fn: () => void) => void;
@@ -62,7 +94,7 @@ export type MotionContext = {
62
94
  };
63
95
 
64
96
  /**
65
- * A motion from the state `from` to the state `to`. `at` adds shot times in ms, `interrupt` starts the reverse motion
97
+ * A motion from the state `from` to the state `to`; with `from` equal to `to` it is the looping motion inside that state. `at` adds shot times in ms, `interrupt` starts the reverse motion
66
98
  * at that time, `viewTransition` uses a View Transition, and `play` runs after the morph for what CSS cannot express.
67
99
  */
68
100
  export type Motion<TState extends string = string> = {
@@ -138,8 +170,10 @@ export type RenderOptions = { interaction?: Interaction };
138
170
 
139
171
  type PartSource<TProps, TState extends string, TColumn extends string> = Omit<
140
172
  Part<TProps, TState>,
141
- 'states' | 'grid' | 'controls' | 'motions' | 'rules' | 'render'
173
+ 'states' | 'grid' | 'controls' | 'motions' | 'rules' | 'render' | 'frame' | 'sample'
142
174
  > & {
175
+ sample?: PartSample<NoInfer<TProps>>;
176
+ frame?: (body: string, props: NoInfer<TProps>) => string;
143
177
  motions?: Record<string, Motion<NoInfer<TState>>>;
144
178
  rules?: PartRule<NoInfer<TState>>[];
145
179
  states: Record<TState, NoInfer<TProps>>;
@@ -154,6 +188,13 @@ type PartSource<TProps, TState extends string, TColumn extends string> = Omit<
154
188
  */
155
189
  export const forceInteraction = (markup: string, interaction: Interaction) => forceBody(markup, interaction);
156
190
 
191
+ /**
192
+ * The attribute that marks an element as the region `name` whose content the implementing component projects with
193
+ * `<ng-content>`, e.g. `<main ${slot('canvas')}>`. `design compare` empties it in the design picture, as the harness
194
+ * projects nothing.
195
+ */
196
+ export const slot = (name: string) => `data-et-projected="${name}"`;
197
+
157
198
  const finished = (
158
199
  drawn: Drawing,
159
200
  { styles, interaction }: { styles?: string; interaction?: Interaction },
@@ -163,6 +204,12 @@ const finished = (
163
204
  styles: [styles, drawn.styles].filter(Boolean).join('\n'),
164
205
  });
165
206
 
207
+ /** Draws `props` as one of the part's own states: the drawing of `render` inside the part's `frame`. */
208
+ export const drawState = <TProps>(part: Part<TProps>, props: TProps): Promise<DrawnPart> =>
209
+ Promise.resolve(part.render(props)).then((drawn) =>
210
+ withNgStyles(part.frame ? { ...drawn, body: part.frame(drawn.body, props) } : drawn),
211
+ );
212
+
166
213
  /**
167
214
  * Types a part where it is written. A part file default-exports the result, and may export named
168
215
  * helpers next to it that other parts import from `@system/<layer>/<name>`. Without type
@@ -31,7 +31,7 @@ const SHEET_STYLES = `
31
31
  .ics-cell { display: flex; }
32
32
  .ics-construction { display: grid; gap: var(--space-5, 2rem); }
33
33
  .ics-item { display: flex; flex-direction: column; align-items: center; gap: var(--space-2, 0.8rem); }
34
- .ics-frame { position: relative; display: flex; border: 1px solid var(--surface-border, oklch(0.34 0 0)); background: var(--surface, oklch(0.17 0 0)); }
34
+ .ics-frame { position: relative; display: flex; border: 1px solid var(--surface-border, oklch(0.34 0 0)); }
35
35
  .ics-icon { position: relative; }
36
36
  .ics-guides { position: absolute; inset: 0; width: 100%; height: 100%; color: var(--accent, oklch(0.7 0.15 250)); pointer-events: none; }
37
37
  .ics-guides path, .ics-guides rect { vector-effect: non-scaling-stroke; stroke-width: 1px; }
@@ -5,28 +5,35 @@ export type InteractionRowsOptions<TProps, TInteraction extends string> = {
5
5
 
6
6
  type RowState<TRow extends string, TInteraction extends string> = TRow | `${TRow}-${TInteraction}`;
7
7
 
8
+ const isDisabledRow = (props: unknown) =>
9
+ typeof props === 'object' && props !== null && (props as { disabled?: unknown }).disabled === true;
10
+
8
11
  /**
9
12
  * Builds the `states` and `grid` of a part from one props object per row: each row is drawn at rest as `<row>` and
10
- * in each of `interactions` as `<row>-<interaction>`, with the props `force` returns. Spread the result into
11
- * `definePart`; the built state names stay in its type.
13
+ * in each of `interactions` as `<row>-<interaction>`, with the props `force` returns. A row whose props carry
14
+ * `disabled: true` is drawn only at rest. Spread the result into `definePart`; the built state names stay in its type.
12
15
  */
13
16
  export const interactionRows = <TProps, const TRow extends string, const TInteraction extends string>(
14
17
  rows: Record<TRow, TProps>,
15
18
  { interactions, force }: InteractionRowsOptions<TProps, TInteraction>,
16
19
  ) => {
17
20
  const entries = Object.entries(rows) as [TRow, TProps][];
21
+ const interactionsOf = (props: TProps) => (isDisabledRow(props) ? [] : interactions);
18
22
  const states = Object.fromEntries(
19
23
  entries.flatMap(([row, props]) => [
20
24
  [row, props],
21
- ...interactions.map((interaction) => [`${row}-${interaction}`, force(props, interaction)]),
25
+ ...interactionsOf(props).map((interaction) => [`${row}-${interaction}`, force(props, interaction)]),
22
26
  ]),
23
27
  ) as Record<RowState<TRow, TInteraction>, TProps>;
24
28
  const gridRows = Object.fromEntries(
25
- entries.map(([row]) => [
29
+ entries.map(([row, props]) => [
26
30
  row,
27
- Object.fromEntries([['rest', row], ...interactions.map((interaction) => [interaction, `${row}-${interaction}`])]),
31
+ Object.fromEntries([
32
+ ['rest', row],
33
+ ...interactionsOf(props).map((interaction) => [interaction, `${row}-${interaction}`]),
34
+ ]),
28
35
  ]),
29
- ) as Record<TRow, Record<'rest' | TInteraction, RowState<TRow, TInteraction>>>;
36
+ ) as Record<TRow, { rest: TRow } & Partial<Record<TInteraction, RowState<TRow, TInteraction>>>>;
30
37
 
31
38
  return { states, grid: { columns: ['rest', ...interactions] as const, rows: gridRows } };
32
39
  };
@@ -0,0 +1,52 @@
1
+ import { Drawing, html } from './define-call';
2
+ import { svgAsset } from './svg-asset';
3
+
4
+ export type LogoSheetMark = {
5
+ title: string;
6
+ svg: string;
7
+ sizes: number[];
8
+ onLight?: number[];
9
+ };
10
+
11
+ export type LogoSheetOptions = {
12
+ marks: LogoSheetMark[];
13
+ };
14
+
15
+ const SHEET_STYLES = `
16
+ .lgs-root { display: flex; flex-direction: column; gap: var(--space-4, 1.6rem); padding: var(--space-6, 2.4rem); background: var(--surface, oklch(0.17 0 0)); color: var(--text, oklch(0.94 0 0)); font-family: var(--font-ui, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif); font-size: var(--text-md, 1.3rem); line-height: var(--text-md-line, 1.8rem); }
17
+ .lgs-root svg { display: block; }
18
+ .lgs-title { margin: 0; font-size: var(--text-xl, 1.7rem); line-height: var(--text-xl-line, 2.2rem); font-weight: var(--weight-strong, 600); }
19
+ .lgs-row { display: flex; align-items: flex-end; gap: var(--space-6, 2.4rem); }
20
+ .lgs-item { display: flex; flex-direction: column; align-items: center; gap: var(--space-2, 0.8rem); }
21
+ .lgs-label { font-family: var(--font-code, ui-monospace, "SF Mono", Menlo, Consolas, monospace); font-size: var(--text-xs, 1rem); line-height: var(--text-xs-line, 1.4rem); color: var(--text-muted, oklch(0.72 0 0)); }
22
+ .lgs-plate { display: flex; align-items: center; gap: var(--space-3, 1.2rem); padding: var(--space-2, 0.8rem) var(--space-3, 1.2rem); border-radius: var(--radius-control-md, 0.6rem); background: var(--text, oklch(0.94 0 0)); }
23
+ `;
24
+
25
+ const item = (content: string, label: string) =>
26
+ html`<div class="lgs-item">${content}<span class="lgs-label">${label}</span></div>`;
27
+
28
+ /**
29
+ * Draws a `foundations/logo` part: one row per mark with its `title`, the mark at each of its `sizes` in px, and, when
30
+ * `onLight` lists sizes, the mark at those sizes on a light bar.
31
+ */
32
+ export const logoSheet = ({ marks }: LogoSheetOptions): Drawing => ({
33
+ body: html`<div class="lgs-root">
34
+ ${marks
35
+ .map(
36
+ ({ title, svg, sizes, onLight }) =>
37
+ html`<h2 class="lgs-title">${title}</h2>
38
+ <div class="lgs-row">
39
+ ${sizes.map((size) => item(svgAsset(svg, { size }), `${size} px`)).join('')}
40
+ ${
41
+ !!onLight?.length &&
42
+ item(
43
+ html`<div class="lgs-plate">${onLight.map((size) => svgAsset(svg, { size })).join('')}</div>`,
44
+ 'on a light bar',
45
+ )
46
+ }
47
+ </div>`,
48
+ )
49
+ .join('')}
50
+ </div>`,
51
+ styles: SHEET_STYLES,
52
+ });
@@ -37,11 +37,19 @@ export const markBody = (body: string, key: string) => {
37
37
  return `${body.slice(0, valueEnd)} ${key}${body.slice(valueEnd)}`;
38
38
  };
39
39
 
40
- /** Forces `interaction` on the first element of `body` the way a frame forces it on the root of a part. */
40
+ const DISABLED_ATTRIBUTE = /\s(?:disabled(?=[\s=/>]|$)|aria-disabled\s*=\s*["']?true\b)/i;
41
+
42
+ const isDisabledMarkup = (attributes: string) => DISABLED_ATTRIBUTE.test(attributes);
43
+
44
+ /**
45
+ * Forces `interaction` on the first element of `body` the way a frame forces it on the root of a part. A disabled
46
+ * element stays at rest: it gets no forced hover, active or focus-visible.
47
+ */
41
48
  export const forceBody = (body: string, interaction: Interaction) => {
42
49
  const attributesAt = attributesAtOf(body);
43
50
 
44
51
  if (attributesAt === null) return body;
52
+ if (interaction !== 'disabled' && isDisabledMarkup(ATTRIBUTES.exec(body.slice(attributesAt))?.[0] ?? '')) return body;
45
53
 
46
54
  const forced = interaction === 'disabled' ? ' disabled aria-disabled="true"' : ` data-et-force="${interaction}"`;
47
55
 
@@ -117,6 +125,23 @@ const slotProps = (value: unknown, { key, depth = 0 }: { key: string; depth?: nu
117
125
  return value;
118
126
  };
119
127
 
128
+ const SAMPLES = Symbol.for('@ethlete/cli/design/samples');
129
+
130
+ /** Reports `props` to the sample recorder a check installs, when the part declares a `sample` and the props carry its `id`. */
131
+ const recordSample = ({ key, part }: { key: string; part: unknown }, props: unknown) => {
132
+ const record = (globalThis as Record<symbol, unknown>)[SAMPLES];
133
+ const sample = isPlainObject(part) ? part['sample'] : undefined;
134
+
135
+ if (typeof record !== 'function' || !isPlainObject(sample) || !isPlainObject(props)) return;
136
+
137
+ const id = props[String(sample['id'])];
138
+ const marks = Array.isArray(sample['marks']) ? (sample['marks'] as unknown[]).map(String) : [];
139
+
140
+ if (typeof id !== 'string' || id === '') return;
141
+
142
+ record({ part: key, id, marks: Object.fromEntries(marks.map((mark) => [mark, props[mark] ?? null])) });
143
+ };
144
+
120
145
  const markDrawing = <TDrawing extends Drawing>(drawn: TDrawing, key: string): TDrawing =>
121
146
  typeof drawn?.body === 'string' ? { ...drawn, body: markBody(drawn.body, key) } : drawn;
122
147
 
@@ -135,9 +160,34 @@ export const markPart = <TProps, TState extends string>(
135
160
  return {
136
161
  ...part,
137
162
  render: (props: TProps, options?: RenderOptions) => {
163
+ recordSample({ key, part }, props);
164
+
138
165
  const drawn = render.call(part, slotProps(props, { key }) as TProps, options);
139
166
 
140
167
  return drawn instanceof Promise ? drawn.then((done) => markDrawing(done, key)) : markDrawing(drawn, key);
141
168
  },
142
169
  };
143
170
  };
171
+
172
+ const markOutput = (output: unknown, key: string) =>
173
+ typeof output === 'string' ? markBody(output, key) : markDrawing(output as Drawing, key);
174
+
175
+ /**
176
+ * `value` as a named export of the part `key`: a function whose markup, or drawing body, comes back with its first
177
+ * element marked as the root of `key`, and the markup of its arguments as slotted into `key`. Any other value, a
178
+ * class included, stays as it is. A call whose first argument carries the `sample` id of `part` is reported as a sample.
179
+ */
180
+ export const markNamed = <T>(value: T, { key, part }: { key: string; part?: unknown }): T => {
181
+ if (typeof value !== 'function' || /^class\b/u.test(Function.prototype.toString.call(value))) return value;
182
+
183
+ return function (this: unknown, ...args: unknown[]) {
184
+ recordSample({ key, part }, args[0]);
185
+
186
+ const output = value.apply(
187
+ this,
188
+ args.map((arg) => slotProps(arg, { key })),
189
+ );
190
+
191
+ return output instanceof Promise ? output.then((done) => markOutput(done, key)) : markOutput(output, key);
192
+ } as T;
193
+ };