@valyrianjs/terminal 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/ansi.d.ts +2 -0
  2. package/dist/ansi.d.ts.map +1 -1
  3. package/dist/ansi.js +12 -0
  4. package/dist/ansi.js.map +1 -1
  5. package/dist/events.d.ts.map +1 -1
  6. package/dist/events.js +6 -2
  7. package/dist/events.js.map +1 -1
  8. package/dist/keymap.d.ts.map +1 -1
  9. package/dist/keymap.js +4 -2
  10. package/dist/keymap.js.map +1 -1
  11. package/dist/layout.d.ts.map +1 -1
  12. package/dist/layout.js +2 -1
  13. package/dist/layout.js.map +1 -1
  14. package/dist/mouse.d.ts +6 -0
  15. package/dist/mouse.d.ts.map +1 -1
  16. package/dist/mouse.js +30 -16
  17. package/dist/mouse.js.map +1 -1
  18. package/dist/primitives.d.ts.map +1 -1
  19. package/dist/primitives.js +8 -1
  20. package/dist/primitives.js.map +1 -1
  21. package/dist/render.d.ts.map +1 -1
  22. package/dist/render.js +184 -27
  23. package/dist/render.js.map +1 -1
  24. package/dist/runtime.d.ts.map +1 -1
  25. package/dist/runtime.js +13 -5
  26. package/dist/runtime.js.map +1 -1
  27. package/dist/session.d.ts.map +1 -1
  28. package/dist/session.js +323 -83
  29. package/dist/session.js.map +1 -1
  30. package/dist/theme.d.ts.map +1 -1
  31. package/dist/theme.js +3 -0
  32. package/dist/theme.js.map +1 -1
  33. package/dist/tree.d.ts.map +1 -1
  34. package/dist/tree.js +18 -4
  35. package/dist/tree.js.map +1 -1
  36. package/dist/types.d.ts +38 -4
  37. package/dist/types.d.ts.map +1 -1
  38. package/docs/api-reference.md +13 -6
  39. package/docs/cookbook.md +1 -1
  40. package/docs/interaction-model.md +7 -5
  41. package/docs/primitive-gallery.md +7 -3
  42. package/llms-full.txt +28 -15
  43. package/package.json +1 -1
  44. package/src/ansi.ts +12 -0
  45. package/src/events.ts +4 -2
  46. package/src/keymap.ts +4 -2
  47. package/src/layout.ts +2 -1
  48. package/src/mouse.ts +31 -15
  49. package/src/primitives.ts +8 -1
  50. package/src/render.ts +199 -28
  51. package/src/runtime.ts +13 -5
  52. package/src/session.ts +341 -79
  53. package/src/theme.ts +3 -0
  54. package/src/tree.ts +19 -4
  55. package/src/types.ts +45 -3
package/dist/runtime.js CHANGED
@@ -101,15 +101,23 @@ function normalizeValyrianInput(input) {
101
101
  return input;
102
102
  }
103
103
  const props = { ...((input.props && input.props.__terminalProps) || input.props || {}) };
