silvery 0.17.3 → 0.18.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 (154) hide show
  1. package/README.md +7 -13
  2. package/dist/{UPNG-AVSMjiFE.mjs → UPNG-DvKjM6wE.mjs} +1 -1
  3. package/dist/{UPNG-AVSMjiFE.mjs.map → UPNG-DvKjM6wE.mjs.map} +1 -1
  4. package/dist/{__vite-browser-external-2447137e-D3GdsvS_.mjs → __vite-browser-external-2447137e-DPKHHqQK.mjs} +1 -1
  5. package/dist/{__vite-browser-external-2447137e-D3GdsvS_.mjs.map → __vite-browser-external-2447137e-DPKHHqQK.mjs.map} +1 -1
  6. package/dist/{animation-C_PTO0uH.mjs → animation-DhINOJk8.mjs} +1 -1
  7. package/dist/{animation-C_PTO0uH.mjs.map → animation-DhINOJk8.mjs.map} +1 -1
  8. package/dist/{ansi-CXLE_pt1.mjs → ansi-C6Qs1Wn2.mjs} +1 -1
  9. package/dist/{ansi-CXLE_pt1.mjs.map → ansi-C6Qs1Wn2.mjs.map} +1 -1
  10. package/dist/{ansi-zmNzgkPB.d.mts → ansi-CsjnZtAw.d.mts} +1 -1
  11. package/dist/{ansi-zmNzgkPB.d.mts.map → ansi-CsjnZtAw.d.mts.map} +1 -1
  12. package/dist/apng-CvSlLBtc.mjs +3 -0
  13. package/dist/{apng-ENBAJk-H.mjs → apng-DFFVOItr.mjs} +3 -3
  14. package/dist/{apng-ENBAJk-H.mjs.map → apng-DFFVOItr.mjs.map} +1 -1
  15. package/dist/{backend-CkIkIHR-.mjs → backend-DU0Y938U.mjs} +1 -1
  16. package/dist/{backend-CkIkIHR-.mjs.map → backend-DU0Y938U.mjs.map} +1 -1
  17. package/dist/{backends-CkvbG3js.mjs → backends-BihMKFY_.mjs} +3 -3
  18. package/dist/{backends-CkvbG3js.mjs.map → backends-BihMKFY_.mjs.map} +1 -1
  19. package/dist/backends-Dk_5G_gC.mjs +3 -0
  20. package/dist/cli-GwJ0S2In.mjs +4 -0
  21. package/dist/{context-QreF3UHr.mjs → context-BjWgrikx.mjs} +1 -1
  22. package/dist/{context-QreF3UHr.mjs.map → context-BjWgrikx.mjs.map} +1 -1
  23. package/dist/{derive-D7bFJdfU.d.mts → derive-O_Kb1Bk_.d.mts} +3 -3
  24. package/dist/derive-O_Kb1Bk_.d.mts.map +1 -0
  25. package/dist/{devtools-owvUPfBi.mjs → devtools-CeO9X_uv.mjs} +4 -4
  26. package/dist/{devtools-owvUPfBi.mjs.map → devtools-CeO9X_uv.mjs.map} +1 -1
  27. package/dist/devtools-nX4tj6OH.mjs +2 -0
  28. package/dist/{eta-DLiVPaSD.mjs → eta-BnQSZcWf.mjs} +1 -1
  29. package/dist/{eta-DLiVPaSD.mjs.map → eta-BnQSZcWf.mjs.map} +1 -1
  30. package/dist/{flexily-zero-adapter-DmG4Ge8t.mjs → flexily-zero-adapter-BOM0cl8R.mjs} +61 -9
  31. package/dist/flexily-zero-adapter-BOM0cl8R.mjs.map +1 -0
  32. package/dist/{flexily-zero-adapter-GHwEW11s.mjs → flexily-zero-adapter-V8R3HQtK.mjs} +1 -1
  33. package/dist/{gif-Bp6fIyN3.mjs → gif-B9Uq4qZA.mjs} +3 -3
  34. package/dist/{gif-Bp6fIyN3.mjs.map → gif-B9Uq4qZA.mjs.map} +1 -1
  35. package/dist/gif-BdrLRBmM.mjs +3 -0
  36. package/dist/{gifenc-GiVCZ9-3.mjs → gifenc-DfhOb4xr.mjs} +1 -1
  37. package/dist/{gifenc-GiVCZ9-3.mjs.map → gifenc-DfhOb4xr.mjs.map} +1 -1
  38. package/dist/{image-Dx7gYjkq.mjs → image-B0zMbVUr.mjs} +136 -5
  39. package/dist/image-B0zMbVUr.mjs.map +1 -0
  40. package/dist/index-Bh3U1K09.d.mts +10823 -0
  41. package/dist/index-Bh3U1K09.d.mts.map +1 -0
  42. package/dist/{index-p-wBs_wH.d.mts → index-C4vrhbud.d.mts} +1 -1
  43. package/dist/{index-p-wBs_wH.d.mts.map → index-C4vrhbud.d.mts.map} +1 -1
  44. package/dist/{index-DCVL3jHo.d.mts → index-dehZ18K-.d.mts} +144 -99
  45. package/dist/index-dehZ18K-.d.mts.map +1 -0
  46. package/dist/index.d.mts +7 -7219
  47. package/dist/index.d.mts.map +1 -1
  48. package/dist/index.mjs +13 -9343
  49. package/dist/index.mjs.map +1 -1
  50. package/dist/{key-mapping-BsUHe_nk.mjs → key-mapping-7k2ufK2b.mjs} +1 -1
  51. package/dist/{key-mapping-DsyfLEdC.mjs → key-mapping-WLUmxjx1.mjs} +1 -1
  52. package/dist/{key-mapping-DsyfLEdC.mjs.map → key-mapping-WLUmxjx1.mjs.map} +1 -1
  53. package/dist/{layout-engine-D_lSR4i9.mjs → layout-engine--drvrWjD.mjs} +1 -1
  54. package/dist/{layout-engine-B3dsnVLU.mjs → layout-engine-Dr3cY5U4.mjs} +3 -3
  55. package/dist/{layout-engine-B3dsnVLU.mjs.map → layout-engine-Dr3cY5U4.mjs.map} +1 -1
  56. package/dist/{multi-progress-CQVB9lES.mjs → multi-progress-CcdqJFlf.mjs} +3 -3
  57. package/dist/{multi-progress-CQVB9lES.mjs.map → multi-progress-CcdqJFlf.mjs.map} +1 -1
  58. package/dist/{multi-progress-C0-rkn86.d.mts → multi-progress-DQ-uUzLf.d.mts} +2 -2
  59. package/dist/{multi-progress-C0-rkn86.d.mts.map → multi-progress-DQ-uUzLf.d.mts.map} +1 -1
  60. package/dist/{node-Dedx-6xF.mjs → node-CP5WChgr.mjs} +1 -1
  61. package/dist/{node-Dedx-6xF.mjs.map → node-CP5WChgr.mjs.map} +1 -1
  62. package/dist/{progress-bar-COPSBlT9.mjs → progress-bar-IrUjkLfU.mjs} +4 -4
  63. package/dist/{progress-bar-COPSBlT9.mjs.map → progress-bar-IrUjkLfU.mjs.map} +1 -1
  64. package/dist/{reconciler-B-NaZvbO.mjs → reconciler-B8uxQxaU.mjs} +57 -81
  65. package/dist/reconciler-B8uxQxaU.mjs.map +1 -0
  66. package/dist/{render-string-CZKpuKXo.mjs → render-string-BwLG7rIX.mjs} +1 -1
  67. package/dist/{pipeline-BmfaZb1O.mjs → render-string-DVfgc8xr.mjs} +836 -508
  68. package/dist/render-string-DVfgc8xr.mjs.map +1 -0
  69. package/dist/{resvg-js-V6oMi8CY.mjs → resvg-js-Cwipz-_J.mjs} +1 -1
  70. package/dist/{resvg-js-V6oMi8CY.mjs.map → resvg-js-Cwipz-_J.mjs.map} +1 -1
  71. package/dist/runtime.d.mts +2 -2
  72. package/dist/runtime.mjs +3 -3
  73. package/dist/{spinner-Cgej6Vnb.d.mts → spinner-BRkaJI0N.d.mts} +2 -2
  74. package/dist/{spinner-Cgej6Vnb.d.mts.map → spinner-BRkaJI0N.d.mts.map} +1 -1
  75. package/dist/{spinner-DSByknyx.mjs → spinner-BmldKx0M.mjs} +3 -3
  76. package/dist/{spinner-DSByknyx.mjs.map → spinner-BmldKx0M.mjs.map} +1 -1
  77. package/dist/{src-C9f3hiVG.mjs → src-C0sOQW-t.mjs} +402 -156
  78. package/dist/src-C0sOQW-t.mjs.map +1 -0
  79. package/dist/src-CJPXf3fC.mjs +18348 -0
  80. package/dist/src-CJPXf3fC.mjs.map +1 -0
  81. package/dist/{src-fJVbhdn-.mjs → src-D8kLrQBT.mjs} +1 -1
  82. package/dist/{src-fJVbhdn-.mjs.map → src-D8kLrQBT.mjs.map} +1 -1
  83. package/dist/{src-9B5k0JmY.mjs → src-D_BS-as7.mjs} +1130 -100
  84. package/dist/src-D_BS-as7.mjs.map +1 -0
  85. package/dist/theme.d.mts +45 -30
  86. package/dist/theme.d.mts.map +1 -1
  87. package/dist/theme.mjs +3 -3
  88. package/dist/{types-CDgkE-Rw.d.mts → types-B4A8Ebba.d.mts} +1 -1
  89. package/dist/{types-CDgkE-Rw.d.mts.map → types-B4A8Ebba.d.mts.map} +1 -1
  90. package/dist/types-e4dpfbSa.mjs +468 -0
  91. package/dist/types-e4dpfbSa.mjs.map +1 -0
  92. package/dist/ui/animation.d.mts +1 -1
  93. package/dist/ui/animation.mjs +1 -1
  94. package/dist/ui/ansi.d.mts +1 -1
  95. package/dist/ui/ansi.mjs +1 -1
  96. package/dist/ui/cli.d.mts +3 -3
  97. package/dist/ui/cli.mjs +5 -5
  98. package/dist/ui/display.d.mts +2 -2
  99. package/dist/ui/display.mjs +1 -1
  100. package/dist/ui/display.mjs.map +1 -1
  101. package/dist/ui/image.d.mts +1 -1
  102. package/dist/ui/image.mjs +1 -1
  103. package/dist/ui/input.d.mts +3 -3
  104. package/dist/ui/input.mjs +2 -2
  105. package/dist/ui/input.mjs.map +1 -1
  106. package/dist/ui/progress.d.mts +3 -3
  107. package/dist/ui/progress.mjs +4 -4
  108. package/dist/ui/progress.mjs.map +1 -1
  109. package/dist/ui/react.d.mts +3 -3
  110. package/dist/ui/react.mjs +4 -4
  111. package/dist/ui/react.mjs.map +1 -1
  112. package/dist/ui/utils.mjs +1 -1
  113. package/dist/ui/wrappers.d.mts +2 -2
  114. package/dist/ui/wrappers.mjs +1 -1
  115. package/dist/ui.d.mts +5 -5
  116. package/dist/ui.mjs +6 -6
  117. package/dist/{useLatest-BMIYXd6e.d.mts → useLatest-6xqnGIU6.d.mts} +1 -1
  118. package/dist/{useLatest-BMIYXd6e.d.mts.map → useLatest-6xqnGIU6.d.mts.map} +1 -1
  119. package/dist/{with-text-input-CmHf_9d6.d.mts → with-text-input-lUh9gYAG.d.mts} +3 -3
  120. package/dist/{with-text-input-CmHf_9d6.d.mts.map → with-text-input-lUh9gYAG.d.mts.map} +1 -1
  121. package/dist/{wrapper-Dqh0zi2W.mjs → wrapper-CE6GQ27z.mjs} +1 -1
  122. package/dist/{wrapper-Dqh0zi2W.mjs.map → wrapper-CE6GQ27z.mjs.map} +1 -1
  123. package/dist/{wrappers-hhL8EQ_n.mjs → wrappers-JrEYTuKA.mjs} +4 -4
  124. package/dist/wrappers-JrEYTuKA.mjs.map +1 -0
  125. package/dist/yoga-adapter-B8LZpQcE.mjs +2 -0
  126. package/dist/{yoga-adapter-BJ9SOhTY.mjs → yoga-adapter-Bc8XT9cN.mjs} +11 -2
  127. package/dist/yoga-adapter-Bc8XT9cN.mjs.map +1 -0
  128. package/package.json +20 -17
  129. package/dist/apng-DCWY913R.mjs +0 -3
  130. package/dist/backends-CyJqNLeK.mjs +0 -3
  131. package/dist/cli-B-k7Bm56.mjs +0 -4
  132. package/dist/derive-D7bFJdfU.d.mts.map +0 -1
  133. package/dist/devtools-DS9NseGT.mjs +0 -2
  134. package/dist/flexily-zero-adapter-DmG4Ge8t.mjs.map +0 -1
  135. package/dist/gif-BaJNREpP.mjs +0 -3
  136. package/dist/image-Dx7gYjkq.mjs.map +0 -1
  137. package/dist/index-CBcSpGSM.d.mts +0 -3416
  138. package/dist/index-CBcSpGSM.d.mts.map +0 -1
  139. package/dist/index-DCVL3jHo.d.mts.map +0 -1
  140. package/dist/pipeline-BmfaZb1O.mjs.map +0 -1
  141. package/dist/reconciler-B-NaZvbO.mjs.map +0 -1
  142. package/dist/render-string-Bvh1XzBv.mjs +0 -201
  143. package/dist/render-string-Bvh1XzBv.mjs.map +0 -1
  144. package/dist/runtime-PH2xY1DM.mjs +0 -8723
  145. package/dist/runtime-PH2xY1DM.mjs.map +0 -1
  146. package/dist/src-9B5k0JmY.mjs.map +0 -1
  147. package/dist/src-C9f3hiVG.mjs.map +0 -1
  148. package/dist/types-Bhj5QkIQ.mjs +0 -13
  149. package/dist/types-Bhj5QkIQ.mjs.map +0 -1
  150. package/dist/useLayout-BG2cGl15.mjs +0 -139
  151. package/dist/useLayout-BG2cGl15.mjs.map +0 -1
  152. package/dist/wrappers-hhL8EQ_n.mjs.map +0 -1
  153. package/dist/yoga-adapter-BJ9SOhTY.mjs.map +0 -1
  154. package/dist/yoga-adapter-Daq6-dw1.mjs +0 -2
@@ -1,2 +1,2 @@
1
- import { n as createFlexilyZeroEngine } from "./flexily-zero-adapter-DmG4Ge8t.mjs";
1
+ import { n as createFlexilyZeroEngine } from "./flexily-zero-adapter-BOM0cl8R.mjs";
2
2
  export { createFlexilyZeroEngine };
