silvery 0.21.0 → 0.23.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 (224) hide show
  1. package/README.md +1 -1
  2. package/dist/{Text-Lq0dmj8-.mjs → Text-Ci6UCSTL.mjs} +46 -48
  3. package/dist/Text-Ci6UCSTL.mjs.map +1 -0
  4. package/dist/{render-string-DkQacASz.mjs → ag-q9lRlKlt.mjs} +5322 -4259
  5. package/dist/ag-q9lRlKlt.mjs.map +1 -0
  6. package/dist/{animation-ZMN2_XKv.mjs → animation-CZ4x2R7C.mjs} +1 -1
  7. package/dist/{animation-ZMN2_XKv.mjs.map → animation-CZ4x2R7C.mjs.map} +1 -1
  8. package/dist/{ansi-D1KQMAbf.mjs → ansi-CLmIMnop.mjs} +1 -1
  9. package/dist/{ansi-D1KQMAbf.mjs.map → ansi-CLmIMnop.mjs.map} +1 -1
  10. package/dist/{ansi-2Xn0yatP.d.mts → ansi-zmNzgkPB.d.mts} +1 -1
  11. package/dist/{ansi-2Xn0yatP.d.mts.map → ansi-zmNzgkPB.d.mts.map} +1 -1
  12. package/dist/{backend-B-WYLUib.mjs → backend-DSiSIc-h.mjs} +2 -2
  13. package/dist/{backend-B-WYLUib.mjs.map → backend-DSiSIc-h.mjs.map} +1 -1
  14. package/dist/chain-bridge-CkYcMxlq.mjs +4149 -0
  15. package/dist/chain-bridge-CkYcMxlq.mjs.map +1 -0
  16. package/dist/{chunk-BSw8zbkd.mjs → chunk-BEJ448es.mjs} +1 -3
  17. package/dist/cli-VNqUKlXw.mjs +4 -0
  18. package/dist/{context-BU5LkkIy.mjs → context-CEhuD1R_.mjs} +1 -1
  19. package/dist/{context-BU5LkkIy.mjs.map → context-CEhuD1R_.mjs.map} +1 -1
  20. package/dist/devtools-BF4IMumr.mjs +2 -0
  21. package/dist/{devtools-DcQjgyjL.mjs → devtools-td2AjFwc.mjs} +5 -5
  22. package/dist/{devtools-DcQjgyjL.mjs.map → devtools-td2AjFwc.mjs.map} +1 -1
  23. package/dist/{easing-BI-ASGMO.d.mts → easing-C5MrdO7V.d.mts} +1 -1
  24. package/dist/{easing-BI-ASGMO.d.mts.map → easing-C5MrdO7V.d.mts.map} +1 -1
  25. package/dist/{eta-CJlGH06n.mjs → eta-BwYWEjfS.mjs} +1 -1
  26. package/dist/{eta-CJlGH06n.mjs.map → eta-BwYWEjfS.mjs.map} +1 -1
  27. package/dist/{flexily-zero-adapter-C4lW_Ov5.mjs → flexily-zero-adapter-DktX3HsX.mjs} +1 -1
  28. package/dist/{flexily-zero-adapter-C3Vj0fPt.mjs → flexily-zero-adapter-VoBGHG14.mjs} +1 -1
  29. package/dist/{flexily-zero-adapter-C3Vj0fPt.mjs.map → flexily-zero-adapter-VoBGHG14.mjs.map} +1 -1
  30. package/dist/hit-registry-D_nxOivS.d.mts +71 -0
  31. package/dist/hit-registry-D_nxOivS.d.mts.map +1 -0
  32. package/dist/{UPNG-DosRPdF4.mjs → image-CIF75xMr.mjs} +891 -6
  33. package/dist/image-CIF75xMr.mjs.map +1 -0
  34. package/dist/{index-CSQf13CI.d.mts → index-377zdPLP.d.mts} +35 -12
  35. package/dist/index-377zdPLP.d.mts.map +1 -0
  36. package/dist/{index-Cl9KKjQ_.d.mts → index-BcSr0RAQ.d.mts} +8670 -10659
  37. package/dist/index-BcSr0RAQ.d.mts.map +1 -0
  38. package/dist/{index-XbNrPhWl.d.mts → index-DLnpxDAm.d.mts} +2 -2
  39. package/dist/{index-XbNrPhWl.d.mts.map → index-DLnpxDAm.d.mts.map} +1 -1
  40. package/dist/{index-BUMxS65f.d.mts → index-DlNmckTq.d.mts} +2 -2
  41. package/dist/{index-BUMxS65f.d.mts.map → index-DlNmckTq.d.mts.map} +1 -1
  42. package/dist/index.d.mts +12 -8
  43. package/dist/index.d.mts.map +1 -1
  44. package/dist/index.mjs +18 -15
  45. package/dist/index.mjs.map +1 -1
  46. package/dist/{layout-engine-C2px0RJE.mjs → layout-engine-BgR58vL0.mjs} +3 -3
  47. package/dist/{layout-engine-C2px0RJE.mjs.map → layout-engine-BgR58vL0.mjs.map} +1 -1
  48. package/dist/{layout-engine-C07LEXWT.mjs → layout-engine-DNjTha8f.mjs} +1 -1
  49. package/dist/{layout-signals-Cnw6xk8Q.mjs → layout-signals-CGYbHmxy.mjs} +146 -23
  50. package/dist/layout-signals-CGYbHmxy.mjs.map +1 -0
  51. package/dist/{bound-term-0sPrrzH1.d.mts → mouse-events-B2z5tbsL.d.mts} +780 -379
  52. package/dist/mouse-events-B2z5tbsL.d.mts.map +1 -0
  53. package/dist/{mouse-events-Dki3ISIp.mjs → mouse-events-WQ2h-uqG.mjs} +45 -10
  54. package/dist/mouse-events-WQ2h-uqG.mjs.map +1 -0
  55. package/dist/{multi-progress-DHZ2xUT2.d.mts → multi-progress-BaEFfHKP.d.mts} +2 -2
  56. package/dist/{multi-progress-DHZ2xUT2.d.mts.map → multi-progress-BaEFfHKP.d.mts.map} +1 -1
  57. package/dist/{multi-progress-CIRjrzma.mjs → multi-progress-zCWHEm9P.mjs} +3 -3
  58. package/dist/{multi-progress-CIRjrzma.mjs.map → multi-progress-zCWHEm9P.mjs.map} +1 -1
  59. package/dist/{node-CjM5Rt-M.mjs → node-CJ3J_rW-.mjs} +1 -1
  60. package/dist/{node-CjM5Rt-M.mjs.map → node-CJ3J_rW-.mjs.map} +1 -1
  61. package/dist/{progress-DB_Xo071.mjs → progress-6vJ7nxUg.mjs} +4 -4
  62. package/dist/{progress-DB_Xo071.mjs.map → progress-6vJ7nxUg.mjs.map} +1 -1
  63. package/dist/{progress-bar-oJwq22CR.mjs → progress-bar-BlFNsZL8.mjs} +4 -4
  64. package/dist/{progress-bar-oJwq22CR.mjs.map → progress-bar-BlFNsZL8.mjs.map} +1 -1
  65. package/dist/{reconciler-DldIJB93.mjs → reconciler--_-biN23.mjs} +190 -134
  66. package/dist/reconciler--_-biN23.mjs.map +1 -0
  67. package/dist/{render-string-BcoCpjCB.mjs → render-string-DaghHpLN.mjs} +1 -1
  68. package/dist/render-string-DtHZP0cU.mjs +215 -0
  69. package/dist/render-string-DtHZP0cU.mjs.map +1 -0
  70. package/dist/runtime.d.mts +4 -3
  71. package/dist/runtime.mjs +4 -3
  72. package/dist/schemes-DWQPxXAi.mjs +2516 -0
  73. package/dist/{schemes-JjNp4aSl.mjs.map → schemes-DWQPxXAi.mjs.map} +1 -1
  74. package/dist/{spinner-D9lrHr8s.mjs → spinner-B50hILqx.mjs} +19 -4
  75. package/dist/{spinner-D9lrHr8s.mjs.map → spinner-B50hILqx.mjs.map} +1 -1
  76. package/dist/{spinner-CZINHpkV.d.mts → spinner-DN10UfF0.d.mts} +2 -2
  77. package/dist/{spinner-CZINHpkV.d.mts.map → spinner-DN10UfF0.d.mts.map} +1 -1
  78. package/dist/{src-BNTToU7l.mjs → src-B8lf1kiR.mjs} +1507 -1166
  79. package/dist/src-B8lf1kiR.mjs.map +1 -0
  80. package/dist/{src-5w9QR6_8.mjs → src-BOLdi3WG.mjs} +105 -237
  81. package/dist/src-BOLdi3WG.mjs.map +1 -0
  82. package/dist/{src-BR4xNwdG.mjs → src-BXeTHHlL.mjs} +20240 -25437
  83. package/dist/src-BXeTHHlL.mjs.map +1 -0
  84. package/dist/{src-DKp-_OFG.mjs → src-BqeBFB3X.mjs} +90 -47
  85. package/dist/src-BqeBFB3X.mjs.map +1 -0
  86. package/dist/src-DbqcSrhy.mjs +3901 -0
  87. package/dist/src-DbqcSrhy.mjs.map +1 -0
  88. package/dist/{steps-Bp2uNqnn.d.mts → steps-B2kBmFpb.d.mts} +1 -1
  89. package/dist/{steps-Bp2uNqnn.d.mts.map → steps-B2kBmFpb.d.mts.map} +1 -1
  90. package/dist/{svg-Cz0UXcDj.mjs → svg-NmV9dgB9.mjs} +1 -1
  91. package/dist/{svg-Cz0UXcDj.mjs.map → svg-NmV9dgB9.mjs.map} +1 -1
  92. package/dist/{svg-g1D6ErwR.d.mts → svg-VUr78l5d.d.mts} +1 -1
  93. package/dist/{svg-g1D6ErwR.d.mts.map → svg-VUr78l5d.d.mts.map} +1 -1
  94. package/dist/term.d.mts +2 -2
  95. package/dist/term.mjs +3 -8
  96. package/dist/test.d.mts +673 -0
  97. package/dist/test.d.mts.map +1 -0
  98. package/dist/test.mjs +2829 -0
  99. package/dist/test.mjs.map +1 -0
  100. package/dist/theme.d.mts +2 -2
  101. package/dist/theme.d.mts.map +1 -1
  102. package/dist/theme.mjs +3 -8
  103. package/dist/{types-kt_fKR37.d.mts → types-D_E0FbqA.d.mts} +1 -1
  104. package/dist/{types-kt_fKR37.d.mts.map → types-D_E0FbqA.d.mts.map} +1 -1
  105. package/dist/ui/animation.d.mts +2 -2
  106. package/dist/ui/animation.mjs +1 -1
  107. package/dist/ui/ansi.d.mts +1 -1
  108. package/dist/ui/ansi.mjs +1 -1
  109. package/dist/ui/cli.d.mts +3 -3
  110. package/dist/ui/cli.mjs +5 -5
  111. package/dist/ui/image.d.mts +1 -1
  112. package/dist/ui/image.mjs +1 -1
  113. package/dist/ui/progress.d.mts +4 -4
  114. package/dist/ui/progress.mjs +4 -4
  115. package/dist/ui/react.d.mts +1 -1
  116. package/dist/ui/react.mjs +2 -2
  117. package/dist/ui/recording-chrome-react.d.mts +1 -1
  118. package/dist/ui/recording-chrome-react.mjs +2 -2
  119. package/dist/ui/recording-chrome.d.mts +1 -1
  120. package/dist/ui/recording-chrome.mjs +1 -1
  121. package/dist/ui/utils.mjs +1 -1
  122. package/dist/ui/wrappers.d.mts +2 -2
  123. package/dist/ui/wrappers.mjs +1 -1
  124. package/dist/ui.d.mts +6 -6
  125. package/dist/ui.mjs +7 -7
  126. package/dist/unicode-CxyxVGmB.mjs +11077 -0
  127. package/dist/unicode-CxyxVGmB.mjs.map +1 -0
  128. package/dist/{useLatest-DRDDVwjh.d.mts → useLatest-UOvWy0ZW.d.mts} +2 -2
  129. package/dist/{useLatest-DRDDVwjh.d.mts.map → useLatest-UOvWy0ZW.d.mts.map} +1 -1
  130. package/dist/useLayout-D5cE8OCI.mjs +424 -0
  131. package/dist/useLayout-D5cE8OCI.mjs.map +1 -0
  132. package/dist/{with-text-input-YeohVLeo.d.mts → with-text-input-DLoSCBrm.d.mts} +3 -3
  133. package/dist/{with-text-input-YeohVLeo.d.mts.map → with-text-input-DLoSCBrm.d.mts.map} +1 -1
  134. package/dist/wrap-measurer-registration-IV2HtcCd.d.mts +3106 -0
  135. package/dist/wrap-measurer-registration-IV2HtcCd.d.mts.map +1 -0
  136. package/dist/{wrapper-C70ATkVv.mjs → wrapper-CD29afOs.mjs} +59 -17
  137. package/dist/wrapper-CD29afOs.mjs.map +1 -0
  138. package/dist/{wrappers-BCUYITrY.mjs → wrappers-CInBJm44.mjs} +18 -8
  139. package/dist/wrappers-CInBJm44.mjs.map +1 -0
  140. package/dist/{yoga-adapter-BnZX1PAY.mjs → yoga-adapter-9uab5Qn-.mjs} +2 -2
  141. package/dist/{yoga-adapter-BnZX1PAY.mjs.map → yoga-adapter-9uab5Qn-.mjs.map} +1 -1
  142. package/dist/yoga-adapter-yqTl1aXK.mjs +2 -0
  143. package/package.json +59 -14
  144. package/dist/Text-Lq0dmj8-.mjs.map +0 -1
  145. package/dist/UPNG-Bo33r8rA.mjs +0 -3
  146. package/dist/UPNG-DosRPdF4.mjs.map +0 -1
  147. package/dist/__vite-browser-external-2447137e-D_JM6skp.mjs +0 -6
  148. package/dist/__vite-browser-external-2447137e-D_JM6skp.mjs.map +0 -1
  149. package/dist/ansi-yC4RyBNY.mjs +0 -22441
  150. package/dist/ansi-yC4RyBNY.mjs.map +0 -1
  151. package/dist/apng-CR08rIaH.mjs +0 -58
  152. package/dist/apng-CR08rIaH.mjs.map +0 -1
  153. package/dist/apng-DaHfVaVI.mjs +0 -3
  154. package/dist/assets/resvgjs.darwin-arm64-BtufyGW1.node +0 -0
  155. package/dist/assets/skia.darwin-arm64-DQs5sT6N.node +0 -0
  156. package/dist/backends-CUtan80W.mjs +0 -3
  157. package/dist/backends-DIVYzKqd.mjs +0 -1083
  158. package/dist/backends-DIVYzKqd.mjs.map +0 -1
  159. package/dist/bound-term-0sPrrzH1.d.mts.map +0 -1
  160. package/dist/canvas-1v7dPT-_.mjs +0 -3
  161. package/dist/canvas-CSuPOMNt.mjs +0 -1442
  162. package/dist/canvas-CSuPOMNt.mjs.map +0 -1
  163. package/dist/cli-dvo0r2fs.mjs +0 -4
  164. package/dist/compare-CQodSH4G.mjs +0 -376
  165. package/dist/compare-CQodSH4G.mjs.map +0 -1
  166. package/dist/compare-DHlcxEYA.mjs +0 -3
  167. package/dist/devtools-CJdt5H0X.mjs +0 -2
  168. package/dist/fonts-BFmhXDv7.mjs +0 -88
  169. package/dist/fonts-BFmhXDv7.mjs.map +0 -1
  170. package/dist/gif-C_AjaT9d.mjs +0 -188
  171. package/dist/gif-C_AjaT9d.mjs.map +0 -1
  172. package/dist/gif-DaC4XrxA.mjs +0 -3
  173. package/dist/gifenc-BOUT-KFB.mjs +0 -730
  174. package/dist/gifenc-BOUT-KFB.mjs.map +0 -1
  175. package/dist/image-C2Birh2x.mjs +0 -1252
  176. package/dist/image-C2Birh2x.mjs.map +0 -1
  177. package/dist/index-CSQf13CI.d.mts.map +0 -1
  178. package/dist/index-Cl9KKjQ_.d.mts.map +0 -1
  179. package/dist/key-mapping-CS-YD_cD.mjs +0 -132
  180. package/dist/key-mapping-CS-YD_cD.mjs.map +0 -1
  181. package/dist/key-mapping-Yn-Jgrij.mjs +0 -3
  182. package/dist/layout-signals-Cnw6xk8Q.mjs.map +0 -1
  183. package/dist/mouse-events-Dki3ISIp.mjs.map +0 -1
  184. package/dist/playwright-D5YiZcNS.mjs +0 -76397
  185. package/dist/playwright-D5YiZcNS.mjs.map +0 -1
  186. package/dist/png-codec-Dp84742B.mjs +0 -36
  187. package/dist/png-codec-Dp84742B.mjs.map +0 -1
  188. package/dist/png-codec-QwOtJ8Zs.mjs +0 -3
  189. package/dist/rasterizer-BRXrDdWx.mjs +0 -3
  190. package/dist/rasterizer-CpEhJvdR.mjs +0 -296
  191. package/dist/rasterizer-CpEhJvdR.mjs.map +0 -1
  192. package/dist/reconciler-DldIJB93.mjs.map +0 -1
  193. package/dist/render-string-DkQacASz.mjs.map +0 -1
  194. package/dist/resvg-js-DkOndZI3.mjs +0 -203
  195. package/dist/resvg-js-DkOndZI3.mjs.map +0 -1
  196. package/dist/schemes-JjNp4aSl.mjs +0 -2611
  197. package/dist/src-5w9QR6_8.mjs.map +0 -1
  198. package/dist/src-BNTToU7l.mjs.map +0 -1
  199. package/dist/src-BR4xNwdG.mjs.map +0 -1
  200. package/dist/src-DKp-_OFG.mjs.map +0 -1
  201. package/dist/src-bt8wSrfJ.mjs +0 -258
  202. package/dist/src-bt8wSrfJ.mjs.map +0 -1
  203. package/dist/src-e33Y6kNJ.mjs +0 -3
  204. package/dist/src-iDwu25UD.mjs +0 -1814
  205. package/dist/src-iDwu25UD.mjs.map +0 -1
  206. package/dist/svg-15lZZzxq.mjs +0 -486
  207. package/dist/svg-15lZZzxq.mjs.map +0 -1
  208. package/dist/svg-DY72a4HK.mjs +0 -3
  209. package/dist/term.mjs.map +0 -1
  210. package/dist/theme.mjs.map +0 -1
  211. package/dist/ui/display.d.mts +0 -35
  212. package/dist/ui/display.d.mts.map +0 -1
  213. package/dist/ui/display.mjs +0 -123
  214. package/dist/ui/display.mjs.map +0 -1
  215. package/dist/ui/input.d.mts +0 -184
  216. package/dist/ui/input.d.mts.map +0 -1
  217. package/dist/ui/input.mjs +0 -285
  218. package/dist/ui/input.mjs.map +0 -1
  219. package/dist/wrapper-C70ATkVv.mjs.map +0 -1
  220. package/dist/wrappers-BCUYITrY.mjs.map +0 -1
  221. package/dist/yoga-adapter-DxgsQ_gg.mjs +0 -2
  222. package/dist/zipBundle-3nqeDRtm.mjs +0 -3
  223. package/dist/zipBundle-VNAYFmqJ.mjs +0 -2003
  224. package/dist/zipBundle-VNAYFmqJ.mjs.map +0 -1
