@zaly/tui 0.0.12 → 0.1.1

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 (330) hide show
  1. package/assets/schemas/shiki-language.schema.json +352 -0
  2. package/assets/schemas/shiki-theme.schema.json +71 -0
  3. package/assets/schemas/theme.schema.json +226 -1046
  4. package/assets/themes/andromeeda.json +97 -0
  5. package/assets/themes/ayu-dark.json +31 -25
  6. package/assets/themes/ayu-light.json +106 -0
  7. package/assets/themes/ayu-mirage.json +106 -0
  8. package/assets/themes/catppuccin-frappe.json +43 -40
  9. package/assets/themes/catppuccin-latte.json +43 -40
  10. package/assets/themes/catppuccin-macchiato.json +43 -40
  11. package/assets/themes/catppuccin-mocha.json +43 -40
  12. package/assets/themes/dark-plus.json +99 -0
  13. package/assets/themes/dracula.json +47 -47
  14. package/assets/themes/everforest-dark.json +28 -26
  15. package/assets/themes/everforest-light.json +28 -26
  16. package/assets/themes/github-dark-default.json +107 -0
  17. package/assets/themes/github-dark-dimmed.json +107 -0
  18. package/assets/themes/github-light-default.json +107 -0
  19. package/assets/themes/gruvbox-dark-hard.json +98 -0
  20. package/assets/themes/gruvbox-dark-medium.json +34 -29
  21. package/assets/themes/gruvbox-light-medium.json +98 -0
  22. package/assets/themes/horizon-bright.json +101 -0
  23. package/assets/themes/horizon.json +101 -0
  24. package/assets/themes/iterm2/LICENSE +25 -0
  25. package/assets/themes/iterm2/README.md +28 -0
  26. package/assets/themes/iterm2/catppuccin-latte.json +140 -0
  27. package/assets/themes/iterm2/catppuccin-mocha.json +140 -0
  28. package/assets/themes/iterm2/github-dark.json +140 -0
  29. package/assets/themes/iterm2/github.json +140 -0
  30. package/assets/themes/iterm2/gruvbox-dark.json +140 -0
  31. package/assets/themes/iterm2/gruvbox-light.json +140 -0
  32. package/assets/themes/iterm2/nord.json +140 -0
  33. package/assets/themes/iterm2/tokyonight-day.json +140 -0
  34. package/assets/themes/iterm2/tokyonight-moon.json +140 -0
  35. package/assets/themes/kanagawa-dragon.json +55 -49
  36. package/assets/themes/kanagawa-lotus.json +105 -0
  37. package/assets/themes/kanagawa-wave.json +56 -50
  38. package/assets/themes/light-plus.json +99 -0
  39. package/assets/themes/material-theme-lighter.json +102 -0
  40. package/assets/themes/material-theme-palenight.json +52 -45
  41. package/assets/themes/material-theme.json +102 -0
  42. package/assets/themes/min-dark.json +69 -14
  43. package/assets/themes/min-light.json +68 -17
  44. package/assets/themes/monokai.json +54 -47
  45. package/assets/themes/night-owl-light.json +105 -0
  46. package/assets/themes/night-owl.json +57 -49
  47. package/assets/themes/nord.json +53 -39
  48. package/assets/themes/one-dark-pro.json +46 -38
  49. package/assets/themes/one-light.json +52 -41
  50. package/assets/themes/poimandres.json +51 -49
  51. package/assets/themes/rose-pine-dawn.json +99 -0
  52. package/assets/themes/rose-pine-moon.json +99 -0
  53. package/assets/themes/rose-pine.json +50 -33
  54. package/assets/themes/solarized-dark.json +38 -31
  55. package/assets/themes/solarized-light.json +40 -33
  56. package/assets/themes/synthwave-84.json +47 -30
  57. package/assets/themes/tokyonight-day.json +3 -3
  58. package/assets/themes/tokyonight-moon.json +3 -2
  59. package/assets/themes/tokyonight-night.json +3 -2
  60. package/assets/themes/tokyonight-storm.json +3 -2
  61. package/assets/themes/vesper.json +50 -42
  62. package/assets/themes/vitesse-black.json +103 -0
  63. package/assets/themes/vitesse-dark.json +26 -30
  64. package/assets/themes/vitesse-light.json +26 -30
  65. package/dist/{actions-DEIKF2ts.mjs → actions-AY6avfEV.mjs} +2 -3
  66. package/dist/{actions-DEIKF2ts.mjs.map → actions-AY6avfEV.mjs.map} +1 -1
  67. package/dist/{actions-Dc4D4uSf.d.mts → actions-B0yyZ-Ww.d.mts} +4 -6
  68. package/dist/actions-B0yyZ-Ww.d.mts.map +1 -0
  69. package/dist/{ansi-DZlXaItJ.mjs → ansi-CxgRPLA2.mjs} +4 -33
  70. package/dist/ansi-CxgRPLA2.mjs.map +1 -0
  71. package/dist/ansi.d.mts +1 -3
  72. package/dist/ansi.d.mts.map +1 -1
  73. package/dist/ansi.mjs +1 -1
  74. package/dist/{autocomplete-StW1QJZJ.d.mts → autocomplete-wgceuhLr.d.mts} +5 -7
  75. package/dist/autocomplete-wgceuhLr.d.mts.map +1 -0
  76. package/dist/{box-BkP4MF82.mjs → box-DToDoXlU.mjs} +8 -10
  77. package/dist/{box-BkP4MF82.mjs.map → box-DToDoXlU.mjs.map} +1 -1
  78. package/dist/builder-BdYlK1Ew.mjs +195 -0
  79. package/dist/builder-BdYlK1Ew.mjs.map +1 -0
  80. package/dist/{callbacks-BwWTCqPJ.mjs → callbacks-DW8XKYKy.mjs} +9 -13
  81. package/dist/{callbacks-BwWTCqPJ.mjs.map → callbacks-DW8XKYKy.mjs.map} +1 -1
  82. package/dist/{client-C2GXKfJ1.mjs → client-BWm6dNZF.mjs} +9 -6
  83. package/dist/client-BWm6dNZF.mjs.map +1 -0
  84. package/dist/client-C69qWhMG.mjs +1 -0
  85. package/dist/{clipboard-CNPBTX7j.mjs → clipboard-UEoX9sup.mjs} +2 -3
  86. package/dist/{clipboard-CNPBTX7j.mjs.map → clipboard-UEoX9sup.mjs.map} +1 -1
  87. package/dist/clipboard.d.mts +0 -2
  88. package/dist/clipboard.d.mts.map +1 -1
  89. package/dist/clipboard.mjs +1 -1
  90. package/dist/color-Cr1VoL49.mjs +36 -0
  91. package/dist/color-Cr1VoL49.mjs.map +1 -0
  92. package/dist/ctx-CYEzzH-7.mjs +1 -0
  93. package/dist/{ctx-B7BmPUCD.mjs → ctx-DBeFcZt6.mjs} +4 -5
  94. package/dist/{ctx-B7BmPUCD.mjs.map → ctx-DBeFcZt6.mjs.map} +1 -1
  95. package/dist/{divider-TSx9NhI_.mjs → divider-qEj5prKE.mjs} +3 -4
  96. package/dist/{divider-TSx9NhI_.mjs.map → divider-qEj5prKE.mjs.map} +1 -1
  97. package/dist/{files-BvThQpOf.mjs → files-C3ZnFpvq.mjs} +3 -4
  98. package/dist/{files-BvThQpOf.mjs.map → files-C3ZnFpvq.mjs.map} +1 -1
  99. package/dist/{files-7DUYSeNc.d.mts → files-CdiDnwA_.d.mts} +3 -5
  100. package/dist/files-CdiDnwA_.d.mts.map +1 -0
  101. package/dist/{flex-Bguo-fUe.mjs → flex-CYp4etqn.mjs} +3 -4
  102. package/dist/{flex-Bguo-fUe.mjs.map → flex-CYp4etqn.mjs.map} +1 -1
  103. package/dist/{github-Cy2hfWJ7.mjs → github-CLveT9mq.mjs} +2 -3
  104. package/dist/{github-Cy2hfWJ7.mjs.map → github-CLveT9mq.mjs.map} +1 -1
  105. package/dist/{github-C1KfXk98.d.mts → github-DC0XemKa.d.mts} +3 -5
  106. package/dist/github-DC0XemKa.d.mts.map +1 -0
  107. package/dist/{image-VaT7AN-S.d.mts → image-DdRDv7q6.d.mts} +2 -4
  108. package/dist/image-DdRDv7q6.d.mts.map +1 -0
  109. package/dist/image-M--Bw4bs.mjs +177 -0
  110. package/dist/image-M--Bw4bs.mjs.map +1 -0
  111. package/dist/image.d.mts +1 -3
  112. package/dist/image.d.mts.map +1 -1
  113. package/dist/image.mjs +1 -1
  114. package/dist/index.d.mts +11 -14
  115. package/dist/index.d.mts.map +1 -1
  116. package/dist/index.mjs +12 -14
  117. package/dist/index.mjs.map +1 -1
  118. package/dist/{input-BGTTujDN.mjs → input-BkE4EpBw.mjs} +6 -7
  119. package/dist/{input-BGTTujDN.mjs.map → input-BkE4EpBw.mjs.map} +1 -1
  120. package/dist/{input-BAYux7qo.d.mts → input-C3kfYoEJ.d.mts} +3 -5
  121. package/dist/input-C3kfYoEJ.d.mts.map +1 -0
  122. package/dist/{inspect-jG_W4njH.mjs → inspect-Cli1beu8.mjs} +3 -4
  123. package/dist/{inspect-jG_W4njH.mjs.map → inspect-Cli1beu8.mjs.map} +1 -1
  124. package/dist/{inspect-CfNydMgO.d.mts → inspect-hSl3U2BD.d.mts} +2 -6
  125. package/dist/inspect-hSl3U2BD.d.mts.map +1 -0
  126. package/dist/kitty-0sJ8axU_.mjs +1 -0
  127. package/dist/{kitty-JbCJC0iQ.mjs → kitty-BH_eK6lz.mjs} +2 -3
  128. package/dist/{kitty-JbCJC0iQ.mjs.map → kitty-BH_eK6lz.mjs.map} +1 -1
  129. package/dist/{log-ByKlM4iI.mjs → log-96b1_J6G.mjs} +6 -7
  130. package/dist/{log-ByKlM4iI.mjs.map → log-96b1_J6G.mjs.map} +1 -1
  131. package/dist/{logger-DSQb0sLP.mjs → logger-DwfXp8LF.mjs} +5 -6
  132. package/dist/{logger-DSQb0sLP.mjs.map → logger-DwfXp8LF.mjs.map} +1 -1
  133. package/dist/{markdown-CwRmWuU6.mjs → markdown-CgRZBhIX.mjs} +12 -12
  134. package/dist/markdown-CgRZBhIX.mjs.map +1 -0
  135. package/dist/markdown.d.mts +2 -4
  136. package/dist/markdown.d.mts.map +1 -1
  137. package/dist/markdown.mjs +1 -1
  138. package/dist/math-Dk8hxbmz.mjs +1 -0
  139. package/dist/math-VPuwFCid.mjs +205 -0
  140. package/dist/math-VPuwFCid.mjs.map +1 -0
  141. package/dist/md.bun.d.mts +1 -3
  142. package/dist/md.bun.d.mts.map +1 -1
  143. package/dist/md.bun.mjs +2 -3
  144. package/dist/md.node.d.mts +1 -3
  145. package/dist/md.node.d.mts.map +1 -1
  146. package/dist/md.node.mjs +2 -3
  147. package/dist/{node-BZ7f6HzU.mjs → node-CXNobGaP.mjs} +3 -4
  148. package/dist/{node-BZ7f6HzU.mjs.map → node-CXNobGaP.mjs.map} +1 -1
  149. package/dist/oklch-Boh4YHEc.mjs +98 -0
  150. package/dist/oklch-Boh4YHEc.mjs.map +1 -0
  151. package/dist/{overlay-BnvOKtGT.mjs → overlay-CevDWgSF.mjs} +3 -4
  152. package/dist/{overlay-BnvOKtGT.mjs.map → overlay-CevDWgSF.mjs.map} +1 -1
  153. package/dist/{picker-Dh5IUrTk.mjs → picker-D9WrE3zF.mjs} +11 -16
  154. package/dist/{picker-Dh5IUrTk.mjs.map → picker-D9WrE3zF.mjs.map} +1 -1
  155. package/dist/{picker-DQs_IW77.d.mts → picker-DsB6--GN.d.mts} +6 -8
  156. package/dist/picker-DsB6--GN.d.mts.map +1 -0
  157. package/dist/{queries-B_lOwEiE.mjs → queries-BIniKnLL.mjs} +68 -7
  158. package/dist/queries-BIniKnLL.mjs.map +1 -0
  159. package/dist/{queries-BDX8mcl5.d.mts → queries-Dmd3IjSd.d.mts} +19 -52
  160. package/dist/queries-Dmd3IjSd.d.mts.map +1 -0
  161. package/dist/{reactive-f7NpAi69.mjs → reactive-DkP75TPk.mjs} +2 -3
  162. package/dist/{reactive-f7NpAi69.mjs.map → reactive-DkP75TPk.mjs.map} +1 -1
  163. package/dist/{registry-D-suU3g0.mjs → registry-CQU0VwpM.mjs} +205 -65
  164. package/dist/registry-CQU0VwpM.mjs.map +1 -0
  165. package/dist/{render-DEIUNLkh.mjs → render-Bp2N2i6J.mjs} +4 -5
  166. package/dist/{render-DEIUNLkh.mjs.map → render-Bp2N2i6J.mjs.map} +1 -1
  167. package/dist/{renderer-zDNlAovy.mjs → renderer-B9sAMA10.mjs} +123 -40
  168. package/dist/renderer-B9sAMA10.mjs.map +1 -0
  169. package/dist/{renderer-MQue4Da5.mjs → renderer-BYl2pbdx.mjs} +9 -9
  170. package/dist/renderer-BYl2pbdx.mjs.map +1 -0
  171. package/dist/renderer-Ctz0hv5o.mjs +1 -0
  172. package/dist/{search-FvGnswRl.d.mts → search-DsHzamic.d.mts} +1 -9
  173. package/dist/search-DsHzamic.d.mts.map +1 -0
  174. package/dist/{select-J2KtwxyK.d.mts → select-BZCFXdjp.d.mts} +3 -5
  175. package/dist/select-BZCFXdjp.d.mts.map +1 -0
  176. package/dist/{select-m7NE6Rwa.mjs → select-CUmAFKJh.mjs} +5 -6
  177. package/dist/{select-m7NE6Rwa.mjs.map → select-CUmAFKJh.mjs.map} +1 -1
  178. package/dist/services/logger.d.mts +1 -1
  179. package/dist/services/logger.mjs +1 -1
  180. package/dist/services/notifier.d.mts +1 -3
  181. package/dist/services/notifier.d.mts.map +1 -1
  182. package/dist/services/notifier.mjs +3 -4
  183. package/dist/services/picker.d.mts +5 -7
  184. package/dist/services/picker.d.mts.map +1 -1
  185. package/dist/services/picker.mjs +8 -9
  186. package/dist/services/prompt.d.mts +4 -6
  187. package/dist/services/prompt.d.mts.map +1 -1
  188. package/dist/services/prompt.mjs +7 -8
  189. package/dist/shiki/server.mjs +40 -19
  190. package/dist/shiki/server.mjs.map +1 -1
  191. package/dist/shiki-BAf9PdIc.mjs +19 -0
  192. package/dist/shiki-BAf9PdIc.mjs.map +1 -0
  193. package/dist/shiki-DUUAIE6f.mjs +632 -0
  194. package/dist/shiki-DUUAIE6f.mjs.map +1 -0
  195. package/dist/{show-DR2x1YFc.mjs → show-D5XNXgZf.mjs} +4 -5
  196. package/dist/{show-DR2x1YFc.mjs.map → show-D5XNXgZf.mjs.map} +1 -1
  197. package/dist/{size-D8JogYLy.mjs → size-BHRJuRk9.mjs} +2 -3
  198. package/dist/{size-D8JogYLy.mjs.map → size-BHRJuRk9.mjs.map} +1 -1
  199. package/dist/style-Cw_EuszU.mjs +108 -0
  200. package/dist/style-Cw_EuszU.mjs.map +1 -0
  201. package/dist/style.d.mts +4 -5
  202. package/dist/style.d.mts.map +1 -1
  203. package/dist/style.mjs +4 -4
  204. package/dist/{text-CkQ7Irmt.mjs → text-4arC3odI.mjs} +3 -4
  205. package/dist/{text-CkQ7Irmt.mjs.map → text-4arC3odI.mjs.map} +1 -1
  206. package/dist/{text-XvPfweeg.mjs → text-BArwVVkg.mjs} +5 -6
  207. package/dist/{text-XvPfweeg.mjs.map → text-BArwVVkg.mjs.map} +1 -1
  208. package/dist/{text-CCYs9RB2.d.mts → text-DdkJXgoC.d.mts} +3 -5
  209. package/dist/text-DdkJXgoC.d.mts.map +1 -0
  210. package/dist/text.d.mts +1 -1
  211. package/dist/text.mjs +1 -1
  212. package/dist/theme-B8hb1lPU.mjs +60 -0
  213. package/dist/theme-B8hb1lPU.mjs.map +1 -0
  214. package/dist/theme-BeSaXGNY.mjs +1792 -0
  215. package/dist/theme-BeSaXGNY.mjs.map +1 -0
  216. package/dist/themes.d.mts +211 -77
  217. package/dist/themes.d.mts.map +1 -1
  218. package/dist/themes.mjs +1 -1
  219. package/dist/{tree-DJl5W_B7.d.mts → tree-Berzv8Rz.d.mts} +3 -5
  220. package/dist/tree-Berzv8Rz.d.mts.map +1 -0
  221. package/dist/{tree-Bo1afYhe.mjs → tree-D6NvMQx8.mjs} +5 -6
  222. package/dist/{tree-Bo1afYhe.mjs.map → tree-D6NvMQx8.mjs.map} +1 -1
  223. package/dist/{types-D2EYlzmK.d.mts → types-ByMHEdCF.d.mts} +133 -131
  224. package/dist/types-ByMHEdCF.d.mts.map +1 -0
  225. package/dist/{types-D3jk1rtk.d.mts → types-CUVUJPz6.d.mts} +1 -3
  226. package/dist/types-CUVUJPz6.d.mts.map +1 -0
  227. package/dist/{utils-3M4D_AXZ.mjs → utils-DHXAegVW.mjs} +1 -2
  228. package/dist/{utils-3M4D_AXZ.mjs.map → utils-DHXAegVW.mjs.map} +1 -1
  229. package/dist/{widget-BkMwhY2p.mjs → widget-sFveyrZE.mjs} +3 -4
  230. package/dist/{widget-BkMwhY2p.mjs.map → widget-sFveyrZE.mjs.map} +1 -1
  231. package/dist/{widget-DPqBbB57.d.mts → widget-sPJaKVU2.d.mts} +2 -4
  232. package/dist/widget-sPJaKVU2.d.mts.map +1 -0
  233. package/dist/widgets/autocomplete.d.mts +1 -1
  234. package/dist/widgets/autocomplete.mjs +5 -6
  235. package/dist/widgets/box.d.mts +1 -1
  236. package/dist/widgets/box.mjs +1 -1
  237. package/dist/widgets/code.d.mts +4 -4
  238. package/dist/widgets/code.d.mts.map +1 -1
  239. package/dist/widgets/code.mjs +12 -12
  240. package/dist/widgets/code.mjs.map +1 -1
  241. package/dist/widgets/completions/actions.d.mts +1 -1
  242. package/dist/widgets/completions/actions.mjs +1 -1
  243. package/dist/widgets/completions/files.d.mts +1 -1
  244. package/dist/widgets/completions/files.mjs +1 -1
  245. package/dist/widgets/completions/github.d.mts +1 -1
  246. package/dist/widgets/completions/github.mjs +1 -1
  247. package/dist/widgets/completions/index.d.mts +3 -3
  248. package/dist/widgets/completions/index.mjs +3 -3
  249. package/dist/widgets/diff.d.mts +2 -4
  250. package/dist/widgets/diff.d.mts.map +1 -1
  251. package/dist/widgets/diff.mjs +38 -16
  252. package/dist/widgets/diff.mjs.map +1 -1
  253. package/dist/widgets/divider.d.mts +2 -4
  254. package/dist/widgets/divider.d.mts.map +1 -1
  255. package/dist/widgets/divider.mjs +1 -1
  256. package/dist/widgets/image.d.mts +1 -1
  257. package/dist/widgets/image.mjs +8 -9
  258. package/dist/widgets/image.mjs.map +1 -1
  259. package/dist/widgets/input.d.mts +1 -1
  260. package/dist/widgets/input.mjs +1 -1
  261. package/dist/widgets/log.d.mts +1 -1
  262. package/dist/widgets/log.mjs +1 -1
  263. package/dist/widgets/markdown.d.mts +5 -7
  264. package/dist/widgets/markdown.d.mts.map +1 -1
  265. package/dist/widgets/markdown.mjs +1 -1
  266. package/dist/widgets/overlay.d.mts +1 -1
  267. package/dist/widgets/overlay.mjs +1 -1
  268. package/dist/widgets/picker.d.mts +1 -1
  269. package/dist/widgets/picker.mjs +1 -1
  270. package/dist/widgets/progress.d.mts +2 -4
  271. package/dist/widgets/progress.d.mts.map +1 -1
  272. package/dist/widgets/progress.mjs +4 -5
  273. package/dist/widgets/select.d.mts +1 -1
  274. package/dist/widgets/select.mjs +1 -1
  275. package/dist/widgets/show.d.mts +1 -3
  276. package/dist/widgets/show.d.mts.map +1 -1
  277. package/dist/widgets/show.mjs +1 -1
  278. package/dist/widgets/spinner.d.mts +2 -4
  279. package/dist/widgets/spinner.d.mts.map +1 -1
  280. package/dist/widgets/spinner.mjs +3 -4
  281. package/dist/widgets/text.d.mts +1 -1
  282. package/dist/widgets/text.mjs +1 -1
  283. package/dist/widgets/tree.d.mts +1 -1
  284. package/dist/widgets/tree.mjs +1 -1
  285. package/dist/widgets/widget.d.mts +1 -1
  286. package/dist/widgets/widget.mjs +1 -1
  287. package/dist/{worker-T6SdPzUH.mjs → worker-CtEowucz.mjs} +2 -3
  288. package/dist/{worker-T6SdPzUH.mjs.map → worker-CtEowucz.mjs.map} +1 -1
  289. package/dist/worker-Mqi380Et.mjs +1 -0
  290. package/package.json +5 -7
  291. package/assets/themes/dracula-soft.json +0 -100
  292. package/assets/themes/github-dark.json +0 -104
  293. package/assets/themes/github-light.json +0 -104
  294. package/dist/actions-Dc4D4uSf.d.mts.map +0 -1
  295. package/dist/ansi-DZlXaItJ.mjs.map +0 -1
  296. package/dist/autocomplete-StW1QJZJ.d.mts.map +0 -1
  297. package/dist/builder-1z5ewEWK.mjs +0 -386
  298. package/dist/builder-1z5ewEWK.mjs.map +0 -1
  299. package/dist/client-C2GXKfJ1.mjs.map +0 -1
  300. package/dist/client-bzdHIDL2.mjs +0 -1
  301. package/dist/ctx-D_JgJ8Eo.mjs +0 -1
  302. package/dist/files-7DUYSeNc.d.mts.map +0 -1
  303. package/dist/github-C1KfXk98.d.mts.map +0 -1
  304. package/dist/image-Cm5T-uw-.mjs +0 -108
  305. package/dist/image-Cm5T-uw-.mjs.map +0 -1
  306. package/dist/image-VaT7AN-S.d.mts.map +0 -1
  307. package/dist/input-BAYux7qo.d.mts.map +0 -1
  308. package/dist/inspect-CfNydMgO.d.mts.map +0 -1
  309. package/dist/markdown-CwRmWuU6.mjs.map +0 -1
  310. package/dist/picker-DQs_IW77.d.mts.map +0 -1
  311. package/dist/queries-BDX8mcl5.d.mts.map +0 -1
  312. package/dist/queries-B_lOwEiE.mjs.map +0 -1
  313. package/dist/registry-D-suU3g0.mjs.map +0 -1
  314. package/dist/renderer-DhqbEVVR.mjs +0 -1
  315. package/dist/renderer-MQue4Da5.mjs.map +0 -1
  316. package/dist/renderer-zDNlAovy.mjs.map +0 -1
  317. package/dist/search-FvGnswRl.d.mts.map +0 -1
  318. package/dist/select-J2KtwxyK.d.mts.map +0 -1
  319. package/dist/shiki--ASSYv4_.mjs +0 -12
  320. package/dist/shiki--ASSYv4_.mjs.map +0 -1
  321. package/dist/shiki-D7l5--zz.mjs +0 -432
  322. package/dist/shiki-D7l5--zz.mjs.map +0 -1
  323. package/dist/text-CCYs9RB2.d.mts.map +0 -1
  324. package/dist/theme.config-B3Yx--C2.mjs +0 -855
  325. package/dist/theme.config-B3Yx--C2.mjs.map +0 -1
  326. package/dist/tree-DJl5W_B7.d.mts.map +0 -1
  327. package/dist/types-D2EYlzmK.d.mts.map +0 -1
  328. package/dist/types-D3jk1rtk.d.mts.map +0 -1
  329. package/dist/widget-DPqBbB57.d.mts.map +0 -1
  330. package/dist/worker-C01jK2Ip.mjs +0 -1