@@ -3,7 +3,7 @@ import { n as __esmMin, o as __toESM } from "./chunk-BSw8zbkd.mjs";
3
3
  async function loadGifenc() {
4
4
  if (gifencModule) return gifencModule;
5
5
  try {
6
- gifencModule = await import("./gifenc-GiVCZ9-3.mjs").then((m) => /* @__PURE__ */ __toESM(m.default, 1));
6
+ gifencModule = await import("./gifenc-DfhOb4xr.mjs").then((m) => /* @__PURE__ */ __toESM(m.default, 1));
7
7
  return gifencModule;
8
8
  } catch {
9
9
  throw new Error("createGif() requires gifenc. Install it:\n bun add gifenc");
@@ -12,7 +12,7 @@ async function loadGifenc() {
12
12
  async function loadResvg() {
13
13
  if (resvgModule) return resvgModule;
14
14
  try {
15
- resvgModule = await import("./resvg-js-V6oMi8CY.mjs").then((m) => /* @__PURE__ */ __toESM(m.default, 1));
15
+ resvgModule = await import("./resvg-js-Cwipz-_J.mjs").then((m) => /* @__PURE__ */ __toESM(m.default, 1));
16
16
  return resvgModule;
17
17
  } catch {
18
18
  throw new Error("createGif() requires @resvg/resvg-js. Install it:\n bun add @resvg/resvg-js");
@@ -70,4 +70,4 @@ var init_gif = __esmMin((() => {
70
70
  //#endregion
71
71
  export { init_gif as n, createGif as t };
72
72
 
73
- //# sourceMappingURL=gif-Bp6fIyN3.mjs.map
73
+ //# sourceMappingURL=gif-B9Uq4qZA.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"gif-Bp6fIyN3.mjs","names":[],"sources":["../../termless/src/animation/gif.ts"],"sourcesContent":["/**\n * Animated GIF encoder for termless.\n *\n * Converts SVG frames to an animated GIF using gifenc (pure JS, no binary deps)\n * for GIF encoding and @resvg/resvg-js for SVG→pixel rasterization.\n *\n * Both are optional/lazy-loaded dependencies — throws clear errors if missing.\n */\n\nimport type { AnimationFrame, AnimationOptions } from \"./types.ts\"\n\n// Lazy-cached imports\nlet gifencModule: typeof import(\"gifenc\") | null = null\nlet resvgModule: { Resvg: any } | null = null\n\nasync function loadGifenc() {\n if (gifencModule) return gifencModule\n try {\n gifencModule = await import(\"gifenc\")\n return gifencModule\n } catch {\n throw new Error(\"createGif() requires gifenc. Install it:\\n bun add gifenc\")\n }\n}\n\nasync function loadResvg() {\n if (resvgModule) return resvgModule\n try {\n resvgModule = await import(\"@resvg/resvg-js\")\n return resvgModule\n } catch {\n throw new Error(\"createGif() requires @resvg/resvg-js. Install it:\\n bun add @resvg/resvg-js\")\n }\n}\n\n/**\n * Encode animation frames as an animated GIF.\n *\n * Each SVG frame is rasterized to RGBA pixels via @resvg/resvg-js,\n * then quantized to 256 colors and written to a GIF stream via gifenc.\n *\n * @param frames - SVG frames with durations\n * @param options - Animation options plus optional `scale` for rasterization\n * @returns GIF file as Uint8Array\n */\nexport async function createGif(\n frames: AnimationFrame[],\n options?: AnimationOptions & { scale?: number },\n): Promise<Uint8Array> {\n if (frames.length === 0) {\n throw new Error(\"createGif requires at least one frame\")\n }\n\n const [{ GIFEncoder, quantize, applyPalette }, { Resvg }] = await Promise.all([loadGifenc(), loadResvg()])\n\n const defaultDuration = options?.defaultDuration ?? 100\n const loop = options?.loop ?? 0\n const scale = options?.scale ?? 2\n\n const gif = GIFEncoder()\n\n for (let i = 0; i < frames.length; i++) {\n const frame = frames[i]!\n const duration = frame.duration || defaultDuration\n\n const resvg = new Resvg(frame.svg, {\n fitTo: { mode: \"zoom\" as const, value: scale },\n font: { loadSystemFonts: true, defaultFontFamily: \"Menlo\" },\n })\n const rendered = resvg.render()\n const rgba = new Uint8Array(rendered.pixels)\n const width = rendered.width\n const height = rendered.height\n\n const palette = quantize(rgba, 256)\n const indexed = applyPalette(rgba, palette)\n\n gif.writeFrame(indexed, width, height, {\n palette,\n delay: duration,\n repeat: i === 0 ? (loop === 0 ? 0 : loop) : undefined,\n })\n }\n\n gif.finish()\n return gif.bytesView()\n}\n"],"mappings":";;AAeA,eAAe,aAAa;AAC1B,KAAI,aAAc,QAAO;AACzB,KAAI;AACF,iBAAe,MAAM,OAAO,yBAAA,MAAA,MAAA,wBAAA,EAAA,SAAA,EAAA,CAAA;AAC5B,SAAO;SACD;AACN,QAAM,IAAI,MAAM,6DAA6D;;;AAIjF,eAAe,YAAY;AACzB,KAAI,YAAa,QAAO;AACxB,KAAI;AACF,gBAAc,MAAM,OAAO,2BAAA,MAAA,MAAA,wBAAA,EAAA,SAAA,EAAA,CAAA;AAC3B,SAAO;SACD;AACN,QAAM,IAAI,MAAM,+EAA+E;;;;;;;;;;;;;AAcnG,eAAsB,UACpB,QACA,SACqB;AACrB,KAAI,OAAO,WAAW,EACpB,OAAM,IAAI,MAAM,wCAAwC;CAG1D,MAAM,CAAC,EAAE,YAAY,UAAU,gBAAgB,EAAE,WAAW,MAAM,QAAQ,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;CAE1G,MAAM,kBAAkB,SAAS,mBAAmB;CACpD,MAAM,OAAO,SAAS,QAAQ;CAC9B,MAAM,QAAQ,SAAS,SAAS;CAEhC,MAAM,MAAM,YAAY;AAExB,MAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;EACtC,MAAM,QAAQ,OAAO;EACrB,MAAM,WAAW,MAAM,YAAY;EAMnC,MAAM,WAJQ,IAAI,MAAM,MAAM,KAAK;GACjC,OAAO;IAAE,MAAM;IAAiB,OAAO;IAAO;GAC9C,MAAM;IAAE,iBAAiB;IAAM,mBAAmB;IAAS;GAC5D,CAAC,CACqB,QAAQ;EAC/B,MAAM,OAAO,IAAI,WAAW,SAAS,OAAO;EAC5C,MAAM,QAAQ,SAAS;EACvB,MAAM,SAAS,SAAS;EAExB,MAAM,UAAU,SAAS,MAAM,IAAI;EACnC,MAAM,UAAU,aAAa,MAAM,QAAQ;AAE3C,MAAI,WAAW,SAAS,OAAO,QAAQ;GACrC;GACA,OAAO;GACP,QAAQ,MAAM,IAAK,SAAS,IAAI,IAAI,OAAQ,KAAA;GAC7C,CAAC;;AAGJ,KAAI,QAAQ;AACZ,QAAO,IAAI,WAAW;;;;AAzEpB,gBAA+C;AAC/C,eAAqC"}
1
+ {"version":3,"file":"gif-B9Uq4qZA.mjs","names":[],"sources":["../../termless/src/animation/gif.ts"],"sourcesContent":["/**\n * Animated GIF encoder for termless.\n *\n * Converts SVG frames to an animated GIF using gifenc (pure JS, no binary deps)\n * for GIF encoding and @resvg/resvg-js for SVG→pixel rasterization.\n *\n * Both are optional/lazy-loaded dependencies — throws clear errors if missing.\n */\n\nimport type { AnimationFrame, AnimationOptions } from \"./types.ts\"\n\n// Lazy-cached imports\nlet gifencModule: typeof import(\"gifenc\") | null = null\nlet resvgModule: { Resvg: any } | null = null\n\nasync function loadGifenc() {\n if (gifencModule) return gifencModule\n try {\n gifencModule = await import(\"gifenc\")\n return gifencModule\n } catch {\n throw new Error(\"createGif() requires gifenc. Install it:\\n bun add gifenc\")\n }\n}\n\nasync function loadResvg() {\n if (resvgModule) return resvgModule\n try {\n resvgModule = await import(\"@resvg/resvg-js\")\n return resvgModule\n } catch {\n throw new Error(\"createGif() requires @resvg/resvg-js. Install it:\\n bun add @resvg/resvg-js\")\n }\n}\n\n/**\n * Encode animation frames as an animated GIF.\n *\n * Each SVG frame is rasterized to RGBA pixels via @resvg/resvg-js,\n * then quantized to 256 colors and written to a GIF stream via gifenc.\n *\n * @param frames - SVG frames with durations\n * @param options - Animation options plus optional `scale` for rasterization\n * @returns GIF file as Uint8Array\n */\nexport async function createGif(\n frames: AnimationFrame[],\n options?: AnimationOptions & { scale?: number },\n): Promise<Uint8Array> {\n if (frames.length === 0) {\n throw new Error(\"createGif requires at least one frame\")\n }\n\n const [{ GIFEncoder, quantize, applyPalette }, { Resvg }] = await Promise.all([loadGifenc(), loadResvg()])\n\n const defaultDuration = options?.defaultDuration ?? 100\n const loop = options?.loop ?? 0\n const scale = options?.scale ?? 2\n\n const gif = GIFEncoder()\n\n for (let i = 0; i < frames.length; i++) {\n const frame = frames[i]!\n const duration = frame.duration || defaultDuration\n\n const resvg = new Resvg(frame.svg, {\n fitTo: { mode: \"zoom\" as const, value: scale },\n font: { loadSystemFonts: true, defaultFontFamily: \"Menlo\" },\n })\n const rendered = resvg.render()\n const rgba = new Uint8Array(rendered.pixels)\n const width = rendered.width\n const height = rendered.height\n\n const palette = quantize(rgba, 256)\n const indexed = applyPalette(rgba, palette)\n\n gif.writeFrame(indexed, width, height, {\n palette,\n delay: duration,\n repeat: i === 0 ? (loop === 0 ? 0 : loop) : undefined,\n })\n }\n\n gif.finish()\n return gif.bytesView()\n}\n"],"mappings":";;AAeA,eAAe,aAAa;AAC1B,KAAI,aAAc,QAAO;AACzB,KAAI;AACF,iBAAe,MAAM,OAAO,yBAAA,MAAA,MAAA,wBAAA,EAAA,SAAA,EAAA,CAAA;AAC5B,SAAO;SACD;AACN,QAAM,IAAI,MAAM,6DAA6D;;;AAIjF,eAAe,YAAY;AACzB,KAAI,YAAa,QAAO;AACxB,KAAI;AACF,gBAAc,MAAM,OAAO,2BAAA,MAAA,MAAA,wBAAA,EAAA,SAAA,EAAA,CAAA;AAC3B,SAAO;SACD;AACN,QAAM,IAAI,MAAM,+EAA+E;;;;;;;;;;;;;AAcnG,eAAsB,UACpB,QACA,SACqB;AACrB,KAAI,OAAO,WAAW,EACpB,OAAM,IAAI,MAAM,wCAAwC;CAG1D,MAAM,CAAC,EAAE,YAAY,UAAU,gBAAgB,EAAE,WAAW,MAAM,QAAQ,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;CAE1G,MAAM,kBAAkB,SAAS,mBAAmB;CACpD,MAAM,OAAO,SAAS,QAAQ;CAC9B,MAAM,QAAQ,SAAS,SAAS;CAEhC,MAAM,MAAM,YAAY;AAExB,MAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;EACtC,MAAM,QAAQ,OAAO;EACrB,MAAM,WAAW,MAAM,YAAY;EAMnC,MAAM,WAJQ,IAAI,MAAM,MAAM,KAAK;GACjC,OAAO;IAAE,MAAM;IAAiB,OAAO;IAAO;GAC9C,MAAM;IAAE,iBAAiB;IAAM,mBAAmB;IAAS;GAC5D,CAAC,CACqB,QAAQ;EAC/B,MAAM,OAAO,IAAI,WAAW,SAAS,OAAO;EAC5C,MAAM,QAAQ,SAAS;EACvB,MAAM,SAAS,SAAS;EAExB,MAAM,UAAU,SAAS,MAAM,IAAI;EACnC,MAAM,UAAU,aAAa,MAAM,QAAQ;AAE3C,MAAI,WAAW,SAAS,OAAO,QAAQ;GACrC;GACA,OAAO;GACP,QAAQ,MAAM,IAAK,SAAS,IAAI,IAAI,OAAQ,KAAA;GAC7C,CAAC;;AAGJ,KAAI,QAAQ;AACZ,QAAO,IAAI,WAAW;;;;AAzEpB,gBAA+C;AAC/C,eAAqC"}
@@ -0,0 +1,3 @@
1
+ import { n as init_gif, t as createGif } from "./gif-B9Uq4qZA.mjs";
2
+ init_gif();
3
+ export { createGif };
@@ -727,4 +727,4 @@ var require_gifenc = /* @__PURE__ */ __commonJSMin(((exports) => {
727
727
  export default require_gifenc();
728
728
  export {};
729
729
 
730
- //# sourceMappingURL=gifenc-GiVCZ9-3.mjs.map
730
+ //# sourceMappingURL=gifenc-DfhOb4xr.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"gifenc-GiVCZ9-3.mjs","names":[],"sources":["../../../node_modules/.bun/gifenc@1.0.3/node_modules/gifenc/dist/gifenc.js"],"sourcesContent":["var __defProp = Object.defineProperty;\nvar __markAsModule = (target) => __defProp(target, \"__esModule\", {value: true});\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, {get: all[name], enumerable: true});\n};\n\n// src/index.js\n__markAsModule(exports);\n__export(exports, {\n GIFEncoder: () => GIFEncoder,\n applyPalette: () => applyPalette,\n default: () => src_default,\n nearestColor: () => nearestColor,\n nearestColorIndex: () => nearestColorIndex,\n nearestColorIndexWithDistance: () => nearestColorIndexWithDistance,\n prequantize: () => prequantize,\n quantize: () => quantize,\n snapColorsToPalette: () => snapColorsToPalette\n});\n\n// src/constants.js\nvar constants_default = {\n signature: \"GIF\",\n version: \"89a\",\n trailer: 59,\n extensionIntroducer: 33,\n applicationExtensionLabel: 255,\n graphicControlExtensionLabel: 249,\n imageSeparator: 44,\n signatureSize: 3,\n versionSize: 3,\n globalColorTableFlagMask: 128,\n colorResolutionMask: 112,\n sortFlagMask: 8,\n globalColorTableSizeMask: 7,\n applicationIdentifierSize: 8,\n applicationAuthCodeSize: 3,\n disposalMethodMask: 28,\n userInputFlagMask: 2,\n transparentColorFlagMask: 1,\n localColorTableFlagMask: 128,\n interlaceFlagMask: 64,\n idSortFlagMask: 32,\n localColorTableSizeMask: 7\n};\n\n// src/stream.js\nfunction createStream(initialCapacity = 256) {\n let cursor = 0;\n let contents = new Uint8Array(initialCapacity);\n return {\n get buffer() {\n return contents.buffer;\n },\n reset() {\n cursor = 0;\n },\n bytesView() {\n return contents.subarray(0, cursor);\n },\n bytes() {\n return contents.slice(0, cursor);\n },\n writeByte(byte) {\n expand(cursor + 1);\n contents[cursor] = byte;\n cursor++;\n },\n writeBytes(data, offset = 0, byteLength = data.length) {\n expand(cursor + byteLength);\n for (let i = 0; i < byteLength; i++) {\n contents[cursor++] = data[i + offset];\n }\n },\n writeBytesView(data, offset = 0, byteLength = data.byteLength) {\n expand(cursor + byteLength);\n contents.set(data.subarray(offset, offset + byteLength), cursor);\n cursor += byteLength;\n }\n };\n function expand(newCapacity) {\n var prevCapacity = contents.length;\n if (prevCapacity >= newCapacity)\n return;\n var CAPACITY_DOUBLING_MAX = 1024 * 1024;\n newCapacity = Math.max(newCapacity, prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125) >>> 0);\n if (prevCapacity != 0)\n newCapacity = Math.max(newCapacity, 256);\n const oldContents = contents;\n contents = new Uint8Array(newCapacity);\n if (cursor > 0)\n contents.set(oldContents.subarray(0, cursor), 0);\n }\n}\n\n// src/lzwEncode.js\nvar BITS = 12;\nvar DEFAULT_HSIZE = 5003;\nvar MASKS = [\n 0,\n 1,\n 3,\n 7,\n 15,\n 31,\n 63,\n 127,\n 255,\n 511,\n 1023,\n 2047,\n 4095,\n 8191,\n 16383,\n 32767,\n 65535\n];\nfunction lzwEncode(width, height, pixels, colorDepth, outStream = createStream(512), accum = new Uint8Array(256), htab = new Int32Array(DEFAULT_HSIZE), codetab = new Int32Array(DEFAULT_HSIZE)) {\n const hsize = htab.length;\n const initCodeSize = Math.max(2, colorDepth);\n accum.fill(0);\n codetab.fill(0);\n htab.fill(-1);\n let cur_accum = 0;\n let cur_bits = 0;\n const init_bits = initCodeSize + 1;\n const g_init_bits = init_bits;\n let clear_flg = false;\n let n_bits = g_init_bits;\n let maxcode = (1 << n_bits) - 1;\n const ClearCode = 1 << init_bits - 1;\n const EOFCode = ClearCode + 1;\n let free_ent = ClearCode + 2;\n let a_count = 0;\n let ent = pixels[0];\n let hshift = 0;\n for (let fcode = hsize; fcode < 65536; fcode *= 2) {\n ++hshift;\n }\n hshift = 8 - hshift;\n outStream.writeByte(initCodeSize);\n output(ClearCode);\n const length = pixels.length;\n for (let idx = 1; idx < length; idx++) {\n next_block: {\n const c = pixels[idx];\n const fcode = (c << BITS) + ent;\n let i = c << hshift ^ ent;\n if (htab[i] === fcode) {\n ent = codetab[i];\n break next_block;\n }\n const disp = i === 0 ? 1 : hsize - i;\n while (htab[i] >= 0) {\n i -= disp;\n if (i < 0)\n i += hsize;\n if (htab[i] === fcode) {\n ent = codetab[i];\n break next_block;\n }\n }\n output(ent);\n ent = c;\n if (free_ent < 1 << BITS) {\n codetab[i] = free_ent++;\n htab[i] = fcode;\n } else {\n htab.fill(-1);\n free_ent = ClearCode + 2;\n clear_flg = true;\n output(ClearCode);\n }\n }\n }\n output(ent);\n output(EOFCode);\n outStream.writeByte(0);\n return outStream.bytesView();\n function output(code) {\n cur_accum &= MASKS[cur_bits];\n if (cur_bits > 0)\n cur_accum |= code << cur_bits;\n else\n cur_accum = code;\n cur_bits += n_bits;\n while (cur_bits >= 8) {\n accum[a_count++] = cur_accum & 255;\n if (a_count >= 254) {\n outStream.writeByte(a_count);\n outStream.writeBytesView(accum, 0, a_count);\n a_count = 0;\n }\n cur_accum >>= 8;\n cur_bits -= 8;\n }\n if (free_ent > maxcode || clear_flg) {\n if (clear_flg) {\n n_bits = g_init_bits;\n maxcode = (1 << n_bits) - 1;\n clear_flg = false;\n } else {\n ++n_bits;\n maxcode = n_bits === BITS ? 1 << n_bits : (1 << n_bits) - 1;\n }\n }\n if (code == EOFCode) {\n while (cur_bits > 0) {\n accum[a_count++] = cur_accum & 255;\n if (a_count >= 254) {\n outStream.writeByte(a_count);\n outStream.writeBytesView(accum, 0, a_count);\n a_count = 0;\n }\n cur_accum >>= 8;\n cur_bits -= 8;\n }\n if (a_count > 0) {\n outStream.writeByte(a_count);\n outStream.writeBytesView(accum, 0, a_count);\n a_count = 0;\n }\n }\n }\n}\nvar lzwEncode_default = lzwEncode;\n\n// src/rgb-packing.js\nfunction rgb888_to_rgb565(r, g, b) {\n return r << 8 & 63488 | g << 2 & 992 | b >> 3;\n}\nfunction rgba8888_to_rgba4444(r, g, b, a) {\n return r >> 4 | g & 240 | (b & 240) << 4 | (a & 240) << 8;\n}\nfunction rgb888_to_rgb444(r, g, b) {\n return r >> 4 << 8 | g & 240 | b >> 4;\n}\n\n// src/pnnquant2.js\nfunction clamp(value, min, max) {\n return value < min ? min : value > max ? max : value;\n}\nfunction sqr(value) {\n return value * value;\n}\nfunction find_nn(bins, idx, hasAlpha) {\n var nn = 0;\n var err = 1e100;\n const bin1 = bins[idx];\n const n1 = bin1.cnt;\n const wa = bin1.ac;\n const wr = bin1.rc;\n const wg = bin1.gc;\n const wb = bin1.bc;\n for (var i = bin1.fw; i != 0; i = bins[i].fw) {\n const bin = bins[i];\n const n2 = bin.cnt;\n const nerr2 = n1 * n2 / (n1 + n2);\n if (nerr2 >= err)\n continue;\n var nerr = 0;\n if (hasAlpha) {\n nerr += nerr2 * sqr(bin.ac - wa);\n if (nerr >= err)\n continue;\n }\n nerr += nerr2 * sqr(bin.rc - wr);\n if (nerr >= err)\n continue;\n nerr += nerr2 * sqr(bin.gc - wg);\n if (nerr >= err)\n continue;\n nerr += nerr2 * sqr(bin.bc - wb);\n if (nerr >= err)\n continue;\n err = nerr;\n nn = i;\n }\n bin1.err = err;\n bin1.nn = nn;\n}\nfunction create_bin() {\n return {\n ac: 0,\n rc: 0,\n gc: 0,\n bc: 0,\n cnt: 0,\n nn: 0,\n fw: 0,\n bk: 0,\n tm: 0,\n mtm: 0,\n err: 0\n };\n}\nfunction create_bin_list(data, format) {\n const bincount = format === \"rgb444\" ? 4096 : 65536;\n const bins = new Array(bincount);\n const size = data.length;\n if (format === \"rgba4444\") {\n for (let i = 0; i < size; ++i) {\n const color = data[i];\n const a = color >> 24 & 255;\n const b = color >> 16 & 255;\n const g = color >> 8 & 255;\n const r = color & 255;\n const index = rgba8888_to_rgba4444(r, g, b, a);\n let bin = index in bins ? bins[index] : bins[index] = create_bin();\n bin.rc += r;\n bin.gc += g;\n bin.bc += b;\n bin.ac += a;\n bin.cnt++;\n }\n } else if (format === \"rgb444\") {\n for (let i = 0; i < size; ++i) {\n const color = data[i];\n const b = color >> 16 & 255;\n const g = color >> 8 & 255;\n const r = color & 255;\n const index = rgb888_to_rgb444(r, g, b);\n let bin = index in bins ? bins[index] : bins[index] = create_bin();\n bin.rc += r;\n bin.gc += g;\n bin.bc += b;\n bin.cnt++;\n }\n } else {\n for (let i = 0; i < size; ++i) {\n const color = data[i];\n const b = color >> 16 & 255;\n const g = color >> 8 & 255;\n const r = color & 255;\n const index = rgb888_to_rgb565(r, g, b);\n let bin = index in bins ? bins[index] : bins[index] = create_bin();\n bin.rc += r;\n bin.gc += g;\n bin.bc += b;\n bin.cnt++;\n }\n }\n return bins;\n}\nfunction quantize(rgba, maxColors, opts = {}) {\n const {\n format = \"rgb565\",\n clearAlpha = true,\n clearAlphaColor = 0,\n clearAlphaThreshold = 0,\n oneBitAlpha = false\n } = opts;\n if (!rgba || !rgba.buffer) {\n throw new Error(\"quantize() expected RGBA Uint8Array data\");\n }\n if (!(rgba instanceof Uint8Array) && !(rgba instanceof Uint8ClampedArray)) {\n throw new Error(\"quantize() expected RGBA Uint8Array data\");\n }\n const data = new Uint32Array(rgba.buffer);\n let useSqrt = opts.useSqrt !== false;\n const hasAlpha = format === \"rgba4444\";\n const bins = create_bin_list(data, format);\n const bincount = bins.length;\n const bincountMinusOne = bincount - 1;\n const heap = new Uint32Array(bincount + 1);\n var maxbins = 0;\n for (var i = 0; i < bincount; ++i) {\n const bin = bins[i];\n if (bin != null) {\n var d = 1 / bin.cnt;\n if (hasAlpha)\n bin.ac *= d;\n bin.rc *= d;\n bin.gc *= d;\n bin.bc *= d;\n bins[maxbins++] = bin;\n }\n }\n if (sqr(maxColors) / maxbins < 0.022) {\n useSqrt = false;\n }\n var i = 0;\n for (; i < maxbins - 1; ++i) {\n bins[i].fw = i + 1;\n bins[i + 1].bk = i;\n if (useSqrt)\n bins[i].cnt = Math.sqrt(bins[i].cnt);\n }\n if (useSqrt)\n bins[i].cnt = Math.sqrt(bins[i].cnt);\n var h, l, l2;\n for (i = 0; i < maxbins; ++i) {\n find_nn(bins, i, false);\n var err = bins[i].err;\n for (l = ++heap[0]; l > 1; l = l2) {\n l2 = l >> 1;\n if (bins[h = heap[l2]].err <= err)\n break;\n heap[l] = h;\n }\n heap[l] = i;\n }\n var extbins = maxbins - maxColors;\n for (i = 0; i < extbins; ) {\n var tb;\n for (; ; ) {\n var b1 = heap[1];\n tb = bins[b1];\n if (tb.tm >= tb.mtm && bins[tb.nn].mtm <= tb.tm)\n break;\n if (tb.mtm == bincountMinusOne)\n b1 = heap[1] = heap[heap[0]--];\n else {\n find_nn(bins, b1, false);\n tb.tm = i;\n }\n var err = bins[b1].err;\n for (l = 1; (l2 = l + l) <= heap[0]; l = l2) {\n if (l2 < heap[0] && bins[heap[l2]].err > bins[heap[l2 + 1]].err)\n l2++;\n if (err <= bins[h = heap[l2]].err)\n break;\n heap[l] = h;\n }\n heap[l] = b1;\n }\n var nb = bins[tb.nn];\n var n1 = tb.cnt;\n var n2 = nb.cnt;\n var d = 1 / (n1 + n2);\n if (hasAlpha)\n tb.ac = d * (n1 * tb.ac + n2 * nb.ac);\n tb.rc = d * (n1 * tb.rc + n2 * nb.rc);\n tb.gc = d * (n1 * tb.gc + n2 * nb.gc);\n tb.bc = d * (n1 * tb.bc + n2 * nb.bc);\n tb.cnt += nb.cnt;\n tb.mtm = ++i;\n bins[nb.bk].fw = nb.fw;\n bins[nb.fw].bk = nb.bk;\n nb.mtm = bincountMinusOne;\n }\n let palette = [];\n var k = 0;\n for (i = 0; ; ++k) {\n let r = clamp(Math.round(bins[i].rc), 0, 255);\n let g = clamp(Math.round(bins[i].gc), 0, 255);\n let b = clamp(Math.round(bins[i].bc), 0, 255);\n let a = 255;\n if (hasAlpha) {\n a = clamp(Math.round(bins[i].ac), 0, 255);\n if (oneBitAlpha) {\n const threshold = typeof oneBitAlpha === \"number\" ? oneBitAlpha : 127;\n a = a <= threshold ? 0 : 255;\n }\n if (clearAlpha && a <= clearAlphaThreshold) {\n r = g = b = clearAlphaColor;\n a = 0;\n }\n }\n const color = hasAlpha ? [r, g, b, a] : [r, g, b];\n const exists = existsInPalette(palette, color);\n if (!exists)\n palette.push(color);\n if ((i = bins[i].fw) == 0)\n break;\n }\n return palette;\n}\nfunction existsInPalette(palette, color) {\n for (let i = 0; i < palette.length; i++) {\n const p = palette[i];\n let matchesRGB = p[0] === color[0] && p[1] === color[1] && p[2] === color[2];\n let matchesAlpha = p.length >= 4 && color.length >= 4 ? p[3] === color[3] : true;\n if (matchesRGB && matchesAlpha)\n return true;\n }\n return false;\n}\n\n// src/color.js\nfunction euclideanDistanceSquared(a, b) {\n var sum = 0;\n var n;\n for (n = 0; n < a.length; n++) {\n const dx = a[n] - b[n];\n sum += dx * dx;\n }\n return sum;\n}\n\n// src/palettize.js\nfunction roundStep(byte, step) {\n return step > 1 ? Math.round(byte / step) * step : byte;\n}\nfunction prequantize(rgba, {roundRGB = 5, roundAlpha = 10, oneBitAlpha = null} = {}) {\n const data = new Uint32Array(rgba.buffer);\n for (let i = 0; i < data.length; i++) {\n const color = data[i];\n let a = color >> 24 & 255;\n let b = color >> 16 & 255;\n let g = color >> 8 & 255;\n let r = color & 255;\n a = roundStep(a, roundAlpha);\n if (oneBitAlpha) {\n const threshold = typeof oneBitAlpha === \"number\" ? oneBitAlpha : 127;\n a = a <= threshold ? 0 : 255;\n }\n r = roundStep(r, roundRGB);\n g = roundStep(g, roundRGB);\n b = roundStep(b, roundRGB);\n data[i] = a << 24 | b << 16 | g << 8 | r << 0;\n }\n}\nfunction applyPalette(rgba, palette, format = \"rgb565\") {\n if (!rgba || !rgba.buffer) {\n throw new Error(\"quantize() expected RGBA Uint8Array data\");\n }\n if (!(rgba instanceof Uint8Array) && !(rgba instanceof Uint8ClampedArray)) {\n throw new Error(\"quantize() expected RGBA Uint8Array data\");\n }\n if (palette.length > 256) {\n throw new Error(\"applyPalette() only works with 256 colors or less\");\n }\n const data = new Uint32Array(rgba.buffer);\n const length = data.length;\n const bincount = format === \"rgb444\" ? 4096 : 65536;\n const index = new Uint8Array(length);\n const cache = new Array(bincount);\n const hasAlpha = format === \"rgba4444\";\n if (format === \"rgba4444\") {\n for (let i = 0; i < length; i++) {\n const color = data[i];\n const a = color >> 24 & 255;\n const b = color >> 16 & 255;\n const g = color >> 8 & 255;\n const r = color & 255;\n const key = rgba8888_to_rgba4444(r, g, b, a);\n const idx = key in cache ? cache[key] : cache[key] = nearestColorIndexRGBA(r, g, b, a, palette);\n index[i] = idx;\n }\n } else {\n const rgb888_to_key = format === \"rgb444\" ? rgb888_to_rgb444 : rgb888_to_rgb565;\n for (let i = 0; i < length; i++) {\n const color = data[i];\n const b = color >> 16 & 255;\n const g = color >> 8 & 255;\n const r = color & 255;\n const key = rgb888_to_key(r, g, b);\n const idx = key in cache ? cache[key] : cache[key] = nearestColorIndexRGB(r, g, b, palette);\n index[i] = idx;\n }\n }\n return index;\n}\nfunction nearestColorIndexRGBA(r, g, b, a, palette) {\n let k = 0;\n let mindist = 1e100;\n for (let i = 0; i < palette.length; i++) {\n const px2 = palette[i];\n const a2 = px2[3];\n let curdist = sqr2(a2 - a);\n if (curdist > mindist)\n continue;\n const r2 = px2[0];\n curdist += sqr2(r2 - r);\n if (curdist > mindist)\n continue;\n const g2 = px2[1];\n curdist += sqr2(g2 - g);\n if (curdist > mindist)\n continue;\n const b2 = px2[2];\n curdist += sqr2(b2 - b);\n if (curdist > mindist)\n continue;\n mindist = curdist;\n k = i;\n }\n return k;\n}\nfunction nearestColorIndexRGB(r, g, b, palette) {\n let k = 0;\n let mindist = 1e100;\n for (let i = 0; i < palette.length; i++) {\n const px2 = palette[i];\n const r2 = px2[0];\n let curdist = sqr2(r2 - r);\n if (curdist > mindist)\n continue;\n const g2 = px2[1];\n curdist += sqr2(g2 - g);\n if (curdist > mindist)\n continue;\n const b2 = px2[2];\n curdist += sqr2(b2 - b);\n if (curdist > mindist)\n continue;\n mindist = curdist;\n k = i;\n }\n return k;\n}\nfunction snapColorsToPalette(palette, knownColors, threshold = 5) {\n if (!palette.length || !knownColors.length)\n return;\n const paletteRGB = palette.map((p) => p.slice(0, 3));\n const thresholdSq = threshold * threshold;\n const dim = palette[0].length;\n for (let i = 0; i < knownColors.length; i++) {\n let color = knownColors[i];\n if (color.length < dim) {\n color = [color[0], color[1], color[2], 255];\n } else if (color.length > dim) {\n color = color.slice(0, 3);\n } else {\n color = color.slice();\n }\n const r = nearestColorIndexWithDistance(paletteRGB, color.slice(0, 3), euclideanDistanceSquared);\n const idx = r[0];\n const distanceSq = r[1];\n if (distanceSq > 0 && distanceSq <= thresholdSq) {\n palette[idx] = color;\n }\n }\n}\nfunction sqr2(a) {\n return a * a;\n}\nfunction nearestColorIndex(colors, pixel, distanceFn = euclideanDistanceSquared) {\n let minDist = Infinity;\n let minDistIndex = -1;\n for (let j = 0; j < colors.length; j++) {\n const paletteColor = colors[j];\n const dist = distanceFn(pixel, paletteColor);\n if (dist < minDist) {\n minDist = dist;\n minDistIndex = j;\n }\n }\n return minDistIndex;\n}\nfunction nearestColorIndexWithDistance(colors, pixel, distanceFn = euclideanDistanceSquared) {\n let minDist = Infinity;\n let minDistIndex = -1;\n for (let j = 0; j < colors.length; j++) {\n const paletteColor = colors[j];\n const dist = distanceFn(pixel, paletteColor);\n if (dist < minDist) {\n minDist = dist;\n minDistIndex = j;\n }\n }\n return [minDistIndex, minDist];\n}\nfunction nearestColor(colors, pixel, distanceFn = euclideanDistanceSquared) {\n return colors[nearestColorIndex(colors, pixel, distanceFn)];\n}\n\n// src/index.js\nfunction GIFEncoder(opt = {}) {\n const {initialCapacity = 4096, auto = true} = opt;\n const stream = createStream(initialCapacity);\n const HSIZE = 5003;\n const accum = new Uint8Array(256);\n const htab = new Int32Array(HSIZE);\n const codetab = new Int32Array(HSIZE);\n let hasInit = false;\n return {\n reset() {\n stream.reset();\n hasInit = false;\n },\n finish() {\n stream.writeByte(constants_default.trailer);\n },\n bytes() {\n return stream.bytes();\n },\n bytesView() {\n return stream.bytesView();\n },\n get buffer() {\n return stream.buffer;\n },\n get stream() {\n return stream;\n },\n writeHeader,\n writeFrame(index, width, height, opts = {}) {\n const {\n transparent = false,\n transparentIndex = 0,\n delay = 0,\n palette = null,\n repeat = 0,\n colorDepth = 8,\n dispose = -1\n } = opts;\n let first = false;\n if (auto) {\n if (!hasInit) {\n first = true;\n writeHeader();\n hasInit = true;\n }\n } else {\n first = Boolean(opts.first);\n }\n width = Math.max(0, Math.floor(width));\n height = Math.max(0, Math.floor(height));\n if (first) {\n if (!palette) {\n throw new Error(\"First frame must include a { palette } option\");\n }\n encodeLogicalScreenDescriptor(stream, width, height, palette, colorDepth);\n encodeColorTable(stream, palette);\n if (repeat >= 0) {\n encodeNetscapeExt(stream, repeat);\n }\n }\n const delayTime = Math.round(delay / 10);\n encodeGraphicControlExt(stream, dispose, delayTime, transparent, transparentIndex);\n const useLocalColorTable = Boolean(palette) && !first;\n encodeImageDescriptor(stream, width, height, useLocalColorTable ? palette : null);\n if (useLocalColorTable)\n encodeColorTable(stream, palette);\n encodePixels(stream, index, width, height, colorDepth, accum, htab, codetab);\n }\n };\n function writeHeader() {\n writeUTFBytes(stream, \"GIF89a\");\n }\n}\nfunction encodeGraphicControlExt(stream, dispose, delay, transparent, transparentIndex) {\n stream.writeByte(33);\n stream.writeByte(249);\n stream.writeByte(4);\n if (transparentIndex < 0) {\n transparentIndex = 0;\n transparent = false;\n }\n var transp, disp;\n if (!transparent) {\n transp = 0;\n disp = 0;\n } else {\n transp = 1;\n disp = 2;\n }\n if (dispose >= 0) {\n disp = dispose & 7;\n }\n disp <<= 2;\n const userInput = 0;\n stream.writeByte(0 | disp | userInput | transp);\n writeUInt16(stream, delay);\n stream.writeByte(transparentIndex || 0);\n stream.writeByte(0);\n}\nfunction encodeLogicalScreenDescriptor(stream, width, height, palette, colorDepth = 8) {\n const globalColorTableFlag = 1;\n const sortFlag = 0;\n const globalColorTableSize = colorTableSize(palette.length) - 1;\n const fields = globalColorTableFlag << 7 | colorDepth - 1 << 4 | sortFlag << 3 | globalColorTableSize;\n const backgroundColorIndex = 0;\n const pixelAspectRatio = 0;\n writeUInt16(stream, width);\n writeUInt16(stream, height);\n stream.writeBytes([fields, backgroundColorIndex, pixelAspectRatio]);\n}\nfunction encodeNetscapeExt(stream, repeat) {\n stream.writeByte(33);\n stream.writeByte(255);\n stream.writeByte(11);\n writeUTFBytes(stream, \"NETSCAPE2.0\");\n stream.writeByte(3);\n stream.writeByte(1);\n writeUInt16(stream, repeat);\n stream.writeByte(0);\n}\nfunction encodeColorTable(stream, palette) {\n const colorTableLength = 1 << colorTableSize(palette.length);\n for (let i = 0; i < colorTableLength; i++) {\n let color = [0, 0, 0];\n if (i < palette.length) {\n color = palette[i];\n }\n stream.writeByte(color[0]);\n stream.writeByte(color[1]);\n stream.writeByte(color[2]);\n }\n}\nfunction encodeImageDescriptor(stream, width, height, localPalette) {\n stream.writeByte(44);\n writeUInt16(stream, 0);\n writeUInt16(stream, 0);\n writeUInt16(stream, width);\n writeUInt16(stream, height);\n if (localPalette) {\n const interlace = 0;\n const sorted = 0;\n const palSize = colorTableSize(localPalette.length) - 1;\n stream.writeByte(128 | interlace | sorted | 0 | palSize);\n } else {\n stream.writeByte(0);\n }\n}\nfunction encodePixels(stream, index, width, height, colorDepth = 8, accum, htab, codetab) {\n lzwEncode_default(width, height, index, colorDepth, stream, accum, htab, codetab);\n}\nfunction writeUInt16(stream, short) {\n stream.writeByte(short & 255);\n stream.writeByte(short >> 8 & 255);\n}\nfunction writeUTFBytes(stream, text) {\n for (var i = 0; i < text.length; i++) {\n stream.writeByte(text.charCodeAt(i));\n }\n}\nfunction colorTableSize(length) {\n return Math.max(Math.ceil(Math.log2(length)), 1);\n}\nvar src_default = GIFEncoder;\n//# sourceMappingURL=gifenc.js.map\n"],"x_google_ignoreList":[0],"mappings":"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"}
1
+ {"version":3,"file":"gifenc-DfhOb4xr.mjs","names":[],"sources":["../../../node_modules/.bun/gifenc@1.0.3/node_modules/gifenc/dist/gifenc.js"],"sourcesContent":["var __defProp = Object.defineProperty;\nvar __markAsModule = (target) => __defProp(target, \"__esModule\", {value: true});\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, {get: all[name], enumerable: true});\n};\n\n// src/index.js\n__markAsModule(exports);\n__export(exports, {\n GIFEncoder: () => GIFEncoder,\n applyPalette: () => applyPalette,\n default: () => src_default,\n nearestColor: () => nearestColor,\n nearestColorIndex: () => nearestColorIndex,\n nearestColorIndexWithDistance: () => nearestColorIndexWithDistance,\n prequantize: () => prequantize,\n quantize: () => quantize,\n snapColorsToPalette: () => snapColorsToPalette\n});\n\n// src/constants.js\nvar constants_default = {\n signature: \"GIF\",\n version: \"89a\",\n trailer: 59,\n extensionIntroducer: 33,\n applicationExtensionLabel: 255,\n graphicControlExtensionLabel: 249,\n imageSeparator: 44,\n signatureSize: 3,\n versionSize: 3,\n globalColorTableFlagMask: 128,\n colorResolutionMask: 112,\n sortFlagMask: 8,\n globalColorTableSizeMask: 7,\n applicationIdentifierSize: 8,\n applicationAuthCodeSize: 3,\n disposalMethodMask: 28,\n userInputFlagMask: 2,\n transparentColorFlagMask: 1,\n localColorTableFlagMask: 128,\n interlaceFlagMask: 64,\n idSortFlagMask: 32,\n localColorTableSizeMask: 7\n};\n\n// src/stream.js\nfunction createStream(initialCapacity = 256) {\n let cursor = 0;\n let contents = new Uint8Array(initialCapacity);\n return {\n get buffer() {\n return contents.buffer;\n },\n reset() {\n cursor = 0;\n },\n bytesView() {\n return contents.subarray(0, cursor);\n },\n bytes() {\n return contents.slice(0, cursor);\n },\n writeByte(byte) {\n expand(cursor + 1);\n contents[cursor] = byte;\n cursor++;\n },\n writeBytes(data, offset = 0, byteLength = data.length) {\n expand(cursor + byteLength);\n for (let i = 0; i < byteLength; i++) {\n contents[cursor++] = data[i + offset];\n }\n },\n writeBytesView(data, offset = 0, byteLength = data.byteLength) {\n expand(cursor + byteLength);\n contents.set(data.subarray(offset, offset + byteLength), cursor);\n cursor += byteLength;\n }\n };\n function expand(newCapacity) {\n var prevCapacity = contents.length;\n if (prevCapacity >= newCapacity)\n return;\n var CAPACITY_DOUBLING_MAX = 1024 * 1024;\n newCapacity = Math.max(newCapacity, prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125) >>> 0);\n if (prevCapacity != 0)\n newCapacity = Math.max(newCapacity, 256);\n const oldContents = contents;\n contents = new Uint8Array(newCapacity);\n if (cursor > 0)\n contents.set(oldContents.subarray(0, cursor), 0);\n }\n}\n\n// src/lzwEncode.js\nvar BITS = 12;\nvar DEFAULT_HSIZE = 5003;\nvar MASKS = [\n 0,\n 1,\n 3,\n 7,\n 15,\n 31,\n 63,\n 127,\n 255,\n 511,\n 1023,\n 2047,\n 4095,\n 8191,\n 16383,\n 32767,\n 65535\n];\nfunction lzwEncode(width, height, pixels, colorDepth, outStream = createStream(512), accum = new Uint8Array(256), htab = new Int32Array(DEFAULT_HSIZE), codetab = new Int32Array(DEFAULT_HSIZE)) {\n const hsize = htab.length;\n const initCodeSize = Math.max(2, colorDepth);\n accum.fill(0);\n codetab.fill(0);\n htab.fill(-1);\n let cur_accum = 0;\n let cur_bits = 0;\n const init_bits = initCodeSize + 1;\n const g_init_bits = init_bits;\n let clear_flg = false;\n let n_bits = g_init_bits;\n let maxcode = (1 << n_bits) - 1;\n const ClearCode = 1 << init_bits - 1;\n const EOFCode = ClearCode + 1;\n let free_ent = ClearCode + 2;\n let a_count = 0;\n let ent = pixels[0];\n let hshift = 0;\n for (let fcode = hsize; fcode < 65536; fcode *= 2) {\n ++hshift;\n }\n hshift = 8 - hshift;\n outStream.writeByte(initCodeSize);\n output(ClearCode);\n const length = pixels.length;\n for (let idx = 1; idx < length; idx++) {\n next_block: {\n const c = pixels[idx];\n const fcode = (c << BITS) + ent;\n let i = c << hshift ^ ent;\n if (htab[i] === fcode) {\n ent = codetab[i];\n break next_block;\n }\n const disp = i === 0 ? 1 : hsize - i;\n while (htab[i] >= 0) {\n i -= disp;\n if (i < 0)\n i += hsize;\n if (htab[i] === fcode) {\n ent = codetab[i];\n break next_block;\n }\n }\n output(ent);\n ent = c;\n if (free_ent < 1 << BITS) {\n codetab[i] = free_ent++;\n htab[i] = fcode;\n } else {\n htab.fill(-1);\n free_ent = ClearCode + 2;\n clear_flg = true;\n output(ClearCode);\n }\n }\n }\n output(ent);\n output(EOFCode);\n outStream.writeByte(0);\n return outStream.bytesView();\n function output(code) {\n cur_accum &= MASKS[cur_bits];\n if (cur_bits > 0)\n cur_accum |= code << cur_bits;\n else\n cur_accum = code;\n cur_bits += n_bits;\n while (cur_bits >= 8) {\n accum[a_count++] = cur_accum & 255;\n if (a_count >= 254) {\n outStream.writeByte(a_count);\n outStream.writeBytesView(accum, 0, a_count);\n a_count = 0;\n }\n cur_accum >>= 8;\n cur_bits -= 8;\n }\n if (free_ent > maxcode || clear_flg) {\n if (clear_flg) {\n n_bits = g_init_bits;\n maxcode = (1 << n_bits) - 1;\n clear_flg = false;\n } else {\n ++n_bits;\n maxcode = n_bits === BITS ? 1 << n_bits : (1 << n_bits) - 1;\n }\n }\n if (code == EOFCode) {\n while (cur_bits > 0) {\n accum[a_count++] = cur_accum & 255;\n if (a_count >= 254) {\n outStream.writeByte(a_count);\n outStream.writeBytesView(accum, 0, a_count);\n a_count = 0;\n }\n cur_accum >>= 8;\n cur_bits -= 8;\n }\n if (a_count > 0) {\n outStream.writeByte(a_count);\n outStream.writeBytesView(accum, 0, a_count);\n a_count = 0;\n }\n }\n }\n}\nvar lzwEncode_default = lzwEncode;\n\n// src/rgb-packing.js\nfunction rgb888_to_rgb565(r, g, b) {\n return r << 8 & 63488 | g << 2 & 992 | b >> 3;\n}\nfunction rgba8888_to_rgba4444(r, g, b, a) {\n return r >> 4 | g & 240 | (b & 240) << 4 | (a & 240) << 8;\n}\nfunction rgb888_to_rgb444(r, g, b) {\n return r >> 4 << 8 | g & 240 | b >> 4;\n}\n\n// src/pnnquant2.js\nfunction clamp(value, min, max) {\n return value < min ? min : value > max ? max : value;\n}\nfunction sqr(value) {\n return value * value;\n}\nfunction find_nn(bins, idx, hasAlpha) {\n var nn = 0;\n var err = 1e100;\n const bin1 = bins[idx];\n const n1 = bin1.cnt;\n const wa = bin1.ac;\n const wr = bin1.rc;\n const wg = bin1.gc;\n const wb = bin1.bc;\n for (var i = bin1.fw; i != 0; i = bins[i].fw) {\n const bin = bins[i];\n const n2 = bin.cnt;\n const nerr2 = n1 * n2 / (n1 + n2);\n if (nerr2 >= err)\n continue;\n var nerr = 0;\n if (hasAlpha) {\n nerr += nerr2 * sqr(bin.ac - wa);\n if (nerr >= err)\n continue;\n }\n nerr += nerr2 * sqr(bin.rc - wr);\n if (nerr >= err)\n continue;\n nerr += nerr2 * sqr(bin.gc - wg);\n if (nerr >= err)\n continue;\n nerr += nerr2 * sqr(bin.bc - wb);\n if (nerr >= err)\n continue;\n err = nerr;\n nn = i;\n }\n bin1.err = err;\n bin1.nn = nn;\n}\nfunction create_bin() {\n return {\n ac: 0,\n rc: 0,\n gc: 0,\n bc: 0,\n cnt: 0,\n nn: 0,\n fw: 0,\n bk: 0,\n tm: 0,\n mtm: 0,\n err: 0\n };\n}\nfunction create_bin_list(data, format) {\n const bincount = format === \"rgb444\" ? 4096 : 65536;\n const bins = new Array(bincount);\n const size = data.length;\n if (format === \"rgba4444\") {\n for (let i = 0; i < size; ++i) {\n const color = data[i];\n const a = color >> 24 & 255;\n const b = color >> 16 & 255;\n const g = color >> 8 & 255;\n const r = color & 255;\n const index = rgba8888_to_rgba4444(r, g, b, a);\n let bin = index in bins ? bins[index] : bins[index] = create_bin();\n bin.rc += r;\n bin.gc += g;\n bin.bc += b;\n bin.ac += a;\n bin.cnt++;\n }\n } else if (format === \"rgb444\") {\n for (let i = 0; i < size; ++i) {\n const color = data[i];\n const b = color >> 16 & 255;\n const g = color >> 8 & 255;\n const r = color & 255;\n const index = rgb888_to_rgb444(r, g, b);\n let bin = index in bins ? bins[index] : bins[index] = create_bin();\n bin.rc += r;\n bin.gc += g;\n bin.bc += b;\n bin.cnt++;\n }\n } else {\n for (let i = 0; i < size; ++i) {\n const color = data[i];\n const b = color >> 16 & 255;\n const g = color >> 8 & 255;\n const r = color & 255;\n const index = rgb888_to_rgb565(r, g, b);\n let bin = index in bins ? bins[index] : bins[index] = create_bin();\n bin.rc += r;\n bin.gc += g;\n bin.bc += b;\n bin.cnt++;\n }\n }\n return bins;\n}\nfunction quantize(rgba, maxColors, opts = {}) {\n const {\n format = \"rgb565\",\n clearAlpha = true,\n clearAlphaColor = 0,\n clearAlphaThreshold = 0,\n oneBitAlpha = false\n } = opts;\n if (!rgba || !rgba.buffer) {\n throw new Error(\"quantize() expected RGBA Uint8Array data\");\n }\n if (!(rgba instanceof Uint8Array) && !(rgba instanceof Uint8ClampedArray)) {\n throw new Error(\"quantize() expected RGBA Uint8Array data\");\n }\n const data = new Uint32Array(rgba.buffer);\n let useSqrt = opts.useSqrt !== false;\n const hasAlpha = format === \"rgba4444\";\n const bins = create_bin_list(data, format);\n const bincount = bins.length;\n const bincountMinusOne = bincount - 1;\n const heap = new Uint32Array(bincount + 1);\n var maxbins = 0;\n for (var i = 0; i < bincount; ++i) {\n const bin = bins[i];\n if (bin != null) {\n var d = 1 / bin.cnt;\n if (hasAlpha)\n bin.ac *= d;\n bin.rc *= d;\n bin.gc *= d;\n bin.bc *= d;\n bins[maxbins++] = bin;\n }\n }\n if (sqr(maxColors) / maxbins < 0.022) {\n useSqrt = false;\n }\n var i = 0;\n for (; i < maxbins - 1; ++i) {\n bins[i].fw = i + 1;\n bins[i + 1].bk = i;\n if (useSqrt)\n bins[i].cnt = Math.sqrt(bins[i].cnt);\n }\n if (useSqrt)\n bins[i].cnt = Math.sqrt(bins[i].cnt);\n var h, l, l2;\n for (i = 0; i < maxbins; ++i) {\n find_nn(bins, i, false);\n var err = bins[i].err;\n for (l = ++heap[0]; l > 1; l = l2) {\n l2 = l >> 1;\n if (bins[h = heap[l2]].err <= err)\n break;\n heap[l] = h;\n }\n heap[l] = i;\n }\n var extbins = maxbins - maxColors;\n for (i = 0; i < extbins; ) {\n var tb;\n for (; ; ) {\n var b1 = heap[1];\n tb = bins[b1];\n if (tb.tm >= tb.mtm && bins[tb.nn].mtm <= tb.tm)\n break;\n if (tb.mtm == bincountMinusOne)\n b1 = heap[1] = heap[heap[0]--];\n else {\n find_nn(bins, b1, false);\n tb.tm = i;\n }\n var err = bins[b1].err;\n for (l = 1; (l2 = l + l) <= heap[0]; l = l2) {\n if (l2 < heap[0] && bins[heap[l2]].err > bins[heap[l2 + 1]].err)\n l2++;\n if (err <= bins[h = heap[l2]].err)\n break;\n heap[l] = h;\n }\n heap[l] = b1;\n }\n var nb = bins[tb.nn];\n var n1 = tb.cnt;\n var n2 = nb.cnt;\n var d = 1 / (n1 + n2);\n if (hasAlpha)\n tb.ac = d * (n1 * tb.ac + n2 * nb.ac);\n tb.rc = d * (n1 * tb.rc + n2 * nb.rc);\n tb.gc = d * (n1 * tb.gc + n2 * nb.gc);\n tb.bc = d * (n1 * tb.bc + n2 * nb.bc);\n tb.cnt += nb.cnt;\n tb.mtm = ++i;\n bins[nb.bk].fw = nb.fw;\n bins[nb.fw].bk = nb.bk;\n nb.mtm = bincountMinusOne;\n }\n let palette = [];\n var k = 0;\n for (i = 0; ; ++k) {\n let r = clamp(Math.round(bins[i].rc), 0, 255);\n let g = clamp(Math.round(bins[i].gc), 0, 255);\n let b = clamp(Math.round(bins[i].bc), 0, 255);\n let a = 255;\n if (hasAlpha) {\n a = clamp(Math.round(bins[i].ac), 0, 255);\n if (oneBitAlpha) {\n const threshold = typeof oneBitAlpha === \"number\" ? oneBitAlpha : 127;\n a = a <= threshold ? 0 : 255;\n }\n if (clearAlpha && a <= clearAlphaThreshold) {\n r = g = b = clearAlphaColor;\n a = 0;\n }\n }\n const color = hasAlpha ? [r, g, b, a] : [r, g, b];\n const exists = existsInPalette(palette, color);\n if (!exists)\n palette.push(color);\n if ((i = bins[i].fw) == 0)\n break;\n }\n return palette;\n}\nfunction existsInPalette(palette, color) {\n for (let i = 0; i < palette.length; i++) {\n const p = palette[i];\n let matchesRGB = p[0] === color[0] && p[1] === color[1] && p[2] === color[2];\n let matchesAlpha = p.length >= 4 && color.length >= 4 ? p[3] === color[3] : true;\n if (matchesRGB && matchesAlpha)\n return true;\n }\n return false;\n}\n\n// src/color.js\nfunction euclideanDistanceSquared(a, b) {\n var sum = 0;\n var n;\n for (n = 0; n < a.length; n++) {\n const dx = a[n] - b[n];\n sum += dx * dx;\n }\n return sum;\n}\n\n// src/palettize.js\nfunction roundStep(byte, step) {\n return step > 1 ? Math.round(byte / step) * step : byte;\n}\nfunction prequantize(rgba, {roundRGB = 5, roundAlpha = 10, oneBitAlpha = null} = {}) {\n const data = new Uint32Array(rgba.buffer);\n for (let i = 0; i < data.length; i++) {\n const color = data[i];\n let a = color >> 24 & 255;\n let b = color >> 16 & 255;\n let g = color >> 8 & 255;\n let r = color & 255;\n a = roundStep(a, roundAlpha);\n if (oneBitAlpha) {\n const threshold = typeof oneBitAlpha === \"number\" ? oneBitAlpha : 127;\n a = a <= threshold ? 0 : 255;\n }\n r = roundStep(r, roundRGB);\n g = roundStep(g, roundRGB);\n b = roundStep(b, roundRGB);\n data[i] = a << 24 | b << 16 | g << 8 | r << 0;\n }\n}\nfunction applyPalette(rgba, palette, format = \"rgb565\") {\n if (!rgba || !rgba.buffer) {\n throw new Error(\"quantize() expected RGBA Uint8Array data\");\n }\n if (!(rgba instanceof Uint8Array) && !(rgba instanceof Uint8ClampedArray)) {\n throw new Error(\"quantize() expected RGBA Uint8Array data\");\n }\n if (palette.length > 256) {\n throw new Error(\"applyPalette() only works with 256 colors or less\");\n }\n const data = new Uint32Array(rgba.buffer);\n const length = data.length;\n const bincount = format === \"rgb444\" ? 4096 : 65536;\n const index = new Uint8Array(length);\n const cache = new Array(bincount);\n const hasAlpha = format === \"rgba4444\";\n if (format === \"rgba4444\") {\n for (let i = 0; i < length; i++) {\n const color = data[i];\n const a = color >> 24 & 255;\n const b = color >> 16 & 255;\n const g = color >> 8 & 255;\n const r = color & 255;\n const key = rgba8888_to_rgba4444(r, g, b, a);\n const idx = key in cache ? cache[key] : cache[key] = nearestColorIndexRGBA(r, g, b, a, palette);\n index[i] = idx;\n }\n } else {\n const rgb888_to_key = format === \"rgb444\" ? rgb888_to_rgb444 : rgb888_to_rgb565;\n for (let i = 0; i < length; i++) {\n const color = data[i];\n const b = color >> 16 & 255;\n const g = color >> 8 & 255;\n const r = color & 255;\n const key = rgb888_to_key(r, g, b);\n const idx = key in cache ? cache[key] : cache[key] = nearestColorIndexRGB(r, g, b, palette);\n index[i] = idx;\n }\n }\n return index;\n}\nfunction nearestColorIndexRGBA(r, g, b, a, palette) {\n let k = 0;\n let mindist = 1e100;\n for (let i = 0; i < palette.length; i++) {\n const px2 = palette[i];\n const a2 = px2[3];\n let curdist = sqr2(a2 - a);\n if (curdist > mindist)\n continue;\n const r2 = px2[0];\n curdist += sqr2(r2 - r);\n if (curdist > mindist)\n continue;\n const g2 = px2[1];\n curdist += sqr2(g2 - g);\n if (curdist > mindist)\n continue;\n const b2 = px2[2];\n curdist += sqr2(b2 - b);\n if (curdist > mindist)\n continue;\n mindist = curdist;\n k = i;\n }\n return k;\n}\nfunction nearestColorIndexRGB(r, g, b, palette) {\n let k = 0;\n let mindist = 1e100;\n for (let i = 0; i < palette.length; i++) {\n const px2 = palette[i];\n const r2 = px2[0];\n let curdist = sqr2(r2 - r);\n if (curdist > mindist)\n continue;\n const g2 = px2[1];\n curdist += sqr2(g2 - g);\n if (curdist > mindist)\n continue;\n const b2 = px2[2];\n curdist += sqr2(b2 - b);\n if (curdist > mindist)\n continue;\n mindist = curdist;\n k = i;\n }\n return k;\n}\nfunction snapColorsToPalette(palette, knownColors, threshold = 5) {\n if (!palette.length || !knownColors.length)\n return;\n const paletteRGB = palette.map((p) => p.slice(0, 3));\n const thresholdSq = threshold * threshold;\n const dim = palette[0].length;\n for (let i = 0; i < knownColors.length; i++) {\n let color = knownColors[i];\n if (color.length < dim) {\n color = [color[0], color[1], color[2], 255];\n } else if (color.length > dim) {\n color = color.slice(0, 3);\n } else {\n color = color.slice();\n }\n const r = nearestColorIndexWithDistance(paletteRGB, color.slice(0, 3), euclideanDistanceSquared);\n const idx = r[0];\n const distanceSq = r[1];\n if (distanceSq > 0 && distanceSq <= thresholdSq) {\n palette[idx] = color;\n }\n }\n}\nfunction sqr2(a) {\n return a * a;\n}\nfunction nearestColorIndex(colors, pixel, distanceFn = euclideanDistanceSquared) {\n let minDist = Infinity;\n let minDistIndex = -1;\n for (let j = 0; j < colors.length; j++) {\n const paletteColor = colors[j];\n const dist = distanceFn(pixel, paletteColor);\n if (dist < minDist) {\n minDist = dist;\n minDistIndex = j;\n }\n }\n return minDistIndex;\n}\nfunction nearestColorIndexWithDistance(colors, pixel, distanceFn = euclideanDistanceSquared) {\n let minDist = Infinity;\n let minDistIndex = -1;\n for (let j = 0; j < colors.length; j++) {\n const paletteColor = colors[j];\n const dist = distanceFn(pixel, paletteColor);\n if (dist < minDist) {\n minDist = dist;\n minDistIndex = j;\n }\n }\n return [minDistIndex, minDist];\n}\nfunction nearestColor(colors, pixel, distanceFn = euclideanDistanceSquared) {\n return colors[nearestColorIndex(colors, pixel, distanceFn)];\n}\n\n// src/index.js\nfunction GIFEncoder(opt = {}) {\n const {initialCapacity = 4096, auto = true} = opt;\n const stream = createStream(initialCapacity);\n const HSIZE = 5003;\n const accum = new Uint8Array(256);\n const htab = new Int32Array(HSIZE);\n const codetab = new Int32Array(HSIZE);\n let hasInit = false;\n return {\n reset() {\n stream.reset();\n hasInit = false;\n },\n finish() {\n stream.writeByte(constants_default.trailer);\n },\n bytes() {\n return stream.bytes();\n },\n bytesView() {\n return stream.bytesView();\n },\n get buffer() {\n return stream.buffer;\n },\n get stream() {\n return stream;\n },\n writeHeader,\n writeFrame(index, width, height, opts = {}) {\n const {\n transparent = false,\n transparentIndex = 0,\n delay = 0,\n palette = null,\n repeat = 0,\n colorDepth = 8,\n dispose = -1\n } = opts;\n let first = false;\n if (auto) {\n if (!hasInit) {\n first = true;\n writeHeader();\n hasInit = true;\n }\n } else {\n first = Boolean(opts.first);\n }\n width = Math.max(0, Math.floor(width));\n height = Math.max(0, Math.floor(height));\n if (first) {\n if (!palette) {\n throw new Error(\"First frame must include a { palette } option\");\n }\n encodeLogicalScreenDescriptor(stream, width, height, palette, colorDepth);\n encodeColorTable(stream, palette);\n if (repeat >= 0) {\n encodeNetscapeExt(stream, repeat);\n }\n }\n const delayTime = Math.round(delay / 10);\n encodeGraphicControlExt(stream, dispose, delayTime, transparent, transparentIndex);\n const useLocalColorTable = Boolean(palette) && !first;\n encodeImageDescriptor(stream, width, height, useLocalColorTable ? palette : null);\n if (useLocalColorTable)\n encodeColorTable(stream, palette);\n encodePixels(stream, index, width, height, colorDepth, accum, htab, codetab);\n }\n };\n function writeHeader() {\n writeUTFBytes(stream, \"GIF89a\");\n }\n}\nfunction encodeGraphicControlExt(stream, dispose, delay, transparent, transparentIndex) {\n stream.writeByte(33);\n stream.writeByte(249);\n stream.writeByte(4);\n if (transparentIndex < 0) {\n transparentIndex = 0;\n transparent = false;\n }\n var transp, disp;\n if (!transparent) {\n transp = 0;\n disp = 0;\n } else {\n transp = 1;\n disp = 2;\n }\n if (dispose >= 0) {\n disp = dispose & 7;\n }\n disp <<= 2;\n const userInput = 0;\n stream.writeByte(0 | disp | userInput | transp);\n writeUInt16(stream, delay);\n stream.writeByte(transparentIndex || 0);\n stream.writeByte(0);\n}\nfunction encodeLogicalScreenDescriptor(stream, width, height, palette, colorDepth = 8) {\n const globalColorTableFlag = 1;\n const sortFlag = 0;\n const globalColorTableSize = colorTableSize(palette.length) - 1;\n const fields = globalColorTableFlag << 7 | colorDepth - 1 << 4 | sortFlag << 3 | globalColorTableSize;\n const backgroundColorIndex = 0;\n const pixelAspectRatio = 0;\n writeUInt16(stream, width);\n writeUInt16(stream, height);\n stream.writeBytes([fields, backgroundColorIndex, pixelAspectRatio]);\n}\nfunction encodeNetscapeExt(stream, repeat) {\n stream.writeByte(33);\n stream.writeByte(255);\n stream.writeByte(11);\n writeUTFBytes(stream, \"NETSCAPE2.0\");\n stream.writeByte(3);\n stream.writeByte(1);\n writeUInt16(stream, repeat);\n stream.writeByte(0);\n}\nfunction encodeColorTable(stream, palette) {\n const colorTableLength = 1 << colorTableSize(palette.length);\n for (let i = 0; i < colorTableLength; i++) {\n let color = [0, 0, 0];\n if (i < palette.length) {\n color = palette[i];\n }\n stream.writeByte(color[0]);\n stream.writeByte(color[1]);\n stream.writeByte(color[2]);\n }\n}\nfunction encodeImageDescriptor(stream, width, height, localPalette) {\n stream.writeByte(44);\n writeUInt16(stream, 0);\n writeUInt16(stream, 0);\n writeUInt16(stream, width);\n writeUInt16(stream, height);\n if (localPalette) {\n const interlace = 0;\n const sorted = 0;\n const palSize = colorTableSize(localPalette.length) - 1;\n stream.writeByte(128 | interlace | sorted | 0 | palSize);\n } else {\n stream.writeByte(0);\n }\n}\nfunction encodePixels(stream, index, width, height, colorDepth = 8, accum, htab, codetab) {\n lzwEncode_default(width, height, index, colorDepth, stream, accum, htab, codetab);\n}\nfunction writeUInt16(stream, short) {\n stream.writeByte(short & 255);\n stream.writeByte(short >> 8 & 255);\n}\nfunction writeUTFBytes(stream, text) {\n for (var i = 0; i < text.length; i++) {\n stream.writeByte(text.charCodeAt(i));\n }\n}\nfunction colorTableSize(length) {\n return Math.max(Math.ceil(Math.log2(length)), 1);\n}\nvar src_default = GIFEncoder;\n//# sourceMappingURL=gifenc.js.map\n"],"x_google_ignoreList":[0],"mappings":"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"}
@@ -1,8 +1,139 @@
1
- import { s as StdoutContext } from "./context-QreF3UHr.mjs";
2
- import { t as useBoxRect } from "./useLayout-BG2cGl15.mjs";
3
- import { useContext, useEffect, useMemo, useRef } from "react";
1
+ import { n as getLayoutSignals, s as effect, t as rectEqual } from "./types-e4dpfbSa.mjs";
2
+ import { i as NodeContext, s as StdoutContext } from "./context-BjWgrikx.mjs";
3
+ import { useContext, useEffect, useLayoutEffect, useMemo, useReducer, useRef } from "react";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  import { readFileSync } from "node:fs";
6
+ //#region packages/ag-react/src/hooks/useLayout.ts
7
+ /**
8
+ * Layout Hooks — three coordinate systems for positioning in silvery.
9
+ *
10
+ * Every silvery node has three rects that differ only by how scroll and
11
+ * sticky offsets are applied. Pick the one that matches your use case:
12
+ *
13
+ * - `useBoxRect()` — layout position (border-box sized). Use for responsive
14
+ * sizing inside a component. Matches CSS offset-like
15
+ * semantics for the content area.
16
+ * - `useScrollRect()` — scroll-adjusted position, **pre** sticky clamping.
17
+ * Use when you need the "natural" position of a node
18
+ * in scrolled coordinates (can go off-screen).
19
+ * - `useScreenRect()` — actual paint position on the terminal screen.
20
+ * Use for hit testing, cursor positioning, and
21
+ * cross-component visual navigation. The CSS
22
+ * `getBoundingClientRect()` analogue.
23
+ *
24
+ * Each hook has two call signatures:
25
+ *
26
+ * const rect = useBoxRect() // reactive — re-renders on change
27
+ * useBoxRect((rect) => register(id, rect)) // callback — zero re-renders
28
+ *
29
+ * The callback form is the right choice for hot paths like large lists where
30
+ * re-rendering on every layout change is prohibitive.
31
+ */
32
+ const EMPTY_RECT = {
33
+ x: 0,
34
+ y: 0,
35
+ width: 0,
36
+ height: 0
37
+ };
38
+ /**
39
+ * Get the inner content dimensions of a node (border-box minus padding and border).
40
+ * This is the space available for the node's children.
41
+ */
42
+ function getInnerRect(node) {
43
+ const rect = node.boxRect;
44
+ if (!rect) return EMPTY_RECT;
45
+ const props = node.props;
46
+ if (!props || node.type === "silvery-text") return rect;
47
+ const pTop = props.paddingTop ?? props.paddingY ?? props.padding ?? 0;
48
+ const pBottom = props.paddingBottom ?? props.paddingY ?? props.padding ?? 0;
49
+ const pLeft = props.paddingLeft ?? props.paddingX ?? props.padding ?? 0;
50
+ const pRight = props.paddingRight ?? props.paddingX ?? props.padding ?? 0;
51
+ let bTop = 0;
52
+ let bBottom = 0;
53
+ let bLeft = 0;
54
+ let bRight = 0;
55
+ if (props.borderStyle) {
56
+ bTop = props.borderTop !== false ? 1 : 0;
57
+ bBottom = props.borderBottom !== false ? 1 : 0;
58
+ bLeft = props.borderLeft !== false ? 1 : 0;
59
+ bRight = props.borderRight !== false ? 1 : 0;
60
+ }
61
+ return {
62
+ x: rect.x + pLeft + bLeft,
63
+ y: rect.y + pTop + bTop,
64
+ width: Math.max(0, rect.width - pLeft - pRight - bLeft - bRight),
65
+ height: Math.max(0, rect.height - pTop - pBottom - bTop - bBottom)
66
+ };
67
+ }
68
+ /**
69
+ * Reactive rect hook: subscribes to a rect signal via alien-signals effect()
70
+ * and forces a React re-render whenever the derived rect changes.
71
+ *
72
+ * `signalKey` identifies which rect signal to track (boxRect, scrollRect, or
73
+ * screenRect). `getRect` derives the final value from the node (e.g.,
74
+ * computing inner rect from boxRect by subtracting padding/border).
75
+ *
76
+ * The effect() creates a reactive dependency on the signal — when
77
+ * syncRectSignals writes a new value, the effect re-runs, compares via
78
+ * rectEqual, and triggers forceUpdate only when the derived rect changed.
79
+ */
80
+ function useReactiveRect(getRect, signalKey) {
81
+ const node = useContext(NodeContext);
82
+ const [, forceUpdate] = useReducer((x) => x + 1, 0);
83
+ const prevRef = useRef(null);
84
+ useLayoutEffect(() => {
85
+ if (!node) return;
86
+ const rectSignal = getLayoutSignals(node)[signalKey];
87
+ return effect(() => {
88
+ rectSignal();
89
+ const next = getRect(node) ?? null;
90
+ if (!rectEqual(prevRef.current, next)) {
91
+ prevRef.current = next;
92
+ forceUpdate();
93
+ }
94
+ });
95
+ }, [node]);
96
+ if (!node) return EMPTY_RECT;
97
+ return getRect(node) ?? EMPTY_RECT;
98
+ }
99
+ /**
100
+ * Callback rect hook: subscribes via alien-signals effect() without
101
+ * triggering React re-renders. The callback is invoked after layout
102
+ * completes whenever the selected rect is available.
103
+ *
104
+ * Uses refs to keep the subscription stable across renders — the `getRect`
105
+ * and `callback` functions are typically created inline and would otherwise
106
+ * invalidate the effect on every render.
107
+ */
108
+ function useCallbackRect(getRect, callback, signalKey) {
109
+ const node = useContext(NodeContext);
110
+ const callbackRef = useRef(callback);
111
+ callbackRef.current = callback;
112
+ const getRectRef = useRef(getRect);
113
+ getRectRef.current = getRect;
114
+ useLayoutEffect(() => {
115
+ if (!node) return;
116
+ const rectSignal = getLayoutSignals(node)[signalKey];
117
+ return effect(() => {
118
+ rectSignal();
119
+ const rect = getRectRef.current(node);
120
+ if (rect) callbackRef.current(rect);
121
+ });
122
+ }, [node]);
123
+ }
124
+ function useBoxRect(callback) {
125
+ if (callback) return useCallbackRect((node) => getInnerRect(node), callback, "boxRect");
126
+ return useReactiveRect((node) => getInnerRect(node), "boxRect");
127
+ }
128
+ function useScrollRect(callback) {
129
+ if (callback) return useCallbackRect((node) => node.scrollRect, callback, "scrollRect");
130
+ return useReactiveRect((node) => node.scrollRect, "scrollRect");
131
+ }
132
+ function useScreenRect(callback) {
133
+ if (callback) return useCallbackRect((node) => node.screenRect, callback, "screenRect");
134
+ return useReactiveRect((node) => node.screenRect, "screenRect");
135
+ }
136
+ //#endregion
6
137
  //#region packages/ag-react/src/ui/image/kitty-graphics.ts
7
138
  /**
8
139
  * Kitty Graphics Protocol
@@ -341,6 +472,6 @@ function Image({ src, width: requestedWidth, height: requestedHeight, fallback =
341
472
  });
342
473
  }
343
474
  //#endregion
344
- export { encodeKittyImage as a, deleteKittyImage as i, encodeSixel as n, isKittyGraphicsSupported as o, isSixelSupported as r, Image as t };
475
+ export { encodeKittyImage as a, useScreenRect as c, deleteKittyImage as i, useScrollRect as l, encodeSixel as n, isKittyGraphicsSupported as o, isSixelSupported as r, useBoxRect as s, Image as t };
345
476
 
346
- //# sourceMappingURL=image-Dx7gYjkq.mjs.map
477
+ //# sourceMappingURL=image-B0zMbVUr.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-B0zMbVUr.mjs","names":["ST"],"sources":["../packages/ag-react/src/hooks/useLayout.ts","../packages/ag-react/src/ui/image/kitty-graphics.ts","../packages/ag-react/src/ui/image/sixel-encoder.ts","../packages/ag-react/src/ui/image/Image.tsx"],"sourcesContent":["/**\n * Layout Hooks — three coordinate systems for positioning in silvery.\n *\n * Every silvery node has three rects that differ only by how scroll and\n * sticky offsets are applied. Pick the one that matches your use case:\n *\n * - `useBoxRect()` — layout position (border-box sized). Use for responsive\n * sizing inside a component. Matches CSS offset-like\n * semantics for the content area.\n * - `useScrollRect()` — scroll-adjusted position, **pre** sticky clamping.\n * Use when you need the \"natural\" position of a node\n * in scrolled coordinates (can go off-screen).\n * - `useScreenRect()` — actual paint position on the terminal screen.\n * Use for hit testing, cursor positioning, and\n * cross-component visual navigation. The CSS\n * `getBoundingClientRect()` analogue.\n *\n * Each hook has two call signatures:\n *\n * const rect = useBoxRect() // reactive — re-renders on change\n * useBoxRect((rect) => register(id, rect)) // callback — zero re-renders\n *\n * The callback form is the right choice for hot paths like large lists where\n * re-rendering on every layout change is prohibitive.\n */\n\nimport { useContext, useLayoutEffect, useReducer, useRef } from \"react\"\nimport { effect } from \"@silvery/signals\"\nimport { NodeContext } from \"../context\"\nimport { type AgNode, type BoxProps, type Rect, rectEqual } from \"@silvery/ag/types\"\nimport { getLayoutSignals } from \"@silvery/ag/layout-signals\"\n\nexport type { Rect }\n\nconst EMPTY_RECT: Rect = { x: 0, y: 0, width: 0, height: 0 }\n\n/**\n * Get the inner content dimensions of a node (border-box minus padding and border).\n * This is the space available for the node's children.\n */\nfunction getInnerRect(node: AgNode): Rect {\n const rect = node.boxRect\n if (!rect) return EMPTY_RECT\n\n const props = node.props as BoxProps\n if (!props || node.type === \"silvery-text\") return rect\n\n // Compute padding\n const pTop = props.paddingTop ?? props.paddingY ?? props.padding ?? 0\n const pBottom = props.paddingBottom ?? props.paddingY ?? props.padding ?? 0\n const pLeft = props.paddingLeft ?? props.paddingX ?? props.padding ?? 0\n const pRight = props.paddingRight ?? props.paddingX ?? props.padding ?? 0\n\n // Compute border (1px per side if borderStyle is set)\n let bTop = 0\n let bBottom = 0\n let bLeft = 0\n let bRight = 0\n if (props.borderStyle) {\n bTop = props.borderTop !== false ? 1 : 0\n bBottom = props.borderBottom !== false ? 1 : 0\n bLeft = props.borderLeft !== false ? 1 : 0\n bRight = props.borderRight !== false ? 1 : 0\n }\n\n return {\n x: rect.x + pLeft + bLeft,\n y: rect.y + pTop + bTop,\n width: Math.max(0, rect.width - pLeft - pRight - bLeft - bRight),\n height: Math.max(0, rect.height - pTop - pBottom - bTop - bBottom),\n }\n}\n\ntype RectCallback = (rect: Rect) => void\n\n/** Selector that picks which rect signal to subscribe to. */\ntype RectSignalKey = \"boxRect\" | \"scrollRect\" | \"screenRect\"\n\n/**\n * Reactive rect hook: subscribes to a rect signal via alien-signals effect()\n * and forces a React re-render whenever the derived rect changes.\n *\n * `signalKey` identifies which rect signal to track (boxRect, scrollRect, or\n * screenRect). `getRect` derives the final value from the node (e.g.,\n * computing inner rect from boxRect by subtracting padding/border).\n *\n * The effect() creates a reactive dependency on the signal — when\n * syncRectSignals writes a new value, the effect re-runs, compares via\n * rectEqual, and triggers forceUpdate only when the derived rect changed.\n */\nfunction useReactiveRect(getRect: (node: AgNode) => Rect | null | undefined, signalKey: RectSignalKey): Rect {\n const node = useContext(NodeContext)\n const [, forceUpdate] = useReducer((x: number) => x + 1, 0)\n const prevRef = useRef<Rect | null>(null)\n\n useLayoutEffect(() => {\n if (!node) return\n\n const signals = getLayoutSignals(node)\n const rectSignal = signals[signalKey]\n\n // effect() subscribes to the signal — re-runs when the signal value changes.\n // Reading rectSignal() inside effect creates the reactive dependency.\n const dispose = effect(() => {\n // Read the signal to establish the dependency\n rectSignal()\n\n // Derive the final rect from the node (may compute inner rect, etc.)\n const next = getRect(node) ?? null\n if (!rectEqual(prevRef.current, next)) {\n prevRef.current = next\n forceUpdate()\n }\n })\n\n return dispose\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [node])\n\n if (!node) return EMPTY_RECT\n return getRect(node) ?? EMPTY_RECT\n}\n\n/**\n * Callback rect hook: subscribes via alien-signals effect() without\n * triggering React re-renders. The callback is invoked after layout\n * completes whenever the selected rect is available.\n *\n * Uses refs to keep the subscription stable across renders — the `getRect`\n * and `callback` functions are typically created inline and would otherwise\n * invalidate the effect on every render.\n */\nfunction useCallbackRect(\n getRect: (node: AgNode) => Rect | null | undefined,\n callback: RectCallback,\n signalKey: RectSignalKey,\n): void {\n const node = useContext(NodeContext)\n\n const callbackRef = useRef(callback)\n callbackRef.current = callback\n const getRectRef = useRef(getRect)\n getRectRef.current = getRect\n\n useLayoutEffect(() => {\n if (!node) return\n\n const signals = getLayoutSignals(node)\n const rectSignal = signals[signalKey]\n\n // effect() subscribes to the signal — re-runs when the signal value changes.\n const dispose = effect(() => {\n // Read the signal to establish the dependency\n rectSignal()\n\n const rect = getRectRef.current(node)\n if (rect) callbackRef.current(rect)\n })\n\n return dispose\n }, [node])\n}\n\n// ============================================================================\n// boxRect — layout position (border-box)\n// ============================================================================\n\n/**\n * Returns the inner content dimensions for the current component's nearest Box.\n * Width and height reflect the space available for children (border-box minus\n * padding and border), like CSS `clientWidth`/`clientHeight`.\n *\n * Two signatures:\n *\n * ```tsx\n * // Reactive — re-renders when the rect changes\n * function Header() {\n * const { width } = useBoxRect()\n * return <Text>{'='.repeat(width)}</Text>\n * }\n *\n * // Callback — zero re-renders, use for hot paths like large lists\n * function Card({ id, onLayout }) {\n * useBoxRect((rect) => onLayout(id, rect))\n * return <Box>...</Box>\n * }\n * ```\n *\n * On first render (reactive form), returns `{ x: 0, y: 0, width: 0, height: 0 }`.\n * After layout completes, automatically re-renders with actual dimensions.\n */\nexport function useBoxRect(): Rect\nexport function useBoxRect(callback: RectCallback): void\nexport function useBoxRect(callback?: RectCallback): Rect | void {\n if (callback) {\n return useCallbackRect((node) => getInnerRect(node), callback, \"boxRect\")\n }\n return useReactiveRect((node) => getInnerRect(node), \"boxRect\")\n}\n\n// ============================================================================\n// scrollRect — scroll-adjusted position (pre-sticky clamping)\n// ============================================================================\n\n/**\n * Returns the scroll-adjusted position for the current component.\n *\n * This is the node's position in scroll coordinates, *before* sticky clamping.\n * For non-sticky nodes it equals `useScreenRect()`. For sticky nodes, the\n * scrollRect reflects where the node would be without sticky adjustment —\n * so it can go off-screen (negative y, etc.) when scrolled past.\n *\n * Use this when you need to reason about the node's \"natural\" position in the\n * scrolled document. For hit testing or cursor positioning, use\n * `useScreenRect()` instead.\n *\n * Two signatures:\n *\n * ```tsx\n * // Reactive — re-renders when scroll changes\n * function Card({ id }) {\n * const { y } = useScrollRect()\n * return <Box>Scroll y: {y}</Box>\n * }\n *\n * // Callback — zero re-renders\n * function Card({ id, onLayout }) {\n * useScrollRect((rect) => onLayout(id, rect.y))\n * return <Box>...</Box>\n * }\n * ```\n */\nexport function useScrollRect(): Rect\nexport function useScrollRect(callback: RectCallback): void\nexport function useScrollRect(callback?: RectCallback): Rect | void {\n if (callback) {\n return useCallbackRect((node) => node.scrollRect, callback, \"scrollRect\")\n }\n return useReactiveRect((node) => node.scrollRect, \"scrollRect\")\n}\n\n// ============================================================================\n// screenRect — actual paint position on the terminal screen\n// ============================================================================\n\n/**\n * Returns the actual paint position on the terminal screen — the silvery\n * analogue of `getBoundingClientRect()`.\n *\n * For non-sticky nodes this equals `useScrollRect()`. For sticky nodes\n * (`position=\"sticky\"`), it reflects the clamped position where pixels\n * actually land on screen.\n *\n * Use this for hit testing, cursor positioning, and any feature that needs\n * to know where a node visually appears on the terminal.\n *\n * Two signatures:\n *\n * ```tsx\n * // Reactive — re-renders when the screen position changes\n * function StickyHeader() {\n * const { y } = useScreenRect()\n * return <Box position=\"sticky\" stickyTop={0}>Header at row {y}</Box>\n * }\n *\n * // Callback — zero re-renders, recommended for cross-component visual\n * // navigation (e.g. registering card positions for arrow-key navigation\n * // across columns with independent scroll state).\n * function Card({ id, onLayout }) {\n * useScreenRect((rect) => onLayout(id, rect.y))\n * return <Box>...</Box>\n * }\n * ```\n */\nexport function useScreenRect(): Rect\nexport function useScreenRect(callback: RectCallback): void\nexport function useScreenRect(callback?: RectCallback): Rect | void {\n if (callback) {\n return useCallbackRect((node) => node.screenRect, callback, \"screenRect\")\n }\n return useReactiveRect((node) => node.screenRect, \"screenRect\")\n}\n","/**\n * Kitty Graphics Protocol\n *\n * Encodes and manages images using the Kitty terminal graphics protocol.\n * Images are transmitted as base64-encoded PNG data via APC (Application\n * Program Command) escape sequences.\n *\n * Protocol reference: https://sw.kovidgoyal.net/kitty/graphics-protocol/\n *\n * Key concepts:\n * - `a=T` — transmit and display the image\n * - `f=100` — format is PNG (raw PNG data, terminal decodes it)\n * - `m=0|1` — 0 = last/only chunk, 1 = more chunks follow\n * - Chunks should be <= 4096 bytes of base64 to avoid overwhelming the terminal\n * - Images can be assigned an `i=<id>` for later deletion\n */\n\nconst APC_START = \"\\x1b_G\"\nconst ST = \"\\x1b\\\\\"\n\n/** Maximum base64 bytes per chunk (Kitty recommendation) */\nconst MAX_CHUNK_SIZE = 4096\n\nexport interface KittyImageOptions {\n /** Image width in terminal columns */\n width?: number\n /** Image height in terminal rows */\n height?: number\n /** Image ID for later reference/deletion (positive integer) */\n id?: number\n}\n\n/**\n * Encode a PNG image into Kitty graphics protocol escape sequences.\n *\n * The image data is base64-encoded and split into chunks of <= 4096 bytes.\n * Each chunk is wrapped in an APC escape sequence. The first chunk carries\n * the image metadata (action, format, dimensions, ID). Subsequent chunks\n * only carry `m=1` or `m=0` to indicate continuation.\n *\n * @param pngData - Raw PNG image data\n * @param opts - Optional dimensions and ID\n * @returns A string containing the complete escape sequence(s)\n *\n * @example\n * ```ts\n * import { readFileSync } from \"fs\"\n * import { encodeKittyImage } from \"@silvery/ag-react\"\n *\n * const png = readFileSync(\"photo.png\")\n * const seq = encodeKittyImage(png, { width: 40, height: 20 })\n * process.stdout.write(seq)\n * ```\n */\nexport function encodeKittyImage(pngData: Buffer, opts?: KittyImageOptions): string {\n const b64 = pngData.toString(\"base64\")\n const chunks = splitIntoChunks(b64, MAX_CHUNK_SIZE)\n\n if (chunks.length === 0) {\n // Empty image — send a single empty payload\n return `${APC_START}${buildParams(opts, 0)};${ST}`\n }\n\n if (chunks.length === 1) {\n // Single chunk — m=0 (last/only)\n return `${APC_START}${buildParams(opts, 0)};${chunks[0]}${ST}`\n }\n\n // Multiple chunks\n const parts: string[] = []\n\n // First chunk carries full metadata, m=1 (more follows)\n parts.push(`${APC_START}${buildParams(opts, 1)};${chunks[0]}${ST}`)\n\n // Middle chunks — only m=1\n for (let i = 1; i < chunks.length - 1; i++) {\n parts.push(`${APC_START}m=1;${chunks[i]}${ST}`)\n }\n\n // Last chunk — m=0\n parts.push(`${APC_START}m=0;${chunks[chunks.length - 1]}${ST}`)\n\n return parts.join(\"\")\n}\n\n/**\n * Generate an escape sequence to delete a Kitty image by ID.\n *\n * Uses `a=d` (delete) with `d=i` (delete by image ID).\n *\n * @param id - The image ID to delete\n * @returns The delete escape sequence\n *\n * @example\n * ```ts\n * process.stdout.write(deleteKittyImage(42))\n * ```\n */\nexport function deleteKittyImage(id: number): string {\n return `${APC_START}a=d,d=i,i=${id}${ST}`\n}\n\n/**\n * Check if the current terminal likely supports the Kitty graphics protocol.\n *\n * This is a heuristic based on `TERM` and `TERM_PROGRAM` environment variables.\n * For definitive detection, use a terminal query (send the graphics protocol\n * query and check for a response), but that requires async I/O.\n *\n * Known supporting terminals: Kitty, WezTerm, Ghostty (partial), Konsole (partial).\n *\n * @returns `true` if the terminal likely supports Kitty graphics\n */\nexport function isKittyGraphicsSupported(): boolean {\n const term = process.env.TERM ?? \"\"\n const termProgram = process.env.TERM_PROGRAM ?? \"\"\n\n // Kitty terminal\n if (term === \"xterm-kitty\" || termProgram === \"kitty\") return true\n\n // WezTerm supports Kitty graphics protocol\n if (termProgram === \"WezTerm\") return true\n\n // Ghostty supports Kitty graphics\n if (termProgram === \"ghostty\") return true\n\n // Konsole 22.04+ supports Kitty graphics\n if (termProgram === \"konsole\") return true\n\n return false\n}\n\n// ============================================================================\n// Internal helpers\n// ============================================================================\n\n/**\n * Build the Kitty graphics protocol parameter string for the first chunk.\n */\nfunction buildParams(opts: KittyImageOptions | undefined, more: 0 | 1): string {\n const parts = [`a=T`, `f=100`, `m=${more}`]\n\n if (opts?.width != null) parts.push(`s=${opts.width}`)\n if (opts?.height != null) parts.push(`v=${opts.height}`)\n if (opts?.id != null) parts.push(`i=${opts.id}`)\n\n return parts.join(\",\")\n}\n\n/**\n * Split a string into chunks of at most `size` characters.\n */\nfunction splitIntoChunks(str: string, size: number): string[] {\n if (str.length === 0) return []\n\n const chunks: string[] = []\n for (let i = 0; i < str.length; i += size) {\n chunks.push(str.slice(i, i + size))\n }\n return chunks\n}\n","/**\n * Sixel Encoder (Minimal Implementation)\n *\n * Sixel is an older image protocol supported by terminals like xterm, mlterm,\n * foot, and some others. Images are encoded as DCS (Device Control String)\n * sequences where each character encodes 6 vertical pixels.\n *\n * DCS format: `ESC P <params> q <sixel-data> ESC \\`\n *\n * This is a minimal implementation that produces valid Sixel output for\n * simple images. For production use with complex images, consider using\n * a dedicated Sixel library that handles color quantization and dithering.\n *\n * Protocol reference: https://en.wikipedia.org/wiki/Sixel\n *\n * TODO: Full Sixel encoding with proper color quantization, dithering,\n * and compression. The current implementation handles basic RGBA image data\n * with a simple nearest-color palette approach.\n */\n\nconst DCS_START = \"\\x1bP\"\nconst ST = \"\\x1b\\\\\"\n\n/** Sixel introduces a color with `#<index>;2;<r>;<g>;<b>` (RGB percentages 0-100) */\nconst SIXEL_NEWLINE = \"-\"\n\nexport interface SixelImageData {\n /** Image width in pixels */\n width: number\n /** Image height in pixels */\n height: number\n /** RGBA pixel data (4 bytes per pixel: R, G, B, A), row-major order */\n data: Uint8Array\n}\n\n/**\n * Encode RGBA image data as a Sixel escape sequence.\n *\n * This is a basic implementation that:\n * 1. Quantizes colors to a small palette (up to 256 colors)\n * 2. Encodes 6-row bands as Sixel characters\n * 3. Wraps in a DCS escape sequence\n *\n * For transparent pixels (alpha < 128), the background shows through.\n *\n * @param imageData - Image dimensions and RGBA pixel data\n * @returns A DCS escape sequence containing the Sixel-encoded image\n *\n * @example\n * ```ts\n * const img = { width: 10, height: 12, data: new Uint8Array(10 * 12 * 4) }\n * const seq = encodeSixel(img)\n * process.stdout.write(seq)\n * ```\n */\nexport function encodeSixel(imageData: SixelImageData): string {\n const { width, height, data } = imageData\n\n if (width === 0 || height === 0 || data.length === 0) {\n return `${DCS_START}q${ST}`\n }\n\n // Build a simple palette by collecting unique (quantized) colors\n const palette = new Map<string, number>()\n const pixelColors = new Uint16Array(width * height) // palette index per pixel (0 = transparent)\n let nextColorIndex = 1 // 0 reserved for transparent/background\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const offset = (y * width + x) * 4\n const r = data[offset]!\n const g = data[offset + 1]!\n const b = data[offset + 2]!\n const a = data[offset + 3]!\n\n if (a < 128) {\n // Transparent — leave as 0\n continue\n }\n\n // Quantize to 6-bit per channel (64 levels) to keep palette small\n const qr = (r >> 2) & 0x3f\n const qg = (g >> 2) & 0x3f\n const qb = (b >> 2) & 0x3f\n const key = `${qr},${qg},${qb}`\n\n let idx = palette.get(key)\n if (idx == null) {\n if (nextColorIndex >= 256) {\n // Palette full — find closest existing color (simple fallback)\n idx = 1\n } else {\n idx = nextColorIndex++\n palette.set(key, idx)\n }\n }\n\n pixelColors[y * width + x] = idx\n }\n }\n\n // Build Sixel data\n const parts: string[] = []\n\n // Raster attributes: Pan;Pad;Ph;Pv (aspect ratio 1:1, width, height)\n parts.push(`\"1;1;${width};${height}`)\n\n // Define palette colors\n for (const [key, idx] of palette) {\n const [qr, qg, qb] = key.split(\",\").map(Number)\n // Convert from 6-bit (0-63) to percentage (0-100)\n const rPct = Math.round((qr! / 63) * 100)\n const gPct = Math.round((qg! / 63) * 100)\n const bPct = Math.round((qb! / 63) * 100)\n parts.push(`#${idx};2;${rPct};${gPct};${bPct}`)\n }\n\n // Encode pixel data in 6-row bands\n for (let bandY = 0; bandY < height; bandY += 6) {\n if (bandY > 0) {\n parts.push(SIXEL_NEWLINE) // Move to next sixel row\n }\n\n // For each color in the palette, emit the sixel row\n // (Only emit colors that appear in this band)\n const bandColors = new Set<number>()\n for (let dy = 0; dy < 6 && bandY + dy < height; dy++) {\n for (let x = 0; x < width; x++) {\n const ci = pixelColors[(bandY + dy) * width + x]!\n if (ci > 0) bandColors.add(ci)\n }\n }\n\n let first = true\n for (const colorIdx of bandColors) {\n if (!first) {\n parts.push(\"$\") // Carriage return within sixel line (reposition to start)\n }\n first = false\n\n parts.push(`#${colorIdx}`)\n\n // Build the sixel characters for this color in this band\n for (let x = 0; x < width; x++) {\n let sixelBits = 0\n for (let dy = 0; dy < 6; dy++) {\n const y = bandY + dy\n if (y < height && pixelColors[y * width + x] === colorIdx) {\n sixelBits |= 1 << dy\n }\n }\n // Sixel character = bits + 63 (0x3F)\n parts.push(String.fromCharCode(sixelBits + 63))\n }\n }\n }\n\n return `${DCS_START}q${parts.join(\"\")}${ST}`\n}\n\n/**\n * Check if the current terminal likely supports the Sixel protocol.\n *\n * This is a heuristic based on environment variables. For definitive\n * detection, send a DA1 (Device Attributes) query and check for \"4\"\n * in the response, but that requires async I/O.\n *\n * Known supporting terminals: xterm (with +sixel), mlterm, foot, mintty,\n * WezTerm, Contour, Sixel-enabled builds of various terminals.\n *\n * @returns `true` if the terminal likely supports Sixel\n */\nexport function isSixelSupported(): boolean {\n const term = process.env.TERM ?? \"\"\n const termProgram = process.env.TERM_PROGRAM ?? \"\"\n\n // mlterm supports Sixel natively\n if (termProgram === \"mlterm\" || term.startsWith(\"mlterm\")) return true\n\n // foot supports Sixel\n if (termProgram === \"foot\" || term === \"foot\" || term === \"foot-extra\") return true\n\n // WezTerm supports Sixel\n if (termProgram === \"WezTerm\") return true\n\n // mintty supports Sixel\n if (termProgram === \"mintty\") return true\n\n // xterm might support Sixel if compiled with +sixel\n // We can't know for sure from env alone, so we don't claim support\n // (the user can set protocol='sixel' explicitly)\n\n return false\n}\n","/**\n * Image Component\n *\n * Renders bitmap images in supported terminals using the Kitty graphics\n * protocol (primary) or Sixel (fallback). When neither is supported,\n * displays a text placeholder.\n *\n * Since terminal images are escape-sequence-based and don't fit the cell\n * buffer model, the component reserves visual space with a Box of the\n * requested dimensions and uses `useEffect` to write image data directly\n * to stdout after render.\n *\n * @example\n * ```tsx\n * import { readFileSync } from \"fs\"\n * import { Image } from \"@silvery/ag-react\"\n *\n * const png = readFileSync(\"photo.png\")\n * <Image src={png} width={40} height={20} />\n *\n * // With file path\n * <Image src=\"/path/to/image.png\" width={40} height={20} />\n *\n * // Auto-detect protocol, fall back to text\n * <Image src={png} width={40} height={20} fallback=\"[photo]\" />\n * ```\n */\n\nimport { readFileSync } from \"node:fs\"\nimport { type JSX, useContext, useEffect, useMemo, useRef } from \"react\"\nimport { StdoutContext } from \"../../context\"\nimport { useBoxRect } from \"../../hooks/useLayout\"\nimport { encodeKittyImage, isKittyGraphicsSupported, deleteKittyImage } from \"./kitty-graphics\"\nimport { isSixelSupported } from \"./sixel-encoder\"\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type ImageProtocol = \"kitty\" | \"sixel\" | \"auto\"\n\nexport interface ImageProps {\n /** PNG image data (Buffer) or file path (string) to a PNG file */\n src: Buffer | string\n /** Width in terminal columns. If omitted, uses available width from layout. */\n width?: number\n /** Height in terminal rows. If omitted, defaults to half the width (rough aspect ratio). */\n height?: number\n /** Text to display when image rendering is not supported. Default: \"[image]\" */\n fallback?: string\n /** Which protocol to use. Default: \"auto\" (tries Kitty, then Sixel, then fallback) */\n protocol?: ImageProtocol\n}\n\n// ============================================================================\n// Protocol Detection\n// ============================================================================\n\n/**\n * Determine the best available image protocol.\n * Returns null if no image protocol is available.\n */\nfunction detectProtocol(preferred: ImageProtocol): \"kitty\" | \"sixel\" | null {\n if (preferred === \"kitty\") {\n return isKittyGraphicsSupported() ? \"kitty\" : null\n }\n if (preferred === \"sixel\") {\n return isSixelSupported() ? \"sixel\" : null\n }\n\n // Auto-detect: prefer Kitty, fall back to Sixel\n if (isKittyGraphicsSupported()) return \"kitty\"\n if (isSixelSupported()) return \"sixel\"\n return null\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/** Incrementing image ID counter for Kitty protocol */\nlet nextImageId = 1\n\n/**\n * Renders a bitmap image in the terminal.\n *\n * The component operates in two phases:\n * 1. **Layout phase**: Renders a Box that reserves the visual space\n * (filled with spaces so the cell buffer has the right dimensions).\n * 2. **Effect phase**: After render, writes the image escape sequence\n * directly to stdout, positioned over the reserved space.\n *\n * When image protocols are not available, the fallback text is shown instead.\n */\nexport function Image({\n src,\n width: requestedWidth,\n height: requestedHeight,\n fallback = \"[image]\",\n protocol: preferredProtocol = \"auto\",\n}: ImageProps): JSX.Element {\n const boxRect = useBoxRect()\n const stdoutCtx = useContext(StdoutContext)\n const imageIdRef = useRef<number | null>(null)\n\n // Resolve image data\n const pngData = useMemo(() => {\n if (Buffer.isBuffer(src)) return src\n // String path — read file synchronously (during render is fine for a path)\n try {\n return readFileSync(src)\n } catch {\n return null\n }\n }, [src])\n\n // Determine effective dimensions\n const effectiveWidth = requestedWidth ?? boxRect.width\n const effectiveHeight = requestedHeight ?? Math.max(1, Math.floor(effectiveWidth / 2))\n\n // Detect protocol support\n const activeProtocol = useMemo(() => detectProtocol(preferredProtocol), [preferredProtocol])\n\n // Assign a stable image ID for Kitty (for cleanup on unmount)\n if (activeProtocol === \"kitty\" && imageIdRef.current == null) {\n imageIdRef.current = nextImageId++\n }\n\n // Write image escape sequences after render\n useEffect(() => {\n if (!pngData || !stdoutCtx || !activeProtocol) return\n if (effectiveWidth <= 0 || effectiveHeight <= 0) return\n\n const { write } = stdoutCtx\n\n if (activeProtocol === \"kitty\") {\n const seq = encodeKittyImage(pngData, {\n width: effectiveWidth,\n height: effectiveHeight,\n id: imageIdRef.current ?? undefined,\n })\n write(seq)\n } else if (activeProtocol === \"sixel\") {\n // For Sixel, we would need the decoded pixel data.\n // Since we receive PNG, and decoding PNG requires a library,\n // Sixel rendering from raw PNG is deferred. The Kitty protocol\n // can transmit PNG directly (f=100), but Sixel cannot.\n // For now, Sixel only works if src is already decoded pixel data.\n // This is a known limitation noted in the module docs.\n //\n // If someone passes a Buffer that's already RGBA pixel data\n // (not PNG), this would need a flag. For now, Sixel falls through\n // to fallback when src is PNG.\n }\n }, [pngData, stdoutCtx, activeProtocol, effectiveWidth, effectiveHeight])\n\n // Cleanup: delete Kitty image on unmount\n useEffect(() => {\n const id = imageIdRef.current\n if (activeProtocol !== \"kitty\" || id == null || !stdoutCtx) return\n\n return () => {\n stdoutCtx.write(deleteKittyImage(id))\n }\n }, [activeProtocol, stdoutCtx])\n\n // If no protocol or no image data, render fallback text\n if (!activeProtocol || !pngData) {\n return (\n <silvery-box width={effectiveWidth} height={effectiveHeight}>\n <silvery-text>{fallback}</silvery-text>\n </silvery-box>\n )\n }\n\n // Reserve visual space with an empty box.\n // The image is drawn over this space via stdout escape sequences.\n // Fill with spaces so the cell buffer allocates the right area.\n const spaceLine = \" \".repeat(Math.max(0, effectiveWidth))\n const spaceContent = Array.from({ length: Math.max(0, effectiveHeight) }, () => spaceLine).join(\"\\n\")\n\n return (\n <silvery-box width={effectiveWidth} height={effectiveHeight}>\n <silvery-text>{spaceContent}</silvery-text>\n </silvery-box>\n )\n}\n"],"mappings":"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"}