@@ -6,7 +6,6 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
6
  var __getOwnPropNames = Object.getOwnPropertyNames;
7
7
  var __getProtoOf = Object.getPrototypeOf;
8
8
  var __hasOwnProp = Object.prototype.hasOwnProperty;
9
- var __esmMin = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
10
9
  var __commonJSMin = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
11
10
  var __exportAll = (all, no_symbols) => {
12
11
  let target = {};
@@ -31,7 +30,6 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
31
30
  value: mod,
32
31
  enumerable: true
33
32
  }) : target, mod));
34
- var __toCommonJS = (mod) => __hasOwnProp.call(mod, "module.exports") ? mod["module.exports"] : __copyProps(__defProp({}, "__esModule", { value: true }), mod);
35
33
  var __require = /* @__PURE__ */ createRequire(import.meta.url);
36
34
  //#endregion
37
- export { __toCommonJS as a, __require as i, __esmMin as n, __toESM as o, __exportAll as r, __commonJSMin as t };
35
+ export { __toESM as i, __exportAll as n, __require as r, __commonJSMin as t };
@@ -0,0 +1,4 @@
1
+ import "./spinner-B50hILqx.mjs";
2
+ import "./progress-bar-BlFNsZL8.mjs";
3
+ import "./multi-progress-zCWHEm9P.mjs";
4
+ export {};
@@ -62,4 +62,4 @@ const CapabilityRegistryContext = createContext(null);
62
62
  //#endregion
63
63
  export { NodeContext as a, StdoutContext as c, FocusManagerContext as i, TermContext as l, CapabilityRegistryContext as n, RuntimeContext as o, ChainAppContext as r, StderrContext as s, CacheBackendContext as t };
64
64
 