@@ -1,8 +1,10 @@
1
+ import { n as isHexColor, t as blend } from "./color-Cr1VoL49.mjs";
2
+ import { t as isDark } from "./oklch-Boh4YHEc.mjs";
1
3
  import { withError } from "@zaly/shared";
2
4
  import { createRegistry } from "@zaly/shared/registry";
3
5
  import { readFileSync } from "node:fs";
4
6
  import { basename } from "pathe";
5
- //#region assets/themes/tokyonight-moon.json
7
+ // assets/themes/tokyonight-moon.json
6
8
  var tokyonight_moon_default = {
7
9
  accent: "#ff966c",
8
10
  bg: "#222436",
@@ -121,10 +123,10 @@ var tokyonight_moon_default = {
121
123
  "bg": "#1e2030",
122
124
  "fg": "#c8d3f5"
123
125
  },
124
- warn: "#ffc777"
126
+ warn: "#ffc777",
127
+ $schema: "https://raw.githubusercontent.com/folke/zaly/main/packages/tui/assets/schemas/theme.schema.json"
125
128
  };
126
- //#endregion
127
- //#region src/themes/builtin.ts
129
+ // src/themes/builtin.ts
128
130
  const importTheme = (path) => import(`#assets/themes/${path}.json`, { with: { type: "json" } }).then((m) => m.default);