104
- const children = Array.isArray(input.children)
105
- ? input.children.map((child) => {
104
+ const rawChildren = Array.isArray(input.children) ? input.children : [];
105
+ const isListComponentWithRenderChild = typeof input.tag === "function" && input.tag.name === "TerminalList" && rawChildren.length === 1 && typeof rawChildren[0] === "function";
106
+ if (isListComponentWithRenderChild) {
107
+ props.__childrenRenderer = rawChildren[0];
108
+ }
109
+ const tag = typeof input.tag === "string" ? input.tag : wrapComponent(input.tag);
110
+ const children = isListComponentWithRenderChild || (tag === "terminal-list" && rawChildren.length === 1 && typeof rawChildren[0] === "function")
111
+ ? []
112
+ : rawChildren.map((child) => {
106
113
  if (props["v-for"] && typeof child === "function") {
107
114
  return (...args) => normalizeValyrianInput(child(...args));
108
115
  }
109
116
  return normalizeValyrianInput(child);
110
- })
111
- : [];
112
- const tag = typeof input.tag === "string" ? input.tag : wrapComponent(input.tag);
117
+ });
118
+ if (tag === "terminal-list" && rawChildren.length === 1 && typeof rawChildren[0] === "function") {
119
+ props.__childrenRenderer = rawChildren[0];
120
+ }
113
121
  if (typeof tag === "string" && isTerminalTag(tag)) {
114
122
  const terminalProps = { ...props };
115
123
  if (typeof props.style === "object") {
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAkBlD,MAAM,iBAAiB,GAAG,IAAI,OAAO,EAAe,CAAC;AACrD,IAAI,aAAa,GAAG,CAAC,CAAC;AACtB,IAAI,gBAAgB,GAAkB,IAAI,CAAC;AAE3C,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAE7B,SAAS,aAAa,CAAC,GAAW;IAChC,OAAO,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,YAAY,CAAC,IAAa;IACjC,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;QACvC,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;IACjD,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;QACtB,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACjC,CAAC;IAED,MAAM,KAAK,GAAwB,EAAE,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;IACxC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAa,EAAE,QAA8B;IAC5E,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QACtE,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACjC,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;QAC1C,uBAAuB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAa,EAAE,SAAiB;IACxD,OAAO,OAAO,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,KAAK,SAAS,EAAE,CAAC,KAAK,UAAU,CAAC;AACrE,CAAC;AAED,SAAS,wBAAwB,CAAC,IAAa,EAAE,SAAiB;IAChE,IAAI,SAAS,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;QACnG,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,mBAAmB,CAAC,SAAiB,EAAE,OAA6B;IAC3E,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAiC,CAAC;IACxG,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,SAAS,EAAE,oBAAoB,EAAE,QAAQ,CAAU,EAAE,CAAC;QACrI,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClH,CAAC;IACD,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IACnD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAa;IAC3C,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;QAC3C,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,KAAK,EAAE,EAAE,CAAC;QACvE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAEnF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAE1C,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;AACrD,CAAC;AAGD,SAAS,WAAW,CAAC,KAAU;IAC7B,OAAO,OAAO,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,IAAI,KAAK,IAAI,UAAU,IAAI,KAAK,CAAC,CAAC;AAC9F,CAAC;AAED,SAAS,eAAe,CAAC,KAAU;IACjC,OAAO,OAAO,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;AACzF,CAAC;AAED,SAAS,aAAa,CAAC,SAAc;IACnC,MAAM,GAAG,GAAG,CAAC,OAAO,SAAS,KAAK,UAAU,IAAI,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/F,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,SAAS,yBAAyB,CAAC,KAA0B,EAAE,QAAe;QAC5F,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC;YACvC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC;YACjD,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC/B,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC,CAAC;IAEF,iBAAiB,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACpC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAU;IACxC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,UAAU,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,OAAO,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;IACzF,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC5C,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;gBAClD,OAAO,CAAC,GAAG,IAAW,EAAE,EAAE,CAAC,sBAAsB,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACpE,CAAC;YACD,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC,CAAC;QACF,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,GAAG,GAAG,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjF,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;QAClD,MAAM,aAAa,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;QACnC,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACpC,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC;QACD,KAAK,CAAC,eAAe,GAAG,aAAa,CAAC;IACxC,CAAC;IACD,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,SAAkB;IACnD,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;AAChF,CAAC;AASD,SAAS,eAAe;IACtB,OAAO,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAuB,CAAC;AAC7D,CAAC;AAED,SAAS,kBAAkB,CAAC,SAAkB,EAAE,KAAU;IACxD,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,KAAK,CAAC,SAAgB,EAAE,YAAY,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,KAAU,EAAE,SAA6B;IACrF,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC5C,IAAI,UAAU,GAAwB,IAAI,CAAC;IAC3C,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;IAElC,MAAM,eAAe,GAAG,GAAG,EAAE;QAC3B,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,uBAAuB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACnC,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACrC,gBAAgB,GAAG,SAAS,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,UAAU,EAAE,EAAE,CAAC;QACf,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,EAAE,CAAC;YACV,gBAAgB,GAAG,IAAI,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,aAAa,EAAE,CAAC;QAChB,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,kCAAkC,KAAK,GAAG,CAAC;QAC7I,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,UAAU,GAAG,YAAY,CAAC,GAAG,EAAE;gBAC7B,aAAa,EAAE,CAAC;gBAChB,MAAM,EAAE,CAAC;gBACT,SAAS,EAAE,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,cAAc,EAAE,CAAC;QACjB,MAAM,KAAK,CAAC;IACd,CAAC;IAED,OAAO;QACL,MAAM;YACJ,aAAa,EAAE,CAAC;YAChB,MAAM,EAAE,CAAC;YACT,eAAe,EAAE,CAAC;QACpB,CAAC;QACD,OAAO;YACL,eAAe,EAAE,CAAC;YAClB,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACvC,CAAC;QACD,qBAAqB,CAAC,EAAU,EAAE,SAAiB,EAAE,OAA6B;YAChF,aAAa,EAAE,CAAC;YAChB,eAAe,EAAE,CAAC;YAClB,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC9B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;gBACtD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACpE,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC;gBAC/C,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO;YACL,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjB,cAAc,EAAE,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAU;IAC/C,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;IAEpC,IAAI,CAAC;QACH,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACrC,gBAAgB,GAAG,IAAI,CAAC;QACxB,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;YAAS,CAAC;QACT,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAUV,oBAAoB,EAKpB,eAAe,EAEhB,MAAM,YAAY,CAAC;AA6JpB,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,GAAE,oBAAyB,GAAG,eAAe,CA8rC7F"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAWV,oBAAoB,EAMpB,eAAe,EAEhB,MAAM,YAAY,CAAC;AAqLpB,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,GAAE,oBAAyB,GAAG,eAAe,CA06C7F"}
package/dist/session.js CHANGED
@@ -1,10 +1,10 @@
1
- import { ANSI_ENTER_ALTERNATE_SCREEN, ANSI_EXIT_ALTERNATE_SCREEN, ANSI_HIDE_CURSOR, ANSI_SHOW_CURSOR, createAnsiDiffWriter, formatPlainFrame, toAnsiFrame } from "./ansi.js";
1
+ import { ANSI_DISABLE_MOUSE_REPORTING, ANSI_ENABLE_MOUSE_REPORTING, ANSI_ENTER_ALTERNATE_SCREEN, ANSI_EXIT_ALTERNATE_SCREEN, ANSI_HIDE_CURSOR, ANSI_SHOW_CURSOR, createAnsiDiffWriter, formatPlainFrame, toAnsiFrame } from "./ansi.js";
2
2
  import { createSystemClipboardAdapter } from "./clipboard.js";
3
3
  import { createEditorState, insertEditorText, moveEditorCursor, removeEditorBackward, removeEditorForward } from "./editor-state.js";
4
4
  import { copySelection, hasSelection, insertText, moveCursorEnd, moveCursorHome, moveCursorLeft, moveCursorRight, moveCursorWordLeft, moveCursorWordRight, normalizeInputState, parseTerminalKey, removeBackward, removeForward, selectAll } from "./events.js";
5
5
  import { createResolvedTerminalKeymap, resolveTerminalKeyBinding } from "./keymap.js";
6
6
  import { mergeVertical } from "./layout.js";
7
- import { cursorFromHitbox, parseTerminalInput, resolvePointerTarget } from "./mouse.js";
7
+ import { cursorFromHitbox, parseTerminalInput, parseTerminalMousePrefix, resolvePointerTarget } from "./mouse.js";
8
8
  import { createOutputWriter } from "./output-writer.js";
9
9
  import { parseBracketedPaste } from "./paste.js";
10
10
  import { renderTerminalFrame } from "./render.js";
@@ -25,6 +25,10 @@ const KNOWN_TERMINAL_KEY_SEQUENCES = [
25
25
  "\u001b[1;3C",
26
26
  "\u001b[1;3D",
27
27
  "\u001b[3~",
28
+ "\u001b[5~",
29
+ "\u001b[6~",
30
+ "\u001b[1~",
31
+ "\u001b[4~",
28
32
  "\u001b[Z",
29
33
  "\u001b[A",
30
34
  "\u001b[B",
@@ -84,6 +88,7 @@ function resolveRuntimeOptions(options) {
84
88
  stdout,
85
89
  alternateScreen: options.alternateScreen ?? ownsInteractiveTTY,
86
90
  hideCursor: options.hideCursor ?? ownsInteractiveTTY,
91
+ mouseReporting: ownsInteractiveTTY,
87
92
  writesAnsi: runtime === "app" && Boolean(stdout)
88
93
  };
89
94
  }
@@ -95,7 +100,7 @@ function resolveTerminalSize(options, stdout) {
95
100
  rows: validateTerminalDimension("rows", rows)
96
101
  };
97
102
  }