65
- //# sourceMappingURL=context-BU5LkkIy.mjs.map
65
+ //# sourceMappingURL=context-CEhuD1R_.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"context-BU5LkkIy.mjs","names":[],"sources":["../packages/ag-react/src/context.ts"],"sourcesContent":["/**\n * Silvery React Contexts\n *\n * Provides contexts for:\n * - TermContext: Access to Term instance (for styling/detection)\n * - NodeContext: Access to the current SilveryNode (for useBoxRect)\n * - RuntimeContext: Unified input/app controls (replaces Events/Input/Stdin/App contexts)\n * - StdoutContext: Access to stdout\n * - StderrContext: Access to stderr\n */\n\nimport type { Term } from \"@silvery/ag-term/ansi\"\nimport { createContext } from \"react\"\nimport type { FocusManager } from \"@silvery/ag/focus-manager\"\nimport type { Key } from \"@silvery/ag/keys\"\nimport type { AgNode } from \"@silvery/ag/types\"\n\n// ============================================================================\n// Term Context\n// ============================================================================\n\n/**\n * Context that provides access to the Term instance.\n * Used by useTerm() hook to access terminal capabilities and styling.\n */\nexport const TermContext = createContext<Term | null>(null)\n\n// ============================================================================\n// Node Context\n// ============================================================================\n\n/**\n * Context that provides access to the current SilveryNode.\n * Used by useBoxRect() to subscribe to layout changes.\n *\n * Each Box component wraps its children in a NodeContext.Provider\n * with its corresponding SilveryNode.\n */\nexport const NodeContext = createContext<AgNode | null>(null)\n\n// ============================================================================\n// Stdio Context\n// ============================================================================\n\nexport interface StdoutContextValue {\n /** Standard output stream */\n stdout: NodeJS.WriteStream\n /** Write to stdout */\n write: (data: string) => void\n /**\n * Queue a typed terminal artifact to be flushed after the current rendered\n * frame. Prefer this over raw writeAfterFrame for protocol-owned render\n * artifacts such as terminal images.\n */\n queueFrameArtifact?: (artifact: TerminalFrameArtifact) => void\n /**\n * Queue bytes to be written immediately after the current rendered frame.\n * Escape-sequence components such as terminal images use this so their\n * placements land after the cell buffer paint instead of racing it during\n * React layout effects.\n */\n writeAfterFrame?: (data: string) => void\n /**\n * Notify the scheduler that lines were written to stdout externally.\n * Used by useScrollback to report lines written between renders so that\n * inline mode cursor positioning accounts for the displacement.\n */\n notifyScrollback?: (lines: number) => void\n /**\n * Reset inline cursor state in the output phase.\n * Used by useScrollback on resize to clear cursor tracking before\n * re-emitting frozen items at the new width.\n */\n resetInlineCursor?: () => void\n /**\n * Get inline cursor row relative to render region start. -1 if unknown.\n * Used by useScrollback to position frozen items at the render region start.\n */\n getInlineCursorRow?: () => number\n /**\n * Promote frozen content to scrollback via the output phase.\n * Instead of writing directly to stdout (which causes flicker),\n * this passes the content to the output phase which writes frozen content\n * + live content in a single target.write() — no blanking, no cursor desync.\n */\n promoteScrollback?: (frozenContent: string, frozenLineCount: number) => void\n}\n\n/**\n * Context for stdout access.\n * Used by useStdout() hook.\n */\nexport const StdoutContext = createContext<StdoutContextValue | null>(null)\n\nexport type TerminalFrameArtifact = {\n readonly kind: \"terminal-sequence\"\n readonly owner: string\n readonly sequence: string\n readonly zIndex?: number\n}\n\nexport interface StderrContextValue {\n /** Standard error stream */\n stderr: NodeJS.WriteStream\n /** Write to stderr */\n write: (data: string) => void\n}\n\n/**\n * Context for stderr access.\n * Used by useStderr() hook.\n */\nexport const StderrContext = createContext<StderrContextValue | null>(null)\n\n// ============================================================================\n// Runtime Context (typed bidirectional event bus — TEA)\n// ============================================================================\n\n/**\n * Base events every runtime provides.\n *\n * Retained for backwards compatibility (legacy `useRuntime<E>()` generic\n * slot). The canonical subscription surface is {@link ChainAppContextValue}\n * — input / paste / focus flow through the apply-chain plugin stores and\n * app-defined events ride on {@link ChainCustomEvents}.\n */\nexport interface BaseRuntimeEvents {\n /** Keyboard input: [parsedInput, keyMetadata] */\n input: [input: string, key: Key]\n /** Bracketed paste: [pastedText] */\n paste: [text: string]\n /** Terminal window focus change: [isFocused] */\n focus: [focused: boolean]\n}\n\n/**\n * Minimal runtime handle — the trimmed RuntimeContextValue exposes only\n * app-lifecycle controls (`exit`, and the opt-in pause / resume pair\n * used by console-mode suspension). Input / paste / focus subscriptions\n * live on {@link ChainAppContextValue}; custom view ↔ runtime events\n * live on {@link ChainCustomEvents} (`chain.events.emit / on`).\n *\n * The generic parameter is retained for source compatibility with\n * callers of `useRuntime<LinkEvents>()`; it has no effect on the type\n * surface below.\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface PanicOptions {\n /**\n * Prefix for the copyable terminal diagnostic.\n *\n * Example: `{ title: \"silvercode\" }` prints `silvercode: <message>`.\n */\n title?: string\n /** Additional context lines printed below the panic summary. */\n details?: string | ReadonlyArray<string>\n /** Process exit code to set. Default: 1. */\n exitCode?: number\n}\n\nexport type PanicHandler = (reason: unknown, options?: PanicOptions) => void\n\nexport interface RuntimeContextValue<_E extends BaseRuntimeEvents = BaseRuntimeEvents> {\n /** Exit the application with optional error. */\n exit: (error?: Error) => void\n /** Exit the application and print a copyable diagnostic after terminal cleanup. */\n panic: PanicHandler\n /** Pause rendering output (used by console suspend). */\n pause?: () => void\n /** Resume rendering after a pause. Forces a full redraw. */\n resume?: () => void\n}\n\n/**\n * Context that provides the trimmed runtime handle.\n *\n * When non-null: interactive mode — `useExit()` works. Input / paste /\n * focus subscriptions use `ChainAppContext`.\n *\n * When null: static mode — `useExit()` throws. Hooks subscribe through\n * `ChainAppContext` when present, otherwise no-op.\n */\nexport const RuntimeContext = createContext<RuntimeContextValue | null>(null)\n\n// ============================================================================\n// Chain App Context (TEA Phase 2 — apply-chain plugin stores)\n// ============================================================================\n\n/**\n * Minimal key shape forwarded to chain handlers. Kept structural (not\n * imported from @silvery/ag/keys) so this context stays dependency-free;\n * consumers narrow to `Key` at the call site.\n */\nexport interface ChainKey {\n ctrl?: boolean\n shift?: boolean\n meta?: boolean\n super?: boolean\n hyper?: boolean\n alt?: boolean\n eventType?: \"press\" | \"repeat\" | \"release\" | undefined\n}\n\n/** Handler registered with the fallback useInput store. */\nexport type ChainInputHandler = (input: string, key: ChainKey) => void | \"exit\"\n\n/** Handler registered with the paste store. */\nexport type ChainPasteHandler = (text: string) => void\n\n/** Handler registered with the terminal focus store. */\nexport type ChainFocusHandler = (focused: boolean) => void\n\n/** Raw-key observer handler — fires for every input:key op (press/repeat/release/modifier-only). */\nexport type ChainRawKeyHandler = (input: string, key: ChainKey) => void\n\n/** Handler registered with the custom-events store — payload is app-defined. */\nexport type ChainCustomEventHandler = (...args: unknown[]) => void\n\n/** Input-fallback store slice exposed by withInputChain. */\nexport interface ChainInputStore {\n register(handler: ChainInputHandler, active?: boolean): () => void\n setActive(handler: ChainInputHandler, active: boolean): void\n}\n\n/** Raw-key observer slice — sees every key event before focus/useInput filters. */\nexport interface ChainRawKeyObserver {\n register(handler: ChainRawKeyHandler): () => void\n}\n\n/** Paste store slice exposed by withPasteChain. */\nexport interface ChainPasteStore {\n register(handler: ChainPasteHandler): () => void\n}\n\n/** Window focus slice exposed alongside the chain for createApp. */\nexport interface ChainFocusEvents {\n register(handler: ChainFocusHandler): () => void\n}\n\n/**\n * Custom-events slice — app-defined view ↔ runtime events (e.g.\n * `link:open` fired by `<Link>` and consumed by km-tui's\n * `useLinkOpen`). Channels are arbitrary strings chosen by the app;\n * payloads are untyped at the bus layer.\n */\nexport interface ChainCustomEvents {\n on(channel: string, handler: ChainCustomEventHandler): () => void\n emit(channel: string, ...args: unknown[]): void\n}\n\n/**\n * Context that exposes the apply-chain plugin stores.\n *\n * Provided by `createApp()` (and `run()` eventually) when an apply-chain\n * runtime is present. Hooks prefer this context; they fall back to\n * {@link RuntimeContext} when the chain is absent (e.g. children inside\n * an `InputBoundary`, which provides its own isolated RuntimeContext but\n * no chain).\n */\nexport interface ChainAppContextValue {\n readonly input: ChainInputStore\n readonly paste: ChainPasteStore\n readonly focusEvents: ChainFocusEvents\n /**\n * Raw-key observer — sees every `input:key` op (press/repeat/release/\n * modifier-only), unfiltered by focus or useInput. Used by hooks like\n * `useModifierKeys` that need to track sub-press state regardless of\n * whether a focused element consumed the key.\n */\n readonly rawKeys: ChainRawKeyObserver\n /**\n * Custom event bus — replaces the legacy `RuntimeContextValue.on /\n * emit` surface for app-defined channels. Consumers subscribe via\n * `events.on(\"channel\", handler)` and producers fire via\n * `events.emit(\"channel\", …payload)`.\n */\n readonly events: ChainCustomEvents\n}\n\nexport const ChainAppContext = createContext<ChainAppContextValue | null>(null)\n\n// ============================================================================\n// Cache Backend Context (mode-agnostic cache selection)\n// ============================================================================\n\n/**\n * Cache backend type — determines where ListView stores cached items.\n * - \"terminal\": Write to stdout as native scrollback (inline mode)\n * - \"virtual\": In-memory HistoryBuffer ring buffer (fullscreen + virtualInline)\n * - \"retain\": Cache items but keep them in the render tree (plain fullscreen\n * without virtual scrollback — the virtualizer handles windowing)\n */\nexport type CacheBackend = \"terminal\" | \"virtual\" | \"retain\"\n\n/**\n * Context that provides the cache backend to ListView.\n * Set by the runtime based on rendering mode:\n * - alternateScreen: false (inline) → \"terminal\"\n * - alternateScreen: true + virtualInline → \"virtual\"\n * - alternateScreen: true (plain fullscreen) → \"retain\"\n *\n * Default: \"virtual\" (safe fallback for test renderers — items unmount as expected)\n */\nexport const CacheBackendContext = createContext<CacheBackend>(\"virtual\")\n\n// ============================================================================\n// Focus Manager Context (tree-based focus system)\n// ============================================================================\n\n/**\n * Context for the tree-based focus manager.\n * Provides the FocusManager instance to useFocusable(), useFocusWithin(), and useFocusManager() hooks.\n */\nexport const FocusManagerContext = createContext<FocusManager | null>(null)\n\n// ============================================================================\n// Capability Registry Context\n// ============================================================================\n\n/**\n * Minimal capability lookup interface — matches CapabilityRegistry.get().\n * Defined here to avoid a dependency from ag-react → @silvery/create internals.\n */\nexport interface CapabilityLookup {\n get<T>(key: symbol): T | undefined\n}\n\n/**\n * Context for the capability registry (from @silvery/create composition).\n *\n * Provided by createApp() when a capabilityRegistry exists on the app object.\n * Hooks like useSelection() use this to discover interaction features\n * (e.g., SelectionFeature) without coupling to the composition layer.\n *\n * Returns null in simple `run()` or `render()` apps that don't use pipe() composition.\n */\nexport const CapabilityRegistryContext = createContext<CapabilityLookup | null>(null)\n"],"mappings":";;;;;;AAyBA,MAAa,cAAc,cAA2B,KAAK;;;;;;;;AAa3D,MAAa,cAAc,cAA6B,KAAK;;;;;AAsD7D,MAAa,gBAAgB,cAAyC,KAAK;;;;;AAoB3E,MAAa,gBAAgB,cAAyC,KAAK;;;;;;;;;;AAsE3E,MAAa,iBAAiB,cAA0C,KAAK;AAiG7E,MAAa,kBAAkB,cAA2C,KAAK;;;;;;;;;;AAwB/E,MAAa,sBAAsB,cAA4B,UAAU;;;;;AAUzE,MAAa,sBAAsB,cAAmC,KAAK;;;;;;;;;;AAuB3E,MAAa,4BAA4B,cAAuC,KAAK"}
1
+ {"version":3,"file":"context-CEhuD1R_.mjs","names":[],"sources":["../packages/ag-react/src/context.ts"],"sourcesContent":["/**\n * Silvery React Contexts\n *\n * Provides contexts for:\n * - TermContext: Access to Term instance (for styling/detection)\n * - NodeContext: Access to the current SilveryNode (for useBoxRect)\n * - RuntimeContext: Unified input/app controls (replaces Events/Input/Stdin/App contexts)\n * - StdoutContext: Access to stdout\n * - StderrContext: Access to stderr\n */\n\nimport type { Term } from \"@silvery/ag-term/ansi\"\nimport { createContext } from \"react\"\nimport type { FocusManager } from \"@silvery/ag/focus-manager\"\nimport type { Key } from \"@silvery/ag/keys\"\nimport type { AgNode } from \"@silvery/ag/types\"\n\n// ============================================================================\n// Term Context\n// ============================================================================\n\n/**\n * Context that provides access to the Term instance.\n * Used by useTerm() hook to access terminal capabilities and styling.\n */\nexport const TermContext = createContext<Term | null>(null)\n\n// ============================================================================\n// Node Context\n// ============================================================================\n\n/**\n * Context that provides access to the current SilveryNode.\n * Used by useBoxRect() to subscribe to layout changes.\n *\n * Each Box component wraps its children in a NodeContext.Provider\n * with its corresponding SilveryNode.\n */\nexport const NodeContext = createContext<AgNode | null>(null)\n\n// ============================================================================\n// Stdio Context\n// ============================================================================\n\nexport interface StdoutContextValue {\n /** Standard output stream */\n stdout: NodeJS.WriteStream\n /** Write to stdout */\n write: (data: string) => void\n /**\n * Queue a typed terminal artifact to be flushed after the current rendered\n * frame. Prefer this over raw writeAfterFrame for protocol-owned render\n * artifacts such as terminal images.\n */\n queueFrameArtifact?: (artifact: TerminalFrameArtifact) => void\n /**\n * Queue bytes to be written immediately after the current rendered frame.\n * Escape-sequence components such as terminal images use this so their\n * placements land after the cell buffer paint instead of racing it during\n * React layout effects.\n */\n writeAfterFrame?: (data: string) => void\n /**\n * Notify the scheduler that lines were written to stdout externally.\n * Used by useScrollback to report lines written between renders so that\n * inline mode cursor positioning accounts for the displacement.\n */\n notifyScrollback?: (lines: number) => void\n /**\n * Reset inline cursor state in the output phase.\n * Used by useScrollback on resize to clear cursor tracking before\n * re-emitting frozen items at the new width.\n */\n resetInlineCursor?: () => void\n /**\n * Get inline cursor row relative to render region start. -1 if unknown.\n * Used by useScrollback to position frozen items at the render region start.\n */\n getInlineCursorRow?: () => number\n /**\n * Promote frozen content to scrollback via the output phase.\n * Instead of writing directly to stdout (which causes flicker),\n * this passes the content to the output phase which writes frozen content\n * + live content in a single target.write() — no blanking, no cursor desync.\n */\n promoteScrollback?: (frozenContent: string, frozenLineCount: number) => void\n}\n\n/**\n * Context for stdout access.\n * Used by useStdout() hook.\n */\nexport const StdoutContext = createContext<StdoutContextValue | null>(null)\n\nexport type TerminalFrameArtifact = {\n readonly kind: \"terminal-sequence\"\n readonly owner: string\n readonly sequence: string\n readonly zIndex?: number\n}\n\nexport interface StderrContextValue {\n /** Standard error stream */\n stderr: NodeJS.WriteStream\n /** Write to stderr */\n write: (data: string) => void\n}\n\n/**\n * Context for stderr access.\n * Used by useStderr() hook.\n */\nexport const StderrContext = createContext<StderrContextValue | null>(null)\n\n// ============================================================================\n// Runtime Context (typed bidirectional event bus — TEA)\n// ============================================================================\n\n/**\n * Base events every runtime provides.\n *\n * Retained for backwards compatibility (legacy `useRuntime<E>()` generic\n * slot). The canonical subscription surface is {@link ChainAppContextValue}\n * — input / paste / focus flow through the apply-chain plugin stores and\n * app-defined events ride on {@link ChainCustomEvents}.\n */\nexport interface BaseRuntimeEvents {\n /** Keyboard input: [parsedInput, keyMetadata] */\n input: [input: string, key: Key]\n /** Bracketed paste: [pastedText] */\n paste: [text: string]\n /** Terminal window focus change: [isFocused] */\n focus: [focused: boolean]\n}\n\n/**\n * Minimal runtime handle — the trimmed RuntimeContextValue exposes only\n * app-lifecycle controls (`exit`, and the opt-in pause / resume pair\n * used by console-mode suspension). Input / paste / focus subscriptions\n * live on {@link ChainAppContextValue}; custom view ↔ runtime events\n * live on {@link ChainCustomEvents} (`chain.events.emit / on`).\n *\n * The generic parameter is retained for source compatibility with\n * callers of `useRuntime<LinkEvents>()`; it has no effect on the type\n * surface below.\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface PanicOptions {\n /**\n * Prefix for the copyable terminal diagnostic.\n *\n * Example: `{ title: \"silvercode\" }` prints `silvercode: <message>`.\n */\n title?: string\n /** Additional context lines printed below the panic summary. */\n details?: string | ReadonlyArray<string>\n /** Process exit code to set. Default: 1. */\n exitCode?: number\n}\n\nexport type PanicHandler = (reason: unknown, options?: PanicOptions) => void\n\nexport interface RuntimeContextValue<_E extends BaseRuntimeEvents = BaseRuntimeEvents> {\n /** Exit the application with optional error. */\n exit: (error?: Error) => void\n /** Exit the application and print a copyable diagnostic after terminal cleanup. */\n panic: PanicHandler\n /** Pause rendering output (used by console suspend). */\n pause?: () => void\n /** Resume rendering after a pause. Forces a full redraw. */\n resume?: () => void\n}\n\n/**\n * Context that provides the trimmed runtime handle.\n *\n * When non-null: interactive mode — `useExit()` works. Input / paste /\n * focus subscriptions use `ChainAppContext`.\n *\n * When null: static mode — `useExit()` throws. Hooks subscribe through\n * `ChainAppContext` when present, otherwise no-op.\n */\nexport const RuntimeContext = createContext<RuntimeContextValue | null>(null)\n\n// ============================================================================\n// Chain App Context (TEA Phase 2 — apply-chain plugin stores)\n// ============================================================================\n\n/**\n * Minimal key shape forwarded to chain handlers. Kept structural (not\n * imported from @silvery/ag/keys) so this context stays dependency-free;\n * consumers narrow to `Key` at the call site.\n */\nexport interface ChainKey {\n ctrl?: boolean\n shift?: boolean\n meta?: boolean\n super?: boolean\n hyper?: boolean\n alt?: boolean\n eventType?: \"press\" | \"repeat\" | \"release\" | undefined\n}\n\n/** Handler registered with the fallback useInput store. */\nexport type ChainInputHandler = (input: string, key: ChainKey) => void | \"exit\"\n\n/** Handler registered with the paste store. */\nexport type ChainPasteHandler = (text: string) => void\n\n/** Handler registered with the terminal focus store. */\nexport type ChainFocusHandler = (focused: boolean) => void\n\n/** Raw-key observer handler — fires for every input:key op (press/repeat/release/modifier-only). */\nexport type ChainRawKeyHandler = (input: string, key: ChainKey) => void\n\n/** Handler registered with the custom-events store — payload is app-defined. */\nexport type ChainCustomEventHandler = (...args: unknown[]) => void\n\n/** Input-fallback store slice exposed by withInputChain. */\nexport interface ChainInputStore {\n register(handler: ChainInputHandler, active?: boolean): () => void\n setActive(handler: ChainInputHandler, active: boolean): void\n}\n\n/** Raw-key observer slice — sees every key event before focus/useInput filters. */\nexport interface ChainRawKeyObserver {\n register(handler: ChainRawKeyHandler): () => void\n}\n\n/** Paste store slice exposed by withPasteChain. */\nexport interface ChainPasteStore {\n register(handler: ChainPasteHandler): () => void\n}\n\n/** Window focus slice exposed alongside the chain for createApp. */\nexport interface ChainFocusEvents {\n register(handler: ChainFocusHandler): () => void\n}\n\n/**\n * Custom-events slice — app-defined view ↔ runtime events (e.g.\n * `link:open` fired by `<Link>` and consumed by km-tui's\n * `useLinkOpen`). Channels are arbitrary strings chosen by the app;\n * payloads are untyped at the bus layer.\n */\nexport interface ChainCustomEvents {\n on(channel: string, handler: ChainCustomEventHandler): () => void\n emit(channel: string, ...args: unknown[]): void\n}\n\n/**\n * Context that exposes the apply-chain plugin stores.\n *\n * Provided by `createApp()` (and `run()` eventually) when an apply-chain\n * runtime is present. Hooks prefer this context; they fall back to\n * {@link RuntimeContext} when the chain is absent (e.g. children inside\n * an `InputBoundary`, which provides its own isolated RuntimeContext but\n * no chain).\n */\nexport interface ChainAppContextValue {\n readonly input: ChainInputStore\n readonly paste: ChainPasteStore\n readonly focusEvents: ChainFocusEvents\n /**\n * Raw-key observer — sees every `input:key` op (press/repeat/release/\n * modifier-only), unfiltered by focus or useInput. Used by hooks like\n * `useModifierKeys` that need to track sub-press state regardless of\n * whether a focused element consumed the key.\n */\n readonly rawKeys: ChainRawKeyObserver\n /**\n * Custom event bus — replaces the legacy `RuntimeContextValue.on /\n * emit` surface for app-defined channels. Consumers subscribe via\n * `events.on(\"channel\", handler)` and producers fire via\n * `events.emit(\"channel\", …payload)`.\n */\n readonly events: ChainCustomEvents\n}\n\nexport const ChainAppContext = createContext<ChainAppContextValue | null>(null)\n\n// ============================================================================\n// Cache Backend Context (mode-agnostic cache selection)\n// ============================================================================\n\n/**\n * Cache backend type — determines where ListView stores cached items.\n * - \"terminal\": Write to stdout as native scrollback (inline mode)\n * - \"virtual\": In-memory HistoryBuffer ring buffer (fullscreen + virtualInline)\n * - \"retain\": Cache items but keep them in the render tree (plain fullscreen\n * without virtual scrollback — the virtualizer handles windowing)\n */\nexport type CacheBackend = \"terminal\" | \"virtual\" | \"retain\"\n\n/**\n * Context that provides the cache backend to ListView.\n * Set by the runtime based on rendering mode:\n * - alternateScreen: false (inline) → \"terminal\"\n * - alternateScreen: true + virtualInline → \"virtual\"\n * - alternateScreen: true (plain fullscreen) → \"retain\"\n *\n * Default: \"virtual\" (safe fallback for test renderers — items unmount as expected)\n */\nexport const CacheBackendContext = createContext<CacheBackend>(\"virtual\")\n\n// ============================================================================\n// Focus Manager Context (tree-based focus system)\n// ============================================================================\n\n/**\n * Context for the tree-based focus manager.\n * Provides the FocusManager instance to useFocusable(), useFocusWithin(), and useFocusManager() hooks.\n */\nexport const FocusManagerContext = createContext<FocusManager | null>(null)\n\n// ============================================================================\n// Capability Registry Context\n// ============================================================================\n\n/**\n * Minimal capability lookup interface — matches CapabilityRegistry.get().\n * Defined here to avoid a dependency from ag-react → @silvery/create internals.\n */\nexport interface CapabilityLookup {\n get<T>(key: symbol): T | undefined\n}\n\n/**\n * Context for the capability registry (from @silvery/create composition).\n *\n * Provided by createApp() when a capabilityRegistry exists on the app object.\n * Hooks like useSelection() use this to discover interaction features\n * (e.g., SelectionFeature) without coupling to the composition layer.\n *\n * Returns null in simple `run()` or `render()` apps that don't use pipe() composition.\n */\nexport const CapabilityRegistryContext = createContext<CapabilityLookup | null>(null)\n"],"mappings":";;;;;;AAyBA,MAAa,cAAc,cAA2B,KAAK;;;;;;;;AAa3D,MAAa,cAAc,cAA6B,KAAK;;;;;AAsD7D,MAAa,gBAAgB,cAAyC,KAAK;;;;;AAoB3E,MAAa,gBAAgB,cAAyC,KAAK;;;;;;;;;;AAsE3E,MAAa,iBAAiB,cAA0C,KAAK;AAiG7E,MAAa,kBAAkB,cAA2C,KAAK;;;;;;;;;;AAwB/E,MAAa,sBAAsB,cAA4B,UAAU;;;;;AAUzE,MAAa,sBAAsB,cAAmC,KAAK;;;;;;;;;;AAuB3E,MAAa,4BAA4B,cAAuC,KAAK"}
@@ -0,0 +1,2 @@
1
+ import { t as autoConnectDevTools } from "./devtools-td2AjFwc.mjs";
2
+ export { autoConnectDevTools };
@@ -1,5 +1,5 @@
1
- import { o as __toESM } from "./chunk-BSw8zbkd.mjs";
2
- import { i as reconciler } from "./reconciler-DldIJB93.mjs";
1
+ import { i as __toESM } from "./chunk-BEJ448es.mjs";
2
+ import { i as reconciler } from "./reconciler--_-biN23.mjs";
3
3
  import { createLogger } from "loggily";
