@zaly/tui 0.1.0 → 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 (247) hide show
  1. package/dist/{actions-DEIKF2ts.mjs → actions-AY6avfEV.mjs} +2 -3
  2. package/dist/{actions-DEIKF2ts.mjs.map → actions-AY6avfEV.mjs.map} +1 -1
  3. package/dist/{actions--ODlgCQ5.d.mts → actions-B0yyZ-Ww.d.mts} +4 -6
  4. package/dist/actions-B0yyZ-Ww.d.mts.map +1 -0
  5. package/dist/{ansi-CMv71xVr.mjs → ansi-CxgRPLA2.mjs} +3 -4
  6. package/dist/{ansi-CMv71xVr.mjs.map → ansi-CxgRPLA2.mjs.map} +1 -1
  7. package/dist/ansi.d.mts +1 -3
  8. package/dist/ansi.d.mts.map +1 -1
  9. package/dist/ansi.mjs +1 -1
  10. package/dist/{autocomplete-CD30kSe_.d.mts → autocomplete-wgceuhLr.d.mts} +5 -7
  11. package/dist/autocomplete-wgceuhLr.d.mts.map +1 -0
  12. package/dist/{box-C_N_7ChP.mjs → box-DbIjxh39.mjs} +8 -10
  13. package/dist/{box-C_N_7ChP.mjs.map → box-DbIjxh39.mjs.map} +1 -1
  14. package/dist/{builder-Chwtk0nQ.mjs → builder-BdYlK1Ew.mjs} +5 -6
  15. package/dist/{builder-Chwtk0nQ.mjs.map → builder-BdYlK1Ew.mjs.map} +1 -1
  16. package/dist/{callbacks-DLecWn7G.mjs → callbacks-UaBfDStQ.mjs} +8 -12
  17. package/dist/{callbacks-DLecWn7G.mjs.map → callbacks-UaBfDStQ.mjs.map} +1 -1
  18. package/dist/{client-D7qz4TZt.mjs → client-BWm6dNZF.mjs} +4 -5
  19. package/dist/{client-D7qz4TZt.mjs.map → client-BWm6dNZF.mjs.map} +1 -1
  20. package/dist/client-C69qWhMG.mjs +1 -0
  21. package/dist/{clipboard-CNPBTX7j.mjs → clipboard-UEoX9sup.mjs} +2 -3
  22. package/dist/{clipboard-CNPBTX7j.mjs.map → clipboard-UEoX9sup.mjs.map} +1 -1
  23. package/dist/clipboard.d.mts +0 -2
  24. package/dist/clipboard.d.mts.map +1 -1
  25. package/dist/clipboard.mjs +1 -1
  26. package/dist/{color-DBMQLv4Y.mjs → color-Cr1VoL49.mjs} +2 -3
  27. package/dist/{color-DBMQLv4Y.mjs.map → color-Cr1VoL49.mjs.map} +1 -1
  28. package/dist/ctx-CYEzzH-7.mjs +1 -0
  29. package/dist/{ctx-BaQ2hP5u.mjs → ctx-DBeFcZt6.mjs} +4 -5
  30. package/dist/{ctx-BaQ2hP5u.mjs.map → ctx-DBeFcZt6.mjs.map} +1 -1
  31. package/dist/{divider-BlNNN2OS.mjs → divider-BPmnQ0Eu.mjs} +3 -4
  32. package/dist/{divider-BlNNN2OS.mjs.map → divider-BPmnQ0Eu.mjs.map} +1 -1
  33. package/dist/{files-BvThQpOf.mjs → files-C3ZnFpvq.mjs} +3 -4
  34. package/dist/{files-BvThQpOf.mjs.map → files-C3ZnFpvq.mjs.map} +1 -1
  35. package/dist/{files-B_5HDBPp.d.mts → files-CdiDnwA_.d.mts} +3 -5
  36. package/dist/files-CdiDnwA_.d.mts.map +1 -0
  37. package/dist/{flex-Bguo-fUe.mjs → flex-CYp4etqn.mjs} +3 -4
  38. package/dist/{flex-Bguo-fUe.mjs.map → flex-CYp4etqn.mjs.map} +1 -1
  39. package/dist/{github-Cy2hfWJ7.mjs → github-CLveT9mq.mjs} +2 -3
  40. package/dist/{github-Cy2hfWJ7.mjs.map → github-CLveT9mq.mjs.map} +1 -1
  41. package/dist/{github-CyRwUQ3y.d.mts → github-DC0XemKa.d.mts} +3 -5
  42. package/dist/github-DC0XemKa.d.mts.map +1 -0
  43. package/dist/{image-BLls2F4t.d.mts → image-DdRDv7q6.d.mts} +2 -4
  44. package/dist/image-DdRDv7q6.d.mts.map +1 -0
  45. package/dist/{image-Cqtj3yRA.mjs → image-M--Bw4bs.mjs} +6 -7
  46. package/dist/{image-Cqtj3yRA.mjs.map → image-M--Bw4bs.mjs.map} +1 -1
  47. package/dist/image.d.mts +1 -3
  48. package/dist/image.d.mts.map +1 -1
  49. package/dist/image.mjs +1 -1
  50. package/dist/index.d.mts +3 -15
  51. package/dist/index.d.mts.map +1 -1
  52. package/dist/index.mjs +11 -14
  53. package/dist/index.mjs.map +1 -1
  54. package/dist/{input-NuD8TH8N.d.mts → input-C3kfYoEJ.d.mts} +3 -5
  55. package/dist/input-C3kfYoEJ.d.mts.map +1 -0
  56. package/dist/{input-ET2YEMcl.mjs → input-CtGmVrKa.mjs} +6 -7
  57. package/dist/{input-ET2YEMcl.mjs.map → input-CtGmVrKa.mjs.map} +1 -1
  58. package/dist/{inspect-Cxzs-W0g.mjs → inspect-Cli1beu8.mjs} +3 -4
  59. package/dist/{inspect-Cxzs-W0g.mjs.map → inspect-Cli1beu8.mjs.map} +1 -1
  60. package/dist/{inspect-B1uXxdKC.d.mts → inspect-hSl3U2BD.d.mts} +2 -6
  61. package/dist/inspect-hSl3U2BD.d.mts.map +1 -0
  62. package/dist/kitty-0sJ8axU_.mjs +1 -0
  63. package/dist/{kitty-JbCJC0iQ.mjs → kitty-BH_eK6lz.mjs} +2 -3
  64. package/dist/{kitty-JbCJC0iQ.mjs.map → kitty-BH_eK6lz.mjs.map} +1 -1
  65. package/dist/{log-B4djzy2m.mjs → log-D6gGicwQ.mjs} +6 -7
  66. package/dist/{log-B4djzy2m.mjs.map → log-D6gGicwQ.mjs.map} +1 -1
  67. package/dist/{logger-CvJCITzP.mjs → logger-C0WuIlAh.mjs} +5 -6
  68. package/dist/{logger-CvJCITzP.mjs.map → logger-C0WuIlAh.mjs.map} +1 -1
  69. package/dist/{markdown-D3ZtRn6C.mjs → markdown-DvDIPT5L.mjs} +11 -12
  70. package/dist/{markdown-D3ZtRn6C.mjs.map → markdown-DvDIPT5L.mjs.map} +1 -1
  71. package/dist/markdown.d.mts +2 -4
  72. package/dist/markdown.d.mts.map +1 -1
  73. package/dist/markdown.mjs +1 -1
  74. package/dist/math-Dk8hxbmz.mjs +1 -0
  75. package/dist/{math-Dd7a1irv.mjs → math-VPuwFCid.mjs} +1 -2
  76. package/dist/{math-Dd7a1irv.mjs.map → math-VPuwFCid.mjs.map} +1 -1
  77. package/dist/md.bun.d.mts +1 -3
  78. package/dist/md.bun.d.mts.map +1 -1
  79. package/dist/md.bun.mjs +2 -3
  80. package/dist/md.node.d.mts +1 -3
  81. package/dist/md.node.d.mts.map +1 -1
  82. package/dist/md.node.mjs +2 -3
  83. package/dist/{node-BZ7f6HzU.mjs → node-CXNobGaP.mjs} +3 -4
  84. package/dist/{node-BZ7f6HzU.mjs.map → node-CXNobGaP.mjs.map} +1 -1
  85. package/dist/{oklch-Bsh5swbC.mjs → oklch-Boh4YHEc.mjs} +3 -4
  86. package/dist/{oklch-Bsh5swbC.mjs.map → oklch-Boh4YHEc.mjs.map} +1 -1
  87. package/dist/{overlay-LvOjG7kn.mjs → overlay-zDNpwKu0.mjs} +3 -4
  88. package/dist/{overlay-LvOjG7kn.mjs.map → overlay-zDNpwKu0.mjs.map} +1 -1
  89. package/dist/{picker-f6xjgACX.mjs → picker-DV_oxKEv.mjs} +11 -16
  90. package/dist/{picker-f6xjgACX.mjs.map → picker-DV_oxKEv.mjs.map} +1 -1
  91. package/dist/{picker-B-OxKKnD.d.mts → picker-DsB6--GN.d.mts} +6 -8
  92. package/dist/picker-DsB6--GN.d.mts.map +1 -0
  93. package/dist/{queries-BUkBxkuM.mjs → queries-BIniKnLL.mjs} +3 -5
  94. package/dist/{queries-BUkBxkuM.mjs.map → queries-BIniKnLL.mjs.map} +1 -1
  95. package/dist/{queries-C75-wG1B.d.mts → queries-Dmd3IjSd.d.mts} +3 -51
  96. package/dist/queries-Dmd3IjSd.d.mts.map +1 -0
  97. package/dist/{reactive-f7NpAi69.mjs → reactive-DkP75TPk.mjs} +2 -3
  98. package/dist/{reactive-f7NpAi69.mjs.map → reactive-DkP75TPk.mjs.map} +1 -1
  99. package/dist/{registry-DUWpSPoo.mjs → registry-CQU0VwpM.mjs} +9 -14
  100. package/dist/{registry-DUWpSPoo.mjs.map → registry-CQU0VwpM.mjs.map} +1 -1
  101. package/dist/{render-B7LfNM5K.mjs → render-Bp2N2i6J.mjs} +4 -5
  102. package/dist/{render-B7LfNM5K.mjs.map → render-Bp2N2i6J.mjs.map} +1 -1
  103. package/dist/renderer-Dv5fIuIk.mjs +1 -0
  104. package/dist/{renderer-aAtkFgll.mjs → renderer-Ksfkfv5X.mjs} +3 -4
  105. package/dist/{renderer-aAtkFgll.mjs.map → renderer-Ksfkfv5X.mjs.map} +1 -1
  106. package/dist/{renderer-BLsd-wrG.mjs → renderer-OplFCBMq.mjs} +25 -38
  107. package/dist/{renderer-BLsd-wrG.mjs.map → renderer-OplFCBMq.mjs.map} +1 -1
  108. package/dist/{search-FvGnswRl.d.mts → search-DsHzamic.d.mts} +1 -9
  109. package/dist/search-DsHzamic.d.mts.map +1 -0
  110. package/dist/{select-BKE5LzdN.d.mts → select-BZCFXdjp.d.mts} +3 -5
  111. package/dist/select-BZCFXdjp.d.mts.map +1 -0
  112. package/dist/{select-m7NE6Rwa.mjs → select-CUmAFKJh.mjs} +5 -6
  113. package/dist/{select-m7NE6Rwa.mjs.map → select-CUmAFKJh.mjs.map} +1 -1
  114. package/dist/services/logger.d.mts +1 -1
  115. package/dist/services/logger.mjs +1 -1
  116. package/dist/services/notifier.d.mts +1 -3
  117. package/dist/services/notifier.d.mts.map +1 -1
  118. package/dist/services/notifier.mjs +3 -4
  119. package/dist/services/picker.d.mts +5 -7
  120. package/dist/services/picker.d.mts.map +1 -1
  121. package/dist/services/picker.mjs +8 -9
  122. package/dist/services/prompt.d.mts +4 -6
  123. package/dist/services/prompt.d.mts.map +1 -1
  124. package/dist/services/prompt.mjs +7 -8
  125. package/dist/shiki/server.mjs +6 -8
  126. package/dist/shiki/server.mjs.map +1 -1
  127. package/dist/{shiki-CJauRusM.mjs → shiki-BAf9PdIc.mjs} +4 -5
  128. package/dist/{shiki-CJauRusM.mjs.map → shiki-BAf9PdIc.mjs.map} +1 -1
  129. package/dist/{shiki-B4U0s8jT.mjs → shiki-DUUAIE6f.mjs} +4 -7
  130. package/dist/{shiki-B4U0s8jT.mjs.map → shiki-DUUAIE6f.mjs.map} +1 -1
  131. package/dist/{show-DR2x1YFc.mjs → show-D5XNXgZf.mjs} +4 -5
  132. package/dist/{show-DR2x1YFc.mjs.map → show-D5XNXgZf.mjs.map} +1 -1
  133. package/dist/{size-D8JogYLy.mjs → size-BHRJuRk9.mjs} +2 -3
  134. package/dist/{size-D8JogYLy.mjs.map → size-BHRJuRk9.mjs.map} +1 -1
  135. package/dist/{style-DslRHzI4.mjs → style-Cw_EuszU.mjs} +5 -6
  136. package/dist/{style-DslRHzI4.mjs.map → style-Cw_EuszU.mjs.map} +1 -1
  137. package/dist/style.d.mts +2 -4
  138. package/dist/style.d.mts.map +1 -1
  139. package/dist/style.mjs +3 -3
  140. package/dist/{text-BoJdKXLU.mjs → text-BEuhhxr7.mjs} +4 -5
  141. package/dist/text-BEuhhxr7.mjs.map +1 -0
  142. package/dist/{text-CmxbA8lk.d.mts → text-DdkJXgoC.d.mts} +3 -5
  143. package/dist/text-DdkJXgoC.d.mts.map +1 -0
  144. package/dist/{text-DPrhma4x.mjs → text-H_2kzwaz.mjs} +5 -6
  145. package/dist/{text-DPrhma4x.mjs.map → text-H_2kzwaz.mjs.map} +1 -1
  146. package/dist/text.d.mts +1 -1
  147. package/dist/text.mjs +1 -1
  148. package/dist/{theme-C8LkcoaK.mjs → theme-B8hb1lPU.mjs} +3 -4
  149. package/dist/{theme-C8LkcoaK.mjs.map → theme-B8hb1lPU.mjs.map} +1 -1
  150. package/dist/{theme-DVX8dvGG.mjs → theme-BeSaXGNY.mjs} +3 -5
  151. package/dist/{theme-DVX8dvGG.mjs.map → theme-BeSaXGNY.mjs.map} +1 -1
  152. package/dist/themes.d.mts +1 -7
  153. package/dist/themes.d.mts.map +1 -1
  154. package/dist/themes.mjs +1 -1
  155. package/dist/{tree-CTvSpF9b.d.mts → tree-Berzv8Rz.d.mts} +3 -5
  156. package/dist/tree-Berzv8Rz.d.mts.map +1 -0
  157. package/dist/{tree-Bo1afYhe.mjs → tree-D6NvMQx8.mjs} +5 -6
  158. package/dist/{tree-Bo1afYhe.mjs.map → tree-D6NvMQx8.mjs.map} +1 -1
  159. package/dist/{types-C9ceMsbJ.d.mts → types-ByMHEdCF.d.mts} +1 -7
  160. package/dist/types-ByMHEdCF.d.mts.map +1 -0
  161. package/dist/{types-D3jk1rtk.d.mts → types-CUVUJPz6.d.mts} +1 -3
  162. package/dist/types-CUVUJPz6.d.mts.map +1 -0
  163. package/dist/{utils-3M4D_AXZ.mjs → utils-DHXAegVW.mjs} +1 -2
  164. package/dist/{utils-3M4D_AXZ.mjs.map → utils-DHXAegVW.mjs.map} +1 -1
  165. package/dist/{widget-BkMwhY2p.mjs → widget-sFveyrZE.mjs} +3 -4
  166. package/dist/{widget-BkMwhY2p.mjs.map → widget-sFveyrZE.mjs.map} +1 -1
  167. package/dist/{widget-DlF32PRp.d.mts → widget-sPJaKVU2.d.mts} +2 -4
  168. package/dist/widget-sPJaKVU2.d.mts.map +1 -0
  169. package/dist/widgets/autocomplete.d.mts +1 -1
  170. package/dist/widgets/autocomplete.mjs +5 -6
  171. package/dist/widgets/box.d.mts +1 -1
  172. package/dist/widgets/box.mjs +1 -1
  173. package/dist/widgets/code.d.mts +3 -5
  174. package/dist/widgets/code.d.mts.map +1 -1
  175. package/dist/widgets/code.mjs +10 -11
  176. package/dist/widgets/completions/actions.d.mts +1 -1
  177. package/dist/widgets/completions/actions.mjs +1 -1
  178. package/dist/widgets/completions/files.d.mts +1 -1
  179. package/dist/widgets/completions/files.mjs +1 -1
  180. package/dist/widgets/completions/github.d.mts +1 -1
  181. package/dist/widgets/completions/github.mjs +1 -1
  182. package/dist/widgets/completions/index.d.mts +3 -3
  183. package/dist/widgets/completions/index.mjs +3 -3
  184. package/dist/widgets/diff.d.mts +2 -4
  185. package/dist/widgets/diff.d.mts.map +1 -1
  186. package/dist/widgets/diff.mjs +9 -10
  187. package/dist/widgets/diff.mjs.map +1 -1
  188. package/dist/widgets/divider.d.mts +2 -4
  189. package/dist/widgets/divider.d.mts.map +1 -1
  190. package/dist/widgets/divider.mjs +1 -1
  191. package/dist/widgets/image.d.mts +1 -1
  192. package/dist/widgets/image.mjs +5 -6
  193. package/dist/widgets/input.d.mts +1 -1
  194. package/dist/widgets/input.mjs +1 -1
  195. package/dist/widgets/log.d.mts +1 -1
  196. package/dist/widgets/log.mjs +1 -1
  197. package/dist/widgets/markdown.d.mts +5 -7
  198. package/dist/widgets/markdown.d.mts.map +1 -1
  199. package/dist/widgets/markdown.mjs +1 -1
  200. package/dist/widgets/overlay.d.mts +1 -1
  201. package/dist/widgets/overlay.mjs +1 -1
  202. package/dist/widgets/picker.d.mts +1 -1
  203. package/dist/widgets/picker.mjs +1 -1
  204. package/dist/widgets/progress.d.mts +2 -4
  205. package/dist/widgets/progress.d.mts.map +1 -1
  206. package/dist/widgets/progress.mjs +4 -5
  207. package/dist/widgets/select.d.mts +1 -1
  208. package/dist/widgets/select.mjs +1 -1
  209. package/dist/widgets/show.d.mts +1 -3
  210. package/dist/widgets/show.d.mts.map +1 -1
  211. package/dist/widgets/show.mjs +1 -1
  212. package/dist/widgets/spinner.d.mts +2 -4
  213. package/dist/widgets/spinner.d.mts.map +1 -1
  214. package/dist/widgets/spinner.mjs +3 -4
  215. package/dist/widgets/text.d.mts +1 -1
  216. package/dist/widgets/text.mjs +1 -1
  217. package/dist/widgets/tree.d.mts +1 -1
  218. package/dist/widgets/tree.mjs +1 -1
  219. package/dist/widgets/widget.d.mts +1 -1
  220. package/dist/widgets/widget.mjs +1 -1
  221. package/dist/{worker-T6SdPzUH.mjs → worker-CtEowucz.mjs} +2 -3
  222. package/dist/{worker-T6SdPzUH.mjs.map → worker-CtEowucz.mjs.map} +1 -1
  223. package/dist/worker-Mqi380Et.mjs +1 -0
  224. package/package.json +3 -3
  225. package/dist/actions--ODlgCQ5.d.mts.map +0 -1
  226. package/dist/autocomplete-CD30kSe_.d.mts.map +0 -1
  227. package/dist/client-CNGt-dOt.mjs +0 -1
  228. package/dist/ctx-CndlTp1T.mjs +0 -1
  229. package/dist/files-B_5HDBPp.d.mts.map +0 -1
  230. package/dist/github-CyRwUQ3y.d.mts.map +0 -1
  231. package/dist/image-BLls2F4t.d.mts.map +0 -1
  232. package/dist/input-NuD8TH8N.d.mts.map +0 -1
  233. package/dist/inspect-B1uXxdKC.d.mts.map +0 -1
  234. package/dist/kitty-DKQYsQfH.mjs +0 -1
  235. package/dist/math-CU0wmC9N.mjs +0 -1
  236. package/dist/picker-B-OxKKnD.d.mts.map +0 -1
  237. package/dist/queries-C75-wG1B.d.mts.map +0 -1
  238. package/dist/renderer-YHbR7JZ4.mjs +0 -1
  239. package/dist/search-FvGnswRl.d.mts.map +0 -1
  240. package/dist/select-BKE5LzdN.d.mts.map +0 -1
  241. package/dist/text-BoJdKXLU.mjs.map +0 -1
  242. package/dist/text-CmxbA8lk.d.mts.map +0 -1
  243. package/dist/tree-CTvSpF9b.d.mts.map +0 -1
  244. package/dist/types-C9ceMsbJ.d.mts.map +0 -1
  245. package/dist/types-D3jk1rtk.d.mts.map +0 -1
  246. package/dist/widget-DlF32PRp.d.mts.map +0 -1
  247. package/dist/worker-C01jK2Ip.mjs +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"flex-Bguo-fUe.mjs","names":[],"sources":["../src/layout/flex.ts"],"sourcesContent":["import type { FlexState } from \"../core/state.ts\"\n\nimport { sliceAnsi, stringWidth } from \"@zaly/shared/ansi\"\nimport { clamp, resolveSize } from \"./size.ts\"\n\n/**\n * Items participating in a row-direction allocation. Extends the\n * `Flexible` mixin with the node's intrinsic content sizes (from\n * `Node.layout()` or fallback measurement). Box constructs these\n * before calling `allocateRow`.\n *\n * @internal\n */\nexport interface RowItem extends FlexState {\n /** Measured natural (max-content) width — used as the flex-basis\n * when no fixed `width` is set. Falls back to 0 when omitted. */\n natural?: number\n /** Intrinsic min-content width — the smallest the node can render\n * without breaking content. Acts as a shrink floor below which the\n * allocator won't go (combined with `Flexible.minWidth`). */\n intrinsicMin?: number\n}\n\nexport interface AllocateOpts {\n contentWidth: number\n gap: number\n}\n\n/**\n * Allocate widths to row-direction children with CSS-style flex\n * semantics. Each item starts at its **basis**:\n *\n * - `width: <number | \"N%\">` → resolved fixed width.\n * - `width: \"fill\"` → 0 (claim slack, ignore intrinsic).\n * - any other non-fixed spec → `natural` (content size, 0 when not\n * provided).\n *\n * Three branches:\n *\n * - `slack > 0`: distribute by `flexGrow`. Items without grow weight\n * stay at basis; leftover slack is *not* smeared onto siblings.\n * - `slack < 0` (deficit): distribute the shortfall by\n * `basis * flexShrink` (CSS shrink default = 1). Each item is\n * clamped at its `minWidth` floor so content doesn't break.\n * - `slack == 0`: items take their basis as-is.\n *\n * `min`/`max` (combined with `intrinsicMin`) clamp per-item; rounding\n * remainder lands on the last grower / shrinker.\n *\n * @internal\n */\nexport function allocateRow(items: readonly RowItem[], opts: AllocateOpts): number[] {\n const { contentWidth } = opts\n const gapTotal = opts.gap * Math.max(0, items.length - 1)\n const available = contentWidth - gapTotal\n\n const bases: number[] = Array.from({ length: items.length })\n const grows: number[] = Array.from({ length: items.length })\n const shrinks: number[] = Array.from({ length: items.length })\n // Effective minimum per item — the larger of the user-set `minWidth`\n // and the node's intrinsic `min-content`. Shrink can't go below this.\n const mins: number[] = Array.from({ length: items.length })\n let baseSum = 0\n let growSum = 0\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n if (isFixedWidth(item.width)) {\n bases[i] = resolveSize(item.width, contentWidth) ?? 0\n grows[i] = 0\n shrinks[i] = 0 // Fixed-width items never shrink — author asked for an exact size.\n } else if (item.width === \"fill\") {\n // `fill` claims slack and ignores intrinsic basis (CSS `flex: 1 1 0`).\n bases[i] = 0\n grows[i] = item.flexGrow ?? 1\n shrinks[i] = item.flexShrink ?? 1\n } else {\n bases[i] = item.natural ?? 0\n grows[i] = item.flexGrow ?? 0\n shrinks[i] = item.flexShrink ?? 1\n }\n const intrinsicMin = item.intrinsicMin ?? 0\n const userMin = resolveSize(item.minWidth, contentWidth) ?? 0\n mins[i] = Math.max(intrinsicMin, userMin)\n baseSum += bases[i]\n growSum += grows[i]\n }\n\n const slack = available - baseSum\n const widths: number[] = Array.from({ length: items.length })\n let allocated = 0\n let lastGrowIndex = -1\n let lastShrinkIndex = -1\n\n if (slack >= 0) {\n // Grow phase — distribute slack among items that asked for it.\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n let w = bases[i]\n if (growSum > 0 && grows[i] > 0) {\n w += Math.floor((slack * grows[i]) / growSum)\n lastGrowIndex = i\n }\n w = clamp(w, { available: contentWidth, max: item.maxWidth, min: mins[i] })\n widths[i] = w\n allocated += w\n }\n // Tail grower absorbs rounding remainder and any over/underflow\n // from min/max clamps. We aim at `baseSum + slack` (i.e. exactly\n // `available`) only when growers exist; otherwise leftover is real\n // slack the parent will pad as end-of-row space.\n if (lastGrowIndex !== -1) {\n const target = baseSum + slack\n if (allocated !== target) {\n widths[lastGrowIndex] = Math.max(0, widths[lastGrowIndex] + (target - allocated))\n }\n }\n } else {\n // Shrink phase — distribute the deficit weighted by `basis * shrink`.\n // Items at their `mins[i]` floor stop shrinking; the remaining\n // deficit re-routes to the others. Iterate until stable or no\n // shrinkable items remain.\n for (let i = 0; i < items.length; i++) widths[i] = bases[i]\n let deficit = -slack // positive\n const frozen: boolean[] = Array.from({ length: items.length }, () => false)\n // Cap loop at items.length+1 — each pass freezes at least one item\n // or fully resolves the deficit. Bounded, no risk of looping.\n for (let pass = 0; pass <= items.length && deficit > 0; pass++) {\n let weightSum = 0\n for (let i = 0; i < items.length; i++) {\n if (!frozen[i]) weightSum += widths[i] * shrinks[i]\n }\n if (weightSum === 0) break // nothing left can shrink\n let froze = false\n for (let i = 0; i < items.length; i++) {\n if (frozen[i]) continue\n const share = Math.floor((deficit * widths[i] * shrinks[i]) / weightSum)\n const next = widths[i] - share\n if (next <= mins[i]) {\n deficit -= widths[i] - mins[i]\n widths[i] = mins[i]\n frozen[i] = true\n froze = true\n } else {\n widths[i] = next\n lastShrinkIndex = i\n }\n }\n if (!froze) {\n // Apply remaining deficit proportionally one more time without\n // freezing — the round above didn't hit any floor.\n deficit = 0\n }\n }\n for (let i = 0; i < items.length; i++) {\n widths[i] = clamp(widths[i], {\n available: contentWidth,\n max: items[i].maxWidth,\n min: mins[i],\n })\n allocated += widths[i]\n }\n // Soak any rounding-shaped over/underflow into the last shrinker so\n // the row sums exactly to `available` (or to the minSum floor when\n // mins force overflow).\n if (lastShrinkIndex !== -1) {\n const target = Math.max(\n available,\n mins.reduce((a, b) => a + b, 0)\n )\n if (allocated !== target) {\n const adj = target - allocated\n widths[lastShrinkIndex] = Math.max(mins[lastShrinkIndex], widths[lastShrinkIndex] + adj)\n }\n }\n }\n\n return widths\n}\n\n/**\n * Whether a `Flexible.width` spec is a fixed numeric size (number or\n * `Pct`). `\"fill\"`/`\"fit\"`/undefined are non-fixed and resolve from\n * surrounding context (slack / measurement).\n *\n * @internal\n */\nexport function isFixedWidth(w: FlexState[\"width\"]): boolean {\n return typeof w === \"number\" || (typeof w === \"string\" && w.endsWith(\"%\"))\n}\n\nexport interface ZipOpts {\n widths: readonly number[]\n gap: number\n}\n\n/**\n * Zip pre-rendered child rows horizontally. Shorter children are padded with\n * blank rows of their allocated width. Rows of each child must already be\n * padded to the corresponding width in `widths`.\n *\n * @internal\n */\nexport function zipRow(children: readonly (readonly string[])[], opts: ZipOpts): string[] {\n if (children.length === 0) return []\n const gapStr = \" \".repeat(opts.gap)\n const height = children.reduce((h, rows) => Math.max(h, rows.length), 0)\n const out: string[] = []\n for (let r = 0; r < height; r++) {\n let line = \"\"\n for (let c = 0; c < children.length; c++) {\n if (c > 0) line += gapStr\n const rows = children[c]\n line += r < rows.length ? rows[r] : \" \".repeat(opts.widths[c])\n }\n out.push(line)\n }\n return out\n}\n\nexport interface StackOpts {\n gap: number\n width: number\n}\n\n/**\n * Stack pre-rendered child rows vertically. `gap` blank rows of `width`\n * spaces separate each sibling pair that *contributes rows*. Children\n * that emit no rows (e.g. `visible: false`, falsy `show()` branch) are\n * skipped along with the gap that would have surrounded them — no\n * stray blank bands. Caller must ensure each child's rows are already\n * padded to `width`.\n *\n * @internal\n */\nexport function stackColumn(children: readonly (readonly string[])[], opts: StackOpts): string[] {\n const out: string[] = []\n const blank = \" \".repeat(opts.width)\n let any = false\n for (const child of children) {\n if (child.length === 0) continue\n if (any) for (let g = 0; g < opts.gap; g++) out.push(blank)\n out.push(...child)\n any = true\n }\n return out\n}\n\n/**\n * Pad a row to `width` cells without injecting a `RESET`. Used by the\n * row/column zip-and-pad steps — the parent `Box`'s outer\n * `reapplyStyle` chain handles re-emitting any ambient SGR after inner\n * `[0m`s, so the pad cells stay inside the active style. Over-wide\n * rows are clipped via `sliceAnsi`, preserving SGR state.\n *\n * Distinct from `padOrClip` in `style/ansi.ts`, which is for\n * standalone (non-Box-wrapped) paths and *does* inject a `RESET`\n * before the pad.\n *\n * @internal\n */\nexport function padRow(row: string, width: number): string {\n const w = stringWidth(row)\n if (w === width) return row\n if (w < width) return row + \" \".repeat(width - w)\n return sliceAnsi(row, 0, width)\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"flex-CYp4etqn.mjs","names":[],"sources":["../src/layout/flex.ts"],"sourcesContent":["import type { FlexState } from \"../core/state.ts\"\n\nimport { sliceAnsi, stringWidth } from \"@zaly/shared/ansi\"\nimport { clamp, resolveSize } from \"./size.ts\"\n\n/**\n * Items participating in a row-direction allocation. Extends the\n * `Flexible` mixin with the node's intrinsic content sizes (from\n * `Node.layout()` or fallback measurement). Box constructs these\n * before calling `allocateRow`.\n *\n * @internal\n */\nexport interface RowItem extends FlexState {\n /** Measured natural (max-content) width — used as the flex-basis\n * when no fixed `width` is set. Falls back to 0 when omitted. */\n natural?: number\n /** Intrinsic min-content width — the smallest the node can render\n * without breaking content. Acts as a shrink floor below which the\n * allocator won't go (combined with `Flexible.minWidth`). */\n intrinsicMin?: number\n}\n\nexport interface AllocateOpts {\n contentWidth: number\n gap: number\n}\n\n/**\n * Allocate widths to row-direction children with CSS-style flex\n * semantics. Each item starts at its **basis**:\n *\n * - `width: <number | \"N%\">` → resolved fixed width.\n * - `width: \"fill\"` → 0 (claim slack, ignore intrinsic).\n * - any other non-fixed spec → `natural` (content size, 0 when not\n * provided).\n *\n * Three branches:\n *\n * - `slack > 0`: distribute by `flexGrow`. Items without grow weight\n * stay at basis; leftover slack is *not* smeared onto siblings.\n * - `slack < 0` (deficit): distribute the shortfall by\n * `basis * flexShrink` (CSS shrink default = 1). Each item is\n * clamped at its `minWidth` floor so content doesn't break.\n * - `slack == 0`: items take their basis as-is.\n *\n * `min`/`max` (combined with `intrinsicMin`) clamp per-item; rounding\n * remainder lands on the last grower / shrinker.\n *\n * @internal\n */\nexport function allocateRow(items: readonly RowItem[], opts: AllocateOpts): number[] {\n const { contentWidth } = opts\n const gapTotal = opts.gap * Math.max(0, items.length - 1)\n const available = contentWidth - gapTotal\n\n const bases: number[] = Array.from({ length: items.length })\n const grows: number[] = Array.from({ length: items.length })\n const shrinks: number[] = Array.from({ length: items.length })\n // Effective minimum per item — the larger of the user-set `minWidth`\n // and the node's intrinsic `min-content`. Shrink can't go below this.\n const mins: number[] = Array.from({ length: items.length })\n let baseSum = 0\n let growSum = 0\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n if (isFixedWidth(item.width)) {\n bases[i] = resolveSize(item.width, contentWidth) ?? 0\n grows[i] = 0\n shrinks[i] = 0 // Fixed-width items never shrink — author asked for an exact size.\n } else if (item.width === \"fill\") {\n // `fill` claims slack and ignores intrinsic basis (CSS `flex: 1 1 0`).\n bases[i] = 0\n grows[i] = item.flexGrow ?? 1\n shrinks[i] = item.flexShrink ?? 1\n } else {\n bases[i] = item.natural ?? 0\n grows[i] = item.flexGrow ?? 0\n shrinks[i] = item.flexShrink ?? 1\n }\n const intrinsicMin = item.intrinsicMin ?? 0\n const userMin = resolveSize(item.minWidth, contentWidth) ?? 0\n mins[i] = Math.max(intrinsicMin, userMin)\n baseSum += bases[i]\n growSum += grows[i]\n }\n\n const slack = available - baseSum\n const widths: number[] = Array.from({ length: items.length })\n let allocated = 0\n let lastGrowIndex = -1\n let lastShrinkIndex = -1\n\n if (slack >= 0) {\n // Grow phase — distribute slack among items that asked for it.\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n let w = bases[i]\n if (growSum > 0 && grows[i] > 0) {\n w += Math.floor((slack * grows[i]) / growSum)\n lastGrowIndex = i\n }\n w = clamp(w, { available: contentWidth, max: item.maxWidth, min: mins[i] })\n widths[i] = w\n allocated += w\n }\n // Tail grower absorbs rounding remainder and any over/underflow\n // from min/max clamps. We aim at `baseSum + slack` (i.e. exactly\n // `available`) only when growers exist; otherwise leftover is real\n // slack the parent will pad as end-of-row space.\n if (lastGrowIndex !== -1) {\n const target = baseSum + slack\n if (allocated !== target) {\n widths[lastGrowIndex] = Math.max(0, widths[lastGrowIndex] + (target - allocated))\n }\n }\n } else {\n // Shrink phase — distribute the deficit weighted by `basis * shrink`.\n // Items at their `mins[i]` floor stop shrinking; the remaining\n // deficit re-routes to the others. Iterate until stable or no\n // shrinkable items remain.\n for (let i = 0; i < items.length; i++) widths[i] = bases[i]\n let deficit = -slack // positive\n const frozen: boolean[] = Array.from({ length: items.length }, () => false)\n // Cap loop at items.length+1 — each pass freezes at least one item\n // or fully resolves the deficit. Bounded, no risk of looping.\n for (let pass = 0; pass <= items.length && deficit > 0; pass++) {\n let weightSum = 0\n for (let i = 0; i < items.length; i++) {\n if (!frozen[i]) weightSum += widths[i] * shrinks[i]\n }\n if (weightSum === 0) break // nothing left can shrink\n let froze = false\n for (let i = 0; i < items.length; i++) {\n if (frozen[i]) continue\n const share = Math.floor((deficit * widths[i] * shrinks[i]) / weightSum)\n const next = widths[i] - share\n if (next <= mins[i]) {\n deficit -= widths[i] - mins[i]\n widths[i] = mins[i]\n frozen[i] = true\n froze = true\n } else {\n widths[i] = next\n lastShrinkIndex = i\n }\n }\n if (!froze) {\n // Apply remaining deficit proportionally one more time without\n // freezing — the round above didn't hit any floor.\n deficit = 0\n }\n }\n for (let i = 0; i < items.length; i++) {\n widths[i] = clamp(widths[i], {\n available: contentWidth,\n max: items[i].maxWidth,\n min: mins[i],\n })\n allocated += widths[i]\n }\n // Soak any rounding-shaped over/underflow into the last shrinker so\n // the row sums exactly to `available` (or to the minSum floor when\n // mins force overflow).\n if (lastShrinkIndex !== -1) {\n const target = Math.max(\n available,\n mins.reduce((a, b) => a + b, 0)\n )\n if (allocated !== target) {\n const adj = target - allocated\n widths[lastShrinkIndex] = Math.max(mins[lastShrinkIndex], widths[lastShrinkIndex] + adj)\n }\n }\n }\n\n return widths\n}\n\n/**\n * Whether a `Flexible.width` spec is a fixed numeric size (number or\n * `Pct`). `\"fill\"`/`\"fit\"`/undefined are non-fixed and resolve from\n * surrounding context (slack / measurement).\n *\n * @internal\n */\nexport function isFixedWidth(w: FlexState[\"width\"]): boolean {\n return typeof w === \"number\" || (typeof w === \"string\" && w.endsWith(\"%\"))\n}\n\nexport interface ZipOpts {\n widths: readonly number[]\n gap: number\n}\n\n/**\n * Zip pre-rendered child rows horizontally. Shorter children are padded with\n * blank rows of their allocated width. Rows of each child must already be\n * padded to the corresponding width in `widths`.\n *\n * @internal\n */\nexport function zipRow(children: readonly (readonly string[])[], opts: ZipOpts): string[] {\n if (children.length === 0) return []\n const gapStr = \" \".repeat(opts.gap)\n const height = children.reduce((h, rows) => Math.max(h, rows.length), 0)\n const out: string[] = []\n for (let r = 0; r < height; r++) {\n let line = \"\"\n for (let c = 0; c < children.length; c++) {\n if (c > 0) line += gapStr\n const rows = children[c]\n line += r < rows.length ? rows[r] : \" \".repeat(opts.widths[c])\n }\n out.push(line)\n }\n return out\n}\n\nexport interface StackOpts {\n gap: number\n width: number\n}\n\n/**\n * Stack pre-rendered child rows vertically. `gap` blank rows of `width`\n * spaces separate each sibling pair that *contributes rows*. Children\n * that emit no rows (e.g. `visible: false`, falsy `show()` branch) are\n * skipped along with the gap that would have surrounded them — no\n * stray blank bands. Caller must ensure each child's rows are already\n * padded to `width`.\n *\n * @internal\n */\nexport function stackColumn(children: readonly (readonly string[])[], opts: StackOpts): string[] {\n const out: string[] = []\n const blank = \" \".repeat(opts.width)\n let any = false\n for (const child of children) {\n if (child.length === 0) continue\n if (any) for (let g = 0; g < opts.gap; g++) out.push(blank)\n out.push(...child)\n any = true\n }\n return out\n}\n\n/**\n * Pad a row to `width` cells without injecting a `RESET`. Used by the\n * row/column zip-and-pad steps — the parent `Box`'s outer\n * `reapplyStyle` chain handles re-emitting any ambient SGR after inner\n * `[0m`s, so the pad cells stay inside the active style. Over-wide\n * rows are clipped via `sliceAnsi`, preserving SGR state.\n *\n * Distinct from `padOrClip` in `style/ansi.ts`, which is for\n * standalone (non-Box-wrapped) paths and *does* inject a `RESET`\n * before the pad.\n *\n * @internal\n */\nexport function padRow(row: string, width: number): string {\n const w = stringWidth(row)\n if (w === width) return row\n if (w < width) return row + \" \".repeat(width - w)\n return sliceAnsi(row, 0, width)\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { stringWidth } from "@zaly/shared/ansi";
2
2
  import { spawn } from "node:child_process";
3
- //#region src/widgets/completions/github.ts
3
+ // src/widgets/completions/github.ts
4
4
  /**
5
5
  * Completion source for GitHub issues and pull requests from the repo
6
6
  * at `cwd`. Shells out to the `gh` CLI on first use, caches the result,
@@ -131,7 +131,6 @@ function runGh(cwd, args) {
131
131
  }
132
132
  });
133
133
  }
134
- //#endregion
135
134
  export { githubSource as t };
136
135
 
137
- //# sourceMappingURL=github-Cy2hfWJ7.mjs.map
136
+ //# sourceMappingURL=github-CLveT9mq.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"github-Cy2hfWJ7.mjs","names":[],"sources":["../src/widgets/completions/github.ts"],"sourcesContent":["import type { ScoredItem } from \"../../search/matcher.ts\"\nimport type { CompletionSource } from \"../autocomplete.ts\"\nimport type { PickerItem } from \"../picker.ts\"\nimport type { OptionRender } from \"../select.ts\"\n\nimport { stringWidth } from \"@zaly/shared/ansi\"\nimport { spawn } from \"node:child_process\"\n\n/** A GitHub issue or pull request returned by `githubSource`. Shape\n * mirrors the `gh` CLI's `--json number,title,state,author,url`\n * output, with `type` added to distinguish issues from PRs. */\nexport type GithubItem = PickerItem & {\n number: number\n title: string\n /** `\"open\"` / `\"closed\"` for issues; `\"open\"` / `\"closed\"` / `\"merged\"`\n * for PRs. Kept as a string so we don't trip if gh evolves. */\n state: string\n type: \"issue\" | \"pr\"\n url: string\n author?: { login?: string }\n}\n\nexport type GithubState = \"open\" | \"closed\" | \"all\"\n\nexport type GithubFetcher = (cwd: string, state: GithubState) => Promise<GithubItem[]>\n\nexport interface GithubSourceOptions {\n /** Working directory used to locate the repo. `gh` resolves the repo\n * from the git remote of this dir. Default: `process.cwd()`. */\n cwd?: string\n /** Trigger regex. Default: `/(?<=^|\\s)#/` — `#` preceded by start-of-\n * string or whitespace (same lookbehind trick as `filesSource`). */\n trigger?: RegExp\n /** Prepended to the accepted value so the trigger character stays in\n * the input. Default: `\"#\"`. */\n prefix?: string\n /** Which issues / PRs to include. Default: `\"open\"`. */\n state?: GithubState\n /** Per-kind cap passed to `gh`. Default: `50`. */\n limit?: number\n /** Override the fetch implementation. Mainly useful for tests — the\n * default shells out to `gh`. The fetcher is called at most once per\n * `githubSource` instance; results are cached thereafter. */\n fetcher?: GithubFetcher\n}\n\n/**\n * Completion source for GitHub issues and pull requests from the repo\n * at `cwd`. Shells out to the `gh` CLI on first use, caches the result,\n * and fuzzy-filters locally on subsequent calls so typing stays snappy.\n *\n * Accepts insert `#123 ` into the input — ready for a markdown-style\n * reference in a chat message or commit subject.\n *\n * ```ts\n * autocomplete({\n * input: \"chat-input\",\n * sources: {\n * gh: githubSource(),\n * },\n * })\n * ```\n *\n * Silently returns no items when `gh` isn't installed, the user isn't\n * authenticated, or the directory isn't a GitHub repo — so it's safe\n * to wire up unconditionally.\n */\nexport function githubSource(opts: GithubSourceOptions = {}): CompletionSource<GithubItem> {\n const cwd = opts.cwd ?? process.cwd()\n const trigger = opts.trigger ?? /(?<=^|\\s)#/\n const prefix = opts.prefix ?? \"#\"\n const state: GithubState = opts.state ?? \"open\"\n const limit = opts.limit ?? 50\n const fetcher = opts.fetcher ?? defaultFetcher(limit)\n\n // Lazy, single-fetch cache. The Promise is reused by concurrent\n // callers so rapid keystrokes while the first fetch is in flight\n // don't spawn duplicate `gh` processes.\n let cache: Promise<GithubItem[]> | undefined\n\n return {\n accept: (item) => `${prefix}${item.number} `,\n async complete(_query: string, match): Promise<ScoredItem<GithubItem>[]> {\n cache ??= fetcher(cwd, state).catch(() => [])\n const items = await cache\n const out: ScoredItem<GithubItem>[] = []\n for (const item of items) {\n // Match on \"#<num> <title>\" so users can type either digits or\n // words and both hit. Keeps ranking implicit — source order\n // (freshest first from gh) wins when scores tie.\n const target = `#${item.number} ${item.title}`\n const score = match(target)\n if (!score) continue\n out.push({ ...item, score })\n }\n return out\n },\n render: defaultRender,\n triggers: [trigger],\n }\n}\n\nconst defaultRender: OptionRender<GithubItem> = (item, ctx) => {\n const { style } = ctx\n const num = `#${item.number}`\n const stateSlot = stateStyleSlot(item.state)\n const typeLabel = item.type === \"pr\" ? \"pr\" : \"issue\"\n const author = item.author?.login ? `@${item.author.login}` : \"\"\n\n // Layout: [#num] [state/type] title ............. @author\n // All chrome is left-aligned; author is the right-column hint.\n const lead = `${style.add(\"optionName\")(num)} ${style.add(stateSlot)(`${item.state}·${typeLabel}`)} ${item.title}`\n\n if (author === \"\") return lead\n const gap = 2\n const leadW = stringWidth(lead)\n const hintW = stringWidth(author)\n const padded = ctx.width - leadW - hintW - gap\n if (padded < 1) return lead\n return lead + \" \".repeat(padded + gap) + style.add(\"optionDesc\")(author)\n}\n\nfunction stateStyleSlot(state: string) {\n if (state === \"open\") return \"success\"\n if (state === \"merged\") return \"accent\"\n // \"closed\" and anything unknown → dim.\n return \"muted\"\n}\n\n/** Default fetcher — shells out to `gh issue list` + `gh pr list` in\n * parallel. Either failing is swallowed so a repo with only issues\n * (or only PRs) still works. */\nfunction defaultFetcher(limit: number): GithubFetcher {\n const fields = \"number,title,state,author,url\"\n return async (cwd, state) => {\n const [issues, prs] = await Promise.all([\n runGh(cwd, [\"issue\", \"list\", \"--state\", state, \"--json\", fields, \"--limit\", String(limit)]),\n runGh(cwd, [\"pr\", \"list\", \"--state\", state, \"--json\", fields, \"--limit\", String(limit)]),\n ])\n return [\n ...parse(issues).map((x) => Object.assign(x, { type: \"issue\" as const })),\n ...parse(prs).map((x) => Object.assign(x, { type: \"pr\" as const })),\n ].map((item) => Object.assign(item, { text: `#${item.number} ${item.title}` }))\n }\n}\n\nfunction parse(out: string): Omit<GithubItem, \"type\">[] {\n try {\n return JSON.parse(out) as Omit<GithubItem, \"type\">[]\n } catch {\n return []\n }\n}\n\nfunction runGh(cwd: string, args: string[]): Promise<string> {\n return new Promise((resolve) => {\n try {\n const child = spawn(\"gh\", args, { cwd, stdio: [\"ignore\", \"pipe\", \"ignore\"] })\n let stdout = \"\"\n child.stdout.on(\"data\", (chunk: Buffer) => {\n stdout += chunk.toString(\"utf8\")\n })\n child.on(\"close\", (code) => {\n resolve(code === 0 ? stdout : \"\")\n })\n child.on(\"error\", () => {\n resolve(\"\")\n })\n } catch {\n resolve(\"\")\n }\n })\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"github-CLveT9mq.mjs","names":[],"sources":["../src/widgets/completions/github.ts"],"sourcesContent":["import type { ScoredItem } from \"../../search/matcher.ts\"\nimport type { CompletionSource } from \"../autocomplete.ts\"\nimport type { PickerItem } from \"../picker.ts\"\nimport type { OptionRender } from \"../select.ts\"\n\nimport { stringWidth } from \"@zaly/shared/ansi\"\nimport { spawn } from \"node:child_process\"\n\n/** A GitHub issue or pull request returned by `githubSource`. Shape\n * mirrors the `gh` CLI's `--json number,title,state,author,url`\n * output, with `type` added to distinguish issues from PRs. */\nexport type GithubItem = PickerItem & {\n number: number\n title: string\n /** `\"open\"` / `\"closed\"` for issues; `\"open\"` / `\"closed\"` / `\"merged\"`\n * for PRs. Kept as a string so we don't trip if gh evolves. */\n state: string\n type: \"issue\" | \"pr\"\n url: string\n author?: { login?: string }\n}\n\nexport type GithubState = \"open\" | \"closed\" | \"all\"\n\nexport type GithubFetcher = (cwd: string, state: GithubState) => Promise<GithubItem[]>\n\nexport interface GithubSourceOptions {\n /** Working directory used to locate the repo. `gh` resolves the repo\n * from the git remote of this dir. Default: `process.cwd()`. */\n cwd?: string\n /** Trigger regex. Default: `/(?<=^|\\s)#/` — `#` preceded by start-of-\n * string or whitespace (same lookbehind trick as `filesSource`). */\n trigger?: RegExp\n /** Prepended to the accepted value so the trigger character stays in\n * the input. Default: `\"#\"`. */\n prefix?: string\n /** Which issues / PRs to include. Default: `\"open\"`. */\n state?: GithubState\n /** Per-kind cap passed to `gh`. Default: `50`. */\n limit?: number\n /** Override the fetch implementation. Mainly useful for tests — the\n * default shells out to `gh`. The fetcher is called at most once per\n * `githubSource` instance; results are cached thereafter. */\n fetcher?: GithubFetcher\n}\n\n/**\n * Completion source for GitHub issues and pull requests from the repo\n * at `cwd`. Shells out to the `gh` CLI on first use, caches the result,\n * and fuzzy-filters locally on subsequent calls so typing stays snappy.\n *\n * Accepts insert `#123 ` into the input — ready for a markdown-style\n * reference in a chat message or commit subject.\n *\n * ```ts\n * autocomplete({\n * input: \"chat-input\",\n * sources: {\n * gh: githubSource(),\n * },\n * })\n * ```\n *\n * Silently returns no items when `gh` isn't installed, the user isn't\n * authenticated, or the directory isn't a GitHub repo — so it's safe\n * to wire up unconditionally.\n */\nexport function githubSource(opts: GithubSourceOptions = {}): CompletionSource<GithubItem> {\n const cwd = opts.cwd ?? process.cwd()\n const trigger = opts.trigger ?? /(?<=^|\\s)#/\n const prefix = opts.prefix ?? \"#\"\n const state: GithubState = opts.state ?? \"open\"\n const limit = opts.limit ?? 50\n const fetcher = opts.fetcher ?? defaultFetcher(limit)\n\n // Lazy, single-fetch cache. The Promise is reused by concurrent\n // callers so rapid keystrokes while the first fetch is in flight\n // don't spawn duplicate `gh` processes.\n let cache: Promise<GithubItem[]> | undefined\n\n return {\n accept: (item) => `${prefix}${item.number} `,\n async complete(_query: string, match): Promise<ScoredItem<GithubItem>[]> {\n cache ??= fetcher(cwd, state).catch(() => [])\n const items = await cache\n const out: ScoredItem<GithubItem>[] = []\n for (const item of items) {\n // Match on \"#<num> <title>\" so users can type either digits or\n // words and both hit. Keeps ranking implicit — source order\n // (freshest first from gh) wins when scores tie.\n const target = `#${item.number} ${item.title}`\n const score = match(target)\n if (!score) continue\n out.push({ ...item, score })\n }\n return out\n },\n render: defaultRender,\n triggers: [trigger],\n }\n}\n\nconst defaultRender: OptionRender<GithubItem> = (item, ctx) => {\n const { style } = ctx\n const num = `#${item.number}`\n const stateSlot = stateStyleSlot(item.state)\n const typeLabel = item.type === \"pr\" ? \"pr\" : \"issue\"\n const author = item.author?.login ? `@${item.author.login}` : \"\"\n\n // Layout: [#num] [state/type] title ............. @author\n // All chrome is left-aligned; author is the right-column hint.\n const lead = `${style.add(\"optionName\")(num)} ${style.add(stateSlot)(`${item.state}·${typeLabel}`)} ${item.title}`\n\n if (author === \"\") return lead\n const gap = 2\n const leadW = stringWidth(lead)\n const hintW = stringWidth(author)\n const padded = ctx.width - leadW - hintW - gap\n if (padded < 1) return lead\n return lead + \" \".repeat(padded + gap) + style.add(\"optionDesc\")(author)\n}\n\nfunction stateStyleSlot(state: string) {\n if (state === \"open\") return \"success\"\n if (state === \"merged\") return \"accent\"\n // \"closed\" and anything unknown → dim.\n return \"muted\"\n}\n\n/** Default fetcher — shells out to `gh issue list` + `gh pr list` in\n * parallel. Either failing is swallowed so a repo with only issues\n * (or only PRs) still works. */\nfunction defaultFetcher(limit: number): GithubFetcher {\n const fields = \"number,title,state,author,url\"\n return async (cwd, state) => {\n const [issues, prs] = await Promise.all([\n runGh(cwd, [\"issue\", \"list\", \"--state\", state, \"--json\", fields, \"--limit\", String(limit)]),\n runGh(cwd, [\"pr\", \"list\", \"--state\", state, \"--json\", fields, \"--limit\", String(limit)]),\n ])\n return [\n ...parse(issues).map((x) => Object.assign(x, { type: \"issue\" as const })),\n ...parse(prs).map((x) => Object.assign(x, { type: \"pr\" as const })),\n ].map((item) => Object.assign(item, { text: `#${item.number} ${item.title}` }))\n }\n}\n\nfunction parse(out: string): Omit<GithubItem, \"type\">[] {\n try {\n return JSON.parse(out) as Omit<GithubItem, \"type\">[]\n } catch {\n return []\n }\n}\n\nfunction runGh(cwd: string, args: string[]): Promise<string> {\n return new Promise((resolve) => {\n try {\n const child = spawn(\"gh\", args, { cwd, stdio: [\"ignore\", \"pipe\", \"ignore\"] })\n let stdout = \"\"\n child.stdout.on(\"data\", (chunk: Buffer) => {\n stdout += chunk.toString(\"utf8\")\n })\n child.on(\"close\", (code) => {\n resolve(code === 0 ? stdout : \"\")\n })\n child.on(\"error\", () => {\n resolve(\"\")\n })\n } catch {\n resolve(\"\")\n }\n })\n}\n"],"mappings":"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"}
@@ -1,6 +1,5 @@
1
- import { n as PickerItem } from "./picker-B-OxKKnD.mjs";
2
- import { o as CompletionSource } from "./autocomplete-CD30kSe_.mjs";
3
- //#region src/widgets/completions/github.d.ts
1
+ import { n as PickerItem } from "./picker-DsB6--GN.mjs";
2
+ import { o as CompletionSource } from "./autocomplete-wgceuhLr.mjs";
4
3
  /** A GitHub issue or pull request returned by `githubSource`. Shape
5
4
  * mirrors the `gh` CLI's `--json number,title,state,author,url`
6
5
  * output, with `type` added to distinguish issues from PRs. */
