@ethlete/cli 3.0.0-next.21 → 3.0.0-next.22

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 (335) hide show
  1. package/CHANGELOG.md +180 -0
  2. package/design/assets.d.ts +9 -0
  3. package/design/define-call.ts +20 -11
  4. package/design/define-part.ts +102 -0
  5. package/design/embed-page.ts +70 -0
  6. package/design/interaction-rows.ts +32 -0
  7. package/design/mark-part.ts +66 -0
  8. package/design/svg-asset.ts +36 -0
  9. package/design/systems/config.json +10 -0
  10. package/design/systems/ethlete-components/components/button/button.ts +18 -0
  11. package/design/web/env.d.ts +20 -0
  12. package/design/web/frame.ts +173 -41
  13. package/design/wireframe-kit.ts +386 -0
  14. package/package.json +4 -2
  15. package/src/index.js.map +1 -1
  16. package/src/lib/api/api-command.js.map +1 -1
  17. package/src/lib/api/api-context.js.map +1 -1
  18. package/src/lib/api/api-state.js.map +1 -1
  19. package/src/lib/api/auth-hint.js.map +1 -1
  20. package/src/lib/api/clear.js.map +1 -1
  21. package/src/lib/api/clone.js.map +1 -1
  22. package/src/lib/api/compose.js.map +1 -1
  23. package/src/lib/api/definition.js.map +1 -1
  24. package/src/lib/api/doctor.js.map +1 -1
  25. package/src/lib/api/fingerprint.js.map +1 -1
  26. package/src/lib/api/git.js.map +1 -1
  27. package/src/lib/api/help.js.map +1 -1
  28. package/src/lib/api/index.js.map +1 -1
  29. package/src/lib/api/load-definitions.js.map +1 -1
  30. package/src/lib/api/lock.js.map +1 -1
  31. package/src/lib/api/parse-argv.js.map +1 -1
  32. package/src/lib/api/ports.js.map +1 -1
  33. package/src/lib/api/resolve-checkout.js.map +1 -1
  34. package/src/lib/api/run-locked.js.map +1 -1
  35. package/src/lib/api/run-ready.js.map +1 -1
  36. package/src/lib/api/run-snapshot.js.map +1 -1
  37. package/src/lib/api/run-status.js.map +1 -1
  38. package/src/lib/api/run.js.map +1 -1
  39. package/src/lib/api/seeds.js.map +1 -1
  40. package/src/lib/api/setup.js.map +1 -1
  41. package/src/lib/api/snapshot.js.map +1 -1
  42. package/src/lib/api/state.js.map +1 -1
  43. package/src/lib/api/suggest.js.map +1 -1
  44. package/src/lib/api/validate-definition.js.map +1 -1
  45. package/src/lib/auth/auth-command.js.map +1 -1
  46. package/src/lib/auth/composer-auth.js.map +1 -1
  47. package/src/lib/auth/composer-repositories.js.map +1 -1
  48. package/src/lib/auth/gitlab-token.js.map +1 -1
  49. package/src/lib/auth/index.js.map +1 -1
  50. package/src/lib/config/diagnose.js.map +1 -1
  51. package/src/lib/config/index.js.map +1 -1
  52. package/src/lib/config/local-config.js.map +1 -1
  53. package/src/lib/design/asset-shot.d.ts +26 -0
  54. package/src/lib/design/asset-shot.js +191 -0
  55. package/src/lib/design/asset-shot.js.map +1 -0
  56. package/src/lib/design/browser.js.map +1 -1
  57. package/src/lib/design/calls-tsconfig.d.ts +14 -1
  58. package/src/lib/design/calls-tsconfig.js +23 -18
  59. package/src/lib/design/calls-tsconfig.js.map +1 -1
  60. package/src/lib/design/calls.d.ts +28 -0
  61. package/src/lib/design/calls.js +58 -0
  62. package/src/lib/design/calls.js.map +1 -0
  63. package/src/lib/design/changed-parts.d.ts +51 -0
  64. package/src/lib/design/changed-parts.js +103 -0
  65. package/src/lib/design/changed-parts.js.map +1 -0
  66. package/src/lib/design/check.js +53 -54
  67. package/src/lib/design/check.js.map +1 -1
  68. package/src/lib/design/contact-sheet.d.ts +68 -0
  69. package/src/lib/design/contact-sheet.js +169 -0
  70. package/src/lib/design/contact-sheet.js.map +1 -0
  71. package/src/lib/design/design-command.js +165 -6
  72. package/src/lib/design/design-command.js.map +1 -1
  73. package/src/lib/design/force-interactions.d.ts +13 -0
  74. package/src/lib/design/force-interactions.js +75 -0
  75. package/src/lib/design/force-interactions.js.map +1 -0
  76. package/src/lib/design/inbox-command.d.ts +21 -0
  77. package/src/lib/design/inbox-command.js +156 -0
  78. package/src/lib/design/inbox-command.js.map +1 -0
  79. package/src/lib/design/index.js.map +1 -1
  80. package/src/lib/design/json-layout.d.ts +5 -0
  81. package/src/lib/design/json-layout.js +41 -0
  82. package/src/lib/design/json-layout.js.map +1 -0
  83. package/src/lib/design/legacy.d.ts +7 -0
  84. package/src/lib/design/legacy.js +23 -8
  85. package/src/lib/design/legacy.js.map +1 -1
  86. package/src/lib/design/merge-compare.d.ts +57 -0
  87. package/src/lib/design/merge-compare.js +80 -0
  88. package/src/lib/design/merge-compare.js.map +1 -0
  89. package/src/lib/design/missing-package.js.map +1 -1
  90. package/src/lib/design/new-call.js.map +1 -1
  91. package/src/lib/design/part-marks.d.ts +12 -0
  92. package/src/lib/design/part-marks.js +38 -0
  93. package/src/lib/design/part-marks.js.map +1 -0
  94. package/src/lib/design/paths.d.ts +35 -2
  95. package/src/lib/design/paths.js +62 -4
  96. package/src/lib/design/paths.js.map +1 -1
  97. package/src/lib/design/product-command.d.ts +38 -0
  98. package/src/lib/design/product-command.js +158 -0
  99. package/src/lib/design/product-command.js.map +1 -0
  100. package/src/lib/design/ready-shots.d.ts +13 -0
  101. package/src/lib/design/ready-shots.js +55 -0
  102. package/src/lib/design/ready-shots.js.map +1 -0
  103. package/src/lib/design/render-fields.js.map +1 -1
  104. package/src/lib/design/render-packages.js.map +1 -1
  105. package/src/lib/design/render-worker.js.map +1 -1
  106. package/src/lib/design/render.d.ts +8 -1
  107. package/src/lib/design/render.js +43 -14
  108. package/src/lib/design/render.js.map +1 -1
  109. package/src/lib/design/serve.d.ts +17 -0
  110. package/src/lib/design/serve.js +444 -67
  111. package/src/lib/design/serve.js.map +1 -1
  112. package/src/lib/design/shot-command.d.ts +75 -0
  113. package/src/lib/design/shot-command.js +361 -0
  114. package/src/lib/design/shot-command.js.map +1 -0
  115. package/src/lib/design/shot.d.ts +97 -0
  116. package/src/lib/design/shot.js +346 -0
  117. package/src/lib/design/shot.js.map +1 -0
  118. package/src/lib/design/sketch-at.d.ts +16 -0
  119. package/src/lib/design/sketch-at.js +34 -0
  120. package/src/lib/design/sketch-at.js.map +1 -0
  121. package/src/lib/design/sketch-command.d.ts +9 -0
  122. package/src/lib/design/sketch-command.js +572 -0
  123. package/src/lib/design/sketch-command.js.map +1 -0
  124. package/src/lib/design/ssr-shims.js.map +1 -1
  125. package/src/lib/design/stamp.js.map +1 -1
  126. package/src/lib/design/status.d.ts +2 -2
  127. package/src/lib/design/status.js +2 -2
  128. package/src/lib/design/status.js.map +1 -1
  129. package/src/lib/design/studio-api.d.ts +102 -0
  130. package/src/lib/design/studio-api.js +452 -0
  131. package/src/lib/design/studio-api.js.map +1 -0
  132. package/src/lib/design/system/accept-command.d.ts +7 -0
  133. package/src/lib/design/system/accept-command.js +55 -0
  134. package/src/lib/design/system/accept-command.js.map +1 -0
  135. package/src/lib/design/system/assets.d.ts +34 -0
  136. package/src/lib/design/system/assets.js +64 -0
  137. package/src/lib/design/system/assets.js.map +1 -0
  138. package/src/lib/design/system/base.d.ts +33 -0
  139. package/src/lib/design/system/base.js +49 -0
  140. package/src/lib/design/system/base.js.map +1 -0
  141. package/src/lib/design/system/check-system.d.ts +23 -0
  142. package/src/lib/design/system/check-system.js +151 -0
  143. package/src/lib/design/system/check-system.js.map +1 -0
  144. package/src/lib/design/system/colour.d.ts +2 -0
  145. package/src/lib/design/system/colour.js +9 -0
  146. package/src/lib/design/system/colour.js.map +1 -0
  147. package/src/lib/design/system/comments/comment.d.ts +196 -0
  148. package/src/lib/design/system/comments/comment.js +332 -0
  149. package/src/lib/design/system/comments/comment.js.map +1 -0
  150. package/src/lib/design/system/comments/complete.d.ts +15 -0
  151. package/src/lib/design/system/comments/complete.js +63 -0
  152. package/src/lib/design/system/comments/complete.js.map +1 -0
  153. package/src/lib/design/system/comments/inbox.d.ts +49 -0
  154. package/src/lib/design/system/comments/inbox.js +100 -0
  155. package/src/lib/design/system/comments/inbox.js.map +1 -0
  156. package/src/lib/design/system/css-source.d.ts +12 -0
  157. package/src/lib/design/system/css-source.js +39 -0
  158. package/src/lib/design/system/css-source.js.map +1 -0
  159. package/src/lib/design/system/flows/flow.d.ts +66 -0
  160. package/src/lib/design/system/flows/flow.js +157 -0
  161. package/src/lib/design/system/flows/flow.js.map +1 -0
  162. package/src/lib/design/system/imports.d.ts +70 -0
  163. package/src/lib/design/system/imports.js +159 -0
  164. package/src/lib/design/system/imports.js.map +1 -0
  165. package/src/lib/design/system/kit.d.ts +4 -0
  166. package/src/lib/design/system/kit.js +51 -0
  167. package/src/lib/design/system/kit.js.map +1 -0
  168. package/src/lib/design/system/layers.d.ts +9 -0
  169. package/src/lib/design/system/layers.js +16 -0
  170. package/src/lib/design/system/layers.js.map +1 -0
  171. package/src/lib/design/system/list-system.d.ts +104 -0
  172. package/src/lib/design/system/list-system.js +212 -0
  173. package/src/lib/design/system/list-system.js.map +1 -0
  174. package/src/lib/design/system/notes/note.d.ts +53 -0
  175. package/src/lib/design/system/notes/note.js +116 -0
  176. package/src/lib/design/system/notes/note.js.map +1 -0
  177. package/src/lib/design/system/part-command.d.ts +7 -0
  178. package/src/lib/design/system/part-command.js +134 -0
  179. package/src/lib/design/system/part-command.js.map +1 -0
  180. package/src/lib/design/system/problem.d.ts +5 -0
  181. package/src/lib/design/system/problem.js +3 -0
  182. package/src/lib/design/system/problem.js.map +1 -0
  183. package/src/lib/design/system/product.d.ts +18 -0
  184. package/src/lib/design/system/product.js +35 -0
  185. package/src/lib/design/system/product.js.map +1 -0
  186. package/src/lib/design/system/render-check.d.ts +45 -0
  187. package/src/lib/design/system/render-check.js +427 -0
  188. package/src/lib/design/system/render-check.js.map +1 -0
  189. package/src/lib/design/system/resolve-product.d.ts +32 -0
  190. package/src/lib/design/system/resolve-product.js +62 -0
  191. package/src/lib/design/system/resolve-product.js.map +1 -0
  192. package/src/lib/design/system/rules/component-copy.d.ts +7 -0
  193. package/src/lib/design/system/rules/component-copy.js +53 -0
  194. package/src/lib/design/system/rules/component-copy.js.map +1 -0
  195. package/src/lib/design/system/rules/flow.d.ts +8 -0
  196. package/src/lib/design/system/rules/flow.js +60 -0
  197. package/src/lib/design/system/rules/flow.js.map +1 -0
  198. package/src/lib/design/system/rules/hard-coded-colour.d.ts +7 -0
  199. package/src/lib/design/system/rules/hard-coded-colour.js +27 -0
  200. package/src/lib/design/system/rules/hard-coded-colour.js.map +1 -0
  201. package/src/lib/design/system/rules/interactions.d.ts +4 -0
  202. package/src/lib/design/system/rules/interactions.js +16 -0
  203. package/src/lib/design/system/rules/interactions.js.map +1 -0
  204. package/src/lib/design/system/rules/kit-outside-pages.d.ts +4 -0
  205. package/src/lib/design/system/rules/kit-outside-pages.js +14 -0
  206. package/src/lib/design/system/rules/kit-outside-pages.js.map +1 -0
  207. package/src/lib/design/system/rules/motion.d.ts +4 -0
  208. package/src/lib/design/system/rules/motion.js +13 -0
  209. package/src/lib/design/system/rules/motion.js.map +1 -0
  210. package/src/lib/design/system/rules/stale-comment.d.ts +8 -0
  211. package/src/lib/design/system/rules/stale-comment.js +51 -0
  212. package/src/lib/design/system/rules/stale-comment.js.map +1 -0
  213. package/src/lib/design/system/rules/stale-replace.d.ts +4 -0
  214. package/src/lib/design/system/rules/stale-replace.js +65 -0
  215. package/src/lib/design/system/rules/stale-replace.js.map +1 -0
  216. package/src/lib/design/system/rules/svg-asset.d.ts +6 -0
  217. package/src/lib/design/system/rules/svg-asset.js +30 -0
  218. package/src/lib/design/system/rules/svg-asset.js.map +1 -0
  219. package/src/lib/design/system/rules/token-selectors.d.ts +3 -0
  220. package/src/lib/design/system/rules/token-selectors.js +87 -0
  221. package/src/lib/design/system/rules/token-selectors.js.map +1 -0
  222. package/src/lib/design/system/rules/undefined-token.d.ts +8 -0
  223. package/src/lib/design/system/rules/undefined-token.js +103 -0
  224. package/src/lib/design/system/rules/undefined-token.js.map +1 -0
  225. package/src/lib/design/system/rules/unused-shared-export.d.ts +18 -0
  226. package/src/lib/design/system/rules/unused-shared-export.js +60 -0
  227. package/src/lib/design/system/rules/unused-shared-export.js.map +1 -0
  228. package/src/lib/design/system/rules/upward-dependency.d.ts +4 -0
  229. package/src/lib/design/system/rules/upward-dependency.js +17 -0
  230. package/src/lib/design/system/rules/upward-dependency.js.map +1 -0
  231. package/src/lib/design/system/rules/widths.d.ts +4 -0
  232. package/src/lib/design/system/rules/widths.js +14 -0
  233. package/src/lib/design/system/rules/widths.js.map +1 -0
  234. package/src/lib/design/system/sketch/baseline.d.ts +38 -0
  235. package/src/lib/design/system/sketch/baseline.js +66 -0
  236. package/src/lib/design/system/sketch/baseline.js.map +1 -0
  237. package/src/lib/design/system/sketch/check-format.d.ts +17 -0
  238. package/src/lib/design/system/sketch/check-format.js +56 -0
  239. package/src/lib/design/system/sketch/check-format.js.map +1 -0
  240. package/src/lib/design/system/sketch/check-sketches.d.ts +38 -0
  241. package/src/lib/design/system/sketch/check-sketches.js +104 -0
  242. package/src/lib/design/system/sketch/check-sketches.js.map +1 -0
  243. package/src/lib/design/system/sketch/cli-args.d.ts +26 -0
  244. package/src/lib/design/system/sketch/cli-args.js +63 -0
  245. package/src/lib/design/system/sketch/cli-args.js.map +1 -0
  246. package/src/lib/design/system/sketch/duplicate-class.d.ts +14 -0
  247. package/src/lib/design/system/sketch/duplicate-class.js +57 -0
  248. package/src/lib/design/system/sketch/duplicate-class.js.map +1 -0
  249. package/src/lib/design/system/sketch/merge-preview.d.ts +15 -0
  250. package/src/lib/design/system/sketch/merge-preview.js +43 -0
  251. package/src/lib/design/system/sketch/merge-preview.js.map +1 -0
  252. package/src/lib/design/system/sketch/merge-shared.d.ts +25 -0
  253. package/src/lib/design/system/sketch/merge-shared.js +53 -0
  254. package/src/lib/design/system/sketch/merge-shared.js.map +1 -0
  255. package/src/lib/design/system/sketch/merge.d.ts +31 -0
  256. package/src/lib/design/system/sketch/merge.js +145 -0
  257. package/src/lib/design/system/sketch/merge.js.map +1 -0
  258. package/src/lib/design/system/sketch/merged-parts.d.ts +59 -0
  259. package/src/lib/design/system/sketch/merged-parts.js +134 -0
  260. package/src/lib/design/system/sketch/merged-parts.js.map +1 -0
  261. package/src/lib/design/system/sketch/no-visible-change.d.ts +15 -0
  262. package/src/lib/design/system/sketch/no-visible-change.js +70 -0
  263. package/src/lib/design/system/sketch/no-visible-change.js.map +1 -0
  264. package/src/lib/design/system/sketch/overlay.d.ts +20 -0
  265. package/src/lib/design/system/sketch/overlay.js +38 -0
  266. package/src/lib/design/system/sketch/overlay.js.map +1 -0
  267. package/src/lib/design/system/sketch/part-definition.d.ts +31 -0
  268. package/src/lib/design/system/sketch/part-definition.js +157 -0
  269. package/src/lib/design/system/sketch/part-definition.js.map +1 -0
  270. package/src/lib/design/system/sketch/shared-class.d.ts +9 -0
  271. package/src/lib/design/system/sketch/shared-class.js +65 -0
  272. package/src/lib/design/system/sketch/shared-class.js.map +1 -0
  273. package/src/lib/design/system/sketch/sketch.d.ts +221 -0
  274. package/src/lib/design/system/sketch/sketch.js +481 -0
  275. package/src/lib/design/system/sketch/sketch.js.map +1 -0
  276. package/src/lib/design/system/sketch/unchanged-states.d.ts +23 -0
  277. package/src/lib/design/system/sketch/unchanged-states.js +144 -0
  278. package/src/lib/design/system/sketch/unchanged-states.js.map +1 -0
  279. package/src/lib/design/system/sketch/unused-files.d.ts +10 -0
  280. package/src/lib/design/system/sketch/unused-files.js +56 -0
  281. package/src/lib/design/system/sketch/unused-files.js.map +1 -0
  282. package/src/lib/design/system/system-command.d.ts +9 -0
  283. package/src/lib/design/system/system-command.js +56 -0
  284. package/src/lib/design/system/system-command.js.map +1 -0
  285. package/src/lib/design/system/system-modules.d.ts +58 -0
  286. package/src/lib/design/system/system-modules.js +189 -0
  287. package/src/lib/design/system/system-modules.js.map +1 -0
  288. package/src/lib/design/system/system-tsconfig.d.ts +26 -0
  289. package/src/lib/design/system/system-tsconfig.js +68 -0
  290. package/src/lib/design/system/system-tsconfig.js.map +1 -0
  291. package/src/lib/design/system/ts-source.d.ts +13 -0
  292. package/src/lib/design/system/ts-source.js +108 -0
  293. package/src/lib/design/system/ts-source.js.map +1 -0
  294. package/src/lib/design/system-use.js.map +1 -1
  295. package/src/lib/design/thumb.d.ts +48 -4
  296. package/src/lib/design/thumb.js +127 -37
  297. package/src/lib/design/thumb.js.map +1 -1
  298. package/src/lib/design/typecheck.d.ts +27 -0
  299. package/src/lib/design/typecheck.js +60 -0
  300. package/src/lib/design/typecheck.js.map +1 -0
  301. package/src/lib/design/variant-diff.d.ts +48 -0
  302. package/src/lib/design/variant-diff.js +77 -0
  303. package/src/lib/design/variant-diff.js.map +1 -0
  304. package/src/lib/design/vite-paths.d.ts +2 -0
  305. package/src/lib/design/vite-paths.js +10 -1
  306. package/src/lib/design/vite-paths.js.map +1 -1
  307. package/src/lib/doctor/doctor-command.js.map +1 -1
  308. package/src/lib/doctor/index.js.map +1 -1
  309. package/src/lib/index.js.map +1 -1
  310. package/src/lib/invocation.js +6 -2
  311. package/src/lib/invocation.js.map +1 -1
  312. package/src/lib/release.js.map +1 -1
  313. package/src/lib/update/agent-rules-sync.js.map +1 -1
  314. package/src/lib/update/agent-setup.js.map +1 -1
  315. package/src/lib/update/ai.js.map +1 -1
  316. package/src/lib/update/args.js.map +1 -1
  317. package/src/lib/update/available-migrations.js.map +1 -1
  318. package/src/lib/update/commits.js.map +1 -1
  319. package/src/lib/update/gitignore.js.map +1 -1
  320. package/src/lib/update/index.js.map +1 -1
  321. package/src/lib/update/migration-manifest.js.map +1 -1
  322. package/src/lib/update/migration-record.js.map +1 -1
  323. package/src/lib/update/migrations-command.js.map +1 -1
  324. package/src/lib/update/package-manager.d.ts +1 -1
  325. package/src/lib/update/package-manager.js.map +1 -1
  326. package/src/lib/update/packages.js.map +1 -1
  327. package/src/lib/update/pending.js.map +1 -1
  328. package/src/lib/update/plan.js.map +1 -1
  329. package/src/lib/update/registry.js.map +1 -1
  330. package/src/lib/update/run-migrations.js.map +1 -1
  331. package/src/lib/update/scan.js.map +1 -1
  332. package/src/lib/update/semver.js.map +1 -1
  333. package/src/lib/update/tasks.js.map +1 -1
  334. package/src/lib/update/update-command.js.map +1 -1
  335. package/src/lib/utils.js.map +1 -1