4
4
  //#region packages/ag-term/src/devtools.ts
5
5
  /**
@@ -40,7 +40,7 @@ async function connectDevTools() {
40
40
  if (connected) return true;
41
41
  try {
42
42
  if (typeof globalThis.WebSocket === "undefined") try {
43
- const ws = await import("./wrapper-C70ATkVv.mjs");
43
+ const ws = await import("./wrapper-CD29afOs.mjs");
44
44
  globalThis.WebSocket = ws.default ?? ws;
45
45
  } catch {
46
46
  log.warn?.("WebSocket polyfill (ws) not available. Install ws for DevTools support: bun add -d ws");
@@ -57,7 +57,7 @@ async function connectDevTools() {
57
57
  isEnabled: true,
58
58
  isValid: true
59
59
  }];
60
- const devtools = await import("./backend-B-WYLUib.mjs").then((m) => /* @__PURE__ */ __toESM(m.default, 1));
60
+ const devtools = await import("./backend-DSiSIc-h.mjs").then((m) => /* @__PURE__ */ __toESM(m.default, 1));
61
61
  devtools.initialize();
62
62
  devtools.connectToDevTools();
63
63
  reconciler.injectIntoDevTools();
@@ -86,4 +86,4 @@ async function autoConnectDevTools() {
86
86
  //#endregion
87
87
  export { connectDevTools as n, isDevToolsConnected as r, autoConnectDevTools as t };
88
88
 
89
- //# sourceMappingURL=devtools-DcQjgyjL.mjs.map
89
+ //# sourceMappingURL=devtools-td2AjFwc.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"devtools-DcQjgyjL.mjs","names":[],"sources":["../packages/ag-term/src/devtools.ts"],"sourcesContent":["/**\n * React DevTools integration for silvery.\n *\n * Provides optional connection to React DevTools standalone app for\n * debugging TUI component trees. Requires `react-devtools-core` to be\n * installed (optional peer dependency).\n *\n * Usage:\n * 1. Install: `bun add -d react-devtools-core`\n * 2. Run devtools: `npx react-devtools`\n * 3. Launch app with: `DEBUG_DEVTOOLS=1 bun run app.ts`\n *\n * Or call `connectDevTools()` manually from your app code.\n *\n * @module\n */\n\nimport { reconciler } from \"@silvery/ag-react/reconciler\"\nimport { createLogger } from \"loggily\"\n\nconst log = createLogger(\"silvery:devtools\")\n\nlet connected = false\n\n/**\n * Connect to React DevTools standalone app.\n *\n * This lazy-loads `react-devtools-core` so it has zero impact on\n * production bundles. The connection is established via WebSocket\n * to the devtools electron app (default: ws://localhost:8097).\n *\n * Safe to call multiple times -- subsequent calls are no-ops.\n *\n * @example\n * ```ts\n * import { connectDevTools } from '@silvery/ag-react';\n * await connectDevTools();\n * // Now open React DevTools standalone to inspect the component tree\n * ```\n */\nexport async function connectDevTools(): Promise<boolean> {\n if (connected) return true\n\n try {\n // Polyfill WebSocket for Node.js environments (required by react-devtools-core)\n if (typeof globalThis.WebSocket === \"undefined\") {\n try {\n // @ts-expect-error -- ws is an optional peer dependency\n const ws = await import(\"ws\")\n globalThis.WebSocket = ws.default ?? ws\n } catch {\n // ws not available -- devtools won't be able to connect\n log.warn?.(\n \"WebSocket polyfill (ws) not available. \" +\n \"Install ws for DevTools support: bun add -d ws\",\n )\n return false\n }\n }\n\n // Ensure window/self exist for react-devtools-core internals\n if (typeof globalThis.window === \"undefined\") {\n // @ts-expect-error -- polyfill for devtools\n globalThis.window = globalThis\n }\n\n // Configure component filters to hide silvery internals from the DevTools tree.\n // Filter types from react-devtools-shared/src/types.js:\n // 1 = ComponentFilterElementType, value 7 = HostComponent\n // 2 = ComponentFilterDisplayName (regex on displayName)\n if (!globalThis.__REACT_DEVTOOLS_COMPONENT_FILTERS__) {\n globalThis.__REACT_DEVTOOLS_COMPONENT_FILTERS__ = [\n { type: 1, value: 7, isEnabled: true },\n { type: 2, value: \"SilveryApp\", isEnabled: true, isValid: true },\n ]\n }\n\n // @ts-expect-error -- react-devtools-core has no type declarations\n const devtools = await import(\"react-devtools-core\")\n devtools.initialize()\n devtools.connectToDevTools()\n\n // Inject renderer info so DevTools can identify silvery.\n // rendererPackageName and rendererVersion are read from the host config\n // passed to Reconciler() -- see reconciler/host-config.ts.\n reconciler.injectIntoDevTools()\n\n connected = true\n return true\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error)\n log.warn?.(\n `Failed to connect to React DevTools. ` +\n `Install react-devtools-core: bun add -d react-devtools-core\\n` +\n ` Error: ${message}`,\n )\n return false\n }\n}\n\n/**\n * Check if DevTools are currently connected.\n */\nexport function isDevToolsConnected(): boolean {\n return connected\n}\n\n/**\n * Auto-connect to DevTools if DEBUG_DEVTOOLS=1 environment variable is set.\n * Called internally during render initialization.\n */\nexport async function autoConnectDevTools(): Promise<void> {\n if (process.env.DEBUG_DEVTOOLS === \"1\" || process.env.DEBUG_DEVTOOLS === \"true\") {\n await connectDevTools()\n }\n}\n\n// Global type augmentation for devtools polyfills\ndeclare global {\n var __REACT_DEVTOOLS_COMPONENT_FILTERS__: Array<{\n type: number\n value: number | string\n isEnabled: boolean\n isValid?: boolean\n }>\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAoBA,MAAM,MAAM,aAAa,mBAAmB;AAE5C,IAAI,YAAY;;;;;;;;;;;;;;;;;AAkBhB,eAAsB,kBAAoC;AACxD,KAAI,UAAW,QAAO;AAEtB,KAAI;AAEF,MAAI,OAAO,WAAW,cAAc,YAClC,KAAI;GAEF,MAAM,KAAK,MAAM,OAAO;AACxB,cAAW,YAAY,GAAG,WAAW;UAC/B;AAEN,OAAI,OACF,wFAED;AACD,UAAO;;AAKX,MAAI,OAAO,WAAW,WAAW,YAE/B,YAAW,SAAS;AAOtB,MAAI,CAAC,WAAW,qCACd,YAAW,uCAAuC,CAChD;GAAE,MAAM;GAAG,OAAO;GAAG,WAAW;GAAM,EACtC;GAAE,MAAM;GAAG,OAAO;GAAc,WAAW;GAAM,SAAS;GAAM,CACjE;EAIH,MAAM,WAAW,MAAM,OAAO,0BAAA,MAAA,MAAA,wBAAA,EAAA,SAAA,EAAA,CAAA;AAC9B,WAAS,YAAY;AACrB,WAAS,mBAAmB;AAK5B,aAAW,oBAAoB;AAE/B,cAAY;AACZ,SAAO;UACA,OAAgB;EACvB,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACtE,MAAI,OACF;WAEc,UACf;AACD,SAAO;;;;;;AAOX,SAAgB,sBAA+B;AAC7C,QAAO;;;;;;AAOT,eAAsB,sBAAqC;AACzD,KAAI,QAAQ,IAAI,mBAAmB,OAAO,QAAQ,IAAI,mBAAmB,OACvE,OAAM,iBAAiB"}
1
+ {"version":3,"file":"devtools-td2AjFwc.mjs","names":[],"sources":["../packages/ag-term/src/devtools.ts"],"sourcesContent":["/**\n * React DevTools integration for silvery.\n *\n * Provides optional connection to React DevTools standalone app for\n * debugging TUI component trees. Requires `react-devtools-core` to be\n * installed (optional peer dependency).\n *\n * Usage:\n * 1. Install: `bun add -d react-devtools-core`\n * 2. Run devtools: `npx react-devtools`\n * 3. Launch app with: `DEBUG_DEVTOOLS=1 bun run app.ts`\n *\n * Or call `connectDevTools()` manually from your app code.\n *\n * @module\n */\n\nimport { reconciler } from \"@silvery/ag-react/reconciler\"\nimport { createLogger } from \"loggily\"\n\nconst log = createLogger(\"silvery:devtools\")\n\nlet connected = false\n\n/**\n * Connect to React DevTools standalone app.\n *\n * This lazy-loads `react-devtools-core` so it has zero impact on\n * production bundles. The connection is established via WebSocket\n * to the devtools electron app (default: ws://localhost:8097).\n *\n * Safe to call multiple times -- subsequent calls are no-ops.\n *\n * @example\n * ```ts\n * import { connectDevTools } from '@silvery/ag-react';\n * await connectDevTools();\n * // Now open React DevTools standalone to inspect the component tree\n * ```\n */\nexport async function connectDevTools(): Promise<boolean> {\n if (connected) return true\n\n try {\n // Polyfill WebSocket for Node.js environments (required by react-devtools-core)\n if (typeof globalThis.WebSocket === \"undefined\") {\n try {\n // @ts-expect-error -- ws is an optional peer dependency\n const ws = await import(\"ws\")\n globalThis.WebSocket = ws.default ?? ws\n } catch {\n // ws not available -- devtools won't be able to connect\n log.warn?.(\n \"WebSocket polyfill (ws) not available. \" +\n \"Install ws for DevTools support: bun add -d ws\",\n )\n return false\n }\n }\n\n // Ensure window/self exist for react-devtools-core internals\n if (typeof globalThis.window === \"undefined\") {\n // @ts-expect-error -- polyfill for devtools\n globalThis.window = globalThis\n }\n\n // Configure component filters to hide silvery internals from the DevTools tree.\n // Filter types from react-devtools-shared/src/types.js:\n // 1 = ComponentFilterElementType, value 7 = HostComponent\n // 2 = ComponentFilterDisplayName (regex on displayName)\n if (!globalThis.__REACT_DEVTOOLS_COMPONENT_FILTERS__) {\n globalThis.__REACT_DEVTOOLS_COMPONENT_FILTERS__ = [\n { type: 1, value: 7, isEnabled: true },\n { type: 2, value: \"SilveryApp\", isEnabled: true, isValid: true },\n ]\n }\n\n // @ts-expect-error -- react-devtools-core has no type declarations\n const devtools = await import(\"react-devtools-core\")\n devtools.initialize()\n devtools.connectToDevTools()\n\n // Inject renderer info so DevTools can identify silvery.\n // rendererPackageName and rendererVersion are read from the host config\n // passed to Reconciler() -- see reconciler/host-config.ts.\n reconciler.injectIntoDevTools()\n\n connected = true\n return true\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error)\n log.warn?.(\n `Failed to connect to React DevTools. ` +\n `Install react-devtools-core: bun add -d react-devtools-core\\n` +\n ` Error: ${message}`,\n )\n return false\n }\n}\n\n/**\n * Check if DevTools are currently connected.\n */\nexport function isDevToolsConnected(): boolean {\n return connected\n}\n\n/**\n * Auto-connect to DevTools if DEBUG_DEVTOOLS=1 environment variable is set.\n * Called internally during render initialization.\n */\nexport async function autoConnectDevTools(): Promise<void> {\n if (process.env.DEBUG_DEVTOOLS === \"1\" || process.env.DEBUG_DEVTOOLS === \"true\") {\n await connectDevTools()\n }\n}\n\n// Global type augmentation for devtools polyfills\ndeclare global {\n var __REACT_DEVTOOLS_COMPONENT_FILTERS__: Array<{\n type: number\n value: number | string\n isEnabled: boolean\n isValid?: boolean\n }>\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAoBA,MAAM,MAAM,aAAa,mBAAmB;AAE5C,IAAI,YAAY;;;;;;;;;;;;;;;;;AAkBhB,eAAsB,kBAAoC;AACxD,KAAI,UAAW,QAAO;AAEtB,KAAI;AAEF,MAAI,OAAO,WAAW,cAAc,YAClC,KAAI;GAEF,MAAM,KAAK,MAAM,OAAO;AACxB,cAAW,YAAY,GAAG,WAAW;UAC/B;AAEN,OAAI,OACF,wFAED;AACD,UAAO;;AAKX,MAAI,OAAO,WAAW,WAAW,YAE/B,YAAW,SAAS;AAOtB,MAAI,CAAC,WAAW,qCACd,YAAW,uCAAuC,CAChD;GAAE,MAAM;GAAG,OAAO;GAAG,WAAW;GAAM,EACtC;GAAE,MAAM;GAAG,OAAO;GAAc,WAAW;GAAM,SAAS;GAAM,CACjE;EAIH,MAAM,WAAW,MAAM,OAAO,0BAAA,MAAA,MAAA,wBAAA,EAAA,SAAA,EAAA,CAAA;AAC9B,WAAS,YAAY;AACrB,WAAS,mBAAmB;AAK5B,aAAW,oBAAoB;AAE/B,cAAY;AACZ,SAAO;UACA,OAAgB;EACvB,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACtE,MAAI,OACF;WAEc,UACf;AACD,SAAO;;;;;;AAOX,SAAgB,sBAA+B;AAC7C,QAAO;;;;;;AAOT,eAAsB,sBAAqC;AACzD,KAAI,QAAQ,IAAI,mBAAmB,OAAO,QAAQ,IAAI,mBAAmB,OACvE,OAAM,iBAAiB"}
@@ -21,4 +21,4 @@ type EasingName = keyof typeof easings;
21
21
  declare function resolveEasing(easing: EasingName | EasingFn): EasingFn;
22
22
  //#endregion
23
23
  export { resolveEasing as i, EasingName as n, easings as r, EasingFn as t };
24
- //# sourceMappingURL=easing-BI-ASGMO.d.mts.map
24
+ //# sourceMappingURL=easing-C5MrdO7V.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"easing-BI-ASGMO.d.mts","names":[],"sources":["../packages/ag-react/src/ui/animation/easing.ts"],"mappings":";;AAYA;;;;;AAMA;AAAA,KANY,QAAA,IAAY,CAAA;AAAA,cAMX,OAAA;EAAA;;;;;;;;KAUD,UAAA,gBAA0B,OAAA;;iBAOtB,aAAA,CAAc,MAAA,EAAQ,UAAA,GAAa,QAAA,GAAW,QAAA"}
1
+ {"version":3,"file":"easing-C5MrdO7V.d.mts","names":[],"sources":["../packages/ag-react/src/ui/animation/easing.ts"],"mappings":";;AAYA;;;;;AAMA;AAAA,KANY,QAAA,IAAY,CAAA;AAAA,cAMX,OAAA;EAAA;;;;;;;;KAUD,UAAA,gBAA0B,OAAA;;iBAOtB,aAAA,CAAc,MAAA,EAAQ,UAAA,GAAa,QAAA,GAAW,QAAA"}
@@ -107,4 +107,4 @@ function createETATracker(bufferSize = 10) {
107
107
  //#endregion
108
108
  export { getETA as a, formatETA as i, calculateETA as n, createETATracker as r, DEFAULT_ETA_BUFFER_SIZE as t };
109
109
 
110
- //# sourceMappingURL=eta-CJlGH06n.mjs.map
110
+ //# sourceMappingURL=eta-BwYWEjfS.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"eta-CJlGH06n.mjs","names":[],"sources":["../packages/ag-react/src/ui/utils/eta.ts"],"sourcesContent":["/**\n * Shared ETA calculation utilities\n */\n\n/** Sample point for ETA calculation */\nexport interface ETASample {\n time: number\n value: number\n}\n\n/** ETA calculation result */\nexport interface ETAResult {\n /** Estimated seconds remaining, or null if insufficient data */\n seconds: number | null\n /** Formatted ETA string (e.g., \"1:30\", \"2:15:30\", \"--:--\") */\n formatted: string\n}\n\n/**\n * Calculate ETA from a buffer of samples\n *\n * @param buffer - Array of {time, value} samples\n * @param current - Current progress value\n * @param total - Total target value\n * @returns ETA in seconds (null if insufficient data)\n *\n * @example\n * ```ts\n * const buffer = [\n * { time: 1000, value: 0 },\n * { time: 2000, value: 10 },\n * ];\n * const eta = calculateETA(buffer, 10, 100);\n * // eta = 9 (9 seconds remaining at 10 items/sec)\n * ```\n */\nexport function calculateETA(buffer: ETASample[], current: number, total: number): number | null {\n if (buffer.length < 2) {\n return null\n }\n\n const first = buffer[0]!\n const last = buffer[buffer.length - 1]!\n\n const elapsed = (last.time - first.time) / 1000 // seconds\n const progress = last.value - first.value\n\n if (elapsed <= 0 || progress <= 0) {\n return null\n }\n\n const rate = progress / elapsed // items per second\n const remaining = total - current\n\n return remaining / rate\n}\n\n/**\n * Format ETA seconds as human-readable string\n *\n * @param eta - ETA in seconds (null for unknown)\n * @returns Formatted string (e.g., \"1:30\", \"2:15:30\", \"--:--\", \">1d\")\n *\n * @example\n * ```ts\n * formatETA(90) // \"1:30\"\n * formatETA(3665) // \"1:01:05\"\n * formatETA(null) // \"--:--\"\n * formatETA(100000) // \">1d\"\n * ```\n */\nexport function formatETA(eta: number | null): string {\n if (eta === null || !isFinite(eta)) {\n return \"--:--\"\n }\n\n if (eta > 86400) {\n // > 24 hours\n return \">1d\"\n }\n\n const hours = Math.floor(eta / 3600)\n const minutes = Math.floor((eta % 3600) / 60)\n const seconds = Math.floor(eta % 60)\n\n if (hours > 0) {\n return `${hours}:${minutes.toString().padStart(2, \"0\")}:${seconds.toString().padStart(2, \"0\")}`\n }\n\n return `${minutes}:${seconds.toString().padStart(2, \"0\")}`\n}\n\n/**\n * Calculate and format ETA in one call\n *\n * @param buffer - Array of {time, value} samples\n * @param current - Current progress value\n * @param total - Total target value\n * @returns Object with seconds (number|null) and formatted string\n */\nexport function getETA(buffer: ETASample[], current: number, total: number): ETAResult {\n const seconds = calculateETA(buffer, current, total)\n return {\n seconds,\n formatted: formatETA(seconds),\n }\n}\n\n/** Default buffer size for ETA smoothing */\nexport const DEFAULT_ETA_BUFFER_SIZE = 10\n\n/**\n * Create an ETA tracker with automatic buffer management\n *\n * @param bufferSize - Number of samples to keep (default: 10)\n * @returns ETA tracker object\n *\n * @example\n * ```ts\n * const tracker = createETATracker();\n * tracker.record(0);\n * // ... later ...\n * tracker.record(50);\n * const eta = tracker.getETA(50, 100);\n * console.log(eta.formatted); // \"0:30\"\n * ```\n */\nexport function createETATracker(bufferSize = DEFAULT_ETA_BUFFER_SIZE) {\n const buffer: ETASample[] = []\n\n return {\n /** Record a new sample */\n record(value: number): void {\n buffer.push({ time: Date.now(), value })\n if (buffer.length > bufferSize) {\n buffer.shift()\n }\n },\n\n /** Get current ETA */\n getETA(current: number, total: number): ETAResult {\n return getETA(buffer, current, total)\n },\n\n /** Reset the buffer */\n reset(): void {\n buffer.length = 0\n },\n\n /** Get buffer for external use */\n getBuffer(): readonly ETASample[] {\n return buffer\n },\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAoCA,SAAgB,aAAa,QAAqB,SAAiB,OAA8B;AAC/F,KAAI,OAAO,SAAS,EAClB,QAAO;CAGT,MAAM,QAAQ,OAAO;CACrB,MAAM,OAAO,OAAO,OAAO,SAAS;CAEpC,MAAM,WAAW,KAAK,OAAO,MAAM,QAAQ;CAC3C,MAAM,WAAW,KAAK,QAAQ,MAAM;AAEpC,KAAI,WAAW,KAAK,YAAY,EAC9B,QAAO;CAGT,MAAM,OAAO,WAAW;AAGxB,SAFkB,QAAQ,WAEP;;;;;;;;;;;;;;;;AAiBrB,SAAgB,UAAU,KAA4B;AACpD,KAAI,QAAQ,QAAQ,CAAC,SAAS,IAAI,CAChC,QAAO;AAGT,KAAI,MAAM,MAER,QAAO;CAGT,MAAM,QAAQ,KAAK,MAAM,MAAM,KAAK;CACpC,MAAM,UAAU,KAAK,MAAO,MAAM,OAAQ,GAAG;CAC7C,MAAM,UAAU,KAAK,MAAM,MAAM,GAAG;AAEpC,KAAI,QAAQ,EACV,QAAO,GAAG,MAAM,GAAG,QAAQ,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,QAAQ,UAAU,CAAC,SAAS,GAAG,IAAI;AAG/F,QAAO,GAAG,QAAQ,GAAG,QAAQ,UAAU,CAAC,SAAS,GAAG,IAAI;;;;;;;;;;AAW1D,SAAgB,OAAO,QAAqB,SAAiB,OAA0B;CACrF,MAAM,UAAU,aAAa,QAAQ,SAAS,MAAM;AACpD,QAAO;EACL;EACA,WAAW,UAAU,QAAQ;EAC9B;;;AAIH,MAAa,0BAA0B;;;;;;;;;;;;;;;;;AAkBvC,SAAgB,iBAAiB,aAAA,IAAsC;CACrE,MAAM,SAAsB,EAAE;AAE9B,QAAO;EAEL,OAAO,OAAqB;AAC1B,UAAO,KAAK;IAAE,MAAM,KAAK,KAAK;IAAE;IAAO,CAAC;AACxC,OAAI,OAAO,SAAS,WAClB,QAAO,OAAO;;EAKlB,OAAO,SAAiB,OAA0B;AAChD,UAAO,OAAO,QAAQ,SAAS,MAAM;;EAIvC,QAAc;AACZ,UAAO,SAAS;;EAIlB,YAAkC;AAChC,UAAO;;EAEV"}
1
+ {"version":3,"file":"eta-BwYWEjfS.mjs","names":[],"sources":["../packages/ag-react/src/ui/utils/eta.ts"],"sourcesContent":["/**\n * Shared ETA calculation utilities\n */\n\n/** Sample point for ETA calculation */\nexport interface ETASample {\n time: number\n value: number\n}\n\n/** ETA calculation result */\nexport interface ETAResult {\n /** Estimated seconds remaining, or null if insufficient data */\n seconds: number | null\n /** Formatted ETA string (e.g., \"1:30\", \"2:15:30\", \"--:--\") */\n formatted: string\n}\n\n/**\n * Calculate ETA from a buffer of samples\n *\n * @param buffer - Array of {time, value} samples\n * @param current - Current progress value\n * @param total - Total target value\n * @returns ETA in seconds (null if insufficient data)\n *\n * @example\n * ```ts\n * const buffer = [\n * { time: 1000, value: 0 },\n * { time: 2000, value: 10 },\n * ];\n * const eta = calculateETA(buffer, 10, 100);\n * // eta = 9 (9 seconds remaining at 10 items/sec)\n * ```\n */\nexport function calculateETA(buffer: ETASample[], current: number, total: number): number | null {\n if (buffer.length < 2) {\n return null\n }\n\n const first = buffer[0]!\n const last = buffer[buffer.length - 1]!\n\n const elapsed = (last.time - first.time) / 1000 // seconds\n const progress = last.value - first.value\n\n if (elapsed <= 0 || progress <= 0) {\n return null\n }\n\n const rate = progress / elapsed // items per second\n const remaining = total - current\n\n return remaining / rate\n}\n\n/**\n * Format ETA seconds as human-readable string\n *\n * @param eta - ETA in seconds (null for unknown)\n * @returns Formatted string (e.g., \"1:30\", \"2:15:30\", \"--:--\", \">1d\")\n *\n * @example\n * ```ts\n * formatETA(90) // \"1:30\"\n * formatETA(3665) // \"1:01:05\"\n * formatETA(null) // \"--:--\"\n * formatETA(100000) // \">1d\"\n * ```\n */\nexport function formatETA(eta: number | null): string {\n if (eta === null || !isFinite(eta)) {\n return \"--:--\"\n }\n\n if (eta > 86400) {\n // > 24 hours\n return \">1d\"\n }\n\n const hours = Math.floor(eta / 3600)\n const minutes = Math.floor((eta % 3600) / 60)\n const seconds = Math.floor(eta % 60)\n\n if (hours > 0) {\n return `${hours}:${minutes.toString().padStart(2, \"0\")}:${seconds.toString().padStart(2, \"0\")}`\n }\n\n return `${minutes}:${seconds.toString().padStart(2, \"0\")}`\n}\n\n/**\n * Calculate and format ETA in one call\n *\n * @param buffer - Array of {time, value} samples\n * @param current - Current progress value\n * @param total - Total target value\n * @returns Object with seconds (number|null) and formatted string\n */\nexport function getETA(buffer: ETASample[], current: number, total: number): ETAResult {\n const seconds = calculateETA(buffer, current, total)\n return {\n seconds,\n formatted: formatETA(seconds),\n }\n}\n\n/** Default buffer size for ETA smoothing */\nexport const DEFAULT_ETA_BUFFER_SIZE = 10\n\n/**\n * Create an ETA tracker with automatic buffer management\n *\n * @param bufferSize - Number of samples to keep (default: 10)\n * @returns ETA tracker object\n *\n * @example\n * ```ts\n * const tracker = createETATracker();\n * tracker.record(0);\n * // ... later ...\n * tracker.record(50);\n * const eta = tracker.getETA(50, 100);\n * console.log(eta.formatted); // \"0:30\"\n * ```\n */\nexport function createETATracker(bufferSize = DEFAULT_ETA_BUFFER_SIZE) {\n const buffer: ETASample[] = []\n\n return {\n /** Record a new sample */\n record(value: number): void {\n buffer.push({ time: Date.now(), value })\n if (buffer.length > bufferSize) {\n buffer.shift()\n }\n },\n\n /** Get current ETA */\n getETA(current: number, total: number): ETAResult {\n return getETA(buffer, current, total)\n },\n\n /** Reset the buffer */\n reset(): void {\n buffer.length = 0\n },\n\n /** Get buffer for external use */\n getBuffer(): readonly ETASample[] {\n return buffer\n },\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAoCA,SAAgB,aAAa,QAAqB,SAAiB,OAA8B;AAC/F,KAAI,OAAO,SAAS,EAClB,QAAO;CAGT,MAAM,QAAQ,OAAO;CACrB,MAAM,OAAO,OAAO,OAAO,SAAS;CAEpC,MAAM,WAAW,KAAK,OAAO,MAAM,QAAQ;CAC3C,MAAM,WAAW,KAAK,QAAQ,MAAM;AAEpC,KAAI,WAAW,KAAK,YAAY,EAC9B,QAAO;CAGT,MAAM,OAAO,WAAW;AAGxB,SAFkB,QAAQ,WAEP;;;;;;;;;;;;;;;;AAiBrB,SAAgB,UAAU,KAA4B;AACpD,KAAI,QAAQ,QAAQ,CAAC,SAAS,IAAI,CAChC,QAAO;AAGT,KAAI,MAAM,MAER,QAAO;CAGT,MAAM,QAAQ,KAAK,MAAM,MAAM,KAAK;CACpC,MAAM,UAAU,KAAK,MAAO,MAAM,OAAQ,GAAG;CAC7C,MAAM,UAAU,KAAK,MAAM,MAAM,GAAG;AAEpC,KAAI,QAAQ,EACV,QAAO,GAAG,MAAM,GAAG,QAAQ,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,QAAQ,UAAU,CAAC,SAAS,GAAG,IAAI;AAG/F,QAAO,GAAG,QAAQ,GAAG,QAAQ,UAAU,CAAC,SAAS,GAAG,IAAI;;;;;;;;;;AAW1D,SAAgB,OAAO,QAAqB,SAAiB,OAA0B;CACrF,MAAM,UAAU,aAAa,QAAQ,SAAS,MAAM;AACpD,QAAO;EACL;EACA,WAAW,UAAU,QAAQ;EAC9B;;;AAIH,MAAa,0BAA0B;;;;;;;;;;;;;;;;;AAkBvC,SAAgB,iBAAiB,aAAA,IAAsC;CACrE,MAAM,SAAsB,EAAE;AAE9B,QAAO;EAEL,OAAO,OAAqB;AAC1B,UAAO,KAAK;IAAE,MAAM,KAAK,KAAK;IAAE;IAAO,CAAC;AACxC,OAAI,OAAO,SAAS,WAClB,QAAO,OAAO;;EAKlB,OAAO,SAAiB,OAA0B;AAChD,UAAO,OAAO,QAAQ,SAAS,MAAM;;EAIvC,QAAc;AACZ,UAAO,SAAS;;EAIlB,YAAkC;AAChC,UAAO;;EAEV"}
@@ -1,2 +1,2 @@
1
- import { n as createFlexilyZeroEngine } from "./flexily-zero-adapter-C3Vj0fPt.mjs";
1
+ import { n as createFlexilyZeroEngine } from "./flexily-zero-adapter-VoBGHG14.mjs";
2
2
  export { createFlexilyZeroEngine };
@@ -303,4 +303,4 @@ function createFlexilyZeroEngine() {
303
303
  //#endregion
304
304
  export { createFlexilyZeroEngine as n, FlexilyZeroLayoutEngine as t };
305
305
 
306
- //# sourceMappingURL=flexily-zero-adapter-C3Vj0fPt.mjs.map
306
+ //# sourceMappingURL=flexily-zero-adapter-VoBGHG14.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"flexily-zero-adapter-C3Vj0fPt.mjs","names":["FlexilyNode"],"sources":["../packages/ag-term/src/adapters/flexily-zero-adapter.ts"],"sourcesContent":["/**\n * Flexily Layout Engine Adapter\n *\n * Wraps Flexily to implement the LayoutEngine interface.\n * Uses the default zero-allocation algorithm from flexily.\n */\n\nimport {\n ALIGN_AUTO,\n ALIGN_BASELINE,\n ALIGN_CENTER,\n ALIGN_FLEX_END,\n ALIGN_FLEX_START,\n ALIGN_SPACE_AROUND,\n ALIGN_SPACE_BETWEEN,\n ALIGN_SPACE_EVENLY,\n ALIGN_STRETCH,\n DIRECTION_LTR,\n DISPLAY_FLEX,\n DISPLAY_NONE,\n EDGE_ALL,\n EDGE_BOTTOM,\n EDGE_HORIZONTAL,\n EDGE_LEFT,\n EDGE_RIGHT,\n EDGE_TOP,\n EDGE_VERTICAL,\n // Constants\n FLEX_DIRECTION_COLUMN,\n FLEX_DIRECTION_COLUMN_REVERSE,\n FLEX_DIRECTION_ROW,\n FLEX_DIRECTION_ROW_REVERSE,\n Node as FlexilyNode,\n GUTTER_ALL,\n GUTTER_COLUMN,\n GUTTER_ROW,\n JUSTIFY_CENTER,\n JUSTIFY_FLEX_END,\n JUSTIFY_FLEX_START,\n JUSTIFY_SPACE_AROUND,\n JUSTIFY_SPACE_BETWEEN,\n JUSTIFY_SPACE_EVENLY,\n MEASURE_MODE_AT_MOST,\n MEASURE_MODE_EXACTLY,\n MEASURE_MODE_MIN_CONTENT,\n MEASURE_MODE_UNDEFINED,\n OVERFLOW_HIDDEN,\n OVERFLOW_SCROLL,\n OVERFLOW_VISIBLE,\n POSITION_TYPE_ABSOLUTE,\n POSITION_TYPE_RELATIVE,\n POSITION_TYPE_STATIC,\n WRAP_NO_WRAP,\n WRAP_WRAP,\n WRAP_WRAP_REVERSE,\n} from \"flexily\"\n\n// Flexily UNIT_CQI / UNIT_CQMIN constants. Hardcoded at this seam rather than\n// imported from \"flexily\" because the published flexily@0.7.1 does not export\n// them yet — A0.2's export-bump (vendor/flexily commit fb61a79) hasn't shipped\n// to npm. Constants are stable per Phase 1 of @km/silvery/responsive-layout-\n// architecture-reframe; same shape as the CONTAINER_TYPE_INLINE_SIZE=1 hardcode\n// in applyBoxProps. When flexily 0.7.2+ ships with the new exports, this can be\n// replaced with a named import.\nconst UNIT_CQI = 6\nconst UNIT_CQMIN = 7\n\nimport type { FitWidthLane, LayoutNode, MeasureFunc, MeasureMode } from \"@silvery/ag/layout-types\"\nimport type {\n AlignValue,\n DirectionValue,\n DisplayValue,\n EdgeValue,\n EngineCapabilities,\n FlexDirectionValue,\n GutterValue,\n JustifyValue,\n LayoutConstants,\n LayoutEngine,\n MeasureModeValue,\n OverflowValue,\n PositionTypeValue,\n WrapValue,\n} from \"../layout-engine\"\n\n/**\n * Capabilities advertised by the flexily-zero adapter.\n *\n * All six A0 primitives shipped: four at A0.1 (engine-native CQ resolution at\n * vendor/flexily `46141e9`), one at A0.2 (fitWidth single-pass lane snap at\n * vendor/flexily `4b44bf9`), one at A0.3 (CSS math functions at vendor/flexily\n * `0aebb95`).\n *\n * - `containerQueries` → A0.1 ✓ — Pass 1 freezeQuerySize + Pass 2 ancestor walk\n * - `containSize` → A0.1 ✓ — Phase 9 inline-axis shrink-wrap gate\n * - `containerQueryUnits` → A0.1 ✓ — UNIT_CQI / UNIT_CQMIN parsed and resolved\n * - `childStyleMutation` → A0.1 ✓ — setContainerQueryStyle hook (A0.0 substrate)\n * - `fitWidth` → A0.2 ✓ — Phase 3 lane-select prefix; single-pass lane snap\n * - `styleMathFunctions` → A0.3 ✓ — UNIT_CALC + MathExpr; late-bound per\n * vendor/flexily/docs/two-phase-layout.md\n */\nconst FLEXILY_CAPABILITIES: EngineCapabilities = Object.freeze({\n containerQueries: true, // ✓ A0.1\n containSize: true, // ✓ A0.1\n containerQueryUnits: true, // ✓ A0.1\n fitWidth: true, // ✓ A0.2\n styleMathFunctions: true, // ✓ A0.3\n childStyleMutation: true, // ✓ A0.1\n})\n\n// ============================================================================\n// Flexily Zero Node Adapter\n// ============================================================================\n\n/**\n * Wraps a Flexily zero-alloc node to implement LayoutNode interface.\n * Since Flexily already has a Yoga-compatible API, this is mostly delegation.\n */\nclass FlexilyZeroNodeAdapter implements LayoutNode {\n private node: FlexilyNode\n\n constructor(node: FlexilyNode) {\n this.node = node\n }\n\n /** Get the underlying Flexily node (for tree operations) */\n getFlexilyNode(): FlexilyNode {\n return this.node\n }\n\n // Tree operations\n insertChild(child: LayoutNode, index: number): void {\n const flexilyChild = (child as FlexilyZeroNodeAdapter).getFlexilyNode()\n this.node.insertChild(flexilyChild, index)\n }\n\n removeChild(child: LayoutNode): void {\n const flexilyChild = (child as FlexilyZeroNodeAdapter).getFlexilyNode()\n this.node.removeChild(flexilyChild)\n }\n\n free(): void {\n this.node.free()\n }\n\n // Measure function\n setMeasureFunc(measureFunc: MeasureFunc): void {\n this.node.setMeasureFunc((width, widthMode, height, heightMode) => {\n const widthModeStr = this.measureModeToString(widthMode)\n const heightModeStr = this.measureModeToString(heightMode)\n return measureFunc(width, widthModeStr, height, heightModeStr)\n })\n }\n\n // Dirty tracking - forces layout recalculation\n markDirty(): void {\n this.node.markDirty()\n }\n isDirty(): boolean {\n return this.node.isDirty()\n }\n\n private measureModeToString(mode: number): MeasureMode {\n if (mode === MEASURE_MODE_EXACTLY) return \"exactly\"\n if (mode === MEASURE_MODE_AT_MOST) return \"at-most\"\n if (mode === MEASURE_MODE_MIN_CONTENT) return \"min-content\"\n return \"undefined\"\n }\n\n // Dimension setters\n setWidth(value: number): void {\n this.node.setWidth(value)\n }\n setWidthPercent(value: number): void {\n this.node.setWidthPercent(value)\n }\n setWidthAuto(): void {\n this.node.setWidthAuto()\n }\n setWidthFitContent(): void {\n this.node.setWidthFitContent()\n }\n setWidthSnugContent(): void {\n this.node.setWidthSnugContent()\n }\n setHeight(value: number): void {\n this.node.setHeight(value)\n }\n setHeightPercent(value: number): void {\n this.node.setHeightPercent(value)\n }\n setHeightAuto(): void {\n this.node.setHeightAuto()\n }\n setMinWidth(value: number): void {\n this.node.setMinWidth(value)\n }\n setMinWidthPercent(value: number): void {\n this.node.setMinWidthPercent(value)\n }\n setMinHeight(value: number): void {\n this.node.setMinHeight(value)\n }\n setMinHeightPercent(value: number): void {\n this.node.setMinHeightPercent(value)\n }\n setMaxWidth(value: number): void {\n this.node.setMaxWidth(value)\n }\n setMaxWidthPercent(value: number): void {\n this.node.setMaxWidthPercent(value)\n }\n setMaxHeight(value: number): void {\n this.node.setMaxHeight(value)\n }\n setMaxHeightPercent(value: number): void {\n this.node.setMaxHeightPercent(value)\n }\n\n // Flex properties\n setFlexGrow(value: number): void {\n this.node.setFlexGrow(value)\n }\n setFlexShrink(value: number): void {\n this.node.setFlexShrink(value)\n }\n setFlexBasis(value: number): void {\n this.node.setFlexBasis(value)\n }\n setFlexBasisPercent(value: number): void {\n this.node.setFlexBasisPercent(value)\n }\n setFlexBasisAuto(): void {\n this.node.setFlexBasisAuto()\n }\n setFlexDirection(direction: number): void {\n this.node.setFlexDirection(direction)\n }\n setFlexWrap(wrap: number): void {\n this.node.setFlexWrap(wrap)\n }\n\n // Alignment\n setAlignItems(align: number): void {\n this.node.setAlignItems(align)\n }\n setAlignSelf(align: number): void {\n this.node.setAlignSelf(align)\n }\n setAlignContent(align: number): void {\n this.node.setAlignContent(align)\n }\n setJustifyContent(justify: number): void {\n this.node.setJustifyContent(justify)\n }\n\n // Spacing\n setPadding(edge: number, value: number): void {\n this.node.setPadding(edge, value)\n }\n setMargin(edge: number, value: number): void {\n this.node.setMargin(edge, value)\n }\n setBorder(edge: number, value: number): void {\n this.node.setBorder(edge, value)\n }\n setGap(gutter: number, value: number): void {\n this.node.setGap(gutter, value)\n }\n\n // Display & Position\n setDisplay(display: number): void {\n this.node.setDisplay(display)\n }\n setPositionType(positionType: number): void {\n this.node.setPositionType(positionType)\n }\n setPosition(edge: number, value: number): void {\n this.node.setPosition(edge, value)\n }\n setPositionPercent(edge: number, value: number): void {\n this.node.setPositionPercent(edge, value)\n }\n setOverflow(overflow: number): void {\n this.node.setOverflow(overflow)\n }\n\n // Container queries (A0.1) — flexily supports both; advertised via FLEXILY_CAPABILITIES.\n setContainerType(containerType: number): void {\n this.node.setContainerType(containerType)\n }\n setContainSize(value: boolean): void {\n this.node.setContainSize(value)\n }\n\n // Fit-width (A0.2) — translate FitWidthLane to flexily's { value, unit: UNIT_* }\n // shape. Lane entries can be plain numbers (treated as UNIT_POINT) or objects\n // with a \"cqi\"/\"cqmin\" unit string.\n setFitWidth(lanes: readonly FitWidthLane[] | undefined): void {\n if (lanes === undefined || lanes.length === 0) {\n this.node.setFitWidth(undefined)\n return\n }\n this.node.setFitWidth(\n lanes.map((entry) => {\n if (typeof entry === \"number\") return entry\n const unit = entry.unit === \"cqi\" ? UNIT_CQI : UNIT_CQMIN\n return { value: entry.value, unit }\n }),\n )\n }\n\n // Aspect Ratio\n setAspectRatio(value: number): void {\n this.node.setAspectRatio(value)\n }\n\n // Layout calculation\n calculateLayout(width: number, height: number, direction?: number): void {\n this.node.calculateLayout(width, height, direction ?? DIRECTION_LTR)\n }\n\n // Layout results\n getComputedLeft(): number {\n return this.node.getComputedLeft()\n }\n getComputedTop(): number {\n return this.node.getComputedTop()\n }\n getComputedWidth(): number {\n return this.node.getComputedWidth()\n }\n getComputedHeight(): number {\n return this.node.getComputedHeight()\n }\n}\n\n// ============================================================================\n// Flexily Zero Layout Engine\n// ============================================================================\n\n/**\n * Layout engine implementation using Flexily zero-allocation variant.\n * Optimized for high-frequency layout with reduced GC pressure.\n */\nexport class FlexilyZeroLayoutEngine implements LayoutEngine {\n private _constants: LayoutConstants = {\n // Flex Direction (cast from Flexily's plain numbers to branded types)\n FLEX_DIRECTION_COLUMN: FLEX_DIRECTION_COLUMN as FlexDirectionValue,\n FLEX_DIRECTION_COLUMN_REVERSE: FLEX_DIRECTION_COLUMN_REVERSE as FlexDirectionValue,\n FLEX_DIRECTION_ROW: FLEX_DIRECTION_ROW as FlexDirectionValue,\n FLEX_DIRECTION_ROW_REVERSE: FLEX_DIRECTION_ROW_REVERSE as FlexDirectionValue,\n\n // Wrap\n WRAP_NO_WRAP: WRAP_NO_WRAP as WrapValue,\n WRAP_WRAP: WRAP_WRAP as WrapValue,\n WRAP_WRAP_REVERSE: WRAP_WRAP_REVERSE as WrapValue,\n\n // Align\n ALIGN_AUTO: ALIGN_AUTO as AlignValue,\n ALIGN_FLEX_START: ALIGN_FLEX_START as AlignValue,\n ALIGN_CENTER: ALIGN_CENTER as AlignValue,\n ALIGN_FLEX_END: ALIGN_FLEX_END as AlignValue,\n ALIGN_STRETCH: ALIGN_STRETCH as AlignValue,\n ALIGN_BASELINE: ALIGN_BASELINE as AlignValue,\n ALIGN_SPACE_BETWEEN: ALIGN_SPACE_BETWEEN as AlignValue,\n ALIGN_SPACE_AROUND: ALIGN_SPACE_AROUND as AlignValue,\n ALIGN_SPACE_EVENLY: ALIGN_SPACE_EVENLY as AlignValue,\n\n // Justify\n JUSTIFY_FLEX_START: JUSTIFY_FLEX_START as JustifyValue,\n JUSTIFY_CENTER: JUSTIFY_CENTER as JustifyValue,\n JUSTIFY_FLEX_END: JUSTIFY_FLEX_END as JustifyValue,\n JUSTIFY_SPACE_BETWEEN: JUSTIFY_SPACE_BETWEEN as JustifyValue,\n JUSTIFY_SPACE_AROUND: JUSTIFY_SPACE_AROUND as JustifyValue,\n JUSTIFY_SPACE_EVENLY: JUSTIFY_SPACE_EVENLY as JustifyValue,\n\n // Edge\n EDGE_LEFT: EDGE_LEFT as EdgeValue,\n EDGE_TOP: EDGE_TOP as EdgeValue,\n EDGE_RIGHT: EDGE_RIGHT as EdgeValue,\n EDGE_BOTTOM: EDGE_BOTTOM as EdgeValue,\n EDGE_HORIZONTAL: EDGE_HORIZONTAL as EdgeValue,\n EDGE_VERTICAL: EDGE_VERTICAL as EdgeValue,\n EDGE_ALL: EDGE_ALL as EdgeValue,\n\n // Gutter\n GUTTER_COLUMN: GUTTER_COLUMN as GutterValue,\n GUTTER_ROW: GUTTER_ROW as GutterValue,\n GUTTER_ALL: GUTTER_ALL as GutterValue,\n\n // Display\n DISPLAY_FLEX: DISPLAY_FLEX as DisplayValue,\n DISPLAY_NONE: DISPLAY_NONE as DisplayValue,\n\n // Position Type\n POSITION_TYPE_STATIC: POSITION_TYPE_STATIC as PositionTypeValue,\n POSITION_TYPE_RELATIVE: POSITION_TYPE_RELATIVE as PositionTypeValue,\n POSITION_TYPE_ABSOLUTE: POSITION_TYPE_ABSOLUTE as PositionTypeValue,\n\n // Overflow\n OVERFLOW_VISIBLE: OVERFLOW_VISIBLE as OverflowValue,\n OVERFLOW_HIDDEN: OVERFLOW_HIDDEN as OverflowValue,\n OVERFLOW_SCROLL: OVERFLOW_SCROLL as OverflowValue,\n\n // Direction\n DIRECTION_LTR: DIRECTION_LTR as DirectionValue,\n\n // Measure Mode\n MEASURE_MODE_UNDEFINED: MEASURE_MODE_UNDEFINED as MeasureModeValue,\n MEASURE_MODE_EXACTLY: MEASURE_MODE_EXACTLY as MeasureModeValue,\n MEASURE_MODE_AT_MOST: MEASURE_MODE_AT_MOST as MeasureModeValue,\n }\n\n createNode(): LayoutNode {\n return new FlexilyZeroNodeAdapter(FlexilyNode.create({ defaults: \"css\" }))\n }\n\n get constants(): LayoutConstants {\n return this._constants\n }\n\n get name(): string {\n return \"flexily-zero\"\n }\n\n get capabilities(): EngineCapabilities {\n return FLEXILY_CAPABILITIES\n }\n}\n\n/**\n * Internal-only Yoga-preset variant of FlexilyZeroLayoutEngine.\n *\n * Production silvery uses CSS-correct defaults via the standard\n * {@link FlexilyZeroLayoutEngine}. The Ink-compat layer (which mimics\n * Ink/Yoga semantics — `flexShrink:0`, `alignContent:flex-start`, no auto\n * min-size on flex items) needs Yoga-preset Nodes. This subclass is the\n * only sanctioned way to opt into Yoga semantics from inside silvery; do\n * not export from the public barrel and do not use in app code.\n */\nclass FlexilyZeroLayoutEngineYoga extends FlexilyZeroLayoutEngine {\n override createNode(): LayoutNode {\n return new FlexilyZeroNodeAdapter(FlexilyNode.create({ defaults: \"yoga\" }))\n }\n}\n\n// ============================================================================\n// Initialization Helpers\n// ============================================================================\n\n/**\n * Create a Flexily zero-allocation layout engine with CSS-correct defaults.\n *\n * silvery's standard layout engine. Sets `flexShrink: 1`,\n * `alignContent: stretch`, and CSS §4.5 flex-item auto min-size on every\n * Node, matching browser flexbox semantics. Unlike Yoga, Flexily doesn't\n * require async initialization.\n *\n * Yoga-flavored semantics are deliberately not exposed here — consumers\n * needing Yoga compat should use `createFlexily({ defaults: \"yoga\" })` from\n * flexily directly. The Ink-compat layer is the single internal user that\n * stays on Yoga; it imports the `@internal` {@link createFlexilyZeroEngineForInkCompat}.\n */\nexport function createFlexilyZeroEngine(): FlexilyZeroLayoutEngine {\n return new FlexilyZeroLayoutEngine()\n}\n\n/**\n * Yoga-preset variant for Ink-compat tests only.\n *\n * Do not use in production silvery code. The Ink-compat layer (`packages/ink`)\n * mimics Ink semantics, which match Yoga (`flexShrink:0`, `alignContent:flex-start`,\n * no auto min-size). When silvery's auto-generated Ink-compat tests render\n * through silvery's layout pipeline, they need Yoga-preset Nodes — that's\n * the one and only purpose of this factory.\n *\n * @internal Visible to silvery tests/compat/ink/helpers and packages/ink internals.\n */\nexport function createFlexilyZeroEngineForInkCompat(): FlexilyZeroLayoutEngine {\n return new FlexilyZeroLayoutEngineYoga()\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"flexily-zero-adapter-VoBGHG14.mjs","names":["FlexilyNode"],"sources":["../packages/ag-term/src/adapters/flexily-zero-adapter.ts"],"sourcesContent":["/**\n * Flexily Layout Engine Adapter\n *\n * Wraps Flexily to implement the LayoutEngine interface.\n * Uses the default zero-allocation algorithm from flexily.\n */\n\nimport {\n ALIGN_AUTO,\n ALIGN_BASELINE,\n ALIGN_CENTER,\n ALIGN_FLEX_END,\n ALIGN_FLEX_START,\n ALIGN_SPACE_AROUND,\n ALIGN_SPACE_BETWEEN,\n ALIGN_SPACE_EVENLY,\n ALIGN_STRETCH,\n DIRECTION_LTR,\n DISPLAY_FLEX,\n DISPLAY_NONE,\n EDGE_ALL,\n EDGE_BOTTOM,\n EDGE_HORIZONTAL,\n EDGE_LEFT,\n EDGE_RIGHT,\n EDGE_TOP,\n EDGE_VERTICAL,\n // Constants\n FLEX_DIRECTION_COLUMN,\n FLEX_DIRECTION_COLUMN_REVERSE,\n FLEX_DIRECTION_ROW,\n FLEX_DIRECTION_ROW_REVERSE,\n Node as FlexilyNode,\n GUTTER_ALL,\n GUTTER_COLUMN,\n GUTTER_ROW,\n JUSTIFY_CENTER,\n JUSTIFY_FLEX_END,\n JUSTIFY_FLEX_START,\n JUSTIFY_SPACE_AROUND,\n JUSTIFY_SPACE_BETWEEN,\n JUSTIFY_SPACE_EVENLY,\n MEASURE_MODE_AT_MOST,\n MEASURE_MODE_EXACTLY,\n MEASURE_MODE_MIN_CONTENT,\n MEASURE_MODE_UNDEFINED,\n OVERFLOW_HIDDEN,\n OVERFLOW_SCROLL,\n OVERFLOW_VISIBLE,\n POSITION_TYPE_ABSOLUTE,\n POSITION_TYPE_RELATIVE,\n POSITION_TYPE_STATIC,\n WRAP_NO_WRAP,\n WRAP_WRAP,\n WRAP_WRAP_REVERSE,\n} from \"flexily\"\n\n// Flexily UNIT_CQI / UNIT_CQMIN constants. Hardcoded at this seam rather than\n// imported from \"flexily\" because the published flexily@0.7.1 does not export\n// them yet — A0.2's export-bump (vendor/flexily commit fb61a79) hasn't shipped\n// to npm. Constants are stable per Phase 1 of @km/silvery/responsive-layout-\n// architecture-reframe; same shape as the CONTAINER_TYPE_INLINE_SIZE=1 hardcode\n// in applyBoxProps. When flexily 0.7.2+ ships with the new exports, this can be\n// replaced with a named import.\nconst UNIT_CQI = 6\nconst UNIT_CQMIN = 7\n\nimport type { FitWidthLane, LayoutNode, MeasureFunc, MeasureMode } from \"@silvery/ag/layout-types\"\nimport type {\n AlignValue,\n DirectionValue,\n DisplayValue,\n EdgeValue,\n EngineCapabilities,\n FlexDirectionValue,\n GutterValue,\n JustifyValue,\n LayoutConstants,\n LayoutEngine,\n MeasureModeValue,\n OverflowValue,\n PositionTypeValue,\n WrapValue,\n} from \"../layout-engine\"\n\n/**\n * Capabilities advertised by the flexily-zero adapter.\n *\n * All six A0 primitives shipped: four at A0.1 (engine-native CQ resolution at\n * vendor/flexily `46141e9`), one at A0.2 (fitWidth single-pass lane snap at\n * vendor/flexily `4b44bf9`), one at A0.3 (CSS math functions at vendor/flexily\n * `0aebb95`).\n *\n * - `containerQueries` → A0.1 ✓ — Pass 1 freezeQuerySize + Pass 2 ancestor walk\n * - `containSize` → A0.1 ✓ — Phase 9 inline-axis shrink-wrap gate\n * - `containerQueryUnits` → A0.1 ✓ — UNIT_CQI / UNIT_CQMIN parsed and resolved\n * - `childStyleMutation` → A0.1 ✓ — setContainerQueryStyle hook (A0.0 substrate)\n * - `fitWidth` → A0.2 ✓ — Phase 3 lane-select prefix; single-pass lane snap\n * - `styleMathFunctions` → A0.3 ✓ — UNIT_CALC + MathExpr; late-bound per\n * vendor/flexily/docs/two-phase-layout.md\n */\nconst FLEXILY_CAPABILITIES: EngineCapabilities = Object.freeze({\n containerQueries: true, // ✓ A0.1\n containSize: true, // ✓ A0.1\n containerQueryUnits: true, // ✓ A0.1\n fitWidth: true, // ✓ A0.2\n styleMathFunctions: true, // ✓ A0.3\n childStyleMutation: true, // ✓ A0.1\n})\n\n// ============================================================================\n// Flexily Zero Node Adapter\n// ============================================================================\n\n/**\n * Wraps a Flexily zero-alloc node to implement LayoutNode interface.\n * Since Flexily already has a Yoga-compatible API, this is mostly delegation.\n */\nclass FlexilyZeroNodeAdapter implements LayoutNode {\n private node: FlexilyNode\n\n constructor(node: FlexilyNode) {\n this.node = node\n }\n\n /** Get the underlying Flexily node (for tree operations) */\n getFlexilyNode(): FlexilyNode {\n return this.node\n }\n\n // Tree operations\n insertChild(child: LayoutNode, index: number): void {\n const flexilyChild = (child as FlexilyZeroNodeAdapter).getFlexilyNode()\n this.node.insertChild(flexilyChild, index)\n }\n\n removeChild(child: LayoutNode): void {\n const flexilyChild = (child as FlexilyZeroNodeAdapter).getFlexilyNode()\n this.node.removeChild(flexilyChild)\n }\n\n free(): void {\n this.node.free()\n }\n\n // Measure function\n setMeasureFunc(measureFunc: MeasureFunc): void {\n this.node.setMeasureFunc((width, widthMode, height, heightMode) => {\n const widthModeStr = this.measureModeToString(widthMode)\n const heightModeStr = this.measureModeToString(heightMode)\n return measureFunc(width, widthModeStr, height, heightModeStr)\n })\n }\n\n // Dirty tracking - forces layout recalculation\n markDirty(): void {\n this.node.markDirty()\n }\n isDirty(): boolean {\n return this.node.isDirty()\n }\n\n private measureModeToString(mode: number): MeasureMode {\n if (mode === MEASURE_MODE_EXACTLY) return \"exactly\"\n if (mode === MEASURE_MODE_AT_MOST) return \"at-most\"\n if (mode === MEASURE_MODE_MIN_CONTENT) return \"min-content\"\n return \"undefined\"\n }\n\n // Dimension setters\n setWidth(value: number): void {\n this.node.setWidth(value)\n }\n setWidthPercent(value: number): void {\n this.node.setWidthPercent(value)\n }\n setWidthAuto(): void {\n this.node.setWidthAuto()\n }\n setWidthFitContent(): void {\n this.node.setWidthFitContent()\n }\n setWidthSnugContent(): void {\n this.node.setWidthSnugContent()\n }\n setHeight(value: number): void {\n this.node.setHeight(value)\n }\n setHeightPercent(value: number): void {\n this.node.setHeightPercent(value)\n }\n setHeightAuto(): void {\n this.node.setHeightAuto()\n }\n setMinWidth(value: number): void {\n this.node.setMinWidth(value)\n }\n setMinWidthPercent(value: number): void {\n this.node.setMinWidthPercent(value)\n }\n setMinHeight(value: number): void {\n this.node.setMinHeight(value)\n }\n setMinHeightPercent(value: number): void {\n this.node.setMinHeightPercent(value)\n }\n setMaxWidth(value: number): void {\n this.node.setMaxWidth(value)\n }\n setMaxWidthPercent(value: number): void {\n this.node.setMaxWidthPercent(value)\n }\n setMaxHeight(value: number): void {\n this.node.setMaxHeight(value)\n }\n setMaxHeightPercent(value: number): void {\n this.node.setMaxHeightPercent(value)\n }\n\n // Flex properties\n setFlexGrow(value: number): void {\n this.node.setFlexGrow(value)\n }\n setFlexShrink(value: number): void {\n this.node.setFlexShrink(value)\n }\n setFlexBasis(value: number): void {\n this.node.setFlexBasis(value)\n }\n setFlexBasisPercent(value: number): void {\n this.node.setFlexBasisPercent(value)\n }\n setFlexBasisAuto(): void {\n this.node.setFlexBasisAuto()\n }\n setFlexDirection(direction: number): void {\n this.node.setFlexDirection(direction)\n }\n setFlexWrap(wrap: number): void {\n this.node.setFlexWrap(wrap)\n }\n\n // Alignment\n setAlignItems(align: number): void {\n this.node.setAlignItems(align)\n }\n setAlignSelf(align: number): void {\n this.node.setAlignSelf(align)\n }\n setAlignContent(align: number): void {\n this.node.setAlignContent(align)\n }\n setJustifyContent(justify: number): void {\n this.node.setJustifyContent(justify)\n }\n\n // Spacing\n setPadding(edge: number, value: number): void {\n this.node.setPadding(edge, value)\n }\n setMargin(edge: number, value: number): void {\n this.node.setMargin(edge, value)\n }\n setBorder(edge: number, value: number): void {\n this.node.setBorder(edge, value)\n }\n setGap(gutter: number, value: number): void {\n this.node.setGap(gutter, value)\n }\n\n // Display & Position\n setDisplay(display: number): void {\n this.node.setDisplay(display)\n }\n setPositionType(positionType: number): void {\n this.node.setPositionType(positionType)\n }\n setPosition(edge: number, value: number): void {\n this.node.setPosition(edge, value)\n }\n setPositionPercent(edge: number, value: number): void {\n this.node.setPositionPercent(edge, value)\n }\n setOverflow(overflow: number): void {\n this.node.setOverflow(overflow)\n }\n\n // Container queries (A0.1) — flexily supports both; advertised via FLEXILY_CAPABILITIES.\n setContainerType(containerType: number): void {\n this.node.setContainerType(containerType)\n }\n setContainSize(value: boolean): void {\n this.node.setContainSize(value)\n }\n\n // Fit-width (A0.2) — translate FitWidthLane to flexily's { value, unit: UNIT_* }\n // shape. Lane entries can be plain numbers (treated as UNIT_POINT) or objects\n // with a \"cqi\"/\"cqmin\" unit string.\n setFitWidth(lanes: readonly FitWidthLane[] | undefined): void {\n if (lanes === undefined || lanes.length === 0) {\n this.node.setFitWidth(undefined)\n return\n }\n this.node.setFitWidth(\n lanes.map((entry) => {\n if (typeof entry === \"number\") return entry\n const unit = entry.unit === \"cqi\" ? UNIT_CQI : UNIT_CQMIN\n return { value: entry.value, unit }\n }),\n )\n }\n\n // Aspect Ratio\n setAspectRatio(value: number): void {\n this.node.setAspectRatio(value)\n }\n\n // Layout calculation\n calculateLayout(width: number, height: number, direction?: number): void {\n this.node.calculateLayout(width, height, direction ?? DIRECTION_LTR)\n }\n\n // Layout results\n getComputedLeft(): number {\n return this.node.getComputedLeft()\n }\n getComputedTop(): number {\n return this.node.getComputedTop()\n }\n getComputedWidth(): number {\n return this.node.getComputedWidth()\n }\n getComputedHeight(): number {\n return this.node.getComputedHeight()\n }\n}\n\n// ============================================================================\n// Flexily Zero Layout Engine\n// ============================================================================\n\n/**\n * Layout engine implementation using Flexily zero-allocation variant.\n * Optimized for high-frequency layout with reduced GC pressure.\n */\nexport class FlexilyZeroLayoutEngine implements LayoutEngine {\n private _constants: LayoutConstants = {\n // Flex Direction (cast from Flexily's plain numbers to branded types)\n FLEX_DIRECTION_COLUMN: FLEX_DIRECTION_COLUMN as FlexDirectionValue,\n FLEX_DIRECTION_COLUMN_REVERSE: FLEX_DIRECTION_COLUMN_REVERSE as FlexDirectionValue,\n FLEX_DIRECTION_ROW: FLEX_DIRECTION_ROW as FlexDirectionValue,\n FLEX_DIRECTION_ROW_REVERSE: FLEX_DIRECTION_ROW_REVERSE as FlexDirectionValue,\n\n // Wrap\n WRAP_NO_WRAP: WRAP_NO_WRAP as WrapValue,\n WRAP_WRAP: WRAP_WRAP as WrapValue,\n WRAP_WRAP_REVERSE: WRAP_WRAP_REVERSE as WrapValue,\n\n // Align\n ALIGN_AUTO: ALIGN_AUTO as AlignValue,\n ALIGN_FLEX_START: ALIGN_FLEX_START as AlignValue,\n ALIGN_CENTER: ALIGN_CENTER as AlignValue,\n ALIGN_FLEX_END: ALIGN_FLEX_END as AlignValue,\n ALIGN_STRETCH: ALIGN_STRETCH as AlignValue,\n ALIGN_BASELINE: ALIGN_BASELINE as AlignValue,\n ALIGN_SPACE_BETWEEN: ALIGN_SPACE_BETWEEN as AlignValue,\n ALIGN_SPACE_AROUND: ALIGN_SPACE_AROUND as AlignValue,\n ALIGN_SPACE_EVENLY: ALIGN_SPACE_EVENLY as AlignValue,\n\n // Justify\n JUSTIFY_FLEX_START: JUSTIFY_FLEX_START as JustifyValue,\n JUSTIFY_CENTER: JUSTIFY_CENTER as JustifyValue,\n JUSTIFY_FLEX_END: JUSTIFY_FLEX_END as JustifyValue,\n JUSTIFY_SPACE_BETWEEN: JUSTIFY_SPACE_BETWEEN as JustifyValue,\n JUSTIFY_SPACE_AROUND: JUSTIFY_SPACE_AROUND as JustifyValue,\n JUSTIFY_SPACE_EVENLY: JUSTIFY_SPACE_EVENLY as JustifyValue,\n\n // Edge\n EDGE_LEFT: EDGE_LEFT as EdgeValue,\n EDGE_TOP: EDGE_TOP as EdgeValue,\n EDGE_RIGHT: EDGE_RIGHT as EdgeValue,\n EDGE_BOTTOM: EDGE_BOTTOM as EdgeValue,\n EDGE_HORIZONTAL: EDGE_HORIZONTAL as EdgeValue,\n EDGE_VERTICAL: EDGE_VERTICAL as EdgeValue,\n EDGE_ALL: EDGE_ALL as EdgeValue,\n\n // Gutter\n GUTTER_COLUMN: GUTTER_COLUMN as GutterValue,\n GUTTER_ROW: GUTTER_ROW as GutterValue,\n GUTTER_ALL: GUTTER_ALL as GutterValue,\n\n // Display\n DISPLAY_FLEX: DISPLAY_FLEX as DisplayValue,\n DISPLAY_NONE: DISPLAY_NONE as DisplayValue,\n\n // Position Type\n POSITION_TYPE_STATIC: POSITION_TYPE_STATIC as PositionTypeValue,\n POSITION_TYPE_RELATIVE: POSITION_TYPE_RELATIVE as PositionTypeValue,\n POSITION_TYPE_ABSOLUTE: POSITION_TYPE_ABSOLUTE as PositionTypeValue,\n\n // Overflow\n OVERFLOW_VISIBLE: OVERFLOW_VISIBLE as OverflowValue,\n OVERFLOW_HIDDEN: OVERFLOW_HIDDEN as OverflowValue,\n OVERFLOW_SCROLL: OVERFLOW_SCROLL as OverflowValue,\n\n // Direction\n DIRECTION_LTR: DIRECTION_LTR as DirectionValue,\n\n // Measure Mode\n MEASURE_MODE_UNDEFINED: MEASURE_MODE_UNDEFINED as MeasureModeValue,\n MEASURE_MODE_EXACTLY: MEASURE_MODE_EXACTLY as MeasureModeValue,\n MEASURE_MODE_AT_MOST: MEASURE_MODE_AT_MOST as MeasureModeValue,\n }\n\n createNode(): LayoutNode {\n return new FlexilyZeroNodeAdapter(FlexilyNode.create({ defaults: \"css\" }))\n }\n\n get constants(): LayoutConstants {\n return this._constants\n }\n\n get name(): string {\n return \"flexily-zero\"\n }\n\n get capabilities(): EngineCapabilities {\n return FLEXILY_CAPABILITIES\n }\n}\n\n/**\n * Internal-only Yoga-preset variant of FlexilyZeroLayoutEngine.\n *\n * Production silvery uses CSS-correct defaults via the standard\n * {@link FlexilyZeroLayoutEngine}. The Ink-compat layer (which mimics\n * Ink/Yoga semantics — `flexShrink:0`, `alignContent:flex-start`, no auto\n * min-size on flex items) needs Yoga-preset Nodes. This subclass is the\n * only sanctioned way to opt into Yoga semantics from inside silvery; do\n * not export from the public barrel and do not use in app code.\n */\nclass FlexilyZeroLayoutEngineYoga extends FlexilyZeroLayoutEngine {\n override createNode(): LayoutNode {\n return new FlexilyZeroNodeAdapter(FlexilyNode.create({ defaults: \"yoga\" }))\n }\n}\n\n// ============================================================================\n// Initialization Helpers\n// ============================================================================\n\n/**\n * Create a Flexily zero-allocation layout engine with CSS-correct defaults.\n *\n * silvery's standard layout engine. Sets `flexShrink: 1`,\n * `alignContent: stretch`, and CSS §4.5 flex-item auto min-size on every\n * Node, matching browser flexbox semantics. Unlike Yoga, Flexily doesn't\n * require async initialization.\n *\n * Yoga-flavored semantics are deliberately not exposed here — consumers\n * needing Yoga compat should use `createFlexily({ defaults: \"yoga\" })` from\n * flexily directly. The Ink-compat layer is the single internal user that\n * stays on Yoga; it imports the `@internal` {@link createFlexilyZeroEngineForInkCompat}.\n */\nexport function createFlexilyZeroEngine(): FlexilyZeroLayoutEngine {\n return new FlexilyZeroLayoutEngine()\n}\n\n/**\n * Yoga-preset variant for Ink-compat tests only.\n *\n * Do not use in production silvery code. The Ink-compat layer (`packages/ink`)\n * mimics Ink semantics, which match Yoga (`flexShrink:0`, `alignContent:flex-start`,\n * no auto min-size). When silvery's auto-generated Ink-compat tests render\n * through silvery's layout pipeline, they need Yoga-preset Nodes — that's\n * the one and only purpose of this factory.\n *\n * @internal Visible to silvery tests/compat/ink/helpers and packages/ink internals.\n */\nexport function createFlexilyZeroEngineForInkCompat(): FlexilyZeroLayoutEngine {\n return new FlexilyZeroLayoutEngineYoga()\n}\n"],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import { jt as Rect, m as HitTarget, p as HitRegistry } from "./mouse-events-B2z5tbsL.mjs";
2
+ import * as _$react from "react";
3
+
4
+ //#region packages/ag-term/src/hit-registry.d.ts
5
+ /**
6
+ * Context for accessing the HitRegistry.
7
+ * Components use this to register their hit regions.
8
+ */
9
+ declare const HitRegistryContext: _$react.Context<HitRegistry | null>;
10
+ /**
11
+ * Hook to get the HitRegistry from context.
12
+ *
13
+ * @returns The HitRegistry instance, or null if not in a HitRegistryContext
14
+ */
15
+ declare function useHitRegistry(): HitRegistry | null;
16
+ /**
17
+ * Hook to register a hit region based on component's screen position.
18
+ *
19
+ * Automatically registers on mount and when position changes,
20
+ * and unregisters on unmount.
21
+ *
22
+ * @param target - The target to return when this region is clicked
23
+ * @param rect - The screen rectangle (from useScrollRect or similar)
24
+ * @param zIndex - Z-index for layering (default: 0)
25
+ * @param enabled - Whether the region is active (default: true)
26
+ *
27
+ * @example
28
+ * ```tsx
29
+ * function Card({ nodeId }: { nodeId: string }) {
30
+ * const rect = useScrollRect();
31
+ *
32
+ * useHitRegion(
33
+ * { type: 'node', nodeId },
34
+ * rect,
35
+ * 10 // z-index for cards
36
+ * );
37
+ *
38
+ * return <Box>...</Box>;
39
+ * }
40
+ * ```
41
+ */
42
+ declare function useHitRegion(target: HitTarget, rect: Rect | null, zIndex?: number, enabled?: boolean): void;
43
+ /**
44
+ * Hook to register a hit region using a callback for screen position.
45
+ *
46
+ * Similar to useHitRegion but works with useScrollRect for
47
+ * better performance in large lists (avoids re-renders).
48
+ *
49
+ * @param target - The target to return when this region is clicked
50
+ * @param zIndex - Z-index for layering (default: 0)
51
+ * @param enabled - Whether the region is active (default: true)
52
+ * @returns A callback to pass to useScrollRect
53
+ *
54
+ * @example
55
+ * ```tsx
56
+ * function Card({ nodeId }: { nodeId: string }) {
57
+ * const onLayout = useHitRegionCallback(
58
+ * { type: 'node', nodeId },
59
+ * 10 // z-index
60
+ * );
61
+ *
62
+ * useScrollRect(onLayout);
63
+ *
64
+ * return <Box>...</Box>;
65
+ * }
66
+ * ```
67
+ */
68
+ declare function useHitRegionCallback(target: HitTarget, zIndex?: number, enabled?: boolean): (rect: Rect) => void;
69
+ //#endregion
70
+ export { useHitRegistry as i, useHitRegion as n, useHitRegionCallback as r, HitRegistryContext as t };
71
+ //# sourceMappingURL=hit-registry-D_nxOivS.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hit-registry-D_nxOivS.d.mts","names":[],"sources":["../packages/ag-term/src/hit-registry.ts"],"mappings":";;;;;;;;cA6Ca,kBAAA,EAAkB,OAAA,CAAA,OAAA,CAAA,WAAA;;AA4G/B;;;;iBAjGgB,cAAA,CAAA,GAAkB,WAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8BlB,YAAA,CACd,MAAA,EAAQ,SAAA,EACR,IAAA,EAAM,IAAA,SACN,MAAA,WACA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+Dc,oBAAA,CACd,MAAA,EAAQ,SAAA,EACR,MAAA,WACA,OAAA,cACE,IAAA,EAAM,IAAA"}