@elastic/isomer-studio 0.0.0 → 0.4.0

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 (406) hide show
  1. package/LICENSE.txt +93 -0
  2. package/NOTICE.txt +17329 -0
  3. package/README.md +64 -0
  4. package/THIRD_PARTY_LICENSES.md +404 -0
  5. package/bin/isomer-studio.js +10 -0
  6. package/dist/app/assets/codicon-5T574S7B.ttf +0 -0
  7. package/dist/app/assets/editor.worker.js +11 -0
  8. package/dist/app/assets/esbuild.wasm +0 -0
  9. package/dist/app/assets/json.worker.js +47 -0
  10. package/dist/app/assets/slack.css +1 -0
  11. package/dist/app/assets/studio.css +11 -0
  12. package/dist/app/assets/ts.worker.js +37029 -0
  13. package/dist/app/index.html +16 -0
  14. package/dist/apps/app_host.d.ts +8 -0
  15. package/dist/apps/app_host.d.ts.map +1 -0
  16. package/dist/apps/app_host.js +73 -0
  17. package/dist/apps/app_host.js.map +1 -0
  18. package/dist/browser/dev_host.d.ts +5 -0
  19. package/dist/browser/dev_host.d.ts.map +1 -0
  20. package/dist/browser/dev_host.js +46 -0
  21. package/dist/browser/dev_host.js.map +1 -0
  22. package/dist/browser/mount.d.ts +16 -0
  23. package/dist/browser/mount.d.ts.map +1 -0
  24. package/dist/browser/mount.js +37 -0
  25. package/dist/browser/mount.js.map +1 -0
  26. package/dist/browser/static_host.d.ts +5 -0
  27. package/dist/browser/static_host.d.ts.map +1 -0
  28. package/dist/browser/static_host.js +55 -0
  29. package/dist/browser/static_host.js.map +1 -0
  30. package/dist/chrome/accent.d.ts +14 -0
  31. package/dist/chrome/accent.d.ts.map +1 -0
  32. package/dist/chrome/accent.js +31 -0
  33. package/dist/chrome/accent.js.map +1 -0
  34. package/dist/chrome/app_pages.d.ts +13 -0
  35. package/dist/chrome/app_pages.d.ts.map +1 -0
  36. package/dist/chrome/app_pages.js +33 -0
  37. package/dist/chrome/app_pages.js.map +1 -0
  38. package/dist/chrome/color_mode.d.ts +10 -0
  39. package/dist/chrome/color_mode.d.ts.map +1 -0
  40. package/dist/chrome/color_mode.js +45 -0
  41. package/dist/chrome/color_mode.js.map +1 -0
  42. package/dist/chrome/dev_tint.d.ts +7 -0
  43. package/dist/chrome/dev_tint.d.ts.map +1 -0
  44. package/dist/chrome/dev_tint.js +31 -0
  45. package/dist/chrome/dev_tint.js.map +1 -0
  46. package/dist/chrome/header.d.ts +20 -0
  47. package/dist/chrome/header.d.ts.map +1 -0
  48. package/dist/chrome/header.js +124 -0
  49. package/dist/chrome/header.js.map +1 -0
  50. package/dist/chrome/icon_data_uri.d.ts +12 -0
  51. package/dist/chrome/icon_data_uri.d.ts.map +1 -0
  52. package/dist/chrome/icon_data_uri.js +21 -0
  53. package/dist/chrome/icon_data_uri.js.map +1 -0
  54. package/dist/chrome/isomer_mark.d.ts +17 -0
  55. package/dist/chrome/isomer_mark.d.ts.map +1 -0
  56. package/dist/chrome/isomer_mark.js +46 -0
  57. package/dist/chrome/isomer_mark.js.map +1 -0
  58. package/dist/chrome/nav.d.ts +22 -0
  59. package/dist/chrome/nav.d.ts.map +1 -0
  60. package/dist/chrome/nav.js +306 -0
  61. package/dist/chrome/nav.js.map +1 -0
  62. package/dist/chrome/nav_groups.d.ts +6 -0
  63. package/dist/chrome/nav_groups.d.ts.map +1 -0
  64. package/dist/chrome/nav_groups.js +48 -0
  65. package/dist/chrome/nav_groups.js.map +1 -0
  66. package/dist/chrome/nav_sections.d.ts +29 -0
  67. package/dist/chrome/nav_sections.d.ts.map +1 -0
  68. package/dist/chrome/nav_sections.js +55 -0
  69. package/dist/chrome/nav_sections.js.map +1 -0
  70. package/dist/chrome/oklch.d.ts +10 -0
  71. package/dist/chrome/oklch.d.ts.map +1 -0
  72. package/dist/chrome/oklch.js +61 -0
  73. package/dist/chrome/oklch.js.map +1 -0
  74. package/dist/chrome/primitive_glyph.d.ts +14 -0
  75. package/dist/chrome/primitive_glyph.d.ts.map +1 -0
  76. package/dist/chrome/primitive_glyph.js +48 -0
  77. package/dist/chrome/primitive_glyph.js.map +1 -0
  78. package/dist/chrome/primitive_heading.d.ts +14 -0
  79. package/dist/chrome/primitive_heading.d.ts.map +1 -0
  80. package/dist/chrome/primitive_heading.js +32 -0
  81. package/dist/chrome/primitive_heading.js.map +1 -0
  82. package/dist/chrome/primitive_peek.d.ts +8 -0
  83. package/dist/chrome/primitive_peek.d.ts.map +1 -0
  84. package/dist/chrome/primitive_peek.js +51 -0
  85. package/dist/chrome/primitive_peek.js.map +1 -0
  86. package/dist/chrome/primitive_search.d.ts +9 -0
  87. package/dist/chrome/primitive_search.d.ts.map +1 -0
  88. package/dist/chrome/primitive_search.js +93 -0
  89. package/dist/chrome/primitive_search.js.map +1 -0
  90. package/dist/chrome/route.d.ts +48 -0
  91. package/dist/chrome/route.d.ts.map +1 -0
  92. package/dist/chrome/route.js +136 -0
  93. package/dist/chrome/route.js.map +1 -0
  94. package/dist/cli/args.d.ts +39 -0
  95. package/dist/cli/args.d.ts.map +1 -0
  96. package/dist/cli/args.js +171 -0
  97. package/dist/cli/args.js.map +1 -0
  98. package/dist/cli/run.d.ts +15 -0
  99. package/dist/cli/run.d.ts.map +1 -0
  100. package/dist/cli/run.js +113 -0
  101. package/dist/cli/run.js.map +1 -0
  102. package/dist/cli.d.ts +2 -0
  103. package/dist/cli.d.ts.map +1 -0
  104. package/dist/cli.js +22 -0
  105. package/dist/cli.js.map +1 -0
  106. package/dist/config.d.ts +118 -0
  107. package/dist/config.d.ts.map +1 -0
  108. package/dist/config.js +11 -0
  109. package/dist/config.js.map +1 -0
  110. package/dist/dev/code_editor.d.ts +10 -0
  111. package/dist/dev/code_editor.d.ts.map +1 -0
  112. package/dist/dev/code_editor.js +22 -0
  113. package/dist/dev/code_editor.js.map +1 -0
  114. package/dist/dev/dev_view.d.ts +9 -0
  115. package/dist/dev/dev_view.d.ts.map +1 -0
  116. package/dist/dev/dev_view.js +65 -0
  117. package/dist/dev/dev_view.js.map +1 -0
  118. package/dist/dev/editor_panel.d.ts +17 -0
  119. package/dist/dev/editor_panel.d.ts.map +1 -0
  120. package/dist/dev/editor_panel.js +51 -0
  121. package/dist/dev/editor_panel.js.map +1 -0
  122. package/dist/dev/monaco_editor.d.ts +15 -0
  123. package/dist/dev/monaco_editor.d.ts.map +1 -0
  124. package/dist/dev/monaco_editor.js +159 -0
  125. package/dist/dev/monaco_editor.js.map +1 -0
  126. package/dist/dev/preview_panel.d.ts +10 -0
  127. package/dist/dev/preview_panel.d.ts.map +1 -0
  128. package/dist/dev/preview_panel.js +45 -0
  129. package/dist/dev/preview_panel.js.map +1 -0
  130. package/dist/dev/prop_reference.d.ts +9 -0
  131. package/dist/dev/prop_reference.d.ts.map +1 -0
  132. package/dist/dev/prop_reference.js +134 -0
  133. package/dist/dev/prop_reference.js.map +1 -0
  134. package/dist/dev/tsx_language.d.ts +10 -0
  135. package/dist/dev/tsx_language.d.ts.map +1 -0
  136. package/dist/dev/tsx_language.js +283 -0
  137. package/dist/dev/tsx_language.js.map +1 -0
  138. package/dist/dev/use_editor.d.ts +23 -0
  139. package/dist/dev/use_editor.d.ts.map +1 -0
  140. package/dist/dev/use_editor.js +124 -0
  141. package/dist/dev/use_editor.js.map +1 -0
  142. package/dist/docs/docs_view.d.ts +10 -0
  143. package/dist/docs/docs_view.d.ts.map +1 -0
  144. package/dist/docs/docs_view.js +80 -0
  145. package/dist/docs/docs_view.js.map +1 -0
  146. package/dist/docs/example_source.d.ts +7 -0
  147. package/dist/docs/example_source.d.ts.map +1 -0
  148. package/dist/docs/example_source.js +56 -0
  149. package/dist/docs/example_source.js.map +1 -0
  150. package/dist/docs/examples_panel.d.ts +10 -0
  151. package/dist/docs/examples_panel.d.ts.map +1 -0
  152. package/dist/docs/examples_panel.js +51 -0
  153. package/dist/docs/examples_panel.js.map +1 -0
  154. package/dist/docs/gallery_view.d.ts +9 -0
  155. package/dist/docs/gallery_view.d.ts.map +1 -0
  156. package/dist/docs/gallery_view.js +98 -0
  157. package/dist/docs/gallery_view.js.map +1 -0
  158. package/dist/docs/inline_code.d.ts +11 -0
  159. package/dist/docs/inline_code.d.ts.map +1 -0
  160. package/dist/docs/inline_code.js +24 -0
  161. package/dist/docs/inline_code.js.map +1 -0
  162. package/dist/docs/on_this_page.d.ts +17 -0
  163. package/dist/docs/on_this_page.d.ts.map +1 -0
  164. package/dist/docs/on_this_page.js +77 -0
  165. package/dist/docs/on_this_page.js.map +1 -0
  166. package/dist/docs/props_table.d.ts +14 -0
  167. package/dist/docs/props_table.d.ts.map +1 -0
  168. package/dist/docs/props_table.js +34 -0
  169. package/dist/docs/props_table.js.map +1 -0
  170. package/dist/home/apps_section.d.ts +6 -0
  171. package/dist/home/apps_section.d.ts.map +1 -0
  172. package/dist/home/apps_section.js +44 -0
  173. package/dist/home/apps_section.js.map +1 -0
  174. package/dist/home/featured_strip.d.ts +12 -0
  175. package/dist/home/featured_strip.d.ts.map +1 -0
  176. package/dist/home/featured_strip.js +176 -0
  177. package/dist/home/featured_strip.js.map +1 -0
  178. package/dist/home/home_view.d.ts +11 -0
  179. package/dist/home/home_view.d.ts.map +1 -0
  180. package/dist/home/home_view.js +261 -0
  181. package/dist/home/home_view.js.map +1 -0
  182. package/dist/home/links.d.ts +8 -0
  183. package/dist/home/links.d.ts.map +1 -0
  184. package/dist/home/links.js +14 -0
  185. package/dist/home/links.js.map +1 -0
  186. package/dist/home/loaded_panel.d.ts +6 -0
  187. package/dist/home/loaded_panel.d.ts.map +1 -0
  188. package/dist/home/loaded_panel.js +116 -0
  189. package/dist/home/loaded_panel.js.map +1 -0
  190. package/dist/home/surface_chart.d.ts +6 -0
  191. package/dist/home/surface_chart.d.ts.map +1 -0
  192. package/dist/home/surface_chart.js +263 -0
  193. package/dist/home/surface_chart.js.map +1 -0
  194. package/dist/home/tokens.d.ts +49 -0
  195. package/dist/home/tokens.d.ts.map +1 -0
  196. package/dist/home/tokens.js +171 -0
  197. package/dist/home/tokens.js.map +1 -0
  198. package/dist/index.d.ts +6 -0
  199. package/dist/index.d.ts.map +1 -0
  200. package/dist/index.js +9 -0
  201. package/dist/index.js.map +1 -0
  202. package/dist/model/app_problems.d.ts +4 -0
  203. package/dist/model/app_problems.d.ts.map +1 -0
  204. package/dist/model/app_problems.js +90 -0
  205. package/dist/model/app_problems.js.map +1 -0
  206. package/dist/model/authoring_types.d.ts +23 -0
  207. package/dist/model/authoring_types.d.ts.map +1 -0
  208. package/dist/model/authoring_types.js +35 -0
  209. package/dist/model/authoring_types.js.map +1 -0
  210. package/dist/model/compile_jsx.d.ts +19 -0
  211. package/dist/model/compile_jsx.d.ts.map +1 -0
  212. package/dist/model/compile_jsx.js +55 -0
  213. package/dist/model/compile_jsx.js.map +1 -0
  214. package/dist/model/compose_example.d.ts +9 -0
  215. package/dist/model/compose_example.d.ts.map +1 -0
  216. package/dist/model/compose_example.js +24 -0
  217. package/dist/model/compose_example.js.map +1 -0
  218. package/dist/model/composition_key.d.ts +6 -0
  219. package/dist/model/composition_key.d.ts.map +1 -0
  220. package/dist/model/composition_key.js +26 -0
  221. package/dist/model/composition_key.js.map +1 -0
  222. package/dist/model/describe_runtime.d.ts +33 -0
  223. package/dist/model/describe_runtime.d.ts.map +1 -0
  224. package/dist/model/describe_runtime.js +77 -0
  225. package/dist/model/describe_runtime.js.map +1 -0
  226. package/dist/model/featured.d.ts +11 -0
  227. package/dist/model/featured.d.ts.map +1 -0
  228. package/dist/model/featured.js +70 -0
  229. package/dist/model/featured.js.map +1 -0
  230. package/dist/model/jsx_transform.d.ts +10 -0
  231. package/dist/model/jsx_transform.d.ts.map +1 -0
  232. package/dist/model/jsx_transform.js +31 -0
  233. package/dist/model/jsx_transform.js.map +1 -0
  234. package/dist/model/png_manifest.d.ts +23 -0
  235. package/dist/model/png_manifest.d.ts.map +1 -0
  236. package/dist/model/png_manifest.js +26 -0
  237. package/dist/model/png_manifest.js.map +1 -0
  238. package/dist/model/read_examples.d.ts +12 -0
  239. package/dist/model/read_examples.d.ts.map +1 -0
  240. package/dist/model/read_examples.js +43 -0
  241. package/dist/model/read_examples.js.map +1 -0
  242. package/dist/model/search.d.ts +4 -0
  243. package/dist/model/search.d.ts.map +1 -0
  244. package/dist/model/search.js +29 -0
  245. package/dist/model/search.js.map +1 -0
  246. package/dist/model/sha256.d.ts +3 -0
  247. package/dist/model/sha256.d.ts.map +1 -0
  248. package/dist/model/sha256.js +72 -0
  249. package/dist/model/sha256.js.map +1 -0
  250. package/dist/model/slack_limits.d.ts +9 -0
  251. package/dist/model/slack_limits.d.ts.map +1 -0
  252. package/dist/model/slack_limits.js +213 -0
  253. package/dist/model/slack_limits.js.map +1 -0
  254. package/dist/node/app_bundle.d.ts +45 -0
  255. package/dist/node/app_bundle.d.ts.map +1 -0
  256. package/dist/node/app_bundle.js +212 -0
  257. package/dist/node/app_bundle.js.map +1 -0
  258. package/dist/node/build_site.d.ts +28 -0
  259. package/dist/node/build_site.d.ts.map +1 -0
  260. package/dist/node/build_site.js +90 -0
  261. package/dist/node/build_site.js.map +1 -0
  262. package/dist/node/check.d.ts +40 -0
  263. package/dist/node/check.d.ts.map +1 -0
  264. package/dist/node/check.js +162 -0
  265. package/dist/node/check.js.map +1 -0
  266. package/dist/node/dev_bundle.d.ts +21 -0
  267. package/dist/node/dev_bundle.d.ts.map +1 -0
  268. package/dist/node/dev_bundle.js +121 -0
  269. package/dist/node/dev_bundle.js.map +1 -0
  270. package/dist/node/dev_server.d.ts +16 -0
  271. package/dist/node/dev_server.d.ts.map +1 -0
  272. package/dist/node/dev_server.js +291 -0
  273. package/dist/node/dev_server.js.map +1 -0
  274. package/dist/node/init_config.d.ts +30 -0
  275. package/dist/node/init_config.d.ts.map +1 -0
  276. package/dist/node/init_config.js +158 -0
  277. package/dist/node/init_config.js.map +1 -0
  278. package/dist/node/load_config.d.ts +34 -0
  279. package/dist/node/load_config.d.ts.map +1 -0
  280. package/dist/node/load_config.js +246 -0
  281. package/dist/node/load_config.js.map +1 -0
  282. package/dist/node/project_resolution.d.ts +17 -0
  283. package/dist/node/project_resolution.d.ts.map +1 -0
  284. package/dist/node/project_resolution.js +66 -0
  285. package/dist/node/project_resolution.js.map +1 -0
  286. package/dist/node/rasterize.d.ts +23 -0
  287. package/dist/node/rasterize.d.ts.map +1 -0
  288. package/dist/node/rasterize.js +79 -0
  289. package/dist/node/rasterize.js.map +1 -0
  290. package/dist/node/report.d.ts +8 -0
  291. package/dist/node/report.d.ts.map +1 -0
  292. package/dist/node/report.js +57 -0
  293. package/dist/node/report.js.map +1 -0
  294. package/dist/node/resolve_hooks.d.ts +16 -0
  295. package/dist/node/resolve_hooks.d.ts.map +1 -0
  296. package/dist/node/resolve_hooks.js +104 -0
  297. package/dist/node/resolve_hooks.js.map +1 -0
  298. package/dist/studio.d.ts +4 -0
  299. package/dist/studio.d.ts.map +1 -0
  300. package/dist/studio.js +188 -0
  301. package/dist/studio.js.map +1 -0
  302. package/dist/studio_context.d.ts +27 -0
  303. package/dist/studio_context.d.ts.map +1 -0
  304. package/dist/studio_context.js +17 -0
  305. package/dist/studio_context.js.map +1 -0
  306. package/dist/surfaces/adopt_stylesheet.d.ts +7 -0
  307. package/dist/surfaces/adopt_stylesheet.d.ts.map +1 -0
  308. package/dist/surfaces/adopt_stylesheet.js +64 -0
  309. package/dist/surfaces/adopt_stylesheet.js.map +1 -0
  310. package/dist/surfaces/app_preview.d.ts +4 -0
  311. package/dist/surfaces/app_preview.d.ts.map +1 -0
  312. package/dist/surfaces/app_preview.js +28 -0
  313. package/dist/surfaces/app_preview.js.map +1 -0
  314. package/dist/surfaces/app_surface.d.ts +9 -0
  315. package/dist/surfaces/app_surface.d.ts.map +1 -0
  316. package/dist/surfaces/app_surface.js +27 -0
  317. package/dist/surfaces/app_surface.js.map +1 -0
  318. package/dist/surfaces/applicable_enhancements.d.ts +4 -0
  319. package/dist/surfaces/applicable_enhancements.d.ts.map +1 -0
  320. package/dist/surfaces/applicable_enhancements.js +16 -0
  321. package/dist/surfaces/applicable_enhancements.js.map +1 -0
  322. package/dist/surfaces/enhancement_select.d.ts +10 -0
  323. package/dist/surfaces/enhancement_select.d.ts.map +1 -0
  324. package/dist/surfaces/enhancement_select.js +28 -0
  325. package/dist/surfaces/enhancement_select.js.map +1 -0
  326. package/dist/surfaces/example_picker.d.ts +11 -0
  327. package/dist/surfaces/example_picker.d.ts.map +1 -0
  328. package/dist/surfaces/example_picker.js +44 -0
  329. package/dist/surfaces/example_picker.js.map +1 -0
  330. package/dist/surfaces/format_source.d.ts +4 -0
  331. package/dist/surfaces/format_source.d.ts.map +1 -0
  332. package/dist/surfaces/format_source.js +30 -0
  333. package/dist/surfaces/format_source.js.map +1 -0
  334. package/dist/surfaces/html_surface.d.ts +14 -0
  335. package/dist/surfaces/html_surface.d.ts.map +1 -0
  336. package/dist/surfaces/html_surface.js +122 -0
  337. package/dist/surfaces/html_surface.js.map +1 -0
  338. package/dist/surfaces/png_surface.d.ts +13 -0
  339. package/dist/surfaces/png_surface.d.ts.map +1 -0
  340. package/dist/surfaces/png_surface.js +68 -0
  341. package/dist/surfaces/png_surface.js.map +1 -0
  342. package/dist/surfaces/react_surface.d.ts +11 -0
  343. package/dist/surfaces/react_surface.d.ts.map +1 -0
  344. package/dist/surfaces/react_surface.js +55 -0
  345. package/dist/surfaces/react_surface.js.map +1 -0
  346. package/dist/surfaces/render_output.d.ts +31 -0
  347. package/dist/surfaces/render_output.d.ts.map +1 -0
  348. package/dist/surfaces/render_output.js +119 -0
  349. package/dist/surfaces/render_output.js.map +1 -0
  350. package/dist/surfaces/scaled_preview.d.ts +17 -0
  351. package/dist/surfaces/scaled_preview.d.ts.map +1 -0
  352. package/dist/surfaces/scaled_preview.js +74 -0
  353. package/dist/surfaces/scaled_preview.js.map +1 -0
  354. package/dist/surfaces/shadow_root.d.ts +8 -0
  355. package/dist/surfaces/shadow_root.d.ts.map +1 -0
  356. package/dist/surfaces/shadow_root.js +41 -0
  357. package/dist/surfaces/shadow_root.js.map +1 -0
  358. package/dist/surfaces/slack_surface.d.ts +12 -0
  359. package/dist/surfaces/slack_surface.d.ts.map +1 -0
  360. package/dist/surfaces/slack_surface.js +27 -0
  361. package/dist/surfaces/slack_surface.js.map +1 -0
  362. package/dist/surfaces/snapshot_surface.d.ts +6 -0
  363. package/dist/surfaces/snapshot_surface.d.ts.map +1 -0
  364. package/dist/surfaces/snapshot_surface.js +5 -0
  365. package/dist/surfaces/snapshot_surface.js.map +1 -0
  366. package/dist/surfaces/surface_board.d.ts +19 -0
  367. package/dist/surfaces/surface_board.d.ts.map +1 -0
  368. package/dist/surfaces/surface_board.js +128 -0
  369. package/dist/surfaces/surface_board.js.map +1 -0
  370. package/dist/surfaces/surface_frame.d.ts +8 -0
  371. package/dist/surfaces/surface_frame.d.ts.map +1 -0
  372. package/dist/surfaces/surface_frame.js +4 -0
  373. package/dist/surfaces/surface_frame.js.map +1 -0
  374. package/dist/surfaces/surface_logos.d.ts +9 -0
  375. package/dist/surfaces/surface_logos.d.ts.map +1 -0
  376. package/dist/surfaces/surface_logos.js +21 -0
  377. package/dist/surfaces/surface_logos.js.map +1 -0
  378. package/dist/surfaces/surface_preview.d.ts +32 -0
  379. package/dist/surfaces/surface_preview.d.ts.map +1 -0
  380. package/dist/surfaces/surface_preview.js +66 -0
  381. package/dist/surfaces/surface_preview.js.map +1 -0
  382. package/dist/surfaces/surface_select.d.ts +34 -0
  383. package/dist/surfaces/surface_select.d.ts.map +1 -0
  384. package/dist/surfaces/surface_select.js +119 -0
  385. package/dist/surfaces/surface_select.js.map +1 -0
  386. package/dist/surfaces/text_surfaces.d.ts +14 -0
  387. package/dist/surfaces/text_surfaces.d.ts.map +1 -0
  388. package/dist/surfaces/text_surfaces.js +31 -0
  389. package/dist/surfaces/text_surfaces.js.map +1 -0
  390. package/dist/surfaces/zoom_select.d.ts +9 -0
  391. package/dist/surfaces/zoom_select.d.ts.map +1 -0
  392. package/dist/surfaces/zoom_select.js +32 -0
  393. package/dist/surfaces/zoom_select.js.map +1 -0
  394. package/dist/types.d.ts +32 -0
  395. package/dist/types.d.ts.map +1 -0
  396. package/dist/types.js +9 -0
  397. package/dist/types.js.map +1 -0
  398. package/docs/ci.md +55 -0
  399. package/docs/commands.md +167 -0
  400. package/docs/config.md +192 -0
  401. package/docs/images/home.png +0 -0
  402. package/docs/images/reference.png +0 -0
  403. package/docs/images/workbench.png +0 -0
  404. package/docs/index.md +96 -0
  405. package/docs/toc.yml +10 -0
  406. package/package.json +89 -5
