@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 @@
1
+ {"version":3,"file":"render_output.d.ts","sourceRoot":"","sources":["../../src/surfaces/render_output.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,WAAW,EAEX,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG/D,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;IAChD,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,UAAU,EAAE,CAAA;KAAE,CAAC;IAC/C,QAAQ,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACzE;AAsBD,+CAA+C;AAC/C,MAAM,WAAW,oBAAoB;IACnC,8EAA8E;IAC9E,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CAC9C;AAmGD,oFAAoF;AACpF,eAAO,MAAM,mBAAmB,GAC9B,SAAS,aAAa,EACtB,SAAS,aAAa,EACtB,aAAa,WAAW,EACxB,YAAY,gBAAgB,EAC5B,UAAS,oBAAyB,KACjC,aAwBF,CAAC"}
@@ -0,0 +1,119 @@
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
+ import { warningsForSurface } from '@elastic/isomer-sdk';
8
+ import { unmodeledSlackNotes } from '../model/slack_limits.js';
9
+ const VALIDATION_SURFACE = {
10
+ react: 'react',
11
+ html: 'react',
12
+ snapshot: 'snapshot',
13
+ markdown: 'markdown',
14
+ text: 'text',
15
+ slack: 'slack',
16
+ };
17
+ const COLLECT = { onValidationError: 'collect' };
18
+ const describeError = (error) => error instanceof Error ? error.message : String(error);
19
+ const render = (runtime, surface, composition, { heading, enhancements }) => {
20
+ const { surfaces } = runtime;
21
+ const lead = heading === false ? { heading } : {};
22
+ const collect = { ...COLLECT, ...lead };
23
+ switch (surface) {
24
+ case 'react':
25
+ return {
26
+ source: surfaces.html.render(composition, {
27
+ css: 'separate',
28
+ minify: false,
29
+ scripts: 'host',
30
+ ...(enhancements ? { enhancements } : {}),
31
+ ...lead,
32
+ }).html,
33
+ language: 'html',
34
+ };
35
+ case 'html': {
36
+ const result = surfaces.html.render(composition, {
37
+ minify: false,
38
+ ...lead,
39
+ ...(enhancements ? { enhancements, scripts: 'host' } : {}),
40
+ });
41
+ return {
42
+ source: result.html,
43
+ ...(enhancements ? { enhancementScript: result.js } : {}),
44
+ language: 'html',
45
+ };
46
+ }
47
+ case 'markdown':
48
+ return {
49
+ source: surfaces.markdown.render(composition, collect),
50
+ language: 'markdown',
51
+ };
52
+ case 'text':
53
+ return {
54
+ source: surfaces.text.render(composition, collect),
55
+ language: 'text',
56
+ };
57
+ case 'slack': {
58
+ const { text, blocks } = surfaces.slack.render(composition, collect);
59
+ return {
60
+ source: JSON.stringify({ text, blocks }, null, 2),
61
+ language: 'json',
62
+ slack: { text, blocks },
63
+ renderWarnings: unmodeledSlackNotes(blocks).map((message) => ({
64
+ message,
65
+ })),
66
+ };
67
+ }
68
+ case 'snapshot': {
69
+ if (!surfaces.snapshot) {
70
+ return {
71
+ source: '',
72
+ language: 'html',
73
+ error: 'This runtime has no frames.',
74
+ };
75
+ }
76
+ const { html, css, width, height, warnings } = surfaces.snapshot.render(composition, COLLECT);
77
+ return {
78
+ source: html,
79
+ language: 'html',
80
+ snapshot: { css, html, width, height },
81
+ renderWarnings: warnings,
82
+ };
83
+ }
84
+ }
85
+ };
86
+ /** Advisory findings for one surface, from validation and from the render itself, without duplicates. */
87
+ const surfaceWarnings = (validation, surface, renderWarnings = []) => {
88
+ const seen = new Set();
89
+ return [
90
+ ...warningsForSurface(validation, surface),
91
+ ...renderWarnings.map((warning) => ({ ...warning, surface })),
92
+ ].filter(({ path = '', message }) => {
93
+ const key = `${path}\u0000${message}`;
94
+ if (seen.has(key)) {
95
+ return false;
96
+ }
97
+ seen.add(key);
98
+ return true;
99
+ });
100
+ };
101
+ /** Renders `composition` on `surface`, collecting findings rather than throwing. */
102
+ export const renderSurfaceOutput = (runtime, surface, composition, validation, options = {}) => {
103
+ try {
104
+ const { renderWarnings, ...output } = render(runtime, surface, composition, options);
105
+ return {
106
+ ...output,
107
+ warnings: surfaceWarnings(validation, VALIDATION_SURFACE[surface], renderWarnings),
108
+ };
109
+ }
110
+ catch (error) {
111
+ return {
112
+ source: '',
113
+ language: 'text',
114
+ warnings: surfaceWarnings(validation, VALIDATION_SURFACE[surface]),
115
+ error: describeError(error),
116
+ };
117
+ }
118
+ };
119
+ //# sourceMappingURL=render_output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render_output.js","sourceRoot":"","sources":["../../src/surfaces/render_output.ts"],"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 {\n Composition,\n SurfaceName,\n ValidationResult,\n ValidationWarning,\n} from '@elastic/isomer-sdk';\nimport { warningsForSurface } from '@elastic/isomer-sdk';\nimport type { SlackBlock } from '@elastic/isomer-sdk/slack';\n\nimport type { StudioRuntime } from '../config';\nimport type { StudioSurface } from '../model/describe_runtime';\nimport { unmodeledSlackNotes } from '../model/slack_limits';\n\nexport interface SurfaceOutput {\n /** What the surface produced, as text. */\n source: string;\n language: 'html' | 'markdown' | 'text' | 'json';\n warnings: ValidationWarning[];\n error?: string;\n enhancementScript?: string;\n slack?: { text: string; blocks: SlackBlock[] };\n snapshot?: { css: string; html: string; width: number; height: number };\n}\n\ntype RenderWarning = Omit<ValidationWarning, 'surface'>;\n\ntype RenderedOutput = Omit<SurfaceOutput, 'warnings'> & {\n renderWarnings?: readonly RenderWarning[];\n};\n\nconst VALIDATION_SURFACE: Readonly<Record<StudioSurface, SurfaceName>> = {\n react: 'react',\n html: 'react',\n snapshot: 'snapshot',\n markdown: 'markdown',\n text: 'text',\n slack: 'slack',\n};\n\nconst COLLECT = { onValidationError: 'collect' } as const;\n\nconst describeError = (error: unknown): string =>\n error instanceof Error ? error.message : String(error);\n\n/** Options for {@link renderSurfaceOutput}. */\nexport interface SurfaceOutputOptions {\n /** `false` leaves out the composition's leading title. Defaults to `true`. */\n heading?: boolean | undefined;\n enhancements?: readonly string[] | undefined;\n}\n\nconst render = (\n runtime: StudioRuntime,\n surface: StudioSurface,\n composition: Composition,\n { heading, enhancements }: SurfaceOutputOptions\n): RenderedOutput => {\n const { surfaces } = runtime;\n const lead = heading === false ? { heading } : {};\n const collect = { ...COLLECT, ...lead };\n switch (surface) {\n case 'react':\n return {\n source: surfaces.html.render(composition, {\n css: 'separate',\n minify: false,\n scripts: 'host',\n ...(enhancements ? { enhancements } : {}),\n ...lead,\n }).html,\n language: 'html',\n };\n case 'html': {\n const result = surfaces.html.render(composition, {\n minify: false,\n ...lead,\n ...(enhancements ? { enhancements, scripts: 'host' as const } : {}),\n });\n return {\n source: result.html,\n ...(enhancements ? { enhancementScript: result.js } : {}),\n language: 'html',\n };\n }\n case 'markdown':\n return {\n source: surfaces.markdown.render(composition, collect),\n language: 'markdown',\n };\n case 'text':\n return {\n source: surfaces.text.render(composition, collect),\n language: 'text',\n };\n case 'slack': {\n const { text, blocks } = surfaces.slack.render(composition, collect);\n return {\n source: JSON.stringify({ text, blocks }, null, 2),\n language: 'json',\n slack: { text, blocks },\n renderWarnings: unmodeledSlackNotes(blocks).map((message) => ({\n message,\n })),\n };\n }\n case 'snapshot': {\n if (!surfaces.snapshot) {\n return {\n source: '',\n language: 'html',\n error: 'This runtime has no frames.',\n };\n }\n const { html, css, width, height, warnings } = surfaces.snapshot.render(\n composition,\n COLLECT\n );\n return {\n source: html,\n language: 'html',\n snapshot: { css, html, width, height },\n renderWarnings: warnings,\n };\n }\n }\n};\n\n/** Advisory findings for one surface, from validation and from the render itself, without duplicates. */\nconst surfaceWarnings = (\n validation: ValidationResult,\n surface: SurfaceName,\n renderWarnings: readonly RenderWarning[] = []\n): ValidationWarning[] => {\n const seen = new Set<string>();\n\n return [\n ...warningsForSurface(validation, surface),\n ...renderWarnings.map((warning) => ({ ...warning, surface })),\n ].filter(({ path = '', message }) => {\n const key = `${path}\\u0000${message}`;\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n return true;\n });\n};\n\n/** Renders `composition` on `surface`, collecting findings rather than throwing. */\nexport const renderSurfaceOutput = (\n runtime: StudioRuntime,\n surface: StudioSurface,\n composition: Composition,\n validation: ValidationResult,\n options: SurfaceOutputOptions = {}\n): SurfaceOutput => {\n try {\n const { renderWarnings, ...output } = render(\n runtime,\n surface,\n composition,\n options\n );\n return {\n ...output,\n warnings: surfaceWarnings(\n validation,\n VALIDATION_SURFACE[surface],\n renderWarnings\n ),\n };\n } catch (error) {\n return {\n source: '',\n language: 'text',\n warnings: surfaceWarnings(validation, VALIDATION_SURFACE[surface]),\n error: describeError(error),\n };\n }\n};\n"]}
@@ -0,0 +1,17 @@
1
+ import type { ReactNode } from 'react';
2
+ /** `fit` scales content down to its container, never up; a number is a fixed scale. */
3
+ export type PreviewZoom = 'fit' | number;
4
+ export interface ScaledPreviewProps {
5
+ zoom?: PreviewZoom | undefined;
6
+ /** With `fit`, also scales content down to this height. */
7
+ maxHeight?: number | undefined;
8
+ children: ReactNode;
9
+ }
10
+ /**
11
+ * Lays `children` out at the width the zoom implies and scales them to it.
12
+ *
13
+ * Fluid content fills the container at every zoom; content with a fixed
14
+ * width, such as a 1920px slide, keeps it and is scaled as a whole.
15
+ */
16
+ export declare const ScaledPreview: ({ zoom, maxHeight, children, }: ScaledPreviewProps) => import("@emotion/react/jsx-runtime").JSX.Element;
17
+ //# sourceMappingURL=scaled_preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaled_preview.d.ts","sourceRoot":"","sources":["../../src/surfaces/scaled_preview.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,uFAAuF;AACvF,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,MAAM,CAAC;AAEzC,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAC/B,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,QAAQ,EAAE,SAAS,CAAC;CACrB;AA8BD;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GAAI,gCAI3B,kBAAkB,qDA4EpB,CAAC"}
@@ -0,0 +1,74 @@
1
+ import { jsx as _jsx } from "@emotion/react/jsx-runtime";
2
+ import { useLayoutEffect, useRef, useState } from 'react';
3
+ import { css } from '@emotion/react';
4
+ const sameSize = (a, b) => a.width === b.width && a.height === b.height;
5
+ /** Grows with content wider than the layout width, which `ResizeObserver` reports where overflow alone is not. */
6
+ const contentBoxStyles = css `
7
+ width: fit-content;
8
+ min-width: 100%;
9
+ `;
10
+ const scaleFor = (zoom, available, content, maxHeight) => zoom === 'fit'
11
+ ? Math.min(1, available / content.width, maxHeight && content.height ? maxHeight / content.height : 1)
12
+ : zoom;
13
+ /**
14
+ * Lays `children` out at the width the zoom implies and scales them to it.
15
+ *
16
+ * Fluid content fills the container at every zoom; content with a fixed
17
+ * width, such as a 1920px slide, keeps it and is scaled as a whole.
18
+ */
19
+ export const ScaledPreview = ({ zoom = 'fit', maxHeight, children, }) => {
20
+ const outer = useRef(null);
21
+ const inner = useRef(null);
22
+ const contentBox = useRef(null);
23
+ const [available, setAvailable] = useState(0);
24
+ const [content, setContent] = useState({ width: 0, height: 0 });
25
+ useLayoutEffect(() => {
26
+ const outerElement = outer.current;
27
+ const innerElement = inner.current;
28
+ const contentElement = contentBox.current;
29
+ if (!outerElement || !innerElement || !contentElement) {
30
+ return;
31
+ }
32
+ const measure = () => {
33
+ setAvailable(outerElement.clientWidth);
34
+ const next = {
35
+ width: innerElement.scrollWidth,
36
+ height: innerElement.scrollHeight,
37
+ };
38
+ setContent((current) => (sameSize(current, next) ? current : next));
39
+ };
40
+ measure();
41
+ if (typeof ResizeObserver === 'undefined') {
42
+ return;
43
+ }
44
+ const observer = new ResizeObserver(measure);
45
+ observer.observe(outerElement);
46
+ observer.observe(contentElement);
47
+ return () => observer.disconnect();
48
+ }, []);
49
+ const isMeasured = available > 0 && content.width > 0;
50
+ const layoutWidth = zoom === 'fit' ? available : available / zoom;
51
+ const scale = isMeasured ? scaleFor(zoom, available, content, maxHeight) : 1;
52
+ const width = Math.max(content.width, layoutWidth);
53
+ return (_jsx("div", { ref: outer, css: css `
54
+ overflow-x: auto;
55
+ `, children: _jsx("div", { css: isMeasured
56
+ ? css `
57
+ position: relative;
58
+ overflow: hidden;
59
+ margin-inline: auto;
60
+ width: ${width * scale}px;
61
+ height: ${content.height * scale}px;
62
+ `
63
+ : undefined, children: _jsx("div", { ref: inner, css: isMeasured
64
+ ? css `
65
+ position: absolute;
66
+ top: 0;
67
+ left: 0;
68
+ width: ${layoutWidth}px;
69
+ transform: scale(${scale});
70
+ transform-origin: 0 0;
71
+ `
72
+ : undefined, children: _jsx("div", { ref: contentBox, css: contentBoxStyles, children: children }) }) }) }));
73
+ };
74
+ //# sourceMappingURL=scaled_preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaled_preview.js","sourceRoot":"","sources":["../../src/surfaces/scaled_preview.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, { useLayoutEffect, useRef, useState } from 'react';\nimport { css } from '@emotion/react';\n\n/** `fit` scales content down to its container, never up; a number is a fixed scale. */\nexport type PreviewZoom = 'fit' | number;\n\nexport interface ScaledPreviewProps {\n zoom?: PreviewZoom | undefined;\n /** With `fit`, also scales content down to this height. */\n maxHeight?: number | undefined;\n children: ReactNode;\n}\n\ninterface Size {\n width: number;\n height: number;\n}\n\nconst sameSize = (a: Size, b: Size) =>\n a.width === b.width && a.height === b.height;\n\n/** Grows with content wider than the layout width, which `ResizeObserver` reports where overflow alone is not. */\nconst contentBoxStyles = css`\n width: fit-content;\n min-width: 100%;\n`;\n\nconst scaleFor = (\n zoom: PreviewZoom,\n available: number,\n content: Size,\n maxHeight: number | undefined\n): number =>\n zoom === 'fit'\n ? Math.min(\n 1,\n available / content.width,\n maxHeight && content.height ? maxHeight / content.height : 1\n )\n : zoom;\n\n/**\n * Lays `children` out at the width the zoom implies and scales them to it.\n *\n * Fluid content fills the container at every zoom; content with a fixed\n * width, such as a 1920px slide, keeps it and is scaled as a whole.\n */\nexport const ScaledPreview = ({\n zoom = 'fit',\n maxHeight,\n children,\n}: ScaledPreviewProps) => {\n const outer = useRef<HTMLDivElement>(null);\n const inner = useRef<HTMLDivElement>(null);\n const contentBox = useRef<HTMLDivElement>(null);\n const [available, setAvailable] = useState(0);\n const [content, setContent] = useState<Size>({ width: 0, height: 0 });\n\n useLayoutEffect(() => {\n const outerElement = outer.current;\n const innerElement = inner.current;\n const contentElement = contentBox.current;\n if (!outerElement || !innerElement || !contentElement) {\n return;\n }\n const measure = () => {\n setAvailable(outerElement.clientWidth);\n const next = {\n width: innerElement.scrollWidth,\n height: innerElement.scrollHeight,\n };\n setContent((current) => (sameSize(current, next) ? current : next));\n };\n measure();\n if (typeof ResizeObserver === 'undefined') {\n return;\n }\n const observer = new ResizeObserver(measure);\n observer.observe(outerElement);\n observer.observe(contentElement);\n return () => observer.disconnect();\n }, []);\n\n const isMeasured = available > 0 && content.width > 0;\n const layoutWidth = zoom === 'fit' ? available : available / zoom;\n const scale = isMeasured ? scaleFor(zoom, available, content, maxHeight) : 1;\n const width = Math.max(content.width, layoutWidth);\n\n return (\n <div\n ref={outer}\n css={css`\n overflow-x: auto;\n `}>\n <div\n css={\n isMeasured\n ? css`\n position: relative;\n overflow: hidden;\n margin-inline: auto;\n width: ${width * scale}px;\n height: ${content.height * scale}px;\n `\n : undefined\n }>\n <div\n ref={inner}\n css={\n isMeasured\n ? css`\n position: absolute;\n top: 0;\n left: 0;\n width: ${layoutWidth}px;\n transform: scale(${scale});\n transform-origin: 0 0;\n `\n : undefined\n }>\n <div ref={contentBox} css={contentBoxStyles}>\n {children}\n </div>\n </div>\n </div>\n </div>\n );\n};\n"]}
@@ -0,0 +1,8 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface ShadowRootHostProps {
3
+ children: (root: ShadowRoot) => ReactNode;
4
+ title?: string | undefined;
5
+ }
6
+ /** Renders `children` into an open shadow root, isolating them from the page's styles and navigation. */
7
+ export declare const ShadowRootHost: ({ children, title }: ShadowRootHostProps) => import("@emotion/react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=shadow_root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shadow_root.d.ts","sourceRoot":"","sources":["../../src/surfaces/shadow_root.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS,CAAC;IAC1C,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAuBD,yGAAyG;AACzG,eAAO,MAAM,cAAc,GAAI,qBAAqB,mBAAmB,qDA8BtE,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { jsx as _jsx } from "@emotion/react/jsx-runtime";
2
+ import { useEffect, useLayoutEffect, useRef, useState } from 'react';
3
+ import { createPortal } from 'react-dom';
4
+ /** Opens a previewed link in a new tab so following it cannot unload Studio; in-page fragments do nothing. */
5
+ const containLinks = (event) => {
6
+ const { target, defaultPrevented } = event;
7
+ const link = target instanceof Element ? target.closest('a[href], area[href]') : null;
8
+ if (defaultPrevented || !link) {
9
+ return;
10
+ }
11
+ event.preventDefault();
12
+ const href = link.getAttribute('href') ?? '';
13
+ if (!href.startsWith('#')) {
14
+ window.open(new URL(href, document.baseURI).href, '_blank', 'noopener,noreferrer');
15
+ }
16
+ };
17
+ const containSubmit = (event) => event.preventDefault();
18
+ /** Renders `children` into an open shadow root, isolating them from the page's styles and navigation. */
19
+ export const ShadowRootHost = ({ children, title }) => {
20
+ const host = useRef(null);
21
+ const [root, setRoot] = useState();
22
+ useLayoutEffect(() => {
23
+ if (host.current) {
24
+ setRoot(host.current.shadowRoot ?? host.current.attachShadow({ mode: 'open' }));
25
+ }
26
+ }, []);
27
+ // Registered once the portal has mounted, so React's listener on the root runs first and its handlers can cancel navigation.
28
+ useEffect(() => {
29
+ if (!root) {
30
+ return;
31
+ }
32
+ root.addEventListener('click', containLinks);
33
+ root.addEventListener('submit', containSubmit);
34
+ return () => {
35
+ root.removeEventListener('click', containLinks);
36
+ root.removeEventListener('submit', containSubmit);
37
+ };
38
+ }, [root]);
39
+ return (_jsx("div", { ref: host, title: title, children: root ? createPortal(children(root), root) : null }));
40
+ };
41
+ //# sourceMappingURL=shadow_root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shadow_root.js","sourceRoot":"","sources":["../../src/surfaces/shadow_root.tsx"],"names":[],"mappings":";AAQA,OAAc,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAOzC,8GAA8G;AAC9G,MAAM,YAAY,GAAG,CAAC,KAAY,EAAE,EAAE;IACpC,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAC;IAC3C,MAAM,IAAI,GACR,MAAM,YAAY,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3E,IAAI,gBAAgB,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO;IACT,CAAC;IACD,KAAK,CAAC,cAAc,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC7C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CACT,IAAI,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EACpC,QAAQ,EACR,qBAAqB,CACtB,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,KAAY,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;AAE/D,yGAAyG;AACzG,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAuB,EAAE,EAAE;IACzE,MAAM,IAAI,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAC1C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,EAAc,CAAC;IAE/C,eAAe,CAAC,GAAG,EAAE;QACnB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CACL,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CACvE,CAAC;QACJ,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,6HAA6H;IAC7H,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC7C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAC/C,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAChD,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QACpD,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,OAAO,CACL,cAAK,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,YACzB,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,GAC7C,CACP,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 type { ReactNode } from 'react';\nimport React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport interface ShadowRootHostProps {\n children: (root: ShadowRoot) => ReactNode;\n title?: string | undefined;\n}\n\n/** Opens a previewed link in a new tab so following it cannot unload Studio; in-page fragments do nothing. */\nconst containLinks = (event: Event) => {\n const { target, defaultPrevented } = event;\n const link =\n target instanceof Element ? target.closest('a[href], area[href]') : null;\n if (defaultPrevented || !link) {\n return;\n }\n event.preventDefault();\n const href = link.getAttribute('href') ?? '';\n if (!href.startsWith('#')) {\n window.open(\n new URL(href, document.baseURI).href,\n '_blank',\n 'noopener,noreferrer'\n );\n }\n};\n\nconst containSubmit = (event: Event) => event.preventDefault();\n\n/** Renders `children` into an open shadow root, isolating them from the page's styles and navigation. */\nexport const ShadowRootHost = ({ children, title }: ShadowRootHostProps) => {\n const host = useRef<HTMLDivElement>(null);\n const [root, setRoot] = useState<ShadowRoot>();\n\n useLayoutEffect(() => {\n if (host.current) {\n setRoot(\n host.current.shadowRoot ?? host.current.attachShadow({ mode: 'open' })\n );\n }\n }, []);\n\n // Registered once the portal has mounted, so React's listener on the root runs first and its handlers can cancel navigation.\n useEffect(() => {\n if (!root) {\n return;\n }\n root.addEventListener('click', containLinks);\n root.addEventListener('submit', containSubmit);\n return () => {\n root.removeEventListener('click', containLinks);\n root.removeEventListener('submit', containSubmit);\n };\n }, [root]);\n\n return (\n <div ref={host} title={title}>\n {root ? createPortal(children(root), root) : null}\n </div>\n );\n};\n"]}
@@ -0,0 +1,12 @@
1
+ import type { SlackBlock } from '@elastic/isomer-sdk/slack';
2
+ /**
3
+ * The message as Slack would draw it, via `slack-blocks-to-jsx`.
4
+ *
5
+ * Its stylesheet, `slack-blocks-to-jsx/dist/style.css`, is the host's to load.
6
+ */
7
+ export declare const SlackSurface: ({ blocks }: {
8
+ blocks: readonly SlackBlock[];
9
+ }) => import("@emotion/react/jsx-runtime").JSX.Element;
10
+ /** Opens the blocks in Slack's Block Kit Builder. */
11
+ export declare const blockKitBuilderUrl: (blocks: readonly SlackBlock[]) => string;
12
+ //# sourceMappingURL=slack_surface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack_surface.d.ts","sourceRoot":"","sources":["../../src/surfaces/slack_surface.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAa5D;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,YAAY;IAAE,MAAM,EAAE,SAAS,UAAU,EAAE,CAAA;CAAE,qDAqBzE,CAAC;AAEF,qDAAqD;AACrD,eAAO,MAAM,kBAAkB,GAAI,QAAQ,SAAS,UAAU,EAAE,KAAG,MAC0B,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx } from "@emotion/react/jsx-runtime";
2
+ import { useEuiTheme } from '@elastic/eui';
3
+ import { css } from '@emotion/react';
4
+ import { Message } from 'slack-blocks-to-jsx';
5
+ const LOGO = `data:image/svg+xml,${encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><rect width="36" height="36" rx="6" fill="#0B64DD"/><text x="18" y="24" font-family="Inter, Arial, sans-serif" font-size="16" font-weight="700" fill="#fff" text-anchor="middle">I</text></svg>')}`;
6
+ /** Both type the same Block Kit JSON, but disagree on which fields of some elements are optional. */
7
+ const toMessageBlocks = (blocks) => [...blocks];
8
+ /**
9
+ * The message as Slack would draw it, via `slack-blocks-to-jsx`.
10
+ *
11
+ * Its stylesheet, `slack-blocks-to-jsx/dist/style.css`, is the host's to load.
12
+ */
13
+ export const SlackSurface = ({ blocks }) => {
14
+ const { colorMode, euiTheme } = useEuiTheme();
15
+ return (_jsx("div", { css: css `
16
+ padding: ${euiTheme.size.m};
17
+ /* Matches slack-blocks-to-jsx's message canvas. */
18
+ background: ${colorMode === 'DARK' ? 'rgb(26, 29, 33)' : '#fff'};
19
+ #slack_blocks_to_jsx .text-base {
20
+ font-size: 16px;
21
+ line-height: 1.5;
22
+ }
23
+ `, children: _jsx(Message, { blocks: toMessageBlocks(blocks), name: "Isomer", logo: LOGO, theme: colorMode === 'DARK' ? 'dark' : 'light' }) }));
24
+ };
25
+ /** Opens the blocks in Slack's Block Kit Builder. */
26
+ export const blockKitBuilderUrl = (blocks) => `https://app.slack.com/block-kit-builder#${encodeURIComponent(JSON.stringify({ blocks }))}`;
27
+ //# sourceMappingURL=slack_surface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack_surface.js","sourceRoot":"","sources":["../../src/surfaces/slack_surface.tsx"],"names":[],"mappings":";AAQA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAErC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,MAAM,IAAI,GAAG,sBAAsB,kBAAkB,CACnD,6PAA6P,CAC9P,EAAE,CAAC;AAEJ,qGAAqG;AACrG,MAAM,eAAe,GAAG,CAAC,MAA6B,EAAE,EAAE,CACxD,CAAC,GAAG,MAAM,CAAuB,CAAC;AAEpC;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAE,MAAM,EAAqC,EAAE,EAAE;IAC5E,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,WAAW,EAAE,CAAC;IAC9C,OAAO,CACL,cACE,GAAG,EAAE,GAAG,CAAA;mBACK,QAAQ,CAAC,IAAI,CAAC,CAAC;;sBAEZ,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM;;;;;OAKhE,YACD,KAAC,OAAO,IACN,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,EAC/B,IAAI,EAAC,QAAQ,EACb,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,GAC9C,GACE,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,qDAAqD;AACrD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAA6B,EAAU,EAAE,CAC1E,2CAA2C,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,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 from 'react';\nimport { useEuiTheme } from '@elastic/eui';\nimport type { SlackBlock } from '@elastic/isomer-sdk/slack';\nimport { css } from '@emotion/react';\nimport type { Block } from 'slack-blocks-to-jsx';\nimport { Message } from 'slack-blocks-to-jsx';\n\nconst LOGO = `data:image/svg+xml,${encodeURIComponent(\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 36 36\"><rect width=\"36\" height=\"36\" rx=\"6\" fill=\"#0B64DD\"/><text x=\"18\" y=\"24\" font-family=\"Inter, Arial, sans-serif\" font-size=\"16\" font-weight=\"700\" fill=\"#fff\" text-anchor=\"middle\">I</text></svg>'\n)}`;\n\n/** Both type the same Block Kit JSON, but disagree on which fields of some elements are optional. */\nconst toMessageBlocks = (blocks: readonly SlackBlock[]) =>\n [...blocks] as unknown as Block[];\n\n/**\n * The message as Slack would draw it, via `slack-blocks-to-jsx`.\n *\n * Its stylesheet, `slack-blocks-to-jsx/dist/style.css`, is the host's to load.\n */\nexport const SlackSurface = ({ blocks }: { blocks: readonly SlackBlock[] }) => {\n const { colorMode, euiTheme } = useEuiTheme();\n return (\n <div\n css={css`\n padding: ${euiTheme.size.m};\n /* Matches slack-blocks-to-jsx's message canvas. */\n background: ${colorMode === 'DARK' ? 'rgb(26, 29, 33)' : '#fff'};\n #slack_blocks_to_jsx .text-base {\n font-size: 16px;\n line-height: 1.5;\n }\n `}>\n <Message\n blocks={toMessageBlocks(blocks)}\n name=\"Isomer\"\n logo={LOGO}\n theme={colorMode === 'DARK' ? 'dark' : 'light'}\n />\n </div>\n );\n};\n\n/** Opens the blocks in Slack's Block Kit Builder. */\nexport const blockKitBuilderUrl = (blocks: readonly SlackBlock[]): string =>\n `https://app.slack.com/block-kit-builder#${encodeURIComponent(JSON.stringify({ blocks }))}`;\n"]}
@@ -0,0 +1,6 @@
1
+ /** The `snapshot` surface's frame, laid out against its own stylesheet in a sandboxed frame. */
2
+ export declare const SnapshotSurface: ({ html, stylesheet, }: {
3
+ html: string;
4
+ stylesheet: string;
5
+ }) => import("@emotion/react/jsx-runtime").JSX.Element;
6
+ //# sourceMappingURL=snapshot_surface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot_surface.d.ts","sourceRoot":"","sources":["../../src/surfaces/snapshot_surface.tsx"],"names":[],"mappings":"AAWA,gGAAgG;AAChG,eAAO,MAAM,eAAe,GAAI,uBAG7B;IACD,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB,qDAKA,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx } from "@emotion/react/jsx-runtime";
2
+ import { HtmlSurface } from './html_surface.js';
3
+ /** The `snapshot` surface's frame, laid out against its own stylesheet in a sandboxed frame. */
4
+ export const SnapshotSurface = ({ html, stylesheet, }) => (_jsx(HtmlSurface, { html: `<style>${stylesheet}</style>${html}`, title: "Snapshot preview" }));
5
+ //# sourceMappingURL=snapshot_surface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot_surface.js","sourceRoot":"","sources":["../../src/surfaces/snapshot_surface.tsx"],"names":[],"mappings":";AASA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,gGAAgG;AAChG,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAC9B,IAAI,EACJ,UAAU,GAIX,EAAE,EAAE,CAAC,CACJ,KAAC,WAAW,IACV,IAAI,EAAE,UAAU,UAAU,WAAW,IAAI,EAAE,EAC3C,KAAK,EAAC,kBAAkB,GACxB,CACH,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 from 'react';\n\nimport { HtmlSurface } from './html_surface';\n\n/** The `snapshot` surface's frame, laid out against its own stylesheet in a sandboxed frame. */\nexport const SnapshotSurface = ({\n html,\n stylesheet,\n}: {\n html: string;\n stylesheet: string;\n}) => (\n <HtmlSurface\n html={`<style>${stylesheet}</style>${html}`}\n title=\"Snapshot preview\"\n />\n);\n"]}
@@ -0,0 +1,19 @@
1
+ import type { Composition, ValidationResult } from '@elastic/isomer-sdk';
2
+ import type { PreviewZoom } from './scaled_preview.js';
3
+ import type { SurfaceView } from './surface_preview.js';
4
+ import type { PreviewSurface } from './surface_select.js';
5
+ interface RenderProps {
6
+ composition: Composition;
7
+ validation: ValidationResult;
8
+ view: SurfaceView;
9
+ zoom: PreviewZoom;
10
+ enhancements?: readonly string[] | undefined;
11
+ errorHref?: string | undefined;
12
+ }
13
+ export interface SurfaceBoardProps extends RenderProps {
14
+ surfaces: readonly PreviewSurface[];
15
+ }
16
+ /** One surface at full size, or several in a vertical list. */
17
+ export declare const SurfaceBoard: ({ surfaces, composition, validation, view, zoom, errorHref, }: SurfaceBoardProps) => import("@emotion/react/jsx-runtime").JSX.Element;
18
+ export {};
19
+ //# sourceMappingURL=surface_board.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface_board.d.ts","sourceRoot":"","sources":["../../src/surfaces/surface_board.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAUzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AASvD,UAAU,WAAW;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,WAAW,CAAC;IAClB,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7C,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAsJD,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;CACrC;AAMD,+DAA+D;AAC/D,eAAO,MAAM,YAAY,GAAI,+DAO1B,iBAAiB,qDAgInB,CAAC"}
@@ -0,0 +1,128 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
2
+ import { useMemo, useState } from 'react';
3
+ import { EuiIcon, EuiText, useEuiTheme } from '@elastic/eui';
4
+ import { createChildNodeWalker } from '@elastic/isomer-sdk';
5
+ import { css } from '@emotion/react';
6
+ import { useStudio } from '../studio_context.js';
7
+ import { applicableEnhancements } from './applicable_enhancements.js';
8
+ import { EnhancementSelect } from './enhancement_select.js';
9
+ import { PngSurface } from './png_surface.js';
10
+ import { SurfacePreview } from './surface_preview.js';
11
+ import { isVisualSurface, outputLabel, PREVIEW_ICONS, PREVIEW_LABELS, SURFACE_NOTES, } from './surface_select.js';
12
+ const SurfaceRender = ({ surface, composition, validation, view, zoom, errorHref, frameCss, enhancements, }) => {
13
+ const { rasterizePng } = useStudio();
14
+ if (surface !== 'png') {
15
+ return (_jsx(SurfacePreview, { surface,
16
+ composition,
17
+ validation,
18
+ view,
19
+ zoom,
20
+ frameCss,
21
+ enhancements,
22
+ errorHref }));
23
+ }
24
+ return rasterizePng ? (_jsx(PngSurface, { composition, rasterizePng, zoom, frameCss })) : null;
25
+ };
26
+ const SurfaceCard = ({ surface, composition, validation, view, controls, title, note, enhancements, errorHref, zoom = 'fit', fullSize = false, }) => {
27
+ const { euiTheme } = useEuiTheme();
28
+ const label = title ?? PREVIEW_LABELS[surface];
29
+ const clipsRender = view === 'render' && isVisualSurface(surface);
30
+ return (_jsxs("section", { "aria-label": `${label} preview`, css: css `
31
+ display: flex;
32
+ flex-direction: column;
33
+ min-width: 0;
34
+ border: ${euiTheme.border.thin};
35
+ border-radius: ${euiTheme.border.radius.medium};
36
+ overflow: hidden;
37
+ `, children: [_jsxs("div", { css: css `
38
+ display: flex;
39
+ flex-wrap: wrap;
40
+ align-items: center;
41
+ gap: ${euiTheme.size.s};
42
+ padding: ${euiTheme.size.s} ${euiTheme.size.m};
43
+ background: ${euiTheme.colors.backgroundBasePlain};
44
+ border-bottom: ${euiTheme.border.thin};
45
+ `, children: [_jsx(EuiIcon, { type: PREVIEW_ICONS[surface], size: "m", "aria-hidden": true }), _jsx(EuiText, { size: "xs", children: _jsx("h3", { css: css `
46
+ margin: 0;
47
+ font-size: inherit;
48
+ line-height: inherit;
49
+ `, children: _jsx("strong", { children: label }) }) }), _jsx(EuiText, { size: "xs", color: "subdued", css: css `
50
+ flex: 1 1 100%;
51
+ order: 1;
52
+ min-width: 0;
53
+ overflow: hidden;
54
+ text-overflow: ellipsis;
55
+ white-space: nowrap;
56
+ `, title: note ?? SURFACE_NOTES[surface], children: note ?? SURFACE_NOTES[surface] }), controls ? (_jsx("div", { css: css `
57
+ margin-inline-start: auto;
58
+ `, children: controls })) : null] }), _jsx(SurfaceRender, { surface,
59
+ composition,
60
+ validation,
61
+ view,
62
+ enhancements,
63
+ zoom,
64
+ errorHref, frameCss: fullSize
65
+ ? undefined
66
+ : css `
67
+ ${isVisualSurface(surface)
68
+ ? css `
69
+ aspect-ratio: 16 / 9;
70
+ `
71
+ : css `
72
+ min-height: 16rem;
73
+ max-height: 30rem;
74
+ `}
75
+ overflow: ${clipsRender ? 'hidden' : 'auto'};
76
+ background: ${euiTheme.colors.backgroundBaseSubdued};
77
+ ` }, `${surface}-${enhancements?.join(',') ?? ''}`)] }));
78
+ };
79
+ const isBrowserSurface = (surface) => surface === 'react' || surface === 'html' || surface === 'snapshot';
80
+ /** One surface at full size, or several in a vertical list. */
81
+ export const SurfaceBoard = ({ surfaces, composition, validation, view, zoom, errorHref, }) => {
82
+ const { euiTheme } = useEuiTheme();
83
+ const { runtime, createReactContext } = useStudio();
84
+ const [selectedEnhancements, setSelectedEnhancements] = useState([]);
85
+ const [only] = surfaces;
86
+ const browserSurfaces = surfaces.filter(isBrowserSurface);
87
+ const activeSurface = browserSurfaces.includes('html')
88
+ ? 'html'
89
+ : browserSurfaces[0];
90
+ const walk = useMemo(() => createChildNodeWalker(runtime.primitives), [runtime.primitives]);
91
+ const applicable = useMemo(() => applicableEnhancements(runtime.enhancements ?? [], composition.body, walk), [runtime.enhancements, composition.body, walk]);
92
+ const enhancementIds = applicable.map(({ id }) => id);
93
+ const canEnhance = (activeSurface === 'html' ||
94
+ (activeSurface === 'react' && Boolean(createReactContext))) &&
95
+ enhancementIds.length > 0;
96
+ const enabled = enhancementIds.filter((id) => selectedEnhancements.includes(id));
97
+ const enhancements = canEnhance && enabled.length ? enabled : undefined;
98
+ const visualSurfaces = surfaces.filter(isVisualSurface);
99
+ const otherSurfaces = surfaces.filter((surface) => !isVisualSurface(surface));
100
+ if (surfaces.length === 1 && only && !isBrowserSurface(only)) {
101
+ return (_jsxs("section", { "aria-labelledby": `surface-heading-${only}`, children: [_jsxs("h2", { id: `surface-heading-${only}`, css: css `
102
+ position: absolute;
103
+ width: 1px;
104
+ height: 1px;
105
+ padding: 0;
106
+ margin: -1px;
107
+ overflow: hidden;
108
+ clip: rect(0, 0, 0, 0);
109
+ white-space: nowrap;
110
+ border: 0;
111
+ `, children: [PREVIEW_LABELS[only], " preview"] }), _jsx(SurfaceRender, { surface: only, composition, validation, view, zoom, errorHref })] }));
112
+ }
113
+ const renderCards = (items) => items.map((surface) => (_jsx(SurfaceCard, { surface, composition, validation, view, errorHref }, surface)));
114
+ return (_jsxs("div", { children: [visualSurfaces.length ? (_jsx("section", { "aria-label": "Visual output previews", css: css `
115
+ margin-block-end: ${otherSurfaces.length ? euiTheme.size.m : 0};
116
+ `, children: _jsxs("div", { role: "region", "aria-label": "Visual preview grid", css: css `
117
+ display: grid;
118
+ grid-template-columns: minmax(0, 1fr);
119
+ gap: ${euiTheme.size.base};
120
+ `, children: [activeSurface ? (_jsx(SurfaceCard, { surface: activeSurface, title: outputLabel(activeSurface), note: activeSurface === 'html'
121
+ ? 'HTML / React / Snapshot'
122
+ : undefined, composition, validation, view, enhancements, errorHref, zoom: surfaces.length === 1 ? zoom : 'fit', fullSize: surfaces.length === 1, controls: _jsx(EnhancementSelect, { definitions: applicable, selected: enabled, disabled: !canEnhance || view !== 'render', onChange: setSelectedEnhancements }) })) : null, renderCards(visualSurfaces.filter((surface) => !isBrowserSurface(surface)))] }) })) : null, otherSurfaces.length ? (_jsx("section", { "aria-label": "Other output previews", children: _jsx("div", { css: css `
123
+ display: grid;
124
+ grid-template-columns: minmax(0, 1fr);
125
+ gap: ${euiTheme.size.base};
126
+ `, children: renderCards(otherSurfaces) }) })) : null] }));
127
+ };
128
+ //# sourceMappingURL=surface_board.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface_board.js","sourceRoot":"","sources":["../../src/surfaces/surface_board.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, { useMemo, useState } from 'react';\nimport { EuiIcon, EuiText, useEuiTheme } from '@elastic/eui';\nimport type { Composition, ValidationResult } from '@elastic/isomer-sdk';\nimport { createChildNodeWalker } from '@elastic/isomer-sdk';\nimport type { SerializedStyles } from '@emotion/react';\nimport { css } from '@emotion/react';\n\nimport { useStudio } from '../studio_context';\n\nimport { applicableEnhancements } from './applicable_enhancements';\nimport { EnhancementSelect } from './enhancement_select';\nimport { PngSurface } from './png_surface';\nimport type { PreviewZoom } from './scaled_preview';\nimport type { SurfaceView } from './surface_preview';\nimport { SurfacePreview } from './surface_preview';\nimport type { PreviewSurface } from './surface_select';\nimport {\n isVisualSurface,\n outputLabel,\n PREVIEW_ICONS,\n PREVIEW_LABELS,\n SURFACE_NOTES,\n} from './surface_select';\n\ninterface RenderProps {\n composition: Composition;\n validation: ValidationResult;\n view: SurfaceView;\n zoom: PreviewZoom;\n enhancements?: readonly string[] | undefined;\n errorHref?: string | undefined;\n}\n\nconst SurfaceRender = ({\n surface,\n composition,\n validation,\n view,\n zoom,\n errorHref,\n frameCss,\n enhancements,\n}: RenderProps & {\n surface: PreviewSurface;\n frameCss?: SerializedStyles | undefined;\n}) => {\n const { rasterizePng } = useStudio();\n if (surface !== 'png') {\n return (\n <SurfacePreview\n {...{\n surface,\n composition,\n validation,\n view,\n zoom,\n frameCss,\n enhancements,\n errorHref,\n }}\n />\n );\n }\n return rasterizePng ? (\n <PngSurface {...{ composition, rasterizePng, zoom, frameCss }} />\n ) : null;\n};\n\nconst SurfaceCard = ({\n surface,\n composition,\n validation,\n view,\n controls,\n title,\n note,\n enhancements,\n errorHref,\n zoom = 'fit',\n fullSize = false,\n}: Omit<RenderProps, 'zoom'> & {\n surface: PreviewSurface;\n controls?: ReactNode;\n title?: string;\n note?: string | undefined;\n zoom?: PreviewZoom;\n fullSize?: boolean;\n}) => {\n const { euiTheme } = useEuiTheme();\n const label = title ?? PREVIEW_LABELS[surface];\n const clipsRender = view === 'render' && isVisualSurface(surface);\n\n return (\n <section\n aria-label={`${label} preview`}\n css={css`\n display: flex;\n flex-direction: column;\n min-width: 0;\n border: ${euiTheme.border.thin};\n border-radius: ${euiTheme.border.radius.medium};\n overflow: hidden;\n `}>\n <div\n css={css`\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: ${euiTheme.size.s};\n padding: ${euiTheme.size.s} ${euiTheme.size.m};\n background: ${euiTheme.colors.backgroundBasePlain};\n border-bottom: ${euiTheme.border.thin};\n `}>\n <EuiIcon type={PREVIEW_ICONS[surface]} size=\"m\" aria-hidden={true} />\n <EuiText size=\"xs\">\n <h3\n css={css`\n margin: 0;\n font-size: inherit;\n line-height: inherit;\n `}>\n <strong>{label}</strong>\n </h3>\n </EuiText>\n <EuiText\n size=\"xs\"\n color=\"subdued\"\n css={css`\n flex: 1 1 100%;\n order: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n `}\n title={note ?? SURFACE_NOTES[surface]}>\n {note ?? SURFACE_NOTES[surface]}\n </EuiText>\n {controls ? (\n <div\n css={css`\n margin-inline-start: auto;\n `}>\n {controls}\n </div>\n ) : null}\n </div>\n <SurfaceRender\n key={`${surface}-${enhancements?.join(',') ?? ''}`}\n {...{\n surface,\n composition,\n validation,\n view,\n enhancements,\n zoom,\n errorHref,\n }}\n frameCss={\n fullSize\n ? undefined\n : css`\n ${\n isVisualSurface(surface)\n ? css`\n aspect-ratio: 16 / 9;\n `\n : css`\n min-height: 16rem;\n max-height: 30rem;\n `\n }\n overflow: ${clipsRender ? 'hidden' : 'auto'};\n background: ${euiTheme.colors.backgroundBaseSubdued};\n `\n }\n />\n </section>\n );\n};\n\nexport interface SurfaceBoardProps extends RenderProps {\n surfaces: readonly PreviewSurface[];\n}\n\ntype BrowserSurface = 'react' | 'html' | 'snapshot';\nconst isBrowserSurface = (surface: PreviewSurface): surface is BrowserSurface =>\n surface === 'react' || surface === 'html' || surface === 'snapshot';\n\n/** One surface at full size, or several in a vertical list. */\nexport const SurfaceBoard = ({\n surfaces,\n composition,\n validation,\n view,\n zoom,\n errorHref,\n}: SurfaceBoardProps) => {\n const { euiTheme } = useEuiTheme();\n const { runtime, createReactContext } = useStudio();\n const [selectedEnhancements, setSelectedEnhancements] = useState<string[]>(\n []\n );\n const [only] = surfaces;\n const browserSurfaces = surfaces.filter(isBrowserSurface);\n const activeSurface = browserSurfaces.includes('html')\n ? 'html'\n : browserSurfaces[0];\n const walk = useMemo(\n () => createChildNodeWalker(runtime.primitives),\n [runtime.primitives]\n );\n const applicable = useMemo(\n () =>\n applicableEnhancements(\n runtime.enhancements ?? [],\n composition.body,\n walk\n ),\n [runtime.enhancements, composition.body, walk]\n );\n const enhancementIds = applicable.map(({ id }) => id);\n const canEnhance =\n (activeSurface === 'html' ||\n (activeSurface === 'react' && Boolean(createReactContext))) &&\n enhancementIds.length > 0;\n const enabled = enhancementIds.filter((id) =>\n selectedEnhancements.includes(id)\n );\n const enhancements = canEnhance && enabled.length ? enabled : undefined;\n const visualSurfaces = surfaces.filter(isVisualSurface);\n const otherSurfaces = surfaces.filter((surface) => !isVisualSurface(surface));\n\n if (surfaces.length === 1 && only && !isBrowserSurface(only)) {\n return (\n <section aria-labelledby={`surface-heading-${only}`}>\n <h2\n id={`surface-heading-${only}`}\n css={css`\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n `}>\n {PREVIEW_LABELS[only]} preview\n </h2>\n <SurfaceRender\n surface={only}\n {...{ composition, validation, view, zoom, errorHref }}\n />\n </section>\n );\n }\n\n const renderCards = (items: readonly PreviewSurface[]) =>\n items.map((surface) => (\n <SurfaceCard\n key={surface}\n {...{ surface, composition, validation, view, errorHref }}\n />\n ));\n\n return (\n <div>\n {visualSurfaces.length ? (\n <section\n aria-label=\"Visual output previews\"\n css={css`\n margin-block-end: ${otherSurfaces.length ? euiTheme.size.m : 0};\n `}>\n <div\n role=\"region\"\n aria-label=\"Visual preview grid\"\n css={css`\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: ${euiTheme.size.base};\n `}>\n {activeSurface ? (\n <SurfaceCard\n surface={activeSurface}\n title={outputLabel(activeSurface)}\n note={\n activeSurface === 'html'\n ? 'HTML / React / Snapshot'\n : undefined\n }\n {...{ composition, validation, view, enhancements, errorHref }}\n zoom={surfaces.length === 1 ? zoom : 'fit'}\n fullSize={surfaces.length === 1}\n controls={\n <EnhancementSelect\n definitions={applicable}\n selected={enabled}\n disabled={!canEnhance || view !== 'render'}\n onChange={setSelectedEnhancements}\n />\n }\n />\n ) : null}\n {renderCards(\n visualSurfaces.filter((surface) => !isBrowserSurface(surface))\n )}\n </div>\n </section>\n ) : null}\n {otherSurfaces.length ? (\n <section aria-label=\"Other output previews\">\n <div\n css={css`\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: ${euiTheme.size.base};\n `}>\n {renderCards(otherSurfaces)}\n </div>\n </section>\n ) : null}\n </div>\n );\n};\n"]}
@@ -0,0 +1,8 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { SerializedStyles } from '@emotion/react';
3
+ /** Holds a surface's render, apart from its diagnostics, so a clipping frame never hides them. */
4
+ export declare const SurfaceFrame: ({ frameCss, children, }: {
5
+ frameCss?: SerializedStyles | undefined;
6
+ children: ReactNode;
7
+ }) => import("@emotion/react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=surface_frame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface_frame.d.ts","sourceRoot":"","sources":["../../src/surfaces/surface_frame.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,kGAAkG;AAClG,eAAO,MAAM,YAAY,GAAI,yBAG1B;IACD,QAAQ,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACxC,QAAQ,EAAE,SAAS,CAAC;CACrB,qDAOE,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { jsx as _jsx, Fragment as _Fragment } from "@emotion/react/jsx-runtime";
2
+ /** Holds a surface's render, apart from its diagnostics, so a clipping frame never hides them. */
3
+ export const SurfaceFrame = ({ frameCss, children, }) => frameCss ? (_jsx("div", { css: frameCss, "data-test-subj": "surfaceFrame", children: children })) : (_jsx(_Fragment, { children: children }));
4
+ //# sourceMappingURL=surface_frame.js.map