@@ -0,0 +1,18 @@
1
+ import { definePart, drawing, ng } from '@design-system';
2
+
3
+ type ButtonProps = { label: string; disabled: boolean };
4
+
5
+ export default definePart<ButtonProps>({
6
+ note: 'The SDK button, rendered by ng() and never redrawn.',
7
+ states: {
8
+ default: { label: 'Save', disabled: false },
9
+ disabled: { label: 'Save', disabled: true },
10
+ },
11
+ render: async ({ label, disabled }) =>
12
+ drawing({
13
+ body: await ng(`<button et-button${disabled ? ' disabled' : ''}>${label}</button>`, {
14
+ imports: ['ButtonComponent'],
15
+ }),
16
+ styles: '',
17
+ }),
18
+ });
@@ -9,4 +9,24 @@ declare module 'virtual:design-explore/env' {
9
9
  export const loadEnv: (project: string) => Promise<unknown>;
10
10
  /** The theme names the config declares for the project. The first of each list is the default. */
11
11
  export const themesOf: (project: string) => { surface: string[]; color: string[] };
12
+ /** Loads the stylesheet a product draws under, which its base parts draw under too. */
13
+ export const loadProductEnv: (product: string) => Promise<unknown>;
14
+ }
15
+
16
+ declare module 'virtual:design-explore/system' {
17
+ import type { Drawing } from '@design-explore';
18
+
19
+ type Part = { states: Record<string, unknown>; render: (props: unknown) => Drawing | Promise<Drawing> };
20
+
21
+ /** Each product's parts by `<layer>/<name>`, each resolved as that product draws it. */
22
+ export const parts: Record<string, Record<string, () => Promise<{ default: Part }>>>;
23
+ /** Each product's parts by sketch target, variant and `<layer>/<name>`, each resolved as that variant draws it. */
24
+ export const sketchParts: Record<
25
+ string,
26
+ Record<string, Record<string, Record<string, () => Promise<{ default: Part }>>>>
27
+ >;
28
+ /** The tokens stylesheet each product draws under, for the products that have one. */
29
+ export const tokens: Record<string, () => Promise<{ default: string }>>;
30
+ /** The tokens stylesheet each sketch variant draws under, by product, sketch target and variant. */
31
+ export const sketchTokens: Record<string, Record<string, Record<string, () => Promise<{ default: string }>>>>;
12
32
  }
