@inhuman.tools/quickdraw 0.0.0-bootstrap.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 (522) hide show
  1. package/LICENSE.md +7 -0
  2. package/README.md +102 -1
  3. package/aurora.vert +168 -0
  4. package/dist/bench/host.d.ts +62 -0
  5. package/dist/bench/host.d.ts.map +1 -0
  6. package/dist/bench/host.js +77 -0
  7. package/dist/bench/host.js.map +1 -0
  8. package/dist/bench/main.d.ts +6 -0
  9. package/dist/bench/main.d.ts.map +1 -0
  10. package/dist/bench/main.js +118 -0
  11. package/dist/bench/main.js.map +1 -0
  12. package/dist/bench/model.d.ts +36 -0
  13. package/dist/bench/model.d.ts.map +1 -0
  14. package/dist/bench/model.js +112 -0
  15. package/dist/bench/model.js.map +1 -0
  16. package/dist/bench/tea.d.ts +14 -0
  17. package/dist/bench/tea.d.ts.map +1 -0
  18. package/dist/bench/tea.js +6 -0
  19. package/dist/bench/tea.js.map +1 -0
  20. package/dist/bench/view.d.ts +9 -0
  21. package/dist/bench/view.d.ts.map +1 -0
  22. package/dist/bench/view.js +88 -0
  23. package/dist/bench/view.js.map +1 -0
  24. package/dist/bench/worker.d.ts +6 -0
  25. package/dist/bench/worker.d.ts.map +1 -0
  26. package/dist/bench/worker.js +46 -0
  27. package/dist/bench/worker.js.map +1 -0
  28. package/dist/buffer/bgfx-mark.d.ts +32 -0
  29. package/dist/buffer/bgfx-mark.d.ts.map +1 -0
  30. package/dist/buffer/bgfx-mark.js +43 -0
  31. package/dist/buffer/bgfx-mark.js.map +1 -0
  32. package/dist/buffer/index.d.ts +191 -0
  33. package/dist/buffer/index.d.ts.map +1 -0
  34. package/dist/buffer/index.js +353 -0
  35. package/dist/buffer/index.js.map +1 -0
  36. package/dist/capabilities/env.d.ts +23 -0
  37. package/dist/capabilities/env.d.ts.map +1 -0
  38. package/dist/capabilities/env.js +35 -0
  39. package/dist/capabilities/env.js.map +1 -0
  40. package/dist/capabilities/index.d.ts +13 -0
  41. package/dist/capabilities/index.d.ts.map +1 -0
  42. package/dist/capabilities/index.js +13 -0
  43. package/dist/capabilities/index.js.map +1 -0
  44. package/dist/capabilities/parse.d.ts +41 -0
  45. package/dist/capabilities/parse.d.ts.map +1 -0
  46. package/dist/capabilities/parse.js +86 -0
  47. package/dist/capabilities/parse.js.map +1 -0
  48. package/dist/capabilities/probe.d.ts +37 -0
  49. package/dist/capabilities/probe.d.ts.map +1 -0
  50. package/dist/capabilities/probe.js +75 -0
  51. package/dist/capabilities/probe.js.map +1 -0
  52. package/dist/capabilities/sequences.d.ts +33 -0
  53. package/dist/capabilities/sequences.d.ts.map +1 -0
  54. package/dist/capabilities/sequences.js +36 -0
  55. package/dist/capabilities/sequences.js.map +1 -0
  56. package/dist/capabilities/types.d.ts +25 -0
  57. package/dist/capabilities/types.d.ts.map +1 -0
  58. package/dist/capabilities/types.js +5 -0
  59. package/dist/capabilities/types.js.map +1 -0
  60. package/dist/index.d.ts +11 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +11 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/input/decode.d.ts +167 -0
  65. package/dist/input/decode.d.ts.map +1 -0
  66. package/dist/input/decode.js +825 -0
  67. package/dist/input/decode.js.map +1 -0
  68. package/dist/input/draft.d.ts +85 -0
  69. package/dist/input/draft.d.ts.map +1 -0
  70. package/dist/input/draft.js +276 -0
  71. package/dist/input/draft.js.map +1 -0
  72. package/dist/input/index.d.ts +3 -0
  73. package/dist/input/index.d.ts.map +1 -0
  74. package/dist/input/index.js +3 -0
  75. package/dist/input/index.js.map +1 -0
  76. package/dist/input/prompt-blocks.d.ts +58 -0
  77. package/dist/input/prompt-blocks.d.ts.map +1 -0
  78. package/dist/input/prompt-blocks.js +48 -0
  79. package/dist/input/prompt-blocks.js.map +1 -0
  80. package/dist/input/rich-draft.d.ts +46 -0
  81. package/dist/input/rich-draft.d.ts.map +1 -0
  82. package/dist/input/rich-draft.js +391 -0
  83. package/dist/input/rich-draft.js.map +1 -0
  84. package/dist/input/rich-hit.d.ts +17 -0
  85. package/dist/input/rich-hit.d.ts.map +1 -0
  86. package/dist/input/rich-hit.js +89 -0
  87. package/dist/input/rich-hit.js.map +1 -0
  88. package/dist/input/rich-intake.d.ts +16 -0
  89. package/dist/input/rich-intake.d.ts.map +1 -0
  90. package/dist/input/rich-intake.js +22 -0
  91. package/dist/input/rich-intake.js.map +1 -0
  92. package/dist/input/rich-paint.d.ts +13 -0
  93. package/dist/input/rich-paint.d.ts.map +1 -0
  94. package/dist/input/rich-paint.js +18 -0
  95. package/dist/input/rich-paint.js.map +1 -0
  96. package/dist/internals/bgfx/index.d.ts +17 -0
  97. package/dist/internals/bgfx/index.d.ts.map +1 -0
  98. package/dist/internals/bgfx/index.js +17 -0
  99. package/dist/internals/bgfx/index.js.map +1 -0
  100. package/dist/internals/bgfx/materialize.d.ts +31 -0
  101. package/dist/internals/bgfx/materialize.d.ts.map +1 -0
  102. package/dist/internals/bgfx/materialize.js +117 -0
  103. package/dist/internals/bgfx/materialize.js.map +1 -0
  104. package/dist/internals/bgfx/opacity.d.ts +37 -0
  105. package/dist/internals/bgfx/opacity.d.ts.map +1 -0
  106. package/dist/internals/bgfx/opacity.js +76 -0
  107. package/dist/internals/bgfx/opacity.js.map +1 -0
  108. package/dist/internals/bgfx/registry.d.ts +13 -0
  109. package/dist/internals/bgfx/registry.d.ts.map +1 -0
  110. package/dist/internals/bgfx/registry.js +24 -0
  111. package/dist/internals/bgfx/registry.js.map +1 -0
  112. package/dist/internals/bgfx/sab-layout.d.ts +61 -0
  113. package/dist/internals/bgfx/sab-layout.d.ts.map +1 -0
  114. package/dist/internals/bgfx/sab-layout.js +107 -0
  115. package/dist/internals/bgfx/sab-layout.js.map +1 -0
  116. package/dist/internals/bgfx/shader-frame-host.d.ts +22 -0
  117. package/dist/internals/bgfx/shader-frame-host.d.ts.map +1 -0
  118. package/dist/internals/bgfx/shader-frame-host.js +165 -0
  119. package/dist/internals/bgfx/shader-frame-host.js.map +1 -0
  120. package/dist/internals/bgfx/shadertoy-catalog.d.ts +41 -0
  121. package/dist/internals/bgfx/shadertoy-catalog.d.ts.map +1 -0
  122. package/dist/internals/bgfx/shadertoy-catalog.js +200 -0
  123. package/dist/internals/bgfx/shadertoy-catalog.js.map +1 -0
  124. package/dist/internals/bgfx/shadertoy-gl.d.ts +38 -0
  125. package/dist/internals/bgfx/shadertoy-gl.d.ts.map +1 -0
  126. package/dist/internals/bgfx/shadertoy-gl.js +283 -0
  127. package/dist/internals/bgfx/shadertoy-gl.js.map +1 -0
  128. package/dist/internals/bgfx/types.d.ts +51 -0
  129. package/dist/internals/bgfx/types.d.ts.map +1 -0
  130. package/dist/internals/bgfx/types.js +14 -0
  131. package/dist/internals/bgfx/types.js.map +1 -0
  132. package/dist/internals/bgfx-worker.d.ts +6 -0
  133. package/dist/internals/bgfx-worker.d.ts.map +1 -0
  134. package/dist/internals/bgfx-worker.js +131 -0
  135. package/dist/internals/bgfx-worker.js.map +1 -0
  136. package/dist/layout/birth.d.ts +77 -0
  137. package/dist/layout/birth.d.ts.map +1 -0
  138. package/dist/layout/birth.js +148 -0
  139. package/dist/layout/birth.js.map +1 -0
  140. package/dist/layout/children.d.ts +5 -0
  141. package/dist/layout/children.d.ts.map +1 -0
  142. package/dist/layout/children.js +19 -0
  143. package/dist/layout/children.js.map +1 -0
  144. package/dist/layout/chrome_frame.d.ts +254 -0
  145. package/dist/layout/chrome_frame.d.ts.map +1 -0
  146. package/dist/layout/chrome_frame.js +1080 -0
  147. package/dist/layout/chrome_frame.js.map +1 -0
  148. package/dist/layout/chrome_mask.d.ts +40 -0
  149. package/dist/layout/chrome_mask.d.ts.map +1 -0
  150. package/dist/layout/chrome_mask.js +150 -0
  151. package/dist/layout/chrome_mask.js.map +1 -0
  152. package/dist/layout/engine.d.ts +49 -0
  153. package/dist/layout/engine.d.ts.map +1 -0
  154. package/dist/layout/engine.js +1269 -0
  155. package/dist/layout/engine.js.map +1 -0
  156. package/dist/layout/flex.d.ts +36 -0
  157. package/dist/layout/flex.d.ts.map +1 -0
  158. package/dist/layout/flex.js +111 -0
  159. package/dist/layout/flex.js.map +1 -0
  160. package/dist/layout/grid.d.ts +36 -0
  161. package/dist/layout/grid.d.ts.map +1 -0
  162. package/dist/layout/grid.js +126 -0
  163. package/dist/layout/grid.js.map +1 -0
  164. package/dist/layout/index.d.ts +30 -0
  165. package/dist/layout/index.d.ts.map +1 -0
  166. package/dist/layout/index.js +30 -0
  167. package/dist/layout/index.js.map +1 -0
  168. package/dist/layout/indication.d.ts +34 -0
  169. package/dist/layout/indication.d.ts.map +1 -0
  170. package/dist/layout/indication.js +68 -0
  171. package/dist/layout/indication.js.map +1 -0
  172. package/dist/layout/length.d.ts +18 -0
  173. package/dist/layout/length.d.ts.map +1 -0
  174. package/dist/layout/length.js +24 -0
  175. package/dist/layout/length.js.map +1 -0
  176. package/dist/layout/live_paint.d.ts +145 -0
  177. package/dist/layout/live_paint.d.ts.map +1 -0
  178. package/dist/layout/live_paint.js +255 -0
  179. package/dist/layout/live_paint.js.map +1 -0
  180. package/dist/layout/markdown.d.ts +22 -0
  181. package/dist/layout/markdown.d.ts.map +1 -0
  182. package/dist/layout/markdown.js +167 -0
  183. package/dist/layout/markdown.js.map +1 -0
  184. package/dist/layout/measure.d.ts +46 -0
  185. package/dist/layout/measure.d.ts.map +1 -0
  186. package/dist/layout/measure.js +307 -0
  187. package/dist/layout/measure.js.map +1 -0
  188. package/dist/layout/paint-hotkey.d.ts +45 -0
  189. package/dist/layout/paint-hotkey.d.ts.map +1 -0
  190. package/dist/layout/paint-hotkey.js +152 -0
  191. package/dist/layout/paint-hotkey.js.map +1 -0
  192. package/dist/layout/paint.d.ts +25 -0
  193. package/dist/layout/paint.d.ts.map +1 -0
  194. package/dist/layout/paint.js +189 -0
  195. package/dist/layout/paint.js.map +1 -0
  196. package/dist/layout/paint_theme.d.ts +85 -0
  197. package/dist/layout/paint_theme.d.ts.map +1 -0
  198. package/dist/layout/paint_theme.js +76 -0
  199. package/dist/layout/paint_theme.js.map +1 -0
  200. package/dist/layout/progress.d.ts +31 -0
  201. package/dist/layout/progress.d.ts.map +1 -0
  202. package/dist/layout/progress.js +83 -0
  203. package/dist/layout/progress.js.map +1 -0
  204. package/dist/layout/selection.d.ts +136 -0
  205. package/dist/layout/selection.d.ts.map +1 -0
  206. package/dist/layout/selection.js +312 -0
  207. package/dist/layout/selection.js.map +1 -0
  208. package/dist/layout/selection_gesture.d.ts +88 -0
  209. package/dist/layout/selection_gesture.d.ts.map +1 -0
  210. package/dist/layout/selection_gesture.js +239 -0
  211. package/dist/layout/selection_gesture.js.map +1 -0
  212. package/dist/layout/selection_paint.d.ts +47 -0
  213. package/dist/layout/selection_paint.d.ts.map +1 -0
  214. package/dist/layout/selection_paint.js +320 -0
  215. package/dist/layout/selection_paint.js.map +1 -0
  216. package/dist/layout/serialize.d.ts +49 -0
  217. package/dist/layout/serialize.d.ts.map +1 -0
  218. package/dist/layout/serialize.js +437 -0
  219. package/dist/layout/serialize.js.map +1 -0
  220. package/dist/layout/squeeze.d.ts +58 -0
  221. package/dist/layout/squeeze.d.ts.map +1 -0
  222. package/dist/layout/squeeze.js +239 -0
  223. package/dist/layout/squeeze.js.map +1 -0
  224. package/dist/layout/text.d.ts +44 -0
  225. package/dist/layout/text.d.ts.map +1 -0
  226. package/dist/layout/text.js +230 -0
  227. package/dist/layout/text.js.map +1 -0
  228. package/dist/layout/theme_store.d.ts +21 -0
  229. package/dist/layout/theme_store.d.ts.map +1 -0
  230. package/dist/layout/theme_store.js +133 -0
  231. package/dist/layout/theme_store.js.map +1 -0
  232. package/dist/layout/types.d.ts +564 -0
  233. package/dist/layout/types.d.ts.map +1 -0
  234. package/dist/layout/types.js +2 -0
  235. package/dist/layout/types.js.map +1 -0
  236. package/dist/layout/visual_draft.d.ts +60 -0
  237. package/dist/layout/visual_draft.d.ts.map +1 -0
  238. package/dist/layout/visual_draft.js +199 -0
  239. package/dist/layout/visual_draft.js.map +1 -0
  240. package/dist/lexicon/color.d.ts +22 -0
  241. package/dist/lexicon/color.d.ts.map +1 -0
  242. package/dist/lexicon/color.js +6 -0
  243. package/dist/lexicon/color.js.map +1 -0
  244. package/dist/lexicon/index.d.ts +15 -0
  245. package/dist/lexicon/index.d.ts.map +1 -0
  246. package/dist/lexicon/index.js +15 -0
  247. package/dist/lexicon/index.js.map +1 -0
  248. package/dist/lexicon/prominence.d.ts +46 -0
  249. package/dist/lexicon/prominence.d.ts.map +1 -0
  250. package/dist/lexicon/prominence.js +73 -0
  251. package/dist/lexicon/prominence.js.map +1 -0
  252. package/dist/lexicon/quarantine.d.ts +21 -0
  253. package/dist/lexicon/quarantine.d.ts.map +1 -0
  254. package/dist/lexicon/quarantine.js +15 -0
  255. package/dist/lexicon/quarantine.js.map +1 -0
  256. package/dist/lexicon/roles.d.ts +37 -0
  257. package/dist/lexicon/roles.d.ts.map +1 -0
  258. package/dist/lexicon/roles.js +52 -0
  259. package/dist/lexicon/roles.js.map +1 -0
  260. package/dist/lexicon/tiers.d.ts +18 -0
  261. package/dist/lexicon/tiers.d.ts.map +1 -0
  262. package/dist/lexicon/tiers.js +17 -0
  263. package/dist/lexicon/tiers.js.map +1 -0
  264. package/dist/measure/index.d.ts +43 -0
  265. package/dist/measure/index.d.ts.map +1 -0
  266. package/dist/measure/index.js +120 -0
  267. package/dist/measure/index.js.map +1 -0
  268. package/dist/render.d.ts +72 -0
  269. package/dist/render.d.ts.map +1 -0
  270. package/dist/render.js +164 -0
  271. package/dist/render.js.map +1 -0
  272. package/dist/runtime/agents_keys.d.ts +8 -0
  273. package/dist/runtime/agents_keys.d.ts.map +1 -0
  274. package/dist/runtime/agents_keys.js +24 -0
  275. package/dist/runtime/agents_keys.js.map +1 -0
  276. package/dist/runtime/agents_peek.d.ts +44 -0
  277. package/dist/runtime/agents_peek.d.ts.map +1 -0
  278. package/dist/runtime/agents_peek.js +96 -0
  279. package/dist/runtime/agents_peek.js.map +1 -0
  280. package/dist/runtime/agents_preview.d.ts +27 -0
  281. package/dist/runtime/agents_preview.d.ts.map +1 -0
  282. package/dist/runtime/agents_preview.js +122 -0
  283. package/dist/runtime/agents_preview.js.map +1 -0
  284. package/dist/runtime/box_bus.d.ts +144 -0
  285. package/dist/runtime/box_bus.d.ts.map +1 -0
  286. package/dist/runtime/box_bus.js +74 -0
  287. package/dist/runtime/box_bus.js.map +1 -0
  288. package/dist/runtime/clipboard-image.d.ts +20 -0
  289. package/dist/runtime/clipboard-image.d.ts.map +1 -0
  290. package/dist/runtime/clipboard-image.js +62 -0
  291. package/dist/runtime/clipboard-image.js.map +1 -0
  292. package/dist/runtime/copy_toast.d.ts +46 -0
  293. package/dist/runtime/copy_toast.d.ts.map +1 -0
  294. package/dist/runtime/copy_toast.js +117 -0
  295. package/dist/runtime/copy_toast.js.map +1 -0
  296. package/dist/runtime/echo.d.ts +41 -0
  297. package/dist/runtime/echo.d.ts.map +1 -0
  298. package/dist/runtime/echo.js +112 -0
  299. package/dist/runtime/echo.js.map +1 -0
  300. package/dist/runtime/frame.d.ts +79 -0
  301. package/dist/runtime/frame.d.ts.map +1 -0
  302. package/dist/runtime/frame.js +258 -0
  303. package/dist/runtime/frame.js.map +1 -0
  304. package/dist/runtime/index.d.ts +16 -0
  305. package/dist/runtime/index.d.ts.map +1 -0
  306. package/dist/runtime/index.js +16 -0
  307. package/dist/runtime/index.js.map +1 -0
  308. package/dist/runtime/key_buffer.d.ts +19 -0
  309. package/dist/runtime/key_buffer.d.ts.map +1 -0
  310. package/dist/runtime/key_buffer.js +24 -0
  311. package/dist/runtime/key_buffer.js.map +1 -0
  312. package/dist/runtime/keys.d.ts +66 -0
  313. package/dist/runtime/keys.d.ts.map +1 -0
  314. package/dist/runtime/keys.js +220 -0
  315. package/dist/runtime/keys.js.map +1 -0
  316. package/dist/runtime/paint_snapshot.d.ts +9 -0
  317. package/dist/runtime/paint_snapshot.d.ts.map +1 -0
  318. package/dist/runtime/paint_snapshot.js +8 -0
  319. package/dist/runtime/paint_snapshot.js.map +1 -0
  320. package/dist/runtime/paint_source.d.ts +266 -0
  321. package/dist/runtime/paint_source.d.ts.map +1 -0
  322. package/dist/runtime/paint_source.js +532 -0
  323. package/dist/runtime/paint_source.js.map +1 -0
  324. package/dist/runtime/present_loop.d.ts +11 -0
  325. package/dist/runtime/present_loop.d.ts.map +1 -0
  326. package/dist/runtime/present_loop.js +46 -0
  327. package/dist/runtime/present_loop.js.map +1 -0
  328. package/dist/runtime/present_profile.d.ts +58 -0
  329. package/dist/runtime/present_profile.d.ts.map +1 -0
  330. package/dist/runtime/present_profile.js +130 -0
  331. package/dist/runtime/present_profile.js.map +1 -0
  332. package/dist/runtime/raster.d.ts +24 -0
  333. package/dist/runtime/raster.d.ts.map +1 -0
  334. package/dist/runtime/raster.js +43 -0
  335. package/dist/runtime/raster.js.map +1 -0
  336. package/dist/runtime/renderer.d.ts +151 -0
  337. package/dist/runtime/renderer.d.ts.map +1 -0
  338. package/dist/runtime/renderer.js +1607 -0
  339. package/dist/runtime/renderer.js.map +1 -0
  340. package/dist/runtime/screenshot.d.ts +9 -0
  341. package/dist/runtime/screenshot.d.ts.map +1 -0
  342. package/dist/runtime/screenshot.js +111 -0
  343. package/dist/runtime/screenshot.js.map +1 -0
  344. package/dist/runtime/selection_host.d.ts +41 -0
  345. package/dist/runtime/selection_host.d.ts.map +1 -0
  346. package/dist/runtime/selection_host.js +190 -0
  347. package/dist/runtime/selection_host.js.map +1 -0
  348. package/dist/runtime/stderr_hold.d.ts +16 -0
  349. package/dist/runtime/stderr_hold.d.ts.map +1 -0
  350. package/dist/runtime/stderr_hold.js +23 -0
  351. package/dist/runtime/stderr_hold.js.map +1 -0
  352. package/dist/runtime/thought_birth.d.ts +25 -0
  353. package/dist/runtime/thought_birth.d.ts.map +1 -0
  354. package/dist/runtime/thought_birth.js +122 -0
  355. package/dist/runtime/thought_birth.js.map +1 -0
  356. package/dist/runtime/thought_collapsed.d.ts +35 -0
  357. package/dist/runtime/thought_collapsed.d.ts.map +1 -0
  358. package/dist/runtime/thought_collapsed.js +94 -0
  359. package/dist/runtime/thought_collapsed.js.map +1 -0
  360. package/dist/runtime/tty.d.ts +58 -0
  361. package/dist/runtime/tty.d.ts.map +1 -0
  362. package/dist/runtime/tty.js +130 -0
  363. package/dist/runtime/tty.js.map +1 -0
  364. package/dist/theme/ansi16.d.ts +34 -0
  365. package/dist/theme/ansi16.d.ts.map +1 -0
  366. package/dist/theme/ansi16.js +181 -0
  367. package/dist/theme/ansi16.js.map +1 -0
  368. package/dist/theme/ansi256.d.ts +15 -0
  369. package/dist/theme/ansi256.d.ts.map +1 -0
  370. package/dist/theme/ansi256.js +94 -0
  371. package/dist/theme/ansi256.js.map +1 -0
  372. package/dist/theme/ground.d.ts +8 -0
  373. package/dist/theme/ground.d.ts.map +1 -0
  374. package/dist/theme/ground.js +11 -0
  375. package/dist/theme/ground.js.map +1 -0
  376. package/dist/theme/index.d.ts +10 -0
  377. package/dist/theme/index.d.ts.map +1 -0
  378. package/dist/theme/index.js +10 -0
  379. package/dist/theme/index.js.map +1 -0
  380. package/dist/theme/region.d.ts +42 -0
  381. package/dist/theme/region.d.ts.map +1 -0
  382. package/dist/theme/region.js +105 -0
  383. package/dist/theme/region.js.map +1 -0
  384. package/dist/theme/resolver.d.ts +126 -0
  385. package/dist/theme/resolver.d.ts.map +1 -0
  386. package/dist/theme/resolver.js +366 -0
  387. package/dist/theme/resolver.js.map +1 -0
  388. package/dist/theme/salience.d.ts +90 -0
  389. package/dist/theme/salience.d.ts.map +1 -0
  390. package/dist/theme/salience.js +208 -0
  391. package/dist/theme/salience.js.map +1 -0
  392. package/dist/theme/seeds.d.ts +113 -0
  393. package/dist/theme/seeds.d.ts.map +1 -0
  394. package/dist/theme/seeds.js +52 -0
  395. package/dist/theme/seeds.js.map +1 -0
  396. package/dist/theme/selection.d.ts +94 -0
  397. package/dist/theme/selection.d.ts.map +1 -0
  398. package/dist/theme/selection.js +135 -0
  399. package/dist/theme/selection.js.map +1 -0
  400. package/dist/theme/theme.d.ts +41 -0
  401. package/dist/theme/theme.d.ts.map +1 -0
  402. package/dist/theme/theme.js +34 -0
  403. package/dist/theme/theme.js.map +1 -0
  404. package/dist/widgets/composer-caret.d.ts +47 -0
  405. package/dist/widgets/composer-caret.d.ts.map +1 -0
  406. package/dist/widgets/composer-caret.js +90 -0
  407. package/dist/widgets/composer-caret.js.map +1 -0
  408. package/dist/widgets/composer-click.d.ts +30 -0
  409. package/dist/widgets/composer-click.d.ts.map +1 -0
  410. package/dist/widgets/composer-click.js +89 -0
  411. package/dist/widgets/composer-click.js.map +1 -0
  412. package/dist/widgets/composer-command.d.ts +64 -0
  413. package/dist/widgets/composer-command.d.ts.map +1 -0
  414. package/dist/widgets/composer-command.js +127 -0
  415. package/dist/widgets/composer-command.js.map +1 -0
  416. package/dist/widgets/composer-frame.d.ts +74 -0
  417. package/dist/widgets/composer-frame.d.ts.map +1 -0
  418. package/dist/widgets/composer-frame.js +284 -0
  419. package/dist/widgets/composer-frame.js.map +1 -0
  420. package/dist/widgets/composer-picker.d.ts +89 -0
  421. package/dist/widgets/composer-picker.d.ts.map +1 -0
  422. package/dist/widgets/composer-picker.js +240 -0
  423. package/dist/widgets/composer-picker.js.map +1 -0
  424. package/dist/widgets/diff.d.ts +11 -0
  425. package/dist/widgets/diff.d.ts.map +1 -0
  426. package/dist/widgets/diff.js +19 -0
  427. package/dist/widgets/diff.js.map +1 -0
  428. package/dist/widgets/expand.d.ts +28 -0
  429. package/dist/widgets/expand.d.ts.map +1 -0
  430. package/dist/widgets/expand.js +94 -0
  431. package/dist/widgets/expand.js.map +1 -0
  432. package/dist/widgets/index.d.ts +126 -0
  433. package/dist/widgets/index.d.ts.map +1 -0
  434. package/dist/widgets/index.js +455 -0
  435. package/dist/widgets/index.js.map +1 -0
  436. package/dist/widgets/internals/arrival-lang.d.ts +88 -0
  437. package/dist/widgets/internals/arrival-lang.d.ts.map +1 -0
  438. package/dist/widgets/internals/arrival-lang.js +211 -0
  439. package/dist/widgets/internals/arrival-lang.js.map +1 -0
  440. package/dist/widgets/internals/diff-expand.d.ts +93 -0
  441. package/dist/widgets/internals/diff-expand.d.ts.map +1 -0
  442. package/dist/widgets/internals/diff-expand.js +1106 -0
  443. package/dist/widgets/internals/diff-expand.js.map +1 -0
  444. package/dist/widgets/internals/embedded-syntax.d.ts +62 -0
  445. package/dist/widgets/internals/embedded-syntax.d.ts.map +1 -0
  446. package/dist/widgets/internals/embedded-syntax.js +465 -0
  447. package/dist/widgets/internals/embedded-syntax.js.map +1 -0
  448. package/dist/widgets/internals/markdown-expand.d.ts +57 -0
  449. package/dist/widgets/internals/markdown-expand.d.ts.map +1 -0
  450. package/dist/widgets/internals/markdown-expand.js +980 -0
  451. package/dist/widgets/internals/markdown-expand.js.map +1 -0
  452. package/dist/widgets/internals/overlay-syntax.d.ts +24 -0
  453. package/dist/widgets/internals/overlay-syntax.d.ts.map +1 -0
  454. package/dist/widgets/internals/overlay-syntax.js +90 -0
  455. package/dist/widgets/internals/overlay-syntax.js.map +1 -0
  456. package/dist/widgets/internals/pierre-parse/cleanLastNewline.d.ts +6 -0
  457. package/dist/widgets/internals/pierre-parse/cleanLastNewline.d.ts.map +1 -0
  458. package/dist/widgets/internals/pierre-parse/cleanLastNewline.js +8 -0
  459. package/dist/widgets/internals/pierre-parse/cleanLastNewline.js.map +1 -0
  460. package/dist/widgets/internals/pierre-parse/constants.d.ts +13 -0
  461. package/dist/widgets/internals/pierre-parse/constants.d.ts.map +1 -0
  462. package/dist/widgets/internals/pierre-parse/constants.js +13 -0
  463. package/dist/widgets/internals/pierre-parse/constants.js.map +1 -0
  464. package/dist/widgets/internals/pierre-parse/detachString.d.ts +3 -0
  465. package/dist/widgets/internals/pierre-parse/detachString.d.ts.map +1 -0
  466. package/dist/widgets/internals/pierre-parse/detachString.js +24 -0
  467. package/dist/widgets/internals/pierre-parse/detachString.js.map +1 -0
  468. package/dist/widgets/internals/pierre-parse/index.d.ts +8 -0
  469. package/dist/widgets/internals/pierre-parse/index.d.ts.map +1 -0
  470. package/dist/widgets/internals/pierre-parse/index.js +8 -0
  471. package/dist/widgets/internals/pierre-parse/index.js.map +1 -0
  472. package/dist/widgets/internals/pierre-parse/parseDiffFromFile.d.ts +15 -0
  473. package/dist/widgets/internals/pierre-parse/parseDiffFromFile.d.ts.map +1 -0
  474. package/dist/widgets/internals/pierre-parse/parseDiffFromFile.js +39 -0
  475. package/dist/widgets/internals/pierre-parse/parseDiffFromFile.js.map +1 -0
  476. package/dist/widgets/internals/pierre-parse/parsePatchFiles.d.ts +11 -0
  477. package/dist/widgets/internals/pierre-parse/parsePatchFiles.d.ts.map +1 -0
  478. package/dist/widgets/internals/pierre-parse/parsePatchFiles.js +621 -0
  479. package/dist/widgets/internals/pierre-parse/parsePatchFiles.js.map +1 -0
  480. package/dist/widgets/internals/pierre-parse/types.d.ts +73 -0
  481. package/dist/widgets/internals/pierre-parse/types.d.ts.map +1 -0
  482. package/dist/widgets/internals/pierre-parse/types.js +7 -0
  483. package/dist/widgets/internals/pierre-parse/types.js.map +1 -0
  484. package/dist/widgets/internals/syntax.d.ts +55 -0
  485. package/dist/widgets/internals/syntax.d.ts.map +1 -0
  486. package/dist/widgets/internals/syntax.js +261 -0
  487. package/dist/widgets/internals/syntax.js.map +1 -0
  488. package/dist/widgets/markdown.d.ts +14 -0
  489. package/dist/widgets/markdown.d.ts.map +1 -0
  490. package/dist/widgets/markdown.js +9 -0
  491. package/dist/widgets/markdown.js.map +1 -0
  492. package/dist/widgets/shadow-stream.d.ts +88 -0
  493. package/dist/widgets/shadow-stream.d.ts.map +1 -0
  494. package/dist/widgets/shadow-stream.js +359 -0
  495. package/dist/widgets/shadow-stream.js.map +1 -0
  496. package/dist/widgets/speech.d.ts +36 -0
  497. package/dist/widgets/speech.d.ts.map +1 -0
  498. package/dist/widgets/speech.js +238 -0
  499. package/dist/widgets/speech.js.map +1 -0
  500. package/dist/widgets/stream-birth.d.ts +13 -0
  501. package/dist/widgets/stream-birth.d.ts.map +1 -0
  502. package/dist/widgets/stream-birth.js +70 -0
  503. package/dist/widgets/stream-birth.js.map +1 -0
  504. package/dist/widgets/syntax-boot.d.ts +25 -0
  505. package/dist/widgets/syntax-boot.d.ts.map +1 -0
  506. package/dist/widgets/syntax-boot.js +181 -0
  507. package/dist/widgets/syntax-boot.js.map +1 -0
  508. package/dist/widgets/text.d.ts +16 -0
  509. package/dist/widgets/text.d.ts.map +1 -0
  510. package/dist/widgets/text.js +14 -0
  511. package/dist/widgets/text.js.map +1 -0
  512. package/dist/widgets/transcript.d.ts +44 -0
  513. package/dist/widgets/transcript.d.ts.map +1 -0
  514. package/dist/widgets/transcript.js +106 -0
  515. package/dist/widgets/transcript.js.map +1 -0
  516. package/doom.vert +1840 -0
  517. package/fonts/DejaVuSans.ttf +0 -0
  518. package/fonts/DejaVuSansMono.ttf +0 -0
  519. package/fonts/LICENSE-DejaVu.txt +187 -0
  520. package/fonts/README.md +6 -0
  521. package/gradient.vert +75 -0
  522. package/package.json +147 -4
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Build a solved Theme from seeds against terminal ground.
3
+ * Request roles — never claim raw hex in widgets.
4
+ */
5
+ import { type SolveOpts } from "./salience.js";
6
+ import { type SeedRow } from "./seeds.js";
7
+ import type { Rgb, SemanticRole } from "../lexicon/index.js";
8
+ export type Theme = {
9
+ id: string;
10
+ name: string;
11
+ /** Ground OKLCH L used to solve this theme. */
12
+ ground: number;
13
+ /** Solved role → hex. */
14
+ colors: Record<SemanticRole, string>;
15
+ /** Solved role → 0–255 RGB (truecolor paint). */
16
+ rgb: Record<SemanticRole, Rgb>;
17
+ /**
18
+ * "Background" hex of ground L (achromatic) — for docs/tests only.
19
+ * Never paint as default cell bg (TERMINAL O1: transparent inherit).
20
+ */
21
+ groundHex: string;
22
+ /**
23
+ * Terminal ground sRGB. OSC 11 when probed; otherwise the achromatic
24
+ * ground L. Transparent FG prominence dissolves toward this, not a
25
+ * phantom gray at the same lightness.
26
+ */
27
+ groundRgb: Rgb;
28
+ };
29
+ export type BuildThemeOpts = SolveOpts & {
30
+ seeds?: readonly SeedRow[];
31
+ id?: string;
32
+ name?: string;
33
+ /** Override ground; default REFERENCE_GROUND until OSC 11 wires. */
34
+ ground?: number;
35
+ /** Probed terminal background. When omitted, achromatic {@link ground}. */
36
+ groundRgb?: Rgb;
37
+ };
38
+ export declare function buildTheme(opts?: BuildThemeOpts): Theme;
39
+ /** Default dark-reference theme (tests + headless fallback). */
40
+ export declare const defaultTheme: Theme;
41
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/theme/theme.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAA8C,KAAK,SAAS,EAAY,MAAM,eAAe,CAAC;AACrG,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,MAAM,KAAK,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACrC,iDAAiD;IACjD,GAAG,EAAE,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAC/B;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,SAAS,EAAE,GAAG,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG;IACvC,KAAK,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,GAAG,CAAC;CACjB,CAAC;AAEF,wBAAgB,UAAU,CAAC,IAAI,GAAE,cAAmB,GAAG,KAAK,CA0B3D;AAED,gEAAgE;AAChE,eAAO,MAAM,YAAY,EAAE,KAAgD,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Build a solved Theme from seeds against terminal ground.
3
+ * Request roles — never claim raw hex in widgets.
4
+ */
5
+ import { oklchToHex, REFERENCE_GROUND, solvePalette, hexToRgb } from "./salience.js";
6
+ import { DEFAULT_SEEDS } from "./seeds.js";
7
+ export function buildTheme(opts = {}) {
8
+ const ground = opts.ground ?? REFERENCE_GROUND;
9
+ const seeds = opts.seeds ?? DEFAULT_SEEDS;
10
+ const palette = solvePalette(seeds, {
11
+ ground,
12
+ polarity: opts.polarity,
13
+ });
14
+ const colors = {};
15
+ const rgb = {};
16
+ for (const s of seeds) {
17
+ const hex = palette[s.name];
18
+ colors[s.name] = hex;
19
+ rgb[s.name] = hexToRgb(hex);
20
+ }
21
+ const groundHex = oklchToHex(ground, 0, 0);
22
+ return {
23
+ id: opts.id ?? "salience",
24
+ name: opts.name ?? "salience",
25
+ ground,
26
+ colors,
27
+ rgb,
28
+ groundHex,
29
+ groundRgb: opts.groundRgb ?? hexToRgb(groundHex),
30
+ };
31
+ }
32
+ /** Default dark-reference theme (tests + headless fallback). */
33
+ export const defaultTheme = buildTheme({ ground: REFERENCE_GROUND });
34
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/theme/theme.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,YAAY,EAAkB,QAAQ,EAAE,MAAM,eAAe,CAAC;AACrG,OAAO,EAAE,aAAa,EAAgB,MAAM,YAAY,CAAC;AAmCzD,MAAM,UAAU,UAAU,CAAC,OAAuB,EAAE;IAClD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,gBAAgB,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,aAAa,CAAC;IAC1C,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE;QAClC,MAAM;QACN,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,EAAkC,CAAC;IAClD,MAAM,GAAG,GAAG,EAA+B,CAAC;IAC5C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAE,CAAC;QAC7B,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;QACrB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3C,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,UAAU;QACzB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,UAAU;QAC7B,MAAM;QACN,MAAM;QACN,GAAG;QACH,SAAS;QACT,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC;KACjD,CAAC;AACJ,CAAC;AAED,gEAAgE;AAChE,MAAM,CAAC,MAAM,YAAY,GAAU,UAAU,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { type Frame } from "../layout/index.js";
2
+ export type CaretPark = {
3
+ readonly row: number;
4
+ readonly col: number;
5
+ readonly show: boolean;
6
+ };
7
+ export declare function composerOffsetAtCell(draft: string, col0: number, row0: number, origin: {
8
+ col: number;
9
+ row: number;
10
+ }, textW: number): number;
11
+ /** Exclusive end of the grapheme at this body cell (padding stays put). */
12
+ export declare function composerOffsetAfterCell(draft: string, col0: number, row0: number, origin: {
13
+ col: number;
14
+ row: number;
15
+ }, textW: number): number;
16
+ /**
17
+ * Visual composer selection → draft mark/cursor (textarea `[start, end)`).
18
+ * Cell hits land *before* a grapheme; the later endpoint is exclusive.
19
+ */
20
+ export declare function composerDraftSelectionFromCells(draft: string, anchor: {
21
+ col: number;
22
+ row: number;
23
+ }, active: {
24
+ col: number;
25
+ row: number;
26
+ }, origin: {
27
+ col: number;
28
+ row: number;
29
+ }, textW: number): {
30
+ cursor: number;
31
+ mark: number;
32
+ } | null;
33
+ /** 1-based CUP for the draft caret. termFocused false → hide. */
34
+ export declare function parkComposerCaret(opts: {
35
+ readonly draft: string;
36
+ readonly cursor: number;
37
+ readonly frame: Frame | null;
38
+ readonly cols: number;
39
+ readonly rows: number;
40
+ readonly termFocused: boolean;
41
+ /** Layout key for the chrome_frame draft surface. Default `composer:frame`. */
42
+ readonly composerFrameKey?: string;
43
+ }): CaretPark;
44
+ export declare const SHOW_CURSOR = "\u001B[?25h";
45
+ export declare const HIDE_CURSOR = "\u001B[?25l";
46
+ export declare function caretAnsi(park: CaretPark): string;
47
+ //# sourceMappingURL=composer-caret.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer-caret.d.ts","sourceRoot":"","sources":["../../src/widgets/composer-caret.ts"],"names":[],"mappings":"AAWA,OAAO,EAAuB,KAAK,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAErE,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB,CAAC;AAeF,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EACpC,KAAK,EAAE,MAAM,GACZ,MAAM,CAIR;AAED,2EAA2E;AAC3E,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EACpC,KAAK,EAAE,MAAM,GACZ,MAAM,CAIR;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,MAAM,EACb,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EACpC,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EACpC,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EACpC,KAAK,EAAE,MAAM,GACZ;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CASzC;AAED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,+EAA+E;IAC/E,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC,GAAG,SAAS,CAuCZ;AAED,eAAO,MAAM,WAAW,gBAAgB,CAAC;AACzC,eAAO,MAAM,WAAW,gBAAgB,CAAC;AAEzC,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAGjD"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * TTY caret park for the composer omnibox + click→offset inverse.
3
+ *
4
+ * Enter-alt hides the cursor (`?25l`). Every present tick must re-park/show
5
+ * when focused, or the caret vanishes after first paint ("losing focus").
6
+ *
7
+ * Prefer laid-out body hit for `composer:frame` (text column). Click→offset
8
+ * shares visualDraftLines with paint via widgets offsetAtVisualCell (not a
9
+ * local char-wrap walk).
10
+ */
11
+ import { offsetAfterVisualCell, offsetAtVisualCell } from "./composer-click.js";
12
+ import { visualCaretGeometry } from "../layout/index.js";
13
+ const DEFAULT_COMPOSER_FRAME_KEY = "composer:frame";
14
+ function localCell(col0, row0, origin) {
15
+ return {
16
+ localCol: Math.max(0, col0 - origin.col),
17
+ localRow: Math.max(0, row0 - origin.row),
18
+ };
19
+ }
20
+ export function composerOffsetAtCell(draft, col0, row0, origin, textW) {
21
+ const w = Math.max(1, textW);
22
+ const { localCol, localRow } = localCell(col0, row0, origin);
23
+ return offsetAtVisualCell(draft, w, localRow, localCol);
24
+ }
25
+ /** Exclusive end of the grapheme at this body cell (padding stays put). */
26
+ export function composerOffsetAfterCell(draft, col0, row0, origin, textW) {
27
+ const w = Math.max(1, textW);
28
+ const { localCol, localRow } = localCell(col0, row0, origin);
29
+ return offsetAfterVisualCell(draft, w, localRow, localCol);
30
+ }
31
+ /**
32
+ * Visual composer selection → draft mark/cursor (textarea `[start, end)`).
33
+ * Cell hits land *before* a grapheme; the later endpoint is exclusive.
34
+ */
35
+ export function composerDraftSelectionFromCells(draft, anchor, active, origin, textW) {
36
+ const before = (cell) => composerOffsetAtCell(draft, cell.col, cell.row, origin, textW);
37
+ const after = (cell) => composerOffsetAfterCell(draft, cell.col, cell.row, origin, textW);
38
+ const anchorFirst = anchor.row < active.row || (anchor.row === active.row && anchor.col <= active.col);
39
+ const mark = anchorFirst ? before(anchor) : after(anchor);
40
+ const cursor = anchorFirst ? after(active) : before(active);
41
+ if (mark === cursor)
42
+ return null;
43
+ return { cursor, mark };
44
+ }
45
+ /** 1-based CUP for the draft caret. termFocused false → hide. */
46
+ export function parkComposerCaret(opts) {
47
+ if (!opts.termFocused)
48
+ return { row: 1, col: 1, show: false };
49
+ const draft = opts.draft;
50
+ const cursor = Math.max(0, Math.min(draft.length, opts.cursor));
51
+ const frameKey = opts.composerFrameKey ?? DEFAULT_COMPOSER_FRAME_KEY;
52
+ const hit = opts.frame?.byKey.get(frameKey)?.hitRect;
53
+ // chrome_frame text column: hit.w (outer − 4: │ mark gap │), else estimate.
54
+ const textW = hit && hit.w > 0 ? hit.w : Math.max(8, opts.cols - 4);
55
+ // Same soft-wrap as ↑/↓: wrap-boundary offsets park on *next* row col 0,
56
+ // not trailing past the last glyph of the prior row.
57
+ const geom = visualCaretGeometry(draft, cursor, textW);
58
+ const line = geom.line;
59
+ const colInContent = geom.colInContent;
60
+ if (hit && hit.h > 0) {
61
+ // Never park on right border `│` (col === textW). Virtual line past bodyH
62
+ // → last body row, last cell.
63
+ const maxLine = Math.max(0, hit.h - 1);
64
+ const lineClamped = Math.min(line, maxLine);
65
+ const colIn = line > maxLine || colInContent >= textW ? Math.max(0, textW - 1) : colInContent;
66
+ const row = Math.min(opts.rows, Math.max(1, hit.y + 1 + lineClamped));
67
+ const col = Math.min(opts.cols, Math.max(1, hit.x + 1 + colIn));
68
+ return { row, col, show: true };
69
+ }
70
+ // Laid-out frame without composer:frame — hide. A fallback CUP+?25h on a
71
+ // catalog/demo paint is a visible hop every live tick (no draft to park).
72
+ if (opts.frame !== null)
73
+ return { row: 1, col: 1, show: false };
74
+ // BOOT: caret must exist before first layout. Enter-alt hides (`?25l`);
75
+ // hiding here leaves the cursor gone until a frame exists. Floor is
76
+ // `rows-2` / `6+col` — a CUP into the composer band, not (1,1).
77
+ return {
78
+ row: Math.max(1, opts.rows - 2),
79
+ col: Math.min(opts.cols, 6 + colInContent),
80
+ show: true,
81
+ };
82
+ }
83
+ export const SHOW_CURSOR = "\u001B[?25h";
84
+ export const HIDE_CURSOR = "\u001B[?25l";
85
+ export function caretAnsi(park) {
86
+ if (!park.show)
87
+ return HIDE_CURSOR;
88
+ return `\u001B[${park.row};${park.col}H${SHOW_CURSOR}`;
89
+ }
90
+ //# sourceMappingURL=composer-caret.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer-caret.js","sourceRoot":"","sources":["../../src/widgets/composer-caret.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Composer click→caret — the inverse of {@link composerVisualGeometry}.
3
+ *
4
+ * Given a clicked cell inside the composer body, map it back to a character
5
+ * offset in the draft string. This is the #1 missing feature in AI-TUI peers
6
+ * (Claude Code, Gemini CLI, Codex all lack click-to-position-cursor).
7
+ *
8
+ * Uses the same visual line partition as paint/caret park:
9
+ * {@link visualDraftLines} → `wrapText` with `pre-wrap` (word-preferring soft
10
+ * wrap). Prior char-by-char walk disagreed with the renderer on space breaks
11
+ * (audit C5).
12
+ *
13
+ * CJK convention (neovim `vcol2col`): a wide char occupies 2 cells. Click on
14
+ * EITHER half of a wide char lands the cursor BEFORE it — never split a wide
15
+ * char.
16
+ *
17
+ * Padding clamps follow the browser `<textarea>` convention: clicks in the
18
+ * left padding clamp to line start; clicks past the line end clamp to the end
19
+ * of the logical line.
20
+ */
21
+ /**
22
+ * Map (visualLine, visualCol) → UTF-16 offset using the same line breaks as paint.
23
+ */
24
+ export declare function offsetAtVisualCell(draft: string, contentWidth: number, targetLine: number, targetCol: number): number;
25
+ /**
26
+ * Exclusive end of the grapheme painted at this cell.
27
+ * Padding / past-line cells stay at {@link offsetAtVisualCell} (already exclusive).
28
+ */
29
+ export declare function offsetAfterVisualCell(draft: string, contentWidth: number, targetLine: number, targetCol: number): number;
30
+ //# sourceMappingURL=composer-click.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer-click.d.ts","sourceRoot":"","sources":["../../src/widgets/composer-click.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAgCrH;AAcD;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,MAAM,CAUR"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Composer click→caret — the inverse of {@link composerVisualGeometry}.
3
+ *
4
+ * Given a clicked cell inside the composer body, map it back to a character
5
+ * offset in the draft string. This is the #1 missing feature in AI-TUI peers
6
+ * (Claude Code, Gemini CLI, Codex all lack click-to-position-cursor).
7
+ *
8
+ * Uses the same visual line partition as paint/caret park:
9
+ * {@link visualDraftLines} → `wrapText` with `pre-wrap` (word-preferring soft
10
+ * wrap). Prior char-by-char walk disagreed with the renderer on space breaks
11
+ * (audit C5).
12
+ *
13
+ * CJK convention (neovim `vcol2col`): a wide char occupies 2 cells. Click on
14
+ * EITHER half of a wide char lands the cursor BEFORE it — never split a wide
15
+ * char.
16
+ *
17
+ * Padding clamps follow the browser `<textarea>` convention: clicks in the
18
+ * left padding clamp to line start; clicks past the line end clamp to the end
19
+ * of the logical line.
20
+ */
21
+ import { visualDraftLines } from "../layout/index.js";
22
+ import { displayWidth } from "../measure/index.js";
23
+ /**
24
+ * Map (visualLine, visualCol) → UTF-16 offset using the same line breaks as paint.
25
+ */
26
+ export function offsetAtVisualCell(draft, contentWidth, targetLine, targetCol) {
27
+ const lines = visualDraftLines(draft, contentWidth);
28
+ if (lines.length === 0)
29
+ return 0;
30
+ if (targetLine >= lines.length) {
31
+ return lines.at(-1).end;
32
+ }
33
+ const line = lines[targetLine];
34
+ if (targetCol <= 0)
35
+ return line.start;
36
+ if (line.text.length === 0)
37
+ return line.start;
38
+ const segmenter = new Intl.Segmenter(undefined, { granularity: "grapheme" });
39
+ let colInLine = 0;
40
+ let offset = line.start;
41
+ for (const seg of segmenter.segment(line.text)) {
42
+ const segWidth = displayWidth(seg.segment);
43
+ // Click at or before this grapheme → land before it.
44
+ if (targetCol <= colInLine) {
45
+ return offset;
46
+ }
47
+ // Click inside a wide grapheme → land before it (don't split CJK).
48
+ if (targetCol < colInLine + segWidth) {
49
+ return offset;
50
+ }
51
+ colInLine += segWidth;
52
+ offset += seg.segment.length;
53
+ }
54
+ // Past end of visual line → clamp to line end (exclusive of following soft-wrap text).
55
+ return line.end;
56
+ }
57
+ function firstGraphemeLength(s) {
58
+ if (s.length === 0)
59
+ return 0;
60
+ try {
61
+ const it = new Intl.Segmenter(undefined, { granularity: "grapheme" }).segment(s)[Symbol.iterator]();
62
+ const first = it.next();
63
+ return first.done ? 0 : first.value.segment.length;
64
+ }
65
+ catch {
66
+ const cp = s.codePointAt(0);
67
+ return cp !== undefined && cp > 0xff_ff ? 2 : 1;
68
+ }
69
+ }
70
+ /**
71
+ * Exclusive end of the grapheme painted at this cell.
72
+ * Padding / past-line cells stay at {@link offsetAtVisualCell} (already exclusive).
73
+ */
74
+ export function offsetAfterVisualCell(draft, contentWidth, targetLine, targetCol) {
75
+ const start = offsetAtVisualCell(draft, contentWidth, targetLine, targetCol);
76
+ const next = offsetAtVisualCell(draft, contentWidth, targetLine, targetCol + 1);
77
+ if (next > start)
78
+ return next;
79
+ const lines = visualDraftLines(draft, Math.max(1, contentWidth));
80
+ if (lines.length === 0)
81
+ return start;
82
+ const line = lines[Math.min(Math.max(0, targetLine), lines.length - 1)];
83
+ if (start >= line.end)
84
+ return start;
85
+ if (targetCol >= displayWidth(line.text))
86
+ return start;
87
+ return start + firstGraphemeLength(draft.slice(start, line.end));
88
+ }
89
+ //# sourceMappingURL=composer-click.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer-click.js","sourceRoot":"","sources":["../../src/widgets/composer-click.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Composer command catalog + match.
3
+ *
4
+ * Pure. The widget paints the match; the worker calls the same matcher so
5
+ * autocomplete can notify on a prefix hit (`/conn` → `/connect` is active)
6
+ * without a function on the layout node.
7
+ *
8
+ * {@link autocompleteRemainder} is the dim suffix after the caret. It is not
9
+ * draft: caret, copy, and Tab rewrite stay on the typed prefix.
10
+ */
11
+ import type { ChromeHotkey } from "../layout/paint-hotkey.js";
12
+ export type ComposerCommand = {
13
+ readonly name: string;
14
+ readonly description?: string;
15
+ readonly aliases?: readonly string[];
16
+ };
17
+ export type ComposerCommandAction = {
18
+ readonly name: string;
19
+ readonly displayName: string;
20
+ readonly hotkey?: string;
21
+ };
22
+ export type ComposerCommandChoice = {
23
+ readonly key?: string;
24
+ readonly name: string;
25
+ readonly status?: string;
26
+ readonly annotation?: string;
27
+ readonly description?: string;
28
+ readonly actionDisplayName?: string;
29
+ readonly actions: readonly ComposerCommandAction[];
30
+ /** When set, the panel paints this URL as an accent+underline link. */
31
+ readonly href?: string;
32
+ };
33
+ /** Fallback row when choices are empty or the catalog missed. */
34
+ export type ComposerCommandFallback = {
35
+ readonly name: string;
36
+ readonly displayName: string;
37
+ readonly actions: readonly ComposerCommandAction[];
38
+ readonly href?: string;
39
+ };
40
+ export type ComposerCommandMatch = {
41
+ readonly matches: readonly ComposerCommand[];
42
+ readonly selected: ComposerCommand | null;
43
+ readonly selectedIndex: number;
44
+ };
45
+ /**
46
+ * Dim suffix after the typed prefix for the highlighted picker row.
47
+ *
48
+ * Catalog names start with `/` and complete the verb (`/con` → `nect`).
49
+ * Choice names do not: a bare verb gets a separating space (`/connect` →
50
+ * ` LM Studio`); a prefix of the name — spaces included — gets only the rest
51
+ * (`LM St` → `udio`). Empty when the prefix is already exact, is not a prefix
52
+ * of the name, or the draft is not a single-line slash command.
53
+ */
54
+ export declare function autocompleteRemainder(inputValue: string, selectedName: string): string;
55
+ /**
56
+ * Prefix match against `commands`. Empty draft / no leading `/` → no match.
57
+ * Selected is the first match (caller may override with an index).
58
+ */
59
+ export declare function matchComposerCommand(inputValue: string, commands: readonly ComposerCommand[]): ComposerCommandMatch;
60
+ export declare function commandToChoice(cmd: ComposerCommand): ComposerCommandChoice;
61
+ /** Chord/action pairs for the omnibox strip. */
62
+ export declare function actionHotkeys(actions: readonly ComposerCommandAction[] | undefined): ChromeHotkey[] | undefined;
63
+ export declare function fallbackToChoice(action: ComposerCommandFallback): ComposerCommandChoice;
64
+ //# sourceMappingURL=composer-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer-command.d.ts","sourceRoot":"","sources":["../../src/widgets/composer-command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACnD,uEAAuE;IACvE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,iEAAiE;AACjE,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACnD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC,CAAC;AAaF;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAkBtF;AAMD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,eAAe,EAAE,GAAG,oBAAoB,CAanH;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,eAAe,GAAG,qBAAqB,CAQ3E;AAED,gDAAgD;AAChD,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,qBAAqB,EAAE,GAAG,SAAS,GAAG,YAAY,EAAE,GAAG,SAAS,CAW/G;AAmBD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,uBAAuB,GAAG,qBAAqB,CAQvF"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Composer command catalog + match.
3
+ *
4
+ * Pure. The widget paints the match; the worker calls the same matcher so
5
+ * autocomplete can notify on a prefix hit (`/conn` → `/connect` is active)
6
+ * without a function on the layout node.
7
+ *
8
+ * {@link autocompleteRemainder} is the dim suffix after the caret. It is not
9
+ * draft: caret, copy, and Tab rewrite stay on the typed prefix.
10
+ */
11
+ import { catalogKey } from "./composer-picker.js";
12
+ function verbToken(inputValue) {
13
+ const first = (inputValue.split("\n")[0] ?? "").trim();
14
+ if (!first.startsWith("/"))
15
+ return "";
16
+ return (first.split(/\s/)[0] ?? "").slice(1).toLowerCase();
17
+ }
18
+ function commandNames(cmd) {
19
+ const names = [cmd.name, ...(cmd.aliases ?? [])];
20
+ return names.map((n) => n.replace(/^\//, "").toLowerCase());
21
+ }
22
+ /**
23
+ * Dim suffix after the typed prefix for the highlighted picker row.
24
+ *
25
+ * Catalog names start with `/` and complete the verb (`/con` → `nect`).
26
+ * Choice names do not: a bare verb gets a separating space (`/connect` →
27
+ * ` LM Studio`); a prefix of the name — spaces included — gets only the rest
28
+ * (`LM St` → `udio`). Empty when the prefix is already exact, is not a prefix
29
+ * of the name, or the draft is not a single-line slash command.
30
+ */
31
+ export function autocompleteRemainder(inputValue, selectedName) {
32
+ if (inputValue.includes("\n"))
33
+ return "";
34
+ const choice = selectedName.trim();
35
+ if (choice.length === 0)
36
+ return "";
37
+ const rest = inputValue.replace(/^\s*/, "");
38
+ if (!rest.startsWith("/"))
39
+ return "";
40
+ const sp = rest.search(/\s/);
41
+ if (choice.startsWith("/")) {
42
+ if (sp >= 0)
43
+ return "";
44
+ if (!startsWithInsensitive(choice, rest))
45
+ return "";
46
+ return choice.slice(rest.length);
47
+ }
48
+ if (sp < 0)
49
+ return ` ${choice}`;
50
+ const args = rest.slice(sp + 1);
51
+ if (!startsWithInsensitive(choice, args))
52
+ return "";
53
+ return choice.slice(args.length);
54
+ }
55
+ function startsWithInsensitive(full, prefix) {
56
+ return full.toLowerCase().startsWith(prefix.toLowerCase());
57
+ }
58
+ /**
59
+ * Prefix match against `commands`. Empty draft / no leading `/` → no match.
60
+ * Selected is the first match (caller may override with an index).
61
+ */
62
+ export function matchComposerCommand(inputValue, commands) {
63
+ const token = verbToken(inputValue);
64
+ if (token.length === 0 && !(inputValue.split("\n")[0] ?? "").trim().startsWith("/")) {
65
+ return { matches: [], selected: null, selectedIndex: 0 };
66
+ }
67
+ const matches = token.length === 0 ? commands : commands.filter((c) => commandNames(c).some((n) => n.startsWith(token)));
68
+ const selected = matches[0] ?? null;
69
+ return {
70
+ matches,
71
+ selected,
72
+ selectedIndex: selected ? 0 : 0,
73
+ };
74
+ }
75
+ export function commandToChoice(cmd) {
76
+ const name = cmd.name.startsWith("/") ? cmd.name : `/${cmd.name}`;
77
+ return {
78
+ key: catalogKey(name),
79
+ name,
80
+ description: cmd.description,
81
+ actions: [{ name: "select", displayName: "select", hotkey: "Enter" }],
82
+ };
83
+ }
84
+ /** Chord/action pairs for the omnibox strip. */
85
+ export function actionHotkeys(actions) {
86
+ if (actions === undefined)
87
+ return undefined;
88
+ const out = [];
89
+ for (const action of actions) {
90
+ const key = paintHotkey((action.hotkey ?? "").trim());
91
+ if (key.length === 0)
92
+ continue;
93
+ const label = (action.displayName || action.name).trim();
94
+ if (label.length === 0)
95
+ continue;
96
+ out.push({ key, action: label, event: action.name });
97
+ }
98
+ return out.length > 0 ? out : undefined;
99
+ }
100
+ /**
101
+ * STRIP vs STORAGE. Stored chords stay `escape` / `control-x` so
102
+ * `eventMatchesChord` matches. This function is display-only: the strip
103
+ * writes `Esc` / `Ctrl-x`. Normalizing storage to the strip form breaks matching.
104
+ */
105
+ function paintHotkey(hotkey) {
106
+ return hotkey
107
+ .split("-")
108
+ .map((part) => {
109
+ const lower = part.toLowerCase();
110
+ if (lower === "escape")
111
+ return "Esc";
112
+ if (lower === "control")
113
+ return "Ctrl";
114
+ return part;
115
+ })
116
+ .join("-");
117
+ }
118
+ export function fallbackToChoice(action) {
119
+ return {
120
+ name: action.displayName || action.name,
121
+ description: action.name,
122
+ actions: action.actions,
123
+ actionDisplayName: action.actions[0]?.displayName,
124
+ href: action.href,
125
+ };
126
+ }
127
+ //# sourceMappingURL=composer-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer-command.js","sourceRoot":"","sources":["../../src/widgets/composer-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * ComposerFrame — TEA widget leaf for boxed prompt chrome.
3
+ *
4
+ * One declaration. Values (draft, annotation, progress, status, command
5
+ * rows) ride the composer box; layout's `chrome_frame` strategy paints
6
+ * edges. Speculative echo and progress ease live on the host.
7
+ *
8
+ * @see quickdraw/layout/src/chrome_frame.ts
9
+ */
10
+ import { type ComposerCommand, type ComposerCommandChoice, type ComposerCommandFallback } from "./composer-command.js";
11
+ import { type ChromeHotkey, type ChromeQuotaWindow, type ChromeStatusItem, type LayoutNode } from "../layout/index.js";
12
+ export type ComposerErrorAnnotation = {
13
+ readonly level: "warning" | "error";
14
+ readonly message: string;
15
+ };
16
+ export type ComposerFrameModel = {
17
+ inputValue?: string;
18
+ placeholder?: string;
19
+ hotkeys?: readonly ChromeHotkey[] | null;
20
+ modHeld?: boolean;
21
+ annotation?: string | null;
22
+ /** T-join right-rail when stacked (session title above the input). */
23
+ joinAnnotation?: string | null;
24
+ /** Ignored here — Tea seats the error on the wait pin, not ╭╮. */
25
+ errorAnnotation?: ComposerErrorAnnotation | null;
26
+ progress?: number;
27
+ progressColor?: string;
28
+ progressGlowAt?: number;
29
+ progressAnnotation?: string | null;
30
+ statusItems?: readonly ChromeStatusItem[];
31
+ quotaWindows?: readonly ChromeQuotaWindow[];
32
+ contextUsed?: number;
33
+ contextLimit?: number;
34
+ contourRole?: string;
35
+ commands?: readonly ComposerCommand[];
36
+ /** When set (even empty), wins over {@link commands} for the panel. */
37
+ commandChoices?: readonly ComposerCommandChoice[];
38
+ commandAction?: ComposerCommandFallback | null;
39
+ /** Wins the ╭╮ annotation slot when there is no stack. */
40
+ commandAnnotation?: string | null;
41
+ /** Wins over {@link selectedCommandIndex}. */
42
+ selectedCommandKey?: string | null;
43
+ selectedCommandIndex?: number;
44
+ scrollOffset?: number;
45
+ pickerHoverKey?: string | null;
46
+ pickerPressKey?: string | null;
47
+ pickerViewport?: number;
48
+ /** Ignored when a picker is open. Empty / omitted → no panel. */
49
+ stackedBody?: string | null;
50
+ stackedViewport?: number;
51
+ /** MCP confirm stays off. */
52
+ stackedNumbered?: boolean;
53
+ /** Numbered stacks ignore this. */
54
+ stackedLang?: string | null;
55
+ glyph?: string;
56
+ cursor?: number;
57
+ mark?: number | null;
58
+ interactive?: boolean;
59
+ readOnly?: boolean;
60
+ selected?: boolean;
61
+ };
62
+ export type ComposerFrameOpts = {
63
+ key: string;
64
+ width: number;
65
+ omitTop?: boolean;
66
+ joinTop?: boolean;
67
+ joinBottom?: boolean;
68
+ plainBottom?: boolean;
69
+ };
70
+ /**
71
+ * TEA leaf: model → `chrome_frame` (plus a T-joined command panel when open).
72
+ */
73
+ export declare function ComposerFrame(model: ComposerFrameModel, opts: ComposerFrameOpts): LayoutNode;
74
+ //# sourceMappingURL=composer-frame.d.ts.map