@akairos/myno 0.0.0-stage → 0.2.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 (231) hide show
  1. package/README.md +28 -2
  2. package/dist/.vite/manifest.json +1266 -0
  3. package/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  4. package/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  5. package/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  6. package/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  7. package/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  8. package/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  9. package/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  10. package/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  11. package/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  12. package/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  13. package/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  14. package/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  15. package/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  16. package/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  17. package/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  18. package/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  19. package/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  20. package/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  21. package/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  22. package/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  23. package/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  24. package/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  25. package/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  26. package/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  27. package/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  28. package/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  29. package/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  30. package/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  31. package/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  32. package/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  33. package/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  34. package/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  35. package/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  36. package/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  37. package/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  38. package/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  39. package/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  40. package/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  41. package/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  42. package/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  43. package/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  44. package/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  45. package/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  46. package/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  47. package/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  48. package/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  49. package/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  50. package/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  51. package/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  52. package/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  53. package/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  54. package/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  55. package/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  56. package/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  57. package/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  58. package/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  59. package/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  60. package/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  61. package/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  62. package/dist/assets/apl-B4CMkyY2.js +1 -0
  63. package/dist/assets/asciiarmor-Df11BRmG.js +1 -0
  64. package/dist/assets/asn1-EdZsLKOL.js +1 -0
  65. package/dist/assets/asterisk-B-8jnY81.js +1 -0
  66. package/dist/assets/brainfuck-C4LP7Hcl.js +1 -0
  67. package/dist/assets/clike-B9uivgTg.js +1 -0
  68. package/dist/assets/clojure-BMjYHr_A.js +1 -0
  69. package/dist/assets/cmake-BQqOBYOt.js +1 -0
  70. package/dist/assets/cobol-CWcv1MsR.js +1 -0
  71. package/dist/assets/coffeescript-S37ZYGWr.js +1 -0
  72. package/dist/assets/commonlisp-DBKNyK5s.js +1 -0
  73. package/dist/assets/crystal-SjHAIU92.js +1 -0
  74. package/dist/assets/css-BnMrqG3P.js +1 -0
  75. package/dist/assets/cypher-C_CwsFkJ.js +1 -0
  76. package/dist/assets/d-pRatUO7H.js +1 -0
  77. package/dist/assets/diff-DbItnlRl.js +1 -0
  78. package/dist/assets/dockerfile-BKs6k2Af.js +1 -0
  79. package/dist/assets/dtd-DF_7sFjM.js +1 -0
  80. package/dist/assets/dylan-DwRh75JA.js +1 -0
  81. package/dist/assets/ebnf-CDyGwa7X.js +1 -0
  82. package/dist/assets/ecl-Cabwm37j.js +1 -0
  83. package/dist/assets/eiffel-CnydiIhH.js +1 -0
  84. package/dist/assets/elm-vLlmbW-K.js +1 -0
  85. package/dist/assets/erlang-BNw1qcRV.js +1 -0
  86. package/dist/assets/factor-kuTfRLto.js +1 -0
  87. package/dist/assets/fcl-Kvtd6kyn.js +1 -0
  88. package/dist/assets/forth-Ffai-XNe.js +1 -0
  89. package/dist/assets/fortran-DYz_wnZ1.js +1 -0
  90. package/dist/assets/gas-Bneqetm1.js +1 -0
  91. package/dist/assets/gherkin-heZmZLOM.js +1 -0
  92. package/dist/assets/groovy-D9Dt4D0W.js +1 -0
  93. package/dist/assets/haskell-Cw1EW3IL.js +1 -0
  94. package/dist/assets/haxe-H-WmDvRZ.js +1 -0
  95. package/dist/assets/http-DBlCnlav.js +1 -0
  96. package/dist/assets/idl-BEugSyMb.js +1 -0
  97. package/dist/assets/index-6xZjfNBY.js +1 -0
  98. package/dist/assets/index-7jqFg9Mv.js +13 -0
  99. package/dist/assets/index-AdP2vXVD.js +1 -0
  100. package/dist/assets/index-BHPv-A3N.js +1 -0
  101. package/dist/assets/index-BL9wSBtZ.js +1 -0
  102. package/dist/assets/index-BjawAflQ.js +1 -0
  103. package/dist/assets/index-C0JZnjgf.js +3 -0
  104. package/dist/assets/index-C1vHAMos.js +1 -0
  105. package/dist/assets/index-CAXLlEvK.js +1 -0
  106. package/dist/assets/index-CDgREgYC.js +2 -0
  107. package/dist/assets/index-CIYtVPt-.js +1 -0
  108. package/dist/assets/index-CddMuxp_.js +6 -0
  109. package/dist/assets/index-CmlqrlxY.js +7 -0
  110. package/dist/assets/index-Crr2UUqW.js +1 -0
  111. package/dist/assets/index-D3-l1kuh.js +1 -0
  112. package/dist/assets/index-D5AbviI1.js +1 -0
  113. package/dist/assets/index-D8eibMZn.js +1 -0
  114. package/dist/assets/index-DLh7eEmr.js +1 -0
  115. package/dist/assets/index-Q5rzr3Yl.js +1 -0
  116. package/dist/assets/index-RrNfwOco.js +1 -0
  117. package/dist/assets/index-kgpju2R2.js +1 -0
  118. package/dist/assets/index-qjQPn-9r.js +1 -0
  119. package/dist/assets/javascript-iXu5QeM3.js +1 -0
  120. package/dist/assets/julia-DuME0IfC.js +1 -0
  121. package/dist/assets/livescript-BwQOo05w.js +1 -0
  122. package/dist/assets/lua-VAEuO923.js +1 -0
  123. package/dist/assets/mathematica-DTrFuWx2.js +1 -0
  124. package/dist/assets/mbox-CNhZ1qSd.js +1 -0
  125. package/dist/assets/mirc-CjQqDB4T.js +1 -0
  126. package/dist/assets/mllike-CXdrOF99.js +1 -0
  127. package/dist/assets/modelica-Dc1JOy9r.js +1 -0
  128. package/dist/assets/mscgen-BA5vi2Kp.js +1 -0
  129. package/dist/assets/mumps-BT43cFF4.js +1 -0
  130. package/dist/assets/nginx-DdIZxoE0.js +1 -0
  131. package/dist/assets/nsis-LY0VT_u5.js +1 -0
  132. package/dist/assets/ntriples-BfvgReVJ.js +1 -0
  133. package/dist/assets/octave-Ck1zUtKM.js +1 -0
  134. package/dist/assets/oz-BzwKVEFT.js +1 -0
  135. package/dist/assets/pascal--L3eBynH.js +1 -0
  136. package/dist/assets/perl-CdXCOZ3F.js +1 -0
  137. package/dist/assets/pig-CevX1Tat.js +1 -0
  138. package/dist/assets/powershell-CFHJl5sT.js +1 -0
  139. package/dist/assets/properties-C78fOPTZ.js +1 -0
  140. package/dist/assets/protobuf-ChK-085T.js +1 -0
  141. package/dist/assets/pug-DeIclll2.js +1 -0
  142. package/dist/assets/puppet-DMA9R1ak.js +1 -0
  143. package/dist/assets/python-BuPzkPfP.js +1 -0
  144. package/dist/assets/q-pXgVlZs6.js +1 -0
  145. package/dist/assets/r-B6wPVr8A.js +1 -0
  146. package/dist/assets/rpm-CTu-6PCP.js +1 -0
  147. package/dist/assets/ruby-BK5aLJev.js +1 -0
  148. package/dist/assets/sas-B4kiWyti.js +1 -0
  149. package/dist/assets/scheme-C41bIUwD.js +1 -0
  150. package/dist/assets/shell-CjFT_Tl9.js +1 -0
  151. package/dist/assets/sieve-C3Gn_uJK.js +1 -0
  152. package/dist/assets/simple-mode-GW_nhZxv.js +1 -0
  153. package/dist/assets/smalltalk-CnHTOXQT.js +1 -0
  154. package/dist/assets/solr-DehyRSwq.js +1 -0
  155. package/dist/assets/sparql-DkYu6x3z.js +1 -0
  156. package/dist/assets/spreadsheet-BCZA_wO0.js +1 -0
  157. package/dist/assets/sql-D0XecflT.js +1 -0
  158. package/dist/assets/stex-C3f8Ysf7.js +1 -0
  159. package/dist/assets/style-Cif_gYUW.css +1 -0
  160. package/dist/assets/style-DG6dI-L6.css +1 -0
  161. package/dist/assets/stylus-B533Al4x.js +1 -0
  162. package/dist/assets/swift-BzpIVaGY.js +1 -0
  163. package/dist/assets/tcl-DVfN8rqt.js +1 -0
  164. package/dist/assets/textile-CnDTJFAw.js +1 -0
  165. package/dist/assets/tiddlywiki-DO-Gjzrf.js +1 -0
  166. package/dist/assets/tiki-DGYXhP31.js +1 -0
  167. package/dist/assets/toml-Bm5Em-hy.js +1 -0
  168. package/dist/assets/troff-wAsdV37c.js +1 -0
  169. package/dist/assets/ttcn-CfJYG6tj.js +1 -0
  170. package/dist/assets/ttcn-cfg-B9xdYoR4.js +1 -0
  171. package/dist/assets/turtle-B1tBg_DP.js +1 -0
  172. package/dist/assets/vb-CmGdzxic.js +1 -0
  173. package/dist/assets/vbscript-BuJXcnF6.js +1 -0
  174. package/dist/assets/velocity-D8B20fx6.js +1 -0
  175. package/dist/assets/verilog-C6RDOZhf.js +1 -0
  176. package/dist/assets/vhdl-lSbBsy5d.js +1 -0
  177. package/dist/assets/webidl-ZXfAyPTL.js +1 -0
  178. package/dist/assets/xquery-DzFWVndE.js +1 -0
  179. package/dist/assets/yacas-BJ4BC0dw.js +1 -0
  180. package/dist/assets/z80-Hz9HOZM7.js +1 -0
  181. package/dist/editor/article-menu.d.ts +36 -0
  182. package/dist/editor/article-menu.d.ts.map +1 -0
  183. package/dist/editor/article-menu.js +251 -0
  184. package/dist/editor/article-menu.js.map +1 -0
  185. package/dist/editor/image-upload.d.ts +9 -0
  186. package/dist/editor/image-upload.d.ts.map +1 -0
  187. package/dist/editor/image-upload.js +65 -0
  188. package/dist/editor/image-upload.js.map +1 -0
  189. package/dist/editor/index.d.ts +4 -0
  190. package/dist/editor/index.d.ts.map +1 -0
  191. package/dist/editor/index.js +4 -0
  192. package/dist/editor/index.js.map +1 -0
  193. package/dist/editor/myno-editor.d.ts +35 -0
  194. package/dist/editor/myno-editor.d.ts.map +1 -0
  195. package/dist/editor/myno-editor.js +117 -0
  196. package/dist/editor/myno-editor.js.map +1 -0
  197. package/dist/index.d.ts +8 -0
  198. package/dist/index.d.ts.map +1 -0
  199. package/dist/index.js +8 -0
  200. package/dist/index.js.map +1 -0
  201. package/dist/src/studio/studio.html +342 -0
  202. package/dist/studio/color-palettes.d.ts +16 -0
  203. package/dist/studio/color-palettes.d.ts.map +1 -0
  204. package/dist/studio/color-palettes.js +129 -0
  205. package/dist/studio/color-palettes.js.map +1 -0
  206. package/dist/studio/config-manager.d.ts +34 -0
  207. package/dist/studio/config-manager.d.ts.map +1 -0
  208. package/dist/studio/config-manager.js +30 -0
  209. package/dist/studio/config-manager.js.map +1 -0
  210. package/dist/studio/studio.d.ts +2 -0
  211. package/dist/studio/studio.d.ts.map +1 -0
  212. package/dist/studio/studio.js +1031 -0
  213. package/dist/studio/studio.js.map +1 -0
  214. package/dist/studio/style-packs.d.ts +24 -0
  215. package/dist/studio/style-packs.d.ts.map +1 -0
  216. package/dist/studio/style-packs.js +179 -0
  217. package/dist/studio/style-packs.js.map +1 -0
  218. package/dist/studio/syntax-presets.d.ts +16 -0
  219. package/dist/studio/syntax-presets.d.ts.map +1 -0
  220. package/dist/studio/syntax-presets.js +408 -0
  221. package/dist/studio/syntax-presets.js.map +1 -0
  222. package/dist/studio/themes.d.ts +32 -0
  223. package/dist/studio/themes.d.ts.map +1 -0
  224. package/dist/studio/themes.js +153 -0
  225. package/dist/studio/themes.js.map +1 -0
  226. package/dist/studio/wechat-renderer.d.ts +59 -0
  227. package/dist/studio/wechat-renderer.d.ts.map +1 -0
  228. package/dist/studio/wechat-renderer.js +797 -0
  229. package/dist/studio/wechat-renderer.js.map +1 -0
  230. package/dist/studio.js +2359 -0
  231. package/package.json +49 -4
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ export * from "./editor/index";
2
+ export * from "./studio/style-packs";
3
+ export * from "./studio/syntax-presets";
4
+ export * from "./studio/color-palettes";
5
+ export * from "./studio/config-manager";
6
+ export * from "./studio/themes";
7
+ export * from "./studio/wechat-renderer";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,342 @@
1
+ <!doctype html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>myno — 微信公众号排版工作台</title>
7
+ <script type="module" crossorigin src="/studio.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/style-Cif_gYUW.css">
9
+ </head>
10
+ <body>
11
+ <!-- Header -->
12
+ <header class="studio-header">
13
+ <div class="brand-section">
14
+ <div class="brand-icon">
15
+ <svg viewBox="0 0 24 24" width="20" height="20" fill="none" stroke="currentColor" stroke-width="2">
16
+ <path d="M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H20v20H6.5a2.5 2.5 0 0 1-2.5-2.5Z"/>
17
+ <path d="M6 6h10M6 10h10M6 14h6"/>
18
+ </svg>
19
+ </div>
20
+ <div class="brand-text">
21
+ <span class="brand-title">myno</span>
22
+ <span class="brand-subtitle">WeChat Visual Studio</span>
23
+ </div>
24
+ <span id="config-mode-badge" class="badge badge-subtle">账号配置</span>
25
+ </div>
26
+
27
+ <!-- Center Config Selector -->
28
+ <div class="header-center">
29
+ <div class="config-selector-group">
30
+ <label for="account-select" class="selector-label">目标配置:</label>
31
+ <select id="account-select" class="select-control">
32
+ <option value="default">默认账号 (default)</option>
33
+ </select>
34
+ <button id="btn-import-config" class="btn btn-ghost btn-sm" title="导入已有 wechat-style.json 排版配置">
35
+ <span>📥 导入配置</span>
36
+ </button>
37
+ <input type="file" id="file-import-config" accept=".json" style="display: none;">
38
+ <button id="btn-export-config" class="btn btn-ghost btn-sm" title="导出独立 wechat-style.json,可在 CLI 使用 --article-theme 引用">
39
+ <span>📤 导出配置</span>
40
+ </button>
41
+ </div>
42
+ </div>
43
+
44
+ <!-- Right Actions -->
45
+ <div class="header-actions">
46
+ <button id="btn-reset" class="btn btn-secondary btn-sm" title="恢复当前账号默认样式">
47
+ <span>🔄 重置</span>
48
+ </button>
49
+
50
+ <button id="btn-save" class="btn btn-primary btn-sm" title="保存当前调整至本地 config.json 的当前账号">
51
+ <span>💾 保存至账号</span>
52
+ </button>
53
+
54
+ <button id="btn-copy" class="btn btn-success btn-sm" title="复制包含内联样式的富文本,可直接粘贴到微信公众平台草稿箱">
55
+ <span>📋 一键复制到公众号</span>
56
+ </button>
57
+
58
+ <a href="/" class="btn btn-ghost btn-sm" title="查看最近渲染记录">
59
+ <span>📜 历史记录</span>
60
+ </a>
61
+ </div>
62
+ </header>
63
+
64
+ <!-- Body -->
65
+ <main class="studio-body">
66
+ <!-- Left: Style & Tuning Panel -->
67
+ <aside class="panel left-panel">
68
+ <nav class="tab-nav">
69
+ <button id="tab-btn-style" class="tab-btn active">🎨 排版风格</button>
70
+ <button id="tab-btn-syntax" class="tab-btn">🧩 组件库与语法</button>
71
+ </nav>
72
+
73
+ <!-- Tab 1: Style Tuning -->
74
+ <div id="tab-content-style" class="tab-content">
75
+ <!-- 1. Curated Style Packs (Visual First for beginners) -->
76
+ <section class="config-section">
77
+ <div class="section-title">
78
+ <span>✨ 精选排版风格 (一键套用)</span>
79
+ </div>
80
+ <div id="style-packs-grid" class="style-packs-grid">
81
+ <!-- Populated dynamically by studio.ts -->
82
+ </div>
83
+ </section>
84
+
85
+ <!-- 2. Quick Typography Tuning (Segmented controls) -->
86
+ <section class="config-section">
87
+ <div class="section-title">
88
+ <span>📐 快速版心调节</span>
89
+ </div>
90
+
91
+ <!-- Font size segmented control -->
92
+ <div class="control-group">
93
+ <div class="control-label">
94
+ <span>正文字号</span>
95
+ <span id="val-font-size" class="control-val">16px</span>
96
+ </div>
97
+ <div id="seg-font-size" class="segmented-control">
98
+ <button type="button" class="seg-btn" data-val="14">14 较小</button>
99
+ <button type="button" class="seg-btn" data-val="15">15 适中</button>
100
+ <button type="button" class="seg-btn active" data-val="16">16 标准</button>
101
+ <button type="button" class="seg-btn" data-val="17">17 较大</button>
102
+ <button type="button" class="seg-btn" data-val="18">18 大号</button>
103
+ </div>
104
+ <input type="range" id="input-font-size" class="slider-input hidden-slider" min="14" max="18" step="1" value="16">
105
+ </div>
106
+
107
+ <!-- Line height segmented control -->
108
+ <div class="control-group">
109
+ <div class="control-label">
110
+ <span>正文行距</span>
111
+ <span id="val-line-height" class="control-val">1.84</span>
112
+ </div>
113
+ <div id="seg-line-height" class="segmented-control">
114
+ <button type="button" class="seg-btn" data-val="1.65">紧凑 1.65</button>
115
+ <button type="button" class="seg-btn active" data-val="1.84">标准 1.84</button>
116
+ <button type="button" class="seg-btn" data-val="2.0">疏朗 2.0</button>
117
+ </div>
118
+ <input type="range" id="input-line-height" class="slider-input hidden-slider" min="1.5" max="2.2" step="0.02" value="1.84">
119
+ </div>
120
+
121
+ <!-- Brand color swatches -->
122
+ <div class="control-group">
123
+ <div class="control-label">
124
+ <span>品牌主题色</span>
125
+ </div>
126
+ <div id="color-swatches" class="color-swatches-row">
127
+ <button type="button" class="swatch-btn" style="background:#ca6093;" data-color="#ca6093" title="胭脂粉"></button>
128
+ <button type="button" class="swatch-btn" style="background:#18181b;" data-color="#18181b" title="纸墨黑"></button>
129
+ <button type="button" class="swatch-btn" style="background:#2563eb;" data-color="#2563eb" title="科技蓝"></button>
130
+ <button type="button" class="swatch-btn" style="background:#059669;" data-color="#059669" title="薄荷绿"></button>
131
+ <button type="button" class="swatch-btn" style="background:#7c3aed;" data-color="#7c3aed" title="极光紫"></button>
132
+ <button type="button" class="swatch-btn" style="background:#945938;" data-color="#945938" title="焦糖陶土"></button>
133
+ <button type="button" class="swatch-btn" style="background:#881337;" data-color="#881337" title="丝绒酒红"></button>
134
+ <button type="button" class="swatch-btn" style="background:#0284c7;" data-color="#0284c7" title="天蓝"></button>
135
+ </div>
136
+ <div class="color-picker-inline">
137
+ <input type="color" id="picker-brand-color" class="color-picker" value="#ca6093">
138
+ <input type="text" id="hex-brand-color" class="color-hex" value="#ca6093">
139
+ </div>
140
+ </div>
141
+
142
+ <!-- H2 visual style pills -->
143
+ <div class="control-group">
144
+ <div class="control-label">
145
+ <span>二级标题 (H2) 风格</span>
146
+ </div>
147
+ <div id="seg-h2-preset" class="pills-grid">
148
+ <button type="button" class="pill-btn active" data-preset="pillar">竖条呼吸柱</button>
149
+ <button type="button" class="pill-btn" data-preset="gradient-pill">渐变胶囊</button>
150
+ <button type="button" class="pill-btn" data-preset="bottom-line">底部细线</button>
151
+ <button type="button" class="pill-btn" data-preset="contrast-green">绿底反差</button>
152
+ <button type="button" class="pill-btn" data-preset="card-tag">上标卡片</button>
153
+ <button type="button" class="pill-btn" data-preset="plain">极简纯字</button>
154
+ </div>
155
+ </div>
156
+ </section>
157
+
158
+ <!-- 3. Advanced Accordion (Collapsed by default for clarity) -->
159
+ <details class="accordion-section">
160
+ <summary class="accordion-summary">
161
+ <span>⚙️ 进阶颜色与排版微调</span>
162
+ <span class="accordion-arrow">›</span>
163
+ </summary>
164
+ <div class="accordion-body">
165
+ <!-- Palette Selector -->
166
+ <div class="control-group">
167
+ <div class="control-label">
168
+ <span>预设经典色盘</span>
169
+ </div>
170
+ <select id="palette-select" class="select-control full-width">
171
+ <option value="">-- 选择推荐调色盘 (一键应用) --</option>
172
+ </select>
173
+ <div id="palette-desc" class="form-hint"></div>
174
+ </div>
175
+
176
+ <!-- Fine Colors -->
177
+ <div class="control-group">
178
+ <div class="control-label"><span>正文字色 (Body Text)</span></div>
179
+ <div class="color-picker-inline">
180
+ <input type="color" id="picker-text-color" class="color-picker" value="#292526">
181
+ <input type="text" id="hex-text-color" class="color-hex" value="#292526">
182
+ </div>
183
+ </div>
184
+
185
+ <div class="control-group">
186
+ <div class="control-label"><span>二级标题字色 (H2)</span></div>
187
+ <div class="color-picker-inline">
188
+ <input type="color" id="picker-h2-color" class="color-picker" value="#1f1b1c">
189
+ <input type="text" id="hex-h2-color" class="color-hex" value="#1f1b1c">
190
+ </div>
191
+ </div>
192
+
193
+ <div class="control-group">
194
+ <div class="control-label"><span>三级标题字色 (H3)</span></div>
195
+ <div class="color-picker-inline">
196
+ <input type="color" id="picker-h3-color" class="color-picker" value="#5c5658">
197
+ <input type="text" id="hex-h3-color" class="color-hex" value="#5c5658">
198
+ </div>
199
+ </div>
200
+
201
+ <div class="control-group">
202
+ <div class="control-label"><span>引用边框与重点色</span></div>
203
+ <div class="color-picker-inline">
204
+ <input type="color" id="picker-quote-color" class="color-picker" value="#e8c9d7">
205
+ <input type="text" id="hex-quote-color" class="color-hex" value="#e8c9d7">
206
+ </div>
207
+ </div>
208
+
209
+ <div class="control-group">
210
+ <div class="control-label"><span>分割线颜色 (Divider)</span></div>
211
+ <div class="color-picker-inline">
212
+ <input type="color" id="picker-divider-color" class="color-picker" value="#e2dcdf">
213
+ <input type="text" id="hex-divider-color" class="color-hex" value="#e2dcdf">
214
+ </div>
215
+ </div>
216
+
217
+ <!-- Fine Spacing -->
218
+ <div class="control-group">
219
+ <div class="control-label">
220
+ <span>字间距 (Letter Spacing)</span>
221
+ <span id="val-letter-spacing" class="control-val">0.012em</span>
222
+ </div>
223
+ <input type="range" id="input-letter-spacing" class="slider-input" min="0" max="0.05" step="0.002" value="0.012">
224
+ </div>
225
+
226
+ <div class="control-group">
227
+ <div class="control-label">
228
+ <span>段落间距 (Margin Bottom)</span>
229
+ <span id="val-para-spacing" class="control-val">1.18em</span>
230
+ </div>
231
+ <input type="range" id="input-para-spacing" class="slider-input" min="0.8" max="2.0" step="0.01" value="1.18">
232
+ </div>
233
+
234
+ <!-- Structure -->
235
+ <div class="control-group">
236
+ <label class="switch-row">
237
+ <span>二级标题自动编号 (01, 02)</span>
238
+ <input type="checkbox" id="switch-numbered-headings">
239
+ </label>
240
+ </div>
241
+
242
+ <div class="control-group">
243
+ <div class="control-label"><span>标题前缀标签 (例: CHAPTER)</span></div>
244
+ <input type="text" id="input-heading-label" class="text-input" placeholder="如:CHAPTER">
245
+ </div>
246
+
247
+ <div class="control-group">
248
+ <div class="control-label"><span>引言前缀标签 (例: 摘录)</span></div>
249
+ <input type="text" id="input-quote-label" class="text-input" placeholder="如:摘录">
250
+ </div>
251
+
252
+ <!-- Syntax Preset Categories -->
253
+ <div class="control-group">
254
+ <div class="control-label"><span>各语法节点风格预设</span></div>
255
+ <div id="syntax-preset-container">
256
+ <!-- Populated dynamically -->
257
+ </div>
258
+ </div>
259
+
260
+ <!-- Custom CSS -->
261
+ <div class="control-group">
262
+ <div class="control-label"><span>自定义 CSS 覆盖</span></div>
263
+ <textarea id="input-custom-css" class="code-textarea" placeholder="/* 在此处输入自定义 CSS 规则,实时生效 */&#10;.milkdown .editor p { text-align: justify; }"></textarea>
264
+ </div>
265
+ </div>
266
+ </details>
267
+ </div>
268
+
269
+ <!-- Tab 2: Syntax & Components Cheatsheet -->
270
+ <div id="tab-content-syntax" class="tab-content" style="display: none;">
271
+ <div class="syntax-guide-intro">
272
+ <span>💡 提示:在中间编辑器中,输入 <code>/</code> 即可快速唤起微信专属组件菜单!</span>
273
+ </div>
274
+ <div id="syntax-card-list">
275
+ <!-- Populated dynamically by studio.ts -->
276
+ </div>
277
+ </div>
278
+ </aside>
279
+
280
+ <!-- Center: Editor Panel -->
281
+ <section class="panel editor-panel">
282
+ <div class="panel-header">
283
+ <div class="editor-mode-toggle">
284
+ <button id="btn-mode-visual" class="mode-btn active" title="Milkdown 所见即所得编辑">✨ 所见即所得</button>
285
+ <button id="btn-mode-source" class="mode-btn" title="查看并编辑 Markdown 源码">📝 源码模式</button>
286
+ </div>
287
+ <div class="editor-header-actions">
288
+ <button id="btn-load-sample" class="btn btn-ghost btn-sm" title="加载全语法官方验收稿">📄 官方测试稿</button>
289
+ <button id="btn-clear-md" class="btn btn-ghost btn-sm" title="清空编辑器内容">🗑️ 清空</button>
290
+ </div>
291
+ </div>
292
+
293
+ <!-- Interactive Crepe Editor Surface -->
294
+ <div id="editor-workspace" class="editor-workspace">
295
+ <div id="milkdown-editor-root" class="milkdown-editor-surface"></div>
296
+ <textarea id="editor-markdown" class="editor-textarea-source" spellcheck="false" placeholder="在此粘贴或输入 Markdown 文章内容..." style="display: none;"></textarea>
297
+ </div>
298
+
299
+ <div class="editor-footer">
300
+ <span id="editor-stats">字数: 0 字 | 预计阅读: 1 分钟</span>
301
+ <span class="editor-sync-indicator">⚡ 所见即所得实时排版</span>
302
+ </div>
303
+ </section>
304
+
305
+ <!-- Right: Mobile Device Simulation (430px) -->
306
+ <section class="panel preview-panel">
307
+ <div class="panel-header">
308
+ <div class="panel-title">
309
+ <span>📱 手机仿真视口 (430px)</span>
310
+ </div>
311
+ <button id="btn-toggle-view" class="btn btn-ghost btn-xs">🔍 HTML 源码</button>
312
+ </div>
313
+
314
+ <div class="preview-scroll-container">
315
+ <!-- Phone Simulator Frame -->
316
+ <div class="device-frame">
317
+ <div class="device-notch-bar">
318
+ <span>9:41</span>
319
+ <span class="device-app-title">公众号正文</span>
320
+ <span>100% 🔋</span>
321
+ </div>
322
+ <div id="preview-screen" class="device-screen">
323
+ <!-- Injected by live renderer -->
324
+ </div>
325
+ </div>
326
+
327
+ <!-- HTML Code Viewer (Hidden by default) -->
328
+ <div id="html-source-container" class="html-source-box" style="display: none;">
329
+ <textarea id="html-source-code" class="code-textarea" readonly></textarea>
330
+ </div>
331
+ </div>
332
+ </section>
333
+ </main>
334
+
335
+ <!-- Toast Notification -->
336
+ <div id="toast-container" class="toast-container"></div>
337
+
338
+ <!-- Hidden Milkdown Engine Mount Host (if needed for background AST juice conversion) -->
339
+ <div id="studio-editor-host" style="display: none;"></div>
340
+
341
+ </body>
342
+ </html>
@@ -0,0 +1,16 @@
1
+ export interface ColorPalette {
2
+ id: string;
3
+ name: string;
4
+ category: string;
5
+ description: string;
6
+ colors: {
7
+ brand: string;
8
+ text: string;
9
+ h2: string;
10
+ h3: string;
11
+ quote: string;
12
+ divider: string;
13
+ };
14
+ }
15
+ export declare const COLOR_PALETTES: ColorPalette[];
16
+ //# sourceMappingURL=color-palettes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color-palettes.d.ts","sourceRoot":"","sources":["../../src/studio/color-palettes.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,eAAO,MAAM,cAAc,EAAE,YAAY,EA+HxC,CAAC"}
@@ -0,0 +1,129 @@
1
+ export const COLOR_PALETTES = [
2
+ {
3
+ id: "forest-sage",
4
+ name: "🌿 森林墨绿 (Kinfolk / 少数派)",
5
+ category: "生活方式与编辑部",
6
+ description: "《Kinfolk》生活美学:沉稳深松绿强调色,搭配松针深黑与浅灰绿分割线",
7
+ colors: {
8
+ brand: "#1f6f4a",
9
+ text: "#1f2320",
10
+ h2: "#154c33",
11
+ h3: "#2e7d58",
12
+ quote: "#3d8e64",
13
+ divider: "#e1ebe5",
14
+ },
15
+ },
16
+ {
17
+ id: "oatmeal-earth",
18
+ name: "☕ 燕麦大地 (理想国 / 暖调成衣)",
19
+ category: "时尚与书籍出版",
20
+ description: "Loro Piana 暖调成衣美学:深焦糖陶土棕、浓咖啡黑与温润燕麦米灰",
21
+ colors: {
22
+ brand: "#945938",
23
+ text: "#2b2623",
24
+ h2: "#1f1b18",
25
+ h3: "#6b3f27",
26
+ quote: "#b37954",
27
+ divider: "#eae4dd",
28
+ },
29
+ },
30
+ {
31
+ id: "slate-indigo",
32
+ name: "🏛️ 石板深蓝 (纽约客 / Substack)",
33
+ category: "深度专栏与智识",
34
+ description: "经典严肃刊物:午夜深藏青做标识,石板灰文字与干净蓝灰分割",
35
+ colors: {
36
+ brand: "#2563eb",
37
+ text: "#1e293b",
38
+ h2: "#0f172a",
39
+ h3: "#334155",
40
+ quote: "#3b82f6",
41
+ divider: "#e2e8f0",
42
+ },
43
+ },
44
+ {
45
+ id: "burgundy-velvet",
46
+ name: "🍷 勃艮第红 (Vogue / 先锋艺术)",
47
+ category: "高级时尚与设计",
48
+ description: "复古先锋美学:丝绒绛红做点睛,黑绒字色与淡玫瑰粉灰底线",
49
+ colors: {
50
+ brand: "#881337",
51
+ text: "#231f20",
52
+ h2: "#1a1617",
53
+ h3: "#4c1d2e",
54
+ quote: "#9f1239",
55
+ divider: "#f2e5ea",
56
+ },
57
+ },
58
+ {
59
+ id: "matcha-bamboo",
60
+ name: "🍵 极简煎茶 (无印良品 / 东方和风)",
61
+ category: "极简器物与禅意",
62
+ description: "日系器物美学:深橄榄煎茶色、竹炭色正文与和纸灰底线",
63
+ colors: {
64
+ brand: "#556b2f",
65
+ text: "#262923",
66
+ h2: "#1c211a",
67
+ h3: "#435528",
68
+ quote: "#708846",
69
+ divider: "#e7eae1",
70
+ },
71
+ },
72
+ {
73
+ id: "titanium-cyan",
74
+ name: "🌌 极客钛灰 (Linear / Arc 现代界面)",
75
+ category: "现代数字与 App",
76
+ description: "当代高端数字界面:极光冷青点缀、深空曜黑文字与钛金属浅灰",
77
+ colors: {
78
+ brand: "#0284c7",
79
+ text: "#18181b",
80
+ h2: "#09090b",
81
+ h3: "#27272a",
82
+ quote: "#0ea5e9",
83
+ divider: "#e4e4e7",
84
+ },
85
+ },
86
+ {
87
+ id: "rose-ledger",
88
+ name: "🌸 晚樱柔粉 (古一软件经典标配)",
89
+ category: "人文与故事叙述",
90
+ description: "经典温润配色:干枯玫瑰粉与深铅黑文字,温柔克制",
91
+ colors: {
92
+ brand: "#ca6093",
93
+ text: "#292526",
94
+ h2: "#1f1b1c",
95
+ h3: "#5c5658",
96
+ quote: "#ca6093",
97
+ divider: "#dadce0",
98
+ },
99
+ },
100
+ {
101
+ id: "amber-terracotta",
102
+ name: "🍂 暖柿陶土 (秋日暖柿 / 温暖人文)",
103
+ category: "温暖人文与生活",
104
+ description: "秋日暖柿与陶土红调,深焦糖微暖黑正文,温润包容,手机长文夜读极度舒适",
105
+ colors: {
106
+ brand: "#c25e2e",
107
+ text: "#2b2623",
108
+ h2: "#1f1b18",
109
+ h3: "#573d2d",
110
+ quote: "#d9825b",
111
+ divider: "#ece2d8",
112
+ },
113
+ },
114
+ {
115
+ id: "iris-indigo",
116
+ name: "🔮 鸢尾极光 (Linear / 前沿科技)",
117
+ category: "现代数字与前沿设计",
118
+ description: "深邃鸢尾靛蓝紫,搭配深紫夜冷黑字色与柔光分割,兼具理性逻辑与前沿审美",
119
+ colors: {
120
+ brand: "#6366f1",
121
+ text: "#1e1b4b",
122
+ h2: "#0f0e26",
123
+ h3: "#4338ca",
124
+ quote: "#a5b4fc",
125
+ divider: "#e0e7ff",
126
+ },
127
+ },
128
+ ];
129
+ //# sourceMappingURL=color-palettes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color-palettes.js","sourceRoot":"","sources":["../../src/studio/color-palettes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { WechatExportTheme } from "./themes";
2
+ export interface StandaloneStyleConfig {
3
+ schemaVersion: number;
4
+ engineVersion: number;
5
+ id: string;
6
+ name: string;
7
+ version: string;
8
+ description?: string;
9
+ editorVars: Record<string, string>;
10
+ exportTheme: Partial<WechatExportTheme> | Record<string, string | undefined>;
11
+ syntaxPresets?: Record<string, string>;
12
+ structure?: {
13
+ numberedHeadings?: boolean;
14
+ headingLabel?: string;
15
+ quoteLabel?: string;
16
+ calloutPresets?: Record<string, {
17
+ icon?: string;
18
+ title?: string;
19
+ }>;
20
+ };
21
+ css?: string;
22
+ }
23
+ export declare function parseStyleConfig(jsonString: string): {
24
+ ok: true;
25
+ config: StandaloneStyleConfig;
26
+ } | {
27
+ ok: false;
28
+ error: string;
29
+ };
30
+ export declare function exportStyleConfigBlob(config: StandaloneStyleConfig): {
31
+ url: string;
32
+ filename: string;
33
+ };
34
+ //# sourceMappingURL=config-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/studio/config-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAElD,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,WAAW,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAC7E,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE;QACV,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACpE,CAAC;IACF,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,qBAAqB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAoB/H;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAMtG"}
@@ -0,0 +1,30 @@
1
+ export function parseStyleConfig(jsonString) {
2
+ try {
3
+ const data = JSON.parse(jsonString);
4
+ if (!data || typeof data !== "object") {
5
+ return { ok: false, error: "JSON 格式必须为对象" };
6
+ }
7
+ if (data.schemaVersion !== 1 || data.engineVersion !== 1) {
8
+ // 宽松兼容:如果缺少版本号则赋默认值
9
+ data.schemaVersion = 1;
10
+ data.engineVersion = 1;
11
+ }
12
+ data.editorVars = data.editorVars || {};
13
+ data.exportTheme = data.exportTheme || {};
14
+ data.syntaxPresets = data.syntaxPresets || {};
15
+ data.structure = data.structure || {};
16
+ data.css = typeof data.css === "string" ? data.css : "";
17
+ return { ok: true, config: data };
18
+ }
19
+ catch (err) {
20
+ return { ok: false, error: err instanceof Error ? err.message : String(err) };
21
+ }
22
+ }
23
+ export function exportStyleConfigBlob(config) {
24
+ const content = JSON.stringify(config, null, 2) + "\n";
25
+ const blob = new Blob([content], { type: "application/json" });
26
+ const url = URL.createObjectURL(blob);
27
+ const filename = `${config.id || "wechat-style"}.json`;
28
+ return { url, filename };
29
+ }
30
+ //# sourceMappingURL=config-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/studio/config-manager.ts"],"names":[],"mappings":"AAqBA,MAAM,UAAU,gBAAgB,CAAC,UAAkB;IACjD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;QAC9C,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa,KAAK,CAAC,EAAE,CAAC;YACzD,oBAAoB;YACpB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;QAC1C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,GAAG,GAAG,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAA6B,EAAE,CAAC;IAC7D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IAChF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAA6B;IACjE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IACvD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC/D,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,GAAG,MAAM,CAAC,EAAE,IAAI,cAAc,OAAO,CAAC;IACvD,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=studio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio.d.ts","sourceRoot":"","sources":["../../src/studio/studio.ts"],"names":[],"mappings":""}