@refrakt-md/editor 0.6.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 (473) hide show
  1. package/app/dist/assets/abap-BdImnpbu.js +1 -0
  2. package/app/dist/assets/actionscript-3-CoDkCxhg.js +1 -0
  3. package/app/dist/assets/ada-bCR0ucgS.js +1 -0
  4. package/app/dist/assets/andromeeda-C4gqWexZ.js +1 -0
  5. package/app/dist/assets/angular-html-CU67Zn6k.js +1 -0
  6. package/app/dist/assets/angular-ts-BwZT4LLn.js +1 -0
  7. package/app/dist/assets/apache-Pmp26Uib.js +1 -0
  8. package/app/dist/assets/apex-D8_7TLub.js +1 -0
  9. package/app/dist/assets/apl-B4CMkyY2.js +1 -0
  10. package/app/dist/assets/apl-dKokRX4l.js +1 -0
  11. package/app/dist/assets/applescript-Co6uUVPk.js +1 -0
  12. package/app/dist/assets/ara-BRHolxvo.js +1 -0
  13. package/app/dist/assets/asciiarmor-Df11BRmG.js +1 -0
  14. package/app/dist/assets/asciidoc-Dv7Oe6Be.js +1 -0
  15. package/app/dist/assets/asm-D_Q5rh1f.js +1 -0
  16. package/app/dist/assets/asn1-EdZsLKOL.js +1 -0
  17. package/app/dist/assets/asterisk-B-8jnY81.js +1 -0
  18. package/app/dist/assets/astro-CbQHKStN.js +1 -0
  19. package/app/dist/assets/aurora-x-D-2ljcwZ.js +1 -0
  20. package/app/dist/assets/awk-DMzUqQB5.js +1 -0
  21. package/app/dist/assets/ayu-dark-CMjwMIkn.js +1 -0
  22. package/app/dist/assets/ayu-light-C47S-Tmv.js +1 -0
  23. package/app/dist/assets/ayu-mirage-CjoLj4QM.js +1 -0
  24. package/app/dist/assets/ballerina-BFfxhgS-.js +1 -0
  25. package/app/dist/assets/bat-BkioyH1T.js +1 -0
  26. package/app/dist/assets/beancount-k_qm7-4y.js +1 -0
  27. package/app/dist/assets/berry-uYugtg8r.js +1 -0
  28. package/app/dist/assets/bibtex-CHM0blh-.js +1 -0
  29. package/app/dist/assets/bicep-Bmn6On1c.js +1 -0
  30. package/app/dist/assets/blade-D4QpJJKB.js +1 -0
  31. package/app/dist/assets/brainfuck-C4LP7Hcl.js +1 -0
  32. package/app/dist/assets/bsl-BO_Y6i37.js +1 -0
  33. package/app/dist/assets/c-BIGW1oBm.js +1 -0
  34. package/app/dist/assets/c3-VCDPK7BO.js +1 -0
  35. package/app/dist/assets/cadence-Bv_4Rxtq.js +1 -0
  36. package/app/dist/assets/cairo-KRGpt6FW.js +1 -0
  37. package/app/dist/assets/catppuccin-frappe-DFWUc33u.js +1 -0
  38. package/app/dist/assets/catppuccin-latte-C9dUb6Cb.js +1 -0
  39. package/app/dist/assets/catppuccin-macchiato-DQyhUUbL.js +1 -0
  40. package/app/dist/assets/catppuccin-mocha-D87Tk5Gz.js +1 -0
  41. package/app/dist/assets/clarity-D53aC0YG.js +1 -0
  42. package/app/dist/assets/clike-B9uivgTg.js +1 -0
  43. package/app/dist/assets/clojure-BMjYHr_A.js +1 -0
  44. package/app/dist/assets/clojure-P80f7IUj.js +1 -0
  45. package/app/dist/assets/cmake-BQqOBYOt.js +1 -0
  46. package/app/dist/assets/cmake-D1j8_8rp.js +1 -0
  47. package/app/dist/assets/cobol-CWcv1MsR.js +1 -0
  48. package/app/dist/assets/cobol-nwyudZeR.js +1 -0
  49. package/app/dist/assets/codeowners-Bp6g37R7.js +1 -0
  50. package/app/dist/assets/codeql-DsOJ9woJ.js +1 -0
  51. package/app/dist/assets/coffee-Ch7k5sss.js +1 -0
  52. package/app/dist/assets/coffeescript-S37ZYGWr.js +1 -0
  53. package/app/dist/assets/common-lisp-Cg-RD9OK.js +1 -0
  54. package/app/dist/assets/commonlisp-DBKNyK5s.js +1 -0
  55. package/app/dist/assets/coq-DkFqJrB1.js +1 -0
  56. package/app/dist/assets/cpp-CofmeUqb.js +1 -0
  57. package/app/dist/assets/crystal-SjHAIU92.js +1 -0
  58. package/app/dist/assets/crystal-tKQVLTB8.js +1 -0
  59. package/app/dist/assets/csharp-COcwbKMJ.js +1 -0
  60. package/app/dist/assets/css-BnMrqG3P.js +1 -0
  61. package/app/dist/assets/css-DPfMkruS.js +1 -0
  62. package/app/dist/assets/csv-fuZLfV_i.js +1 -0
  63. package/app/dist/assets/cue-D82EKSYY.js +1 -0
  64. package/app/dist/assets/cypher-COkxafJQ.js +1 -0
  65. package/app/dist/assets/cypher-C_CwsFkJ.js +1 -0
  66. package/app/dist/assets/d-85-TOEBH.js +1 -0
  67. package/app/dist/assets/d-pRatUO7H.js +1 -0
  68. package/app/dist/assets/dark-plus-C3mMm8J8.js +1 -0
  69. package/app/dist/assets/dart-CF10PKvl.js +1 -0
  70. package/app/dist/assets/dax-CEL-wOlO.js +1 -0
  71. package/app/dist/assets/desktop-BmXAJ9_W.js +1 -0
  72. package/app/dist/assets/diff-D97Zzqfu.js +1 -0
  73. package/app/dist/assets/diff-DbItnlRl.js +1 -0
  74. package/app/dist/assets/docker-BcOcwvcX.js +1 -0
  75. package/app/dist/assets/dockerfile-BKs6k2Af.js +1 -0
  76. package/app/dist/assets/dotenv-Da5cRb03.js +1 -0
  77. package/app/dist/assets/dracula-BzJJZx-M.js +1 -0
  78. package/app/dist/assets/dracula-soft-BXkSAIEj.js +1 -0
  79. package/app/dist/assets/dream-maker-BtqSS_iP.js +1 -0
  80. package/app/dist/assets/dtd-DF_7sFjM.js +1 -0
  81. package/app/dist/assets/dylan-DwRh75JA.js +1 -0
  82. package/app/dist/assets/ebnf-CDyGwa7X.js +1 -0
  83. package/app/dist/assets/ecl-Cabwm37j.js +1 -0
  84. package/app/dist/assets/edge-BkV0erSs.js +1 -0
  85. package/app/dist/assets/eiffel-CnydiIhH.js +1 -0
  86. package/app/dist/assets/elixir-CDX3lj18.js +1 -0
  87. package/app/dist/assets/elm-DbKCFpqz.js +1 -0
  88. package/app/dist/assets/elm-vLlmbW-K.js +1 -0
  89. package/app/dist/assets/emacs-lisp-C9XAeP06.js +1 -0
  90. package/app/dist/assets/erb-CgJxNhIT.js +1 -0
  91. package/app/dist/assets/erlang-BNw1qcRV.js +1 -0
  92. package/app/dist/assets/erlang-DsQrWhSR.js +1 -0
  93. package/app/dist/assets/everforest-dark-BgDCqdQA.js +1 -0
  94. package/app/dist/assets/everforest-light-C8M2exoo.js +1 -0
  95. package/app/dist/assets/factor-kuTfRLto.js +1 -0
  96. package/app/dist/assets/fcl-Kvtd6kyn.js +1 -0
  97. package/app/dist/assets/fennel-BYunw83y.js +1 -0
  98. package/app/dist/assets/fish-BvzEVeQv.js +1 -0
  99. package/app/dist/assets/fluent-C4IJs8-o.js +1 -0
  100. package/app/dist/assets/forth-Ffai-XNe.js +1 -0
  101. package/app/dist/assets/fortran-DYz_wnZ1.js +1 -0
  102. package/app/dist/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
  103. package/app/dist/assets/fortran-free-form-BxgE0vQu.js +1 -0
  104. package/app/dist/assets/fsharp-CXgrBDvD.js +1 -0
  105. package/app/dist/assets/gas-Bneqetm1.js +1 -0
  106. package/app/dist/assets/gdresource-BOOCDP_w.js +1 -0
  107. package/app/dist/assets/gdscript-C5YyOfLZ.js +1 -0
  108. package/app/dist/assets/gdshader-DkwncUOv.js +1 -0
  109. package/app/dist/assets/genie-D0YGMca9.js +1 -0
  110. package/app/dist/assets/gherkin-DyxjwDmM.js +1 -0
  111. package/app/dist/assets/gherkin-heZmZLOM.js +1 -0
  112. package/app/dist/assets/git-commit-F4YmCXRG.js +1 -0
  113. package/app/dist/assets/git-rebase-r7XF79zn.js +1 -0
  114. package/app/dist/assets/github-dark-DHJKELXO.js +1 -0
  115. package/app/dist/assets/github-dark-default-Cuk6v7N8.js +1 -0
  116. package/app/dist/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
  117. package/app/dist/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
  118. package/app/dist/assets/github-light-DAi9KRSo.js +1 -0
  119. package/app/dist/assets/github-light-default-D7oLnXFd.js +1 -0
  120. package/app/dist/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
  121. package/app/dist/assets/gleam-BspZqrRM.js +1 -0
  122. package/app/dist/assets/glimmer-js-Rg0-pVw9.js +1 -0
  123. package/app/dist/assets/glimmer-ts-U6CK756n.js +1 -0
  124. package/app/dist/assets/glsl-DplSGwfg.js +1 -0
  125. package/app/dist/assets/gn-n2N0HUVH.js +1 -0
  126. package/app/dist/assets/gnuplot-DdkO51Og.js +1 -0
  127. package/app/dist/assets/go-CxLEBnE3.js +1 -0
  128. package/app/dist/assets/graphql-ChdNCCLP.js +1 -0
  129. package/app/dist/assets/groovy-D9Dt4D0W.js +1 -0
  130. package/app/dist/assets/groovy-gcz8RCvz.js +1 -0
  131. package/app/dist/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
  132. package/app/dist/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
  133. package/app/dist/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
  134. package/app/dist/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
  135. package/app/dist/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
  136. package/app/dist/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
  137. package/app/dist/assets/hack-CaT9iCJl.js +1 -0
  138. package/app/dist/assets/haml-B8DHNrY2.js +1 -0
  139. package/app/dist/assets/handlebars-BL8al0AC.js +1 -0
  140. package/app/dist/assets/haskell-Cw1EW3IL.js +1 -0
  141. package/app/dist/assets/haskell-Df6bDoY_.js +1 -0
  142. package/app/dist/assets/haxe-CzTSHFRz.js +1 -0
  143. package/app/dist/assets/haxe-H-WmDvRZ.js +1 -0
  144. package/app/dist/assets/hcl-BWvSN4gD.js +1 -0
  145. package/app/dist/assets/hjson-D5-asLiD.js +1 -0
  146. package/app/dist/assets/hlsl-D3lLCCz7.js +1 -0
  147. package/app/dist/assets/horizon-BUw7H-hv.js +1 -0
  148. package/app/dist/assets/houston-DnULxvSX.js +1 -0
  149. package/app/dist/assets/html-GMplVEZG.js +1 -0
  150. package/app/dist/assets/html-derivative-BFtXZ54Q.js +1 -0
  151. package/app/dist/assets/http-DBlCnlav.js +1 -0
  152. package/app/dist/assets/http-jrhK8wxY.js +1 -0
  153. package/app/dist/assets/hurl-irOxFIW8.js +1 -0
  154. package/app/dist/assets/hxml-Bvhsp5Yf.js +1 -0
  155. package/app/dist/assets/hy-DFXneXwc.js +1 -0
  156. package/app/dist/assets/idl-BEugSyMb.js +1 -0
  157. package/app/dist/assets/imba-DGztddWO.js +1 -0
  158. package/app/dist/assets/index-5zX9_mJn.js +1 -0
  159. package/app/dist/assets/index-B4OhG7R9.js +1 -0
  160. package/app/dist/assets/index-B4kat0j1.js +7 -0
  161. package/app/dist/assets/index-BbFg11BX.js +1 -0
  162. package/app/dist/assets/index-BeI31aOW.js +48 -0
  163. package/app/dist/assets/index-C07W8XY7.js +1 -0
  164. package/app/dist/assets/index-CLCqkEcA.js +1 -0
  165. package/app/dist/assets/index-COgEItgI.js +1 -0
  166. package/app/dist/assets/index-Caa-a1PE.js +2 -0
  167. package/app/dist/assets/index-CvAaUCm5.js +1 -0
  168. package/app/dist/assets/index-DDqgfG5o.js +1 -0
  169. package/app/dist/assets/index-DLjiZx9h.js +1 -0
  170. package/app/dist/assets/index-DcnZ8L6Y.js +3 -0
  171. package/app/dist/assets/index-DksBloEA.js +1 -0
  172. package/app/dist/assets/index-DlrXwdpb.css +1 -0
  173. package/app/dist/assets/index-FVD-6MCq.js +1 -0
  174. package/app/dist/assets/index-IZk0Eanm.js +334 -0
  175. package/app/dist/assets/index-aSkmrFGo.js +1 -0
  176. package/app/dist/assets/index-iTcD8pV7.js +1 -0
  177. package/app/dist/assets/index-wQuJ1T-l.js +1 -0
  178. package/app/dist/assets/ini-BEwlwnbL.js +1 -0
  179. package/app/dist/assets/java-CylS5w8V.js +1 -0
  180. package/app/dist/assets/javascript-iXu5QeM3.js +1 -0
  181. package/app/dist/assets/javascript-wDzz0qaB.js +1 -0
  182. package/app/dist/assets/jinja-4LBKfQ-Z.js +1 -0
  183. package/app/dist/assets/jison-wvAkD_A8.js +1 -0
  184. package/app/dist/assets/json-Cp-IABpG.js +1 -0
  185. package/app/dist/assets/json5-C9tS-k6U.js +1 -0
  186. package/app/dist/assets/jsonc-Des-eS-w.js +1 -0
  187. package/app/dist/assets/jsonl-DcaNXYhu.js +1 -0
  188. package/app/dist/assets/jsonnet-DFQXde-d.js +1 -0
  189. package/app/dist/assets/jssm-C2t-YnRu.js +1 -0
  190. package/app/dist/assets/jsx-g9-lgVsj.js +1 -0
  191. package/app/dist/assets/julia-CxzCAyBv.js +1 -0
  192. package/app/dist/assets/julia-DuME0IfC.js +1 -0
  193. package/app/dist/assets/kanagawa-dragon-CkXjmgJE.js +1 -0
  194. package/app/dist/assets/kanagawa-lotus-CfQXZHmo.js +1 -0
  195. package/app/dist/assets/kanagawa-wave-DWedfzmr.js +1 -0
  196. package/app/dist/assets/kdl-DV7GczEv.js +1 -0
  197. package/app/dist/assets/kotlin-BdnUsdx6.js +1 -0
  198. package/app/dist/assets/kusto-DZf3V79B.js +1 -0
  199. package/app/dist/assets/laserwave-DUszq2jm.js +1 -0
  200. package/app/dist/assets/latex-DGMBWnxU.js +1 -0
  201. package/app/dist/assets/lean-BZvkOJ9d.js +1 -0
  202. package/app/dist/assets/less-B1dDrJ26.js +1 -0
  203. package/app/dist/assets/light-plus-B7mTdjB0.js +1 -0
  204. package/app/dist/assets/liquid-DYVedYrR.js +1 -0
  205. package/app/dist/assets/livescript-BwQOo05w.js +1 -0
  206. package/app/dist/assets/llvm-BtvRca6l.js +1 -0
  207. package/app/dist/assets/log-2UxHyX5q.js +1 -0
  208. package/app/dist/assets/logo-BtOb2qkB.js +1 -0
  209. package/app/dist/assets/lua-BaeVxFsk.js +1 -0
  210. package/app/dist/assets/lua-BgMRiT3U.js +1 -0
  211. package/app/dist/assets/luau-C-HG3fhB.js +1 -0
  212. package/app/dist/assets/make-CHLpvVh8.js +1 -0
  213. package/app/dist/assets/markdown-Cvjx9yec.js +1 -0
  214. package/app/dist/assets/marko-DZsq8hO1.js +1 -0
  215. package/app/dist/assets/material-theme-D5KoaKCx.js +1 -0
  216. package/app/dist/assets/material-theme-darker-BfHTSMKl.js +1 -0
  217. package/app/dist/assets/material-theme-lighter-B0m2ddpp.js +1 -0
  218. package/app/dist/assets/material-theme-ocean-CyktbL80.js +1 -0
  219. package/app/dist/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
  220. package/app/dist/assets/mathematica-DTrFuWx2.js +1 -0
  221. package/app/dist/assets/matlab-D7o27uSR.js +1 -0
  222. package/app/dist/assets/mbox-CNhZ1qSd.js +1 -0
  223. package/app/dist/assets/mdc-DUICxH0z.js +1 -0
  224. package/app/dist/assets/mdx-Cmh6b_Ma.js +1 -0
  225. package/app/dist/assets/mermaid-mWjccvbQ.js +1 -0
  226. package/app/dist/assets/min-dark-CafNBF8u.js +1 -0
  227. package/app/dist/assets/min-light-CTRr51gU.js +1 -0
  228. package/app/dist/assets/mipsasm-CKIfxQSi.js +1 -0
  229. package/app/dist/assets/mirc-CjQqDB4T.js +1 -0
  230. package/app/dist/assets/mllike-CXdrOF99.js +1 -0
  231. package/app/dist/assets/modelica-Dc1JOy9r.js +1 -0
  232. package/app/dist/assets/mojo-B93PlW-d.js +1 -0
  233. package/app/dist/assets/monokai-D4h5O-jR.js +1 -0
  234. package/app/dist/assets/moonbit-Ba13S78F.js +1 -0
  235. package/app/dist/assets/move-IF9eRakj.js +1 -0
  236. package/app/dist/assets/mscgen-BA5vi2Kp.js +1 -0
  237. package/app/dist/assets/mumps-BT43cFF4.js +1 -0
  238. package/app/dist/assets/narrat-DRg8JJMk.js +1 -0
  239. package/app/dist/assets/nextflow-BrzmwbiE.js +1 -0
  240. package/app/dist/assets/nginx-BpAMiNFr.js +1 -0
  241. package/app/dist/assets/nginx-DdIZxoE0.js +1 -0
  242. package/app/dist/assets/night-owl-C39BiMTA.js +1 -0
  243. package/app/dist/assets/night-owl-light-CMTm3GFP.js +1 -0
  244. package/app/dist/assets/nim-CVrawwO9.js +1 -0
  245. package/app/dist/assets/nix-CwoSXNpI.js +1 -0
  246. package/app/dist/assets/nord-Ddv68eIx.js +1 -0
  247. package/app/dist/assets/nsis-LdVXkNf5.js +1 -0
  248. package/app/dist/assets/ntriples-BfvgReVJ.js +1 -0
  249. package/app/dist/assets/nushell-C-sUppwS.js +1 -0
  250. package/app/dist/assets/objective-c-DXmwc3jG.js +1 -0
  251. package/app/dist/assets/objective-cpp-CLxacb5B.js +1 -0
  252. package/app/dist/assets/ocaml-C0hk2d4L.js +1 -0
  253. package/app/dist/assets/octave-Ck1zUtKM.js +1 -0
  254. package/app/dist/assets/odin-BBf5iR-q.js +1 -0
  255. package/app/dist/assets/one-dark-pro-DVMEJ2y_.js +1 -0
  256. package/app/dist/assets/one-light-C3Wv6jpd.js +1 -0
  257. package/app/dist/assets/openscad-C4EeE6gA.js +1 -0
  258. package/app/dist/assets/oz-BzwKVEFT.js +1 -0
  259. package/app/dist/assets/pascal--L3eBynH.js +1 -0
  260. package/app/dist/assets/pascal-D93ZcfNL.js +1 -0
  261. package/app/dist/assets/perl-C0TMdlhV.js +1 -0
  262. package/app/dist/assets/perl-CdXCOZ3F.js +1 -0
  263. package/app/dist/assets/php-Dhbhpdrm.js +1 -0
  264. package/app/dist/assets/pig-CevX1Tat.js +1 -0
  265. package/app/dist/assets/pkl-u5AG7uiY.js +1 -0
  266. package/app/dist/assets/plastic-3e1v2bzS.js +1 -0
  267. package/app/dist/assets/plsql-ChMvpjG-.js +1 -0
  268. package/app/dist/assets/po-BTJTHyun.js +1 -0
  269. package/app/dist/assets/poimandres-CS3Unz2-.js +1 -0
  270. package/app/dist/assets/polar-C0HS_06l.js +1 -0
  271. package/app/dist/assets/postcss-CXtECtnM.js +1 -0
  272. package/app/dist/assets/powerquery-CEu0bR-o.js +1 -0
  273. package/app/dist/assets/powershell-CFHJl5sT.js +1 -0
  274. package/app/dist/assets/powershell-Dpen1YoG.js +1 -0
  275. package/app/dist/assets/prisma-Dd19v3D-.js +1 -0
  276. package/app/dist/assets/prolog-CbFg5uaA.js +1 -0
  277. package/app/dist/assets/properties-C78fOPTZ.js +1 -0
  278. package/app/dist/assets/proto-C7zT0LnQ.js +1 -0
  279. package/app/dist/assets/protobuf-ChK-085T.js +1 -0
  280. package/app/dist/assets/pug-CGlum2m_.js +1 -0
  281. package/app/dist/assets/pug-DeIclll2.js +1 -0
  282. package/app/dist/assets/puppet-BMWR74SV.js +1 -0
  283. package/app/dist/assets/puppet-DMA9R1ak.js +1 -0
  284. package/app/dist/assets/purescript-CklMAg4u.js +1 -0
  285. package/app/dist/assets/python-B6aJPvgy.js +1 -0
  286. package/app/dist/assets/python-BuPzkPfP.js +1 -0
  287. package/app/dist/assets/q-pXgVlZs6.js +1 -0
  288. package/app/dist/assets/qml-3beO22l8.js +1 -0
  289. package/app/dist/assets/qmldir-C8lEn-DE.js +1 -0
  290. package/app/dist/assets/qss-IeuSbFQv.js +1 -0
  291. package/app/dist/assets/r-B6wPVr8A.js +1 -0
  292. package/app/dist/assets/r-Dspwwk_N.js +1 -0
  293. package/app/dist/assets/racket-BqYA7rlc.js +1 -0
  294. package/app/dist/assets/raku-DXvB9xmW.js +1 -0
  295. package/app/dist/assets/razor-Uh8Bk_45.js +1 -0
  296. package/app/dist/assets/red-bN70gL4F.js +1 -0
  297. package/app/dist/assets/reg-C-SQnVFl.js +1 -0
  298. package/app/dist/assets/regexp-CDVJQ6XC.js +1 -0
  299. package/app/dist/assets/rel-C3B-1QV4.js +1 -0
  300. package/app/dist/assets/riscv-BM1_JUlF.js +1 -0
  301. package/app/dist/assets/ron-BhRPY-oY.js +1 -0
  302. package/app/dist/assets/rose-pine-dawn-DHQR4-dF.js +1 -0
  303. package/app/dist/assets/rose-pine-moon-D4_iv3hh.js +1 -0
  304. package/app/dist/assets/rose-pine-qdsjHGoJ.js +1 -0
  305. package/app/dist/assets/rosmsg-BJDFO7_C.js +1 -0
  306. package/app/dist/assets/rpm-CTu-6PCP.js +1 -0
  307. package/app/dist/assets/rst-D5oM4XIm.js +1 -0
  308. package/app/dist/assets/ruby-B2Rjki9n.js +1 -0
  309. package/app/dist/assets/ruby-Cw6WdidG.js +1 -0
  310. package/app/dist/assets/rust-B1yitclQ.js +1 -0
  311. package/app/dist/assets/sas-B4kiWyti.js +1 -0
  312. package/app/dist/assets/sas-cz2c8ADy.js +1 -0
  313. package/app/dist/assets/sass-Cj5Yp3dK.js +1 -0
  314. package/app/dist/assets/scala-C151Ov-r.js +1 -0
  315. package/app/dist/assets/scheme-C41bIUwD.js +1 -0
  316. package/app/dist/assets/scheme-C98Dy4si.js +1 -0
  317. package/app/dist/assets/scss-OYdSNvt2.js +1 -0
  318. package/app/dist/assets/sdbl-DVxCFoDh.js +1 -0
  319. package/app/dist/assets/shaderlab-Dg9Lc6iA.js +1 -0
  320. package/app/dist/assets/shell-CjFT_Tl9.js +1 -0
  321. package/app/dist/assets/shellscript-Yzrsuije.js +1 -0
  322. package/app/dist/assets/shellsession-BADoaaVG.js +1 -0
  323. package/app/dist/assets/sieve-C3Gn_uJK.js +1 -0
  324. package/app/dist/assets/simple-mode-GW_nhZxv.js +1 -0
  325. package/app/dist/assets/slack-dark-BthQWCQV.js +1 -0
  326. package/app/dist/assets/slack-ochin-DqwNpetd.js +1 -0
  327. package/app/dist/assets/smalltalk-BERRCDM3.js +1 -0
  328. package/app/dist/assets/smalltalk-CnHTOXQT.js +1 -0
  329. package/app/dist/assets/snazzy-light-Bw305WKR.js +1 -0
  330. package/app/dist/assets/solarized-dark-DXbdFlpD.js +1 -0
  331. package/app/dist/assets/solarized-light-L9t79GZl.js +1 -0
  332. package/app/dist/assets/solidity-rGO070M0.js +1 -0
  333. package/app/dist/assets/solr-DehyRSwq.js +1 -0
  334. package/app/dist/assets/soy-Brmx7dQM.js +1 -0
  335. package/app/dist/assets/sparql-DkYu6x3z.js +1 -0
  336. package/app/dist/assets/sparql-rVzFXLq3.js +1 -0
  337. package/app/dist/assets/splunk-BtCnVYZw.js +1 -0
  338. package/app/dist/assets/spreadsheet-BCZA_wO0.js +1 -0
  339. package/app/dist/assets/sql-BLtJtn59.js +1 -0
  340. package/app/dist/assets/sql-D0XecflT.js +1 -0
  341. package/app/dist/assets/ssh-config-_ykCGR6B.js +1 -0
  342. package/app/dist/assets/stata-BH5u7GGu.js +1 -0
  343. package/app/dist/assets/stex-C3f8Ysf7.js +1 -0
  344. package/app/dist/assets/stylus-B533Al4x.js +1 -0
  345. package/app/dist/assets/stylus-BEDo0Tqx.js +1 -0
  346. package/app/dist/assets/surrealql-Bq5Q-fJD.js +1 -0
  347. package/app/dist/assets/svelte-zxCyuUbr.js +1 -0
  348. package/app/dist/assets/swift-BzpIVaGY.js +1 -0
  349. package/app/dist/assets/swift-Dg5xB15N.js +1 -0
  350. package/app/dist/assets/synthwave-84-CbfX1IO0.js +1 -0
  351. package/app/dist/assets/system-verilog-CnnmHF94.js +1 -0
  352. package/app/dist/assets/systemd-4A_iFExJ.js +1 -0
  353. package/app/dist/assets/talonscript-CkByrt1z.js +1 -0
  354. package/app/dist/assets/tasl-QIJgUcNo.js +1 -0
  355. package/app/dist/assets/tcl-DVfN8rqt.js +1 -0
  356. package/app/dist/assets/tcl-dwOrl1Do.js +1 -0
  357. package/app/dist/assets/templ-P3uqSqPl.js +1 -0
  358. package/app/dist/assets/terraform-BETggiCN.js +1 -0
  359. package/app/dist/assets/tex-CvyZ59Mk.js +1 -0
  360. package/app/dist/assets/textile-CnDTJFAw.js +1 -0
  361. package/app/dist/assets/tiddlywiki-DO-Gjzrf.js +1 -0
  362. package/app/dist/assets/tiki-DGYXhP31.js +1 -0
  363. package/app/dist/assets/tokyo-night-hegEt444.js +1 -0
  364. package/app/dist/assets/toml-Bm5Em-hy.js +1 -0
  365. package/app/dist/assets/toml-vGWfd6FD.js +1 -0
  366. package/app/dist/assets/troff-wAsdV37c.js +1 -0
  367. package/app/dist/assets/ts-tags-zn1MmPIZ.js +1 -0
  368. package/app/dist/assets/tsv-B_m7g4N7.js +1 -0
  369. package/app/dist/assets/tsx-COt5Ahok.js +1 -0
  370. package/app/dist/assets/ttcn-CfJYG6tj.js +1 -0
  371. package/app/dist/assets/ttcn-cfg-B9xdYoR4.js +1 -0
  372. package/app/dist/assets/turtle-B1tBg_DP.js +1 -0
  373. package/app/dist/assets/turtle-BsS91CYL.js +1 -0
  374. package/app/dist/assets/twig-ChbOoGGc.js +1 -0
  375. package/app/dist/assets/typescript-BPQ3VLAy.js +1 -0
  376. package/app/dist/assets/typespec-BGHnOYBU.js +1 -0
  377. package/app/dist/assets/typst-DHCkPAjA.js +1 -0
  378. package/app/dist/assets/v-BcVCzyr7.js +1 -0
  379. package/app/dist/assets/vala-CsfeWuGM.js +1 -0
  380. package/app/dist/assets/vb-CmGdzxic.js +1 -0
  381. package/app/dist/assets/vb-D17OF-Vu.js +1 -0
  382. package/app/dist/assets/vbscript-BuJXcnF6.js +1 -0
  383. package/app/dist/assets/velocity-D8B20fx6.js +1 -0
  384. package/app/dist/assets/verilog-BQ8w6xss.js +1 -0
  385. package/app/dist/assets/verilog-C6RDOZhf.js +1 -0
  386. package/app/dist/assets/vesper-DU1UobuO.js +1 -0
  387. package/app/dist/assets/vhdl-CeAyd5Ju.js +1 -0
  388. package/app/dist/assets/vhdl-lSbBsy5d.js +1 -0
  389. package/app/dist/assets/viml-CJc9bBzg.js +1 -0
  390. package/app/dist/assets/vitesse-black-Bkuqu6BP.js +1 -0
  391. package/app/dist/assets/vitesse-dark-D0r3Knsf.js +1 -0
  392. package/app/dist/assets/vitesse-light-CVO1_9PV.js +1 -0
  393. package/app/dist/assets/vue-DN_0RTcg.js +1 -0
  394. package/app/dist/assets/vue-html-AaS7Mt5G.js +1 -0
  395. package/app/dist/assets/vue-vine-CQOfvN7w.js +1 -0
  396. package/app/dist/assets/vyper-CDx5xZoG.js +1 -0
  397. package/app/dist/assets/wasm-CG6Dc4jp.js +1 -0
  398. package/app/dist/assets/wasm-MzD3tlZU.js +1 -0
  399. package/app/dist/assets/webidl-ZXfAyPTL.js +1 -0
  400. package/app/dist/assets/wenyan-BV7otONQ.js +1 -0
  401. package/app/dist/assets/wgsl-Dx-B1_4e.js +1 -0
  402. package/app/dist/assets/wikitext-BhOHFoWU.js +1 -0
  403. package/app/dist/assets/wit-5i3qLPDT.js +1 -0
  404. package/app/dist/assets/wolfram-lXgVvXCa.js +1 -0
  405. package/app/dist/assets/xml-sdJ4AIDG.js +1 -0
  406. package/app/dist/assets/xquery-DzFWVndE.js +1 -0
  407. package/app/dist/assets/xsl-CtQFsRM5.js +1 -0
  408. package/app/dist/assets/yacas-BJ4BC0dw.js +1 -0
  409. package/app/dist/assets/yaml-Buea-lGh.js +1 -0
  410. package/app/dist/assets/z80-Hz9HOZM7.js +1 -0
  411. package/app/dist/assets/zenscript-DVFEvuxE.js +1 -0
  412. package/app/dist/assets/zig-VOosw3JB.js +1 -0
  413. package/app/dist/index.html +13 -0
  414. package/app/src/lib/api/client.ts +234 -0
  415. package/app/src/lib/components/BlockCard.svelte +175 -0
  416. package/app/src/lib/components/BlockEditPanel.svelte +403 -0
  417. package/app/src/lib/components/BlockEditor.svelte +967 -0
  418. package/app/src/lib/components/CategoryNav.svelte +344 -0
  419. package/app/src/lib/components/ConfirmDialog.svelte +118 -0
  420. package/app/src/lib/components/ContextMenu.svelte +149 -0
  421. package/app/src/lib/components/CreateCategoryModal.svelte +171 -0
  422. package/app/src/lib/components/CreateDirectoryModal.svelte +212 -0
  423. package/app/src/lib/components/CreatePageModal.svelte +273 -0
  424. package/app/src/lib/components/EditorLayout.svelte +122 -0
  425. package/app/src/lib/components/ExternalChangeBanner.svelte +72 -0
  426. package/app/src/lib/components/FileTree.svelte +135 -0
  427. package/app/src/lib/components/FileTreeNode.svelte +253 -0
  428. package/app/src/lib/components/FrontmatterEditPanel.svelte +435 -0
  429. package/app/src/lib/components/FrontmatterEditor.svelte +549 -0
  430. package/app/src/lib/components/HeaderBar.svelte +322 -0
  431. package/app/src/lib/components/InlineEditor.svelte +234 -0
  432. package/app/src/lib/components/LayoutEditor.svelte +228 -0
  433. package/app/src/lib/components/MarkdownEditor.svelte +123 -0
  434. package/app/src/lib/components/NavEditor.svelte +359 -0
  435. package/app/src/lib/components/NavItemRow.svelte +165 -0
  436. package/app/src/lib/components/PageCard.svelte +45 -0
  437. package/app/src/lib/components/Popover.svelte +86 -0
  438. package/app/src/lib/components/PreviewPane.svelte +186 -0
  439. package/app/src/lib/components/RawYamlEditor.svelte +89 -0
  440. package/app/src/lib/components/RegionCard.svelte +258 -0
  441. package/app/src/lib/components/RenameDialog.svelte +143 -0
  442. package/app/src/lib/components/ResizeHandle.svelte +100 -0
  443. package/app/src/lib/components/RuneAttributes.svelte +197 -0
  444. package/app/src/lib/components/TagsInput.svelte +109 -0
  445. package/app/src/lib/editor/block-parser.ts +437 -0
  446. package/app/src/lib/preview/block-renderer.ts +74 -0
  447. package/dist/css.d.ts +6 -0
  448. package/dist/css.d.ts.map +1 -0
  449. package/dist/css.js +25 -0
  450. package/dist/css.js.map +1 -0
  451. package/dist/index.d.ts +5 -0
  452. package/dist/index.d.ts.map +1 -0
  453. package/dist/index.js +4 -0
  454. package/dist/index.js.map +1 -0
  455. package/dist/layout-resolver.d.ts +59 -0
  456. package/dist/layout-resolver.d.ts.map +1 -0
  457. package/dist/layout-resolver.js +166 -0
  458. package/dist/layout-resolver.js.map +1 -0
  459. package/dist/preview-builder.d.ts +16 -0
  460. package/dist/preview-builder.d.ts.map +1 -0
  461. package/dist/preview-builder.js +77 -0
  462. package/dist/preview-builder.js.map +1 -0
  463. package/dist/preview.d.ts +12 -0
  464. package/dist/preview.d.ts.map +1 -0
  465. package/dist/preview.js +70 -0
  466. package/dist/preview.js.map +1 -0
  467. package/dist/server.d.ts +26 -0
  468. package/dist/server.d.ts.map +1 -0
  469. package/dist/server.js +694 -0
  470. package/dist/server.js.map +1 -0
  471. package/package.json +76 -0
  472. package/preview-runtime/App.svelte +59 -0
  473. package/preview-runtime/index.html +17 -0