@@ -59,6 +58,5 @@ interface GithubSourceOptions {
59
58
  * to wire up unconditionally.
60
59
  */
61
60
  declare function githubSource(opts?: GithubSourceOptions): CompletionSource<GithubItem>;
62
- //#endregion
63
61
  export { githubSource as a, GithubState as i, GithubItem as n, GithubSourceOptions as r, GithubFetcher as t };
64
- //# sourceMappingURL=github-CyRwUQ3y.d.mts.map
62
+ //# sourceMappingURL=github-DC0XemKa.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-DC0XemKa.d.mts","names":[],"sources":["../src/widgets/completions/github.ts"],"mappings":";;;;;KAWY,aAAa;EACvB;EACA;;;EAGA;EACA;EACA;EACA;IAAW;;;KAGD;KAEA,iBAAiB,aAAa,OAAO,gBAAgB,QAAQ;UAExD;;;EAGf;;;EAGA,UAAU;;;EAGV;;EAEA,QAAQ;;EAER;;;;EAIA,UAAU;;;;;;;;;;;;;;;;;;;;;;;iBAwBI,aAAa,OAAM,sBAA2B,iBAAiB"}
@@ -1,5 +1,4 @@
1
- import { I as RenderCtx, X as Layout, h as Node } from "./queries-C75-wG1B.mjs";
2
- //#region src/widgets/image.d.ts
1
+ import { I as RenderCtx, X as Layout, h as Node } from "./queries-Dmd3IjSd.mjs";
3
2
  interface ImageState {
4
3
  /**
5
4
  * Path to an image file. PNG passes through with zero decoding; other
@@ -32,6 +31,5 @@ declare class Image extends Node<ImageState> {
32
31
  }
33
32
  declare function image(src: string, style?: Omit<ImageState, "src">): Image;
34
33
  declare function image(state: ImageState): Image;
35
- //#endregion
36
34
  export { ImageState as n, image as r, Image as t };
37
- //# sourceMappingURL=image-BLls2F4t.d.mts.map
35
+ //# sourceMappingURL=image-DdRDv7q6.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-DdRDv7q6.d.mts","names":[],"sources":["../src/widgets/image.ts"],"mappings":";UAWiB;;;;;;;EAOf;;EAEA;;;;;EAKA;;EAEA;;;;;EAKA;;cAGW,cAAc,KAAK;;EAI9B,YAAY,OAAO;MAOf;EAIK,UAAU;YAIH,QAAQ,KAAK,YAAY;;iBAuC3B,MAAM,aAAa,QAAQ,KAAK,qBAAqB;iBACrD,MAAM,OAAO,aAAa"}
@@ -1,8 +1,8 @@
1
- import { n as resolveAnsiStyle } from "./style-DslRHzI4.mjs";
2
- import { n as replaceMath } from "./math-Dd7a1irv.mjs";
1
+ import { n as resolveAnsiStyle } from "./style-Cw_EuszU.mjs";
2
+ import { n as replaceMath } from "./math-VPuwFCid.mjs";
3
3
  import { stringWidth, stripAnsi } from "@zaly/shared/ansi";
4
4
  import { basename } from "pathe";
5
- //#region src/markdown/image.ts
5
+ // src/markdown/image.ts
6
6
  /**
7
7
  * Image callback + post-processor for the markdown pipeline.
8
8
  *
@@ -57,7 +57,7 @@ function createImageCallback(host) {
57
57
  return rendered;
58
58
  }
59
59
  const { Image } = await import("./widgets/image.mjs");
60
- const { loadKittyGraphics } = await import("./kitty-DKQYsQfH.mjs");
60
+ const { loadKittyGraphics } = await import("./kitty-0sJ8axU_.mjs");
61
61
  const graphics = entries.some((entry) => entry.math) && host.queries ? await loadKittyGraphics(host.queries) : void 0;
62
62
  const fg = resolveAnsiStyle("mdMath", ctx.style.theme).fg;
63
63
  const color = typeof fg === "string" && fg.startsWith("#") ? fg : void 0;
@@ -83,7 +83,7 @@ function createImageCallback(host) {
83
83
  let src = entry.src;
84
84
  let width;
85
85
  if (entry.math) try {
86
- const { mathImage } = await import("./math-CU0wmC9N.mjs");
86
+ const { mathImage } = await import("./math-Dk8hxbmz.mjs");
87
87
  src = await mathImage(entry.math, color);
88
88
  const { fileDetect } = await import("@zaly/shared/detect");
89
89
  const { imageInfo } = await import("@zaly/shared/image");
@@ -172,7 +172,6 @@ function labelOf(entry) {
172
172
  return `[${entry.alt !== "" ? entry.alt : basename(entry.src) || "image"}]`;
173
173
  }
174
174
  const MARKER_RE = /<img id=(\d+)>/g;
175
- //#endregion
176
175
  export { createImageCallback };
177
176
 
178
- //# sourceMappingURL=image-Cqtj3yRA.mjs.map
177
+ //# sourceMappingURL=image-M--Bw4bs.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"image-Cqtj3yRA.mjs","names":[],"sources":["../src/markdown/image.ts"],"sourcesContent":["import type { RenderCtx } from \"../core/ctx.ts\"\nimport type { Node } from \"../core/node.ts\"\nimport type { TerminalQueries } from \"../input/queries.ts\"\nimport type { Image } from \"../widgets/image.ts\"\nimport type { MathExpression } from \"./math.ts\"\nimport type { MdCallbacks, MdImageMeta } from \"./types.ts\"\n\nimport { stringWidth, stripAnsi } from \"@zaly/shared/ansi\"\nimport { basename } from \"pathe\"\nimport { resolveAnsiStyle } from \"../style/style.ts\"\nimport { MATH_PIXELS_PER_CELL, replaceMath } from \"./math.ts\"\n\n/** Minimal host shape the image callback needs. Any Node-like parent\n * with a per-src `Image` cache satisfies it — the `Markdown` widget is\n * the primary caller but the interface keeps this file decoupled from\n * widget internals (and breaks the widgets↔markdown import loop). */\nexport interface ImageHost {\n /** Per-src cache so re-renders reuse the same `Image` — same KGP\n * placement id, which the spec guarantees is a flicker-free\n * move/resize. */\n images: Map<string, Image>\n queries?: TerminalQueries\n /** Attach a freshly-created `Image` as a child so mount/unmount\n * propagate. */\n add: (child: Node) => unknown\n remove: (child: Node) => unknown\n}\n\n/** Per-occurrence image metadata collected during markdown rendering. */\ninterface ImageEntry {\n src: string\n alt: string\n math?: MathExpression\n}\n\n/**\n * Image callback + post-processor for the markdown pipeline.\n *\n * The markdown renderer is synchronous (callbacks return strings), but\n * image preparation is async (sharp metadata, KGP transmit, format\n * conversion). Math shares the same markers and placement path:\n *\n * 1. Before rendering, `prepare` collects math expressions and protects\n * their markers from ordinary Markdown escaping.\n * 2. During rendering, the `image` callback pushes `{ src, alt }` into\n * the entries array and emits a compact `<img id=N>` marker where\n * `N` is the entry's index. The marker is plain text so any\n * renderer (marked or `Bun.markdown.render`) emits it verbatim.\n * 3. After rendering, `resolve(ctx, rendered)` typesets math to cached\n * SVG files, renders every unique\n * src concurrently via cached `Image` nodes, then replaces each\n * marker with rendered rows. Inline images share a top-aligned row\n * band, with continuation rows padded to each image's terminal column.\n *\n * The caller passes in a persistent `cache: Map<src, Image>` owned by\n * the Markdown instance so re-renders reuse the same Image node (and\n * therefore the same KGP placement id, which the spec guarantees is a\n * flicker-free move/resize).\n */\nexport function createImageCallback(host: ImageHost): {\n cb: MdCallbacks[\"image\"]\n prepare: (source: string) => string\n resolve: (ctx: RenderCtx, rendered: string) => Promise<string>\n} {\n const entries: ImageEntry[] = []\n const cache = host.images\n\n return {\n cb(alt: string, meta: MdImageMeta): string {\n const id = entries.length\n entries.push({ alt, src: meta.src })\n return `<img id=${id}>`\n },\n\n prepare(source: string): string {\n return replaceMath(source, (math) => {\n const id = entries.length\n entries.push({ alt: math.source, math, src: \"\" })\n // A bare tag on its own line starts an HTML block and swallows following Markdown.\n return `\\`<img id=${id}>\\``\n })\n },\n\n async resolve(ctx: RenderCtx, rendered: string): Promise<string> {\n if (entries.length === 0) {\n for (const img of cache.values()) host.remove(img)\n cache.clear()\n return rendered\n }\n\n // `Image` is heavy (pulls image-meta, sharp lazy loaders, KGP\n // encoder) and 99% of markdown has no images. Load it only when\n // we have something to place.\n const { Image } = await import(\"../widgets/image.ts\")\n\n // One Image (and therefore one KGP `placementId`) per occurrence\n // so multiple references to the same `src` show up as distinct\n // placements on screen. Cache key is `${src}\\0${ordinal-within-src}`\n // — the ordinal makes each repeated reference stable across\n // re-renders (slot 0 is always slot 0, so the placementId stays\n // pinned and KGP gives a flicker-free move/resize). Image bytes\n // are de-duped at a different layer (`transmitOnce` in kitty.ts),\n // so multiple occurrences cost N placements but only one transmit.\n const { loadKittyGraphics } = await import(\"../image/kitty.ts\")\n const graphics =\n entries.some((entry) => entry.math) && host.queries\n ? await loadKittyGraphics(host.queries)\n : undefined\n const fg = resolveAnsiStyle(\"mdMath\", ctx.style.theme).fg\n const color = typeof fg === \"string\" && fg.startsWith(\"#\") ? fg : undefined\n const ordinals = new Map<string, number>()\n const rowsByEntry: string[][] = []\n const used = new Set<string>()\n await Promise.all(\n entries.map(async (entry, idx) => {\n if (entry.math && (!graphics?.supported || !color)) {\n rowsByEntry[idx] = [entry.alt]\n return\n }\n const identity = entry.math\n ? `math:${JSON.stringify([entry.math.tex, entry.math.display, color])}`\n : entry.src\n const ord = ordinals.get(identity) ?? 0\n ordinals.set(identity, ord + 1)\n const key = `${identity}\\u0000${ord}`\n used.add(key)\n let img = cache.get(key)\n if (img === undefined) {\n let src = entry.src\n let width: number | undefined\n if (entry.math) {\n try {\n const { mathImage } = await import(\"./math.ts\")\n src = await mathImage(entry.math, color!)\n const { fileDetect } = await import(\"@zaly/shared/detect\")\n const { imageInfo } = await import(\"@zaly/shared/image\")\n const detected = await fileDetect(src)\n if (detected?.type !== \"image\") throw new Error(\"Expected a math SVG\")\n const info = await imageInfo(detected)\n width = Math.max(1, Math.ceil(info.width / MATH_PIXELS_PER_CELL))\n } catch {\n rowsByEntry[idx] = [entry.alt]\n return\n }\n }\n img = new Image({ alt: entry.alt, src, width })\n host.add(img)\n cache.set(key, img)\n }\n try {\n rowsByEntry[idx] = await img.render(ctx)\n } catch (error) {\n if (!entry.math) throw error\n rowsByEntry[idx] = [entry.alt]\n }\n })\n )\n\n for (const [key] of cache) {\n if (!used.has(key)) {\n const img = cache.get(key)\n if (img) {\n host.remove(img)\n cache.delete(key)\n }\n }\n }\n\n // Walk the rendered output line by line:\n // - Marker alone on its line (whitespace + ANSI tolerated) →\n // replace the line with the full image rows.\n // - Marker mid-line → top-align image rows in a shared band.\n // Coordinates are terminal cells, not string offsets. As with tables,\n // subsequent wrapping to a narrower width can invalidate this layout.\n const out: string[] = []\n for (const line of rendered.split(\"\\n\")) {\n const matched = new Map<number, { entry: ImageEntry; rows: string[] }>()\n for (const m of line.matchAll(MARKER_RE)) {\n const idx = Number(m[1])\n if (entries[idx]) matched.set(idx, { entry: entries[idx], rows: rowsByEntry[idx] ?? [] })\n }\n\n if (matched.size === 0) {\n out.push(line)\n continue\n }\n\n if (matched.size === 1 && stripAnsi(line.replace(MARKER_RE, \"\")).trim() === \"\") {\n const img = matched.values().next().value\n if (img && img.rows.length > 0) {\n out.push(...img.rows)\n continue\n }\n }\n\n const band = [\"\"]\n let cursor = 0\n for (const marker of line.matchAll(MARKER_RE)) {\n band[0] += line.slice(cursor, marker.index)\n const image = matched.get(Number(marker[1]))\n if (!image) {\n band[0] += marker[0]\n } else {\n const column = stringWidth(band[0])\n const rows = image.rows.length ? image.rows : [labelOf(image.entry)]\n band[0] += rows[0]\n for (let row = 1; row < rows.length; row++) {\n band[row] ??= \"\"\n band[row] += \" \".repeat(Math.max(0, column - stringWidth(band[row]))) + rows[row]\n }\n }\n cursor = marker.index + marker[0].length\n }\n band[0] += line.slice(cursor)\n out.push(...band)\n }\n return out.join(\"\\n\")\n },\n }\n}\n\n/** Friendly inline placeholder for an image that can't render at this\n * position. Math keeps its original source. Otherwise prefers the markdown alt text;\n * falls back to the basename\n * of the source path (so `[clip.png]` instead of `[/tmp/long/path/clip.png]`),\n * and \"image\" for anything weirder. */\nfunction labelOf(entry: ImageEntry): string {\n if (entry.math) return entry.alt\n const label = entry.alt !== \"\" ? entry.alt : basename(entry.src) || \"image\"\n return `[${label}]`\n}\n\nconst MARKER_RE = /<img id=(\\d+)>/g\n"],"mappings":"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"}
1
+ {"version":3,"file":"image-M--Bw4bs.mjs","names":[],"sources":["../src/markdown/image.ts"],"sourcesContent":["import type { RenderCtx } from \"../core/ctx.ts\"\nimport type { Node } from \"../core/node.ts\"\nimport type { TerminalQueries } from \"../input/queries.ts\"\nimport type { Image } from \"../widgets/image.ts\"\nimport type { MathExpression } from \"./math.ts\"\nimport type { MdCallbacks, MdImageMeta } from \"./types.ts\"\n\nimport { stringWidth, stripAnsi } from \"@zaly/shared/ansi\"\nimport { basename } from \"pathe\"\nimport { resolveAnsiStyle } from \"../style/style.ts\"\nimport { MATH_PIXELS_PER_CELL, replaceMath } from \"./math.ts\"\n\n/** Minimal host shape the image callback needs. Any Node-like parent\n * with a per-src `Image` cache satisfies it — the `Markdown` widget is\n * the primary caller but the interface keeps this file decoupled from\n * widget internals (and breaks the widgets↔markdown import loop). */\nexport interface ImageHost {\n /** Per-src cache so re-renders reuse the same `Image` — same KGP\n * placement id, which the spec guarantees is a flicker-free\n * move/resize. */\n images: Map<string, Image>\n queries?: TerminalQueries\n /** Attach a freshly-created `Image` as a child so mount/unmount\n * propagate. */\n add: (child: Node) => unknown\n remove: (child: Node) => unknown\n}\n\n/** Per-occurrence image metadata collected during markdown rendering. */\ninterface ImageEntry {\n src: string\n alt: string\n math?: MathExpression\n}\n\n/**\n * Image callback + post-processor for the markdown pipeline.\n *\n * The markdown renderer is synchronous (callbacks return strings), but\n * image preparation is async (sharp metadata, KGP transmit, format\n * conversion). Math shares the same markers and placement path:\n *\n * 1. Before rendering, `prepare` collects math expressions and protects\n * their markers from ordinary Markdown escaping.\n * 2. During rendering, the `image` callback pushes `{ src, alt }` into\n * the entries array and emits a compact `<img id=N>` marker where\n * `N` is the entry's index. The marker is plain text so any\n * renderer (marked or `Bun.markdown.render`) emits it verbatim.\n * 3. After rendering, `resolve(ctx, rendered)` typesets math to cached\n * SVG files, renders every unique\n * src concurrently via cached `Image` nodes, then replaces each\n * marker with rendered rows. Inline images share a top-aligned row\n * band, with continuation rows padded to each image's terminal column.\n *\n * The caller passes in a persistent `cache: Map<src, Image>` owned by\n * the Markdown instance so re-renders reuse the same Image node (and\n * therefore the same KGP placement id, which the spec guarantees is a\n * flicker-free move/resize).\n */\nexport function createImageCallback(host: ImageHost): {\n cb: MdCallbacks[\"image\"]\n prepare: (source: string) => string\n resolve: (ctx: RenderCtx, rendered: string) => Promise<string>\n} {\n const entries: ImageEntry[] = []\n const cache = host.images\n\n return {\n cb(alt: string, meta: MdImageMeta): string {\n const id = entries.length\n entries.push({ alt, src: meta.src })\n return `<img id=${id}>`\n },\n\n prepare(source: string): string {\n return replaceMath(source, (math) => {\n const id = entries.length\n entries.push({ alt: math.source, math, src: \"\" })\n // A bare tag on its own line starts an HTML block and swallows following Markdown.\n return `\\`<img id=${id}>\\``\n })\n },\n\n async resolve(ctx: RenderCtx, rendered: string): Promise<string> {\n if (entries.length === 0) {\n for (const img of cache.values()) host.remove(img)\n cache.clear()\n return rendered\n }\n\n // `Image` is heavy (pulls image-meta, sharp lazy loaders, KGP\n // encoder) and 99% of markdown has no images. Load it only when\n // we have something to place.\n const { Image } = await import(\"../widgets/image.ts\")\n\n // One Image (and therefore one KGP `placementId`) per occurrence\n // so multiple references to the same `src` show up as distinct\n // placements on screen. Cache key is `${src}\\0${ordinal-within-src}`\n // — the ordinal makes each repeated reference stable across\n // re-renders (slot 0 is always slot 0, so the placementId stays\n // pinned and KGP gives a flicker-free move/resize). Image bytes\n // are de-duped at a different layer (`transmitOnce` in kitty.ts),\n // so multiple occurrences cost N placements but only one transmit.\n const { loadKittyGraphics } = await import(\"../image/kitty.ts\")\n const graphics =\n entries.some((entry) => entry.math) && host.queries\n ? await loadKittyGraphics(host.queries)\n : undefined\n const fg = resolveAnsiStyle(\"mdMath\", ctx.style.theme).fg\n const color = typeof fg === \"string\" && fg.startsWith(\"#\") ? fg : undefined\n const ordinals = new Map<string, number>()\n const rowsByEntry: string[][] = []\n const used = new Set<string>()\n await Promise.all(\n entries.map(async (entry, idx) => {\n if (entry.math && (!graphics?.supported || !color)) {\n rowsByEntry[idx] = [entry.alt]\n return\n }\n const identity = entry.math\n ? `math:${JSON.stringify([entry.math.tex, entry.math.display, color])}`\n : entry.src\n const ord = ordinals.get(identity) ?? 0\n ordinals.set(identity, ord + 1)\n const key = `${identity}\\u0000${ord}`\n used.add(key)\n let img = cache.get(key)\n if (img === undefined) {\n let src = entry.src\n let width: number | undefined\n if (entry.math) {\n try {\n const { mathImage } = await import(\"./math.ts\")\n src = await mathImage(entry.math, color!)\n const { fileDetect } = await import(\"@zaly/shared/detect\")\n const { imageInfo } = await import(\"@zaly/shared/image\")\n const detected = await fileDetect(src)\n if (detected?.type !== \"image\") throw new Error(\"Expected a math SVG\")\n const info = await imageInfo(detected)\n width = Math.max(1, Math.ceil(info.width / MATH_PIXELS_PER_CELL))\n } catch {\n rowsByEntry[idx] = [entry.alt]\n return\n }\n }\n img = new Image({ alt: entry.alt, src, width })\n host.add(img)\n cache.set(key, img)\n }\n try {\n rowsByEntry[idx] = await img.render(ctx)\n } catch (error) {\n if (!entry.math) throw error\n rowsByEntry[idx] = [entry.alt]\n }\n })\n )\n\n for (const [key] of cache) {\n if (!used.has(key)) {\n const img = cache.get(key)\n if (img) {\n host.remove(img)\n cache.delete(key)\n }\n }\n }\n\n // Walk the rendered output line by line:\n // - Marker alone on its line (whitespace + ANSI tolerated) →\n // replace the line with the full image rows.\n // - Marker mid-line → top-align image rows in a shared band.\n // Coordinates are terminal cells, not string offsets. As with tables,\n // subsequent wrapping to a narrower width can invalidate this layout.\n const out: string[] = []\n for (const line of rendered.split(\"\\n\")) {\n const matched = new Map<number, { entry: ImageEntry; rows: string[] }>()\n for (const m of line.matchAll(MARKER_RE)) {\n const idx = Number(m[1])\n if (entries[idx]) matched.set(idx, { entry: entries[idx], rows: rowsByEntry[idx] ?? [] })\n }\n\n if (matched.size === 0) {\n out.push(line)\n continue\n }\n\n if (matched.size === 1 && stripAnsi(line.replace(MARKER_RE, \"\")).trim() === \"\") {\n const img = matched.values().next().value\n if (img && img.rows.length > 0) {\n out.push(...img.rows)\n continue\n }\n }\n\n const band = [\"\"]\n let cursor = 0\n for (const marker of line.matchAll(MARKER_RE)) {\n band[0] += line.slice(cursor, marker.index)\n const image = matched.get(Number(marker[1]))\n if (!image) {\n band[0] += marker[0]\n } else {\n const column = stringWidth(band[0])\n const rows = image.rows.length ? image.rows : [labelOf(image.entry)]\n band[0] += rows[0]\n for (let row = 1; row < rows.length; row++) {\n band[row] ??= \"\"\n band[row] += \" \".repeat(Math.max(0, column - stringWidth(band[row]))) + rows[row]\n }\n }\n cursor = marker.index + marker[0].length\n }\n band[0] += line.slice(cursor)\n out.push(...band)\n }\n return out.join(\"\\n\")\n },\n }\n}\n\n/** Friendly inline placeholder for an image that can't render at this\n * position. Math keeps its original source. Otherwise prefers the markdown alt text;\n * falls back to the basename\n * of the source path (so `[clip.png]` instead of `[/tmp/long/path/clip.png]`),\n * and \"image\" for anything weirder. */\nfunction labelOf(entry: ImageEntry): string {\n if (entry.math) return entry.alt\n const label = entry.alt !== \"\" ? entry.alt : basename(entry.src) || \"image\"\n return `[${label}]`\n}\n\nconst MARKER_RE = /<img id=(\\d+)>/g\n"],"mappings":"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"}
package/dist/image.d.mts CHANGED
@@ -1,7 +1,6 @@
1
- import { n as TerminalQueries, r as TerminalQuery } from "./queries-C75-wG1B.mjs";
1
+ import { n as TerminalQueries, r as TerminalQuery } from "./queries-Dmd3IjSd.mjs";
2
2
  import { MaybePromise } from "@zaly/shared";
3
3
  import { ImageInfo } from "@zaly/shared/image";
4
- //#region src/image/kitty.d.ts
5
4
  export type KittyPlacement = {
6
5
  imageId: number;
7
6
  /** Placement ID. Omitted when this is an inline placement (U=1) */
@@ -118,5 +117,4 @@ export declare function bumpPlacements(rows: string[]): undefined | {
118
117
  rows: string[];
119
118
  };
120
119
  export declare function loadKittyGraphics(tq: TerminalQueries): MaybePromise<Kitty>;
121
- //#endregion
122
120
  //# sourceMappingURL=image.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"image.d.mts","names":[],"sources":["../src/image/kitty.ts"],"mappings":";;;;YAqBY;EACV;;EAEA;;EAEA;;EAEA;;EAEA;;YAGU;EACV;IAAa;IAAc;;EAC3B;EACA,QAAQ;EACR;;EAGI;EACA;EACA;IAAa;IAAc;;;EAG3B;EACA;EACA;IAAY;IAAc;;EAC1B;;YAIM;EAEN,OAAO;EACP;;EAGA,OAAO;EACP;EACA;IAAS;IAAc;;;YAGjB;;EAEV;;EAEA;;qBAaW;qBACA;;wBAgBG;;wBAKA;qBAIH;;EAIX,YAAY,SAAS;MAKjB;MAIA;;EAKJ,QACE,OAAO,iCACP,gBAAgB,YAChB;IAAQ;;;EAcV,MACE,OAAO,iCACP,gBAAgB,YAChB;IAAQ;MACP;;EAaH;;EAKA,MAAM,cAAc;EAsBpB,UAAU,iBAAiB,MAAM,gBAAgB;;EA+BjD,YAAY;;EAOZ,gBAAgB,iBAAiB;;;;;;;;;;;EAc3B,aAAa,MAAM,YAAY;IAAU;IAAiB;;;;;;;;EAqChE,aAAa,YAAY;;;;;;EASzB,cAAc,YAAY,KAAK;;;wBAoBjB;wBAIA;wBAwCA,eACd;EACe;EAAsB;;wBAiFvB,kBAAkB,IAAI,kBAAkB,aAAa"}
1
+ {"version":3,"file":"image.d.mts","names":[],"sources":["../src/image/kitty.ts"],"mappings":";;;YAqBY;EACV;;EAEA;;EAEA;;EAEA;;EAEA;;YAGU;EACV;IAAa;IAAc;;EAC3B;EACA,QAAQ;EACR;;EAGI;EACA;EACA;IAAa;IAAc;;;EAG3B;EACA;EACA;IAAY;IAAc;;EAC1B;;YAIM;EAEN,OAAO;EACP;;EAGA,OAAO;EACP;EACA;IAAS;IAAc;;;YAGjB;;EAEV;;EAEA;;qBAaW;qBACA;;wBAgBG;;wBAKA;qBAIH;;EAIX,YAAY,SAAS;MAKjB;MAIA;;EAKJ,QACE,OAAO,iCACP,gBAAgB,YAChB;IAAQ;;;EAcV,MACE,OAAO,iCACP,gBAAgB,YAChB;IAAQ;MACP;;EAaH;;EAKA,MAAM,cAAc;EAsBpB,UAAU,iBAAiB,MAAM,gBAAgB;;EA+BjD,YAAY;;EAOZ,gBAAgB,iBAAiB;;;;;;;;;;;EAc3B,aAAa,MAAM,YAAY;IAAU;IAAiB;;;;;;;;EAqChE,aAAa,YAAY;;;;;;EASzB,cAAc,YAAY,KAAK;;;wBAoBjB;wBAIA;wBAwCA,eACd;EACe;EAAsB;;wBAiFvB,kBAAkB,IAAI,kBAAkB,aAAa"}
package/dist/image.mjs CHANGED
@@ -1 +1 @@
1
- export { t as DIACRITICS, n as Kitty, r as PLACEHOLDER, i as allocateImageId, a as allocatePlacementId, o as bumpPlacements, s as loadKittyGraphics, c as resetKittyGraphics, l as resetTransmitCache } from "./kitty-JbCJC0iQ.mjs";
1
+ export { t as DIACRITICS, n as Kitty, r as PLACEHOLDER, i as allocateImageId, a as allocatePlacementId, o as bumpPlacements, s as loadKittyGraphics, c as resetKittyGraphics, l as resetTransmitCache } from "./kitty-BH_eK6lz.mjs";
package/dist/index.d.mts CHANGED
@@ -1,12 +1,9 @@
1
- import { C as ShikiThemeInput, S as ShikiTheme, T as ShikiWorkerRequest, _ as ShikiLanguage, a as BrightAnsiColorName, b as ShikiResult, c as HexColor, d as ThemeKey, f as Theme, g as ShikiJob, h as GeneratedShikiTheme, i as AnyStyle, l as RGB, m as ThemeValue, n as AnsiColorName, o as Color, p as ThemeStyle, r as AnsiStyle, s as ColorLightness, t as AnsiColor, u as Style, v as ShikiOpts, w as ShikiWorkerMessage, x as ShikiSelection, y as ShikiRequest } from "./types-C9ceMsbJ.mjs";
2
- import { $ as StyleState, $t as keyMatches, At as unwrap, Bt as ActionFn, C as UI, Ct as memo, Dt as signal, E as Terminal, Et as provideContext, F as MountCtx, Gt as NodeActionMap, Ht as Actions, I as RenderCtx, It as Action, Jt as KeyPattern, Kt as KeyEvent, Lt as ActionCtx, Mt as useContext, Nt as withActiveNode, Ot as toAccessor, Pt as withOwner, Q as State, Qt as isKeyPattern, Rt as ActionDef, S as SurfaceType, St as isAccessor, T as OverlaySurface, Tt as peek, Ut as KeyBinding, Vt as ActionMap, Wt as NodeAction, X as Layout, Xt as SpecialKeyName, Y as FlexState, Yt as KeyPatternError, Z as LayoutState, Zt as canonical, _ as NodeVisitor, _t as createRoot, a as parseAttrs, at as Ref, b as Renderer, bt as effect, c as InputRouterEvents, ct as SignalStore, d as KeymapEntry, dt as createAsync, et as Accessor, f as RoutedKey, ft as createContext, g as isNode, gt as createRef, h as Node, ht as createProgressive, i as TerminalQueryOpts, it as Reactive, jt as useActiveOwner, kt as untrack, l as KeyHandler, lt as SuspenseBoundary, m as BaseEvents, mt as createNode, n as TerminalQueries, nt as Owner, o as parseTerminalColor, ot as Setter, p as RoutedPaste, pt as createIterable, qt as KeyModifier, r as TerminalQuery, rt as Progressive, s as InputRouter, st as Signal, t as TerminalPaletteSnapshot, tt as Context, u as KeyPatterns, ut as SuspenseContext, v as RenderEvents, vt as createStore, w as Stream, wt as onCleanup, x as RendererOptions, xt as inRenderContextOf, y as RenderStats, yt as createSuspenseBoundary, zt as ActionFilter } from "./queries-C75-wG1B.mjs";
3
- import { a as StyleBuilder, i as isMarkdown, n as inspect, r as inspectFormat, t as InspectOpts } from "./inspect-B1uXxdKC.mjs";
1
+ import { C as ShikiThemeInput, S as ShikiTheme, T as ShikiWorkerRequest, _ as ShikiLanguage, a as BrightAnsiColorName, b as ShikiResult, c as HexColor, d as ThemeKey, f as Theme, g as ShikiJob, h as GeneratedShikiTheme, i as AnyStyle, l as RGB, m as ThemeValue, n as AnsiColorName, o as Color, p as ThemeStyle, r as AnsiStyle, s as ColorLightness, t as AnsiColor, u as Style, v as ShikiOpts, w as ShikiWorkerMessage, x as ShikiSelection, y as ShikiRequest } from "./types-ByMHEdCF.mjs";
2
+ import { $ as StyleState, $t as keyMatches, At as unwrap, Bt as ActionFn, C as UI, Ct as memo, Dt as signal, E as Terminal, Et as provideContext, F as MountCtx, Gt as NodeActionMap, Ht as Actions, I as RenderCtx, It as Action, Jt as KeyPattern, Kt as KeyEvent, Lt as ActionCtx, Mt as useContext, Nt as withActiveNode, Ot as toAccessor, Pt as withOwner, Q as State, Qt as isKeyPattern, Rt as ActionDef, S as SurfaceType, St as isAccessor, T as OverlaySurface, Tt as peek, Ut as KeyBinding, Vt as ActionMap, Wt as NodeAction, X as Layout, Xt as SpecialKeyName, Y as FlexState, Yt as KeyPatternError, Z as LayoutState, Zt as canonical, _ as NodeVisitor, _t as createRoot, a as parseAttrs, at as Ref, b as Renderer, bt as effect, c as InputRouterEvents, ct as SignalStore, d as KeymapEntry, dt as createAsync, et as Accessor, f as RoutedKey, ft as createContext, g as isNode, gt as createRef, h as Node, ht as createProgressive, i as TerminalQueryOpts, it as Reactive, jt as useActiveOwner, kt as untrack, l as KeyHandler, lt as SuspenseBoundary, m as BaseEvents, mt as createNode, n as TerminalQueries, nt as Owner, o as parseTerminalColor, ot as Setter, p as RoutedPaste, pt as createIterable, qt as KeyModifier, r as TerminalQuery, rt as Progressive, s as InputRouter, st as Signal, t as TerminalPaletteSnapshot, tt as Context, u as KeyPatterns, ut as SuspenseContext, v as RenderEvents, vt as createStore, w as Stream, wt as onCleanup, x as RendererOptions, xt as inRenderContextOf, y as RenderStats, yt as createSuspenseBoundary, zt as ActionFilter } from "./queries-Dmd3IjSd.mjs";
3
+ import { a as StyleBuilder, i as isMarkdown, n as inspect, r as inspectFormat, t as InspectOpts } from "./inspect-hSl3U2BD.mjs";
4
4
  import { ArgsOpts } from "@zaly/shared/args";
5
- //#region src/input/index.d.ts
6
5
  export declare function defineAction<T extends ArgsOpts = ArgsOpts>(action: ActionDef<T>): ActionDef<T>;
7
6
  export declare function defineAction<T extends ArgsOpts = ArgsOpts>(action: Action<T>): Action<T>;
8
- //#endregion
9
- //#region src/core/render.d.ts
10
7
  /** Components-facing slice of the render environment — reactive
11
8
  * accessors a widget body reads via `useContext(RenderContext)`. Use
12
9
  * this when a widget needs ambient theme/style outside an `_render`
@@ -47,27 +44,18 @@ export declare function createRender(node: Node, ctx: RenderCtx & {
47
44
  boundary: SuspenseBoundary;
48
45
  }): Promise<string[]>;
49
46
  export declare function createRender(node: () => Node, ctx?: RenderCtx): Promise<string[]>;
50
- //#endregion
51
- //#region src/core/index.d.ts
52
47
  export declare function createCtx(opts?: Partial<RenderCtx> & {
53
48
  theme?: Theme;
54
49
  }): Promise<RenderCtx>;
55
- //#endregion
56
- //#region src/renderer/index.d.ts
57
50
  /** Factory shorthand for `new Renderer(opts)`. */
58
51
  export declare function createRenderer(opts?: RendererOptions): Promise<Renderer>;
59
- //#endregion
60
- //#region src/shiki/shiki.d.ts
61
52
  /** List bundled highlighting themes without loading their color definitions. */
62
53
  export declare function shikiThemes(): Promise<{
63
54
  id: ShikiTheme;
64
55
  name: string;
65
56
  }[]>;
66
57
  export declare function codeToAnsi(code: string, lang: string, opts?: ShikiOpts): Promise<string>;
67
- //#endregion
68
- //#region src/shiki/theme.d.ts
69
58
  /** Resolve highlighting independently of a theme's display name or origin. */
70
59
  export declare function shikiTheme(theme: Theme, selection?: ShikiSelection): ShikiThemeInput;
71
- //#endregion
72
60
  export { Accessor, type Action, type ActionCtx, type ActionDef, type ActionFilter, type ActionFn, type ActionMap, type Actions, type AnsiColor, type AnsiColorName, type AnsiStyle, type AnyStyle, type BaseEvents, type BrightAnsiColorName, type Color, type ColorLightness, Context, type FlexState, type GeneratedShikiTheme, type HexColor, type InputRouter, type InputRouterEvents, InspectOpts, type KeyBinding, KeyEvent, type KeyHandler, KeyModifier, KeyPattern, KeyPatternError, type KeyPatterns, type KeymapEntry, type Layout, type LayoutState, type MountCtx, type Node, type NodeAction, type NodeActionMap, type NodeVisitor, type OverlaySurface, Owner, Progressive, type RGB, Reactive, Ref, type RenderCtx, type RenderEvents, type RenderStats, type Renderer, type RendererOptions, type RoutedKey, type RoutedPaste, Setter, type ShikiJob, type ShikiLanguage, type ShikiOpts, type ShikiRequest, type ShikiResult, type ShikiSelection, type ShikiTheme, type ShikiThemeInput, type ShikiWorkerMessage, type ShikiWorkerRequest, Signal, SignalStore, SpecialKeyName, type State, type Stream, type Style, type StyleState, type SurfaceType, SuspenseBoundary, SuspenseContext, type Terminal, TerminalPaletteSnapshot, TerminalQueries, TerminalQuery, TerminalQueryOpts, type Theme, type ThemeKey, type ThemeStyle, type ThemeValue, type UI, canonical, createAsync, createContext, createIterable, createNode, createProgressive, createRef, createRoot, createStore, createSuspenseBoundary, effect, inRenderContextOf, inspect, inspectFormat, isAccessor, isKeyPattern, isMarkdown, type isNode, keyMatches, memo, onCleanup, parseAttrs, parseTerminalColor, peek, provideContext, signal, toAccessor, untrack, unwrap, useActiveOwner, useContext, withActiveNode, withOwner };
73
61
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":["_$__reactive_ts0.Context"],"sources":["../src/input/index.ts","../src/core/render.ts","../src/core/index.ts","../src/renderer/index.ts","../src/shiki/shiki.ts","../src/shiki/theme.ts"],"mappings":";;;;;wBAGgB,aAAa,UAAU,WAAW,UAAU,QAAQ,UAAU,KAAK,UAAU;wBAC7E,aAAa,UAAU,WAAW,UAAU,QAAQ,OAAO,KAAK,OAAO;;;;;;;;;YCmB3E;;EAEV,OAAO,SAAS;;EAEhB,OAAO,SAAS;;EAEhB,QAAQ;EACR,SAAS;;qBAEE,eAAaA,QAAA;;;;;;;;;;;;;;;;;;;;;wBAsBJ,aACpB,MAAM,MACN,KAAK;EAAc,UAAU;IAC5B;wBACmB,aAAa,YAAY,MAAM,MAAM,YAAY;;;wBC/CjD,UACpB,OAAM,QAAQ;EAAe,QAAQ;IACpC,QAAQ;;;;wBCJW,eAAe,OAAM,kBAAuB,QAAQ;;;;wBCHpD,eAAW;EAGnB,IAAA;;;wBAKQ,WAAW,cAAc,cAAc,OAAO,YAAY;;;;wBC+BhE,WAAW,OAAO,OAAO,YAAW,iBAA0B"}
1
+ {"version":3,"file":"index.d.mts","names":["_$__reactive_ts0.Context"],"sources":["../src/input/index.ts","../src/core/render.ts","../src/core/index.ts","../src/renderer/index.ts","../src/shiki/shiki.ts","../src/shiki/theme.ts"],"mappings":";;;;wBAGgB,aAAa,UAAU,WAAW,UAAU,QAAQ,UAAU,KAAK,UAAU;wBAC7E,aAAa,UAAU,WAAW,UAAU,QAAQ,OAAO,KAAK,OAAO;;;;;;;YCmB3E;;EAEV,OAAO,SAAS;;EAEhB,OAAO,SAAS;;EAEhB,QAAQ;EACR,SAAS;;qBAEE,eAAaA,QAAA;;;;;;;;;;;;;;;;;;;;;wBAsBJ,aACpB,MAAM,MACN,KAAK;EAAc,UAAU;IAC5B;wBACmB,aAAa,YAAY,MAAM,MAAM,YAAY;wBC/CjD,UACpB,OAAM,QAAQ;EAAe,QAAQ;IACpC,QAAQ;;wBCJW,eAAe,OAAM,kBAAuB,QAAQ;;wBCHpD,eAAW;EAGnB,IAAA;;;wBAKQ,WAAW,cAAc,cAAc,OAAO,YAAY;;wBC+BhE,WAAW,OAAO,OAAO,YAAW,iBAA0B"}
package/dist/index.mjs CHANGED
@@ -1,27 +1,24 @@
1
- import { C as useActiveOwner, E as withOwner, S as unwrap, T as withActiveNode, _ as peek, a as createIterable, b as toAccessor, c as createRef, d as createSuspenseBoundary, f as effect, g as onCleanup, h as memo, i as createContext, l as createRoot, m as isAccessor, n as SuspenseContext, o as createNode, p as inRenderContextOf, r as createAsync, s as createProgressive, t as Owner, u as createStore, v as provideContext, w as useContext, x as untrack, y as signal } from "./reactive-f7NpAi69.mjs";
2
- import { n as inspectFormat, r as isMarkdown, t as inspect } from "./inspect-Cxzs-W0g.mjs";
3
- import { n as createRender, t as RenderContext } from "./render-B7LfNM5K.mjs";
4
- import { n as shikiThemes, t as codeToAnsi } from "./shiki-CJauRusM.mjs";
5
- import { t as shikiTheme } from "./theme-C8LkcoaK.mjs";
6
- import { a as canonical, i as KeyPatternError, n as parseAttrs, o as isKeyPattern, r as parseTerminalColor, s as keyMatches, t as TerminalQueries } from "./queries-BUkBxkuM.mjs";
7
- //#region src/input/index.ts
1
+ import { C as useActiveOwner, E as withOwner, S as unwrap, T as withActiveNode, _ as peek, a as createIterable, b as toAccessor, c as createRef, d as createSuspenseBoundary, f as effect, g as onCleanup, h as memo, i as createContext, l as createRoot, m as isAccessor, n as SuspenseContext, o as createNode, p as inRenderContextOf, r as createAsync, s as createProgressive, t as Owner, u as createStore, v as provideContext, w as useContext, x as untrack, y as signal } from "./reactive-DkP75TPk.mjs";
2
+ import { n as inspectFormat, r as isMarkdown, t as inspect } from "./inspect-Cli1beu8.mjs";
3
+ import { n as createRender, t as RenderContext } from "./render-Bp2N2i6J.mjs";
4
+ import { n as shikiThemes, t as codeToAnsi } from "./shiki-BAf9PdIc.mjs";
5
+ import { t as shikiTheme } from "./theme-B8hb1lPU.mjs";
6
+ import { a as canonical, i as KeyPatternError, n as parseAttrs, o as isKeyPattern, r as parseTerminalColor, s as keyMatches, t as TerminalQueries } from "./queries-BIniKnLL.mjs";
7
+ // src/input/index.ts
8
8
  function defineAction(action) {
9
9
  return action;
10
10
  }
11
- //#endregion
12
- //#region src/core/index.ts
11
+ // src/core/index.ts
13
12
  async function createCtx(opts = {}) {
14
- const { createCtx: create } = await import("./ctx-CndlTp1T.mjs");
13
+ const { createCtx: create } = await import("./ctx-CYEzzH-7.mjs");
15
14
  return create(opts);
16
15
  }
17
- //#endregion
18
- //#region src/renderer/index.ts
16
+ // src/renderer/index.ts
19
17
  /** Factory shorthand for `new Renderer(opts)`. */
20
18
  async function createRenderer(opts = {}) {
21
- const { Renderer } = await import("./renderer-BLsd-wrG.mjs");
19
+ const { Renderer } = await import("./renderer-OplFCBMq.mjs");
22
20
  return new Renderer(opts);
23
21
  }
24
- //#endregion
25
22
  export { KeyPatternError, Owner, RenderContext, SuspenseContext, TerminalQueries, canonical, codeToAnsi, createAsync, createContext, createCtx, createIterable, createNode, createProgressive, createRef, createRender, createRenderer, createRoot, createStore, createSuspenseBoundary, defineAction, effect, inRenderContextOf, inspect, inspectFormat, isAccessor, isKeyPattern, isMarkdown, keyMatches, memo, onCleanup, parseAttrs, parseTerminalColor, peek, provideContext, shikiTheme, shikiThemes, signal, toAccessor, untrack, unwrap, useActiveOwner, useContext, withActiveNode, withOwner };
26
23
 
27
24
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/input/index.ts","../src/core/index.ts","../src/renderer/index.ts"],"sourcesContent":["import type { ArgsOpts } from \"@zaly/shared/args\"\nimport type { Action, ActionDef } from \"./actions.ts\"\n\nexport function defineAction<T extends ArgsOpts = ArgsOpts>(action: ActionDef<T>): ActionDef<T>\nexport function defineAction<T extends ArgsOpts = ArgsOpts>(action: Action<T>): Action<T>\nexport function defineAction<T extends ArgsOpts = ArgsOpts>(\n action: ActionDef<T> | Action<T>\n): ActionDef<T> | Action<T> {\n return action\n}\n","import type { Theme } from \"../themes/types.ts\"\nimport type { RenderCtx } from \"./ctx.ts\"\n\nexport type { RenderCtx, MountCtx } from \"./ctx.ts\"\n\nexport type * from \"./node.ts\"\nexport type * from \"./state.ts\"\n\nexport * from \"./reactive.ts\"\nexport * from \"./render.ts\"\n\nexport async function createCtx(\n opts: Partial<RenderCtx> & { theme?: Theme } = {}\n): Promise<RenderCtx> {\n const { createCtx: create } = await import(\"./ctx.ts\")\n return create(opts)\n}\n","import type { Renderer, RendererOptions } from \"./renderer.ts\"\n\nexport type * from \"./renderer.ts\"\nexport type { OverlaySurface } from \"./overlay.ts\"\nexport type { Stream } from \"./stream.ts\"\nexport type { Terminal } from \"./terminal.ts\"\nexport type { UI } from \"./ui.ts\"\n\n/** Factory shorthand for `new Renderer(opts)`. */\nexport async function createRenderer(opts: RendererOptions = {}): Promise<Renderer> {\n const { Renderer } = await import(\"./renderer.ts\")\n return new Renderer(opts)\n}\n"],"mappings":";;;;;;;AAKA,SAAgB,aACd,QAC0B;CAC1B,OAAO;AACT;;;ACEA,eAAsB,UACpB,OAA+C,CAAC,GAC5B;CACpB,MAAM,EAAE,WAAW,WAAW,MAAM,OAAO;CAC3C,OAAO,OAAO,IAAI;AACpB;;;;ACPA,eAAsB,eAAe,OAAwB,CAAC,GAAsB;CAClF,MAAM,EAAE,aAAa,MAAM,OAAO;CAClC,OAAO,IAAI,SAAS,IAAI;AAC1B"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/input/index.ts","../src/core/index.ts","../src/renderer/index.ts"],"sourcesContent":["import type { ArgsOpts } from \"@zaly/shared/args\"\nimport type { Action, ActionDef } from \"./actions.ts\"\n\nexport function defineAction<T extends ArgsOpts = ArgsOpts>(action: ActionDef<T>): ActionDef<T>\nexport function defineAction<T extends ArgsOpts = ArgsOpts>(action: Action<T>): Action<T>\nexport function defineAction<T extends ArgsOpts = ArgsOpts>(\n action: ActionDef<T> | Action<T>\n): ActionDef<T> | Action<T> {\n return action\n}\n","import type { Theme } from \"../themes/types.ts\"\nimport type { RenderCtx } from \"./ctx.ts\"\n\nexport type { RenderCtx, MountCtx } from \"./ctx.ts\"\n\nexport type * from \"./node.ts\"\nexport type * from \"./state.ts\"\n\nexport * from \"./reactive.ts\"\nexport * from \"./render.ts\"\n\nexport async function createCtx(\n opts: Partial<RenderCtx> & { theme?: Theme } = {}\n): Promise<RenderCtx> {\n const { createCtx: create } = await import(\"./ctx.ts\")\n return create(opts)\n}\n","import type { Renderer, RendererOptions } from \"./renderer.ts\"\n\nexport type * from \"./renderer.ts\"\nexport type { OverlaySurface } from \"./overlay.ts\"\nexport type { Stream } from \"./stream.ts\"\nexport type { Terminal } from \"./terminal.ts\"\nexport type { UI } from \"./ui.ts\"\n\n/** Factory shorthand for `new Renderer(opts)`. */\nexport async function createRenderer(opts: RendererOptions = {}): Promise<Renderer> {\n const { Renderer } = await import(\"./renderer.ts\")\n return new Renderer(opts)\n}\n"],"mappings":";;;;;;;AAKA,SAAgB,aACd,QAC0B;CAC1B,OAAO;AACT;;ACEA,eAAsB,UACpB,OAA+C,CAAC,GAC5B;CACpB,MAAM,EAAE,WAAW,WAAW,MAAM,OAAO;CAC3C,OAAO,OAAO,IAAI;AACpB;;;ACPA,eAAsB,eAAe,OAAwB,CAAC,GAAsB;CAClF,MAAM,EAAE,aAAa,MAAM,OAAO;CAClC,OAAO,IAAI,SAAS,IAAI;AAC1B"}
@@ -1,8 +1,7 @@
1
- import { $ as StyleState, Ft as Size, I as RenderCtx, h as Node, it as Reactive, m as BaseEvents } from "./queries-C75-wG1B.mjs";
2
- import { a as StyleBuilder } from "./inspect-B1uXxdKC.mjs";
1
+ import { $ as StyleState, Ft as Size, I as RenderCtx, h as Node, it as Reactive, m as BaseEvents } from "./queries-Dmd3IjSd.mjs";
2
+ import { a as StyleBuilder } from "./inspect-hSl3U2BD.mjs";
3
3
  import { MaybePromise } from "@zaly/shared";