@@ -0,0 +1,4 @@
1
+ import type { ChildNodeWalker, Composition, EnhancementDefinition } from '@elastic/isomer-sdk';
2
+ /** Registered enhancements whose `appliesTo` gate passes for `body`; a gate that throws on an invalid draft does not. */
3
+ export declare const applicableEnhancements: (definitions: readonly EnhancementDefinition[], body: Composition["body"], walk: ChildNodeWalker) => EnhancementDefinition[];
4
+ //# sourceMappingURL=applicable_enhancements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applicable_enhancements.d.ts","sourceRoot":"","sources":["../../src/surfaces/applicable_enhancements.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,qBAAqB,EACtB,MAAM,qBAAqB,CAAC;AAE7B,yHAAyH;AACzH,eAAO,MAAM,sBAAsB,GACjC,aAAa,SAAS,qBAAqB,EAAE,EAC7C,MAAM,WAAW,CAAC,MAAM,CAAC,EACzB,MAAM,eAAe,KACpB,qBAAqB,EAOpB,CAAC"}
@@ -0,0 +1,16 @@
1
+ /*
2
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3
+ * or more contributor license agreements. Licensed under the Elastic License
4
+ * 2.0; you may not use this file except in compliance with the Elastic License
5
+ * 2.0.
6
+ */
7
+ /** Registered enhancements whose `appliesTo` gate passes for `body`; a gate that throws on an invalid draft does not. */
8
+ export const applicableEnhancements = (definitions, body, walk) => definitions.filter((definition) => {
9
+ try {
10
+ return definition.appliesTo(body, walk);
11
+ }
12
+ catch {
13
+ return false;
14
+ }
15
+ });
16
+ //# sourceMappingURL=applicable_enhancements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applicable_enhancements.js","sourceRoot":"","sources":["../../src/surfaces/applicable_enhancements.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,yHAAyH;AACzH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,WAA6C,EAC7C,IAAyB,EACzB,IAAqB,EACI,EAAE,CAC3B,WAAW,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE;IAChC,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC,CAAC","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nimport type {\n ChildNodeWalker,\n Composition,\n EnhancementDefinition,\n} from '@elastic/isomer-sdk';\n\n/** Registered enhancements whose `appliesTo` gate passes for `body`; a gate that throws on an invalid draft does not. */\nexport const applicableEnhancements = (\n definitions: readonly EnhancementDefinition[],\n body: Composition['body'],\n walk: ChildNodeWalker\n): EnhancementDefinition[] =>\n definitions.filter((definition) => {\n try {\n return definition.appliesTo(body, walk);\n } catch {\n return false;\n }\n });\n"]}
@@ -0,0 +1,10 @@
1
+ import type { EnhancementDefinition } from '@elastic/isomer-sdk';
2
+ export interface EnhancementSelectProps {
3
+ definitions: readonly EnhancementDefinition[];
4
+ selected: readonly string[];
5
+ disabled: boolean;
6
+ onChange: (ids: string[]) => void;
7
+ }
8
+ /** Opt-in checklist for enhancements that apply to the current composition. */
9
+ export declare const EnhancementSelect: ({ definitions, selected, disabled, onChange, }: EnhancementSelectProps) => import("@emotion/react/jsx-runtime").JSX.Element;
10
+ //# sourceMappingURL=enhancement_select.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enhancement_select.d.ts","sourceRoot":"","sources":["../../src/surfaces/enhancement_select.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAGjE,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC9C,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CACnC;AAED,+EAA+E;AAC/E,eAAO,MAAM,iBAAiB,GAAI,gDAK/B,sBAAsB,qDAiExB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
2
+ /*
3
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
4
+ * or more contributor license agreements. Licensed under the Elastic License
5
+ * 2.0; you may not use this file except in compliance with the Elastic License
6
+ * 2.0.
7
+ */
8
+ import { useState } from 'react';
9
+ import { EuiButtonEmpty, EuiCheckbox, EuiPopover, EuiSpacer, EuiText, } from '@elastic/eui';
10
+ import { css } from '@emotion/react';
11
+ /** Opt-in checklist for enhancements that apply to the current composition. */
12
+ export const EnhancementSelect = ({ definitions, selected, disabled, onChange, }) => {
13
+ const [open, setOpen] = useState(false);
14
+ const ids = definitions.map(({ id }) => id);
15
+ const enabled = ids.filter((id) => selected.includes(id));
16
+ return (_jsx(EuiPopover, { isOpen: open && !disabled, closePopover: () => setOpen(false), anchorPosition: "downRight", panelPaddingSize: "s", button: _jsxs(EuiButtonEmpty, { size: "xs", color: "text", iconType: "chevronSingleDown", iconSide: "right", isDisabled: disabled, onClick: () => setOpen((value) => !value), children: ["Enhancements (", enabled.length, "/", ids.length, ")"] }), children: _jsx("div", { role: "group", "aria-label": "Enhancements", children: definitions.map(({ id, name, description }) => {
17
+ const label = name ?? id;
18
+ const helpId = description
19
+ ? `studio-enhancement-help-${id}`
20
+ : undefined;
21
+ return (_jsxs("div", { children: [_jsx(EuiCheckbox, { id: `studio-enhancement-${id}`, label: label, disabled: disabled, checked: selected.includes(id), "aria-describedby": helpId, onChange: (event) => onChange(event.target.checked
22
+ ? [...selected, id]
23
+ : selected.filter((value) => value !== id)) }), description ? (_jsxs(_Fragment, { children: [_jsx(EuiSpacer, { size: "xs" }), _jsx(EuiText, { id: helpId, size: "xs", color: "subdued", css: css `
24
+ padding-inline-start: 28px;
25
+ `, children: description }), _jsx(EuiSpacer, { size: "s" })] })) : null] }, id));
26
+ }) }) }));
27
+ };
28
+ //# sourceMappingURL=enhancement_select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enhancement_select.js","sourceRoot":"","sources":["../../src/surfaces/enhancement_select.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AAEH,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EACL,cAAc,EACd,WAAW,EACX,UAAU,EACV,SAAS,EACT,OAAO,GACR,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AASrC,+EAA+E;AAC/E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAChC,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,QAAQ,GACe,EAAE,EAAE;IAC3B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAE1D,OAAO,CACL,KAAC,UAAU,IACT,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,EACzB,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAClC,cAAc,EAAC,WAAW,EAC1B,gBAAgB,EAAC,GAAG,EACpB,MAAM,EACJ,MAAC,cAAc,IACb,IAAI,EAAC,IAAI,EACT,KAAK,EAAC,MAAM,EACZ,QAAQ,EAAC,mBAAmB,EAC5B,QAAQ,EAAC,OAAO,EAChB,UAAU,EAAE,QAAQ,EACpB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,+BAC1B,OAAO,CAAC,MAAM,OAAG,GAAG,CAAC,MAAM,SAC3B,YAEnB,cAAK,IAAI,EAAC,OAAO,gBAAY,cAAc,YACxC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE;gBAC7C,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;gBACzB,MAAM,MAAM,GAAG,WAAW;oBACxB,CAAC,CAAC,2BAA2B,EAAE,EAAE;oBACjC,CAAC,CAAC,SAAS,CAAC;gBACd,OAAO,CACL,0BACE,KAAC,WAAW,IACV,EAAE,EAAE,sBAAsB,EAAE,EAAE,EAC9B,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,sBACZ,MAAM,EACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAClB,QAAQ,CACN,KAAK,CAAC,MAAM,CAAC,OAAO;gCAClB,CAAC,CAAC,CAAC,GAAG,QAAQ,EAAE,EAAE,CAAC;gCACnB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,CAC7C,GAEH,EACD,WAAW,CAAC,CAAC,CAAC,CACb,8BACE,KAAC,SAAS,IAAC,IAAI,EAAC,IAAI,GAAG,EACvB,KAAC,OAAO,IACN,EAAE,EAAE,MAAM,EACV,IAAI,EAAC,IAAI,EACT,KAAK,EAAC,SAAS,EACf,GAAG,EAAE,GAAG,CAAA;;qBAEP,YACA,WAAW,GACJ,EACV,KAAC,SAAS,IAAC,IAAI,EAAC,GAAG,GAAG,IACrB,CACJ,CAAC,CAAC,CAAC,IAAI,KA7BA,EAAE,CA8BN,CACP,CAAC;YACJ,CAAC,CAAC,GACE,GACK,CACd,CAAC;AACJ,CAAC,CAAC","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nimport React, { useState } from 'react';\nimport {\n EuiButtonEmpty,\n EuiCheckbox,\n EuiPopover,\n EuiSpacer,\n EuiText,\n} from '@elastic/eui';\nimport type { EnhancementDefinition } from '@elastic/isomer-sdk';\nimport { css } from '@emotion/react';\n\nexport interface EnhancementSelectProps {\n definitions: readonly EnhancementDefinition[];\n selected: readonly string[];\n disabled: boolean;\n onChange: (ids: string[]) => void;\n}\n\n/** Opt-in checklist for enhancements that apply to the current composition. */\nexport const EnhancementSelect = ({\n definitions,\n selected,\n disabled,\n onChange,\n}: EnhancementSelectProps) => {\n const [open, setOpen] = useState(false);\n const ids = definitions.map(({ id }) => id);\n const enabled = ids.filter((id) => selected.includes(id));\n\n return (\n <EuiPopover\n isOpen={open && !disabled}\n closePopover={() => setOpen(false)}\n anchorPosition=\"downRight\"\n panelPaddingSize=\"s\"\n button={\n <EuiButtonEmpty\n size=\"xs\"\n color=\"text\"\n iconType=\"chevronSingleDown\"\n iconSide=\"right\"\n isDisabled={disabled}\n onClick={() => setOpen((value) => !value)}>\n Enhancements ({enabled.length}/{ids.length})\n </EuiButtonEmpty>\n }>\n <div role=\"group\" aria-label=\"Enhancements\">\n {definitions.map(({ id, name, description }) => {\n const label = name ?? id;\n const helpId = description\n ? `studio-enhancement-help-${id}`\n : undefined;\n return (\n <div key={id}>\n <EuiCheckbox\n id={`studio-enhancement-${id}`}\n label={label}\n disabled={disabled}\n checked={selected.includes(id)}\n aria-describedby={helpId}\n onChange={(event) =>\n onChange(\n event.target.checked\n ? [...selected, id]\n : selected.filter((value) => value !== id)\n )\n }\n />\n {description ? (\n <>\n <EuiSpacer size=\"xs\" />\n <EuiText\n id={helpId}\n size=\"xs\"\n color=\"subdued\"\n css={css`\n padding-inline-start: 28px;\n `}>\n {description}\n </EuiText>\n <EuiSpacer size=\"s\" />\n </>\n ) : null}\n </div>\n );\n })}\n </div>\n </EuiPopover>\n );\n};\n"]}
@@ -0,0 +1,11 @@
1
+ import type { StudioExample } from '../model/read_examples.js';
2
+ export interface ExamplePickerProps {
3
+ examples: readonly StudioExample[];
4
+ example: number;
5
+ onChange: (example: number) => void;
6
+ /** Defaults to `downLeft`. */
7
+ anchorPosition?: 'downLeft' | 'downRight';
8
+ }
9
+ /** A button naming the current example that opens every example, rendered, to pick from. */
10
+ export declare const ExamplePicker: ({ examples, example, onChange, anchorPosition, }: ExamplePickerProps) => import("@emotion/react/jsx-runtime").JSX.Element;
11
+ //# sourceMappingURL=example_picker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example_picker.d.ts","sourceRoot":"","sources":["../../src/surfaces/example_picker.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAoD5D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,8BAA8B;IAC9B,cAAc,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;CAC3C;AAED,4FAA4F;AAC5F,eAAO,MAAM,aAAa,GAAI,kDAK3B,kBAAkB,qDA+CpB,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
2
+ /*
3
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
4
+ * or more contributor license agreements. Licensed under the Elastic License
5
+ * 2.0; you may not use this file except in compliance with the Elastic License
6
+ * 2.0.
7
+ */
8
+ import { useMemo, useState } from 'react';
9
+ import { EuiButton, EuiCard, EuiPopover, EuiPopoverTitle, useEuiTheme, } from '@elastic/eui';
10
+ import { css } from '@emotion/react';
11
+ import { useStudio } from '../studio_context.js';
12
+ import { ReactSurface } from './react_surface.js';
13
+ import { ScaledPreview } from './scaled_preview.js';
14
+ const PREVIEW_HEIGHT = 112;
15
+ const PREVIEW_PADDING = 8;
16
+ const ExampleOption = ({ example: { name, description, node }, isSelected, onSelect, }) => {
17
+ const { euiTheme } = useEuiTheme();
18
+ const { compose } = useStudio();
19
+ const composition = useMemo(() => compose([node]), [compose, node]);
20
+ return (_jsx(EuiCard, { title: name, titleSize: "xs", titleElement: "span", ...(description === undefined ? {} : { description }), textAlign: "left", paddingSize: "s", hasBorder: true, display: isSelected ? 'primary' : 'plain', onClick: onSelect, image: _jsx("div", { "aria-hidden": true, css: css `
21
+ height: ${PREVIEW_HEIGHT}px;
22
+ overflow: hidden;
23
+ pointer-events: none;
24
+ padding: ${PREVIEW_PADDING}px;
25
+ background: ${euiTheme.colors.backgroundBaseSubdued};
26
+ `, children: _jsx(ScaledPreview, { maxHeight: PREVIEW_HEIGHT - 2 * PREVIEW_PADDING, children: _jsx(ReactSurface, { composition }) }) }) }));
27
+ };
28
+ /** A button naming the current example that opens every example, rendered, to pick from. */
29
+ export const ExamplePicker = ({ examples, example, onChange, anchorPosition = 'downLeft', }) => {
30
+ const { euiTheme } = useEuiTheme();
31
+ const [isOpen, setOpen] = useState(false);
32
+ const name = examples[example]?.name ?? 'No examples';
33
+ return (_jsxs(EuiPopover, { isOpen: isOpen, closePopover: () => setOpen(false), anchorPosition, panelPaddingSize: "s", "aria-label": "Examples", button: _jsx(EuiButton, { size: "s", color: "text", iconType: "chevronSingleDown", iconSide: "right", isDisabled: !examples.length, onClick: () => setOpen((open) => !open), "aria-label": `Example: ${name}`, children: name }), children: [_jsx(EuiPopoverTitle, { paddingSize: "s", children: "Examples" }), _jsx("div", { css: css `
34
+ display: grid;
35
+ grid-template-columns: repeat(2, 260px);
36
+ gap: ${euiTheme.size.s};
37
+ max-height: 60vh;
38
+ overflow: auto;
39
+ `, children: examples.map((candidate, index) => (_jsx(ExampleOption, { example: candidate, isSelected: index === example, onSelect: () => {
40
+ setOpen(false);
41
+ onChange(index);
42
+ } }, candidate.name))) })] }));
43
+ };
44
+ //# sourceMappingURL=example_picker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example_picker.js","sourceRoot":"","sources":["../../src/surfaces/example_picker.tsx"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nimport React, { useMemo, useState } from 'react';\nimport {\n EuiButton,\n EuiCard,\n EuiPopover,\n EuiPopoverTitle,\n useEuiTheme,\n} from '@elastic/eui';\nimport { css } from '@emotion/react';\n\nimport type { StudioExample } from '../model/read_examples';\nimport { useStudio } from '../studio_context';\n\nimport { ReactSurface } from './react_surface';\nimport { ScaledPreview } from './scaled_preview';\n\nconst PREVIEW_HEIGHT = 112;\nconst PREVIEW_PADDING = 8;\n\nconst ExampleOption = ({\n example: { name, description, node },\n isSelected,\n onSelect,\n}: {\n example: StudioExample;\n isSelected: boolean;\n onSelect: () => void;\n}) => {\n const { euiTheme } = useEuiTheme();\n const { compose } = useStudio();\n const composition = useMemo(() => compose([node]), [compose, node]);\n\n return (\n <EuiCard\n title={name}\n titleSize=\"xs\"\n titleElement=\"span\"\n {...(description === undefined ? {} : { description })}\n textAlign=\"left\"\n paddingSize=\"s\"\n hasBorder\n display={isSelected ? 'primary' : 'plain'}\n onClick={onSelect}\n image={\n <div\n aria-hidden={true}\n css={css`\n height: ${PREVIEW_HEIGHT}px;\n overflow: hidden;\n pointer-events: none;\n padding: ${PREVIEW_PADDING}px;\n background: ${euiTheme.colors.backgroundBaseSubdued};\n `}>\n <ScaledPreview maxHeight={PREVIEW_HEIGHT - 2 * PREVIEW_PADDING}>\n <ReactSurface {...{ composition }} />\n </ScaledPreview>\n </div>\n }\n />\n );\n};\n\nexport interface ExamplePickerProps {\n examples: readonly StudioExample[];\n example: number;\n onChange: (example: number) => void;\n /** Defaults to `downLeft`. */\n anchorPosition?: 'downLeft' | 'downRight';\n}\n\n/** A button naming the current example that opens every example, rendered, to pick from. */\nexport const ExamplePicker = ({\n examples,\n example,\n onChange,\n anchorPosition = 'downLeft',\n}: ExamplePickerProps) => {\n const { euiTheme } = useEuiTheme();\n const [isOpen, setOpen] = useState(false);\n const name = examples[example]?.name ?? 'No examples';\n\n return (\n <EuiPopover\n isOpen={isOpen}\n closePopover={() => setOpen(false)}\n {...{ anchorPosition }}\n panelPaddingSize=\"s\"\n aria-label=\"Examples\"\n button={\n <EuiButton\n size=\"s\"\n color=\"text\"\n iconType=\"chevronSingleDown\"\n iconSide=\"right\"\n isDisabled={!examples.length}\n onClick={() => setOpen((open) => !open)}\n aria-label={`Example: ${name}`}>\n {name}\n </EuiButton>\n }>\n <EuiPopoverTitle paddingSize=\"s\">Examples</EuiPopoverTitle>\n <div\n css={css`\n display: grid;\n grid-template-columns: repeat(2, 260px);\n gap: ${euiTheme.size.s};\n max-height: 60vh;\n overflow: auto;\n `}>\n {examples.map((candidate, index) => (\n <ExampleOption\n key={candidate.name}\n example={candidate}\n isSelected={index === example}\n onSelect={() => {\n setOpen(false);\n onChange(index);\n }}\n />\n ))}\n </div>\n </EuiPopover>\n );\n};\n"]}
@@ -0,0 +1,4 @@
1
+ import type { SurfaceOutput } from './render_output.js';
2
+ /** Pretty-prints HTML and its inline CSS, and returns other languages and unparsable markup as is. */
3
+ export declare const formatSource: (source: string, language: SurfaceOutput["language"]) => Promise<string>;
4
+ //# sourceMappingURL=format_source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format_source.d.ts","sourceRoot":"","sources":["../../src/surfaces/format_source.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,sGAAsG;AACtG,eAAO,MAAM,YAAY,GACvB,QAAQ,MAAM,EACd,UAAU,aAAa,CAAC,UAAU,CAAC,KAClC,OAAO,CAAC,MAAM,CAoBhB,CAAC"}
@@ -0,0 +1,30 @@
1
+ /*
2
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3
+ * or more contributor license agreements. Licensed under the Elastic License
4
+ * 2.0; you may not use this file except in compliance with the Elastic License
5
+ * 2.0.
6
+ */
7
+ /** Pretty-prints HTML and its inline CSS, and returns other languages and unparsable markup as is. */
8
+ export const formatSource = async (source, language) => {
9
+ if (language !== 'html' || !source) {
10
+ return source;
11
+ }
12
+ try {
13
+ const [{ format }, html, postcss] = await Promise.all([
14
+ import('prettier/standalone'),
15
+ import('prettier/plugins/html'),
16
+ import('prettier/plugins/postcss'),
17
+ ]);
18
+ const formatted = await format(source, {
19
+ parser: 'html',
20
+ plugins: [html, postcss],
21
+ printWidth: 80,
22
+ htmlWhitespaceSensitivity: 'ignore',
23
+ });
24
+ return formatted.trimEnd();
25
+ }
26
+ catch {
27
+ return source;
28
+ }
29
+ };
30
+ //# sourceMappingURL=format_source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format_source.js","sourceRoot":"","sources":["../../src/surfaces/format_source.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,sGAAsG;AACtG,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,MAAc,EACd,QAAmC,EAClB,EAAE;IACnB,IAAI,QAAQ,KAAK,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACnC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACpD,MAAM,CAAC,qBAAqB,CAAC;YAC7B,MAAM,CAAC,uBAAuB,CAAC;YAC/B,MAAM,CAAC,0BAA0B,CAAC;SACnC,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE;YACrC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC;YACxB,UAAU,EAAE,EAAE;YACd,yBAAyB,EAAE,QAAQ;SACpC,CAAC,CAAC;QACH,OAAO,SAAS,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC,CAAC","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nimport type { SurfaceOutput } from './render_output';\n\n/** Pretty-prints HTML and its inline CSS, and returns other languages and unparsable markup as is. */\nexport const formatSource = async (\n source: string,\n language: SurfaceOutput['language']\n): Promise<string> => {\n if (language !== 'html' || !source) {\n return source;\n }\n try {\n const [{ format }, html, postcss] = await Promise.all([\n import('prettier/standalone'),\n import('prettier/plugins/html'),\n import('prettier/plugins/postcss'),\n ]);\n const formatted = await format(source, {\n parser: 'html',\n plugins: [html, postcss],\n printWidth: 80,\n htmlWhitespaceSensitivity: 'ignore',\n });\n return formatted.trimEnd();\n } catch {\n return source;\n }\n};\n"]}
@@ -0,0 +1,14 @@
1
+ /** Rendered markup in a sandboxed frame that runs no scripts, sized to its content. */
2
+ export declare const HtmlSurface: ({ html, title, }: {
3
+ html: string;
4
+ title: string;
5
+ }) => import("@emotion/react/jsx-runtime").JSX.Element;
6
+ interface ShadowHtmlProps {
7
+ html: string;
8
+ title: string;
9
+ enhancementScript?: string | undefined;
10
+ }
11
+ /** HTML and its stylesheet in a shadow root; only host-provided enhancement scripts run. */
12
+ export declare const ShadowHtmlSurface: (props: ShadowHtmlProps) => import("@emotion/react/jsx-runtime").JSX.Element;
13
+ export {};
14
+ //# sourceMappingURL=html_surface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html_surface.d.ts","sourceRoot":"","sources":["../../src/surfaces/html_surface.tsx"],"names":[],"mappings":"AAsDA,uFAAuF;AACvF,eAAO,MAAM,WAAW,GAAI,kBAGzB;IACD,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,qDA0DA,CAAC;AAEF,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC;AAsCD,4FAA4F;AAC5F,eAAO,MAAM,iBAAiB,GAAI,OAAO,eAAe,qDAiBvD,CAAC"}
@@ -0,0 +1,122 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
2
+ /*
3
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
4
+ * or more contributor license agreements. Licensed under the Elastic License
5
+ * 2.0; you may not use this file except in compliance with the Elastic License
6
+ * 2.0.
7
+ */
8
+ import { useEffect, useLayoutEffect, useRef, useState } from 'react';
9
+ import { EuiCallOut } from '@elastic/eui';
10
+ import { runEnhancementScript } from '@elastic/isomer-sdk/react';
11
+ import { css } from '@emotion/react';
12
+ import { ShadowRootHost } from './shadow_root.js';
13
+ const MIN_HEIGHT = 48;
14
+ const frameStyles = css `
15
+ display: block;
16
+ width: 100%;
17
+ border: 0;
18
+ `;
19
+ const EDITABLE = 'input, select, textarea, [contenteditable]:not([contenteditable="false"])';
20
+ /** Duck-typed: the framed document's elements belong to its own realm. */
21
+ const isEditable = (target) => typeof target === 'object' &&
22
+ target !== null &&
23
+ 'closest' in target &&
24
+ typeof target.closest === 'function' &&
25
+ target.closest(EDITABLE) !== null;
26
+ /** Re-dispatches a key pressed inside the frame from the frame element, so the page's key handlers still see it; keys typed into the frame's own fields stay there. */
27
+ const forwardKey = (frame) => (event) => {
28
+ const { key, code, location, repeat, shiftKey, altKey, ctrlKey, metaKey } = event;
29
+ if (event.defaultPrevented || isEditable(event.target)) {
30
+ return;
31
+ }
32
+ const forwarded = new KeyboardEvent(event.type, {
33
+ ...{ key, code, location, repeat, shiftKey, altKey, ctrlKey, metaKey },
34
+ bubbles: true,
35
+ cancelable: true,
36
+ composed: true,
37
+ });
38
+ if (!frame.dispatchEvent(forwarded)) {
39
+ event.preventDefault();
40
+ }
41
+ };
42
+ const documentFor = (html) => `<!doctype html><html><head><meta charset="utf-8"><style>body{margin:0;display:flow-root}</style></head><body>${html}</body></html>`;
43
+ /** Rendered markup in a sandboxed frame that runs no scripts, sized to its content. */
44
+ export const HtmlSurface = ({ html, title, }) => {
45
+ const frame = useRef(null);
46
+ const [height, setHeight] = useState(MIN_HEIGHT);
47
+ useEffect(() => {
48
+ const element = frame.current;
49
+ if (!element) {
50
+ return;
51
+ }
52
+ let observer;
53
+ let framed;
54
+ const onKey = forwardKey(element);
55
+ const measure = () => {
56
+ framed?.removeEventListener('keydown', onKey);
57
+ framed = element.contentDocument ?? undefined;
58
+ framed?.addEventListener('keydown', onKey);
59
+ const body = framed?.body;
60
+ if (!body) {
61
+ return;
62
+ }
63
+ // A frame clips what overflows it, so a fixed-width document widens the frame to show it.
64
+ // The width is set on the node so each measurement starts from the container's width.
65
+ const update = () => {
66
+ element.style.width = '';
67
+ const { scrollWidth } = body.ownerDocument.documentElement;
68
+ element.style.width =
69
+ scrollWidth > element.clientWidth ? `${scrollWidth}px` : '';
70
+ setHeight(Math.max(MIN_HEIGHT, body.offsetHeight));
71
+ };
72
+ update();
73
+ observer?.disconnect();
74
+ if (typeof ResizeObserver !== 'undefined') {
75
+ observer = new ResizeObserver(update);
76
+ observer.observe(body);
77
+ // A frame widened past its container no longer resizes with it.
78
+ if (element.parentElement) {
79
+ observer.observe(element.parentElement);
80
+ }
81
+ }
82
+ };
83
+ element.addEventListener('load', measure);
84
+ return () => {
85
+ element.removeEventListener('load', measure);
86
+ framed?.removeEventListener('keydown', onKey);
87
+ observer?.disconnect();
88
+ };
89
+ }, []);
90
+ return (_jsx("iframe", { ref: frame, title: title, sandbox: "allow-same-origin", srcDoc: documentFor(html), css: frameStyles, style: { height } }));
91
+ };
92
+ const ShadowHtmlContent = ({ html, enhancementScript, onError, }) => {
93
+ const content = useRef(null);
94
+ useLayoutEffect(() => {
95
+ const element = content.current;
96
+ if (!element) {
97
+ return;
98
+ }
99
+ element.innerHTML = html;
100
+ onError(undefined);
101
+ if (enhancementScript) {
102
+ try {
103
+ const root = element.querySelector('.isomer');
104
+ if (!root) {
105
+ throw new Error('The HTML output has no .isomer enhancement root.');
106
+ }
107
+ runEnhancementScript(enhancementScript, root);
108
+ }
109
+ catch (error) {
110
+ onError(error instanceof Error ? error.message : String(error));
111
+ }
112
+ }
113
+ return () => element.replaceChildren();
114
+ }, [html, enhancementScript, onError]);
115
+ return (_jsx("div", { ref: content, style: { all: 'initial', display: 'flow-root', colorScheme: 'inherit' } }));
116
+ };
117
+ /** HTML and its stylesheet in a shadow root; only host-provided enhancement scripts run. */
118
+ export const ShadowHtmlSurface = (props) => {
119
+ const [error, setError] = useState();
120
+ return (_jsxs(_Fragment, { children: [error ? (_jsx(EuiCallOut, { size: "s", color: "danger", title: "HTML enhancements failed", text: _jsx("p", { children: error }) })) : null, _jsx(ShadowRootHost, { title: props.title, children: () => _jsx(ShadowHtmlContent, { ...props, onError: setError }) })] }));
121
+ };
122
+ //# sourceMappingURL=html_surface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html_surface.js","sourceRoot":"","sources":["../../src/surfaces/html_surface.tsx"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nimport React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { EuiCallOut } from '@elastic/eui';\nimport { runEnhancementScript } from '@elastic/isomer-sdk/react';\nimport { css } from '@emotion/react';\n\nimport { ShadowRootHost } from './shadow_root';\n\nconst MIN_HEIGHT = 48;\n\nconst frameStyles = css`\n display: block;\n width: 100%;\n border: 0;\n`;\n\nconst EDITABLE =\n 'input, select, textarea, [contenteditable]:not([contenteditable=\"false\"])';\n\n/** Duck-typed: the framed document's elements belong to its own realm. */\nconst isEditable = (target: EventTarget | null): boolean =>\n typeof target === 'object' &&\n target !== null &&\n 'closest' in target &&\n typeof target.closest === 'function' &&\n (target as Element).closest(EDITABLE) !== null;\n\n/** Re-dispatches a key pressed inside the frame from the frame element, so the page's key handlers still see it; keys typed into the frame's own fields stay there. */\nconst forwardKey = (frame: HTMLIFrameElement) => (event: KeyboardEvent) => {\n const { key, code, location, repeat, shiftKey, altKey, ctrlKey, metaKey } =\n event;\n if (event.defaultPrevented || isEditable(event.target)) {\n return;\n }\n const forwarded = new KeyboardEvent(event.type, {\n ...{ key, code, location, repeat, shiftKey, altKey, ctrlKey, metaKey },\n bubbles: true,\n cancelable: true,\n composed: true,\n });\n if (!frame.dispatchEvent(forwarded)) {\n event.preventDefault();\n }\n};\n\nconst documentFor = (html: string) =>\n `<!doctype html><html><head><meta charset=\"utf-8\"><style>body{margin:0;display:flow-root}</style></head><body>${html}</body></html>`;\n\n/** Rendered markup in a sandboxed frame that runs no scripts, sized to its content. */\nexport const HtmlSurface = ({\n html,\n title,\n}: {\n html: string;\n title: string;\n}) => {\n const frame = useRef<HTMLIFrameElement>(null);\n const [height, setHeight] = useState(MIN_HEIGHT);\n\n useEffect(() => {\n const element = frame.current;\n if (!element) {\n return;\n }\n let observer: ResizeObserver | undefined;\n let framed: Document | undefined;\n const onKey = forwardKey(element);\n const measure = () => {\n framed?.removeEventListener('keydown', onKey);\n framed = element.contentDocument ?? undefined;\n framed?.addEventListener('keydown', onKey);\n const body = framed?.body;\n if (!body) {\n return;\n }\n // A frame clips what overflows it, so a fixed-width document widens the frame to show it.\n // The width is set on the node so each measurement starts from the container's width.\n const update = () => {\n element.style.width = '';\n const { scrollWidth } = body.ownerDocument.documentElement;\n element.style.width =\n scrollWidth > element.clientWidth ? `${scrollWidth}px` : '';\n setHeight(Math.max(MIN_HEIGHT, body.offsetHeight));\n };\n update();\n observer?.disconnect();\n if (typeof ResizeObserver !== 'undefined') {\n observer = new ResizeObserver(update);\n observer.observe(body);\n // A frame widened past its container no longer resizes with it.\n if (element.parentElement) {\n observer.observe(element.parentElement);\n }\n }\n };\n element.addEventListener('load', measure);\n return () => {\n element.removeEventListener('load', measure);\n framed?.removeEventListener('keydown', onKey);\n observer?.disconnect();\n };\n }, []);\n\n return (\n <iframe\n ref={frame}\n title={title}\n sandbox=\"allow-same-origin\"\n srcDoc={documentFor(html)}\n css={frameStyles}\n style={{ height }}\n />\n );\n};\n\ninterface ShadowHtmlProps {\n html: string;\n title: string;\n enhancementScript?: string | undefined;\n}\n\nconst ShadowHtmlContent = ({\n html,\n enhancementScript,\n onError,\n}: ShadowHtmlProps & {\n onError: (error: string | undefined) => void;\n}) => {\n const content = useRef<HTMLDivElement>(null);\n useLayoutEffect(() => {\n const element = content.current;\n if (!element) {\n return;\n }\n element.innerHTML = html;\n onError(undefined);\n if (enhancementScript) {\n try {\n const root = element.querySelector('.isomer');\n if (!root) {\n throw new Error('The HTML output has no .isomer enhancement root.');\n }\n runEnhancementScript(enhancementScript, root);\n } catch (error) {\n onError(error instanceof Error ? error.message : String(error));\n }\n }\n return () => element.replaceChildren();\n }, [html, enhancementScript, onError]);\n return (\n <div\n ref={content}\n style={{ all: 'initial', display: 'flow-root', colorScheme: 'inherit' }}\n />\n );\n};\n\n/** HTML and its stylesheet in a shadow root; only host-provided enhancement scripts run. */\nexport const ShadowHtmlSurface = (props: ShadowHtmlProps) => {\n const [error, setError] = useState<string>();\n return (\n <>\n {error ? (\n <EuiCallOut\n size=\"s\"\n color=\"danger\"\n title=\"HTML enhancements failed\"\n text={<p>{error}</p>}\n />\n ) : null}\n <ShadowRootHost title={props.title}>\n {() => <ShadowHtmlContent {...props} onError={setError} />}\n </ShadowRootHost>\n </>\n );\n};\n"]}
@@ -0,0 +1,13 @@
1
+ import type { Composition } from '@elastic/isomer-sdk';
2
+ import type { SerializedStyles } from '@emotion/react';
3
+ import type { RasterizePng } from '../types.js';
4
+ import type { PreviewZoom } from './scaled_preview.js';
5
+ /** The host's PNG of `composition`, refreshed as it changes. */
6
+ export declare const PngSurface: ({ composition, rasterizePng, zoom, frameCss, }: {
7
+ composition: Composition;
8
+ rasterizePng: RasterizePng;
9
+ zoom?: PreviewZoom;
10
+ /** Styles a frame around the image alone; diagnostics sit outside it. */
11
+ frameCss?: SerializedStyles | undefined;
12
+ }) => import("@emotion/react/jsx-runtime").JSX.Element;
13
+ //# sourceMappingURL=png_surface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"png_surface.d.ts","sourceRoot":"","sources":["../../src/surfaces/png_surface.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAIvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAG7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAcpD,gEAAgE;AAChE,eAAO,MAAM,UAAU,GAAI,gDAKxB;IACD,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,YAAY,CAAC;IAC3B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;CACzC,qDAmGA,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "@emotion/react/jsx-runtime";
2
+ /*
3
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
4
+ * or more contributor license agreements. Licensed under the Elastic License
5
+ * 2.0; you may not use this file except in compliance with the Elastic License
6
+ * 2.0.
7
+ */
8
+ import { useEffect, useState } from 'react';
9
+ import { EuiCallOut, EuiLoadingSpinner } from '@elastic/eui';
10
+ import { css } from '@emotion/react';
11
+ import { isPngUnavailableError } from '../model/png_manifest.js';
12
+ import { PNG_SCALE } from '../types.js';
13
+ import { ScaledPreview } from './scaled_preview.js';
14
+ import { SurfaceFrame } from './surface_frame.js';
15
+ const RASTERIZE_DELAY = 250;
16
+ const describeError = (error) => error instanceof Error ? error.message : String(error);
17
+ /** The host's PNG of `composition`, refreshed as it changes. */
18
+ export const PngSurface = ({ composition, rasterizePng, zoom = 'fit', frameCss, }) => {
19
+ const [image, setImage] = useState();
20
+ const [error, setError] = useState();
21
+ const [isUnavailable, setUnavailable] = useState(false);
22
+ const [isLoading, setLoading] = useState(true);
23
+ const [width, setWidth] = useState();
24
+ useEffect(() => {
25
+ const controller = new AbortController();
26
+ const { signal } = controller;
27
+ setLoading(true);
28
+ const rasterize = async () => {
29
+ try {
30
+ const blob = await rasterizePng(composition, { signal });
31
+ if (!signal.aborted) {
32
+ setImage({ url: URL.createObjectURL(blob), bytes: blob.size });
33
+ setError(undefined);
34
+ setUnavailable(false);
35
+ }
36
+ }
37
+ catch (rasterizeError) {
38
+ if (!signal.aborted) {
39
+ setError(describeError(rasterizeError));
40
+ setUnavailable(isPngUnavailableError(rasterizeError));
41
+ }
42
+ }
43
+ finally {
44
+ if (!signal.aborted) {
45
+ setLoading(false);
46
+ }
47
+ }
48
+ };
49
+ const timer = setTimeout(() => void rasterize(), RASTERIZE_DELAY);
50
+ return () => {
51
+ clearTimeout(timer);
52
+ controller.abort();
53
+ };
54
+ }, [composition, rasterizePng]);
55
+ useEffect(() => {
56
+ if (!image) {
57
+ return;
58
+ }
59
+ return () => URL.revokeObjectURL(image.url);
60
+ }, [image]);
61
+ return (_jsx(_Fragment, { children: isUnavailable ? (_jsx(EuiCallOut, { announceOnMount: true, size: "s", iconType: "info", title: "No prerendered PNG", text: _jsxs("p", { children: ["PNG previews of edited compositions need", ' ', _jsx("code", { children: "isomer-studio dev" }), "."] }) })) : error ? (_jsx(EuiCallOut, { announceOnMount: true, size: "s", color: "danger", iconType: "error", title: "This surface could not render", text: _jsx("p", { children: error }) })) : (_jsx(SurfaceFrame, { frameCss, children: image ? (_jsx("div", { css: css `
62
+ opacity: ${isLoading ? 0.6 : 1};
63
+ `, children: _jsx(ScaledPreview, { zoom, children: _jsx("img", { src: image.url, alt: "PNG preview", style: { width }, onLoad: ({ currentTarget: { naturalWidth } }) => setWidth(naturalWidth / PNG_SCALE), css: css `
64
+ display: block;
65
+ visibility: ${width ? 'visible' : 'hidden'};
66
+ ` }) }) })) : (_jsx(EuiLoadingSpinner, { size: "m", "aria-label": "Rendering PNG" })) })) }));
67
+ };
68
+ //# sourceMappingURL=png_surface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"png_surface.js","sourceRoot":"","sources":["../../src/surfaces/png_surface.tsx"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nimport React, { useEffect, useState } from 'react';\nimport { EuiCallOut, EuiLoadingSpinner } from '@elastic/eui';\nimport type { Composition } from '@elastic/isomer-sdk';\nimport type { SerializedStyles } from '@emotion/react';\nimport { css } from '@emotion/react';\n\nimport { isPngUnavailableError } from '../model/png_manifest';\nimport type { RasterizePng } from '../types';\nimport { PNG_SCALE } from '../types';\n\nimport type { PreviewZoom } from './scaled_preview';\nimport { ScaledPreview } from './scaled_preview';\nimport { SurfaceFrame } from './surface_frame';\n\nconst RASTERIZE_DELAY = 250;\n\ninterface Rasterized {\n url: string;\n bytes: number;\n}\n\nconst describeError = (error: unknown): string =>\n error instanceof Error ? error.message : String(error);\n\n/** The host's PNG of `composition`, refreshed as it changes. */\nexport const PngSurface = ({\n composition,\n rasterizePng,\n zoom = 'fit',\n frameCss,\n}: {\n composition: Composition;\n rasterizePng: RasterizePng;\n zoom?: PreviewZoom;\n /** Styles a frame around the image alone; diagnostics sit outside it. */\n frameCss?: SerializedStyles | undefined;\n}) => {\n const [image, setImage] = useState<Rasterized>();\n const [error, setError] = useState<string>();\n const [isUnavailable, setUnavailable] = useState(false);\n const [isLoading, setLoading] = useState(true);\n const [width, setWidth] = useState<number>();\n\n useEffect(() => {\n const controller = new AbortController();\n const { signal } = controller;\n setLoading(true);\n\n const rasterize = async () => {\n try {\n const blob = await rasterizePng(composition, { signal });\n if (!signal.aborted) {\n setImage({ url: URL.createObjectURL(blob), bytes: blob.size });\n setError(undefined);\n setUnavailable(false);\n }\n } catch (rasterizeError) {\n if (!signal.aborted) {\n setError(describeError(rasterizeError));\n setUnavailable(isPngUnavailableError(rasterizeError));\n }\n } finally {\n if (!signal.aborted) {\n setLoading(false);\n }\n }\n };\n const timer = setTimeout(() => void rasterize(), RASTERIZE_DELAY);\n\n return () => {\n clearTimeout(timer);\n controller.abort();\n };\n }, [composition, rasterizePng]);\n\n useEffect(() => {\n if (!image) {\n return;\n }\n return () => URL.revokeObjectURL(image.url);\n }, [image]);\n\n return (\n <>\n {isUnavailable ? (\n <EuiCallOut\n announceOnMount\n size=\"s\"\n iconType=\"info\"\n title=\"No prerendered PNG\"\n text={\n <p>\n PNG previews of edited compositions need{' '}\n <code>isomer-studio dev</code>.\n </p>\n }\n />\n ) : error ? (\n <EuiCallOut\n announceOnMount\n size=\"s\"\n color=\"danger\"\n iconType=\"error\"\n title=\"This surface could not render\"\n text={<p>{error}</p>}\n />\n ) : (\n <SurfaceFrame {...{ frameCss }}>\n {image ? (\n <div\n css={css`\n opacity: ${isLoading ? 0.6 : 1};\n `}>\n <ScaledPreview {...{ zoom }}>\n <img\n src={image.url}\n alt=\"PNG preview\"\n style={{ width }}\n onLoad={({ currentTarget: { naturalWidth } }) =>\n setWidth(naturalWidth / PNG_SCALE)\n }\n css={css`\n display: block;\n visibility: ${width ? 'visible' : 'hidden'};\n `}\n />\n </ScaledPreview>\n </div>\n ) : (\n <EuiLoadingSpinner size=\"m\" aria-label=\"Rendering PNG\" />\n )}\n </SurfaceFrame>\n )}\n </>\n );\n};\n"]}
@@ -0,0 +1,11 @@
1
+ import type { Composition } from '@elastic/isomer-sdk';
2
+ export interface ReactSurfaceProps {
3
+ composition: Composition;
4
+ heading?: boolean | undefined;
5
+ enhancements?: readonly string[] | undefined;
6
+ /** Runs after each commit of the shadow root's content; the `html` fallback has no root to hand it. */
7
+ onCommit?: ((root: ShadowRoot) => void) | undefined;
8
+ }
9
+ /** The React surface in a shadow root, styled by the host, or the `html` surface when it supplies no styling. */
10
+ export declare const ReactSurface: ({ composition, heading, enhancements, onCommit, }: ReactSurfaceProps) => import("@emotion/react/jsx-runtime").JSX.Element;
11
+ //# sourceMappingURL=react_surface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react_surface.d.ts","sourceRoot":"","sources":["../../src/surfaces/react_surface.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAuB,MAAM,qBAAqB,CAAC;AA6C5E,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7C,uGAAuG;IACvG,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CACrD;AA+CD,iHAAiH;AACjH,eAAO,MAAM,YAAY,GAAI,mDAK1B,iBAAiB,qDAyBnB,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { jsx as _jsx, Fragment as _Fragment } from "@emotion/react/jsx-runtime";
2
+ import { Component, useLayoutEffect, useMemo } from 'react';
3
+ import { EuiCallOut } from '@elastic/eui';
4
+ import { useStudio } from '../studio_context.js';
5
+ import { HtmlSurface } from './html_surface.js';
6
+ import { ShadowRootHost } from './shadow_root.js';
7
+ /** Keeps a renderer that throws on a half-edited node from taking the Studio down. */
8
+ class RenderBoundary extends Component {
9
+ state = {};
10
+ static getDerivedStateFromError(error) {
11
+ return { error };
12
+ }
13
+ componentDidUpdate({ resetKey }) {
14
+ if (resetKey !== this.props.resetKey && this.state.error) {
15
+ this.setState({ error: undefined });
16
+ }
17
+ }
18
+ render() {
19
+ const { error } = this.state;
20
+ return error ? (_jsx(EuiCallOut, { announceOnMount: true, size: "s", color: "danger", iconType: "error", title: "The React renderer threw", text: _jsx("p", { children: error.message }) })) : (this.props.children);
21
+ }
22
+ }
23
+ const ReactContent = ({ root, composition, heading, enhancements, onCommit, createReactContext, }) => {
24
+ const { runtime } = useStudio();
25
+ const context = useMemo(() => createReactContext(root), [createReactContext, root]);
26
+ useLayoutEffect(() => {
27
+ onCommit?.(root);
28
+ });
29
+ return (_jsx(_Fragment, { children: runtime.surfaces.react.render(composition, {
30
+ wrapper: true,
31
+ context,
32
+ ...(heading === false ? { heading } : {}),
33
+ ...(enhancements ? { enhancements } : {}),
34
+ }) }));
35
+ };
36
+ const HtmlContent = ({ composition, heading, enhancements, }) => {
37
+ const { runtime } = useStudio();
38
+ const { html } = runtime.surfaces.html.render(composition, {
39
+ scripts: 'host',
40
+ ...(heading === false ? { heading } : {}),
41
+ ...(enhancements ? { enhancements } : {}),
42
+ });
43
+ return _jsx(HtmlSurface, { html, title: "React preview" });
44
+ };
45
+ /** The React surface in a shadow root, styled by the host, or the `html` surface when it supplies no styling. */
46
+ export const ReactSurface = ({ composition, heading, enhancements, onCommit, }) => {
47
+ const { createReactContext } = useStudio();
48
+ return (_jsx(RenderBoundary, { resetKey: composition, children: createReactContext ? (_jsx(ShadowRootHost, { children: (root) => (_jsx(ReactContent, { root,
49
+ composition,
50
+ heading,
51
+ enhancements,
52
+ onCommit,
53
+ createReactContext })) })) : (_jsx(HtmlContent, { composition, heading, enhancements })) }));
54
+ };
55
+ //# sourceMappingURL=react_surface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react_surface.js","sourceRoot":"","sources":["../../src/surfaces/react_surface.tsx"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nimport type { ReactNode } from 'react';\nimport React, { Component, useLayoutEffect, useMemo } from 'react';\nimport { EuiCallOut } from '@elastic/eui';\nimport type { Composition, StyledRenderContext } from '@elastic/isomer-sdk';\n\nimport { useStudio } from '../studio_context';\n\nimport { HtmlSurface } from './html_surface';\nimport { ShadowRootHost } from './shadow_root';\n\ninterface BoundaryState {\n error?: Error | undefined;\n}\n\n/** Keeps a renderer that throws on a half-edited node from taking the Studio down. */\nclass RenderBoundary extends Component<\n { children: ReactNode; resetKey: unknown },\n BoundaryState\n> {\n state: BoundaryState = {};\n\n static getDerivedStateFromError(error: Error): BoundaryState {\n return { error };\n }\n\n componentDidUpdate({ resetKey }: { resetKey: unknown }) {\n if (resetKey !== this.props.resetKey && this.state.error) {\n this.setState({ error: undefined });\n }\n }\n\n render() {\n const { error } = this.state;\n return error ? (\n <EuiCallOut\n announceOnMount\n size=\"s\"\n color=\"danger\"\n iconType=\"error\"\n title=\"The React renderer threw\"\n text={<p>{error.message}</p>}\n />\n ) : (\n this.props.children\n );\n }\n}\n\nexport interface ReactSurfaceProps {\n composition: Composition;\n heading?: boolean | undefined;\n enhancements?: readonly string[] | undefined;\n /** Runs after each commit of the shadow root's content; the `html` fallback has no root to hand it. */\n onCommit?: ((root: ShadowRoot) => void) | undefined;\n}\n\nconst ReactContent = ({\n root,\n composition,\n heading,\n enhancements,\n onCommit,\n createReactContext,\n}: ReactSurfaceProps & {\n root: ShadowRoot;\n createReactContext: (root: ShadowRoot) => StyledRenderContext;\n}) => {\n const { runtime } = useStudio();\n const context = useMemo(\n () => createReactContext(root),\n [createReactContext, root]\n );\n useLayoutEffect(() => {\n onCommit?.(root);\n });\n return (\n <>\n {runtime.surfaces.react.render(composition, {\n wrapper: true,\n context,\n ...(heading === false ? { heading } : {}),\n ...(enhancements ? { enhancements } : {}),\n })}\n </>\n );\n};\n\nconst HtmlContent = ({\n composition,\n heading,\n enhancements,\n}: Pick<ReactSurfaceProps, 'composition' | 'heading' | 'enhancements'>) => {\n const { runtime } = useStudio();\n const { html } = runtime.surfaces.html.render(composition, {\n scripts: 'host',\n ...(heading === false ? { heading } : {}),\n ...(enhancements ? { enhancements } : {}),\n });\n return <HtmlSurface {...{ html }} title=\"React preview\" />;\n};\n\n/** The React surface in a shadow root, styled by the host, or the `html` surface when it supplies no styling. */\nexport const ReactSurface = ({\n composition,\n heading,\n enhancements,\n onCommit,\n}: ReactSurfaceProps) => {\n const { createReactContext } = useStudio();\n\n return (\n <RenderBoundary resetKey={composition}>\n {createReactContext ? (\n <ShadowRootHost>\n {(root) => (\n <ReactContent\n {...{\n root,\n composition,\n heading,\n enhancements,\n onCommit,\n createReactContext,\n }}\n />\n )}\n </ShadowRootHost>\n ) : (\n <HtmlContent {...{ composition, heading, enhancements }} />\n )}\n </RenderBoundary>\n );\n};\n"]}
@@ -0,0 +1,31 @@
1
+ import type { Composition, ValidationResult, ValidationWarning } from '@elastic/isomer-sdk';
2
+ import type { SlackBlock } from '@elastic/isomer-sdk/slack';
3
+ import type { StudioRuntime } from '../config.js';
4
+ import type { StudioSurface } from '../model/describe_runtime.js';
5
+ export interface SurfaceOutput {
6
+ /** What the surface produced, as text. */
7
+ source: string;
8
+ language: 'html' | 'markdown' | 'text' | 'json';
9
+ warnings: ValidationWarning[];
10
+ error?: string;
11
+ enhancementScript?: string;
12
+ slack?: {
13
+ text: string;
14
+ blocks: SlackBlock[];
15
+ };
16
+ snapshot?: {
17
+ css: string;
18
+ html: string;
19
+ width: number;
20
+ height: number;
21
+ };
22
+ }
23
+ /** Options for {@link renderSurfaceOutput}. */
24
+ export interface SurfaceOutputOptions {
25
+ /** `false` leaves out the composition's leading title. Defaults to `true`. */
26
+ heading?: boolean | undefined;
27
+ enhancements?: readonly string[] | undefined;
28
+ }
29
+ /** Renders `composition` on `surface`, collecting findings rather than throwing. */
30
+ export declare const renderSurfaceOutput: (runtime: StudioRuntime, surface: StudioSurface, composition: Composition, validation: ValidationResult, options?: SurfaceOutputOptions) => SurfaceOutput;
31
+ //# sourceMappingURL=render_output.d.ts.map