@@ -0,0 +1,109 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ tags: string[];
4
+ onchange: (tags: string[]) => void;
5
+ }
6
+
7
+ let { tags, onchange }: Props = $props();
8
+ let inputValue = $state('');
9
+
10
+ function addTag(value: string) {
11
+ const trimmed = value.trim();
12
+ if (trimmed && !tags.includes(trimmed)) {
13
+ onchange([...tags, trimmed]);
14
+ }
15
+ inputValue = '';
16
+ }
17
+
18
+ function removeTag(index: number) {
19
+ onchange(tags.filter((_, i) => i !== index));
20
+ }
21
+
22
+ function handleKeydown(e: KeyboardEvent) {
23
+ if (e.key === 'Enter' || e.key === ',') {
24
+ e.preventDefault();
25
+ addTag(inputValue);
26
+ } else if (e.key === 'Backspace' && inputValue === '' && tags.length > 0) {
27
+ removeTag(tags.length - 1);
28
+ }
29
+ }
30
+ </script>
31
+
32
+ <div class="tags-input">
33
+ {#each tags as tag, i}
34
+ <span class="tags-input__tag">
35
+ {tag}
36
+ <button
37
+ class="tags-input__remove"
38
+ onclick={() => removeTag(i)}
39
+ aria-label="Remove {tag}"
40
+ >&times;</button>
41
+ </span>
42
+ {/each}
43
+ <input
44
+ class="tags-input__field"
45
+ type="text"
46
+ bind:value={inputValue}
47
+ onkeydown={handleKeydown}
48
+ onblur={() => { if (inputValue.trim()) addTag(inputValue); }}
49
+ placeholder={tags.length === 0 ? 'Add tags...' : ''}
50
+ />
51
+ </div>
52
+
53
+ <style>
54
+ .tags-input {
55
+ display: flex;
56
+ flex-wrap: wrap;
57
+ gap: var(--ed-space-1);
58
+ padding: 0.3rem;
59
+ border: 1px solid var(--ed-border-default);
60
+ border-radius: var(--ed-radius-sm);
61
+ background: var(--ed-surface-0);
62
+ min-height: 2rem;
63
+ align-items: center;
64
+ }
65
+
66
+ .tags-input:focus-within {
67
+ border-color: var(--ed-accent);
68
+ box-shadow: 0 0 0 2px var(--ed-accent-ring);
69
+ }
70
+
71
+ .tags-input__tag {
72
+ display: inline-flex;
73
+ align-items: center;
74
+ gap: 0.2rem;
75
+ padding: 0.15rem 0.5rem;
76
+ background: var(--ed-accent-subtle);
77
+ color: var(--ed-heading);
78
+ border-radius: 99px;
79
+ font-size: var(--ed-text-xs);
80
+ font-weight: 600;
81
+ line-height: 1.2;
82
+ }
83
+
84
+ .tags-input__remove {
85
+ background: none;
86
+ border: none;
87
+ color: var(--ed-heading);
88
+ cursor: pointer;
89
+ font-size: 0.85rem;
90
+ padding: 0;
91
+ line-height: 1;
92
+ opacity: 0.6;
93
+ }
94
+
95
+ .tags-input__remove:hover {
96
+ opacity: 1;
97
+ }
98
+
99
+ .tags-input__field {
100
+ flex: 1;
101
+ min-width: 60px;
102
+ border: none;
103
+ outline: none;
104
+ font-size: var(--ed-text-base);
105
+ padding: var(--ed-space-1) var(--ed-space-2);
106
+ background: transparent;
107
+ color: var(--ed-text-primary);
108
+ }
109
+ </style>
@@ -0,0 +1,437 @@
1
+ import type { RuneInfo } from '../api/client.js';
2
+
3
+ /**
4
+ * Block types recognized by the visual editor.
5
+ *
6
+ * - heading: `# …` through `###### …`
7
+ * - paragraph: plain text (may span multiple lines)
8
+ * - fence: ``` code blocks ```
9
+ * - rune: `{% name … %}…{% /name %}` or self-closing `{% name … /%}`
10
+ * - list: `- …` or `1. …` runs
11
+ * - quote: `> …` runs
12
+ * - hr: `---` / `***` / `___`
13
+ * - image: `![alt](src)` on its own line
14
+ */
15
+ export type BlockType =
16
+ | 'heading'
17
+ | 'paragraph'
18
+ | 'fence'
19
+ | 'rune'
20
+ | 'list'
21
+ | 'quote'
22
+ | 'hr'
23
+ | 'image';
24
+
25
+ export interface Block {
26
+ id: string;
27
+ type: BlockType;
28
+ /** Raw source text for this block (including tag delimiters for runes) */
29
+ source: string;
30
+ /** 0-based start line in the document */
31
+ startLine: number;
32
+ /** 0-based end line (exclusive) */
33
+ endLine: number;
34
+ }
35
+
36
+ export interface HeadingBlock extends Block {
37
+ type: 'heading';
38
+ level: number;
39
+ text: string;
40
+ }
41
+
42
+ export interface RuneBlock extends Block {
43
+ type: 'rune';
44
+ runeName: string;
45
+ selfClosing: boolean;
46
+ /** Parsed attribute key=value pairs */
47
+ attributes: Record<string, string>;
48
+ /** Inner content (between open/close tags) */
49
+ innerContent: string;
50
+ }
51
+
52
+ export interface FenceBlock extends Block {
53
+ type: 'fence';
54
+ language: string;
55
+ code: string;
56
+ }
57
+
58
+ export interface ListBlock extends Block {
59
+ type: 'list';
60
+ ordered: boolean;
61
+ }
62
+
63
+ export type ParsedBlock =
64
+ | HeadingBlock
65
+ | RuneBlock
66
+ | FenceBlock
67
+ | ListBlock
68
+ | (Block & { type: 'paragraph' | 'quote' | 'hr' | 'image' });
69
+
70
+ /** Deterministic hash (djb2) for stable block IDs across re-parses */
71
+ function hashSource(s: string): string {
72
+ let h = 5381;
73
+ for (let i = 0; i < s.length; i++) {
74
+ h = ((h << 5) + h + s.charCodeAt(i)) >>> 0;
75
+ }
76
+ return h.toString(36);
77
+ }
78
+
79
+ /** Generate a stable ID from block source content, deduplicating identical blocks */
80
+ function stableId(source: string, seen: Map<string, number>): string {
81
+ const hash = hashSource(source);
82
+ const count = seen.get(hash) ?? 0;
83
+ seen.set(hash, count + 1);
84
+ return count === 0 ? `blk_${hash}` : `blk_${hash}_${count}`;
85
+ }
86
+
87
+ // ── Rune tag regex helpers ───────────────────────────────────────────
88
+
89
+ /** Matches an opening rune tag: {% name attr="val" attr=2 %} or self-closing {% name /%} */
90
+ const RUNE_OPEN_RE = /^\{%\s+(\w[\w-]*)((?:\s+\w[\w-]*(?:="[^"]*"|=[\w.-]+)?)*)\s*(\/?)\s*%\}/;
91
+
92
+ /** Matches a closing rune tag: {% /name %} */
93
+ function runeCloseRe(name: string): RegExp {
94
+ return new RegExp(`^\\{%\\s+/${name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\s*%\\}`);
95
+ }
96
+
97
+ /** Parse attribute string like `method="POST" path="/users" count=3 auth` into Record */
98
+ function parseAttributes(raw: string): Record<string, string> {
99
+ const attrs: Record<string, string> = {};
100
+ const re = /(\w[\w-]*)(?:="([^"]*)"|=([\w.-]+))?/g;
101
+ let m: RegExpExecArray | null;
102
+ while ((m = re.exec(raw)) !== null) {
103
+ attrs[m[1]] = m[2] ?? m[3] ?? 'true';
104
+ }
105
+ return attrs;
106
+ }
107
+
108
+ /** Serialize attributes back to Markdoc syntax */
109
+ export function serializeAttributes(attrs: Record<string, string>): string {
110
+ const parts: string[] = [];
111
+ for (const [key, value] of Object.entries(attrs)) {
112
+ if (value === 'true') {
113
+ parts.push(key);
114
+ } else {
115
+ parts.push(`${key}="${value}"`);
116
+ }
117
+ }
118
+ return parts.length > 0 ? ' ' + parts.join(' ') : '';
119
+ }
120
+
121
+ // ── Main parser ──────────────────────────────────────────────────────
122
+
123
+ /**
124
+ * Parse a Markdoc body string into an ordered list of blocks.
125
+ * Each block maps to a contiguous range of source lines.
126
+ */
127
+ export function parseBlocks(source: string): ParsedBlock[] {
128
+ const lines = source.split('\n');
129
+ const blocks: ParsedBlock[] = [];
130
+ const seen = new Map<string, number>();
131
+ let i = 0;
132
+
133
+ while (i < lines.length) {
134
+ const line = lines[i];
135
+ const trimmed = line.trimStart();
136
+
137
+ // Skip blank lines between blocks
138
+ if (trimmed === '') {
139
+ i++;
140
+ continue;
141
+ }
142
+
143
+ // ── Fenced code blocks ───────────────────────────────────
144
+ if (trimmed.startsWith('```') || trimmed.startsWith('~~~')) {
145
+ const fence = trimmed.slice(0, 3);
146
+ const lang = trimmed.slice(3).trim();
147
+ const start = i;
148
+ i++;
149
+ const codeLines: string[] = [];
150
+ while (i < lines.length && !lines[i].trimStart().startsWith(fence)) {
151
+ codeLines.push(lines[i]);
152
+ i++;
153
+ }
154
+ if (i < lines.length) i++; // skip closing fence
155
+ const src = lines.slice(start, i).join('\n');
156
+ blocks.push({
157
+ id: stableId(src, seen),
158
+ type: 'fence',
159
+ source: src,
160
+ startLine: start,
161
+ endLine: i,
162
+ language: lang,
163
+ code: codeLines.join('\n'),
164
+ });
165
+ continue;
166
+ }
167
+
168
+ // ── Rune tags ────────────────────────────────────────────
169
+ const runeMatch = RUNE_OPEN_RE.exec(trimmed);
170
+ if (runeMatch) {
171
+ const name = runeMatch[1];
172
+ const attrStr = runeMatch[2] ?? '';
173
+ const selfClose = runeMatch[3] === '/';
174
+ const start = i;
175
+
176
+ if (selfClose) {
177
+ i++;
178
+ const src = lines.slice(start, i).join('\n');
179
+ blocks.push({
180
+ id: stableId(src, seen),
181
+ type: 'rune',
182
+ source: src,
183
+ startLine: start,
184
+ endLine: i,
185
+ runeName: name,
186
+ selfClosing: true,
187
+ attributes: parseAttributes(attrStr),
188
+ innerContent: '',
189
+ });
190
+ } else {
191
+ // Find matching close tag
192
+ i++;
193
+ const closeRe = runeCloseRe(name);
194
+ const innerLines: string[] = [];
195
+ let depth = 1;
196
+ while (i < lines.length) {
197
+ const lt = lines[i].trimStart();
198
+ // Check for nested open of same name
199
+ const nestedOpen = RUNE_OPEN_RE.exec(lt);
200
+ if (nestedOpen && nestedOpen[1] === name && nestedOpen[3] !== '/') {
201
+ depth++;
202
+ }
203
+ if (closeRe.test(lt)) {
204
+ depth--;
205
+ if (depth === 0) break;
206
+ }
207
+ innerLines.push(lines[i]);
208
+ i++;
209
+ }
210
+ if (i < lines.length) i++; // skip close tag
211
+ const src = lines.slice(start, i).join('\n');
212
+ blocks.push({
213
+ id: stableId(src, seen),
214
+ type: 'rune',
215
+ source: src,
216
+ startLine: start,
217
+ endLine: i,
218
+ runeName: name,
219
+ selfClosing: false,
220
+ attributes: parseAttributes(attrStr),
221
+ innerContent: innerLines.join('\n'),
222
+ });
223
+ }
224
+ continue;
225
+ }
226
+
227
+ // ── Headings ─────────────────────────────────────────────
228
+ const headingMatch = trimmed.match(/^(#{1,6})\s+(.*)/);
229
+ if (headingMatch) {
230
+ const start = i;
231
+ i++;
232
+ const src = lines.slice(start, i).join('\n');
233
+ blocks.push({
234
+ id: stableId(src, seen),
235
+ type: 'heading',
236
+ source: src,
237
+ startLine: start,
238
+ endLine: i,
239
+ level: headingMatch[1].length,
240
+ text: headingMatch[2],
241
+ });
242
+ continue;
243
+ }
244
+
245
+ // ── HR ───────────────────────────────────────────────────
246
+ if (/^(---+|___+|\*\*\*+)\s*$/.test(trimmed)) {
247
+ const start = i;
248
+ i++;
249
+ const src = lines.slice(start, i).join('\n');
250
+ blocks.push({
251
+ id: stableId(src, seen),
252
+ type: 'hr',
253
+ source: src,
254
+ startLine: start,
255
+ endLine: i,
256
+ });
257
+ continue;
258
+ }
259
+
260
+ // ── Image (standalone line) ──────────────────────────────
261
+ if (/^!\[.*\]\(.*\)\s*$/.test(trimmed)) {
262
+ const start = i;
263
+ i++;
264
+ const src = lines.slice(start, i).join('\n');
265
+ blocks.push({
266
+ id: stableId(src, seen),
267
+ type: 'image',
268
+ source: src,
269
+ startLine: start,
270
+ endLine: i,
271
+ });
272
+ continue;
273
+ }
274
+
275
+ // ── Blockquote ───────────────────────────────────────────
276
+ if (trimmed.startsWith('>')) {
277
+ const start = i;
278
+ while (i < lines.length && (lines[i].trimStart().startsWith('>') || (lines[i].trim() !== '' && !isBlockStart(lines[i])))) {
279
+ i++;
280
+ }
281
+ const src = lines.slice(start, i).join('\n');
282
+ blocks.push({
283
+ id: stableId(src, seen),
284
+ type: 'quote',
285
+ source: src,
286
+ startLine: start,
287
+ endLine: i,
288
+ });
289
+ continue;
290
+ }
291
+
292
+ // ── List ─────────────────────────────────────────────────
293
+ const listMatch = trimmed.match(/^(\d+\.|[-*+])\s/);
294
+ if (listMatch) {
295
+ const ordered = /^\d+\./.test(listMatch[1]);
296
+ const start = i;
297
+ while (i < lines.length) {
298
+ const lt = lines[i].trimStart();
299
+ // Continue if it's a list item, continuation indent, or blank line within
300
+ if (/^(\d+\.|[-*+])\s/.test(lt) || (lt === '' && i + 1 < lines.length && /^(\s+|\d+\.|[-*+]\s)/.test(lines[i + 1])) || (lt !== '' && lines[i].startsWith(' '))) {
301
+ i++;
302
+ } else {
303
+ break;
304
+ }
305
+ }
306
+ const src = lines.slice(start, i).join('\n');
307
+ blocks.push({
308
+ id: stableId(src, seen),
309
+ type: 'list',
310
+ source: src,
311
+ startLine: start,
312
+ endLine: i,
313
+ ordered,
314
+ });
315
+ continue;
316
+ }
317
+
318
+ // ── Paragraph (catch-all) ────────────────────────────────
319
+ {
320
+ const start = i;
321
+ while (i < lines.length && lines[i].trim() !== '' && !isBlockStart(lines[i])) {
322
+ i++;
323
+ }
324
+ const src = lines.slice(start, i).join('\n');
325
+ blocks.push({
326
+ id: stableId(src, seen),
327
+ type: 'paragraph',
328
+ source: src,
329
+ startLine: start,
330
+ endLine: i,
331
+ });
332
+ }
333
+ }
334
+
335
+ return blocks;
336
+ }
337
+
338
+ /** Check if a line starts a new block-level element */
339
+ function isBlockStart(line: string): boolean {
340
+ const t = line.trimStart();
341
+ if (t.startsWith('#')) return true;
342
+ if (t.startsWith('```') || t.startsWith('~~~')) return true;
343
+ if (RUNE_OPEN_RE.test(t)) return true;
344
+ if (/^(---+|___+|\*\*\*+)\s*$/.test(t)) return true;
345
+ if (t.startsWith('>')) return true;
346
+ if (/^(\d+\.|[-*+])\s/.test(t)) return true;
347
+ if (/^!\[.*\]\(.*\)\s*$/.test(t)) return true;
348
+ return false;
349
+ }
350
+
351
+ // ── Serialization ────────────────────────────────────────────────────
352
+
353
+ /** Reconstruct source text from blocks */
354
+ export function serializeBlocks(blocks: ParsedBlock[]): string {
355
+ return blocks.map((b) => b.source).join('\n\n');
356
+ }
357
+
358
+ /** Rebuild a rune block's source from its attributes and inner content */
359
+ export function rebuildRuneSource(block: RuneBlock): string {
360
+ const attrStr = serializeAttributes(block.attributes);
361
+ if (block.selfClosing) {
362
+ return `{% ${block.runeName}${attrStr} /%}`;
363
+ }
364
+ const inner = block.innerContent.trim();
365
+ if (inner) {
366
+ return `{% ${block.runeName}${attrStr} %}\n${inner}\n{% /${block.runeName} %}`;
367
+ }
368
+ return `{% ${block.runeName}${attrStr} %}\n\n{% /${block.runeName} %}`;
369
+ }
370
+
371
+ /** Rebuild a heading block's source from level and text */
372
+ export function rebuildHeadingSource(block: HeadingBlock): string {
373
+ return '#'.repeat(block.level) + ' ' + block.text;
374
+ }
375
+
376
+ /** Rebuild a fence block's source from language and code */
377
+ export function rebuildFenceSource(block: FenceBlock): string {
378
+ return '```' + block.language + '\n' + block.code + '\n```';
379
+ }
380
+
381
+ // ── Rune lookup helper ───────────────────────────────────────────────
382
+
383
+ /** Build a map from rune name/alias to RuneInfo */
384
+ export function buildRuneMap(runes: RuneInfo[]): Map<string, RuneInfo> {
385
+ const map = new Map<string, RuneInfo>();
386
+ for (const r of runes) {
387
+ map.set(r.name, r);
388
+ for (const alias of r.aliases) {
389
+ map.set(alias, r);
390
+ }
391
+ }
392
+ return map;
393
+ }
394
+
395
+ // ── Example content extraction ───────────────────────────────────────
396
+
397
+ /** Extract the inner content from a full rune example string, stripping the opening/closing tags */
398
+ export function extractRuneInner(example: string, name: string): string {
399
+ const lines = example.split('\n');
400
+ // Strip opening tag line ({% name ... %})
401
+ const openRe = new RegExp(`^\\{%\\s+${name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\b.*%\\}\\s*$`);
402
+ const closeRe = new RegExp(`^\\{%\\s+/${name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\s*%\\}\\s*$`);
403
+
404
+ let start = 0;
405
+ let end = lines.length;
406
+
407
+ if (openRe.test(lines[0].trim())) start = 1;
408
+ if (end > start && closeRe.test(lines[end - 1].trim())) end -= 1;
409
+
410
+ return lines.slice(start, end).join('\n').trim();
411
+ }
412
+
413
+ /** Human-readable label for a block, used in rail labels and edit panel header */
414
+ export function blockLabel(block: ParsedBlock): string {
415
+ switch (block.type) {
416
+ case 'heading':
417
+ return `H${(block as HeadingBlock).level}`;
418
+ case 'rune':
419
+ return (block as RuneBlock).runeName;
420
+ case 'fence': {
421
+ const lang = (block as FenceBlock).language;
422
+ return lang ? `Code (${lang})` : 'Code';
423
+ }
424
+ case 'list':
425
+ return (block as ListBlock).ordered ? 'Ordered List' : 'List';
426
+ case 'quote':
427
+ return 'Blockquote';
428
+ case 'hr':
429
+ return 'Divider';
430
+ case 'image':
431
+ return 'Image';
432
+ case 'paragraph':
433
+ return 'Paragraph';
434
+ default:
435
+ return block.type;
436
+ }
437
+ }
@@ -0,0 +1,74 @@
1
+ import Markdoc from '@markdoc/markdoc';
2
+ import { tags, nodes, serializeTree } from '@refrakt-md/runes';
3
+ import { createTransform, renderToHtml } from '@refrakt-md/transform';
4
+ import type { ThemeConfig, RendererNode } from '@refrakt-md/transform';
5
+ import { baseConfig } from '@refrakt-md/theme-base';
6
+
7
+ /** Runes needing external resources or runtime data — show placeholder in editor */
8
+ const RUNTIME_ONLY_TYPES = new Set([
9
+ 'Nav', 'NavGroup', 'NavItem', // needs RfContext.pages
10
+ ]);
11
+
12
+ /**
13
+ * Restore postTransform hooks that were stripped during JSON serialization.
14
+ * The server strips functions from the themeConfig before sending it as JSON;
15
+ * we merge them back from the statically-imported baseConfig.
16
+ */
17
+ function restorePostTransforms(config: ThemeConfig): ThemeConfig {
18
+ const runes = { ...config.runes };
19
+ for (const [name, rune] of Object.entries(baseConfig.runes)) {
20
+ if (rune.postTransform && runes[name]) {
21
+ runes[name] = { ...runes[name], postTransform: rune.postTransform };
22
+ }
23
+ }
24
+ return { ...config, runes };
25
+ }
26
+
27
+ /**
28
+ * Render a single block's Markdoc source to HTML via the identity transform.
29
+ * Pure function, runs client-side, sub-millisecond per block.
30
+ *
31
+ * Returns `{ html, isComponent }`:
32
+ * - `html`: the rendered HTML string
33
+ * - `isComponent`: true if the block's root rune needs runtime resources (needs placeholder)
34
+ */
35
+ export function renderBlockPreview(
36
+ source: string,
37
+ themeConfig: ThemeConfig,
38
+ highlightTransform?: ((tree: RendererNode) => RendererNode) | null,
39
+ ): { html: string; isComponent: boolean } {
40
+ const ast = Markdoc.parse(source);
41
+ const fullConfig = restorePostTransforms(themeConfig);
42
+ const renderable = Markdoc.transform(ast, {
43
+ tags,
44
+ nodes,
45
+ variables: { __source: source, __icons: fullConfig.icons },
46
+ });
47
+ const serialized = serializeTree(renderable) as RendererNode;
48
+
49
+ // Check if the root rune needs runtime resources (placeholder)
50
+ const isComponent = checkIsRuntimeOnly(serialized);
51
+
52
+ const transform = createTransform(fullConfig);
53
+ let transformed = transform(serialized);
54
+
55
+ // Apply syntax highlighting if available
56
+ if (highlightTransform) {
57
+ transformed = highlightTransform(transformed);
58
+ }
59
+
60
+ const html = renderToHtml(transformed);
61
+
62
+ return { html, isComponent };
63
+ }
64
+
65
+ /** Walk the tree to check if any root-level rune needs runtime resources */
66
+ function checkIsRuntimeOnly(node: RendererNode): boolean {
67
+ if (node === null || node === undefined) return false;
68
+ if (typeof node === 'string' || typeof node === 'number') return false;
69
+ if (Array.isArray(node)) return node.some(checkIsRuntimeOnly);
70
+ if ('attributes' in node && node.attributes?.typeof) {
71
+ return RUNTIME_ONLY_TYPES.has(node.attributes.typeof);
72
+ }
73
+ return false;
74
+ }
package/dist/css.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Bundle a CSS file by recursively inlining @import statements.
3
+ * Handles relative paths only (no url() or external imports).
4
+ */
5
+ export declare function bundleCss(entryPath: string): string;
6
+ //# sourceMappingURL=css.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css.d.ts","sourceRoot":"","sources":["../src/css.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAGnD"}
package/dist/css.js ADDED
@@ -0,0 +1,25 @@
1
+ import { readFileSync, existsSync } from 'node:fs';
2
+ import { resolve, dirname } from 'node:path';
3
+ /**
4
+ * Bundle a CSS file by recursively inlining @import statements.
5
+ * Handles relative paths only (no url() or external imports).
6
+ */
7
+ export function bundleCss(entryPath) {
8
+ const seen = new Set();
9
+ return resolveImports(entryPath, seen);
10
+ }
11
+ function resolveImports(filePath, seen) {
12
+ const abs = resolve(filePath);
13
+ if (seen.has(abs))
14
+ return '';
15
+ seen.add(abs);
16
+ if (!existsSync(abs))
17
+ return `/* missing: ${filePath} */`;
18
+ const css = readFileSync(abs, 'utf-8');
19
+ const dir = dirname(abs);
20
+ return css.replace(/@import\s+['"]([^'"]+)['"];?/g, (_match, importPath) => {
21
+ const resolved = resolve(dir, importPath);
22
+ return resolveImports(resolved, seen);
23
+ });
24
+ }
25
+ //# sourceMappingURL=css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css.js","sourceRoot":"","sources":["../src/css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7C;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,SAAiB;IAC1C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,OAAO,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB,EAAE,IAAiB;IAC1D,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAEd,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,eAAe,QAAQ,KAAK,CAAC;IAE1D,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAEzB,OAAO,GAAG,CAAC,OAAO,CAAC,+BAA+B,EAAE,CAAC,MAAM,EAAE,UAAkB,EAAE,EAAE;QAClF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAC1C,OAAO,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { startEditor } from './server.js';
2
+ export type { EditorOptions } from './server.js';
3
+ export { bundleCss } from './css.js';
4
+ export { renderPreviewPage, renderPreviewContent } from './preview.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { startEditor } from './server.js';
2
+ export { bundleCss } from './css.js';
3
+ export { renderPreviewPage, renderPreviewContent } from './preview.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC"}