98
- function applyInteractiveState(nodes, focusedId, inputStateById, editorStateById, listIndexById, scrollOffsetById, listHoverById, scrollHoverRowById) {
103
+ function applyInteractiveState(nodes, focusedId, inputStateById, editorStateById, listIndexById, listSelectedIndexById, listViewportOffsetById, scrollOffsetById, listHoverById, scrollHoverRowById) {
99
104
  for (let i = 0; i < nodes.length; i += 1) {
100
105
  const node = nodes[i];
101
106
  if (node.type !== "element") {
@@ -117,7 +122,23 @@ function applyInteractiveState(nodes, focusedId, inputStateById, editorStateById
117
122
  node.props.__editorState = current;
118
123
  }
119
124
  if (node.tag === "terminal-list" && id) {
120
- node.props.__selectedIndex = listIndexById.get(id) || 0;
125
+ const items = Array.isArray(node.props.items) ? node.props.items : [];
126
+ const activeIndex = listIndexById.get(id) || 0;
127
+ const clampedActiveIndex = Math.max(0, Math.min(Math.max(0, items.length - 1), activeIndex));
128
+ if (!listIndexById.has(id)) {
129
+ listIndexById.set(id, clampedActiveIndex);
130
+ }
131
+ const selectedIndex = node.props.showActive === false
132
+ ? null
133
+ : listSelectedIndexById.has(id)
134
+ ? listSelectedIndexById.get(id)
135
+ : clampedActiveIndex;
136
+ if (!listSelectedIndexById.has(id)) {
137
+ listSelectedIndexById.set(id, selectedIndex === null ? null : Math.max(0, Math.min(Math.max(0, items.length - 1), selectedIndex)));
138
+ }
139
+ node.props.__activeIndex = clampedActiveIndex;
140
+ node.props.__selectedIndex = selectedIndex === null ? null : Math.max(0, Math.min(Math.max(0, items.length - 1), selectedIndex));
141
+ node.props.__scrollOffset = listViewportOffsetById.get(id) || 0;
121
142
  if (listHoverById.has(id)) {
122
143
  node.props.__hoveredIndex = listHoverById.get(id);
123
144
  }
@@ -128,7 +149,7 @@ function applyInteractiveState(nodes, focusedId, inputStateById, editorStateById
128
149
  node.props.__hoveredRow = scrollHoverRowById.get(id);
129
150
  }
130
151
  }
131
- applyInteractiveState(node.children, focusedId, inputStateById, editorStateById, listIndexById, scrollOffsetById, listHoverById, scrollHoverRowById);
152
+ applyInteractiveState(node.children, focusedId, inputStateById, editorStateById, listIndexById, listSelectedIndexById, listViewportOffsetById, scrollOffsetById, listHoverById, scrollHoverRowById);
132
153
  }
133
154
  }
134
155
  export function mountTerminal(input, options = {}) {
@@ -148,6 +169,8 @@ export function mountTerminal(input, options = {}) {
148
169
  const inputStateById = new Map();
149
170
  const editorStateById = new Map();
150
171
  const listIndexById = new Map();
172
+ const listSelectedIndexById = new Map();
173
+ const listViewportOffsetById = new Map();
151
174
  const scrollOffsetById = new Map();
152
175
  const listHoverById = new Map();
153
176
  const scrollHoverRowById = new Map();
@@ -161,7 +184,7 @@ export function mountTerminal(input, options = {}) {
161
184
  renderNow();
162
185
  });
163
186
  let currentTree = terminalRuntime.project();
164
- applyInteractiveState(currentTree, focusedId, inputStateById, editorStateById, listIndexById, scrollOffsetById, listHoverById, scrollHoverRowById);
187
+ applyInteractiveState(currentTree, focusedId, inputStateById, editorStateById, listIndexById, listSelectedIndexById, listViewportOffsetById, scrollOffsetById, listHoverById, scrollHoverRowById);
165
188
  let currentFrame = renderTreeFrame(currentTree);
166
189
  let currentOutput = formatPlainFrame(currentFrame, { theme: options.theme }).trimEnd();
167
190
  let currentHitboxes = currentFrame.hitboxes;
@@ -186,6 +209,9 @@ export function mountTerminal(input, options = {}) {
186
209
  if (runtimeOptions.hideCursor) {
187
210
  writes.push(ANSI_HIDE_CURSOR);
188
211
  }
212
+ if (runtimeOptions.mouseReporting) {
213
+ writes.push(ANSI_ENABLE_MOUSE_REPORTING);
214
+ }
189
215
  if (writes.length > 0) {
190
216
  outputWriter.write(writes.join(""), { force: true });
191
217
  }
@@ -195,6 +221,9 @@ export function mountTerminal(input, options = {}) {
195
221
  return;
196
222
  }
197
223
  const writes = [];
224
+ if (runtimeOptions.mouseReporting) {
225
+ writes.push(ANSI_DISABLE_MOUSE_REPORTING);
226
+ }
198
227
  if (runtimeOptions.hideCursor) {
199
228
  writes.push(ANSI_SHOW_CURSOR);
200
229
  }
@@ -223,7 +252,7 @@ export function mountTerminal(input, options = {}) {
223
252
  focusedId = activeFocusables[0]?.props.id || null;
224
253
  }
225
254
  skipFocusContainmentOnce = false;
226
- applyInteractiveState(currentTree, focusedId, inputStateById, editorStateById, listIndexById, scrollOffsetById, listHoverById, scrollHoverRowById);
255
+ applyInteractiveState(currentTree, focusedId, inputStateById, editorStateById, listIndexById, listSelectedIndexById, listViewportOffsetById, scrollOffsetById, listHoverById, scrollHoverRowById);
227
256
  currentFrame = renderTreeFrame(currentTree);
228
257
  currentOutput = formatPlainFrame(currentFrame, { theme: options.theme }).trimEnd();
229
258
  currentHitboxes = currentFrame.hitboxes;
@@ -362,10 +391,18 @@ export function mountTerminal(input, options = {}) {
362
391
  return 1;
363
392
  }
364
393
  function sourceRowFromHitbox(node, hitbox, y) {
365
- const visibleRow = Math.max(1, y - hitbox.y1 + 1);
394
+ if (node.tag === "terminal-list" && typeof hitbox.__listItemIndex === "number" && y >= hitbox.y1 && y <= hitbox.y2) {
395
+ return Math.max(1, Math.min(rowCountForNode(node), hitbox.__listItemIndex + 1));
396
+ }
397
+ const sourceY = hitbox.contentY ?? hitbox.y1;
398
+ const visibleRow = Math.max(1, y - sourceY + 1);
366
399
  if (node.tag !== "terminal-list") {
367
400
  return Math.max(1, Math.min(rowCountForNode(node), visibleRow));
368
401
  }
402
+ const mappedIndex = hitbox.itemIndexes?.[visibleRow - 1];
403
+ if (typeof mappedIndex === "number") {
404
+ return Math.max(1, Math.min(rowCountForNode(node), mappedIndex + 1));
405
+ }
369
406
  return Math.max(1, Math.min(rowCountForNode(node), visibleRow + (hitbox.itemOffset || 0)));
370
407
  }
371
408
  function shouldPointerCapture(node) {
@@ -406,6 +443,100 @@ export function mountTerminal(input, options = {}) {
406
443
  emitCaptureEvent(next, "capturestart", source, row ?? hoveredRowForNode(next), x, y);
407
444
  }
408
445
  }
446
+ function listItemKey(node, index) {
447
+ const items = Array.isArray(node.props.items) ? node.props.items : [];
448
+ const item = items[index];
449
+ if (typeof node.props.itemKey === "function" && typeof item !== "undefined") {
450
+ const key = node.props.itemKey(item, index);
451
+ if (typeof key === "string" || typeof key === "number") {
452
+ return String(key);
453
+ }
454
+ }
455
+ return undefined;
456
+ }
457
+ function listViewportRows(node) {
458
+ const context = renderContext();
459
+ const items = Array.isArray(node.props.items) ? node.props.items : [];
460
+ const hitbox = node.props.id ? currentHitboxes.find((box) => box.id === node.props.id) : null;
461
+ const overscan = typeof node.props.overscan === "number" ? Math.max(0, Math.floor(node.props.overscan)) : 0;
462
+ const renderedRows = hitbox ? Math.max(1, hitbox.y2 - hitbox.y1 + 1 - overscan * 2) : null;
463
+ const sourceRows = Number(node.props.height || renderedRows || context.rows || items.length || 1);
464
+ if (!Number.isFinite(sourceRows) || !Number.isInteger(sourceRows) || sourceRows <= 0) {
465
+ return Math.max(1, items.length || 1);
466
+ }
467
+ return Math.max(1, Math.min(items.length || 1, sourceRows));
468
+ }
469
+ function clampListIndex(node, index) {
470
+ const items = Array.isArray(node.props.items) ? node.props.items : [];
471
+ if (items.length === 0) {
472
+ return 0;
473
+ }
474
+ return Math.max(0, Math.min(items.length - 1, index));
475
+ }
476
+ function currentListActiveIndex(node) {
477
+ return clampListIndex(node, listIndexById.get(node.props.id || "") || 0);
478
+ }
479
+ function currentListSelectedIndex(node) {
480
+ const id = node.props.id || "";
481
+ if (node.props.showActive === false) {
482
+ return null;
483
+ }
484
+ if (listSelectedIndexById.has(id)) {
485
+ const selectedIndex = listSelectedIndexById.get(id);
486
+ return typeof selectedIndex === "number" ? clampListIndex(node, selectedIndex) : null;
487
+ }
488
+ return currentListActiveIndex(node);
489
+ }
490
+ function currentListViewportOffset(node) {
491
+ const id = node.props.id || "";
492
+ return Math.max(0, Math.min(listMaxViewportOffset(node), listViewportOffsetById.get(id) || 0));
493
+ }
494
+ function listStatePayload(node) {
495
+ return {
496
+ activeIndex: currentListActiveIndex(node),
497
+ selectedIndex: currentListSelectedIndex(node),
498
+ viewportOffset: currentListViewportOffset(node),
499
+ viewportRows: listViewportRows(node)
500
+ };
501
+ }
502
+ function listMaxViewportOffset(node) {
503
+ const items = Array.isArray(node.props.items) ? node.props.items : [];
504
+ return Math.max(0, items.length - listViewportRows(node));
505
+ }
506
+ function setListViewportOffset(node, offset, emit = true) {
507
+ const id = node.props.id;
508
+ if (!id) {
509
+ return;
510
+ }
511
+ const nextOffset = Math.max(0, Math.min(listMaxViewportOffset(node), offset));
512
+ const previous = listViewportOffsetById.get(id) || 0;
513
+ listViewportOffsetById.set(id, nextOffset);
514
+ if (emit && nextOffset !== previous) {
515
+ const payload = {
516
+ type: "viewportchange",
517
+ id,
518
+ offset: nextOffset,
519
+ rows: listViewportRows(node),
520
+ ...listStatePayload(node)
521
+ };
522
+ dispatchNodeEvent(node, "viewportchange", payload);
523
+ }
524
+ }
525
+ function ensureListActiveVisible(node, activeIndex) {
526
+ const id = node.props.id;
527
+ if (!id || !node.props.virtualized) {
528
+ return;
529
+ }
530
+ const currentOffset = listViewportOffsetById.get(id) || 0;
531
+ const rows = listViewportRows(node);
532
+ if (activeIndex < currentOffset) {
533
+ setListViewportOffset(node, activeIndex);
534
+ return;
535
+ }
536
+ if (activeIndex >= currentOffset + rows) {
537
+ setListViewportOffset(node, activeIndex - rows + 1);
538
+ }
539
+ }
409
540
  function dispatchListPressEvent(node, type, index) {
410
541
  const id = node.props.id;
411
542
  if (!id) {
@@ -415,7 +546,10 @@ export function mountTerminal(input, options = {}) {
415
546
  if (typeof items[index] === "undefined") {
416
547
  return false;
417
548
  }
418
- const payload = { type, id, index, value: items[index] };
549
+ const key = listItemKey(node, index);
550
+ const payload = typeof key === "undefined"
551
+ ? { type, id, index, value: items[index], ...listStatePayload(node) }
552
+ : { type, id, index, key, value: items[index], ...listStatePayload(node) };
419
553
  return dispatchNodeEvent(node, type, payload);
420
554
  }
421
555
  function dispatchButtonPressEvent(node, type) {
@@ -425,6 +559,13 @@ export function mountTerminal(input, options = {}) {
425
559
  }
426
560
  return dispatchNodeEvent(node, type, { type, id });
427
561
  }
562
+ function dispatchHitboxButtonPressEvent(hitbox, type) {
563
+ if (type !== "press" || typeof hitbox.__pressHandler !== "function") {
564
+ return false;
565
+ }
566
+ hitbox.__pressHandler({ type, id: hitbox.id });
567
+ return true;
568
+ }
428
569
  function dispatchListPointerPressEvent(node, type, row) {
429
570
  const items = Array.isArray(node.props.items) ? node.props.items : [];
430
571
  const index = Math.max(0, Math.min(items.length - 1, row - 1));
@@ -461,7 +602,10 @@ export function mountTerminal(input, options = {}) {
461
602
  if (typeof items[index] === "undefined") {
462
603
  return;
463
604
  }
464
- const payload = { type, id: node.props.id, row: index + 1, index, value: items[index], x, y };
605
+ const key = listItemKey(node, index);
606
+ const payload = typeof key === "undefined"
607
+ ? { type, id: node.props.id, row: index + 1, index, value: items[index], x, y }
608
+ : { type, id: node.props.id, row: index + 1, index, key, value: items[index], x, y };
465
609
  dispatchNodeEvent(node, type, payload);
466
610
  return;
467
611
  }
@@ -551,28 +695,74 @@ export function mountTerminal(input, options = {}) {
551
695
  setSemanticHoverFromHitbox(hitbox.id, x, y);
552
696
  return rerender();
553
697
  }
554
- function changeListSelection(node, direction) {
698
+ function moveListActiveTo(node, nextIndex) {
555
699
  const id = node.props.id;
556
700
  if (!id) {
557
701
  return currentOutput;
558
702
  }
559
703
  const items = Array.isArray(node.props.items) ? node.props.items : [];
560
- const currentIndex = listIndexById.get(id) || 0;
561
- const nextIndex = direction < 0 ? Math.max(0, currentIndex - 1) : Math.min(items.length - 1, currentIndex + 1);
704
+ const clampedIndex = clampListIndex(node, nextIndex);
705
+ listIndexById.set(id, clampedIndex);
706
+ ensureListActiveVisible(node, clampedIndex);
707
+ const key = listItemKey(node, clampedIndex);
708
+ const payload = typeof key === "undefined"
709
+ ? { type: "change", id, index: clampedIndex, value: items[clampedIndex], ...listStatePayload(node) }
710
+ : { type: "change", id, index: clampedIndex, key, value: items[clampedIndex], ...listStatePayload(node) };
711
+ dispatchNodeEvent(node, "change", payload);
712
+ return rerender();
713
+ }
714
+ function changeListSelection(node, direction) {
715
+ return moveListActiveTo(node, currentListActiveIndex(node) + direction);
716
+ }
717
+ function pageListSelection(node, direction) {
718
+ const id = node.props.id;
719
+ if (!id) {
720
+ return currentOutput;
721
+ }
722
+ const nextIndex = clampListIndex(node, currentListActiveIndex(node) + direction * listViewportRows(node));
562
723
  listIndexById.set(id, nextIndex);
563
- const payload = { type: "change", id, index: nextIndex, value: items[nextIndex] };
724
+ setListViewportOffset(node, nextIndex);
725
+ const items = Array.isArray(node.props.items) ? node.props.items : [];
726
+ const key = listItemKey(node, nextIndex);
727
+ const payload = typeof key === "undefined"
728
+ ? { type: "change", id, index: nextIndex, value: items[nextIndex], ...listStatePayload(node) }
729
+ : { type: "change", id, index: nextIndex, key, value: items[nextIndex], ...listStatePayload(node) };
564
730
  dispatchNodeEvent(node, "change", payload);
565
731
  return rerender();
566
732
  }
733
+ function moveListSelectionToBoundary(node, boundary) {
734
+ const items = Array.isArray(node.props.items) ? node.props.items : [];
735
+ return moveListActiveTo(node, boundary === "start" ? 0 : Math.max(0, items.length - 1));
736
+ }
567
737
  function pressListSelection(node) {
568
738
  const id = node.props.id;
569
739
  if (!id) {
570
740
  return currentOutput;
571
741
  }
572
- const currentIndex = listIndexById.get(id) || 0;
742
+ const currentIndex = currentListActiveIndex(node);
743
+ if (node.props.showActive !== false) {
744
+ listSelectedIndexById.set(id, currentIndex);
745
+ }
573
746
  dispatchListPressEvent(node, "press", currentIndex);
574
747
  return rerender();
575
748
  }
749
+ function pressListPointerSelection(node, row) {
750
+ const id = node.props.id;
751
+ if (!id) {
752
+ return currentOutput;
753
+ }
754
+ const items = Array.isArray(node.props.items) ? node.props.items : [];
755
+ const index = Math.max(0, Math.min(items.length - 1, row - 1));
756
+ if (typeof items[index] === "undefined") {
757
+ return currentOutput;
758
+ }
759
+ listIndexById.set(id, index);
760
+ if (node.props.showActive !== false) {
761
+ listSelectedIndexById.set(id, index);
762
+ }
763
+ dispatchListPressEvent(node, "press", index);
764
+ return rerender();
765
+ }
576
766
  function scrollFocusedNode(node, direction) {
577
767
  const id = node.props.id;
578
768
  if (!id) {
@@ -597,7 +787,9 @@ export function mountTerminal(input, options = {}) {
597
787
  return scrollFocusedNode(node, direction);
598
788
  }
599
789
  if (node?.tag === "terminal-list" && node.props.virtualized) {
600
- return changeListSelection(node, direction);
790
+ const currentOffset = listViewportOffsetById.get(node.props.id || "") || 0;
791
+ setListViewportOffset(node, currentOffset + direction);
792
+ return rerender();
601
793
  }
602
794
  return rerender();
603
795
  }
@@ -763,6 +955,14 @@ export function mountTerminal(input, options = {}) {
763
955
  return node?.tag === "terminal-list" ? changeListSelection(node, -1) : currentOutput;
764
956
  case "list.next":
765
957
  return node?.tag === "terminal-list" ? changeListSelection(node, 1) : currentOutput;
958
+ case "list.pageUp":
959
+ return node?.tag === "terminal-list" ? pageListSelection(node, -1) : currentOutput;
960
+ case "list.pageDown":
961
+ return node?.tag === "terminal-list" ? pageListSelection(node, 1) : currentOutput;
962
+ case "list.home":
963
+ return node?.tag === "terminal-list" ? moveListSelectionToBoundary(node, "start") : currentOutput;
964
+ case "list.end":
965
+ return node?.tag === "terminal-list" ? moveListSelectionToBoundary(node, "end") : currentOutput;
766
966
  case "list.press":
767
967
  return node?.tag === "terminal-list" ? pressListSelection(node) : currentOutput;
768
968
  case "scroll.up":
@@ -798,6 +998,19 @@ export function mountTerminal(input, options = {}) {
798
998
  return;
799
999
  }
800
1000
  terminalSize = nextSize;
1001
+ const focusedNode = findFocused(currentTree, focusedId);
1002
+ if (focusedNode?.tag === "terminal-list" && focusedNode.props.id && focusedNode.props.virtualized) {
1003
+ const items = Array.isArray(focusedNode.props.items) ? focusedNode.props.items : [];
1004
+ const rows = Math.max(1, Math.min(items.length || 1, Number(focusedNode.props.height || terminalSize.rows || items.length || 1)));
1005
+ const activeIndex = currentListActiveIndex(focusedNode);
1006
+ const currentOffset = listViewportOffsetById.get(focusedNode.props.id) || 0;
1007
+ if (activeIndex < currentOffset) {
1008
+ listViewportOffsetById.set(focusedNode.props.id, activeIndex);
1009
+ }
1010
+ else if (activeIndex >= currentOffset + rows) {
1011
+ listViewportOffsetById.set(focusedNode.props.id, Math.max(0, activeIndex - rows + 1));
1012
+ }
1013
+ }
801
1014
  rerender();
802
1015
  },
803
1016
  update() {
@@ -888,7 +1101,14 @@ export function mountTerminal(input, options = {}) {
888
1101
  return currentOutput;
889
1102
  }
890
1103
  if (hitbox.tag === "terminal-button") {
891
- return this.click(hitbox.id);
1104
+ const node = findFocusableById(currentTree, hitbox.id);
1105
+ if (node?.tag === "terminal-button") {
1106
+ return this.click(hitbox.id);
1107
+ }
1108
+ if (dispatchHitboxButtonPressEvent(hitbox, "press")) {
1109
+ return rerender();
1110
+ }
1111
+ return currentOutput;
892
1112
  }
893
1113
  setSemanticHoverFromHitbox(hitbox.id, x, y);
894
1114
  focusedId = hitbox.id;
@@ -896,6 +1116,12 @@ export function mountTerminal(input, options = {}) {
896
1116
  mouseSelectionId = hitbox.id;
897
1117
  return setCursorFromHitbox(hitbox.id, x, false);
898
1118
  }
1119
+ if (hitbox.tag === "terminal-list") {
1120
+ const node = findFocusableById(currentTree, hitbox.id);
1121
+ if (node?.tag === "terminal-list") {
1122
+ return pressListPointerSelection(node, sourceRowFromHitbox(node, hitbox, y));
1123
+ }
1124
+ }
899
1125
  rerender();
900
1126
  return currentOutput;
901
1127
  },
@@ -1082,6 +1308,79 @@ export function mountTerminal(input, options = {}) {
1082
1308
  }
1083
1309
  return currentOutput;
1084
1310
  }
1311
+ function processParsedMouseInput(parsed) {
1312
+ if (parsed.action === "press") {
1313
+ const hitbox = resolvePointerTarget(currentHitboxes, parsed.x, parsed.y);
1314
+ if (isContextMouseButton(parsed.button)) {
1315
+ lastPrimaryPress = null;
1316
+ contextPressAt(parsed.x, parsed.y);
1317
+ return;
1318
+ }
1319
+ if (hitbox?.tag === "terminal-input") {
1320
+ mouseSelectionId = hitbox.id;
1321
+ }
1322
+ const node = hitbox ? findFocusableById(currentTree, hitbox.id) : null;
1323
+ if (hitbox && node && shouldPointerCapture(node)) {
1324
+ setPointerCapture(hitbox.id, "press", sourceRowFromHitbox(node, hitbox, parsed.y), parsed.x, parsed.y);
1325
+ }
1326
+ const isPrimaryPress = isPrimaryMouseButton(parsed.button);
1327
+ const isDoublePressEligible = Boolean(hitbox
1328
+ && node
1329
+ && (hitbox.tag === "terminal-button" || hitbox.tag === "terminal-list"));
1330
+ const primaryPressRow = hitbox && node && hitbox.tag === "terminal-list"
1331
+ ? sourceRowFromHitbox(node, hitbox, parsed.y)
1332
+ : null;
1333
+ const shouldDispatchDoublePress = Boolean(isPrimaryPress
1334
+ && isDoublePressEligible
1335
+ && hitbox
1336
+ && isDoublePrimaryPress(hitbox, primaryPressRow));
1337
+ if (isPrimaryPress && !isDoublePressEligible) {
1338
+ lastPrimaryPress = null;
1339
+ }
1340
+ if (hitbox && shouldDispatchDoublePress && hitbox.tag === "terminal-list") {
1341
+ doublePressAt(hitbox, parsed.x, parsed.y);
1342
+ }
1343
+ else {
1344
+ session.clickAt(parsed.x, parsed.y);
1345
+ if (hitbox && shouldDispatchDoublePress) {
1346
+ doublePressAt(hitbox, parsed.x, parsed.y);
1347
+ }
1348
+ }
1349
+ }
1350
+ else if (parsed.action === "drag") {
1351
+ if (mouseSelectionId) {
1352
+ setCursorFromHitbox(mouseSelectionId, parsed.x, true);
1353
+ }
1354
+ else {
1355
+ hoverAt(parsed.x, parsed.y);
1356
+ }
1357
+ }
1358
+ else if (parsed.action === "release") {
1359
+ mouseSelectionId = null;
1360
+ const capturedId = pointerCaptureId;
1361
+ const releaseHitbox = resolvePointerTarget(currentHitboxes, parsed.x, parsed.y);
1362
+ const releaseNode = releaseHitbox ? findFocusableById(currentTree, releaseHitbox.id) : null;
1363
+ const releaseRow = releaseHitbox && releaseNode
1364
+ ? sourceRowFromHitbox(releaseNode, releaseHitbox, parsed.y)
1365
+ : null;
1366
+ setPointerCapture(null, "release", capturedId && releaseHitbox?.id === capturedId ? releaseRow : null, parsed.x, parsed.y);
1367
+ const hitbox = resolvePointerTarget(currentHitboxes, parsed.x, parsed.y);
1368
+ if (capturedId && hitbox && hitbox.id === capturedId && (hitbox.tag === "terminal-list" || hitbox.tag === "terminal-scroll")) {
1369
+ setSemanticHoverFromHitbox(hitbox.id, parsed.x, parsed.y);
1370
+ rerender();
1371
+ }
1372
+ else {
1373
+ clearSemanticHover(undefined, parsed.x, parsed.y);
1374
+ rerender();
1375
+ }
1376
+ }
1377
+ else if (parsed.action === "wheel-up") {
1378
+ wheelAt(parsed.x, parsed.y, -1);
1379
+ }
1380
+ else if (parsed.action === "wheel-down") {
1381
+ wheelAt(parsed.x, parsed.y, 1);
1382
+ }
1383
+ }
1085
1384
  function processInputStream(value) {
1086
1385
  if (!value) {
1087
1386
  return;
@@ -1133,74 +1432,15 @@ export function mountTerminal(input, options = {}) {
1133
1432
  processInputStream(paste.rest);
1134
1433
  return;
1135
1434
  }
1435
+ const parsedMouse = parseTerminalMousePrefix(value);
1436
+ if (parsedMouse) {
1437
+ processParsedMouseInput(parsedMouse.input);
1438
+ processInputStream(parsedMouse.rest);
1439
+ return;
1440
+ }
1136
1441
  const parsed = parseTerminalInput(value);
1137
1442
  if (parsed.type === "mouse") {
1138
- if (parsed.action === "press") {
1139
- const hitbox = resolvePointerTarget(currentHitboxes, parsed.x, parsed.y);
1140
- if (isContextMouseButton(parsed.button)) {
1141
- lastPrimaryPress = null;
1142
- contextPressAt(parsed.x, parsed.y);
1143
- return;
1144
- }
1145
- if (hitbox?.tag === "terminal-input") {
1146
- mouseSelectionId = hitbox.id;
1147
- }
1148
- const node = hitbox ? findFocusableById(currentTree, hitbox.id) : null;
1149
- if (hitbox && node && shouldPointerCapture(node)) {
1150
- setPointerCapture(hitbox.id, "press", sourceRowFromHitbox(node, hitbox, parsed.y), parsed.x, parsed.y);
1151
- }
1152
- const isPrimaryPress = isPrimaryMouseButton(parsed.button);
1153
- const isDoublePressEligible = Boolean(hitbox
1154
- && node
1155
- && (hitbox.tag === "terminal-button" || hitbox.tag === "terminal-list"));
1156
- const primaryPressRow = hitbox && node && hitbox.tag === "terminal-list"
1157
- ? sourceRowFromHitbox(node, hitbox, parsed.y)
1158
- : null;
1159
- const shouldDispatchDoublePress = Boolean(isPrimaryPress
1160
- && isDoublePressEligible
1161
- && hitbox
1162
- && isDoublePrimaryPress(hitbox, primaryPressRow));
1163
- if (isPrimaryPress && !isDoublePressEligible) {
1164
- lastPrimaryPress = null;
1165
- }
1166
- session.clickAt(parsed.x, parsed.y);
1167
- if (hitbox && shouldDispatchDoublePress) {
1168
- doublePressAt(hitbox, parsed.x, parsed.y);
1169
- }
1170
- }
1171
- else if (parsed.action === "drag") {
1172
- if (mouseSelectionId) {
1173
- setCursorFromHitbox(mouseSelectionId, parsed.x, true);
1174
- }
1175
- else {
1176
- hoverAt(parsed.x, parsed.y);
1177
- }
1178
- }
1179
- else if (parsed.action === "release") {
1180
- mouseSelectionId = null;
1181
- const capturedId = pointerCaptureId;
1182
- const releaseHitbox = resolvePointerTarget(currentHitboxes, parsed.x, parsed.y);
1183
- const releaseNode = releaseHitbox ? findFocusableById(currentTree, releaseHitbox.id) : null;
1184
- const releaseRow = releaseHitbox && releaseNode
1185
- ? sourceRowFromHitbox(releaseNode, releaseHitbox, parsed.y)
1186
- : null;
1187
- setPointerCapture(null, "release", capturedId && releaseHitbox?.id === capturedId ? releaseRow : null, parsed.x, parsed.y);
1188
- const hitbox = resolvePointerTarget(currentHitboxes, parsed.x, parsed.y);
1189
- if (capturedId && hitbox && hitbox.id === capturedId && (hitbox.tag === "terminal-list" || hitbox.tag === "terminal-scroll")) {
1190
- setSemanticHoverFromHitbox(hitbox.id, parsed.x, parsed.y);
1191
- rerender();
1192
- }
1193
- else {
1194
- clearSemanticHover(undefined, parsed.x, parsed.y);
1195
- rerender();
1196
- }
1197
- }
1198
- else if (parsed.action === "wheel-up") {
1199
- wheelAt(parsed.x, parsed.y, -1);
1200
- }
1201
- else if (parsed.action === "wheel-down") {
1202
- wheelAt(parsed.x, parsed.y, 1);
1203
- }
1443
+ processParsedMouseInput(parsed);
1204
1444
  return;
1205
1445
  }
1206
1446
  processKeyStream(value);