129
131
  /**
130
132
  * Async loader map for every built-in theme. Each entry returns the
@@ -141,30 +143,45 @@ const importTheme = (path) => import(`#assets/themes/${path}.json`, { with: { ty
141
143
  * with no cast.
142
144
  */
143
145
  const builtin = {
146
+ andromeeda: () => importTheme("andromeeda"),
144
147
  "ayu-dark": () => importTheme("ayu-dark"),
148
+ "ayu-light": () => importTheme("ayu-light"),
149
+ "ayu-mirage": () => importTheme("ayu-mirage"),
145
150
  "catppuccin-frappe": () => importTheme("catppuccin-frappe"),
146
151
  "catppuccin-latte": () => importTheme("catppuccin-latte"),
147
152
  "catppuccin-macchiato": () => importTheme("catppuccin-macchiato"),
148
153
  "catppuccin-mocha": () => importTheme("catppuccin-mocha"),
154
+ "dark-plus": () => importTheme("dark-plus"),
149
155
  dracula: () => importTheme("dracula"),
150
- "dracula-soft": () => importTheme("dracula-soft"),
151
156
  "everforest-dark": () => importTheme("everforest-dark"),
152
157
  "everforest-light": () => importTheme("everforest-light"),
153
- "github-dark": () => importTheme("github-dark"),
154
- "github-light": () => importTheme("github-light"),
158
+ "github-dark-default": () => importTheme("github-dark-default"),
159
+ "github-dark-dimmed": () => importTheme("github-dark-dimmed"),
160
+ "github-light-default": () => importTheme("github-light-default"),
161
+ "gruvbox-dark-hard": () => importTheme("gruvbox-dark-hard"),
155
162
  "gruvbox-dark-medium": () => importTheme("gruvbox-dark-medium"),
163
+ "gruvbox-light-medium": () => importTheme("gruvbox-light-medium"),
164
+ horizon: () => importTheme("horizon"),
165
+ "horizon-bright": () => importTheme("horizon-bright"),
156
166
  "kanagawa-dragon": () => importTheme("kanagawa-dragon"),
167
+ "kanagawa-lotus": () => importTheme("kanagawa-lotus"),
157
168
  "kanagawa-wave": () => importTheme("kanagawa-wave"),
169
+ "light-plus": () => importTheme("light-plus"),
170
+ "material-theme": () => importTheme("material-theme"),
171
+ "material-theme-lighter": () => importTheme("material-theme-lighter"),
158
172
  "material-theme-palenight": () => importTheme("material-theme-palenight"),
159
173
  "min-dark": () => importTheme("min-dark"),
160
174
  "min-light": () => importTheme("min-light"),
161
175
  monokai: () => importTheme("monokai"),
162
176
  "night-owl": () => importTheme("night-owl"),
177
+ "night-owl-light": () => importTheme("night-owl-light"),
163
178
  nord: () => importTheme("nord"),
164
179
  "one-dark-pro": () => importTheme("one-dark-pro"),
165
180
  "one-light": () => importTheme("one-light"),
166
181
  poimandres: () => importTheme("poimandres"),
167
182
  "rose-pine": () => importTheme("rose-pine"),
183
+ "rose-pine-dawn": () => importTheme("rose-pine-dawn"),
184
+ "rose-pine-moon": () => importTheme("rose-pine-moon"),
168
185
  "solarized-dark": () => importTheme("solarized-dark"),
169
186
  "solarized-light": () => importTheme("solarized-light"),
170
187
  "synthwave-84": () => importTheme("synthwave-84"),
@@ -173,11 +190,11 @@ const builtin = {
173
190
  "tokyonight-night": () => importTheme("tokyonight-night"),
174
191
  "tokyonight-storm": () => importTheme("tokyonight-storm"),
175
192
  vesper: () => importTheme("vesper"),
193
+ "vitesse-black": () => importTheme("vitesse-black"),
176
194
  "vitesse-dark": () => importTheme("vitesse-dark"),
177
195
  "vitesse-light": () => importTheme("vitesse-light")
178
196
  };
179
- //#endregion
180
- //#region src/themes/default.ts
197
+ // src/themes/default.ts
181
198
  /**
182
199
  * Slot-level fallbacks. Every Theme value is shallow-merged on top of
183
200
  * this record by `resolveTheme`, so partial JSON themes only need to
@@ -186,11 +203,9 @@ const builtin = {
186
203
  * Distinct from `defaultTheme` — that's the precomputed `tokyonight-moon`
187
204
  * Theme bundled as the default palette for `createCtx()` etc.
188
205
  */
189
- const defaults = {
190
- primary: "blue",
191
- accent: "brightMagenta",
192
- bg: "inherit",
193
- fg: "inherit",
206
+ const defaultsDark = {
207
+ appearance: "dark",
208
+ shiki: "auto",
194
209
  muted: { dim: true },
195
210
  quiet: {
196
211
  dim: true,
@@ -206,31 +221,16 @@ const defaults = {
206
221
  fg: "primary"
207
222
  },
208
223
  delim: "muted",
209
- ui: { bg: "bg+5" },
224
+ ui: { bg: "bg+3" },
210
225
  overlay: { bg: "ui" },
211
- highlight: { bg: "bg+5" },
226
+ highlight: { bg: "ui" },
212
227
  divider: "bg-5",
213
- selection: {
214
- bg: "brightBlue",
215
- fg: "black"
216
- },
217
- gutter: "bg-5",
228
+ gutter: "quiet",
218
229
  prompt: "inherit",
219
- border: "black",
230
+ border: "divider",
220
231
  borderTitle: "title",
221
- code: { bg: "bg+5" },
232
+ code: { bg: "bg+3" },
222
233
  codeTitle: "title",
223
- success: "green",
224
- info: "cyan",
225
- warn: "yellow",
226
- error: "red",
227
- syntaxNumber: "brightBlue",
228
- syntaxString: "green",
229
- syntaxBoolean: "yellow",
230
- syntaxFunction: "blue",
231
- syntaxField: "white",
232
- syntaxConstant: "magenta",
233
- syntaxSpecial: "red",
234
234
  syntaxDelimiter: "delim",
235
235
  syntaxBracket: "delim",
236
236
  mdBold: { bold: true },
@@ -259,6 +259,7 @@ const defaults = {
259
259
  mdListBullet: "accent",
260
260
  mdListChecked: "primary",
261
261
  mdListUnchecked: "primary",
262
+ mdMath: { fg: "primary" },
262
263
  mdQuote: "muted",
263
264
  mdStrikethrough: { strikethrough: true },
264
265
  mdTable: "accent",
@@ -266,40 +267,179 @@ const defaults = {
266
267
  optionActive: "selection",
267
268
  optionDesc: "muted",
268
269
  optionName: "primary",
269
- diffAdd: {
270
- bg: "success-50",
271
- fg: "success"
272
- },
273
- diffContext: "highlight",
274
- diffDel: {
275
- bg: "error-50",
276
- fg: "error"
277
- },
278
- diffLine: "gutter",
279
- diffTitle: "title"
270
+ diffContext: { bg: "code" },
271
+ diffAddNum: { bg: "diffAdd+10" },
272
+ diffDelNum: { bg: "diffDel+10" },
273
+ diffContextNum: { bg: "diffContext+10" }
274
+ };
275
+ const defaultsLight = {
276
+ ...defaultsDark,
277
+ appearance: "light",
278
+ shiki: "auto",
279
+ ui: { bg: "bg-3" },
280
+ highlight: { bg: "bg-3" },
281
+ divider: "fg-5",
282
+ code: { bg: "bg-2" },
283
+ diffAddNum: { bg: "diffAdd-10" },
284
+ diffDelNum: { bg: "diffDel-10" },
285
+ diffContextNum: { bg: "diffContext-10" }
286
+ };
287
+ const defaultsSystem = {
288
+ primary: "blue",
289
+ accent: "brightMagenta",
290
+ bg: "inherit",
291
+ fg: "inherit",
292
+ selection: { inverse: true },
293
+ success: "green",
294
+ info: "cyan",
295
+ warn: "yellow",
296
+ error: "red",
297
+ syntaxNumber: "brightBlue",
298
+ syntaxString: "green",
299
+ syntaxBoolean: "yellow",
300
+ syntaxFunction: "blue",
301
+ syntaxField: "white",
302
+ syntaxConstant: "magenta",
303
+ syntaxSpecial: "red"
280
304
  };
281
- const ansi = {
282
- id: "ansi",
283
- name: "ANSI",
284
- ...defaults,
305
+ const defaultsAnsi = {
285
306
  divider: "brightBlue",
286
307
  border: "brightBlue",
287
308
  highlight: { bg: "brightBlack" },
288
- ui: { bg: "brightBlack" },
289
- selection: { inverse: true },
309
+ ui: {},
310
+ code: {},
290
311
  diffAdd: { fg: "success" },
291
312
  diffDel: { fg: "error" }
292
313
  };
293
- //#endregion
294
- //#region src/themes/registry.ts
314
+ // src/themes/system.ts
315
+ const ANSI_NAMES = [
316
+ "black",
317
+ "red",
318
+ "green",
319
+ "yellow",
320
+ "blue",
321
+ "magenta",
322
+ "cyan",
323
+ "white",
324
+ "brightBlack",
325
+ "brightRed",
326
+ "brightGreen",
327
+ "brightYellow",
328
+ "brightBlue",
329
+ "brightMagenta",
330
+ "brightCyan",
331
+ "brightWhite"
332
+ ];
333
+ /** @internal Replace palette-name bases while retaining authored lightness adjustments. */
334
+ function internalizePalette(theme, colors) {
335
+ const color = (value) => {
336
+ const [, base, suffix = ""] = value.match(/^(.+?)([+-]\d+)?$/) ?? ["", value];
337
+ const hex = colors.get(base);
338
+ return hex === void 0 ? value : `${hex}${suffix}`;
339
+ };
340
+ return Object.fromEntries(Object.entries(theme).map(([key, value]) => {
341
+ if ([
342
+ "$schema",
343
+ "id",
344
+ "name",
345
+ "shiki",
346
+ "appearance"
347
+ ].includes(key)) return [key, value];
348
+ if (typeof value === "string") return [key, color(value)];
349
+ if (typeof value !== "object") return [key, value];
350
+ const style = { ...value };
351
+ if (style.fg !== void 0) style.fg = color(style.fg);
352
+ if (style.bg !== void 0) style.bg = color(style.bg);
353
+ return [key, style];
354
+ }));
355
+ }
356
+ /** Freeze a complete terminal palette into a file-compatible RGB theme. */
357
+ function themeFromPalette(palette) {
358
+ if (palette.ansi.length !== 16) throw new Error("A terminal palette requires exactly 16 ANSI colors");
359
+ const appearance = palette.appearance ?? (isDark(palette.bg) ? "dark" : "light");
360
+ const colors = new Map(ANSI_NAMES.map((name, i) => [name, palette.ansi[i]]));
361
+ for (const name of [
362
+ "brightGray",
363
+ "brightGrey",
364
+ "gray",
365
+ "grey"
366
+ ]) colors.set(name, palette.ansi[8]);
367
+ const theme = {
368
+ ...appearance === "dark" ? defaultsDark : defaultsLight,
369
+ ...defaultsSystem,
370
+ ...Object.fromEntries(colors),
371
+ appearance,
372
+ bg: palette.bg,
373
+ diffAdd: {
374
+ bg: blend(palette.ansi[2], palette.bg, .2),
375
+ fg: "success"
376
+ },
377
+ diffDel: {
378
+ bg: blend(palette.ansi[1], palette.bg, .2),
379
+ fg: "error"
380
+ },
381
+ fg: palette.fg,
382
+ muted: blend(palette.fg, palette.bg, .5),
383
+ selection: { bg: blend(palette.ansi[12], palette.bg, .3) },
384
+ syntaxField: "fg"
385
+ };
386
+ if (palette.selectionBg) theme.selection = {
387
+ bg: palette.selectionBg,
388
+ fg: palette.selectionFg
389
+ };
390
+ return internalizePalette(theme, colors);
391
+ }
392
+ /** Choose the richest coherent strategy supported by this terminal snapshot. */
393
+ function systemTheme(snapshot, reportedAppearance = "dark") {
394
+ let appearance = reportedAppearance;
395
+ if (snapshot?.bg) appearance = isDark(snapshot.bg) ? "dark" : "light";
396
+ const identity = {
397
+ appearance,
398
+ id: "system",
399
+ name: "System",
400
+ shiki: "auto"
401
+ };
402
+ if (snapshot?.bg && snapshot.fg && snapshot.ansi.length === 16 && snapshot.ansi.every((color) => color !== void 0)) return {
403
+ ...themeFromPalette({
404
+ ...snapshot,
405
+ ansi: snapshot.ansi,
406
+ appearance,
407
+ bg: snapshot.bg,
408
+ fg: snapshot.fg
409
+ }),
410
+ ...identity
411
+ };
412
+ if (snapshot?.bg) return {
413
+ ...appearance === "dark" ? defaultsDark : defaultsLight,
414
+ ...defaultsSystem,
415
+ ...identity,
416
+ bg: snapshot.bg,
417
+ diffAdd: { fg: "success" },
418
+ diffDel: { fg: "error" },
419
+ fg: snapshot.fg ?? "inherit",
420
+ ...snapshot.selectionBg ? { selection: {
421
+ bg: snapshot.selectionBg,
422
+ fg: snapshot.selectionFg ?? snapshot.fg ?? "inherit"
423
+ } } : {}
424
+ };
425
+ return {
426
+ ...defaultsDark,
427
+ ...defaultsSystem,
428
+ ...defaultsAnsi,
429
+ ...identity
430
+ };
431
+ }
432
+ // src/themes/registry.ts
295
433
  const DEFAULT_THEME = "tokyonight-moon";
296
434
  /**
297
435
  * Registry of built-in themes plus any registered at runtime. The
298
436
  * registry never awaits — loaders return `Promise<Partial<Theme>>` so
299
437
  * callers `await` explicitly.
300
438
  */
301
- const themeRegistry = createRegistry("theme").from(builtin);
302
- themeRegistry.register("ansi", async () => ({ ...ansi }));
439
+ const themeRegistry = createRegistry("theme").from({
440
+ ...builtin,
441
+ system: async () => systemTheme()
442
+ });
303
443
  async function loadTheme(o) {
304
444
  o ??= DEFAULT_THEME;
305
445
  const opts = typeof o === "string" ? { name: o } : o;
@@ -314,14 +454,16 @@ async function loadTheme(o) {
314
454
  }
315
455
  /**
316
456
  * Fill defaults on a raw theme object. Built-in JSON is dev-controlled
317
- * so we don't pay typia's ~3MB of generated assertions at startup;
457
+ * so the standalone validator stays off the main startup path;
318
458
  * user-supplied JSON goes through `loadThemeFile` which validates.
319
459
  */
320
460
  function resolveTheme(theme, id) {
321
461
  const { $schema: _, ...rest } = theme;
462
+ let appearance = rest.appearance;
463
+ if (!appearance && rest.bg && isHexColor(rest.bg)) appearance = isDark(rest.bg) ? "dark" : "light";
464
+ appearance ??= "dark";
322
465
  return {
323
- ...defaults,
324
- id,
466
+ ...appearance === "dark" ? defaultsDark : defaultsLight,
325
467
  name: id,
326
468
  ...rest
327
469
  };
@@ -331,19 +473,17 @@ function resolveTheme(theme, id) {
331
473
  * this is the escape hatch for CLIs that accept an explicit `--theme
332
474
  * /path/to/theme.json` argument.
333
475
  *
334
- * Async because typia's generated `validateTheme` (a few thousand
335
- * unrolled assertions) is dynamically imported here — it's only needed
336
- * for user-supplied JSON and should stay off the main startup path.
476
+ * The standalone validator is dynamically imported here — it is only
477
+ * needed for user-supplied JSON and stays off the main startup path.
337
478
  */
338
479
  async function loadThemeFile(path) {
339
480
  const raw = withError(() => readFileSync(path, "utf8"), `Failed to read theme file at ${path}`);
340
481
  const data = withError(() => JSON.parse(raw), `Failed to parse theme JSON at ${path}`);
341
- const { validateTheme } = await import("./theme.config-B3Yx--C2.mjs");
482
+ const { validateTheme } = await import("./theme-BeSaXGNY.mjs");
342
483
  return resolveTheme(validateTheme(data), basename(path, ".json"));
343
484
  }
344
485
  /** TokyoNight Moon — the default. Sourced from `assets/themes/tokyonight-moon.json`. */
345
486
  const defaultTheme = resolveTheme(tokyonight_moon_default, "tokyonight-moon");
346
- //#endregion
347
- export { loadTheme as n, themeRegistry as r, defaultTheme as t };
487
+ export { systemTheme as i, loadTheme as n, themeRegistry as r, defaultTheme as t };
348
488
 
349
- //# sourceMappingURL=registry-D-suU3g0.mjs.map
489
+ //# sourceMappingURL=registry-CQU0VwpM.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-CQU0VwpM.mjs","names":["moonJson"],"sources":["../assets/themes/tokyonight-moon.json","../src/themes/builtin.ts","../src/themes/default.ts","../src/themes/system.ts","../src/themes/registry.ts"],"sourcesContent":["","// AUTO-GENERATED by `scripts/gen-themes.ts`. DO NOT EDIT.\n// Re-run `bun scripts/gen-themes.ts` after adding/renaming a theme.\n\nimport type { CustomTheme } from \"./default.ts\"\nimport type { ThemeLoader } from \"./registry.ts\"\n\nconst importTheme = (path: string): Promise<CustomTheme> =>\n import(`#assets/themes/${path}.json`, { with: { type: \"json\" } }).then(\n (m) => m.default as CustomTheme\n )\n\n/**\n * Async loader map for every built-in theme. Each entry returns the\n * raw JSON; `themes/index.ts` wraps these with `resolveTheme` to\n * produce a fully-resolved `Theme` from the registry. Bundlers\n * code-split each `import(\"…json\")` into its own chunk, so apps only\n * pull the theme they actually load.\n *\n * `as const satisfies Record<string, ThemeLoader>` keeps the keys\n * narrow (so `BuiltinThemeName` is a literal union) but lets the\n * value type widen to `Partial<Theme>` — themes have no per-key\n * narrow types worth preserving, and the satisfies clause means\n * `themes/index.ts` can pass this map straight to `themeRegistry`\n * with no cast.\n */\nexport const builtin = {\n andromeeda: () => importTheme(\"andromeeda\"),\n \"ayu-dark\": () => importTheme(\"ayu-dark\"),\n \"ayu-light\": () => importTheme(\"ayu-light\"),\n \"ayu-mirage\": () => importTheme(\"ayu-mirage\"),\n \"catppuccin-frappe\": () => importTheme(\"catppuccin-frappe\"),\n \"catppuccin-latte\": () => importTheme(\"catppuccin-latte\"),\n \"catppuccin-macchiato\": () => importTheme(\"catppuccin-macchiato\"),\n \"catppuccin-mocha\": () => importTheme(\"catppuccin-mocha\"),\n \"dark-plus\": () => importTheme(\"dark-plus\"),\n dracula: () => importTheme(\"dracula\"),\n \"everforest-dark\": () => importTheme(\"everforest-dark\"),\n \"everforest-light\": () => importTheme(\"everforest-light\"),\n \"github-dark-default\": () => importTheme(\"github-dark-default\"),\n \"github-dark-dimmed\": () => importTheme(\"github-dark-dimmed\"),\n \"github-light-default\": () => importTheme(\"github-light-default\"),\n \"gruvbox-dark-hard\": () => importTheme(\"gruvbox-dark-hard\"),\n \"gruvbox-dark-medium\": () => importTheme(\"gruvbox-dark-medium\"),\n \"gruvbox-light-medium\": () => importTheme(\"gruvbox-light-medium\"),\n horizon: () => importTheme(\"horizon\"),\n \"horizon-bright\": () => importTheme(\"horizon-bright\"),\n \"kanagawa-dragon\": () => importTheme(\"kanagawa-dragon\"),\n \"kanagawa-lotus\": () => importTheme(\"kanagawa-lotus\"),\n \"kanagawa-wave\": () => importTheme(\"kanagawa-wave\"),\n \"light-plus\": () => importTheme(\"light-plus\"),\n \"material-theme\": () => importTheme(\"material-theme\"),\n \"material-theme-lighter\": () => importTheme(\"material-theme-lighter\"),\n \"material-theme-palenight\": () => importTheme(\"material-theme-palenight\"),\n \"min-dark\": () => importTheme(\"min-dark\"),\n \"min-light\": () => importTheme(\"min-light\"),\n monokai: () => importTheme(\"monokai\"),\n \"night-owl\": () => importTheme(\"night-owl\"),\n \"night-owl-light\": () => importTheme(\"night-owl-light\"),\n nord: () => importTheme(\"nord\"),\n \"one-dark-pro\": () => importTheme(\"one-dark-pro\"),\n \"one-light\": () => importTheme(\"one-light\"),\n poimandres: () => importTheme(\"poimandres\"),\n \"rose-pine\": () => importTheme(\"rose-pine\"),\n \"rose-pine-dawn\": () => importTheme(\"rose-pine-dawn\"),\n \"rose-pine-moon\": () => importTheme(\"rose-pine-moon\"),\n \"solarized-dark\": () => importTheme(\"solarized-dark\"),\n \"solarized-light\": () => importTheme(\"solarized-light\"),\n \"synthwave-84\": () => importTheme(\"synthwave-84\"),\n \"tokyonight-day\": () => importTheme(\"tokyonight-day\"),\n \"tokyonight-moon\": () => importTheme(\"tokyonight-moon\"),\n \"tokyonight-night\": () => importTheme(\"tokyonight-night\"),\n \"tokyonight-storm\": () => importTheme(\"tokyonight-storm\"),\n vesper: () => importTheme(\"vesper\"),\n \"vitesse-black\": () => importTheme(\"vitesse-black\"),\n \"vitesse-dark\": () => importTheme(\"vitesse-dark\"),\n \"vitesse-light\": () => importTheme(\"vitesse-light\"),\n} as const satisfies Record<string, ThemeLoader>\n","import type { Theme } from \"./types.ts\"\n\nexport type CustomTheme = Partial<Pick<Theme<false>, keyof typeof defaultsDark>> &\n Omit<Theme<false>, keyof typeof defaultsDark> & { $schema?: string }\n\n/**\n * Slot-level fallbacks. Every Theme value is shallow-merged on top of\n * this record by `resolveTheme`, so partial JSON themes only need to\n * declare slots that diverge from these defaults.\n *\n * Distinct from `defaultTheme` — that's the precomputed `tokyonight-moon`\n * Theme bundled as the default palette for `createCtx()` etc.\n */\n// oxlint-disable-next-line sort-keys\nexport const defaultsDark = {\n appearance: \"dark\",\n shiki: \"auto\",\n\n // text\n muted: { dim: true },\n quiet: { dim: true, fg: \"muted\", italic: true },\n comment: { fg: \"muted\", italic: true },\n title: { bold: true, fg: \"primary\" },\n delim: \"muted\",\n\n // surface & structure\n ui: { bg: \"bg+3\" },\n overlay: { bg: \"ui\" },\n highlight: { bg: \"ui\" },\n\n // ui primitives\n divider: \"bg-5\",\n gutter: \"quiet\",\n prompt: \"inherit\",\n border: \"divider\",\n borderTitle: \"title\",\n\n // code\n code: { bg: \"bg+3\" },\n codeTitle: \"title\",\n\n // syntax\n syntaxDelimiter: \"delim\",\n syntaxBracket: \"delim\",\n\n // markdown\n mdBold: { bold: true },\n mdCode: { bg: \"highlight\", fg: \"primary\" },\n mdCodeBlock: \"code\",\n mdCodeBlockTitle: \"title\",\n mdHeading1: \"mdHeading\",\n mdHeading2: { bold: true, fg: \"accent\" },\n mdHeading3: \"mdHeading2\",\n mdHeading4: \"mdHeading2\",\n mdHeading5: \"mdHeading2\",\n mdHeading6: \"mdHeading2\",\n mdHeading: \"title\",\n mdHr: \"accent\",\n mdItalic: { italic: true },\n mdLink: { fg: \"primary\", underline: true },\n mdListBullet: \"accent\",\n mdListChecked: \"primary\",\n mdListUnchecked: \"primary\",\n mdMath: { fg: \"primary\" },\n mdQuote: \"muted\",\n mdStrikethrough: { strikethrough: true },\n mdTable: \"accent\",\n mdTableHeader: \"title\",\n\n // menu\n optionActive: \"selection\",\n optionDesc: \"muted\",\n optionName: \"primary\",\n\n // diff\n diffContext: { bg: \"code\" },\n diffAddNum: { bg: \"diffAdd+10\" },\n diffDelNum: { bg: \"diffDel+10\" },\n diffContextNum: { bg: \"diffContext+10\" },\n} satisfies Partial<Theme<false>>\n\n// oxlint-disable-next-line sort-keys\nexport const defaultsLight = {\n ...defaultsDark,\n appearance: \"light\",\n shiki: \"auto\",\n ui: { bg: \"bg-3\" },\n highlight: { bg: \"bg-3\" },\n divider: \"fg-5\",\n code: { bg: \"bg-2\" },\n diffAddNum: { bg: \"diffAdd-10\" },\n diffDelNum: { bg: \"diffDel-10\" },\n diffContextNum: { bg: \"diffContext-10\" },\n} satisfies Partial<Theme<false>>\n\n// oxlint-disable-next-line sort-keys\nexport const defaultsSystem = {\n // base colors\n primary: \"blue\",\n accent: \"brightMagenta\",\n\n bg: \"inherit\",\n fg: \"inherit\",\n\n selection: { inverse: true },\n // log levels\n success: \"green\",\n info: \"cyan\",\n warn: \"yellow\",\n error: \"red\",\n\n // syntax\n syntaxNumber: \"brightBlue\",\n syntaxString: \"green\",\n syntaxBoolean: \"yellow\",\n syntaxFunction: \"blue\",\n syntaxField: \"white\",\n syntaxConstant: \"magenta\",\n syntaxSpecial: \"red\",\n} satisfies Partial<Theme>\n\n// oxlint-disable-next-line sort-keys\nexport const defaultsAnsi = {\n divider: \"brightBlue\",\n border: \"brightBlue\",\n highlight: { bg: \"brightBlack\" },\n ui: {},\n code: {},\n diffAdd: { fg: \"success\" },\n diffDel: { fg: \"error\" },\n} satisfies Partial<Theme>\n","import type { TerminalPaletteSnapshot } from \"../input/queries.ts\"\nimport type { Color, HexColor } from \"../style/types.ts\"\nimport type { Theme } from \"./types.ts\"\n\nimport { blend } from \"../style/color.ts\"\nimport { isDark } from \"../style/oklch.ts\"\nimport { defaultsAnsi, defaultsDark, defaultsLight, defaultsSystem } from \"./default.ts\"\n\nexport interface TerminalPalette {\n /** ANSI colors in index order, 0–15. */\n ansi: readonly HexColor[]\n bg: HexColor\n fg: HexColor\n appearance?: Theme[\"appearance\"]\n selectionBg?: HexColor\n selectionFg?: HexColor\n}\n\nconst ANSI_NAMES = [\n \"black\",\n \"red\",\n \"green\",\n \"yellow\",\n \"blue\",\n \"magenta\",\n \"cyan\",\n \"white\",\n \"brightBlack\",\n \"brightRed\",\n \"brightGreen\",\n \"brightYellow\",\n \"brightBlue\",\n \"brightMagenta\",\n \"brightCyan\",\n \"brightWhite\",\n] as const\n\n/** @internal Replace palette-name bases while retaining authored lightness adjustments. */\nexport function internalizePalette(\n theme: Omit<Theme, \"id\">,\n colors: ReadonlyMap<string, HexColor>\n): Omit<Theme<false>, \"id\"> {\n const color = (value: string) => {\n const [, base, suffix = \"\"] = value.match(/^(.+?)([+-]\\d+)?$/) ?? [\"\", value]\n const hex = colors.get(base)\n return (hex === undefined ? value : `${hex}${suffix}`) as Color\n }\n return Object.fromEntries(\n Object.entries(theme).map(([key, value]) => {\n if ([\"$schema\", \"id\", \"name\", \"shiki\", \"appearance\"].includes(key)) return [key, value]\n if (typeof value === \"string\") return [key, color(value)]\n if (typeof value !== \"object\") return [key, value]\n const style = { ...value }\n if (style.fg !== undefined) style.fg = color(style.fg)\n if (style.bg !== undefined) style.bg = color(style.bg)\n return [key, style]\n })\n ) as Omit<Theme<false>, \"id\">\n}\n\n/** Freeze a complete terminal palette into a file-compatible RGB theme. */\nexport function themeFromPalette(palette: TerminalPalette): Omit<Theme<false>, \"id\"> {\n if (palette.ansi.length !== 16)\n throw new Error(\"A terminal palette requires exactly 16 ANSI colors\")\n const appearance = palette.appearance ?? (isDark(palette.bg) ? \"dark\" : \"light\")\n const colors = new Map<string, HexColor>(ANSI_NAMES.map((name, i) => [name, palette.ansi[i]]))\n for (const name of [\"brightGray\", \"brightGrey\", \"gray\", \"grey\"]) colors.set(name, palette.ansi[8])\n const theme: Omit<Theme, \"id\"> = {\n ...(appearance === \"dark\" ? defaultsDark : defaultsLight),\n ...defaultsSystem,\n ...Object.fromEntries(colors),\n appearance,\n bg: palette.bg,\n diffAdd: { bg: blend(palette.ansi[2], palette.bg, 0.2), fg: \"success\" },\n diffDel: { bg: blend(palette.ansi[1], palette.bg, 0.2), fg: \"error\" },\n fg: palette.fg,\n muted: blend(palette.fg, palette.bg, 0.5),\n selection: { bg: blend(palette.ansi[12], palette.bg, 0.3) },\n syntaxField: \"fg\",\n }\n if (palette.selectionBg) theme.selection = { bg: palette.selectionBg, fg: palette.selectionFg }\n return internalizePalette(theme, colors)\n}\n\n/** Choose the richest coherent strategy supported by this terminal snapshot. */\nexport function systemTheme(\n snapshot?: TerminalPaletteSnapshot,\n reportedAppearance: Theme[\"appearance\"] = \"dark\"\n): Theme {\n let appearance = reportedAppearance\n if (snapshot?.bg) appearance = isDark(snapshot.bg) ? \"dark\" : \"light\"\n const identity = {\n appearance,\n id: \"system\",\n name: \"System\",\n shiki: \"auto\",\n } as const\n if (\n snapshot?.bg &&\n snapshot.fg &&\n snapshot.ansi.length === 16 &&\n snapshot.ansi.every((color) => color !== undefined)\n ) {\n return {\n ...themeFromPalette({\n ...snapshot,\n ansi: snapshot.ansi as HexColor[],\n appearance,\n bg: snapshot.bg,\n fg: snapshot.fg,\n }),\n ...identity,\n }\n }\n if (snapshot?.bg) {\n return {\n ...(appearance === \"dark\" ? defaultsDark : defaultsLight),\n ...defaultsSystem,\n ...identity,\n bg: snapshot.bg,\n diffAdd: { fg: \"success\" },\n diffDel: { fg: \"error\" },\n fg: snapshot.fg ?? \"inherit\",\n ...(snapshot.selectionBg\n ? {\n selection: {\n bg: snapshot.selectionBg,\n fg: snapshot.selectionFg ?? snapshot.fg ?? \"inherit\",\n },\n }\n : {}),\n }\n }\n return {\n ...defaultsDark,\n ...defaultsSystem,\n ...defaultsAnsi,\n ...identity,\n }\n}\n","import type { CustomTheme } from \"./default.ts\"\nimport type { Theme } from \"./types.ts\"\n\nimport { withError } from \"@zaly/shared\"\nimport { createRegistry } from \"@zaly/shared/registry\"\nimport { readFileSync } from \"node:fs\"\nimport { basename } from \"pathe\"\nimport moonJson from \"../../assets/themes/tokyonight-moon.json\" with { type: \"json\" }\nimport { isHexColor } from \"../style/color.ts\"\nimport { isDark } from \"../style/oklch.ts\"\nimport { builtin } from \"./builtin.ts\"\nimport { defaultsDark, defaultsLight } from \"./default.ts\"\nimport { systemTheme } from \"./system.ts\"\n\n/** Built-in JSON themes plus the runtime terminal palette. */\nexport type BuiltinTheme = keyof typeof builtin | \"system\"\nexport type AnyTheme = BuiltinTheme | (string & {})\nexport type ThemeLoader = () => Promise<CustomTheme | Theme>\n\nconst DEFAULT_THEME: BuiltinTheme = \"tokyonight-moon\"\n\n/**\n * Registry of built-in themes plus any registered at runtime. The\n * registry never awaits — loaders return `Promise<Partial<Theme>>` so\n * callers `await` explicitly.\n */\nexport const themeRegistry = createRegistry<ThemeLoader>(\"theme\").from({\n ...builtin,\n system: async () => systemTheme(),\n})\n\n/**\n * Load a theme by name or path.\n */\nexport async function loadTheme(name?: string): Promise<Theme>\nexport async function loadTheme(opts: { name?: string; path?: string }): Promise<Theme>\nexport async function loadTheme(o?: string | { name?: string; path?: string }): Promise<Theme> {\n o ??= DEFAULT_THEME\n const opts = typeof o === \"string\" ? { name: o } : o\n\n if (opts.name?.endsWith(\".json\")) return loadTheme({ path: opts.name })\n if (opts.path) return loadThemeFile(opts.path)\n if (opts.name) {\n if (opts.name === DEFAULT_THEME) return defaultTheme\n if (themeRegistry.has(opts.name))\n return resolveTheme(await themeRegistry.load(opts.name), opts.name)\n throw new Error(`Theme \"${opts.name}\" not found.`)\n }\n\n return defaultTheme\n}\n\n/**\n * Fill defaults on a raw theme object. Built-in JSON is dev-controlled\n * so the standalone validator stays off the main startup path;\n * user-supplied JSON goes through `loadThemeFile` which validates.\n */\nfunction resolveTheme(theme: (CustomTheme | Theme) & { $schema?: string }, id: string): Theme {\n const { $schema: _, ...rest } = theme\n let appearance: \"dark\" | \"light\" | undefined = rest.appearance\n if (!appearance && rest.bg && isHexColor(rest.bg)) appearance = isDark(rest.bg) ? \"dark\" : \"light\"\n appearance ??= \"dark\"\n return { ...(appearance === \"dark\" ? defaultsDark : defaultsLight), name: id, ...rest }\n}\n\n/**\n * Load a theme directly from a file path. No directory search happens —\n * this is the escape hatch for CLIs that accept an explicit `--theme\n * /path/to/theme.json` argument.\n *\n * The standalone validator is dynamically imported here — it is only\n * needed for user-supplied JSON and stays off the main startup path.\n */\nasync function loadThemeFile(path: string): Promise<Theme> {\n const raw = withError(() => readFileSync(path, \"utf8\"), `Failed to read theme file at ${path}`)\n const data = withError(() => JSON.parse(raw), `Failed to parse theme JSON at ${path}`)\n const { validateTheme } = await import(\"../schemas/theme.ts\")\n return resolveTheme(validateTheme(data), basename(path, \".json\"))\n}\n\n/** TokyoNight Moon — the default. Sourced from `assets/themes/tokyonight-moon.json`. */\nexport const defaultTheme = resolveTheme(moonJson as CustomTheme, \"tokyonight-moon\")\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { d as createSuspenseBoundary, i as createContext, l as createRoot, n as SuspenseContext, v as provideContext } from "./reactive-f7NpAi69.mjs";
2
- import { t as createCtx } from "./ctx-B7BmPUCD.mjs";
3
- //#region src/core/render.ts
1
+ import { d as createSuspenseBoundary, i as createContext, l as createRoot, n as SuspenseContext, v as provideContext } from "./reactive-DkP75TPk.mjs";
2
+ import { t as createCtx } from "./ctx-DBeFcZt6.mjs";
3
+ // src/core/render.ts
4
4
  const RenderContext = createContext();
5
5
  async function createRender(node, ctx = createCtx()) {
6
6
  if (ctx.boundary) return renderWithDrain(node, ctx.boundary, ctx);
@@ -27,7 +27,6 @@ async function renderWithDrain(node, boundary, ctx) {
27
27
  }
28
28
  return rows;
29
29
  }
30
- //#endregion
31
30
  export { createRender as n, RenderContext as t };
32
31
 
33
- //# sourceMappingURL=render-DEIUNLkh.mjs.map
32
+ //# sourceMappingURL=render-Bp2N2i6J.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"render-DEIUNLkh.mjs","names":[],"sources":["../src/core/render.ts"],"sourcesContent":["import type { TerminalQueries } from \"../input/queries.ts\"\nimport type { StyleBuilder } from \"../style/builder.ts\"\nimport type { Theme } from \"../themes/types.ts\"\nimport type { RenderCtx } from \"./ctx.ts\"\n// oxlint-disable no-await-in-loop\nimport type { Node } from \"./node.ts\"\nimport type { Accessor, SuspenseBoundary } from \"./reactive.ts\"\n\nimport { createCtx } from \"./ctx.ts\"\nimport {\n createContext,\n createRoot,\n createSuspenseBoundary,\n provideContext,\n SuspenseContext,\n} from \"./reactive.ts\"\n\n/** Components-facing slice of the render environment — reactive\n * accessors a widget body reads via `useContext(RenderContext)`. Use\n * this when a widget needs ambient theme/style outside an `_render`\n * call (the place where `RenderCtx` is threaded in). Width is\n * deliberately omitted — that's a per-render allotted-size concept,\n * not an ambient one. */\nexport type RenderContextValue = {\n /** Active theme. Tracked — widgets that read it re-fire on swap. */\n theme: Accessor<Theme>\n /** Theme-bound chainable style builder. Derived memo over `theme`. */\n style: Accessor<StyleBuilder>\n /** Whether to render images (when supported) */\n images: Accessor<boolean>\n queries: TerminalQueries\n}\nexport const RenderContext = createContext<RenderContextValue>()\n\n/**\n * Render a Node, draining `createAsync` work in its subtree before\n * returning final rows. Two shapes:\n *\n * - `createRender(() => node, ctx?)` — factory form. Creates a fresh\n * `SuspenseBoundary` inside a new `createRoot` and runs the\n * factory in that scope so descendants find the boundary via\n * `useContext(SuspenseContext)`. For tests, benches, REPL.\n *\n * - `createRender(node, { ...ctx, boundary })` — pre-built Node\n * with a caller-provided boundary. Used by `Stream.render`: the\n * boundary was installed at `append` time, so we just render +\n * drain without a new root scope.\n *\n * `ctx` defaults to `createCtx()` in the factory form.\n *\n * ```ts\n * const rows = await createRender(() => markdown(\"**hi**\"))\n * ```\n */\nexport async function createRender(\n node: Node,\n ctx: RenderCtx & { boundary: SuspenseBoundary }\n): Promise<string[]>\nexport async function createRender(node: () => Node, ctx?: RenderCtx): Promise<string[]>\nexport async function createRender(\n node: Node | (() => Node),\n ctx: RenderCtx & { boundary?: SuspenseBoundary } = createCtx()\n): Promise<string[]> {\n if (ctx.boundary) return renderWithDrain(node as Node, ctx.boundary, ctx)\n const boundary = createSuspenseBoundary()\n const nodeFn = node as () => Node\n return createRoot(async () => {\n provideContext(SuspenseContext, boundary)\n return renderWithDrain(nodeFn(), boundary, ctx)\n })\n}\n\n/** Wait for any pending work first, then render. On warm caches the\n * initial `whenIdle` resolves on the same microtask tick — no real\n * wait — and we render exactly once with final values. On cold the\n * wait blocks until `createAsync` settles. The follow-up `while`\n * catches the in-render case: a `_render` that fires a fresh\n * `createAsync` (signal write subscribes a new effect) bumps the\n * boundary back above zero, requiring another pass. */\nasync function renderWithDrain(\n node: Node,\n boundary: SuspenseBoundary,\n ctx: RenderCtx\n): Promise<string[]> {\n if (boundary.active()) await boundary.whenIdle()\n let rows = await node.render(ctx)\n while (boundary.active()) {\n await boundary.whenIdle()\n rows = await node.render(ctx)\n }\n return rows\n}\n"],"mappings":";;;AAgCA,MAAa,gBAAgB,cAAkC;AA2B/D,eAAsB,aACpB,MACA,MAAmD,UAAU,GAC1C;CACnB,IAAI,IAAI,UAAU,OAAO,gBAAgB,MAAc,IAAI,UAAU,GAAG;CACxE,MAAM,WAAW,uBAAuB;CACxC,MAAM,SAAS;CACf,OAAO,WAAW,YAAY;EAC5B,eAAe,iBAAiB,QAAQ;EACxC,OAAO,gBAAgB,OAAO,GAAG,UAAU,GAAG;CAChD,CAAC;AACH;;;;;;;;AASA,eAAe,gBACb,MACA,UACA,KACmB;CACnB,IAAI,SAAS,OAAO,GAAG,MAAM,SAAS,SAAS;CAC/C,IAAI,OAAO,MAAM,KAAK,OAAO,GAAG;CAChC,OAAO,SAAS,OAAO,GAAG;EACxB,MAAM,SAAS,SAAS;EACxB,OAAO,MAAM,KAAK,OAAO,GAAG;CAC9B;CACA,OAAO;AACT"}
1
+ {"version":3,"file":"render-Bp2N2i6J.mjs","names":[],"sources":["../src/core/render.ts"],"sourcesContent":["import type { TerminalQueries } from \"../input/queries.ts\"\nimport type { StyleBuilder } from \"../style/builder.ts\"\nimport type { Theme } from \"../themes/types.ts\"\nimport type { RenderCtx } from \"./ctx.ts\"\n// oxlint-disable no-await-in-loop\nimport type { Node } from \"./node.ts\"\nimport type { Accessor, SuspenseBoundary } from \"./reactive.ts\"\n\nimport { createCtx } from \"./ctx.ts\"\nimport {\n createContext,\n createRoot,\n createSuspenseBoundary,\n provideContext,\n SuspenseContext,\n} from \"./reactive.ts\"\n\n/** Components-facing slice of the render environment — reactive\n * accessors a widget body reads via `useContext(RenderContext)`. Use\n * this when a widget needs ambient theme/style outside an `_render`\n * call (the place where `RenderCtx` is threaded in). Width is\n * deliberately omitted — that's a per-render allotted-size concept,\n * not an ambient one. */\nexport type RenderContextValue = {\n /** Active theme. Tracked — widgets that read it re-fire on swap. */\n theme: Accessor<Theme>\n /** Theme-bound chainable style builder. Derived memo over `theme`. */\n style: Accessor<StyleBuilder>\n /** Whether to render images (when supported) */\n images: Accessor<boolean>\n queries: TerminalQueries\n}\nexport const RenderContext = createContext<RenderContextValue>()\n\n/**\n * Render a Node, draining `createAsync` work in its subtree before\n * returning final rows. Two shapes:\n *\n * - `createRender(() => node, ctx?)` — factory form. Creates a fresh\n * `SuspenseBoundary` inside a new `createRoot` and runs the\n * factory in that scope so descendants find the boundary via\n * `useContext(SuspenseContext)`. For tests, benches, REPL.\n *\n * - `createRender(node, { ...ctx, boundary })` — pre-built Node\n * with a caller-provided boundary. Used by `Stream.render`: the\n * boundary was installed at `append` time, so we just render +\n * drain without a new root scope.\n *\n * `ctx` defaults to `createCtx()` in the factory form.\n *\n * ```ts\n * const rows = await createRender(() => markdown(\"**hi**\"))\n * ```\n */\nexport async function createRender(\n node: Node,\n ctx: RenderCtx & { boundary: SuspenseBoundary }\n): Promise<string[]>\nexport async function createRender(node: () => Node, ctx?: RenderCtx): Promise<string[]>\nexport async function createRender(\n node: Node | (() => Node),\n ctx: RenderCtx & { boundary?: SuspenseBoundary } = createCtx()\n): Promise<string[]> {\n if (ctx.boundary) return renderWithDrain(node as Node, ctx.boundary, ctx)\n const boundary = createSuspenseBoundary()\n const nodeFn = node as () => Node\n return createRoot(async () => {\n provideContext(SuspenseContext, boundary)\n return renderWithDrain(nodeFn(), boundary, ctx)\n })\n}\n\n/** Wait for any pending work first, then render. On warm caches the\n * initial `whenIdle` resolves on the same microtask tick — no real\n * wait — and we render exactly once with final values. On cold the\n * wait blocks until `createAsync` settles. The follow-up `while`\n * catches the in-render case: a `_render` that fires a fresh\n * `createAsync` (signal write subscribes a new effect) bumps the\n * boundary back above zero, requiring another pass. */\nasync function renderWithDrain(\n node: Node,\n boundary: SuspenseBoundary,\n ctx: RenderCtx\n): Promise<string[]> {\n if (boundary.active()) await boundary.whenIdle()\n let rows = await node.render(ctx)\n while (boundary.active()) {\n await boundary.whenIdle()\n rows = await node.render(ctx)\n }\n return rows\n}\n"],"mappings":";;;AAgCA,MAAa,gBAAgB,cAAkC;AA2B/D,eAAsB,aACpB,MACA,MAAmD,UAAU,GAC1C;CACnB,IAAI,IAAI,UAAU,OAAO,gBAAgB,MAAc,IAAI,UAAU,GAAG;CACxE,MAAM,WAAW,uBAAuB;CACxC,MAAM,SAAS;CACf,OAAO,WAAW,YAAY;EAC5B,eAAe,iBAAiB,QAAQ;EACxC,OAAO,gBAAgB,OAAO,GAAG,UAAU,GAAG;CAChD,CAAC;AACH;;;;;;;;AASA,eAAe,gBACb,MACA,UACA,KACmB;CACnB,IAAI,SAAS,OAAO,GAAG,MAAM,SAAS,SAAS;CAC/C,IAAI,OAAO,MAAM,KAAK,OAAO,GAAG;CAChC,OAAO,SAAS,OAAO,GAAG;EACxB,MAAM,SAAS,SAAS;EACxB,OAAO,MAAM,KAAK,OAAO,GAAG;CAC9B;CACA,OAAO;AACT"}