4
4
  import { DetectedFile } from "@zaly/shared/detect";
5
- //#region src/widgets/input.d.ts
6
5
  interface InputState extends StyleState {
7
6
  /** Current text content. May include `\n` for multi-line input. */
8
7
  value?: string;
@@ -136,6 +135,5 @@ declare class Input extends Node<InputState, InputEvents> {
136
135
  * ```
137
136
  */
138
137
  declare function input(state?: InputState): Input;
139
- //#endregion
140
138
  export { InputValue as a, InputState as i, InputAttachment as n, input as o, InputEvents as r, Input as t };
141
- //# sourceMappingURL=input-NuD8TH8N.d.mts.map
139
+ //# sourceMappingURL=input-C3kfYoEJ.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-C3kfYoEJ.d.mts","names":[],"sources":["../src/widgets/input.ts"],"mappings":";;;;UAoBiB,mBAAmB;;EAElC;;EAEA,cAAc;;EAEd;;EAEA,QAAQ;;EAER;;EAEA;EACA;EACA,aAAa,MAAM;EACnB,UAAU,eAAe;IAAO,OAAO;QAAmB;EAC1D,YAAY;;KAGF;EAAe;EAAe,aAAa;;;KAOlD;EAAU;EAAe;;;KAGlB,kBAAkB;EAAiB;;KAEnC,cAAc;;EAExB;IAAW;IAAmB;;;EAE9B;IAAU;IAAe,aAAa;;;;;;;;;;EAStC;IAAU,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA+BX,cAAc,KAAK,YAAY;;;kBAE1B;WAEE;;;;;;;EAgBT;IACiB;IAUA;IAKG;IAKE;IAMJ;IAMH;IAUM;IAUG;IAUH;IAWD;IAsBJ;IAqBJ;IA2BC;;EAStB,YAAY,UAAS;MA2BjB;MAIA,QAAQ;EAKZ,OAAO,KAAK,kBAAkB;EAqB9B,MAAM;EASN,OAAO;EAWP,QAAQ;;;;EAQR,WAAW;EA2BX,WAAW;YAqHK,QAAQ,KAAK,YAAY;;;;;;;;;;;;iBAyD3B,MAAM,QAAO,aAAkB"}
@@ -1,12 +1,12 @@
1
- import { S as unwrap, x as untrack } from "./reactive-f7NpAi69.mjs";
2
- import { t as Node } from "./node-BZ7f6HzU.mjs";
3
- import { o as formatText } from "./text-BoJdKXLU.mjs";
4
- import { t as clipboard } from "./clipboard-CNPBTX7j.mjs";
1
+ import { S as unwrap, x as untrack } from "./reactive-DkP75TPk.mjs";
2
+ import { t as Node } from "./node-CXNobGaP.mjs";
3
+ import { o as formatText } from "./text-BEuhhxr7.mjs";
4
+ import { t as clipboard } from "./clipboard-UEoX9sup.mjs";
5
5
  import { hash, isPromiseLike } from "@zaly/shared";
6
6
  import { sliceAnsi, splitAnsi, stringWidth } from "@zaly/shared/ansi";
7
7
  import { basename } from "pathe";
8
8
  import { fileDetect } from "@zaly/shared/detect";
9
- //#region src/widgets/input.ts
9
+ // src/widgets/input.ts
10
10
  const PASTE_MAX_LINES = 5;
11
11
  const PASTE_MAX_CHARS = 1e3;
12
12
  const graphemes = new Intl.Segmenter(void 0, { granularity: "grapheme" });
@@ -496,7 +496,6 @@ function countLines(value) {
496
496
  for (const ch of value) if (ch === "\n") n++;
497
497
  return n;
498
498
  }
499
- //#endregion
500
499
  export { input as n, Input as t };
501
500
 
502
- //# sourceMappingURL=input-ET2YEMcl.mjs.map
501
+ //# sourceMappingURL=input-CtGmVrKa.mjs.map