@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,16 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <base href="./" />
7
+ <title>Isomer Studio</title>
8
+ <link rel="icon" href="data:," />
9
+ <link rel="stylesheet" href="assets/studio.css" />
10
+ <link rel="stylesheet" href="assets/slack.css" />
11
+ </head>
12
+ <body>
13
+ <div id="root"></div>
14
+ <script type="module" src="assets/app.js"></script>
15
+ </body>
16
+ </html>
@@ -0,0 +1,8 @@
1
+ import type { StudioApp } from '../config.js';
2
+ /** Loads and renders the open app; it stays mounted across sub-path navigation, theme changes and config re-runs. */
3
+ export declare const AppHost: ({ app: { id, title, load }, path, openApp, }: {
4
+ app: StudioApp;
5
+ path: string;
6
+ openApp: (id: string, path: string) => void;
7
+ }) => import("@emotion/react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=app_host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app_host.d.ts","sourceRoot":"","sources":["../../src/apps/app_host.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,WAAW,CAAC;AAwG3D,qHAAqH;AACrH,eAAO,MAAM,OAAO,GAAI,8CAIrB;IACD,GAAG,EAAE,SAAS,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C,qDAqCA,CAAC"}
@@ -0,0 +1,73 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
2
+ import { Component, useCallback, useEffect, useMemo, useRef, useState, } from 'react';
3
+ import { EuiButton, EuiCallOut, EuiLoadingSpinner } from '@elastic/eui';
4
+ import { css } from '@emotion/react';
5
+ import { useStudio } from '../studio_context.js';
6
+ import { AppPreview } from '../surfaces/app_preview.js';
7
+ import { AppSurface, appSurfaces } from '../surfaces/app_surface.js';
8
+ const asError = (error) => error instanceof Error ? error : new Error(String(error));
9
+ /**
10
+ * The page `load` resolves to, re-resolved whenever `load` changes. Every config re-run makes a new `load`, and
11
+ * the page only changes, remounting the app, when the module's default export does.
12
+ */
13
+ const useAppPage = (load, attempt) => {
14
+ const [loaded, setLoaded] = useState();
15
+ const versions = useRef(0);
16
+ useEffect(() => {
17
+ let isCurrent = true;
18
+ // A loader that throws before returning its promise fails like one that rejects.
19
+ new Promise((resolve) => resolve(load())).then(({ default: page }) => {
20
+ if (isCurrent) {
21
+ setLoaded((previous) => previous && 'page' in previous && previous.page === page
22
+ ? previous
23
+ : { page, version: (versions.current += 1) });
24
+ }
25
+ }, (error) => {
26
+ if (isCurrent) {
27
+ setLoaded({ error: asError(error) });
28
+ }
29
+ });
30
+ return () => {
31
+ isCurrent = false;
32
+ };
33
+ }, [load, attempt]);
34
+ return loaded;
35
+ };
36
+ const AppError = ({ title, error, onRetry, }) => (_jsxs(EuiCallOut, { announceOnMount: true, color: "danger", iconType: "error", title: `${title} could not load or render`, children: [_jsx("p", { children: error.message }), _jsx(EuiButton, { size: "s", color: "danger", onClick: onRetry, children: "Retry" })] }));
37
+ class AppBoundary extends Component {
38
+ state = {};
39
+ static getDerivedStateFromError(error) {
40
+ return { error };
41
+ }
42
+ render() {
43
+ const { error } = this.state;
44
+ const { title, onRetry, children } = this.props;
45
+ return error === undefined ? (children) : (_jsx(AppError, { title, error, onRetry }));
46
+ }
47
+ }
48
+ const fill = css `
49
+ min-height: 100%;
50
+ `;
51
+ const centered = css `
52
+ display: flex;
53
+ justify-content: center;
54
+ padding: 48px;
55
+ `;
56
+ /** Loads and renders the open app; it stays mounted across sub-path navigation, theme changes and config re-runs. */
57
+ export const AppHost = ({ app: { id, title, load }, path, openApp, }) => {
58
+ const { runtime, theme, rasterizePng, renderPdf } = useStudio();
59
+ const surfaces = useMemo(() => appSurfaces(runtime, Boolean(rasterizePng)), [runtime, rasterizePng]);
60
+ const [attempt, setAttempt] = useState(0);
61
+ const loaded = useAppPage(load, attempt);
62
+ const navigate = useCallback((next) => openApp(id, next), [id, openApp]);
63
+ const onRetry = useCallback(() => setAttempt((count) => count + 1), []);
64
+ if (loaded === undefined) {
65
+ return (_jsx("div", { css: centered, children: _jsx(EuiLoadingSpinner, { size: "xl" }) }));
66
+ }
67
+ if ('error' in loaded) {
68
+ return _jsx(AppError, { title, onRetry, error: loaded.error });
69
+ }
70
+ const { page: Page, version } = loaded;
71
+ return (_jsx("div", { css: fill, children: _jsx(AppBoundary, { title, onRetry, children: _jsx(Page, { Preview: AppPreview, Surface: AppSurface, runtime, theme, path, navigate, surfaces, ...(renderPdf ? { renderPdf } : {}) }) }, `${version}/${attempt}`) }));
72
+ };
73
+ //# sourceMappingURL=app_host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app_host.js","sourceRoot":"","sources":["../../src/apps/app_host.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 { ComponentType, ReactNode } from 'react';\nimport React, {\n Component,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { EuiButton, EuiCallOut, EuiLoadingSpinner } from '@elastic/eui';\nimport { css } from '@emotion/react';\n\nimport type { StudioApp, StudioAppProps } from '../config';\nimport { useStudio } from '../studio_context';\nimport { AppPreview } from '../surfaces/app_preview';\nimport { AppSurface, appSurfaces } from '../surfaces/app_surface';\n\ntype AppPage = ComponentType<StudioAppProps>;\n\n/** `version` counts the distinct pages resolved, so a new page also gets a fresh error boundary. */\ntype Loaded = { page: AppPage; version: number } | { error: Error } | undefined;\n\nconst asError = (error: unknown): Error =>\n error instanceof Error ? error : new Error(String(error));\n\n/**\n * The page `load` resolves to, re-resolved whenever `load` changes. Every config re-run makes a new `load`, and\n * the page only changes, remounting the app, when the module's default export does.\n */\nconst useAppPage = (load: StudioApp['load'], attempt: number): Loaded => {\n const [loaded, setLoaded] = useState<Loaded>();\n const versions = useRef(0);\n useEffect(() => {\n let isCurrent = true;\n // A loader that throws before returning its promise fails like one that rejects.\n new Promise<Awaited<ReturnType<StudioApp['load']>>>((resolve) =>\n resolve(load())\n ).then(\n ({ default: page }) => {\n if (isCurrent) {\n setLoaded((previous) =>\n previous && 'page' in previous && previous.page === page\n ? previous\n : { page, version: (versions.current += 1) }\n );\n }\n },\n (error: unknown) => {\n if (isCurrent) {\n setLoaded({ error: asError(error) });\n }\n }\n );\n return () => {\n isCurrent = false;\n };\n }, [load, attempt]);\n return loaded;\n};\n\ninterface BoundaryState {\n error?: Error | undefined;\n}\n\nconst AppError = ({\n title,\n error,\n onRetry,\n}: {\n title: string;\n error: Error;\n onRetry: () => void;\n}) => (\n <EuiCallOut\n announceOnMount\n color=\"danger\"\n iconType=\"error\"\n title={`${title} could not load or render`}>\n <p>{error.message}</p>\n <EuiButton size=\"s\" color=\"danger\" onClick={onRetry}>\n Retry\n </EuiButton>\n </EuiCallOut>\n);\n\nclass AppBoundary extends Component<\n { title: string; onRetry: () => void; children: ReactNode },\n BoundaryState\n> {\n state: BoundaryState = {};\n\n static getDerivedStateFromError(error: Error): BoundaryState {\n return { error };\n }\n\n render() {\n const { error } = this.state;\n const { title, onRetry, children } = this.props;\n return error === undefined ? (\n children\n ) : (\n <AppError {...{ title, error, onRetry }} />\n );\n }\n}\n\nconst fill = css`\n min-height: 100%;\n`;\n\nconst centered = css`\n display: flex;\n justify-content: center;\n padding: 48px;\n`;\n\n/** Loads and renders the open app; it stays mounted across sub-path navigation, theme changes and config re-runs. */\nexport const AppHost = ({\n app: { id, title, load },\n path,\n openApp,\n}: {\n app: StudioApp;\n path: string;\n openApp: (id: string, path: string) => void;\n}) => {\n const { runtime, theme, rasterizePng, renderPdf } = useStudio();\n const surfaces = useMemo(\n () => appSurfaces(runtime, Boolean(rasterizePng)),\n [runtime, rasterizePng]\n );\n const [attempt, setAttempt] = useState(0);\n const loaded = useAppPage(load, attempt);\n const navigate = useCallback(\n (next: string) => openApp(id, next),\n [id, openApp]\n );\n const onRetry = useCallback(() => setAttempt((count) => count + 1), []);\n\n if (loaded === undefined) {\n return (\n <div css={centered}>\n <EuiLoadingSpinner size=\"xl\" />\n </div>\n );\n }\n if ('error' in loaded) {\n return <AppError {...{ title, onRetry }} error={loaded.error} />;\n }\n const { page: Page, version } = loaded;\n return (\n <div css={fill}>\n <AppBoundary key={`${version}/${attempt}`} {...{ title, onRetry }}>\n <Page\n Preview={AppPreview}\n Surface={AppSurface}\n {...{ runtime, theme, path, navigate, surfaces }}\n {...(renderPdf ? { renderPdf } : {})}\n />\n </AppBoundary>\n </div>\n );\n};\n"]}
@@ -0,0 +1,5 @@
1
+ import type { StudioConfig } from '../config.js';
2
+ import type { StudioHost } from './mount.js';
3
+ /** `isomer-studio dev`: the server compiles JSX, rasterizes PNGs and writes PDFs. */
4
+ export declare const devHost: ({ runtime }: StudioConfig) => StudioHost;
5
+ //# sourceMappingURL=dev_host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev_host.d.ts","sourceRoot":"","sources":["../../src/browser/dev_host.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAG9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAuC1C,qFAAqF;AACrF,eAAO,MAAM,OAAO,GAAI,aAAa,YAAY,KAAG,UAGlD,CAAC"}
@@ -0,0 +1,46 @@
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 { assetUrl } from './mount.js';
8
+ const transformJsx = async (source) => {
9
+ const response = await fetch(assetUrl('transform'), {
10
+ method: 'POST',
11
+ body: source,
12
+ });
13
+ const code = await response.text();
14
+ if (!response.ok) {
15
+ throw new Error(code);
16
+ }
17
+ return code;
18
+ };
19
+ const rasterizePng = async (composition, { signal }) => {
20
+ const response = await fetch(assetUrl('png'), {
21
+ method: 'POST',
22
+ body: JSON.stringify(composition),
23
+ signal,
24
+ });
25
+ if (!response.ok) {
26
+ throw new Error(await response.text());
27
+ }
28
+ return response.blob();
29
+ };
30
+ const renderPdf = async (compositions, { title, signal } = {}) => {
31
+ const response = await fetch(assetUrl('pdf'), {
32
+ method: 'POST',
33
+ body: JSON.stringify({ title, compositions }),
34
+ ...(signal ? { signal } : {}),
35
+ });
36
+ if (!response.ok) {
37
+ throw new Error(await response.text());
38
+ }
39
+ return response.blob();
40
+ };
41
+ /** `isomer-studio dev`: the server compiles JSX, rasterizes PNGs and writes PDFs. */
42
+ export const devHost = ({ runtime }) => ({
43
+ transformJsx,
44
+ ...(runtime.surfaces.snapshot ? { rasterizePng, renderPdf } : {}),
45
+ });
46
+ //# sourceMappingURL=dev_host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev_host.js","sourceRoot":"","sources":["../../src/browser/dev_host.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,MAAM,YAAY,GAAiB,KAAK,EAAE,MAAM,EAAE,EAAE;IAClD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;QAClD,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,MAAM;KACb,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,YAAY,GAAiB,KAAK,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;IACnE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;QAC5C,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;QACjC,MAAM;KACP,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC,CAAC;AAEF,MAAM,SAAS,GAAc,KAAK,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE;IAC1E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;QAC5C,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QAC7C,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9B,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC,CAAC;AAEF,qFAAqF;AACrF,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,EAAE,OAAO,EAAgB,EAAc,EAAE,CAAC,CAAC;IACjE,YAAY;IACZ,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;CAClE,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 { StudioConfig } from '../config';\nimport type { JsxTransform, RasterizePng, RenderPdf } from '../types';\n\nimport type { StudioHost } from './mount';\nimport { assetUrl } from './mount';\n\nconst transformJsx: JsxTransform = async (source) => {\n const response = await fetch(assetUrl('transform'), {\n method: 'POST',\n body: source,\n });\n const code = await response.text();\n if (!response.ok) {\n throw new Error(code);\n }\n return code;\n};\n\nconst rasterizePng: RasterizePng = async (composition, { signal }) => {\n const response = await fetch(assetUrl('png'), {\n method: 'POST',\n body: JSON.stringify(composition),\n signal,\n });\n if (!response.ok) {\n throw new Error(await response.text());\n }\n return response.blob();\n};\n\nconst renderPdf: RenderPdf = async (compositions, { title, signal } = {}) => {\n const response = await fetch(assetUrl('pdf'), {\n method: 'POST',\n body: JSON.stringify({ title, compositions }),\n ...(signal ? { signal } : {}),\n });\n if (!response.ok) {\n throw new Error(await response.text());\n }\n return response.blob();\n};\n\n/** `isomer-studio dev`: the server compiles JSX, rasterizes PNGs and writes PDFs. */\nexport const devHost = ({ runtime }: StudioConfig): StudioHost => ({\n transformJsx,\n ...(runtime.surfaces.snapshot ? { rasterizePng, renderPdf } : {}),\n});\n"]}
@@ -0,0 +1,16 @@
1
+ import type { StudioConfig } from '../config.js';
2
+ import type { JsxTransform, RasterizePng, RenderPdf } from '../types.js';
3
+ /** What the CLI's mode supplies: `dev` asks its server, a static build works in the browser alone. */
4
+ export interface StudioHost {
5
+ transformJsx?: JsxTransform | undefined;
6
+ rasterizePng?: RasterizePng | undefined;
7
+ renderPdf?: RenderPdf | undefined;
8
+ }
9
+ /** `path` against the page's `<base href>`, which the CLI sets from `--base`. */
10
+ export declare const assetUrl: (path: string) => string;
11
+ export interface MountedStudio {
12
+ /** Re-renders with a new config, keeping the route and every view's state. A config with invalid apps keeps the previous apps and shows why; invalid `featured` entries are reported and skipped. */
13
+ update: (config: StudioConfig, host: StudioHost) => void;
14
+ }
15
+ export declare const mountStudio: (config: StudioConfig, host: StudioHost) => MountedStudio;
16
+ //# sourceMappingURL=mount.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../../src/browser/mount.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAI9C,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAEtE,sGAAsG;AACtG,MAAM,WAAW,UAAU;IACzB,YAAY,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IACxC,YAAY,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IACxC,SAAS,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CACnC;AAQD,iFAAiF;AACjF,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,KAAG,MACF,CAAC;AAEvC,MAAM,WAAW,aAAa;IAC5B,qMAAqM;IACrM,MAAM,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;CAC1D;AAED,eAAO,MAAM,WAAW,GACtB,QAAQ,YAAY,EACpB,MAAM,UAAU,KACf,aAmCF,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { jsx as _jsx } from "@emotion/react/jsx-runtime";
2
+ import { createRoot } from 'react-dom/client';
3
+ import { appProblems } from '../model/app_problems.js';
4
+ import { featuredProblems, runtimePrimitiveTypes } from '../model/featured.js';
5
+ import { IsomerStudio } from '../studio.js';
6
+ const WORKERS = {
7
+ typescript: 'ts.worker',
8
+ javascript: 'ts.worker',
9
+ json: 'json.worker',
10
+ };
11
+ /** `path` against the page's `<base href>`, which the CLI sets from `--base`. */
12
+ export const assetUrl = (path) => new URL(path, document.baseURI).href;
13
+ export const mountStudio = (config, host) => {
14
+ window.MonacoEnvironment = {
15
+ getWorker: (_id, label) => new Worker(assetUrl(`assets/${WORKERS[label] ?? 'editor.worker'}.js`), {
16
+ type: 'module',
17
+ }),
18
+ };
19
+ const container = document.getElementById('root');
20
+ if (!container) {
21
+ throw new Error('The Studio page has no #root element.');
22
+ }
23
+ const root = createRoot(container);
24
+ let apps;
25
+ const update = (next, { transformJsx, rasterizePng, renderPdf }) => {
26
+ const problems = appProblems(next.apps);
27
+ if (!problems.length) {
28
+ ({ apps } = next);
29
+ }
30
+ problems.push(...featuredProblems(next.featured, runtimePrimitiveTypes(next.runtime)));
31
+ document.title = next.title ?? 'Isomer Studio';
32
+ root.render(_jsx(IsomerStudio, { ...next, apps, transformJsx, rasterizePng, renderPdf, configProblems: problems }));
33
+ };
34
+ update(config, host);
35
+ return { update };
36
+ };
37
+ //# sourceMappingURL=mount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mount.js","sourceRoot":"","sources":["../../src/browser/mount.tsx"],"names":[],"mappings":";AAQA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAI9C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAUzC,MAAM,OAAO,GAAqC;IAChD,UAAU,EAAE,WAAW;IACvB,UAAU,EAAE,WAAW;IACvB,IAAI,EAAE,aAAa;CACpB,CAAC;AAEF,iFAAiF;AACjF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAU,EAAE,CAC/C,IAAI,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;AAOvC,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,MAAoB,EACpB,IAAgB,EACD,EAAE;IACjB,MAAM,CAAC,iBAAiB,GAAG;QACzB,SAAS,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CACxB,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,OAAO,CAAC,KAAK,CAAC,IAAI,eAAe,KAAK,CAAC,EAAE;YACrE,IAAI,EAAE,QAAQ;SACf,CAAC;KACL,CAAC;IACF,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAClD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACnC,IAAI,IAA0B,CAAC;IAC/B,MAAM,MAAM,GAAG,CACb,IAAkB,EAClB,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAc,EACrD,EAAE;QACF,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;QACpB,CAAC;QACD,QAAQ,CAAC,IAAI,CACX,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CACxE,CAAC;QACF,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,eAAe,CAAC;QAC/C,IAAI,CAAC,MAAM,CACT,KAAC,YAAY,OACP,IAAI,EACF,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EACjD,cAAc,EAAE,QAAQ,GACxB,CACH,CAAC;IACJ,CAAC,CAAC;IACF,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,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 from 'react';\nimport { createRoot } from 'react-dom/client';\nimport type {} from 'monaco-editor/esm/vs/editor/editor.api';\n\nimport type { StudioConfig } from '../config';\nimport { appProblems } from '../model/app_problems';\nimport { featuredProblems, runtimePrimitiveTypes } from '../model/featured';\nimport { IsomerStudio } from '../studio';\nimport type { JsxTransform, RasterizePng, RenderPdf } from '../types';\n\n/** What the CLI's mode supplies: `dev` asks its server, a static build works in the browser alone. */\nexport interface StudioHost {\n transformJsx?: JsxTransform | undefined;\n rasterizePng?: RasterizePng | undefined;\n renderPdf?: RenderPdf | undefined;\n}\n\nconst WORKERS: Readonly<Record<string, string>> = {\n typescript: 'ts.worker',\n javascript: 'ts.worker',\n json: 'json.worker',\n};\n\n/** `path` against the page's `<base href>`, which the CLI sets from `--base`. */\nexport const assetUrl = (path: string): string =>\n new URL(path, document.baseURI).href;\n\nexport interface MountedStudio {\n /** Re-renders with a new config, keeping the route and every view's state. A config with invalid apps keeps the previous apps and shows why; invalid `featured` entries are reported and skipped. */\n update: (config: StudioConfig, host: StudioHost) => void;\n}\n\nexport const mountStudio = (\n config: StudioConfig,\n host: StudioHost\n): MountedStudio => {\n window.MonacoEnvironment = {\n getWorker: (_id, label) =>\n new Worker(assetUrl(`assets/${WORKERS[label] ?? 'editor.worker'}.js`), {\n type: 'module',\n }),\n };\n const container = document.getElementById('root');\n if (!container) {\n throw new Error('The Studio page has no #root element.');\n }\n const root = createRoot(container);\n let apps: StudioConfig['apps'];\n const update = (\n next: StudioConfig,\n { transformJsx, rasterizePng, renderPdf }: StudioHost\n ) => {\n const problems = appProblems(next.apps);\n if (!problems.length) {\n ({ apps } = next);\n }\n problems.push(\n ...featuredProblems(next.featured, runtimePrimitiveTypes(next.runtime))\n );\n document.title = next.title ?? 'Isomer Studio';\n root.render(\n <IsomerStudio\n {...next}\n {...{ apps, transformJsx, rasterizePng, renderPdf }}\n configProblems={problems}\n />\n );\n };\n update(config, host);\n return { update };\n};\n"]}
@@ -0,0 +1,5 @@
1
+ import type { StudioConfig } from '../config.js';
2
+ import type { StudioHost } from './mount.js';
3
+ /** `isomer-studio build`: JSX compiles in the browser, and PNGs come from the build's manifest. */
4
+ export declare const staticHost: ({ runtime }: StudioConfig) => StudioHost;
5
+ //# sourceMappingURL=static_host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static_host.d.ts","sourceRoot":"","sources":["../../src/browser/static_host.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAU9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAmD1C,mGAAmG;AACnG,eAAO,MAAM,UAAU,GAAI,aAAa,YAAY,KAAG,UAGrD,CAAC"}
@@ -0,0 +1,55 @@
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 { compositionKey } from '../model/composition_key.js';
8
+ import { describeTransformError, JSX_TRANSFORM_OPTIONS, } from '../model/jsx_transform.js';
9
+ import { isPngManifest, PngUnavailableError } from '../model/png_manifest.js';
10
+ import { assetUrl } from './mount.js';
11
+ let esbuild;
12
+ /** `esbuild-wasm`, fetched and started the first time the editor compiles JSX. */
13
+ const loadEsbuild = () => (esbuild ??= import('esbuild-wasm/esm/browser.js').then(async (module) => {
14
+ await module.initialize({ wasmURL: assetUrl('assets/esbuild.wasm') });
15
+ return module;
16
+ }));
17
+ const transformJsx = async (source) => {
18
+ const { transform } = await loadEsbuild();
19
+ try {
20
+ const { code } = await transform(source, JSX_TRANSFORM_OPTIONS);
21
+ return code;
22
+ }
23
+ catch (error) {
24
+ throw new Error(describeTransformError(error));
25
+ }
26
+ };
27
+ const EMPTY_MANIFEST = { version: 1, entries: {} };
28
+ /** Looks each composition up in `png/manifest.json`, which `isomer-studio build` prerendered. */
29
+ const manifestRasterizer = () => {
30
+ let manifest;
31
+ const loadManifest = () => (manifest ??= fetch(assetUrl('png/manifest.json'))
32
+ .then(async (response) => {
33
+ const body = response.ok ? await response.json() : undefined;
34
+ return isPngManifest(body) ? body : EMPTY_MANIFEST;
35
+ })
36
+ .catch(() => EMPTY_MANIFEST));
37
+ return async (composition, { signal }) => {
38
+ const { entries } = await loadManifest();
39
+ const entry = entries[compositionKey(composition)];
40
+ if (!entry) {
41
+ throw new PngUnavailableError();
42
+ }
43
+ const response = await fetch(assetUrl(`png/${entry.file}`), { signal });
44
+ if (!response.ok) {
45
+ throw new Error(`png/${entry.file} answered ${response.status}.`);
46
+ }
47
+ return response.blob();
48
+ };
49
+ };
50
+ /** `isomer-studio build`: JSX compiles in the browser, and PNGs come from the build's manifest. */
51
+ export const staticHost = ({ runtime }) => ({
52
+ transformJsx,
53
+ rasterizePng: runtime.surfaces.snapshot ? manifestRasterizer() : undefined,
54
+ });
55
+ //# sourceMappingURL=static_host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static_host.js","sourceRoot":"","sources":["../../src/browser/static_host.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 { StudioConfig } from '../config';\nimport { compositionKey } from '../model/composition_key';\nimport {\n describeTransformError,\n JSX_TRANSFORM_OPTIONS,\n} from '../model/jsx_transform';\nimport type { PngManifest } from '../model/png_manifest';\nimport { isPngManifest, PngUnavailableError } from '../model/png_manifest';\nimport type { JsxTransform, RasterizePng } from '../types';\n\nimport type { StudioHost } from './mount';\nimport { assetUrl } from './mount';\n\ntype Esbuild = typeof import('esbuild-wasm/esm/browser.js');\n\nlet esbuild: Promise<Esbuild> | undefined;\n\n/** `esbuild-wasm`, fetched and started the first time the editor compiles JSX. */\nconst loadEsbuild = (): Promise<Esbuild> =>\n (esbuild ??= import('esbuild-wasm/esm/browser.js').then(async (module) => {\n await module.initialize({ wasmURL: assetUrl('assets/esbuild.wasm') });\n return module;\n }));\n\nconst transformJsx: JsxTransform = async (source) => {\n const { transform } = await loadEsbuild();\n try {\n const { code } = await transform(source, JSX_TRANSFORM_OPTIONS);\n return code;\n } catch (error) {\n throw new Error(describeTransformError(error));\n }\n};\n\nconst EMPTY_MANIFEST: PngManifest = { version: 1, entries: {} };\n\n/** Looks each composition up in `png/manifest.json`, which `isomer-studio build` prerendered. */\nconst manifestRasterizer = (): RasterizePng => {\n let manifest: Promise<PngManifest> | undefined;\n const loadManifest = () =>\n (manifest ??= fetch(assetUrl('png/manifest.json'))\n .then(async (response) => {\n const body: unknown = response.ok ? await response.json() : undefined;\n return isPngManifest(body) ? body : EMPTY_MANIFEST;\n })\n .catch(() => EMPTY_MANIFEST));\n\n return async (composition, { signal }) => {\n const { entries } = await loadManifest();\n const entry = entries[compositionKey(composition)];\n if (!entry) {\n throw new PngUnavailableError();\n }\n const response = await fetch(assetUrl(`png/${entry.file}`), { signal });\n if (!response.ok) {\n throw new Error(`png/${entry.file} answered ${response.status}.`);\n }\n return response.blob();\n };\n};\n\n/** `isomer-studio build`: JSX compiles in the browser, and PNGs come from the build's manifest. */\nexport const staticHost = ({ runtime }: StudioConfig): StudioHost => ({\n transformJsx,\n rasterizePng: runtime.surfaces.snapshot ? manifestRasterizer() : undefined,\n});\n"]}
@@ -0,0 +1,14 @@
1
+ import type { StudioMode } from './route.js';
2
+ export interface Accent {
3
+ /** The header and nav background. */
4
+ shell: string;
5
+ /** The mode's hue at full strength, for marks drawn on the shell. */
6
+ bright: string;
7
+ fill: string;
8
+ text: string;
9
+ light: string;
10
+ }
11
+ export declare const SHELL: Readonly<Record<StudioMode, string>>;
12
+ /** Dev mode is tinted green, docs mode blue, so the two never read as one another. */
13
+ export declare const useAccent: (mode: StudioMode) => Accent;
14
+ //# sourceMappingURL=accent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accent.d.ts","sourceRoot":"","sources":["../../src/chrome/accent.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,MAAM,WAAW,MAAM;IACrB,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAGtD,CAAC;AAEF,sFAAsF;AACtF,eAAO,MAAM,SAAS,GAAI,MAAM,UAAU,KAAG,MAoB5C,CAAC"}
@@ -0,0 +1,31 @@
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 { useEuiTheme } from '@elastic/eui';
8
+ export const SHELL = {
9
+ dev: '#0B3A2C',
10
+ docs: '#0B2347',
11
+ };
12
+ /** Dev mode is tinted green, docs mode blue, so the two never read as one another. */
13
+ export const useAccent = (mode) => {
14
+ const { euiTheme: { colors }, } = useEuiTheme();
15
+ return mode === 'dev'
16
+ ? {
17
+ shell: SHELL.dev,
18
+ bright: '#00BFB3',
19
+ fill: colors.backgroundFilledSuccess,
20
+ text: colors.textSuccess,
21
+ light: colors.backgroundLightSuccess,
22
+ }
23
+ : {
24
+ shell: SHELL.docs,
25
+ bright: '#1BA9F5',
26
+ fill: colors.backgroundFilledPrimary,
27
+ text: colors.textPrimary,
28
+ light: colors.backgroundLightPrimary,
29
+ };
30
+ };
31
+ //# sourceMappingURL=accent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accent.js","sourceRoot":"","sources":["../../src/chrome/accent.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAc3C,MAAM,CAAC,MAAM,KAAK,GAAyC;IACzD,GAAG,EAAE,SAAS;IACd,IAAI,EAAE,SAAS;CAChB,CAAC;AAEF,sFAAsF;AACtF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAgB,EAAU,EAAE;IACpD,MAAM,EACJ,QAAQ,EAAE,EAAE,MAAM,EAAE,GACrB,GAAG,WAAW,EAAE,CAAC;IAElB,OAAO,IAAI,KAAK,KAAK;QACnB,CAAC,CAAC;YACE,KAAK,EAAE,KAAK,CAAC,GAAG;YAChB,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE,MAAM,CAAC,uBAAuB;YACpC,IAAI,EAAE,MAAM,CAAC,WAAW;YACxB,KAAK,EAAE,MAAM,CAAC,sBAAsB;SACrC;QACH,CAAC,CAAC;YACE,KAAK,EAAE,KAAK,CAAC,IAAI;YACjB,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE,MAAM,CAAC,uBAAuB;YACpC,IAAI,EAAE,MAAM,CAAC,WAAW;YACxB,KAAK,EAAE,MAAM,CAAC,sBAAsB;SACrC,CAAC;AACR,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 { useEuiTheme } from '@elastic/eui';\n\nimport type { StudioMode } from './route';\n\nexport interface Accent {\n /** The header and nav background. */\n shell: string;\n /** The mode's hue at full strength, for marks drawn on the shell. */\n bright: string;\n fill: string;\n text: string;\n light: string;\n}\n\nexport const SHELL: Readonly<Record<StudioMode, string>> = {\n dev: '#0B3A2C',\n docs: '#0B2347',\n};\n\n/** Dev mode is tinted green, docs mode blue, so the two never read as one another. */\nexport const useAccent = (mode: StudioMode): Accent => {\n const {\n euiTheme: { colors },\n } = useEuiTheme();\n\n return mode === 'dev'\n ? {\n shell: SHELL.dev,\n bright: '#00BFB3',\n fill: colors.backgroundFilledSuccess,\n text: colors.textSuccess,\n light: colors.backgroundLightSuccess,\n }\n : {\n shell: SHELL.docs,\n bright: '#1BA9F5',\n fill: colors.backgroundFilledPrimary,\n text: colors.textPrimary,\n light: colors.backgroundLightPrimary,\n };\n};\n"]}
@@ -0,0 +1,13 @@
1
+ import type { StudioAppPage } from '../config.js';
2
+ export interface AppPageSection {
3
+ /** Absent for the pages that name no `section`. */
4
+ title?: string | undefined;
5
+ pages: StudioAppPage[];
6
+ }
7
+ /** `pages` grouped by `section`: unsectioned pages first, then sections in order of first appearance. */
8
+ export declare const appPageSections: (pages: readonly StudioAppPage[]) => AppPageSection[];
9
+ /** The page `path` is at or below, the longest such page winning. */
10
+ export declare const activeAppPage: (pages: readonly StudioAppPage[], path: string) => StudioAppPage | undefined;
11
+ /** Pages whose title contains every word of `query`. */
12
+ export declare const filterAppPages: (pages: readonly StudioAppPage[], query: string) => StudioAppPage[];
13
+ //# sourceMappingURL=app_pages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app_pages.d.ts","sourceRoot":"","sources":["../../src/chrome/app_pages.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C,MAAM,WAAW,cAAc;IAC7B,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAED,yGAAyG;AACzG,eAAO,MAAM,eAAe,GAC1B,OAAO,SAAS,aAAa,EAAE,KAC9B,cAAc,EAWhB,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,aAAa,GACxB,OAAO,SAAS,aAAa,EAAE,EAC/B,MAAM,MAAM,KACX,aAAa,GAAG,SAQhB,CAAC;AAEJ,wDAAwD;AACxD,eAAO,MAAM,cAAc,GACzB,OAAO,SAAS,aAAa,EAAE,EAC/B,OAAO,MAAM,KACZ,aAAa,EAMf,CAAC"}
@@ -0,0 +1,33 @@
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
+ /** `pages` grouped by `section`: unsectioned pages first, then sections in order of first appearance. */
8
+ export const appPageSections = (pages) => {
9
+ const sections = new Map([
10
+ [undefined, { title: undefined, pages: [] }],
11
+ ]);
12
+ for (const page of pages) {
13
+ const { section: title } = page;
14
+ const section = sections.get(title) ?? { title, pages: [] };
15
+ section.pages.push(page);
16
+ sections.set(title, section);
17
+ }
18
+ return [...sections.values()].filter(({ pages: listed }) => listed.length);
19
+ };
20
+ /** The page `path` is at or below, the longest such page winning. */
21
+ export const activeAppPage = (pages, path) => pages.reduce((best, page) => (path === page.path || path.startsWith(`${page.path}/`)) &&
22
+ page.path.length > (best?.path.length ?? -1)
23
+ ? page
24
+ : best, undefined);
25
+ /** Pages whose title contains every word of `query`. */
26
+ export const filterAppPages = (pages, query) => {
27
+ const words = query.toLowerCase().split(/\s+/).filter(Boolean);
28
+ return pages.filter(({ title }) => {
29
+ const text = title.toLowerCase();
30
+ return words.every((word) => text.includes(word));
31
+ });
32
+ };
33
+ //# sourceMappingURL=app_pages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app_pages.js","sourceRoot":"","sources":["../../src/chrome/app_pages.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,yGAAyG;AACzG,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,KAA+B,EACb,EAAE;IACpB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAqC;QAC3D,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;KAC7C,CAAC,CAAC;IACH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QAChC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QAC5D,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC7E,CAAC,CAAC;AAEF,qEAAqE;AACrE,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,KAA+B,EAC/B,IAAY,EACe,EAAE,CAC7B,KAAK,CAAC,MAAM,CACV,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CACb,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IACxD,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,IAAI;IACN,CAAC,CAAC,IAAI,EACV,SAAS,CACV,CAAC;AAEJ,wDAAwD;AACxD,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,KAA+B,EAC/B,KAAa,EACI,EAAE;IACnB,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/D,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;QAChC,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,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 { StudioAppPage } from '../config';\n\nexport interface AppPageSection {\n /** Absent for the pages that name no `section`. */\n title?: string | undefined;\n pages: StudioAppPage[];\n}\n\n/** `pages` grouped by `section`: unsectioned pages first, then sections in order of first appearance. */\nexport const appPageSections = (\n pages: readonly StudioAppPage[]\n): AppPageSection[] => {\n const sections = new Map<string | undefined, AppPageSection>([\n [undefined, { title: undefined, pages: [] }],\n ]);\n for (const page of pages) {\n const { section: title } = page;\n const section = sections.get(title) ?? { title, pages: [] };\n section.pages.push(page);\n sections.set(title, section);\n }\n return [...sections.values()].filter(({ pages: listed }) => listed.length);\n};\n\n/** The page `path` is at or below, the longest such page winning. */\nexport const activeAppPage = (\n pages: readonly StudioAppPage[],\n path: string\n): StudioAppPage | undefined =>\n pages.reduce<StudioAppPage | undefined>(\n (best, page) =>\n (path === page.path || path.startsWith(`${page.path}/`)) &&\n page.path.length > (best?.path.length ?? -1)\n ? page\n : best,\n undefined\n );\n\n/** Pages whose title contains every word of `query`. */\nexport const filterAppPages = (\n pages: readonly StudioAppPage[],\n query: string\n): StudioAppPage[] => {\n const words = query.toLowerCase().split(/\\s+/).filter(Boolean);\n return pages.filter(({ title }) => {\n const text = title.toLowerCase();\n return words.every((word) => text.includes(word));\n });\n};\n"]}
@@ -0,0 +1,10 @@
1
+ import type { StudioTheme } from '../config.js';
2
+ export type ColorModePreference = StudioTheme | 'system';
3
+ export declare const isColorModePreference: (value: unknown) => value is ColorModePreference;
4
+ /** The chosen color mode, persisted per browser, and the theme it resolves to; `system` follows the OS as it changes. */
5
+ export declare const useColorMode: () => {
6
+ preference: ColorModePreference;
7
+ theme: StudioTheme;
8
+ setPreference: (preference: ColorModePreference) => void;
9
+ };
10
+ //# sourceMappingURL=color_mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color_mode.d.ts","sourceRoot":"","sources":["../../src/chrome/color_mode.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG,QAAQ,CAAC;AAKzD,eAAO,MAAM,qBAAqB,GAChC,OAAO,OAAO,KACb,KAAK,IAAI,mBACiD,CAAC;AAc9D,yHAAyH;AACzH,eAAO,MAAM,YAAY,QAAO;IAC9B,UAAU,EAAE,mBAAmB,CAAC;IAChC,KAAK,EAAE,WAAW,CAAC;IACnB,aAAa,EAAE,CAAC,UAAU,EAAE,mBAAmB,KAAK,IAAI,CAAC;CA6B1D,CAAC"}
@@ -0,0 +1,45 @@
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 { useEffect, useState } from 'react';
8
+ const STORAGE_KEY = 'isomer-studio:color-mode';
9
+ const DARK_QUERY = '(prefers-color-scheme: dark)';
10
+ export const isColorModePreference = (value) => value === 'light' || value === 'dark' || value === 'system';
11
+ const darkQuery = () => typeof window === 'undefined' ? undefined : window.matchMedia?.(DARK_QUERY);
12
+ const storedPreference = () => {
13
+ try {
14
+ const stored = window.localStorage.getItem(STORAGE_KEY);
15
+ return isColorModePreference(stored) ? stored : 'system';
16
+ }
17
+ catch {
18
+ return 'system';
19
+ }
20
+ };
21
+ /** The chosen color mode, persisted per browser, and the theme it resolves to; `system` follows the OS as it changes. */
22
+ export const useColorMode = () => {
23
+ const [preference, setPreference] = useState(storedPreference);
24
+ const [systemIsDark, setSystemIsDark] = useState(() => darkQuery()?.matches ?? false);
25
+ useEffect(() => {
26
+ const query = darkQuery();
27
+ if (!query) {
28
+ return;
29
+ }
30
+ const onChange = ({ matches }) => setSystemIsDark(matches);
31
+ query.addEventListener('change', onChange);
32
+ return () => query.removeEventListener('change', onChange);
33
+ }, []);
34
+ useEffect(() => {
35
+ try {
36
+ window.localStorage.setItem(STORAGE_KEY, preference);
37
+ }
38
+ catch {
39
+ // Storage is optional: a blocked or full store keeps the choice for this page only.
40
+ }
41
+ }, [preference]);
42
+ const theme = preference === 'system' ? (systemIsDark ? 'dark' : 'light') : preference;
43
+ return { preference, theme, setPreference };
44
+ };
45
+ //# sourceMappingURL=color_mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color_mode.js","sourceRoot":"","sources":["../../src/chrome/color_mode.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAM5C,MAAM,WAAW,GAAG,0BAA0B,CAAC;AAC/C,MAAM,UAAU,GAAG,8BAA8B,CAAC;AAElD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,KAAc,EACgB,EAAE,CAChC,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,QAAQ,CAAC;AAE9D,MAAM,SAAS,GAAG,GAA+B,EAAE,CACjD,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,CAAC;AAE9E,MAAM,gBAAgB,GAAG,GAAwB,EAAE;IACjD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACxD,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC,CAAC;AAEF,yHAAyH;AACzH,MAAM,CAAC,MAAM,YAAY,GAAG,GAI1B,EAAE;IACF,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAC/D,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAC9C,GAAG,EAAE,CAAC,SAAS,EAAE,EAAE,OAAO,IAAI,KAAK,CACpC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,EAAE,OAAO,EAAuB,EAAE,EAAE,CACpD,eAAe,CAAC,OAAO,CAAC,CAAC;QAC3B,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC3C,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC7D,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC;YACH,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,oFAAoF;QACtF,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,MAAM,KAAK,GACT,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAC3E,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;AAC9C,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 { useEffect, useState } from 'react';\n\nimport type { StudioTheme } from '../config';\n\nexport type ColorModePreference = StudioTheme | 'system';\n\nconst STORAGE_KEY = 'isomer-studio:color-mode';\nconst DARK_QUERY = '(prefers-color-scheme: dark)';\n\nexport const isColorModePreference = (\n value: unknown\n): value is ColorModePreference =>\n value === 'light' || value === 'dark' || value === 'system';\n\nconst darkQuery = (): MediaQueryList | undefined =>\n typeof window === 'undefined' ? undefined : window.matchMedia?.(DARK_QUERY);\n\nconst storedPreference = (): ColorModePreference => {\n try {\n const stored = window.localStorage.getItem(STORAGE_KEY);\n return isColorModePreference(stored) ? stored : 'system';\n } catch {\n return 'system';\n }\n};\n\n/** The chosen color mode, persisted per browser, and the theme it resolves to; `system` follows the OS as it changes. */\nexport const useColorMode = (): {\n preference: ColorModePreference;\n theme: StudioTheme;\n setPreference: (preference: ColorModePreference) => void;\n} => {\n const [preference, setPreference] = useState(storedPreference);\n const [systemIsDark, setSystemIsDark] = useState(\n () => darkQuery()?.matches ?? false\n );\n\n useEffect(() => {\n const query = darkQuery();\n if (!query) {\n return;\n }\n const onChange = ({ matches }: MediaQueryListEvent) =>\n setSystemIsDark(matches);\n query.addEventListener('change', onChange);\n return () => query.removeEventListener('change', onChange);\n }, []);\n\n useEffect(() => {\n try {\n window.localStorage.setItem(STORAGE_KEY, preference);\n } catch {\n // Storage is optional: a blocked or full store keeps the choice for this page only.\n }\n }, [preference]);\n\n const theme =\n preference === 'system' ? (systemIsDark ? 'dark' : 'light') : preference;\n return { preference, theme, setPreference };\n};\n"]}
@@ -0,0 +1,7 @@
1
+ import type { EuiThemeModifications } from '@elastic/eui';
2
+ /** Moves `hex` onto `hue` in OKLCH, keeping its perceived lightness. */
3
+ export declare const tintNeutral: (hex: string, hue: number) => string;
4
+ /** Borealis dark's blue-gray backgrounds and borders moved onto the dev shell's green. Text and role colors are untouched. */
5
+ export declare const DEV_DARK_COLORS: Readonly<Record<string, string>>;
6
+ export declare const DEV_TINT: EuiThemeModifications;
7
+ //# sourceMappingURL=dev_tint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev_tint.d.ts","sourceRoot":"","sources":["../../src/chrome/dev_tint.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAc1D,wEAAwE;AACxE,eAAO,MAAM,WAAW,GAAI,KAAK,MAAM,EAAE,KAAK,MAAM,KAAG,MAGtD,CAAC;AAIF,8HAA8H;AAC9H,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAU1D,CAAC;AAEJ,eAAO,MAAM,QAAQ,EAAE,qBAEtB,CAAC"}
@@ -0,0 +1,31 @@
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 { EuiThemeBorealis } from '@elastic/eui-theme-borealis';
8
+ import { SHELL } from './accent.js';
9
+ import { hexToOklch, oklchToHex } from './oklch.js';
10
+ const HEX = /^#([0-9a-f]{6})$/i;
11
+ const ROLE = /primary|accent|success|warning|danger|risk|neutral|assistance|highlight|link/i;
12
+ const SURFACE = /^(background|border)|^body$/;
13
+ /** Strength of the tint relative to Borealis's own blue: `1` is as green as Borealis is blue, `0` is gray. */
14
+ const CHROMA = 0.6;
15
+ /** Moves `hex` onto `hue` in OKLCH, keeping its perceived lightness. */
16
+ export const tintNeutral = (hex, hue) => {
17
+ const { l, c } = hexToOklch(hex);
18
+ return oklchToHex({ l, c: c * CHROMA, h: hue });
19
+ };
20
+ const { h: DEV_HUE } = hexToOklch(SHELL.dev);
21
+ /** Borealis dark's blue-gray backgrounds and borders moved onto the dev shell's green. Text and role colors are untouched. */
22
+ export const DEV_DARK_COLORS = Object.fromEntries(Object.entries(EuiThemeBorealis.root.colors.DARK).flatMap(([key, value]) => typeof value === 'string' &&
23
+ HEX.test(value) &&
24
+ SURFACE.test(key) &&
25
+ !ROLE.test(key)
26
+ ? [[key, tintNeutral(value, DEV_HUE)]]
27
+ : []));
28
+ export const DEV_TINT = {
29
+ colors: { DARK: DEV_DARK_COLORS },
30
+ };
31
+ //# sourceMappingURL=dev_tint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev_tint.js","sourceRoot":"","sources":["../../src/chrome/dev_tint.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,GAAG,GAAG,mBAAmB,CAAC;AAChC,MAAM,IAAI,GACR,+EAA+E,CAAC;AAClF,MAAM,OAAO,GAAG,6BAA6B,CAAC;AAE9C,8GAA8G;AAC9G,MAAM,MAAM,GAAG,GAAG,CAAC;AAEnB,wEAAwE;AACxE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAW,EAAE,GAAW,EAAU,EAAE;IAC9D,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;AAClD,CAAC,CAAC;AAEF,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAE7C,8HAA8H;AAC9H,MAAM,CAAC,MAAM,eAAe,GAC1B,MAAM,CAAC,WAAW,CAChB,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CACzE,OAAO,KAAK,KAAK,QAAQ;IACzB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;IACf,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;IACjB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IACb,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,EAAE,CACP,CACF,CAAC;AAEJ,MAAM,CAAC,MAAM,QAAQ,GAA0B;IAC7C,MAAM,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE;CAClC,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 { EuiThemeModifications } from '@elastic/eui';\nimport { EuiThemeBorealis } from '@elastic/eui-theme-borealis';\n\nimport { SHELL } from './accent';\nimport { hexToOklch, oklchToHex } from './oklch';\n\nconst HEX = /^#([0-9a-f]{6})$/i;\nconst ROLE =\n /primary|accent|success|warning|danger|risk|neutral|assistance|highlight|link/i;\nconst SURFACE = /^(background|border)|^body$/;\n\n/** Strength of the tint relative to Borealis's own blue: `1` is as green as Borealis is blue, `0` is gray. */\nconst CHROMA = 0.6;\n\n/** Moves `hex` onto `hue` in OKLCH, keeping its perceived lightness. */\nexport const tintNeutral = (hex: string, hue: number): string => {\n const { l, c } = hexToOklch(hex);\n return oklchToHex({ l, c: c * CHROMA, h: hue });\n};\n\nconst { h: DEV_HUE } = hexToOklch(SHELL.dev);\n\n/** Borealis dark's blue-gray backgrounds and borders moved onto the dev shell's green. Text and role colors are untouched. */\nexport const DEV_DARK_COLORS: Readonly<Record<string, string>> =\n Object.fromEntries(\n Object.entries(EuiThemeBorealis.root.colors.DARK).flatMap(([key, value]) =>\n typeof value === 'string' &&\n HEX.test(value) &&\n SURFACE.test(key) &&\n !ROLE.test(key)\n ? [[key, tintNeutral(value, DEV_HUE)]]\n : []\n )\n );\n\nexport const DEV_TINT: EuiThemeModifications = {\n colors: { DARK: DEV_DARK_COLORS },\n};\n"]}
@@ -0,0 +1,20 @@
1
+ import type { ColorModePreference } from './color_mode.js';
2
+ import type { StudioMode } from './route.js';
3
+ export interface StudioHeaderProps {
4
+ /** Defaults to "Isomer Studio". */
5
+ title?: string | undefined;
6
+ /** Absent while an app or Home is open, which selects neither mode. */
7
+ mode: StudioMode | undefined;
8
+ /** The open app's title, shown in place of the mode's name. */
9
+ appTitle?: string | undefined;
10
+ /** On Home the switch, search and color mode give way to a docs link. */
11
+ home?: boolean | undefined;
12
+ colorMode: ColorModePreference;
13
+ onModeChange: (mode: StudioMode) => void;
14
+ onColorModeChange: (colorMode: ColorModePreference) => void;
15
+ onSelectPrimitive: (type: string) => void;
16
+ onHome: () => void;
17
+ }
18
+ /** Title, the Workbench/Reference switch, search and color mode. The mark and title link to Home. */
19
+ export declare const StudioHeader: ({ title, mode, appTitle, home, colorMode, onModeChange, onColorModeChange, onSelectPrimitive, onHome, }: StudioHeaderProps) => import("@emotion/react/jsx-runtime").JSX.Element;
20
+ //# sourceMappingURL=header.d.ts.map