silvery 0.23.0 → 0.23.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/dist/{Text-Ci6UCSTL.mjs → Text-4tWKabKH.mjs} +5 -5
  2. package/dist/{Text-Ci6UCSTL.mjs.map → Text-4tWKabKH.mjs.map} +1 -1
  3. package/dist/{ag-q9lRlKlt.mjs → ag-B-7XAHL8.mjs} +9 -9
  4. package/dist/{ag-q9lRlKlt.mjs.map → ag-B-7XAHL8.mjs.map} +1 -1
  5. package/dist/animation-CZ4x2R7C.mjs.map +1 -1
  6. package/dist/{ansi-zmNzgkPB.d.mts → ansi-qYRTDp5m.d.mts} +1 -1
  7. package/dist/{ansi-zmNzgkPB.d.mts.map → ansi-qYRTDp5m.d.mts.map} +1 -1
  8. package/dist/{chain-bridge-CkYcMxlq.mjs → chain-bridge-B7LNJwVF.mjs} +8 -8
  9. package/dist/{chain-bridge-CkYcMxlq.mjs.map → chain-bridge-B7LNJwVF.mjs.map} +1 -1
  10. package/dist/{chunk-BEJ448es.mjs → chunk-hT5z_Zn9.mjs} +1 -1
  11. package/dist/cli-CuNV0hTE.mjs +4 -0
  12. package/dist/devtools-BuTq07Zb.mjs +2 -0
  13. package/dist/{devtools-td2AjFwc.mjs → devtools-akTjVxxX.mjs} +4 -5
  14. package/dist/{devtools-td2AjFwc.mjs.map → devtools-akTjVxxX.mjs.map} +1 -1
  15. package/dist/{easing-C5MrdO7V.d.mts → easing-8OlNopWv.d.mts} +1 -1
  16. package/dist/{easing-C5MrdO7V.d.mts.map → easing-8OlNopWv.d.mts.map} +1 -1
  17. package/dist/{eta-BwYWEjfS.mjs → eta-CPZ45g_P.mjs} +5 -1
  18. package/dist/{eta-BwYWEjfS.mjs.map → eta-CPZ45g_P.mjs.map} +1 -1
  19. package/dist/flexily-zero-adapter-VoBGHG14.mjs.map +1 -1
  20. package/dist/{hit-registry-D_nxOivS.d.mts → hit-registry-DRV2ig-Y.d.mts} +2 -2
  21. package/dist/{hit-registry-D_nxOivS.d.mts.map → hit-registry-DRV2ig-Y.d.mts.map} +1 -1
  22. package/dist/{image-CIF75xMr.mjs → image-o2WpbrD1.mjs} +22 -22
  23. package/dist/image-o2WpbrD1.mjs.map +1 -0
  24. package/dist/{index-377zdPLP.d.mts → index-3vAxA_EQ.d.mts} +1 -1
  25. package/dist/{index-377zdPLP.d.mts.map → index-3vAxA_EQ.d.mts.map} +1 -1
  26. package/dist/{index-BcSr0RAQ.d.mts → index-BKujGENR.d.mts} +6 -6
  27. package/dist/index-BKujGENR.d.mts.map +1 -0
  28. package/dist/{index-DlNmckTq.d.mts → index-C6oOd9eE.d.mts} +2 -2
  29. package/dist/{index-DlNmckTq.d.mts.map → index-C6oOd9eE.d.mts.map} +1 -1
  30. package/dist/{index-DLnpxDAm.d.mts → index-DhYF3m7V.d.mts} +2 -2
  31. package/dist/{index-DLnpxDAm.d.mts.map → index-DhYF3m7V.d.mts.map} +1 -1
  32. package/dist/index.d.mts +9 -9
  33. package/dist/index.mjs +14 -14
  34. package/dist/index.mjs.map +1 -1
  35. package/dist/{layout-engine-BgR58vL0.mjs → layout-engine-BYp49XPD.mjs} +2 -2
  36. package/dist/{layout-engine-BgR58vL0.mjs.map → layout-engine-BYp49XPD.mjs.map} +1 -1
  37. package/dist/{layout-engine-DNjTha8f.mjs → layout-engine-D0dXw5fr.mjs} +1 -1
  38. package/dist/{layout-signals-CGYbHmxy.mjs → layout-signals-uQadGDmO.mjs} +2 -2
  39. package/dist/{layout-signals-CGYbHmxy.mjs.map → layout-signals-uQadGDmO.mjs.map} +1 -1
  40. package/dist/{mouse-events-WQ2h-uqG.mjs → mouse-events-Pg-XKR3T.mjs} +24 -3
  41. package/dist/{mouse-events-WQ2h-uqG.mjs.map → mouse-events-Pg-XKR3T.mjs.map} +1 -1
  42. package/dist/{mouse-events-B2z5tbsL.d.mts → mouse-events-UoUWNIdS.d.mts} +22 -3
  43. package/dist/{mouse-events-B2z5tbsL.d.mts.map → mouse-events-UoUWNIdS.d.mts.map} +1 -1
  44. package/dist/{multi-progress-zCWHEm9P.mjs → multi-progress-Bvd1BYED.mjs} +2 -2
  45. package/dist/{multi-progress-zCWHEm9P.mjs.map → multi-progress-Bvd1BYED.mjs.map} +1 -1
  46. package/dist/{multi-progress-BaEFfHKP.d.mts → multi-progress-DPOCjomS.d.mts} +2 -2
  47. package/dist/{multi-progress-BaEFfHKP.d.mts.map → multi-progress-DPOCjomS.d.mts.map} +1 -1
  48. package/dist/{node-CJ3J_rW-.mjs → node-Cl-kzQcl.mjs} +4 -4
  49. package/dist/node-Cl-kzQcl.mjs.map +1 -0
  50. package/dist/{progress-6vJ7nxUg.mjs → progress-1r6M_ZAP.mjs} +4 -4
  51. package/dist/{progress-6vJ7nxUg.mjs.map → progress-1r6M_ZAP.mjs.map} +1 -1
  52. package/dist/{progress-bar-BlFNsZL8.mjs → progress-bar-DzW1DzNj.mjs} +3 -3
  53. package/dist/{progress-bar-BlFNsZL8.mjs.map → progress-bar-DzW1DzNj.mjs.map} +1 -1
  54. package/dist/{reconciler--_-biN23.mjs → reconciler-lsTL1y8i.mjs} +45 -5
  55. package/dist/{reconciler--_-biN23.mjs.map → reconciler-lsTL1y8i.mjs.map} +1 -1
  56. package/dist/{render-string-DtHZP0cU.mjs → render-string-2ZcV8n3B.mjs} +6 -6
  57. package/dist/{render-string-DtHZP0cU.mjs.map → render-string-2ZcV8n3B.mjs.map} +1 -1
  58. package/dist/{render-string-DaghHpLN.mjs → render-string-BJZqo5Rr.mjs} +1 -1
  59. package/dist/runtime.d.mts +3 -3
  60. package/dist/runtime.mjs +3 -3
  61. package/dist/{schemes-DWQPxXAi.mjs → schemes-C4SUgVea.mjs} +2 -2
  62. package/dist/{schemes-DWQPxXAi.mjs.map → schemes-C4SUgVea.mjs.map} +1 -1
  63. package/dist/{spinner-B50hILqx.mjs → spinner-Ck3SdCpW.mjs} +2 -2
  64. package/dist/{spinner-B50hILqx.mjs.map → spinner-Ck3SdCpW.mjs.map} +1 -1
  65. package/dist/{spinner-DN10UfF0.d.mts → spinner-CpcGtQ9L.d.mts} +2 -2
  66. package/dist/{spinner-DN10UfF0.d.mts.map → spinner-CpcGtQ9L.d.mts.map} +1 -1
  67. package/dist/{src-BqeBFB3X.mjs → src-B6MuVlOK.mjs} +3 -3
  68. package/dist/src-B6MuVlOK.mjs.map +1 -0
  69. package/dist/{src-DbqcSrhy.mjs → src-BZOfzNeo.mjs} +32 -9
  70. package/dist/src-BZOfzNeo.mjs.map +1 -0
  71. package/dist/{src-BXeTHHlL.mjs → src-ChuXo--x.mjs} +25 -23
  72. package/dist/src-ChuXo--x.mjs.map +1 -0
  73. package/dist/{src-BOLdi3WG.mjs → src-DdGaRDi9.mjs} +3 -3
  74. package/dist/{src-BOLdi3WG.mjs.map → src-DdGaRDi9.mjs.map} +1 -1
  75. package/dist/{src-B8lf1kiR.mjs → src-DorsnS70.mjs} +8 -1
  76. package/dist/src-DorsnS70.mjs.map +1 -0
  77. package/dist/{steps-B2kBmFpb.d.mts → steps-DV34gm_Z.d.mts} +1 -1
  78. package/dist/{steps-B2kBmFpb.d.mts.map → steps-DV34gm_Z.d.mts.map} +1 -1
  79. package/dist/svg-NmV9dgB9.mjs.map +1 -1
  80. package/dist/{svg-VUr78l5d.d.mts → svg-wvIEu-RS.d.mts} +1 -1
  81. package/dist/{svg-VUr78l5d.d.mts.map → svg-wvIEu-RS.d.mts.map} +1 -1
  82. package/dist/term.d.mts +3 -3
  83. package/dist/term.mjs +4 -4
  84. package/dist/test.d.mts +3 -3
  85. package/dist/test.mjs +9 -9
  86. package/dist/test.mjs.map +1 -1
  87. package/dist/theme.d.mts +2 -2
  88. package/dist/theme.mjs +3 -3
  89. package/dist/{types-D_E0FbqA.d.mts → types-VyreAPAB.d.mts} +1 -1
  90. package/dist/{types-D_E0FbqA.d.mts.map → types-VyreAPAB.d.mts.map} +1 -1
  91. package/dist/ui/animation.d.mts +2 -2
  92. package/dist/ui/ansi.d.mts +1 -1
  93. package/dist/ui/cli.d.mts +3 -3
  94. package/dist/ui/cli.mjs +4 -4
  95. package/dist/ui/image.d.mts +1 -1
  96. package/dist/ui/image.mjs +1 -1
  97. package/dist/ui/progress.d.mts +4 -4
  98. package/dist/ui/progress.mjs +4 -4
  99. package/dist/ui/react.d.mts +1 -1
  100. package/dist/ui/react.mjs +2 -2
  101. package/dist/ui/react.mjs.map +1 -1
  102. package/dist/ui/recording-chrome-react.d.mts +1 -1
  103. package/dist/ui/recording-chrome-react.mjs +1 -1
  104. package/dist/ui/recording-chrome.d.mts +1 -1
  105. package/dist/ui/utils.mjs +1 -1
  106. package/dist/ui/wrappers.d.mts +2 -2
  107. package/dist/ui/wrappers.mjs +1 -1
  108. package/dist/ui.d.mts +6 -6
  109. package/dist/ui.mjs +6 -6
  110. package/dist/{unicode-CxyxVGmB.mjs → unicode-X43-fdGF.mjs} +3 -3
  111. package/dist/unicode-X43-fdGF.mjs.map +1 -0
  112. package/dist/{useLatest-UOvWy0ZW.d.mts → useLatest-D9p0ZDAC.d.mts} +2 -2
  113. package/dist/{useLatest-UOvWy0ZW.d.mts.map → useLatest-D9p0ZDAC.d.mts.map} +1 -1
  114. package/dist/{useLayout-D5cE8OCI.mjs → useLayout-Cx01rHVI.mjs} +3 -3
  115. package/dist/{useLayout-D5cE8OCI.mjs.map → useLayout-Cx01rHVI.mjs.map} +1 -1
  116. package/dist/{with-text-input-DLoSCBrm.d.mts → with-text-input-CW8MR9Th.d.mts} +3 -3
  117. package/dist/{with-text-input-DLoSCBrm.d.mts.map → with-text-input-CW8MR9Th.d.mts.map} +1 -1
  118. package/dist/{wrap-measurer-registration-IV2HtcCd.d.mts → wrap-measurer-registration-DNBmtFNM.d.mts} +3 -3
  119. package/dist/{wrap-measurer-registration-IV2HtcCd.d.mts.map → wrap-measurer-registration-DNBmtFNM.d.mts.map} +1 -1
  120. package/dist/{wrapper-CD29afOs.mjs → wrapper-DpMauwdI.mjs} +51 -33
  121. package/dist/wrapper-DpMauwdI.mjs.map +1 -0
  122. package/dist/{wrappers-CInBJm44.mjs → wrappers-DHMzvbRo.mjs} +5 -5
  123. package/dist/{wrappers-CInBJm44.mjs.map → wrappers-DHMzvbRo.mjs.map} +1 -1
  124. package/dist/yoga-adapter-B-DCP4Bx.mjs +2 -0
  125. package/dist/{yoga-adapter-9uab5Qn-.mjs → yoga-adapter-CB_7pLyl.mjs} +2 -2
  126. package/dist/{yoga-adapter-9uab5Qn-.mjs.map → yoga-adapter-CB_7pLyl.mjs.map} +1 -1
  127. package/package.json +2 -2
  128. package/dist/backend-DSiSIc-h.mjs +0 -13396
  129. package/dist/backend-DSiSIc-h.mjs.map +0 -1
  130. package/dist/cli-VNqUKlXw.mjs +0 -4
  131. package/dist/devtools-BF4IMumr.mjs +0 -2
  132. package/dist/image-CIF75xMr.mjs.map +0 -1
  133. package/dist/index-BcSr0RAQ.d.mts.map +0 -1
  134. package/dist/node-CJ3J_rW-.mjs.map +0 -1
  135. package/dist/src-B8lf1kiR.mjs.map +0 -1
  136. package/dist/src-BXeTHHlL.mjs.map +0 -1
  137. package/dist/src-BqeBFB3X.mjs.map +0 -1
  138. package/dist/src-DbqcSrhy.mjs.map +0 -1
  139. package/dist/unicode-CxyxVGmB.mjs.map +0 -1
  140. package/dist/wrapper-CD29afOs.mjs.map +0 -1
  141. package/dist/yoga-adapter-yqTl1aXK.mjs +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"animation-CZ4x2R7C.mjs","names":["TICK_MS"],"sources":["../packages/ag-react/src/ui/animation/easing.ts","../packages/ag-react/src/ui/animation/useAnimation.ts","../packages/ag-react/src/ui/animation/useTransition.ts","../packages/ag-react/src/ui/animation/useInterval.ts","../packages/ag-react/src/ui/animation/useTimeout.ts","../packages/ag-react/src/ui/animation/useLatest.ts"],"sourcesContent":["/**\n * Easing Functions\n *\n * Maps time progress (0-1) to value progress (0-1) for smooth animations.\n * Includes common presets and a resolver for name-or-function usage.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Easing function: maps time progress (0-1) to value progress (0-1) */\nexport type EasingFn = (t: number) => number\n\n// ============================================================================\n// Presets\n// ============================================================================\n\nexport const easings = {\n linear: (t: number) => t,\n ease: (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n easeIn: (t: number) => t * t,\n easeOut: (t: number) => t * (2 - t),\n easeInOut: (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n easeInCubic: (t: number) => t * t * t,\n easeOutCubic: (t: number) => --t * t * t + 1,\n} as const satisfies Record<string, EasingFn>\n\nexport type EasingName = keyof typeof easings\n\n// ============================================================================\n// Resolver\n// ============================================================================\n\n/** Resolve an easing — accepts a name string or a custom function. */\nexport function resolveEasing(easing: EasingName | EasingFn): EasingFn {\n return typeof easing === \"function\" ? easing : easings[easing]\n}\n","/**\n * useAnimation - Animate a value from 0 to 1 over a duration.\n *\n * Drives a single animation cycle with configurable easing, delay,\n * and completion callback. Targets ~30fps (33ms interval) since\n * terminals don't benefit from higher refresh rates.\n */\n\nimport { useState, useEffect, useRef, useCallback } from \"react\"\nimport { resolveEasing, type EasingName, type EasingFn } from \"./easing\"\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface UseAnimationOptions {\n /** Duration in milliseconds */\n duration: number\n /** Easing function or preset name */\n easing?: EasingName | EasingFn\n /** Delay before starting (ms) */\n delay?: number\n /** Called when animation completes */\n onComplete?: () => void\n /** Whether to run the animation (default: true) */\n enabled?: boolean\n}\n\nexport interface UseAnimationResult {\n /** Current progress value (0 to 1, eased) */\n value: number\n /** Whether the animation is still running */\n isAnimating: boolean\n /** Reset and replay the animation */\n reset: () => void\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** ~30fps tick interval for terminal animations */\nconst TICK_MS = 33\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Animate a value from 0 to 1 over a duration with easing.\n *\n * @example\n * ```tsx\n * function FadeIn({ children }) {\n * const { value } = useAnimation({ duration: 300, easing: \"easeOut\" })\n * return <Text color={value < 1 ? \"$muted\" : undefined}>{children}</Text>\n * }\n * ```\n */\nexport function useAnimation(options: UseAnimationOptions): UseAnimationResult {\n const { duration, easing = \"linear\", delay = 0, onComplete, enabled = true } = options\n\n const [value, setValue] = useState(0)\n const [isAnimating, setIsAnimating] = useState(false)\n\n const startTimeRef = useRef(0)\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null)\n const onCompleteRef = useRef(onComplete)\n onCompleteRef.current = onComplete\n\n // Epoch bumps on each reset to invalidate stale intervals\n const epochRef = useRef(0)\n\n const easingFn = resolveEasing(easing)\n\n const stopInterval = useCallback(() => {\n if (intervalRef.current !== null) {\n clearInterval(intervalRef.current)\n intervalRef.current = null\n }\n }, [])\n\n const startAnimation = useCallback(() => {\n stopInterval()\n epochRef.current++\n const epoch = epochRef.current\n\n setValue(0)\n setIsAnimating(true)\n\n const begin = () => {\n // Guard against stale starts after a reset\n if (epochRef.current !== epoch) return\n\n startTimeRef.current = performance.now()\n\n intervalRef.current = setInterval(() => {\n // Guard against stale ticks after a reset\n if (epochRef.current !== epoch) return\n\n const elapsed = performance.now() - startTimeRef.current\n const raw = Math.min(elapsed / duration, 1)\n const eased = easingFn(raw)\n\n setValue(eased)\n\n if (raw >= 1) {\n stopInterval()\n setIsAnimating(false)\n onCompleteRef.current?.()\n }\n }, TICK_MS)\n }\n\n if (delay > 0) {\n setTimeout(() => begin(), delay)\n } else {\n begin()\n }\n }, [duration, delay, easingFn, stopInterval])\n\n // Start on mount (if enabled)\n useEffect(() => {\n if (!enabled) {\n stopInterval()\n setValue(0)\n setIsAnimating(false)\n return\n }\n\n startAnimation()\n\n return () => {\n stopInterval()\n }\n }, [enabled, startAnimation, stopInterval])\n\n const reset = useCallback(() => {\n startAnimation()\n }, [startAnimation])\n\n return { value, isAnimating, reset }\n}\n","/**\n * useTransition - Smoothly interpolate between numeric values.\n *\n * When the target value changes, animates from the current value toward\n * the new target. If the target changes mid-animation, restarts from\n * the current interpolated position. Targets ~30fps.\n */\n\nimport { useState, useEffect, useRef } from \"react\"\nimport { resolveEasing, type EasingName, type EasingFn } from \"./easing\"\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface UseTransitionOptions {\n /** Duration in milliseconds (default: 300) */\n duration?: number\n /** Easing function or preset name (default: \"easeOut\") */\n easing?: EasingName | EasingFn\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** ~30fps tick interval for terminal animations */\nconst TICK_MS = 33\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Smoothly interpolate when the target value changes.\n *\n * Returns the current interpolated value. On the first render, returns\n * the target value immediately (no animation). Subsequent changes\n * animate from the previous value to the new target.\n *\n * @example\n * ```tsx\n * function ScrollOffset({ target }) {\n * const smooth = useTransition(target, { duration: 200, easing: \"easeOut\" })\n * return <Box marginTop={Math.round(smooth)}>...</Box>\n * }\n * ```\n */\nexport function useTransition(targetValue: number, options?: UseTransitionOptions): number {\n const { duration = 300, easing = \"easeOut\" } = options ?? {}\n\n const [currentValue, setCurrentValue] = useState(targetValue)\n\n const fromRef = useRef(targetValue)\n const toRef = useRef(targetValue)\n const startTimeRef = useRef(0)\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null)\n const isFirstRef = useRef(true)\n\n const easingFn = resolveEasing(easing)\n\n useEffect(() => {\n // On first render, snap to target without animation\n if (isFirstRef.current) {\n isFirstRef.current = false\n return\n }\n\n // If target hasn't changed, nothing to do\n if (targetValue === toRef.current) return\n\n // Start from wherever we currently are\n fromRef.current = currentValue\n toRef.current = targetValue\n startTimeRef.current = performance.now()\n\n // Clear any existing interval\n if (intervalRef.current !== null) {\n clearInterval(intervalRef.current)\n }\n\n intervalRef.current = setInterval(() => {\n const elapsed = performance.now() - startTimeRef.current\n const raw = Math.min(elapsed / duration, 1)\n const eased = easingFn(raw)\n const interpolated = fromRef.current + (toRef.current - fromRef.current) * eased\n\n setCurrentValue(interpolated)\n\n if (raw >= 1) {\n // Snap to exact target and stop\n setCurrentValue(toRef.current)\n if (intervalRef.current !== null) {\n clearInterval(intervalRef.current)\n intervalRef.current = null\n }\n }\n }, TICK_MS)\n\n return () => {\n if (intervalRef.current !== null) {\n clearInterval(intervalRef.current)\n intervalRef.current = null\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [targetValue, duration, easingFn])\n\n return currentValue\n}\n","/**\n * useInterval - Run a callback on a fixed interval.\n *\n * Uses Dan Abramov's ref pattern to avoid stale closures.\n * The callback is NOT called on mount — only on subsequent ticks.\n */\n\nimport { useEffect, useRef } from \"react\"\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Run a callback on a fixed interval.\n *\n * The callback is NOT called on mount — only on ticks after the interval\n * elapses. Uses a ref for the callback to avoid stale closures.\n *\n * @param callback - Function to call on each tick\n * @param ms - Interval in milliseconds\n * @param enabled - Whether the interval is active (default: true)\n */\nexport function useInterval(callback: () => void, ms: number, enabled = true): void {\n const callbackRef = useRef(callback)\n callbackRef.current = callback\n\n useEffect(() => {\n if (!enabled) return\n\n const id = setInterval(() => {\n callbackRef.current()\n }, ms)\n\n return () => {\n clearInterval(id)\n }\n }, [ms, enabled])\n}\n","/**\n * useTimeout - Run a callback after a delay.\n *\n * Uses a ref for the callback to avoid stale closures (Dan Abramov pattern).\n * The timer resets when `ms` or `enabled` changes. When `enabled` becomes false,\n * the timer is cleared. Returns a `reset` function to restart the timer.\n *\n * Unlike useInterval, this fires exactly once per enable/reset cycle.\n */\n\nimport { useCallback, useEffect, useRef } from \"react\"\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Run a callback after a delay.\n *\n * The callback fires once after `ms` milliseconds. The timer resets when\n * `ms` or `enabled` changes. Returns `{ reset, clear }` for manual control.\n *\n * @param callback - Function to call when the timer fires\n * @param ms - Delay in milliseconds\n * @param enabled - Whether the timer is active (default: true)\n */\nexport function useTimeout(\n callback: () => void,\n ms: number,\n enabled = true,\n): { reset: () => void; clear: () => void } {\n const callbackRef = useRef(callback)\n callbackRef.current = callback\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const clear = useCallback(() => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current)\n timerRef.current = null\n }\n }, [])\n\n const reset = useCallback(() => {\n clear()\n if (enabled) {\n timerRef.current = setTimeout(() => {\n timerRef.current = null\n callbackRef.current()\n }, ms)\n }\n }, [ms, enabled, clear])\n\n useEffect(() => {\n if (!enabled) {\n clear()\n return\n }\n\n timerRef.current = setTimeout(() => {\n timerRef.current = null\n callbackRef.current()\n }, ms)\n\n return clear\n }, [ms, enabled, clear])\n\n return { reset, clear }\n}\n","/**\n * useLatest - Always-current ref to a value.\n *\n * The classic React pattern for avoiding stale closures in callbacks,\n * timers, and effects. Returns a ref whose `.current` is always the\n * latest value — safe to read from any async context.\n *\n * ```tsx\n * const countRef = useLatest(count)\n * useInterval(() => {\n * console.log(countRef.current) // always fresh\n * }, 1000)\n * ```\n */\n\nimport { useRef } from \"react\"\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Returns a ref that always holds the latest value.\n *\n * Useful when a callback needs access to current state/props without\n * re-creating the callback (which would reset timers, event listeners, etc).\n *\n * @param value - The value to track\n * @returns A ref whose `.current` is always `value`\n */\nexport function useLatest<T>(value: T): { readonly current: T } {\n const ref = useRef(value)\n ref.current = value\n return ref\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"animation-CZ4x2R7C.mjs","names":["TICK_MS"],"sources":["../packages/ag-react/src/ui/animation/easing.ts","../packages/ag-react/src/ui/animation/useAnimation.ts","../packages/ag-react/src/ui/animation/useTransition.ts","../packages/ag-react/src/ui/animation/useInterval.ts","../packages/ag-react/src/ui/animation/useTimeout.ts","../packages/ag-react/src/ui/animation/useLatest.ts"],"sourcesContent":["/**\n * Easing Functions\n *\n * Maps time progress (0-1) to value progress (0-1) for smooth animations.\n * Includes common presets and a resolver for name-or-function usage.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Easing function: maps time progress (0-1) to value progress (0-1) */\nexport type EasingFn = (t: number) => number\n\n// ============================================================================\n// Presets\n// ============================================================================\n\nexport const easings = {\n linear: (t: number) => t,\n ease: (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n easeIn: (t: number) => t * t,\n easeOut: (t: number) => t * (2 - t),\n easeInOut: (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n easeInCubic: (t: number) => t * t * t,\n easeOutCubic: (t: number) => --t * t * t + 1,\n} as const satisfies Record<string, EasingFn>\n\nexport type EasingName = keyof typeof easings\n\n// ============================================================================\n// Resolver\n// ============================================================================\n\n/** Resolve an easing — accepts a name string or a custom function. */\nexport function resolveEasing(easing: EasingName | EasingFn): EasingFn {\n return typeof easing === \"function\" ? easing : easings[easing]\n}\n","/**\n * useAnimation - Animate a value from 0 to 1 over a duration.\n *\n * Drives a single animation cycle with configurable easing, delay,\n * and completion callback. Targets ~30fps (33ms interval) since\n * terminals don't benefit from higher refresh rates.\n */\n\nimport { useState, useEffect, useRef, useCallback } from \"react\"\nimport { resolveEasing, type EasingName, type EasingFn } from \"./easing\"\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface UseAnimationOptions {\n /** Duration in milliseconds */\n duration: number\n /** Easing function or preset name */\n easing?: EasingName | EasingFn\n /** Delay before starting (ms) */\n delay?: number\n /** Called when animation completes */\n onComplete?: () => void\n /** Whether to run the animation (default: true) */\n enabled?: boolean\n}\n\nexport interface UseAnimationResult {\n /** Current progress value (0 to 1, eased) */\n value: number\n /** Whether the animation is still running */\n isAnimating: boolean\n /** Reset and replay the animation */\n reset: () => void\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** ~30fps tick interval for terminal animations */\nconst TICK_MS = 33\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Animate a value from 0 to 1 over a duration with easing.\n *\n * @example\n * ```tsx\n * function FadeIn({ children }) {\n * const { value } = useAnimation({ duration: 300, easing: \"easeOut\" })\n * return <Text color={value < 1 ? \"$muted\" : undefined}>{children}</Text>\n * }\n * ```\n */\nexport function useAnimation(options: UseAnimationOptions): UseAnimationResult {\n const { duration, easing = \"linear\", delay = 0, onComplete, enabled = true } = options\n\n const [value, setValue] = useState(0)\n const [isAnimating, setIsAnimating] = useState(false)\n\n const startTimeRef = useRef(0)\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null)\n const onCompleteRef = useRef(onComplete)\n onCompleteRef.current = onComplete\n\n // Epoch bumps on each reset to invalidate stale intervals\n const epochRef = useRef(0)\n\n const easingFn = resolveEasing(easing)\n\n const stopInterval = useCallback(() => {\n if (intervalRef.current !== null) {\n clearInterval(intervalRef.current)\n intervalRef.current = null\n }\n }, [])\n\n const startAnimation = useCallback(() => {\n stopInterval()\n epochRef.current++\n const epoch = epochRef.current\n\n setValue(0)\n setIsAnimating(true)\n\n const begin = () => {\n // Guard against stale starts after a reset\n if (epochRef.current !== epoch) return\n\n startTimeRef.current = performance.now()\n\n intervalRef.current = setInterval(() => {\n // Guard against stale ticks after a reset\n if (epochRef.current !== epoch) return\n\n const elapsed = performance.now() - startTimeRef.current\n const raw = Math.min(elapsed / duration, 1)\n const eased = easingFn(raw)\n\n setValue(eased)\n\n if (raw >= 1) {\n stopInterval()\n setIsAnimating(false)\n onCompleteRef.current?.()\n }\n }, TICK_MS)\n }\n\n if (delay > 0) {\n setTimeout(() => begin(), delay)\n } else {\n begin()\n }\n }, [duration, delay, easingFn, stopInterval])\n\n // Start on mount (if enabled)\n useEffect(() => {\n if (!enabled) {\n stopInterval()\n setValue(0)\n setIsAnimating(false)\n return\n }\n\n startAnimation()\n\n return () => {\n stopInterval()\n }\n }, [enabled, startAnimation, stopInterval])\n\n const reset = useCallback(() => {\n startAnimation()\n }, [startAnimation])\n\n return { value, isAnimating, reset }\n}\n","/**\n * useTransition - Smoothly interpolate between numeric values.\n *\n * When the target value changes, animates from the current value toward\n * the new target. If the target changes mid-animation, restarts from\n * the current interpolated position. Targets ~30fps.\n */\n\nimport { useState, useEffect, useRef } from \"react\"\nimport { resolveEasing, type EasingName, type EasingFn } from \"./easing\"\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface UseTransitionOptions {\n /** Duration in milliseconds (default: 300) */\n duration?: number\n /** Easing function or preset name (default: \"easeOut\") */\n easing?: EasingName | EasingFn\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** ~30fps tick interval for terminal animations */\nconst TICK_MS = 33\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Smoothly interpolate when the target value changes.\n *\n * Returns the current interpolated value. On the first render, returns\n * the target value immediately (no animation). Subsequent changes\n * animate from the previous value to the new target.\n *\n * @example\n * ```tsx\n * function ScrollOffset({ target }) {\n * const smooth = useTransition(target, { duration: 200, easing: \"easeOut\" })\n * return <Box marginTop={Math.round(smooth)}>...</Box>\n * }\n * ```\n */\nexport function useTransition(targetValue: number, options?: UseTransitionOptions): number {\n const { duration = 300, easing = \"easeOut\" } = options ?? {}\n\n const [currentValue, setCurrentValue] = useState(targetValue)\n\n const fromRef = useRef(targetValue)\n const toRef = useRef(targetValue)\n const startTimeRef = useRef(0)\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null)\n const isFirstRef = useRef(true)\n\n const easingFn = resolveEasing(easing)\n\n useEffect(() => {\n // On first render, snap to target without animation\n if (isFirstRef.current) {\n isFirstRef.current = false\n return\n }\n\n // If target hasn't changed, nothing to do\n if (targetValue === toRef.current) return\n\n // Start from wherever we currently are\n fromRef.current = currentValue\n toRef.current = targetValue\n startTimeRef.current = performance.now()\n\n // Clear any existing interval\n if (intervalRef.current !== null) {\n clearInterval(intervalRef.current)\n }\n\n intervalRef.current = setInterval(() => {\n const elapsed = performance.now() - startTimeRef.current\n const raw = Math.min(elapsed / duration, 1)\n const eased = easingFn(raw)\n const interpolated = fromRef.current + (toRef.current - fromRef.current) * eased\n\n setCurrentValue(interpolated)\n\n if (raw >= 1) {\n // Snap to exact target and stop\n setCurrentValue(toRef.current)\n if (intervalRef.current !== null) {\n clearInterval(intervalRef.current)\n intervalRef.current = null\n }\n }\n }, TICK_MS)\n\n return () => {\n if (intervalRef.current !== null) {\n clearInterval(intervalRef.current)\n intervalRef.current = null\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [targetValue, duration, easingFn])\n\n return currentValue\n}\n","/**\n * useInterval - Run a callback on a fixed interval.\n *\n * Uses Dan Abramov's ref pattern to avoid stale closures.\n * The callback is NOT called on mount — only on subsequent ticks.\n */\n\nimport { useEffect, useRef } from \"react\"\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Run a callback on a fixed interval.\n *\n * The callback is NOT called on mount — only on ticks after the interval\n * elapses. Uses a ref for the callback to avoid stale closures.\n *\n * @param callback - Function to call on each tick\n * @param ms - Interval in milliseconds\n * @param enabled - Whether the interval is active (default: true)\n */\nexport function useInterval(callback: () => void, ms: number, enabled = true): void {\n const callbackRef = useRef(callback)\n callbackRef.current = callback\n\n useEffect(() => {\n if (!enabled) return\n\n const id = setInterval(() => {\n callbackRef.current()\n }, ms)\n\n return () => {\n clearInterval(id)\n }\n }, [ms, enabled])\n}\n","/**\n * useTimeout - Run a callback after a delay.\n *\n * Uses a ref for the callback to avoid stale closures (Dan Abramov pattern).\n * The timer resets when `ms` or `enabled` changes. When `enabled` becomes false,\n * the timer is cleared. Returns a `reset` function to restart the timer.\n *\n * Unlike useInterval, this fires exactly once per enable/reset cycle.\n */\n\nimport { useCallback, useEffect, useRef } from \"react\"\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Run a callback after a delay.\n *\n * The callback fires once after `ms` milliseconds. The timer resets when\n * `ms` or `enabled` changes. Returns `{ reset, clear }` for manual control.\n *\n * @param callback - Function to call when the timer fires\n * @param ms - Delay in milliseconds\n * @param enabled - Whether the timer is active (default: true)\n */\nexport function useTimeout(\n callback: () => void,\n ms: number,\n enabled = true,\n): { reset: () => void; clear: () => void } {\n const callbackRef = useRef(callback)\n callbackRef.current = callback\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const clear = useCallback(() => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current)\n timerRef.current = null\n }\n }, [])\n\n const reset = useCallback(() => {\n clear()\n if (enabled) {\n timerRef.current = setTimeout(() => {\n timerRef.current = null\n callbackRef.current()\n }, ms)\n }\n }, [ms, enabled, clear])\n\n useEffect(() => {\n if (!enabled) {\n clear()\n return\n }\n\n timerRef.current = setTimeout(() => {\n timerRef.current = null\n callbackRef.current()\n }, ms)\n\n return clear\n }, [ms, enabled, clear])\n\n return { reset, clear }\n}\n","/**\n * useLatest - Always-current ref to a value.\n *\n * The classic React pattern for avoiding stale closures in callbacks,\n * timers, and effects. Returns a ref whose `.current` is always the\n * latest value — safe to read from any async context.\n *\n * ```tsx\n * const countRef = useLatest(count)\n * useInterval(() => {\n * console.log(countRef.current) // always fresh\n * }, 1000)\n * ```\n */\n\nimport { useRef } from \"react\"\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Returns a ref that always holds the latest value.\n *\n * Useful when a callback needs access to current state/props without\n * re-creating the callback (which would reset timers, event listeners, etc).\n *\n * @param value - The value to track\n * @returns A ref whose `.current` is always `value`\n */\nexport function useLatest<T>(value: T): { readonly current: T } {\n const ref = useRef(value)\n ref.current = value\n return ref\n}\n"],"mappings":"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"}
@@ -46,4 +46,4 @@ declare function isTTY(stream?: NodeJS.WriteStream): boolean;
46
46
  declare function getTerminalWidth(stream?: NodeJS.WriteStream): number;
47
47
  //#endregion
48
48
  export { CURSOR_RESTORE as a, CURSOR_TO_START as c, getTerminalWidth as d, isTTY as f, writeLine as h, CURSOR_HIDE as i, cursorDown as l, write as m, CLEAR_LINE_END as n, CURSOR_SAVE as o, withCursor as p, CLEAR_SCREEN as r, CURSOR_SHOW as s, CLEAR_LINE as t, cursorUp as u };
49
- //# sourceMappingURL=ansi-zmNzgkPB.d.mts.map
49
+ //# sourceMappingURL=ansi-qYRTDp5m.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ansi-zmNzgkPB.d.mts","names":[],"sources":["../packages/ag-react/src/ui/cli/ansi.ts"],"mappings":";;AAKA;;;cAAa,WAAA;;cAGA,WAAA;;cAGA,eAAA;;cAGA,cAAA;AAHb;AAAA,cAMa,UAAA;;cAGA,YAAA;;cAGA,QAAA,GAAY,CAAA;;cAGZ,UAAA,GAAc,CAAA;;cAGd,WAAA;AAZb;AAAA,cAea,cAAA;;;;iBAKG,KAAA,CAAM,IAAA,UAAc,MAAA,GAAQ,MAAA,CAAO,WAAA;;;;iBAOnC,SAAA,CAAU,IAAA,UAAc,MAAA,GAAQ,MAAA,CAAO,WAAA;AArBvD;;;;AAAA,iBA6BgB,UAAA,GAAA,CACd,EAAA,QAAU,CAAA,GAAI,OAAA,CAAQ,CAAA,GACtB,MAAA,GAAQ,MAAA,CAAO,WAAA,GACd,OAAA,CAAQ,CAAA;AA7BX;;;;AAAA,iBAmDgB,KAAA,CAAM,MAAA,GAAQ,MAAA,CAAO,WAAA;AAhDrC;;;AAAA,iBAwDgB,gBAAA,CAAiB,MAAA,GAAQ,MAAA,CAAO,WAAA"}
1
+ {"version":3,"file":"ansi-qYRTDp5m.d.mts","names":[],"sources":["../packages/ag-react/src/ui/cli/ansi.ts"],"mappings":";;AAKA;;;cAAa,WAAA;;cAGA,WAAA;;cAGA,eAAA;;cAGA,cAAA;AAHb;AAAA,cAMa,UAAA;;cAGA,YAAA;;cAGA,QAAA,GAAY,CAAA;;cAGZ,UAAA,GAAc,CAAA;;cAGd,WAAA;AAZb;AAAA,cAea,cAAA;;;;iBAKG,KAAA,CAAM,IAAA,UAAc,MAAA,GAAQ,MAAA,CAAO,WAAA;;;;iBAOnC,SAAA,CAAU,IAAA,UAAc,MAAA,GAAQ,MAAA,CAAO,WAAA;AArBvD;;;;AAAA,iBA6BgB,UAAA,GAAA,CACd,EAAA,QAAU,CAAA,GAAI,OAAA,CAAQ,CAAA,GACtB,MAAA,GAAQ,MAAA,CAAO,WAAA,GACd,OAAA,CAAQ,CAAA;AA7BX;;;;AAAA,iBAmDgB,KAAA,CAAM,MAAA,GAAQ,MAAA,CAAO,WAAA;AAhDrC;;;AAAA,iBAwDgB,gBAAA,CAAiB,MAAA,GAAQ,MAAA,CAAO,WAAA"}
@@ -1,9 +1,9 @@
1
- import { _ as getAncestorPath } from "./mouse-events-WQ2h-uqG.mjs";
2
- import { _ as rectEqual, a as findActiveParkRect, g as setWrapMeasurer, h as getWrapMeasurer, i as findActiveCursorRectWithProvenance, n as computeContentRect, r as findActiveCursorRect, t as commitLayoutSnapshot } from "./layout-signals-CGYbHmxy.mjs";
3
- import { B as resolveNonTTYMode, L as countLines, R as createOutputTransformer, _t as findActiveCursorNode, k as createPipeline } from "./src-DbqcSrhy.mjs";
4
- import { $t as bufferToText, Ct as isStrictEnabled, D as runWithMeasurer, L as wrapTextWithOffsets, N as stripAnsi, bt as recordOutputCursorDiagnostics, en as cellEquals, gt as outputPhase, ht as getLastOutputPhaseDiagnostics, it as createOsc52Backend, kt as ANSI, mn as parseHotkey, nn as colorEquals, pt as clearLastOutputPhaseDiagnostics, vt as IncrementalRenderMismatchError } from "./unicode-CxyxVGmB.mjs";
5
- import { C as isDirty, x as isAnyDirty } from "./reconciler--_-biN23.mjs";
6
- import { n as createRenderPostState, o as FRESH_LAYOUT_STRICT_SLUG, s as markLayoutTreeDirty, t as createAg } from "./ag-q9lRlKlt.mjs";
1
+ import { y as getAncestorPath } from "./mouse-events-Pg-XKR3T.mjs";
2
+ import { _ as rectEqual, a as findActiveParkRect, g as setWrapMeasurer, h as getWrapMeasurer, i as findActiveCursorRectWithProvenance, n as computeContentRect, r as findActiveCursorRect, t as commitLayoutSnapshot } from "./layout-signals-uQadGDmO.mjs";
3
+ import { B as resolveNonTTYMode, L as countLines, R as createOutputTransformer, _t as findActiveCursorNode, k as createPipeline } from "./src-BZOfzNeo.mjs";
4
+ import { $t as bufferToText, Ct as isStrictEnabled, D as runWithMeasurer, L as wrapTextWithOffsets, N as stripAnsi, bt as recordOutputCursorDiagnostics, en as cellEquals, gt as outputPhase, ht as getLastOutputPhaseDiagnostics, it as createOsc52Backend, kt as ANSI, mn as parseHotkey, nn as colorEquals, pt as clearLastOutputPhaseDiagnostics, vt as IncrementalRenderMismatchError } from "./unicode-X43-fdGF.mjs";
5
+ import { C as isDirty, x as isAnyDirty } from "./reconciler-lsTL1y8i.mjs";
6
+ import { n as createRenderPostState, o as FRESH_LAYOUT_STRICT_SLUG, s as markLayoutTreeDirty, t as createAg } from "./ag-B-7XAHL8.mjs";
7
7
  import { createLogger } from "loggily";
8
8
  import { appendFileSync, existsSync, mkdirSync } from "node:fs";
9
9
  import { createContext } from "react";
@@ -1231,7 +1231,7 @@ function withRender(term) {
1231
1231
  return measurer ? runWithMeasurer(measurer, doRender) : doRender();
1232
1232
  }
1233
1233
  async function renderStaticFn(element, options) {
1234
- const { renderString } = await import("./render-string-DaghHpLN.mjs");
1234
+ const { renderString } = await import("./render-string-BJZqo5Rr.mjs");
1235
1235
  return renderString(element, {
1236
1236
  ...options,
1237
1237
  pipelineConfig
@@ -4146,4 +4146,4 @@ function toChainAppContextValue(app) {
4146
4146
  //#endregion
4147
4147
  export { createBytesOutMonitor as A, withTerminalChain as B, recentRenderOutputEvents as C, buildMismatchContext as D, protectManagedCursorSuffix as E, compareBuffers as F, pipe as G, DRAG_CAPABILITY as H, formatMismatch as I, dispatchFocusEvent as J, createFocusEvent as K, withKeybindings as L, withRender as M, VirtualTerminal as N, formatMismatchContext as O, withDiagnostics as P, withCommands as R, recentRenderEvents as S, computeManagedFrame as T, SELECTION_CAPABILITY as U, createSelectionBridge as V, createCapabilityRegistry as W, dispatchKeyEvent as Y, withPasteChain as _, CLS_STRICT_SLUG as a, emitRenderOutputFrame as b, ScopeProvider as c, installTerminalWrapMeasurer as d, isTerminalWrapMeasurerInstalled as f, withInputChain as g, withCustomEvents as h, CLS_STRICT_MIN_TIER as i, createBaseApp as j, createMemMonitor as k, AppScopeContext as l, uninstallTerminalWrapMeasurer as m, toChainAppContextValue as n, UnexpectedLayoutShiftError as o, restoreDefaultWrapMeasurer as p, createKeyEvent as q, createClsMonitor as r, isClsStrictEnabled as s, createChildApp as t, ScopeContext as u, RenderScheduler as v, renderTraceDir as w, isRenderTraceEnabled as x, emitRenderDispatched as y, withFocusChain as z };
4148
4148
 
4149
- //# sourceMappingURL=chain-bridge-CkYcMxlq.mjs.map
4149
+ //# sourceMappingURL=chain-bridge-B7LNJwVF.mjs.map