@@ -1,22 +1,56 @@
1
- import { mountDrawing, placeOverlays } from '@design-explore';
1
+ import { CallVariant, Drawing, mountDrawing, placeOverlays } from '../define-call';
2
+ import { fitEmbed } from '../embed-page';
2
3
  import { calls } from 'virtual:design-explore';
3
- import { loadEnv } from 'virtual:design-explore/env';
4
+ import { loadEnv, loadProductEnv } from 'virtual:design-explore/env';
5
+ import { parts, sketchParts, sketchTokens, tokens } from 'virtual:design-explore/system';
4
6
 
5
7
  const params = new URLSearchParams(location.search);
6
8
  const slug = params.get('call') ?? '';
7
- const key = params.get('variant') ?? '';
9
+ const product = params.get('product');
10
+ const partKey = params.get('part') ?? '';
11
+ const key = (product ? params.get('state') : params.get('variant')) ?? '';
12
+ const sketch = product ? params.get('sketch') : null;
13
+ const sketchVariant = params.get('variant') ?? '';
14
+ const fit = product !== null && params.has('fit');
15
+ const interaction = product ? params.get('interaction') : null;
16
+ const propsSketch = product ? params.get('props') : null;
17
+ const propsVariant = params.get('props-variant') ?? '';
18
+
19
+ // Listens before the drawing loads, so an error it throws while loading counts; `report` exists only once `reporting` is set.
20
+ let errored = false;
21
+ let reporting = false;
22
+
23
+ const reportError = () => {
24
+ errored = true;
25
+ if (reporting) report();
26
+ };
8
27
 
9
- await loadEnv(slug.split('/')[0] ?? '');
28
+ addEventListener('error', reportError);
29
+ addEventListener('unhandledrejection', reportError);
10
30
 
11
31
  const root = document.querySelector('#root') as HTMLElement;
12
32
  const surface = params.get('surface');
13
33
  const color = params.get('color');
34
+ const fill = params.get('fill');
14
35
 
15
36
  // On <html> a theme class ties with the `:root` defaults of the theme CSS, which come later and win.
16
37
  if (surface) root.classList.add(`et-surface--${surface}`);
17
38
  if (color) root.classList.add(`et-color--${color}`);
39
+ if (fill) document.body.style.background = `var(--${fill})`;
40
+ if (fit) {
41
+ document.documentElement.style.overflow = 'hidden';
42
+ root.style.width = 'max-content';
43
+ root.style.padding = '16px';
44
+ }
45
+
46
+ const markFailed = (message: string) => {
47
+ errored = true;
48
+ document.documentElement.setAttribute('data-et-error', message);
49
+ };
18
50
 
19
51
  const fail = (message: string) => {
52
+ markFailed(message);
53
+
20
54
  const text = document.createElement('pre');
21
55
 
22
56
  text.textContent = message;
@@ -24,9 +58,13 @@ const fail = (message: string) => {
24
58
  text.style.whiteSpace = 'pre-wrap';
25
59
  root.replaceChildren(text);
26
60
  root.setAttribute('style', 'padding:16px;font:14px monospace;color:#f0a0a0;background:#1a1414');
61
+
62
+ return null;
27
63
  };
28
64
 
29
65
  const showSetupError = (message: string) => {
66
+ markFailed(message);
67
+
30
68
  const banner = document.createElement('pre');
31
69
 
32
70
  banner.textContent = message;
@@ -37,53 +75,147 @@ const showSetupError = (message: string) => {
37
75
  document.body.append(banner);
38
76
  };
39
77
 
40
- const call = calls[slug];
41
- if (!call) fail(`design-explore: no call "${slug}"`);
42
- else {
43
- const variant = (await call()).default.variants.find((o) => o.key === key);
44
- if (!variant) fail(`design-explore: call "${slug}" has no variant "${key}"`);
45
- else {
46
- const loaded = await variant.load().then(
47
- (module) => module.default,
48
- (error: unknown) => {
49
- fail(`design-explore: variant "${key}" failed\n${error instanceof Error ? error.message : String(error)}`);
50
-
51
- return null;
52
- },
78
+ const messageOf = (error: unknown) => (error instanceof Error ? error.message : String(error));
79
+
80
+ const drawCall = async (): Promise<Drawing | null> => {
81
+ const call = calls[slug];
82
+ if (!call) return fail(`design-explore: no call "${slug}"`);
83
+
84
+ const variant: CallVariant | undefined = (await call()).default.variants.find((o) => o.key === key);
85
+ if (!variant) return fail(`design-explore: call "${slug}" has no variant "${key}"`);
86
+
87
+ return variant.load().then(
88
+ (module) => module.default,
89
+ (error: unknown) => fail(`design-explore: variant "${key}" failed\n${messageOf(error)}`),
90
+ );
91
+ };
92
+
93
+ const drawPart = async (name: string): Promise<Drawing | null> => {
94
+ const load = sketch ? sketchParts[name]?.[sketch]?.[sketchVariant]?.[partKey] : parts[name]?.[partKey];
95
+ if (!load)
96
+ return fail(
97
+ sketch
98
+ ? `design-explore: variant "${sketchVariant}" of the sketch on ${sketch} in product "${name}" has no part "${partKey}"`
99
+ : `design-explore: product "${name}" has no part "${partKey}"`,
53
100
  );
54
101
 
55
- if (loaded) {
56
- const style = document.createElement('style');
102
+ const loadProps = propsSketch ? sketchParts[name]?.[propsSketch]?.[propsVariant]?.[partKey] : load;
103
+ if (!loadProps)
104
+ return fail(
105
+ `design-explore: variant "${propsVariant}" of the sketch on ${propsSketch} in product "${name}" has no part "${partKey}"`,
106
+ );
57
107
 
58
- style.textContent = loaded.styles;
59
- document.head.append(style);
60
- const error = mountDrawing(root, loaded);
108
+ try {
109
+ const [{ default: part }, { default: holder }] = await Promise.all([load(), loadProps()]);
61
110
 
62
- if (error) {
63
- showSetupError(
64
- `design-explore: setup of variant "${key}" failed\n${error instanceof Error ? error.message : String(error)}`,
65
- );
66
- }
67
- }
111
+ if (!(key in holder.states)) return fail(`design-explore: part "${partKey}" has no state "${key}"`);
112
+
113
+ return await part.render(holder.states[key]);
114
+ } catch (error) {
115
+ return fail(`design-explore: state "${key}" of "${partKey}" failed\n${messageOf(error)}`);
68
116
  }
69
- }
117
+ };
118
+
119
+ const tokensOf = async (name: string) => {
120
+ const load = sketch ? sketchTokens[name]?.[sketch]?.[sketchVariant] : tokens[name];
121
+
122
+ return load ? (await load()).default : null;
123
+ };
124
+
125
+ const partRootOf = (container: HTMLElement) =>
126
+ [...container.children].find((child) => !['STYLE', 'SCRIPT', 'LINK'].includes(child.tagName)) ?? null;
70
127
 
71
- const place = () => placeOverlays(root);
128
+ const force = (element: Element, name: string) => {
129
+ if (name === 'disabled') {
130
+ element.setAttribute('disabled', '');
131
+ element.setAttribute('aria-disabled', 'true');
132
+ } else {
133
+ element.setAttribute('data-et-force', name);
134
+ }
135
+ };
136
+
137
+ const forced = async (css: string) => {
138
+ if (!/:(?:hover|focus-visible|active)/iu.test(css)) return css;
72
139
 
73
- new MutationObserver(place).observe(root, { childList: true, subtree: true });
74
- new ResizeObserver(place).observe(root);
75
- place();
140
+ const response = await fetch('/__design/force', { method: 'POST', body: css }).catch(() => null);
141
+
142
+ return response?.ok ? response.text() : css;
143
+ };
76
144
 
77
145
  const report = () => {
78
146
  const height = Math.ceil(document.documentElement.getBoundingClientRect().height);
79
- parent.postMessage({ type: 'design-explore:height', variant: key, height }, '*');
147
+ const width = fit ? { width: Math.ceil(root.getBoundingClientRect().width) } : {};
148
+
149
+ fitEmbed(frameElement, height);
150
+
151
+ parent.postMessage(
152
+ {
153
+ type: 'design-explore:height',
154
+ variant: key,
155
+ height,
156
+ ...width,
157
+ viewport: { width: innerWidth, height: innerHeight },
158
+ href: location.href,
159
+ ...(errored ? { errored: true } : {}),
160
+ },
161
+ '*',
162
+ );
80
163
  };
81
164
 
82
- new ResizeObserver(report).observe(document.documentElement);
83
- report();
165
+ // macOS WebKit can loop in module evaluation when a frame with top-level await is removed.
166
+ const drawFrame = async () => {
167
+ parent.postMessage({ type: 'design-explore:loading' }, '*');
168
+ await (product ? loadProductEnv(product) : loadEnv(slug.split('/')[0] ?? ''));
169
+ const tokenStyles = product ? await tokensOf(product) : null;
170
+ const loaded = await (product ? drawPart(product) : drawCall());
171
+
172
+ if (loaded) {
173
+ if (tokenStyles !== null) {
174
+ const style = document.createElement('style');
175
+
176
+ style.textContent = tokenStyles;
177
+ document.head.append(style);
178
+ }
179
+
180
+ const style = document.createElement('style');
181
+
182
+ style.textContent = await forced(loaded.styles ?? '');
183
+ document.head.append(style);
184
+ const error = mountDrawing(root, loaded);
185
+ const partRoot = partRootOf(root);
186
+
187
+ if (interaction && partRoot) force(partRoot, interaction);
188
+
189
+ if (error)
190
+ showSetupError(`design-explore: setup of ${product ? 'state' : 'variant'} "${key}" failed\n${messageOf(error)}`);
191
+ }
192
+
193
+ const place = () => placeOverlays(root);
194
+
195
+ new MutationObserver(place).observe(root, { childList: true, subtree: true });
196
+ new ResizeObserver(place).observe(root);
197
+ place();
198
+
199
+ const reported = new ResizeObserver(report);
200
+
201
+ reported.observe(document.documentElement);
202
+ if (fit) reported.observe(root);
203
+ reporting = true;
204
+ report();
205
+
206
+ addEventListener('keydown', (event) => {
207
+ if (event.key === 'Escape') parent.postMessage({ type: 'design-explore:escape', variant: key }, '*');
208
+ });
209
+
210
+ addEventListener(
211
+ 'scroll',
212
+ () => parent.postMessage({ type: 'design-explore:scroll', variant: key, y: Math.round(scrollY) }, '*'),
213
+ { passive: true },
214
+ );
215
+ };
84
216
 
85
- addEventListener(
86
- 'scroll',
87
- () => parent.postMessage({ type: 'design-explore:scroll', variant: key, y: Math.round(scrollY) }, '*'),
88
- { passive: true },
89
- );
217
+ void drawFrame().catch((error: unknown) => {
218
+ fail(`design-explore: frame failed\n${messageOf(error)}`);
219
+ reporting = true;
220
+ report();
221
+ });